<?xml version="1.0" encoding="UTF-8"?>
<Stack xmlns="Tethys"
       xmlns:Control="Tethys/Control"
       xmlns:Guidance="Tethys/Guidance" 
       xmlns:Units="Tethys/Units"
       xmlns:Universal="Tethys/Universal"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="Tethys http://aosn.mbari.org/tethys/Xml/Tethys.xsd
                           Tethys/Control http://aosn.mbari.org/tethys/Xml/Control.xsd
                           Tethys/Guidance http://aosn.mbari.org/tethys/Xml/Guidance.xsd
                           Tethys/Units http://aosn.mbari.org/tethys/Xml/Units.xsd
                           Tethys/Universal http://aosn.mbari.org/tethys/Xml/Universal.xsd"
       Id="Hawaii">

<!-- some high priority behaviors -->

    <Guidance:AltitudeEnvelope RunIn="Parallel">
        <Set><Guidance:AltitudeEnvelope.minAltitude/><Units:meter/><Value>20</Value></Set>
    </Guidance:AltitudeEnvelope>

    <Guidance:OffshoreEnvelope RunIn="Parallel">
        <Set><Guidance:OffshoreEnvelope.minOffshore/><Units:kilometer/><Value>1</Value></Set>
        <Set><Guidance:OffshoreEnvelope.maxOffshore/><Units:kilometer/><Value>4000</Value></Set>
    </Guidance:OffshoreEnvelope>

    <Guidance:DepthEnvelope RunIn="Parallel">
        <Set><Guidance:DepthEnvelope.minDepth/><Units:meter/><Value>0</Value></Set>
        <Set><Guidance:DepthEnvelope.maxDepth/><Units:meter/><Value>300</Value></Set>
    </Guidance:DepthEnvelope>

<!--    Run at high speed -->

    <Guidance:SetSpeed RunIn="Parallel">
        <Set><Guidance:SetSpeed.period/><Units:millisecond/><Value>2000</Value></Set>
    </Guidance:SetSpeed>

<!-- GPS (and Iridium) Update 
     Once an hour or once every kilometer, if we're near the surface, 
     Or once every two hours or once every two km if we are deeper 
     Iridium kicks off approximately every four hours -->

    <Stack Id="NeedSatFix">

<!--    Going to the surface is preemptive only if fix is very old or uninitialized
        This is a workaround for something that should be handled in the code...  
        i.e., avoiding executing the Waypoint command before we know where we are -->

        <Preemptive><Elapsed><Universal:time_fix/></Elapsed><Gt/><Units:day/><Value>30</Value></Preemptive>

        <When><Universal:platform_pitch_angle/>
            <Gt/><Units:degree/><Value>0</Value>
            <And>
                <Elapsed><Universal:time_fix/></Elapsed>
                <Gt/><Units:minute/><Value>30</Value>
                <Or>
                    <Elapsed><Universal:platform_communications/></Elapsed>
                    <Gt/><Units:minute/><Value>30</Value>
                </Or>
            </And>
            <Or>
                <Elapsed><Universal:time_fix/></Elapsed>
                <Gt/><Units:minute/><Value>60</Value>
            </Or>
            <Or>
                <Elapsed><Universal:platform_communications/></Elapsed>
                <Gt/><Units:minute/><Value>60</Value>
            </Or>
        </When>

        <Guidance:GoToSurface RunIn="Parallel"/>

        <Guidance:GoToSurface RunIn="Sequence"/>

        <Stack Id="SurfOps">

<!--        Surface operations are always preemptive -->

            <Preemptive><True/></Preemptive>

<!--        Get the GPS fix at surfacing time -->

            <Guidance:ReadSensor RunIn="Sequence">
                <Timeout Duration="P10M" />
                <SetUri><Guidance:ReadSensor.uri/><Universal:time_fix/></SetUri>
            </Guidance:ReadSensor>

<!--        Transmit the GPS fix, do other conversations -->

            <Guidance:ReadSensor RunIn="Sequence">
                <Timeout Duration="P10M">
                    <When><Universal:platform_conversation/>
                        <Eq/><False/>
                    </When>
                    <Touch Id="TouchComms"><Universal:platform_communications/></Touch>
                </Timeout>
                <SetUri><Guidance:ReadSensor.uri/><Universal:platform_communications/></SetUri>
            </Guidance:ReadSensor>

<!--        Get another GPS fix before diving -->

            <Guidance:ReadSensor RunIn="Sequence">
                <Timeout Duration="P10M">
                    <Touch Id="TouchTime"><Universal:time_fix/></Touch>
                </Timeout>
                <SetUri><Guidance:ReadSensor.uri/><Universal:time_fix/></SetUri>
            </Guidance:ReadSensor>

        </Stack>

    </Stack>

<!-- A set of commands to repeat over and over -->

    <Stack Id="RepeatOps" Repeat="1" >

        <Guidance:ReadSensor RunIn="Parallel">
            <SetUri><Guidance:ReadSensor.uri/><Universal:sea_water_salinity/></SetUri>
        </Guidance:ReadSensor>

        <Guidance:ReadSensor RunIn="Parallel">
            <SetUri><Guidance:ReadSensor.uri/><Universal:sea_water_temperature/></SetUri>
        </Guidance:ReadSensor>

        <Guidance:DepthEnvelope RunIn="Parallel">
            <Set><Guidance:DepthEnvelope.minDepth/><Units:meter/><Value>5</Value></Set>
        </Guidance:DepthEnvelope>

        <Guidance:SetSpeed RunIn="Parallel">
            <Set><Guidance:SetSpeed.speed/><Units:meter_per_second/><Value>1</Value></Set>
        </Guidance:SetSpeed>

        <Guidance:YoYo RunIn="Parallel"/>

<!--    head west -->

        <Stack Id="West">

            <Guidance:Waypoint Id="WaypointW1" RunIn="Sequence">
                <Set><Guidance:Waypoint.latitude/><Units:degree/><Value>20.7</Value></Set>
                <Set><Guidance:Waypoint.longitude/><Units:degree/><Value>-155.5</Value></Set>
            </Guidance:Waypoint>

        </Stack>

<!--    head through -->

        <Stack Id="BigIsland">

            <Guidance:Waypoint Id="WaypointW2" RunIn="Sequence">
                <Set><Guidance:Waypoint.latitude/><Units:degree/><Value>19.95</Value></Set>
                <Set><Guidance:Waypoint.longitude/><Units:degree/><Value>-156.8</Value></Set>
            </Guidance:Waypoint>

        </Stack>

<!--    head around -->

        <Stack Id="Around">

            <Guidance:Waypoint Id="WaypointW3" RunIn="Sequence">
                <Set><Guidance:Waypoint.latitude/><Units:degree/><Value>18.3</Value></Set>
                <Set><Guidance:Waypoint.longitude/><Units:degree/><Value>-156.0</Value></Set>
            </Guidance:Waypoint>

        </Stack>

<!--    head around -->

        <Stack Id="SouthEast">

            <Guidance:Waypoint Id="WaypointW4" RunIn="Sequence">
                <Set><Guidance:Waypoint.latitude/><Units:degree/><Value>19.3</Value></Set>
                <Set><Guidance:Waypoint.longitude/><Units:degree/><Value>-153.6</Value></Set>
            </Guidance:Waypoint>

        </Stack>

<!--    head home -->

        <Stack Id="East">

            <Guidance:Waypoint Id="WaypointW5" RunIn="Sequence">
                <Set><Guidance:Waypoint.latitude/><Units:degree/><Value>36.737845</Value></Set>
                <Set><Guidance:Waypoint.longitude/><Units:degree/><Value>-121.8904227</Value></Set>
            </Guidance:Waypoint>

        </Stack>

    </Stack>

</Stack>
