Skip to content

Engineering/hovering_tank.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
#   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.

mission {
  """
  Sink to depth, then hold neutral. Force PowerOnly and backseat on, read platform communications.
  !!!Tank use only!!!, no envelopes, no science, no GPS, no needcomms.
  """

  arguments {
    Depth = 2 meter
      """
      Sink depth
      """

    SinkTimeout = 10 minute
      """
      Maximum time to reach depth before giving up and holding neutral
      anyway.
      """

    MissionTimeout = 1 hour
      """
      Maximum duration of the mission.
      """
  }

  timeout duration=MissionTimeout

  insert Insert/BackseatDriver.tl
  assign in sequence BackseatDriver:EnableBackseat = true

  insert Insert/PowerOnly.tl
  assign in sequence PowerOnly:SampleAll = true

  # Send data when a connection exists, but never require one.
  aggregate dataRead {
    run while ( true )

    readDatum {
      Universal:platform_communications
    }

    behavior Guidance:Wait {
      run in sequence

      set duration = 5 minute
    }
  }

  behavior Guidance:SetSpeed {
    run in parallel

    set speed = 0 meter_per_second
  }

  aggregate Sink {
    run in sequence

    syslog important "Sinking to " + Depth~meter

    behavior Guidance:Pitch{
      run in sequence

      timeout duration=SinkTimeout {
        syslog important "Timed out sinking. Holding neutral at current depth of "
             + Universal:depth~meter
      }

      set depth = Depth
      set massPosition = Control:VerticalControl.massDefault
    }
  }

  aggregate Hold {
    run in sequence

    syslog important "Reached " + Universal:depth~meter
         + ". Holding neutral buoyancy."

    behavior Guidance:Buoyancy {
      run in parallel

      set position = Control:VerticalControl.buoyancyNeutral
    }

    behavior Guidance:Pitch {
      run in parallel
      set massPosition = Control:VerticalControl.massDefault
    }

    behavior Guidance:Wait {
      run in sequence

      set duration = MissionTimeout
    }
  }
}