<?xml version="1.0" encoding="UTF-8"?>
<Mission xmlns="Tethys"
       xmlns:Control="Tethys/Control"
       xmlns:Guidance="Tethys/Guidance"
       xmlns:Science="Tethys/Science"
       xmlns:Sample="Tethys/Sample"
       xmlns:Units="Tethys/Units"
       xmlns:Universal="Tethys/Universal"
       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/Sample http://okeanids.mbari.org/tethys/Xml/Sample.xsd
                           Tethys/Science http://okeanids.mbari.org/tethys/Xml/Science.xsd
                           Tethys/Units http://okeanids.mbari.org/tethys/Xml/Units.xsd
                           Tethys/Universal http://okeanids.mbari.org/tethys/Xml/Universal.xsd"
       Id="smear_waypoint_sampling">

<!-- Almost every mission should start with an overall timeout and a NeedCommsTime. Drift Missions will have an acoustic timeout instead of a NeedCommsTime. -->

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

    <DefineArg Name="NumSamplers"><Description>
        Total number of ESP cartridges (Maximum 60) or CANON samplers. Set to 0
        to disable sampling.
    </Description><Units:count/><Value>1</Value></DefineArg>

<!--debug    
    </Description><Units:count/><Value>3</Value></DefineArg>
-->

    <DefineArg Name="CartridgeType"><Description>
        Cartridge type. Initialized to -6.
    </Description><Units:count/><Value>-6</Value></DefineArg>

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

    <DefineArg Name="MissionTimeout"><Description>
        Maximum duration of mission
    </Description><Units:hour/><Value>3</Value></DefineArg>

    <DefineArg Name="WaitDuration"><Description>
        Wait time before firing a sample.
    </Description><Units:minute/><Value>0</Value></DefineArg>

    <DefineArg Name="NeedCommsTimeInTransit"><Description>
        In transit, how often to surface for commumications
    </Description><Units:minute/><Value>60</Value></DefineArg>

    <DefineArg Name="MaxWaitNoFiring"><Description>
        If no firing after more than MaxWaitNoFiring, terminate mission.
    </Description><Units:hour/><Value>2</Value></DefineArg>

<!--debug
    </Description><Units:hour/><Value>0.05</Value></DefineArg>
-->

    <DefineArg Name="ReachEndWaypoint"><Description>
        Whether to reach the end waypoint after sampling is completed
        (initialized to true).
    </Description><True/></DefineArg>

<!--debug
    </Description><False/></DefineArg>
-->

    <DefineArg Name="Speed"><Description>
        Vehicle speed.
    </Description><Units:meter_per_second/><Value>1.0</Value></DefineArg>

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

    <DefineArg Name="SamplingYoYoMinDepth"><Description>
        Minimum yoyo depth while transiting to the sampling location.
    </Description><Units:meter/><Value>10</Value></DefineArg>

    <DefineArg Name="SamplingYoYoMaxDepth"><Description>
        Maximum yoyo depth while transiting to the sampling location.
    </Description><Units:meter/><Value>20</Value></DefineArg>

    <DefineArg Name="WaypointCaptureRadius"><Description>
        Waypoint capture radius for transiting to the sampling location.
    </Description><Units:meter/><Value>100</Value></DefineArg>

    <DefineArg Name="SamplingStartLatitude"><Description>
        The start latitude of sampling. If NaN, start here.
    </Description><Units:degree/><Value>NaN</Value></DefineArg>

<!--debug
    </Description><Units:degree/><Value>36.80</Value></DefineArg>
-->

    <DefineArg Name="SamplingStartLongitude"><Description>
        The start longitude of sampling. If NaN, start here.
    </Description><Units:degree/><Value>NaN</Value></DefineArg>

<!--debug
    </Description><Units:degree/><Value>-121.82</Value></DefineArg>
-->

    <DefineArg Name="SamplingEndLatitude"><Description>
        The end latitude of sampling. Must set.
    </Description><Units:degree/><Value>NaN</Value></DefineArg>

<!--debug    
    </Description><Units:degree/><Value>36.808</Value></DefineArg>
-->

    <DefineArg Name="SamplingEndLongitude"><Description>
        The end longitude of sampling. Must set.
    </Description><Units:degree/><Value>NaN</Value></DefineArg>

<!--debug    
    </Description><Units:degree/><Value>-121.838</Value></DefineArg>
-->

<!-- Use caution when changing these. -->

    <DefineArg Name="YoYoMinAltitude"><Description>
        Minimum altitude while performing the YoYo behavior (for
        bottom-terminated YoYos).
    </Description><Units:meter/><Value>9</Value></DefineArg>

    <DefineArg Name="MinAltitude"><Description>
        Minimum altitude for the entire mission.
    </Description><Units:meter/><Value>7</Value></DefineArg>

    <DefineArg Name="MinOffshore"><Description>
        Minimum offshore distance for the entire mission.
    </Description><Units:kilometer/><Value>2</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>

    <DefineArg Name="YoYoUpPitch"><Description>
        Vehicle up pitch while performing the YoYo behavior.
    </Description><Units:degree/><Value>20</Value></DefineArg>

    <DefineArg Name="YoYoDownPitch"><Description>
        Vehicle down pitch while performing the YoYo behavior.
    </Description><Units:degree/><Value>-20</Value></DefineArg>

    <DefineArg Name="BuoyancyNeutral"><Description>
        Buoyancy bladder position while performing the YoYo behavior. Defaults
        to buoyancyNeutral setting in the Config/Control.cfg file. Set to NaN cc
        for active buoyancy
    </Description><Control:VerticalControl.buoyancyNeutral/></DefineArg>

    <DefineArg Name="MassDefault"><Description>
        Static setting for mass during the mission. Set to NaN mm for active
        mass position
    </Description><Control:VerticalControl.massDefault/></DefineArg>

<!-- Internal variables that you should not change -->

    <DefineArg Name="NeedCommsTimeSamplingTotal"><Description>
        How often to surface for commumications during the process of completing
        all samples, in case something goes wrong during sampling.
    </Description><Units:hour/><Value>3</Value></DefineArg>

    <DefineOutput Name="ElapsedSinceStartOrLastSample"><Description>
        The mission sets this variable to reset the ESP sample timer.
    </Description><Units:hour/><Value>0</Value></DefineOutput>

    <DefineOutput Name="ElapsedTime"><Description>
        Only for syslog.
    </Description><Units:hour/><Value>0</Value></DefineOutput>

    <DefineOutput Name="StoppedForNoFiringForTooLong"><Description>
        Mission stopped because of no firing for too long. Initialized to false.
    </Description><False/></DefineOutput>

    <DefineOutput Name="DepthLogged"><Description></Description><Units:meter/><Value>0.0</Value></DefineOutput>

    <DefineOutput Name="TempLogged"><Description></Description><Units:celsius/><Value>0.0</Value></DefineOutput>

    <DefineOutput Name="ChlLogged"><Description></Description><Units:microgram_per_liter/><Value>0.0</Value></DefineOutput>

    <DefineOutput Name="MissionStartCommsCompleted"><Description>
        MissionStartComms is completed (initialized to false).
    </Description><False/></DefineOutput>

    <DefineOutput Name="TransitCompleted"><Description>
        Transit is completed (initialized to False).
    </Description><False/></DefineOutput>

    <DefineOutput Name="FlagSamplingOngoing"><Description>
        Flag of water sampling in process (initialized to false).
    </Description><False/></DefineOutput>

    <DefineOutput Name="SampleCompleted"><Description>
        Sampling completed. Initialized to false.
    </Description><False/></DefineOutput>

    <DefineOutput Name="CntSamples"><Description>
        Count of water samples (initilized to 1).
    </Description><Units:count/><Value>1</Value></DefineOutput>

<!-- Missions should almost always start with a timeout and a NeedComms aggregate. Drift missions will not use NeedComms. -->

    <Timeout Duration="MissionTimeout"/>

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

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

<!-- Missions should almost always start with standard safety 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>

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

<!-- Many missions will keep mass position fixed at the default. -->

    <Guidance:Pitch>
        <Parallel/>
        <Setting><Guidance:Pitch.massPosition/><Arg Name="MassDefault"/></Setting>
    </Guidance:Pitch>

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

    <Guidance:AltitudeEnvelope>
        <Description>
            Another altitude envelope for the YoYo behavior. This envelope
            should fall within the limits of the standard safety envelopes in
            Insert/StandardEnvelopes.xml in order to avoid commanding high pitch
            angles for bottom-terminated YoYos.
        </Description>
        <Parallel/>
        <Setting><Guidance:AltitudeEnvelope.minAltitude/><Arg Name="YoYoMinAltitude"/></Setting>
        <Setting><Guidance:AltitudeEnvelope.upPitch/><Arg Name="YoYoUpPitch"/></Setting>
    </Guidance:AltitudeEnvelope>

    <Aggregate Id="TriggerSampling">

        <When>
            <Called/>
        </When>

        <Aggregate Id="TriggerESP">

            <Sequence/>

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

            <Assign><Sequence/><Arg Name="DepthLogged"/><Universal:depth/></Assign>

            <Assign><Sequence/><Arg Name="TempLogged"/><Universal:sea_water_temperature/></Assign>

            <Assign><Sequence/><Arg Name="ChlLogged"/><Universal:mass_concentration_of_chlorophyll_in_sea_water/></Assign>

            <Syslog Severity="Important">Trigger ESP sampling. DepthLogged, TempLogged, ChlLogged = <Arg Name="DepthLogged"/><Units:meter/>, <Arg Name="TempLogged"/><Units:celsius/>, <Arg Name="ChlLogged"/><Units:microgram_per_liter/>.</Syslog>

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

            <ReadDatum>
                <Science:ESPComponent.sampling/>
            </ReadDatum>

            <Syslog Severity="Important">Wait for ESP sampling to complete.</Syslog>

            <ReadDatum>
                <Science:ESPComponent.sample_number/>
            </ReadDatum>

        </Aggregate>

        <Aggregate Id="TriggerCANON">

            <Sequence/>

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

            <Assign><Sequence/><Arg Name="DepthLogged"/><Universal:depth/></Assign>

            <Assign><Sequence/><Arg Name="TempLogged"/><Universal:sea_water_temperature/></Assign>

            <Assign><Sequence/><Arg Name="ChlLogged"/><Universal:mass_concentration_of_chlorophyll_in_sea_water/></Assign>

            <Syslog Severity="Important">Trigger CANON sampling. DepthLogged, TempLogged, ChlLogged = <Arg Name="DepthLogged"/><Units:meter/>, <Arg Name="TempLogged"/><Units:celsius/>, <Arg Name="ChlLogged"/><Units:microgram_per_liter/>.</Syslog>

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

            <Assign><Parallel/><Science:CANONSampler.rotateOnly/><Arg Name="CANONSamplerRotateOnly"/></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>

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

    <Aggregate Id="InsertWait">

        <When>
            <Called/>
        </When>

        <Aggregate Id="IfNot1stSample">

            <Break><Arg Name="CntSamples"/>
                <Eq><Units:count/><Value>1</Value></Eq>
            </Break>

            <Syslog Severity="Important">Wait <Arg Name="WaitDuration"/><Units:minute/> before firing sample.</Syslog>

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

        </Aggregate>

    </Aggregate>

    <Aggregate Id="MissionStart">

        <Sequence/>

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

        <Assign><Sequence/><Arg Name="MissionStartCommsCompleted"/><True/></Assign>

        <Assign><Sequence/><Arg Name="ElapsedSinceStartOrLastSample"/><Units:hour/><Value>0</Value></Assign>

        <Assign><Sequence/><Arg Name="TransitCompleted"/><True/></Assign>

    </Aggregate>

    <Aggregate Id="TransitToSamplingLocation">

        <Sequence/>

        <Break>
            <IsNaN><Arg Name="SamplingStartLatitude"/>
            </IsNaN>
            <Or><IsNaN><Arg Name="SamplingStartLongitude"/>
            </IsNaN></Or>
        </Break>

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

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

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

        <Guidance:DepthEnvelope>
            <Parallel/>
            <Setting><Guidance:DepthEnvelope.minDepth/><Arg Name="SamplingYoYoMinDepth"/></Setting>
            <Setting><Guidance:DepthEnvelope.maxDepth/><Arg Name="SamplingYoYoMaxDepth"/></Setting>
            <Setting><Guidance:DepthEnvelope.downPitch/><Arg Name="YoYoDownPitch"/></Setting>
            <Setting><Guidance:DepthEnvelope.upPitch/><Arg Name="YoYoUpPitch"/></Setting>
        </Guidance:DepthEnvelope>

        <Guidance:YoYo>
            <Parallel/>
            <Setting><Guidance:YoYo.downPitch/><Arg Name="YoYoDownPitch"/></Setting>
            <Setting><Guidance:YoYo.upPitch/><Arg Name="YoYoUpPitch"/></Setting>
        </Guidance:YoYo>

        <Guidance:Buoyancy>
            <Parallel/>
            <Setting><Guidance:Buoyancy.position/><Arg Name="BuoyancyNeutral"/></Setting>
        </Guidance:Buoyancy>

        <Guidance:Waypoint>
            <Sequence/>
            <Setting><Guidance:Waypoint.latitude/><Arg Name="SamplingStartLatitude"/></Setting>
            <Setting><Guidance:Waypoint.longitude/><Arg Name="SamplingStartLongitude"/></Setting>
            <Setting><Guidance:Waypoint.captureRadius/><Arg Name="WaypointCaptureRadius"/></Setting>
        </Guidance:Waypoint>

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

        <Assign><Sequence/><Arg Name="ElapsedSinceStartOrLastSample"/><Units:hour/><Value>0</Value></Assign>

        <Assign><Sequence/><Arg Name="TransitCompleted"/><True/></Assign>

    </Aggregate>

    <Aggregate Id="SamplingToWaypoint">

        <Sequence/>

        <Break>
            <IsNaN><Arg Name="SamplingEndLatitude"/>
            </IsNaN>
            <Or><IsNaN><Arg Name="SamplingEndLongitude"/>
            </IsNaN></Or>
            <Or><Not><Arg Name="ReachEndWaypoint"/></Not><And><Arg Name="CntSamples"/><Eq><Arg Name="NumSamplers"/> <Add><Units:count/> <Value>1</Value></Add></Eq></And></Or>
        </Break>

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

        <Guidance:DepthEnvelope>
            <Parallel/>
            <Setting><Guidance:DepthEnvelope.minDepth/><Arg Name="SamplingYoYoMinDepth"/></Setting>
            <Setting><Guidance:DepthEnvelope.maxDepth/><Arg Name="SamplingYoYoMaxDepth"/></Setting>
            <Setting><Guidance:DepthEnvelope.downPitch/><Arg Name="YoYoDownPitch"/></Setting>
            <Setting><Guidance:DepthEnvelope.upPitch/><Arg Name="YoYoUpPitch"/></Setting>
        </Guidance:DepthEnvelope>

        <Guidance:YoYo>
            <Parallel/>
            <Setting><Guidance:YoYo.downPitch/><Arg Name="YoYoDownPitch"/></Setting>
            <Setting><Guidance:YoYo.upPitch/><Arg Name="YoYoUpPitch"/></Setting>
        </Guidance:YoYo>

        <Guidance:Buoyancy>
            <Parallel/>
            <Setting><Guidance:Buoyancy.position/><Arg Name="BuoyancyNeutral"/></Setting>
        </Guidance:Buoyancy>

        <Guidance:Waypoint>
            <Sequence/>
            <Setting><Guidance:Waypoint.latitude/><Arg Name="SamplingEndLatitude"/></Setting>
            <Setting><Guidance:Waypoint.longitude/><Arg Name="SamplingEndLongitude"/></Setting>
            <Setting><Guidance:Waypoint.captureRadius/><Arg Name="WaypointCaptureRadius"/></Setting>
        </Guidance:Waypoint>

        <Aggregate Id="TakeSamples">

            <Parallel/>

            <Aggregate Id="NoFiringForTooLong">

                <When>
                    <Arg Name="TransitCompleted"/>
                    <And><Elapsed><Arg Name="ElapsedSinceStartOrLastSample"/></Elapsed><Gt><Arg Name="MaxWaitNoFiring"/></Gt></And>
                    <And><Not><Arg Name="FlagSamplingOngoing"/></Not></And>
                    <And><Not><Arg Name="CntSamples"/><Eq><Arg Name="NumSamplers"/> <Add><Units:count/> <Value>1</Value></Add></Eq></Not></And>
                    <And><Not><Arg Name="StoppedForNoFiringForTooLong"/></Not></And>
                </When>

                <Assign><Sequence/><Arg Name="ElapsedTime"/><Elapsed><Arg Name="ElapsedSinceStartOrLastSample"/></Elapsed></Assign>

                <Syslog Severity="Important">No firing for too long. Stopping mission. ElapsedTime, MaxWaitNoFiring = <Arg Name="ElapsedTime"/><Units:minute/>, <Arg Name="MaxWaitNoFiring"/><Units:minute/></Syslog>

                <Guidance:Execute>
                    <Sequence/>
                    <Setting><Guidance:Execute.command/><String>stop</String></Setting>
                </Guidance:Execute>

                <Assign><Sequence/><Arg Name="StoppedForNoFiringForTooLong"/><True/></Assign>

            </Aggregate>

            <Aggregate Id="Firing">

                <When>
                    <Universal:depth/>
                    <Ge><Arg Name="SamplingYoYoMinDepth"/></Ge>
                    <And><Universal:depth/><Le><Arg Name="SamplingYoYoMaxDepth"/></Le></And>
                    <And><Arg Name="MissionStartCommsCompleted"/></And>
                    <And><Arg Name="TransitCompleted"/></And>
                    <And><Not><Arg Name="FlagSamplingOngoing"/></Not></And>
                    <And><Arg Name="CntSamples"/><Le><Arg Name="NumSamplers"/></Le></And>
                    <And><Not><Arg Name="SampleCompleted"/></Not></And>
                </When>

                <Assign><Sequence/><Arg Name="FlagSamplingOngoing"/><True/></Assign>

                <Syslog Severity="Important">Taking sample No.<Arg Name="CntSamples"/><Units:count/>.</Syslog>

                <Assign><Sequence/><Arg Name="ElapsedSinceStartOrLastSample"/><Units:hour/><Value>0</Value></Assign>

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

                <Call Id="WaitBeforeFiring" RefId="InsertWait"/>

                <Call Id="Sampling" RefId="TriggerSampling"/>

                <Syslog Severity="Important"> Sample No.<Arg Name="CntSamples"/><Units:count/> completed.</Syslog>

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

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

                <Assign><Sequence/><Arg Name="SampleCompleted"/><True/></Assign>

                <Assign><Sequence/><Arg Name="ElapsedSinceStartOrLastSample"/><Units:hour/><Value>0</Value></Assign>

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

            </Aggregate>

            <Aggregate Id="IncrementSampleCounter">

                <When>
                    <Arg Name="SampleCompleted"/>
                </When>

                <Assign><Sequence/><Arg Name="CntSamples"/><Arg Name="CntSamples"/><Add><Units:count/> <Value>1</Value></Add></Assign>

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

            </Aggregate>

        </Aggregate>

    </Aggregate>

</Mission>
