<?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:Control="Tethys/Control"
           xmlns:Guidance="Tethys/Guidance"
           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/Control http://okeanids.mbari.org/tethys/Xml/Control.xsd
                               Tethys/Guidance http://okeanids.mbari.org/tethys/Xml/Guidance.xsd
                               Tethys/Science http://okeanids.mbari.org/tethys/Xml/Science.xsd"
       Id="SampleAtDepth">

    <Description>
        Take a water sample at a specified depth.
    </Description>

    <DefineArg Name="TargetDepth"><Description>
        Depth to sample at. Initialized to 5 m.
    </Description><Units:meter/><Value>5</Value></DefineArg>

    <DefineArg Name="SettleTime"><Description>
        Time to wait after reaching target depth before triggering sample.
        Initialized to 10 minutes.
    </Description><Units:second/><Value>10</Value></DefineArg>

    <DefineArg Name="MaxWaitNotReachingDepth"><Description>
        Maximum wait time the vehicle cannot reach the targeted depth.
        Initialized to 3 hours.
    </Description><Units:hour/><Value>3</Value></DefineArg>

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

    <DefineArg Name="UseCANONSampler"><Description>
        Whether to use CANON Sampler to sample.
    </Description><Science:CANONSampler.loadAtStartup/></DefineArg>

    <DefineArg Name="UseESP"><Description>
        Whether to use ESP to sample.
    </Description><Science:ESPComponent.loadAtStartup/></DefineArg>

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

    <DefineArg Name="CANONSamplerTriggerTimeout"><Description>
        How long to wait for a CANON Sampler sample to start.
    </Description><Units:minute/><Value>3</Value></DefineArg>

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

    <DefineArg Name="BuoyancyNeutral"><Description>
        Buoyancy bladder position during spiral or donut. Defaults to
        buoyancyNeutral setting in the Config/Control.cfg file. Set to NaN cc
        for active buoyancy
    </Description><Control:VerticalControl.buoyancyNeutral/></DefineArg>

    <When>
        <Called/>
    </When>

    <Aggregate Id="ReportInvalidDepth">

        <Sequence/>

        <Break>
            <Not><IsNaN><Arg Name="TargetDepth"/></IsNaN></Not>
        </Break>

        <Syslog Severity="Fault">SampleAtDepth received an invalid target depth. Skipping sample.</Syslog>
        
    </Aggregate>

    <Aggregate Id="sample">

        <Sequence/>

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

        <Aggregate Id="ApproachDepth">

            <Sequence/>

            <Syslog>Moving to <Arg Name="TargetDepth"/><Units:meter/></Syslog>

            <Guidance:Pitch>
                <Sequence/>
                <Timeout Duration="MaxWaitNotReachingDepth">
                    <Syslog Severity="Important">Timed out trying to reach the targeted depth. Stopping mission.</Syslog>
                    <Guidance:Execute>
                        <Sequence/>
                        <Setting><Guidance:Execute.command/><String>stop</String></Setting>
                    </Guidance:Execute>
                </Timeout>
                <Setting><Guidance:Pitch.depth/><Arg Name="TargetDepth"/></Setting>
            </Guidance:Pitch>

        </Aggregate>

        <Aggregate Id="SampleWrapper">

            <Sequence/>

            <Guidance:Pitch>
                <Parallel/>
                <Setting><Guidance:Pitch.depth/><Arg Name="TargetDepth"/></Setting>
            </Guidance:Pitch>

            <Syslog Severity="Important">At <Universal:depth/><Units:meter/>, settling for <Arg Name="SettleTime"/><Units:minute/></Syslog>

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

            <Aggregate Id="SampleCANONSampler">

                <Sequence/>

                <Break>
                    <Not><Arg Name="UseCANONSampler"/></Not>
                </Break>

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

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

                <ReadDatum Id="TriggerCANONSampler">
                    <Timeout Duration="CANONSamplerTriggerTimeout">
                        <Syslog Severity="Important">Timed out triggering CANONSampler. Stopping mission.</Syslog>
                        <Guidance:Execute>
                            <Sequence/>
                            <Setting><Guidance:Execute.command/><String>stop</String></Setting>
                        </Guidance:Execute>
                    </Timeout>
                    <Science:CANONSampler.sampling/>
                </ReadDatum>

                <Syslog Severity="Important">CANONSampler sampling at <Universal:depth/><Units:meter/> in <Science:CTD_NeilBrown.bin_mean_sea_water_temperature/><Units:celsius/> water with <Science:WetLabsBB2FL.bin_mean_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. Stopping mission.</Syslog>
                        <Guidance:Execute>
                            <Sequence/>
                            <Setting><Guidance:Execute.command/><String>stop</String></Setting>
                        </Guidance:Execute>
                    </Timeout>
                    <Science:CANONSampler.sample_number/>
                </ReadDatum>

            </Aggregate>

            <Aggregate Id="SampleESP">

                <Sequence/>

                <Break>
                    <Not><Arg Name="UseESP"/></Not>
                </Break>

                <Aggregate Id="SelectESPCartridge">

                    <Sequence/>

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

                    <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 <Science:CTD_Seabird.bin_mean_sea_water_temperature/><Units:celsius/> water with <Science:WetLabsBB2FL.bin_mean_mass_concentration_of_chlorophyll_in_sea_water/><Units:microgram_per_liter/>chlorophyll fluorescence.</Syslog>

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

            </Aggregate>

        </Aggregate>

        

    </Aggregate>

</Aggregate>
