# 2021-06-10 Automatically generated from original XML.
# Note that Science:WetLabsBB2FL.bin_mean_mass_concentration_of_chlorophyll_in_sea_water is undefined.
aggregate SampleAtDepth {
  """
  Take a water sample at a specified depth.
  """

  arguments {
    TargetDepth = 5 meter
      """
      Depth to sample at. Initialized to 5 m.
      """

    SettleTime = 10 second
      """
      Time to wait after reaching target depth before triggering sample.
      Initialized to 10 minutes.
      """

    MaxWaitNotReachingDepth = 3 hour
      """
      Maximum wait time the vehicle cannot reach the targeted depth.
      Initialized to 3 hours.
      """

    RotateOnly = 0 bool

    UseCANONSampler = Science:CANONSampler.loadAtStartup
      """
      Whether to use CANON Sampler to sample.
      """

    UseESP = Science:ESPComponent.loadAtStartup
      """
      Whether to use ESP to sample.
      """

    ESPCartridgeType = NaN count
      """
      Specifies ESP cartridge type code.
      """

    CANONSamplerTriggerTimeout = 1 minute
      """
      How long to wait for a CANON Sampler sample to start.
      """

    CANONSamplerTimeout = Science:CANONSampler.sampleTimeout
      """
      How long to wait for a CANON Sampler sample to complete.
      """

    BuoyancyNeutral = Control:VerticalControl.buoyancyNeutral
      """
      Buoyancy bladder position during spiral or donut. Defaults to
      buoyancyNeutral setting in the Config/Control.cfg file. Set to NaN cc
      for active buoyancy
      """
  }

  run when ( called )

  aggregate ApproachDepth {
    run in sequence

    syslog "Moving to " + TargetDepth~meter

    behavior Guidance:Pitch {
      run in sequence

      timeout duration=MaxWaitNotReachingDepth {
        syslog important "Timed out trying to reach the targeted depth. Stopping mission."

        behavior Guidance:Execute {
          run in sequence

          set command = "stop"
        }
      }

      set depth = TargetDepth
    }
  }

  aggregate SampleWrapper {
    run in sequence

    behavior Guidance:Pitch {
      run in parallel

      set depth = TargetDepth
    }

    syslog important "At " + Universal:depth~meter + ", settling for " + SettleTime~minute

    behavior Guidance:Wait {
      run in sequence

      set duration = SettleTime
    }

    aggregate SampleCANONSampler {
      run in sequence

      break if ( not ( UseCANONSampler ) )

      assign in parallel Science:CANONSampler.sampleTimeout = CANONSamplerTimeout

      assign in parallel Science:CANONSampler.rotateOnly = RotateOnly

      readDatum id="TriggerCANONSampler" {
        timeout duration=CANONSamplerTriggerTimeout {
          syslog important "Timed out triggering CANONSampler. Stopping mission."

          behavior Guidance:Execute {
            run in sequence

            set command = "stop"
          }
        }

        Science:CANONSampler.sampling
      }

      syslog important "CANONSampler sampling at " + Universal:depth~meter + " in " + Science:CTD_NeilBrown.bin_mean_sea_water_temperature~celsius + " water with " + Science:WetLabsBB2FL.bin_mean_mass_concentration_of_chlorophyll_in_sea_water~microgram_per_liter + " chlorophyll fluorescence."

      readDatum {
        timeout duration=CANONSamplerTimeout {
          syslog important "Timed out sampling with CANONSampler. Stopping mission."

          behavior Guidance:Execute {
            run in sequence

            set command = "stop"
          }
        }

        Science:CANONSampler.sample_number
      }
    }

    aggregate SampleESP {
      run in sequence

      break if ( not ( UseESP ) )

      aggregate SelectESPCartridge {
        run in sequence

        break if ( isNaN ( ESPCartridgeType ) )

        behavior Science:ESPCartridgeSelect {
          run in sequence

          timeout duration=P1M

          set cartridgeType = ESPCartridgeType
        }
      }

      readDatum id="TriggerESP" {
        Science:ESPComponent.sampling
      }

      syslog important "ESP sampling at " + Universal:depth~meter + " in " + Science:CTD_Seabird.bin_mean_sea_water_temperature~celsius + " water with " + Science:WetLabsBB2FL.bin_mean_mass_concentration_of_chlorophyll_in_sea_water~microgram_per_liter + "chlorophyll fluorescence."

      readDatum id="WaitForESP" {
        Science:ESPComponent.sample_number
      }
    }
  }
}
