Skip to content

Insert/NeedComms.tl

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#  Copyright (c) 2024 MBARI
#  MBARI Proprietary Information. Confidential. All Rights Reserved
#  Unauthorized copying or distribution of this file via any medium is strictly
#  prohibited.
#
#  WARNING - This file contains information whose export is restricted by the
#  Export Administration Act of 1979 (Title 50, U.S.C., App. 2401 et seq.), as
#  amended. Violations of these export laws are subject to severe civil and/or
#  criminal penalties.

aggregate NeedComms {
  arguments {
    DiveInterval = 1 hour
      """
      Elapsed time after most recent surfacing when vehicle will begin to
      ascend to the surface again. The timing is actually based on the
      variable Universal:time_fix instead of the variable
      Universal:platform_communications because the latter is not toggled
      until the message queue is clear. As a result, there are situations
      where the vehicle might dive for the first half of a yo, then return to
      the surface to continue communications, rendering the communications
      timeout useless. When adjusting this parameter, do not use "set", use
      Assign in a mission, or set NeedComms:DiveInterval from the command
      line.
      """

    WaitForPitchUp = 10 minute
      """
      Extra time to wait for the vehicle to pitch up (avoid truncating a yo).
      """

    SurfacePitch = 20 degree
      """
      Pitch to maintain while ascending
      """

    SurfaceDepthRate = NaN meter_per_second
      """
      Depth rate to maintain while ascending. Set to NaN if using pitch
      """

    SurfaceSpeed = 1 meter_per_second
      """
      Standard speed during surfacing. Don't reduce this too much below 1 m/s
      -- the elevators can stall. (At 0.5 m/s, we have observed evidence of
      stall in the past.)
      """

    SurfacingTimeout = 1500 second
      """
      The maximum time allowed for the ascent to surface.
      """

    GPSTimeout = 7 minute
      """
      Maximum amount of time to spend trying to get each GPS fix.
      """

    CommsTimeout = 30 minute
      """
      Maximum amount of time to spend on the surface trying to communicate
      before giving up, getting another GPS fix, and diving again.
      """

    DoingCommsMode = 0 count
      """
      Value to set DiveMode to while doing communications. The mission should set
      this to its DoingComms mode value.
      """

    RestoreMode = 0 count
      """
      Value to restore DiveMode to after communications complete. The mission
      should set this based on its desired next dive mode (e.g., YoYo or SurfaceSink).
      """
  }

  output {
    IsActive = false
      """
      True when NeedComms is actively running (doing communications).
      The mission can use this to conditionally override its DiveMode.
      """

    RequiredDiveMode = 0 count
      """
      The dive mode that should be active. Set to DoingCommsMode when active,
      then set to RestoreMode when completing so the mission's sync aggregate
      can automatically restore DiveMode.
      """
  }

  run when (
    called
    or ( elapsed ( Universal:time_fix ) > ( DiveInterval + WaitForPitchUp ) )
    or (
      elapsed ( Universal:time_fix ) > DiveInterval
      and ( Universal:platform_pitch_angle > 0 degree )
    )
  )

  syslog info "last time_fix was: " + Universal:time_fix~epoch_second

  aggregate setActive {
    run in sequence

    assign in sequence RequiredDiveMode = DoingCommsMode
    assign in sequence IsActive = true
  }

  behavior Guidance:GoToSurface {
    run in progression

    set pitch = SurfacePitch
    set depthRate = SurfaceDepthRate
    set speed = SurfaceSpeed
    set surfaceTimeout = SurfacingTimeout
  }

  readDatum {
    timeout duration=GPSTimeout {
      syslog important "first GPS update timeout"
    }

    Universal:time_fix
  }

  readDatum {
    timeout duration=CommsTimeout {
      syslog important "Comms timed out after " + CommsTimeout~minute + "minutes"
    }

    Universal:platform_communications
  }

  readDatum {
    timeout duration=GPSTimeout {
      syslog important "second GPS update timeout"
    }

    Universal:time_fix
  }

  aggregate setRestoreMode {
    run in sequence

    assign in sequence RequiredDiveMode = RestoreMode
  }

  aggregate setInactive {
    run in sequence

    assign in sequence IsActive = false
  }
}