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

    <Description>
        Vehicle gets towed underwater at a fairly consistent depth and released
        without the vehicle knowing. Depth limits trigger the end of the
        mission.
    </Description>

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

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

    <DefineArg Name="TowBoundUp"><Description>
        Once the vehicle reaches this depth for the timeout, it's no longer
        considered in tow.
    </Description><Units:meter/><Value>2</Value></DefineArg>

    <DefineArg Name="TowBoundDown"><Description>
        Once the vehicle reaches this depth for the timeout, it's no longer
        considered in tow.
    </Description><Units:meter/><Value>8</Value></DefineArg>

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

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

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

    <DefineArg Name="MassDefault"><Description>
        Static setting for mass during. Defaults to massDefault setting.
    </Description><Control:VerticalControl.massDefault/></DefineArg>

    <DefineArg Name="BuoyancyNeutral"><Description>
        Buoyancy bladder position. Defaults to buoyancyNeutral setting.
    </Description><Control:VerticalControl.buoyancyNeutral/></DefineArg>

    <DefineArg Name="UnderTow"><Description>
        Sets true when we've been under long enough that we think we're under
        tow.
    </Description><False/></DefineArg>

    <DefineArg Name="UnderTowTimerArmed"><Description>
        Sets true when we hit the top depth and want to arm the clock.
    </Description><False/></DefineArg>

    <DefineArg Name="TowTimeout"><Description>
        How long to wait until we're probably not being towed anymore
    </Description><Units:minute/><Value>3</Value></DefineArg>

    <DefineArg Name="ArmingInterval"><Description>
        Used to measure elapsed time
    </Description><Units:second/><Value>60</Value></DefineArg>

    <DefineArg Name="TowTimer"><Description>
        Elapsed time tow.
    </Description><Units:minute/><Value>NaN</Value></DefineArg>

    <Timeout Duration="MissionTimeout"/>

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

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

    <Assign><Sequence/><Arg Name="NeedComms:WaitForPitchUp"/><Units:minute/><Value>0</Value></Assign>

    <Aggregate Id="SurfaceComms">

        <When>
            <Called/>
            <Or><Elapsed><Universal:time_fix/></Elapsed><Gt><Arg Name="NeedCommsTime"/></Gt></Or>
        </When>

        <Call RefId="NeedComms"/>

    </Aggregate>

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

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

    <Guidance:SetSpeed>
        <Parallel/>
        <Setting><Guidance:SetSpeed.speed/><Units:meter_per_second/><Value>0</Value></Setting>
    </Guidance:SetSpeed>

    <Syslog Severity="Important">Lights, Camera on!</Syslog>

    <ReadData Strategy="MinError">
        <Sensor:PowerOnly.samplePowerOnly/>
    </ReadData>

    <Aggregate Id="Towing">

        <Aggregate Id="WaitingForTow">

            <While>
                <Not><Arg Name="UnderTow"/></Not>
                <And><Not><Arg Name="UnderTowTimerArmed"/></Not></And>
                <And><Universal:depth/><Lt><Arg Name="TowBoundUp"/></Lt></And>
            </While>

            <Syslog Severity="Important">Ready To Launch</Syslog>

        </Aggregate>

        <Aggregate Id="StartingTow">

            <When>
                <Not><Arg Name="UnderTow"/></Not>
                <And><Not><Arg Name="UnderTowTimerArmed"/></Not></And>
                <And><Universal:depth/><Gt><Arg Name="TowBoundUp"/></Gt></And>
            </When>

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

            <Assign><Sequence/><Arg Name="TowTimer"/><Universal:time/></Assign>

            <Syslog Severity="Important">Tow Launched</Syslog>

        </Aggregate>

        <Aggregate Id="ArmingTow">

            <When>
                <Not><Arg Name="UnderTow"/></Not>
                <And><Arg Name="UnderTowTimerArmed"/></And>
                <And><Universal:depth/><Gt><Arg Name="TowBoundUp"/></Gt></And>
                <And><Universal:time/><Sub><Arg Name="TowTimer"/></Sub><Gt><Arg Name="ArmingInterval"/></Gt></And>
            </When>

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

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

        </Aggregate>

        <Aggregate Id="InTow">

            <When>
                <Arg Name="UnderTow"/>
                <And><Not><Arg Name="UnderTowTimerArmed"/></Not></And>
                <And><Universal:depth/><Gt><Arg Name="TowBoundUp"/></Gt></And>
                <And><Universal:depth/><Lt><Arg Name="TowBoundDown"/></Lt></And>
            </When>

            <Syslog Severity="Info">Under Tow</Syslog>

            <Assign><Sequence/><Arg Name="TowTimer"/><Universal:time/></Assign>

        </Aggregate>

        <Aggregate Id="OutOfTow">

            <When>
                <Universal:depth/>
                <Lt><Arg Name="TowBoundUp"/></Lt>
                <Or><Universal:depth/><Gt><Arg Name="TowBoundDown"/></Gt></Or>
                <And><Arg Name="UnderTow"/></And>
                <And><Universal:time/><Sub><Arg Name="TowTimer"/></Sub><Gt><Arg Name="TowTimeout"/></Gt></And>
            </When>

            <Syslog Severity="Important">Off Tow. Stopping Mission</Syslog>

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

        </Aggregate>

    </Aggregate>

</Mission>
