<?xml version="1.0" encoding="UTF-8"?>
<Mission xmlns="Tethys"
       xmlns:Control="Tethys/Control"
       xmlns:Guidance="Tethys/Guidance"
       xmlns:Science="Tethys/Science"
       xmlns:Universal="Tethys/Universal"
       xmlns:Units="Tethys/Units"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="Tethys http://okeanids.mbari.org/tethys/Xml/Tethys.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
                           Tethys/Universal http://okeanids.mbari.org/tethys/Xml/Universal.xsd
                           Tethys/Units http://okeanids.mbari.org/tethys/Xml/Units.xsd"
       Id="sampleDepthRate">

    <Description>
        This mission drives in a circle while ascending at a given depth rate.
    </Description>

    <DefineArg Name="MissionTimeout"><Description>
        How long to let the mission run.
    </Description><Units:minute/><Value>120</Value></DefineArg>

    <DefineArg Name="NeedCommsTime"><Description>
        How often to surface for commumications
    </Description><Units:minute/><Value>120</Value></DefineArg>

    <DefineArg Name="startDepth"><Description>
        Depth to sample at.
    </Description><Units:meter/><Value>50</Value></DefineArg>

    <DefineArg Name="endDepth"><Description>
        Depth at which to end.
    </Description><Units:meter/><Value>5</Value></DefineArg>

    <DefineArg Name="UpRate"><Description>
        Depth rate (Negative depth rate means going up).
    </Description><Units:meter_per_second/><Value>-0.05555</Value></DefineArg>

    <DefineArg Name="NumberOfSamples"><Description>
        Number of samples to take.
    </Description><Units:count/><Value>1</Value></DefineArg>

    <DefineArg Name="Speed"><Description>
        Vehicle speed. Initialized to zero.
    </Description><Units:meter_per_second/><Value>1</Value></DefineArg>

    <DefineArg Name="RudderAngle"><Description>
        Rudder angle. Initialized to zero.
    </Description><Units:degree/><Value>12</Value></DefineArg>

    <DefineArg Name="WaitBeforeSample"><Description>
        How long to wait between samples. This starts *before* the first sample
        to exercise the SettleTime setting in the insert aggregate.
    </Description><Units:minute/><Value>1</Value></DefineArg>

    <DefineArg Name="MinAltitude"><Description>
        Minimum height above the sea floor for the entire mission.
    </Description><Units:meter/><Value>5</Value></DefineArg>

    <DefineArg Name="MaxDepth"><Description>
        Maximum depth for the entire mission.
    </Description><Units:meter/><Value>205</Value></DefineArg>

    <DefineArg Name="MinOffshore"><Description>
        Minimum offshore distance for the entire mission.
    </Description><Units:kilometer/><Value>2</Value></DefineArg>

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

<!-- You probably do not need to change these. -->

    <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="CANONSamplerTriggerTimeout"><Description>
        How long to wait for a CANON Sampler sample to start.
    </Description><Units:minute/><Value>1</Value></DefineArg>

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

    <Timeout Duration="MissionTimeout"/>

    <Insert Filename="Insert/Science.xml">
        <Description>
            Most missions will run the science sensors. If you don't place this
            aggregate above NeedComms, science instruments get turned off on the
            last upcast and while floating on the surface.
        </Description>
    </Insert>

<!-- Most missions should use the NeedComms aggregate. -->

    <Insert Filename="Insert/NeedComms.xml" Id="NeedComms"/>

    <Assign><Sequence/><Arg Name="NeedComms:DiveInterval"/><Arg Name="NeedCommsTime"/></Assign>

    <Assign><Sequence/><Arg Name="NeedComms:SurfaceSpeed"/><Arg Name="Speed"/></Assign>

<!-- Missions should almost always start with standard safety envelopes; most missions should not expose the parameters of these envelopes. -->

    <Insert Filename="Insert/StandardEnvelopes.xml"/>

    <Assign><Sequence/><Arg Name="StandardEnvelopes:MinAltitude"/><Arg Name="MinAltitude"/></Assign>

    <Assign><Sequence/><Arg Name="StandardEnvelopes:MaxDepth"/><Arg Name="MaxDepth"/></Assign>

    <Assign><Sequence/><Arg Name="StandardEnvelopes:MinOffshore"/><Arg Name="MinOffshore"/></Assign>

    <Guidance:Pitch>
        <Parallel/>
        <Setting><Guidance:Pitch.massPosition/><Control:VerticalControl.massDefault/></Setting>
    </Guidance:Pitch>

    <Guidance:SetSpeed>
        <Parallel/>
        <Setting><Guidance:SetSpeed.speed/><Arg Name="Speed"/></Setting>
    </Guidance:SetSpeed>

    <Guidance:Point>
        <Parallel/>
        <Setting><Guidance:Point.rudderAngle/><Arg Name="RudderAngle"/></Setting>
    </Guidance:Point>

    <Syslog Severity="Info">Moving to <Arg Name="startDepth"/><Units:meter/></Syslog>

    <Guidance:Pitch>
        <Sequence/>
        <Setting><Guidance:Pitch.depth/><Arg Name="startDepth"/></Setting>
    </Guidance:Pitch>

    <Aggregate Id="SampleWrapper">

        <Sequence/>

        <Aggregate Id="SampleCANONSampler">

            <Sequence/>

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

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

            <Guidance:Pitch>
                <Parallel/>
                <Setting><Guidance:Pitch.depthRate/><Arg Name="UpRate"/></Setting>
                <Setting><Guidance:Pitch.depth/><Arg Name="endDepth"/></Setting>
            </Guidance:Pitch>

            <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>

            <Guidance:Pitch>
                <Parallel/>
                <Setting><Guidance:Pitch.depthRate/><Arg Name="UpRate"/></Setting>
                <Setting><Guidance:Pitch.depth/><Arg Name="endDepth"/></Setting>
            </Guidance:Pitch>

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

            <Syslog Severity="Important">ESP 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 Id="WaitForESP">
                <Science:ESPComponent.sample_number/>
            </ReadDatum>

        </Aggregate>

    </Aggregate>

    <Call Id="MissionComplete" RefId="NeedComms"/>

</Mission>
