<?xml version="1.0" encoding="UTF-8"?>
<Aggregate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="Tethys"
           xmlns:Units="Tethys/Units"
           xmlns:Universal="Tethys/Universal"
           xmlns:Guidance="Tethys/Guidance"
           xmlns:Sample="Tethys/Sample"
           xmlns:Science="Tethys/Science"
           xsi:schemaLocation="Tethys http://okeanids.mbari.org/tethys/Xml/Tethys.xsd
                               Tethys/Units http://okeanids.mbari.org/tethys/Xml/Units.xsd
                               Tethys/Universal http://okeanids.mbari.org/tethys/Xml/Universal.xsd
                               Tethys/Guidance http://okeanids.mbari.org/tethys/Xml/Guidance.xsd
                               Tethys/Sample http://okeanids.mbari.org/tethys/Xml/Sample.xsd
                               Tethys/Science http://okeanids.mbari.org/tethys/Xml/Science.xsd"
       Id="Sample">

    <Description>
        Acquire ESP/CANONSampler water sample.
    </Description>

    <DefineArg Name="SampleTimeout"><Description>
        Max duration allowed for sampling (both ESP and CANONSampler)
    </Description><Units:hour/><Value>3</Value></DefineArg>

    <DefineArg Name="SampleCANONSampler"><Description>
        When true, aqurie a CANON Sampler water sample.
    </Description><Science:CANONSampler.loadAtStartup/></DefineArg>

    <DefineArg Name="SampleESP"><Description>
        When true, aqurie an ESP sample.
    </Description><Science:ESPComponent.loadAtStartup/></DefineArg>

<!-- CANONSampler configuration -->

    <DefineArg Name="CANONSamplerDelay"><Description>
        How long to delay a CANON Sampler sample after an ESP sample is
        intiated.
    </Description><Units:minute/><Value>10</Value></DefineArg>

    <DefineArg Name="CANONSamplerTimeout"><Description>
        How long to wait for a CANON Sampler sample to complete.
    </Description><Science:CANONSampler.sampleTimeout/></DefineArg>

    <DefineArg Name="RotateOnly"><Units:bool/><Value>0</Value></DefineArg>

<!-- ESP configuration -->

    <DefineArg Name="ESPCartridgeType"><Description>
        Specifies ESP cartridge type code.
    </Description><Units:count/><Value>NaN</Value></DefineArg>

    <When>
        <Called/>
    </When>

    <Aggregate Id="SampleSettingsCheck">

        <Sequence/>

        <Syslog Severity="Info">Checking sampling settings.</Syslog>

        <Aggregate Id="CheckESP">

            <When>
                <Arg Name="SampleESP"/>
                <And><Not><Science:ESPComponent.loadAtStartup/></Not></And>
            </When>

            <Syslog Severity="Critical">Cannot service ESP sample request. ESPComponent is not loaded.</Syslog>

        </Aggregate>

        <Aggregate Id="CheckCANONSampler">

            <When>
                <Arg Name="SampleCANONSampler"/>
                <And><Not><Science:CANONSampler.loadAtStartup/></Not></And>
            </When>

            <Syslog Severity="Critical">Cannot service CANONSampler water sample request. CANONSampler component is not loaded.</Syslog>

        </Aggregate>

    </Aggregate>

    <Aggregate Id="SampleWrapper">

        <Sequence/>

        <Aggregate Id="CANONSampler">

            <While>
                <Arg Name="SampleCANONSampler"/>
            </While>

            <Aggregate Id="AcquireCANONSampler">

                <Sequence/>

                <Assign><Parallel/><Science:CANONSampler.sampleTimeout/><Arg Name="CANONSamplerTimeout"/></Assign>

                <Assign><Parallel/><Science:CANONSampler.rotateOnly/><Arg Name="RotateOnly"/></Assign>

                <Guidance:Wait>
                    <Sequence/>
                    <Setting><Guidance:Wait.duration/><Arg Name="CANONSamplerDelay"/></Setting>
                </Guidance:Wait>

                <ReadDatum Id="TriggerCANONSampler">
                    <Timeout Duration="P1M"/>
                    <Science:CANONSampler.sampling/>
                </ReadDatum>

                <Syslog Severity="Important">CANONSampler sampling at <Universal:depth/><Units:meter/> in <Universal:sea_water_temperature/><Units:celsius/> water with <Universal:mass_concentration_of_chlorophyll_in_sea_water/><Units:microgram_per_liter/> chlorophyll fluorescence.</Syslog>

                <ReadDatum>
                    <Timeout Duration="CANONSamplerTimeout">
                        <Syslog Severity="Important">Timed out sampling with CANONSampler.</Syslog>
                    </Timeout>
                    <Science:CANONSampler.sample_number/>
                </ReadDatum>

                <Syslog Severity="Info">Completed acquiring CANON sampler water sample.</Syslog>

                <Assign><Sequence/><Arg Name="SampleCANONSampler"/><False/></Assign>

            </Aggregate>

        </Aggregate>

        <Aggregate Id="ESP">

            <While>
                <Arg Name="SampleESP"/>
            </While>

            <Sample:AbortSample>
                <Parallel/>
            </Sample:AbortSample>

            <Aggregate Id="AcquireESP">

                <Sequence/>

                <Aggregate Id="SelectESPCartridge">

                    <Sequence/>

                    <Break>
                        <IsNaN><Arg Name="ESPCartridgeType"/>
                        </IsNaN>
                    </Break>

                    <Syslog Severity="Important">Requesting ESP cartridge type:<Arg Name="ESPCartridgeType"/><Units:count/></Syslog>

                    <Science:ESPCartridgeSelect>
                        <Sequence/>
                        <Timeout Duration="P1M"/>
                        <Setting><Science:ESPCartridgeSelect.cartridgeType/><Arg Name="ESPCartridgeType"/></Setting>
                    </Science:ESPCartridgeSelect>

                </Aggregate>

                <ReadDatum Id="TriggerESP">
                    <Science:ESPComponent.sampling/>
                </ReadDatum>

                <Syslog Severity="Important">ESP sampling at <Universal:depth/><Units:meter/> in <Universal:sea_water_temperature/><Units:celsius/> water with <Universal:mass_concentration_of_chlorophyll_in_sea_water/><Units:microgram_per_liter/> chlorophyll fluorescence.</Syslog>

                <ReadDatum Id="WaitForESP">
                    <Science:ESPComponent.sample_number/>
                </ReadDatum>

                <Syslog Severity="Info">Completed acquiring ESP sample.</Syslog>

                <Assign><Sequence/><Arg Name="SampleESP"/><False/></Assign>

            </Aggregate>

        </Aggregate>

        <Aggregate Id="WaitForSample">

            <Sequence/>

            <Break>
                <Not><Arg Name="SampleESP"/></Not>
                <And><Not><Arg Name="SampleCANONSampler"/></Not></And>
            </Break>

            <Guidance:Wait>
                <Sequence/>
                <Setting><Guidance:Wait.duration/><Arg Name="SampleTimeout"/></Setting>
            </Guidance:Wait>

        </Aggregate>

    </Aggregate>

    <Syslog Severity="Info">Sampling completed.</Syslog>

</Aggregate>
