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

    <DefineArg Name="CommsInterval"><Description>
        How often to trigger uModem communications while the mission is in an
        idle state (on the dock).
    </Description><Units:minute/><Value>10</Value></DefineArg>

    <DefineArg Name="HomingCommsInterval"><Description>
        How often to trigger uModem communications while the mission is actively
        homing to the dock (line capture).
    </Description><Units:minute/><Value>30</Value></DefineArg>

    <DefineArg Name="TransponderCode"><Description>
        Dock transponder address.
    </Description><Dock:Dock.transponderCode/></DefineArg>

    <DefineArg Name="AcousticUpdatePeriod"><Description>
        Time duration between acoustic range queries while the mission is in an
        idle state (on the dock or surface).
    </Description><Units:second/><Value>60</Value></DefineArg>

    <DefineArg Name="HomingAcousticUpdatePeriod"><Description>
        Time duration between acoustic range queries while the mission is
        actively homing to the dock (line capture).
    </Description><Units:second/><Value>2.5</Value></DefineArg>

    <DefineArg Name="NumberOfPings"><Description>
        Number of pings requested each time.
    </Description><Units:count/><Value>1</Value></DefineArg>

    <DefineArg Name="TrackingLowPassFilterWinSize"><Description>
        Median filter bin size. Filters the contact estimated lat/lon position.
        Prefer odd number, set to 1 to disable filter.
    </Description><Units:count/><Value>1</Value></DefineArg>

    <DefineArg Name="TrackingLowPassFilterWinOverlap"><Description>
        Set True for "sliding" median filter, false for non-overlapping bins.
    </Description><True/></DefineArg>

<!-- Mission Variables (don't change!) -->

    <DefineOutput Name="TrackingUpdatePeriod"><Description>
        Mission variable (don't change). How long to wait between acoustic
        queries.
    </Description><Units:second/><Value>60</Value></DefineOutput>

    <DefineOutput Name="uModemCommsInterval"><Description>
        Mission variable (don't change). The mission updates the value of this
        variable to determine how often to trigger uModem communications.
    </Description><Units:minute/><Value>10</Value></DefineOutput>

    <DefineOutput Name="Surface"><Description>
        Mission variable (don't change). The mission will run in this mode to go
        to the surface after homing attempts have failed.
    </Description><Units:count/><Value>-1</Value></DefineOutput>

    <DefineOutput Name="Docked"><Description>
        Mission variable (don't change). The mission will run in this mode when
        the vehicle is docked.
    </Description><Units:count/><Value>0</Value></DefineOutput>

    <DefineOutput Name="Home"><Description>
        Mission variable (don't change). The mission will run in this mode when
        homing to the dock.
    </Description><Units:count/><Value>1</Value></DefineOutput>

    <DefineOutput Name="DefaultMode"><Description>
        Mission variable (don't change). The mission sets this variable to
        switch between default modes.
    </Description><Units:count/><Value>0</Value></DefineOutput>

    <DefineOutput Name="CaptureMode"><Description>
        Mission variable (don't change). The mission sets this variable to
        reflect the termination status of the LineCapture insert.
    </Description><Units:count/><Value>-1</Value></DefineOutput>

    <DefineOutput Name="StartComms"><Description>
        Mission variable (don't change). The mission sets this variable to reset
        the comms timer. Forces comms when true.
    </Description><True/></DefineOutput>

<!-- Initialize mission variables with default values -->

    <DefineOutput Name="ElapsedSinceDefaultStarted"><Units:minute/><Value>0</Value></DefineOutput>

    <Assign><Sequence/><Arg Name="DefaultMode"/><Arg Name="Docked"/></Assign>

    <Assign><Sequence/><Arg Name="TrackingUpdatePeriod"/><Arg Name="AcousticUpdatePeriod"/></Assign>

    <Assign><Sequence/><Arg Name="uModemCommsInterval"/><Arg Name="CommsInterval"/></Assign>

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

<!-- Safety nets -->

    <Guidance:PitchEnvelope>
        <Parallel/>
    </Guidance:PitchEnvelope>

<!-- uModem communication directives -->

    <Aggregate Id="uModemComms">

        <While>
            <Not><Arg Name="DefaultMode"/><Eq><Arg Name="Surface"/></Eq></Not>
            <And><Arg Name="StartComms"/><Or><Elapsed><Arg Name="StartComms"/></Elapsed><Gt><Arg Name="uModemCommsInterval"/></Gt></Or></And>
        </While>

        <Aggregate Id="doComms">

            <Sequence/>

            <Syslog Severity="Info">Initiating uModem comms cycle.</Syslog>

<!-- Reduce range interrogation rates to minimize interruptions to uModem comms packets -->

            <Assign><Sequence/><Arg Name="TrackingUpdatePeriod"/><Arg Name="AcousticUpdatePeriod"/></Assign>

            <ReadDatum>
                <Timeout Duration="P10M"/>
                <Universal:platform_communications/>
            </ReadDatum>

            <Aggregate Id="ResumeTracking">

                <Description>
                    Resume rapid acoustic interrogation rate if the mission is
                    still actively homing to the dock.
                </Description>

                <Sequence/>

                <Break>
                    <Not><Arg Name="DefaultMode"/><Eq><Arg Name="Home"/></Eq></Not>
                </Break>

                <Assign><Sequence/><Arg Name="TrackingUpdatePeriod"/><Arg Name="HomingAcousticUpdatePeriod"/></Assign>

            </Aggregate>

<!-- This assignment restarts the comms timer -->

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

        </Aggregate>

    </Aggregate>

<!-- Notify directives. -->

    <Aggregate Id="Notify">

        <Parallel/>

        <Aggregate>

            <Sequence/>

            <Aggregate>

                <Sequence Repeat="48"/>

                <Guidance:Wait>
                    <Sequence/>
                    <Setting><Guidance:Wait.duration/><Units:minute/><Value>30</Value></Setting>
                </Guidance:Wait>

                <Assign><Sequence/><Arg Name="ElapsedSinceDefaultStarted"/><Elapsed><Universal:mission_started/></Elapsed></Assign>

                <Syslog Severity="Important">Default Under mission has been running for <Arg Name="ElapsedSinceDefaultStarted"/><Units:minute/></Syslog>

            </Aggregate>

            <Syslog Severity="Important">Restarting logs.</Syslog>

            <Guidance:Execute>
                <Sequence/>
                <Setting><Guidance:Execute.command/><String>restart logs</String></Setting>
            </Guidance:Execute>

        </Aggregate>

    </Aggregate>

<!-- Add LineCapture directives. -->
    
    <Insert Filename="Insert/LineCapture.xml"/>
    
<!-- Add SetNav directives. -->
    
    <Insert Filename="Insert/SetNavAcoustic.xml"/>

<!-- Add track acoustic contact directives. -->

    <Aggregate Id="TrackAcousticContact">

        <Parallel/>

        <Estimation:TrackAcousticContact>
            <Parallel/>
            <Setting><Estimation:TrackAcousticContact.contactLabelSetting/><Arg Name="TransponderCode"/></Setting>
            <Setting><Estimation:TrackAcousticContact.numberOfSamplesSetting/><Arg Name="NumberOfPings"/></Setting>
            <Setting><Estimation:TrackAcousticContact.updatePeriodSetting/><Arg Name="TrackingUpdatePeriod"/></Setting>
            <Setting><Estimation:TrackAcousticContact.numFixesLowPassSetting/><Arg Name="TrackingLowPassFilterWinSize"/></Setting>
            <Setting><Estimation:TrackAcousticContact.lowPassOverlapSetting/><Arg Name="TrackingLowPassFilterWinOverlap"/></Setting>
        </Estimation:TrackAcousticContact>

    </Aggregate>

<!-- Default mission sequence. -->

    <Guidance:Wait>
        <Description>
            Wait a moment to see if the scheduler starts a new mission before
            starting to actually run Default.
        </Description>
        <Sequence/>
        <Setting><Guidance:Wait.duration/><Units:second/><Value>13</Value></Setting>
    </Guidance:Wait>

    <Aggregate Id="Default">

        <Sequence/>

        <Aggregate Id="Docked">

            <Description>
                Keep the vehicle in an idle state while on the dock, transition
                to Home mode if detached.
            </Description>

            <While>
                <Arg Name="DefaultMode"/>
                <Eq><Arg Name="Docked"/></Eq>
            </While>

            <Aggregate Id="run">

                <Sequence/>

                <Syslog Severity="Info">Running Docked. DefaultMode:<Arg Name="DefaultMode"/><Units:count/></Syslog>

                <Aggregate Id="initialize">

                    <Sequence/>

                    <Assign><Sequence/><Arg Name="uModemCommsInterval"/><Arg Name="CommsInterval"/></Assign>

                    <Assign><Sequence/><Arg Name="TrackingUpdatePeriod"/><Arg Name="AcousticUpdatePeriod"/></Assign>

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

                </Aggregate>

                <Dock:Docked>
                    <Sequence/>
                </Dock:Docked>

                <Assign><Sequence/><Arg Name="DefaultMode"/><Arg Name="Home"/></Assign>

            </Aggregate>

        </Aggregate>

        <Aggregate Id="Home">

            <Description>
                Execute the homing sequence.
            </Description>

            <While>
                <Arg Name="DefaultMode"/>
                <Eq><Arg Name="Home"/></Eq>
            </While>

            <Aggregate Id="run">

                <Sequence/>

                <Syslog Severity="Info">Running Home sequence. DefaultMode:<Arg Name="DefaultMode"/><Units:count/></Syslog>

                <Aggregate Id="initialize">

                    <Sequence/>

                    <Assign><Sequence/><Arg Name="uModemCommsInterval"/><Arg Name="HomingCommsInterval"/></Assign>

                    <Assign><Sequence/><Arg Name="TrackingUpdatePeriod"/><Arg Name="HomingAcousticUpdatePeriod"/></Assign>

                    <Assign><Sequence/><Arg Name="CaptureMode"/><Arg Name="Surface"/></Assign>

                </Aggregate>

<!-- Execute the LineCapture sequence. -->

                <Call RefId="LineCapture"/>

                <Assign><Sequence/><Arg Name="CaptureMode"/><Arg Name="LineCapture:GuidanceMode"/></Assign>

                <Aggregate Id="CheckCaptureSuccess">

                    <Sequence/>

                    <Break>
                        <Not><Arg Name="CaptureMode"/><Eq><Arg Name="Docked"/></Eq></Not>
                    </Break>

                    <Assign><Sequence/><Arg Name="DefaultMode"/><Arg Name="Docked"/></Assign>

                </Aggregate>

                <Assign><Sequence/><Arg Name="DefaultMode"/><Arg Name="Surface"/></Assign>

            </Aggregate>

        </Aggregate>

        <Aggregate Id="Surface">

            <While>
                <Arg Name="DefaultMode"/>
                <Eq><Arg Name="Surface"/></Eq>
            </While>

            <Aggregate Id="run">

                <Sequence/>

                <Syslog Severity="Info">Running Surface sequence. DefaultMode:<Arg Name="DefaultMode"/><Units:count/></Syslog>

                <Aggregate Id="initialize">

                    <Sequence/>

                    <Assign><Sequence/><Arg Name="TrackingUpdatePeriod"/><Arg Name="AcousticUpdatePeriod"/></Assign>

                </Aggregate>

                <Guidance:GoToSurface>
                    <Parallel/>
                </Guidance:GoToSurface>

                <Aggregate Id="SurfaceComms">

                    <Sequence Repeat="288"/>

                    <ReadDatum Id="Read_GPS">
                        <Timeout Duration="P5M"/>
                        <Universal:time_fix/>
                    </ReadDatum>

                    <ReadDatum Id="Read_Iridium_uModem">
                        <Timeout Duration="P2H">
                            <Guidance:Execute>
                                <Sequence/>
                                <Setting><Guidance:Execute.command/><String>Burn on</String></Setting>
                            </Guidance:Execute>
                            <Syslog Severity="Critical">Dropped weight due to communications timeout.</Syslog>
                        </Timeout>
                        <Universal:platform_communications/>
                    </ReadDatum>

                    <Guidance:Wait>
                        <Sequence/>
                        <Setting><Guidance:Wait.duration/><Units:minute/><Value>5</Value></Setting>
                    </Guidance:Wait>

                </Aggregate>

            </Aggregate>

        </Aggregate>

    </Aggregate>

</Mission>
