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

    <Description>
        This runs a 2D Sparton compass calibration with pitch actuation.
    </Description>

    <DefineArg Name="MassDefault"><Control:VerticalControl.massDefault/></DefineArg>

    <DefineArg Name="Depth"><Units:meter /><Value>20.0</Value></DefineArg>

    <DefineArg Name="Speed"><Units:meter_per_second /><Value>1</Value></DefineArg>

    <DefineArg Name="WaitDuration"><Units:second /><Value>20</Value></DefineArg>

    <DefineArg Name="RudderAngle"><Units:degree /><Value>7</Value></DefineArg>

    <DefineArg Name="MagNorthHeading"><Units:degree /><Value>15</Value></DefineArg>

    <DefineArg Name="MinAltitude"><Units:meter/><Value>7</Value></DefineArg>

    <DefineArg Name="MaxDepth"><Units:meter/><Value>35</Value></DefineArg>

    <DefineArg Name="MinWaterDepth"><Units:meter/><Value>15</Value></DefineArg>

    <DefineArg Name="MinOffshore"><Units:meter/><Value>2000</Value></DefineArg>

    <DefineArg Name="NeedCommsTime"><Units:minute/><Value>30</Value></DefineArg>

    <DefineArg Name="ManualLoops"><Units:count/><Value>1</Value></DefineArg>

    <DefineArg Name="AutoLoops"><Units:count/><Value>2</Value></DefineArg>

    <DefineArg Name="CheckLoops"><Units:count/><Value>2</Value></DefineArg>

    <DefineArg Name="BuoyancyNeutral"><Control:VerticalControl.buoyancyNeutral/></DefineArg>

    <DefineArg Name="TimeoutDuration"><Units:minute/><Value>70</Value></DefineArg>

    <DefineArg Name="YoYoMinDepth"><Units:meter/><Value>15.0</Value></DefineArg>

    <DefineArg Name="YoYoMaxDepth"><Units:meter/><Value>30.0</Value></DefineArg>

    <DefineArg Name="YoYoUpPitch"><Units:degree/><Value>30.0</Value></DefineArg>

    <DefineArg Name="YoYoDownPitch"><Units:degree/><Value>-30.0</Value></DefineArg>

    <Timeout Duration="TimeoutDuration"/>

    <Guidance:AltitudeEnvelope>
        <Parallel/>
        <Setting><Guidance:AltitudeEnvelope.minAltitude /><Arg Name="MinAltitude"/></Setting>
    </Guidance:AltitudeEnvelope>

    <Guidance:DepthEnvelope>
        <Parallel/>
        <Setting><Guidance:DepthEnvelope.maxDepth /><Arg Name="MaxDepth"/></Setting>
    </Guidance:DepthEnvelope>

    <Guidance:WaterDepthEnvelope>
        <Parallel/>
        <Setting><Guidance:WaterDepthEnvelope.minWaterDepth/><Arg Name="MinWaterDepth"/></Setting>
    </Guidance:WaterDepthEnvelope>

    <Guidance:OffshoreEnvelope>
        <Parallel/>
        <Setting><Guidance:OffshoreEnvelope.minOffshore/><Arg Name="MinOffshore"/></Setting>
    </Guidance:OffshoreEnvelope>

    <ReadData Strategy="AllDevices">
        <Universal:platform_orientation/>
    </ReadData>

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

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

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

    <Aggregate Id="MassOff">

        <Sequence/>

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

        <Aggregate Id="Initialization">

            <Sequence/>

            <Guidance:Pitch>
                <Progression/>
                <Setting><Guidance:Pitch.depth /><Arg Name="Depth" /></Setting>
            </Guidance:Pitch>

            <Guidance:Point>
                <Progression/>
                <Setting><Guidance:Point.heading /><Arg Name="MagNorthHeading" /></Setting>
            </Guidance:Point>

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

        </Aggregate>

        <Aggregate Id="PreCircles" Repeat = "CheckLoops">

            <Sequence/>

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

            <Guidance:Pitch>
                <Parallel/>
                <Setting><Guidance:Pitch.depth /><Arg Name="Depth" /></Setting>
            </Guidance:Pitch>

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

            <Guidance:Point>
                <Sequence/>
                <Setting><Guidance:Point.heading /><Arg Name="MagNorthHeading" /></Setting>
            </Guidance:Point>

        </Aggregate>

        <Aggregate Id="Calibration">

            <Sequence/>

            <Aggregate Id="Manual_Loop">

                <Sequence Repeat="ManualLoops"/>

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

                <Guidance:Pitch>
                    <Parallel/>
                    <Setting><Guidance:Pitch.depth /><Arg Name="Depth" /></Setting>
                </Guidance:Pitch>

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

                <Guidance:Point>
                    <Sequence/>
                    <Setting><Guidance:Point.heading /><Arg Name="MagNorthHeading" /></Setting>
                </Guidance:Point>

            </Aggregate>

            <Guidance:Wait>
                <Sequence/>
                <Preemptive>
                    <True/>
                </Preemptive>
                <Setting><Guidance:Wait.duration /><Units:second/><Value>0</Value></Setting>
            </Guidance:Wait>

            <Aggregate Id="Auto_Loop">

                <Sequence Repeat="AutoLoops"/>

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

                <Guidance:Pitch Id="PitchDown">
                    <When>
                        <Universal:platform_pitch_angle/>
                        <Ge><Arg Name="YoYoUpPitch"/></Ge>
                    </When>
                    <Break>
                        <Universal:platform_pitch_angle/>
                        <Le><Arg Name="YoYoDownPitch"/></Le>
                    </Break>
                    <Setting><Guidance:Pitch.pitch/><Arg Name="YoYoDownPitch"/></Setting>
                </Guidance:Pitch>

                <Guidance:Pitch Id="PitchUp">
                    <When>
                        <Universal:platform_pitch_angle/>
                        <Le><Arg Name="YoYoDownPitch"/></Le>
                    </When>
                    <Break>
                        <Universal:platform_pitch_angle/>
                        <Ge><Arg Name="YoYoUpPitch"/></Ge>
                    </Break>
                    <Setting><Guidance:Pitch.pitch/><Arg Name="YoYoUpPitch"/></Setting>
                </Guidance:Pitch>

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

                <Guidance:Point>
                    <Sequence/>
                    <Setting><Guidance:Point.heading /><Arg Name="MagNorthHeading" /></Setting>
                </Guidance:Point>

            </Aggregate>

            <Sensor:CalibrateSparton>
                <Parallel/>
            </Sensor:CalibrateSparton>

        </Aggregate>

        <Aggregate Id="PostCircles" Repeat= "CheckLoops">

            <Sequence/>

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

            <Guidance:Pitch Id="PitchDown">
                <When>
                    <Universal:platform_pitch_angle/>
                    <Ge><Arg Name="YoYoUpPitch"/></Ge>
                </When>
                <Break>
                    <Universal:platform_pitch_angle/>
                    <Le><Arg Name="YoYoDownPitch"/></Le>
                </Break>
                <Setting><Guidance:Pitch.pitch/><Arg Name="YoYoDownPitch"/></Setting>
            </Guidance:Pitch>

            <Guidance:Pitch Id="PitchUp">
                <When>
                    <Universal:platform_pitch_angle/>
                    <Le><Arg Name="YoYoDownPitch"/></Le>
                </When>
                <Break>
                    <Universal:platform_pitch_angle/>
                    <Ge><Arg Name="YoYoUpPitch"/></Ge>
                </Break>
                <Setting><Guidance:Pitch.pitch/><Arg Name="YoYoUpPitch"/></Setting>
            </Guidance:Pitch>

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

            <Guidance:Point>
                <Sequence/>
                <Setting><Guidance:Point.heading /><Arg Name="MagNorthHeading" /></Setting>
            </Guidance:Point>

        </Aggregate>

    </Aggregate>

    <Aggregate Id="PostCirclesMass" Repeat= "CheckLoops">

        <Sequence/>

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

        <Guidance:Pitch Id="PitchDown">
            <When>
                <Universal:platform_pitch_angle/>
                <Ge><Arg Name="YoYoUpPitch"/></Ge>
            </When>
            <Break>
                <Universal:platform_pitch_angle/>
                <Le><Arg Name="YoYoDownPitch"/></Le>
            </Break>
            <Setting><Guidance:Pitch.pitch/><Arg Name="YoYoDownPitch"/></Setting>
        </Guidance:Pitch>

        <Guidance:Pitch Id="PitchUp">
            <When>
                <Universal:platform_pitch_angle/>
                <Le><Arg Name="YoYoDownPitch"/></Le>
            </When>
            <Break>
                <Universal:platform_pitch_angle/>
                <Ge><Arg Name="YoYoUpPitch"/></Ge>
            </Break>
            <Setting><Guidance:Pitch.pitch/><Arg Name="YoYoUpPitch"/></Setting>
        </Guidance:Pitch>

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

        <Guidance:Point>
            <Sequence/>
            <Setting><Guidance:Point.heading /><Arg Name="MagNorthHeading" /></Setting>
        </Guidance:Point>

    </Aggregate>

</Mission>
