#if 0
# Copyright (C) 1994-1998, Massachusetts Institute of Technology.
# Modifications Copyright (C) 1999-2006 Webb Research Corporation
# Proprietary to Sea Grant AUV Laboratory.  All rights reserved.
# -- deleted a bunch of history -- 12-May-99 tc@DinkumSoftware.com
# -- deleted a bunch of history -- 27-Apr-99 thru 17-jul-99
# -- deleted a bunch of history -- 26-jul-99 thru 27-mar-00
# -- deleted a bunch of history -- 05-Apr-00 thru 07-may-00
# -- deleted a bunch of history -- 08-may-00 thru 31-jul-00
# -- deleted a bunch of history -- 01-Aug-00 thru 04-Oct-00
# -- deleted a bunch of history -- 19-Oct-00 thru 29-Oct-01
# -- deleted a bunch of history -- 09-Nov-01 thru 02-Jan-02
# -- deleted a bunch of history -- 02-Jan-02 thru 29-jul-02
# -- deleted a bunch of history -- 02-Aug-02 thru 20-Dec-02
# -- deleted a bunch of history -- 18-jan-03 thru 21-Dec-03
# -- deleted a bunch of history -- 31-jan-04 thru 08-Dec-04
# 05-Jan-05 fnj@DinkumSoftware.com    SN#3193 Changed reqd_spare_heap from 150000 to 75000.
#                                             We were getting heap aborts at start of
#                                             mission or during the mission.
# 10-Jan-05 pfurey@DinkumSoftware.com SN#3194 Added c_oil_volume_time(sec),
#                                             c_oil_volume_recall(msec),
#                                             c_oil_volume_measuring_delay(sec),
#                                             c_oil_volume(cc),
#                                             m_oil_volume(cc),
#                                             dc_c_de_updown(enum),
#                                             f_oil_volume_safety_max(cc),
#                                             f_oil_volume_deadz_width(cc),
#                                             f_oil_volume_cal_m(cc/volt),
#                                             f_oil_volume_cal_b(cc),
#                                             f_oil_volume_db_frac_dz(nodim),
#                                             f_neutral_oil_volume(cc),
#                                             f_oil_pot_voltage_min(volts),
#                                             f_oil_pot_voltage_max(volts),
#                                             f_oil_volume_in_system(cc),
#                                             x_oil_volume_max(cc),
#                                             x_oil_volume_deadband(cc),
#                                             m_oil_pot_voltage(volts),
#                                             cc_de_eng_mode(enum),
#                                             cc_final_de_eng_mode(enum),
#                                             dc_c_oil_volume(cc),
#                                             c_de_updown(enum),
#                                             m_de_updown(enum),
#                                             c_de_pump(enum),
#                                             m_de_pump(enum),
#                                             m_secs_since_de_substate_change(secs),
#                                             c_alt_recall(msec),
#                                             c_att_recall(msec),
#                                             u_battery_recall(msec),
#                                             c_profile_recall(msec),
#                                             c_pressure_recall(msec),
#                                             c_leakdetect_recall(msec),
#                                             c_eng_pressure_recall(msec),
#                                             u_vacuum_recall(msec),
#                                             c_de_recall(msec),
#                                             m_de_recall(msec),
#                                             c_oil_volume_deadband(cc),
#                                             m_is_de_engine_moving(bool),
#                                             m_depth_rejected(bool),
#                                             Added new comments for c_air_pump.
#                                             Added oil_volume_sample_time(sec) argument
#                                             to abend behavior. Added nop_de_eng(bool)
#                                             to nop_cmds behavior.
# 01-Feb-05 pfurey@DinkumSoftware.com SN#3195 Added u_depth_rate_filter_factor
# 07-Feb-05 tc@DinkumSoftware.com     SN#3196 Fixed typo in behavior sample
# 18-Feb-05 tc@DinkumSoftware.com     SN#3197 behavior surface, new b_arg: end_action:
#                                             5-wait for ^C quit on timeout
# 28-Feb-05 pfurey@DinkumSoftware.com SN#3198 Added c_viper_on(sec),
#                                             c_viper_turn_on_timeout(sec),
#                                             c_viper_collect_timeout(sec),
#                                             c_viper_reset_timeout(sec),
#                                             c_viper_start_sampling_timeout(sec),
#                                             c_viper_detection_done_timeout(sec),
#                                             c_viper_turn_off_timeout(sec),
#                                             c_viper_gain(nodim),
#                                             c_viper_max_sample_starts(nodim),
#                                             c_viper_max_errors(nodim),
#                                             sci_viper_power_on(bool),
#                                             sci_viper_error(nodim),
#                                             sci_viper_target(enum),
#                                             sci_viper_collect_time(sec),
#                                             sci_viper_is_installed(bool),
#                                             sci_viper_finished(bool), and
#                                             sci_viper_collecting(bool).
#                                             Added bviper behavior and args.
#                                             Support for start_when arg
#                                             BAW_WHEN_UTC_TIME.
#                                             Added comatose arg
#                                             start_sci_viper_collecting
# 15-Mar-05 pfurey@DinkumSoftware.com SN#3199 Added c_whfctd_on(sec),
#                                             c_whfctd_num_fields_to_send(nodim),
#                                             sci_whfctd_is_installed(bool),
#                                             sci_whfctd_ref_hi(nodim),
#                                             sci_whfctd_ref_mid(nodim),
#                                             sci_whfctd_ref_lo(nodim),
#                                             sci_whfctd_raw_temp(nodim),
#                                             sci_whfctd_raw_con1(nodim),
#                                             sci_whfctd_raw_con2(nodim),
#                                             sci_whfctd_raw_pres(nodim), and
#                                             sci_whfctd_elap_time(nodim).
#                                             Added f_thermal_valve_rate(msec).
# 19-Mar-05 tc@DinkumSoftware.com Merged 3 at sea changes into cvs: SN#3205
#     07-Mar-05 tc@DinkumSoftware.com SN#3199 at sea on the CFAV quest..
#                                               behavior:bviper, new  b_args:
#                                               min_sample_depth(m), max_sample_depth(m)
#     08-Mar-05 tc@DinkumSoftware.com SN#3200 at sea on the CFAV quest.. new sensors:
#                                               m_at_risk_depth(m)
#                                               u_thermal_valve_time_in_down_pos(s)
#     09-Mar-05 tc@DinkumSoftware.com SN#3201 at sea, change default for
#                                               behavior abend: b-arg: eng_pressure_mul
#                                               0.90 to 1.10
# 24-Mar-05 pfurey@DinkumSoftware.com SN#3202  Made c_whfctd_on a sample b_arg
# 11-Apr-05 pfurey@DinkumSoftware.com SN#3203 Added x_argos_type(enum) and
#                                             f_argos_format(enum).
# 13-Apr-05 fnj@DinkumSoftware.com Fixed spelling of buoyancy in comments.
#                                  Did not change SN.
# 30-Mar-05 tc@DinkumSoftware.com     SN#3220  thermal simulator
#                                              Changed computed simulated sensor names for consistency
#                                               sx_water_depth ==> xs_water_depth

# 31-Mar-05 tc@DinkumSoftware.com     SN#3222  s_vehicle_temp ==> sx_vehicle_temp
#                                              Added s_vehicle_temp_tc, xs_wax_temp
#                                                s_wax_freeze_temp
# 08-Apr-05 tc@DinkumSoftware.com     SN#3223  Added U_PRINT_ENGINE_STATUS
# 09-Apr-05 tc@DinkumSoftware.com     SN#3224  F_THERMAL_VALVE_RATE(msec) ==>
#                                              F_THERMAL_VALVE_TIME_OVER_SLOT(msec)
# 18-Apr-05 tc@DinkumSoftware.com     SN#3225  massive sensor renaming
# 18-Apr-05 tc@DinkumSoftware.com     SN#3226  f_thremal_pres_full_scale ==> f_thermal_pres_full_scale(bar)
# 18-Apr-05 tc@DinkumSoftware.com     SN#3227  Missed 5 sensors in conversion
# 19-Apr-05 tc@DinkumSoftware.com     SN#3228  screwed up another one in conversion
#                                                 f_thermal_acc_pres_full_min/max ==> f_thermal_acc_pres_min/max
# 19-Apr-05 tc@DinkumSoftware.com     SN#3240  massive merge of tc-development-11 to head
# 23-Apr-05 tc@DinkumSoftware.com     SN#3250  at sea on Walton-Smith
#                                                u_abort_c_battpos(in) -100. max aft,
#                                                   rocket to surface, it will clip
#                                                u_pinger_max_depth(m) 1000
# 23-Apr-05 tc@DinkumSoftware.com     SN#3251  at sea on Walton-Smith
#                                               U_ABORT_MAX_BURN_TIME 3600 ==> 14400 (4hr)
# 24-Apr-05 tc@DinkumSoftware.com     SN#3252  at sea on Walton-Smith
#                                               added u_use_ctd_depth_for_flying
# 11-May-05 tc@DinkumSoftware.com     SN#3253  all sx_NNN ==> xs_NNN
#                                              I'll get it right one of these days
# 12-May-05 pfurey@DinkumSoftware.com SN#3254 added X_ARE_RUNNING_ONETIME_SEQUENCE
#                                             and mission_ender behavior
# 13-May-05 tc@DinkumSoftware.com     SN#3255  added u_stale_gps_msg_period
#                                              Deleted a whole bunch of history (all of 2004)
# 16-May-05 tc@DinkumSoftware.com     SN#3256 Added x_pressure_manual_cal_now(bool)
# note: some serial numbers duplicated in following list as code changes
#       were made on development branches.  branches merged at SN#3270
# 31-May-05 pfurey@DinkumSoftware.com SN#3257 Added u_ping_n_enabled
# 02-Jun-05 pfurey@DinkumSoftware.com SN#3258 Added: sci_sam_c_mix(nodim),
#                                             sci_sam_vis(nodim),
#                                             sci_sam_filter_age(sec),
#                                             u_sam_exp1coeff(nodim),
#                                             u_sam_exp2coeff(nodim),
#                                             u_sam_eff_pathlength(nodim),
#                                             u_sam_a(nodim),
#                                             u_sam_transition_val(nodim),
#                                             and u_sam_offset(nodim).
#                                             Removed: sci_sam_c_eng_units(nodim),
#                                             sci_sam_c_eng_units_delay(sec),
#                                             u_sam_s_factor(nodim),
#                                             and u_sam_s_offset(nodim).
# 7-Jun-05 tc@DinkumSoftware.com    Changes from jhillier@mote.org
#                                   Changed Motebb variables:
# clock rolls backward
# 26-May-05 tc@DinkumSoftware.com     SN#3257 added sensor: s_corrupted_pressure_spike(bool)
# 28-May-05 tc@DinkumSoftware.com     SN#3258 changed units and meaning of u_pressure_autocal_performed
#                                              Switched xs_pressure_drift from bar to volts to
#                                              accurately simulate
# 29-May-05 tc@DinkumSoftware.com     SN#3259 Added s_ocean_pressure_min(volts)
# 09-Jun-05 tc@DinkumSoftware.com     SN#3260 u_depth_rate_filter_factor 3==>4
# 10-Jun-05 tc@DinkumSoftware.com     SN#3261 Added x_SURFACE_EST_xxx sensors (a bunch)
# 10-Jun-05 tc@DinkumSoftware.com     SN#3263 Added u_depth_rate_filter_sub_sur_dep(m)
#                                             changed meaning of M_DEPTH_REJECTED
#                                             Added X_MEASURED_DEPTH and M_CERTAINLY_AT_SURFACE
# 11-Jun-05 tc@DinkumSoftware.com     SN#3265 u_sci_cmd_max_ack_wait_time(s) 15 => 60
#                                             added m_device_drivers_called_abnormally
#                                                   x_sent_data_files x_num_bang_cmds_done
# 14-Jun-05 tc@DinkumSoftware.com     SN#3267 added u_allowable_cycle_overrun(msec)
#                                             added behavior abend:
#                                               b_arg: max_allowable_busy_cpu_cycles(cycles)
# 15-Jun-05 tc@DinkumSoftware.com     SN#3270 merged tc-development-12, end of duplicate SN#s
# 15-Jun-05 tc@DinkumSoftware.com     SN#3271 u_allowable_cycle_overrun(msec) 750 ==> 1000
#                                             b_arg: max_allowable_busy_cpu_cycles(cycles) 5==>10
# 17-Jun-05 pfurey@DinkumSoftware.com SN#3272 Added u_max_secs_in_de_substate
# 01-Jul-05 tc@DinkumSoftware.com             documentation change only: x_lmc_xy_source
# 02-Aug-05 pfurey@DinkumSoftware.com SN#3273 Added surface behavior argument:
#                                             sensor_input_wait_time.
# 04-Aug-05 pfurey@DinkumSoftware.com SN#3274 Changed the default value of
#                                             surface: b_arg report_all(bool)
#                                             from 1 (all sensors) to 0 (just gps).
# 11-Aug-05 pfurey@DinkumSoftware.com SN#3275 Changed the default values of
#                                             dive_to b_arg:
#                                             stop_when_hover_for(sec) 30->180
#                                             stop_when_stalled_for(sec) 60->240
#                                             climb_to b_arg:
#                                             stop_when_stalled_for(sec) 60->240
#                                             yo b_arg:
#                                             c/d_stop_when_hover_for(sec) 30->180
#                                             c/d_stop_when_stalled_for(sec) 60->240
# 17-Aug-05 pfurey@DinkumSoftware.com SN# 3276 Changed the default u_cycle_time
#                                              from 2 to 4 seconds.
# 12-Sep-05 pfurey@DinkumSoftware.com SN# 3277 Added sensors for fl3slo and
#                                              bb3slo proglets.
# 03-Oct-05 pfurey@DinkumSoftware.com SN# 3278 Added u_XXX_is_calibrated(bool)
#                                              sensors for the following
#                                              proglets: bb2c, bb2lss, bb3slo,
#                                              fl3slo, and sam.
# 21-Oct-05 pfurey@DinkumSoftware.com SN# 3279 Added sensors for deep-electric
#                                              rework:
#                                              f_de_max_secs_for_updown_to_finish(secs),
#                                              x_de_target_oil_vol(cc),
#                                              f_de_target_oil_drift_m(cc/bar),
#                                              f_de_target_oil_drift_b(cc), and
#                                              u_thermal_valve_check_time(sec).
#                                              Renamed c_de_oil_vol_deadband(cc),
#                                              to c_neutral_oil_vol_deadband(cc).
#                                              Changed default values of
#                                              f_de_oil_vol_deadz_width(cc)
#                                              from 60.0 to 30.0 and
#                                              f_de_oil_vol_db_frac_dz(cc)
#                                              from 0.25 to 0.5.
# 24-Oct-05 pfurey@DinkumSoftware.com SN# 3280 Changed sign of
#                                              f_de_target_oil_drift_m(cc/bar)
#                                              and f_de_target_oil_drift_b(cc).
# 28-Oct-05 pfurey@DinkumSoftware.com SN# 3281 Added X_DE_OIL_FLUX(cc/sec)
# 03-Nov-05 pfurey@DinkumSoftware.com SN# 3282 Changed default value of
#                                              X_DE_OIL_VOL_MAX from 240
#                                              to 270 cc. Added
#                                              s_de_oil_pot_volt_flux(volts/sec).
# 16-Nov-05 pfurey@DinkumSoftware.com SN# 3283 Removed f_de_oil_vol_cal_m/b.
#                                              Changed default value of
#                                              c_de_oil_vol from 240 to 270.
#                                              Changed default value of
#                                              f_de_oil_vol_in_system(cc)
#                                              from 700 to 714. And made
#                                              f_de_oil_vol_pot_volatage_max/min
#                                              illegal values to force them
#                                              to be put in autoexec.mi
# 16-Dec-05 pfurey@DinkumSoftware.com SN# 3284 Added sensors for bam proglet.
#
#  7-Dec-05 tc@DinkumSoftware.com SN#3284 typo in comment:
#                                           M_SCIENCE_PRESENT_TIME ==> sci_m_present_time
#                                         cleaned up doc on M_SCIENCE_SENT_SOME_DATA
# 20-Dec-05 pfurey@DinkumSoftware.com SN# 3285 Added c_bam_target_id(enum) and
#                                              removed sci_bam_error(nodim).
# 05-Jan-06 pfurey@DinkumSoftware.com SN# 3286 Added calibration constants and
#                                              and engineering units to bbfl2s.
# 10-Feb-06 pfurey@DinkumSoftware.com SN# 3287 Added sensors for radiometer
#                                              proglets ocr504R and ocr504I.
#                                              Reduced reqd_spare_heap(bytes)
#                                              from 75K to 65K.
# 14-Feb-06 pfurey@DinkumSoftware.com SN# 3288 Updated some doco regarding
#                                              de_pump.c to reflect hardware
#                                              changes
# 20-Feb-06 pfurey@DinkumSoftware.com SN# 3289 Changed the value of
#                                              f_de_oil_vol_in_system(cc) from
#                                              714 to 650 in accordance with
#                                              hardware changes. Updated doco
#                                              for de_pump.
# 13-Mar-06 pfurey@DinkumSoftware.com SN# 3290 Added doco for attitude_tcm3
# 17-Mar-06 tc@DinkumSoftware.com     SN# 3291 Added C_IRIDIUM_POWER_ON_DELAY(sec)
# 05-Apr-06 fnj@DinkumSoftware.com    SN# 3292 Changed reqd_spare_heap from 65000 to 45000.
# 08-Apr-06 pfurey@DinkumSoftware.com SN# 3293 Added sensors for tcm3.c
# 10-Apr-06 fnj@DinkumSoftware.com    Doco change only - add comment to reqd_spare_heap
#                                     saying to track that number in lastgasp.mi.
# 20-Apr-06 tc@DinkumSoftware.com     SN# 3294 Added SCI_M_FREE_HEAP(bytes)
# 24-Apr-06 pfurey@DinkumSoftware.com SN# 3295 Added sensors for badd proglet.
# 25-Apr-06 fnj@DinkumSoftware.com    SN# 3296 Fixed error proglet whfctd sensor c_whfctd
#                                     was uninitialized.
#  2-May-06 tc@DinkumSoftware.com     SN#3297  c_whfctd_on(sec) default 0==> 10
# 03-May-06 pfurey@DinkumSoftware.com SN# 3298 Add badd_b behavior
# 08-May-06 pfurey@DinkumSoftware.com SN# 3299 Removed c_badd_on from sensors_in
#                                              and changed some default input
#                                              vals for badd proglet.
# 25-May-06 tc@DinkumSoftware.com     SN#3300 Lower heap threshold again to 30K
# 26-May-06 pfurey@DinkumSoftware.com SN#3301 Added timer sensors for attitude_tcm3
# 10-Jun-06 tc@DinkumSoftware.com     SN#3303 Added C_IRIDIUM_ATOK_TIMEOUT(secs)
#                                                   C_IRIDIUM_NO_CHAR_TIMEOUT(min)
# 06-Jul-06 moose@DinkumSoftware.com  SN#3304 Removed b_arg control_c(bool) from abend behavior.
# 10-Jul-06 pfurey@DinkumSoftware.com SN#3305 Changed default value of
#                                             max_allowable_busy_cpu_cycles(cycles) from 10 to -1.
# 18-Jul-06 moose@DinkumSoftware.com  SN#3306 Added sensors M_1MEG_PERSISTOR and U_HEAP_REQUIRED_FOR_1MEG_PERSISTOR.
# 31-Jul-06 moose@DinkumSoftware.com  SN#3307 Added sensor S_CORRUPTED_OIL_VOLUME.

# When you edit this file, increment MASTERDATA_SN by one.
# This serial number is used to detect whether edit_struct.exe was run
# before the software was compiled.

#endif


#define MASTERDATA_SN    3307


#if 0

# -----------------------------------------------------------------------
# prefix meanings:
# m_ measured
# c_ commanded
# u_ user defined before run time
# f_ Set in factory, do not change unless you know what you are doing
# x_ Do not ever set this.  Typically computed at run-time.
# s_ simulated state variables

# -----------------------------------------------------------------------
# Sensor values being passed to science over the clothesline have a
# decimal precision limit of 6 places. As a workaround for sensor values
# with very small values (<< 0, high decimal precision), say
# u_bb2c_beta532_factor (0.000007494) we developed the following concepts:
#   "Mnodim" which signifies that the true value of the sensor has been
# multiplied by 1.e6 and therefor must be divided by 1.e6 on the science side.
#   "Tnodim" which signifies that the true value of the sensor has been
# multiplied by 1.e13 and therefor must be divided by 1.e13 on the science side.


# -----------------------------------------------------------------------
# Some general glider specific characteristics
sensor: f_max_working_depth(m)   30.0  # How deep glider can work
                                       # NOTE: set this to 194m if you want a regular
                                       # electric glider to bottom out at 200m

sensor: f_nominal_dive_rate(m/s) 0.19       # clips 0-1
sensor: f_nominal_pitch(rad)     0.4363     # 25 degs, clips 0-90 degs


# SENSORS

# --- Configuration, Read Only at reset time
sensor: f_enable_picozoom(bool) 1.0  #  0=> never enable picozomm
                                     #  1=> enable it if M_FREE_HEAP is > F_AUTO_PICOZOOM_HEAP_REQD
                                     #  2=> always enabled Picozoom
sensor: f_auto_picozoom_heap_reqd(bytes) 100000 # heap required to autoenable picozoom


# --- Set at init time
sensor: x_hardware_ver(nodim) -3.0 # hardware rev
                                   #  128  RevE
                                   #   -2  initial value, i.e. before set
                                   #   -1  error reading jumpers
                                   #    0  early board without jumpers --or--
                                   #       Board has jumpers, none set

# --- Set/used in gliderdos
sensor: x_software_ver(nodim) 0.0 # current software version
sensor: x_in_gliderdos(bool)  0.0 # true->in glider as opposed to a mission
sensor: x_are_in_lab(bool)    0.0 # true->started with -lab command line switch
sensor: x_are_running_onetime_sequence(bool) 0.0 # true -> onetime.seq active

sensor: u_max_time_in_gliderdos(sec) 600.0 # in, run "sequence" after this much time
                                           # in gliderdos without receiving a keystroke
                                           # disabled in -lab mode
                                           # disabled if <= 0

                       # these are used
sensor: u_max_sequence_repetitions(nodim)       100   # in, upper limit on # repetitions allowed
                                                      #     in a sequence specifier listed in a
                                                      #     sequence command (e.g., sequence foo.mi(100)
sensor: u_max_total_sequenced_missions(nodim)   100   # in, upper limit on total missions sequenced
sensor: u_max_allowed_lastgasp_aborts(nodim)      1   # in, how many lastgasp.mi aborts to allow
                                                      #     before returning to GliderDos
sensor: u_sequence_max_time_in_gliderdos(s)     900   # in, how long to stay in Gliderdos after
                                                      #     a lastgasp.mi abort

sensor: u_stale_gps_msg_time(s)                 600
sensor: u_stale_gps_msg_period(s)               300   # in, In gliderdos msg delivered every u_stale_gps_msg_period
                                                      # seconds if its been u_stale_gps_msg_time since
                                                      # the last gps fix.
                                                      #     -1 (on either sensor) disables (no msg every delivered)
                                                      # intended to alert shore side control to do a
                                                      # "callback" when operating over iridium.
                                                      # the msg: "NOTE:GPS fix is getting stale: X secs old"

sensor: m_1meg_persistor(bool)                    0   # out, 1 if M_FREE_HEAP > U_HEAP_REQUIRED_FOR_1MEG_PERSISTOR

sensor: u_heap_required_for_1meg_persistor(bytes) 500000 # in, heap required for 1 MB persistor

# --- Set in outer control loop,
# main_per.c
sensor: u_cycle_time(sec) 4.0    # in, num of secs/cycle
sensor: u_max_sensor_logs_per_cycle(nodim) 4  # in, max high density sensor records
                                              # per dbd/sbd logging cycle, valid
                                              # range is 2 - 15
sensor: m_present_time(sec) 0    # out, secs since 1970 @ start of cycle
sensor: m_present_secs_into_mission(sec) 0 # out, secs since mission started
sensor: m_cycle_number(nodim) 0            # out, cycles since mission started

sensor: x_cycle_overrun_in_ms(msec) 0 # out, set every cycle
                                      # the number of milliseconds that the
                                      # cycle actually was compared to
                                      # U_CYCLE_TIME
sensor: u_allowable_cycle_overrun(msec) 1000   # how large x_cycle_overrun_in_ms can
                                              # before saying are_device_drivers_called_normally()
                                              # For reasons that aren't clear to me, we are overrunning
                                              # every cycle by 250ms.. someone should figure out why
                                              # 14-Jun-05 tc@DinkumSoftware.com


    # These measure time in ms of various states
sensor: x_lc_time(msec)   0  # layered control
sensor: x_dc_time(msec)   0  # dynamic control
sensor: x_ds_time(msec)   0  # device scheduler
sensor: x_sp_time(msec)   0  # sensor processing
sensor: x_log_time(msec)  0  # log_data()
sensor: x_dead_time(msec) 0  # idle at end of loop


# --- layered_control.c

sensor: x_mission_num(nodim)          0 # out, YYDDxx the current or last mission number
                                        # Old style, before switch to DBD scheme
                                        # Kept for argos

sensor: x_mission_status(enum)  -3 # out, current (or last) mission status
sensor: x_old_mission_status_1(enum)   -3 # out, old,    status from prior missions
sensor: x_old_mission_status_2(enum)   -3 # out, older,  status from prior missions
sensor: x_old_mission_status_3(enum)   -3 # out, oldest, status from prior missions

                                   # New DBD style mission numbering
sensor: x_dbd_mission_number(nodim)   0.0  # out, mmmm of mmmmssss.dbd
sensor: x_dbd_segment_number(nodim)   0.0  #      ssss of mmmmssss.dbd

             # All these sensors "reflect" the values in struct command
             # See commands.h definition of XXX_mode_t for "mode" values
             # The cc_XXX variables are updated many times during a cycle
             #     during the behavior resolution process in layered_control
             # The cc_final_XXX variables are updated once per cycle after
             #     all the behaviors are resolved.
sensor: cc_heading_mode(enum) -1 # out, cmd->heading_mode
sensor: cc_heading_value(X)    0 #      argument for heading_mode
sensor: cc_pitch_mode(enum)   -1 # out, cmd->pitch_mode
sensor: cc_pitch_value(X)      0 #      argument for pitch_mode
sensor: cc_bpump_mode(enum)   -1 # out, cmd->bump_mode
sensor: cc_bpump_value(X)      0 #      argument for bpump_mode
sensor: cc_de_eng_mode(enum) -1 # out, cmd->de_eng_mode
sensor: cc_threng_mode(enum) -1 # out, cmd->threng_mode
sensor: cc_inflection_mode(enum) -1 # out, cmd->inflection_mode
sensor: cc_depth_state_mode(enum) -1    # out, cmd->depth_state_mode
sensor: cc_mission_status_mode(enum) -3 # out, cmd->mission_status_mode
sensor: cc_is_comatose(bool)          0 # out, cmd->is_comatose

sensor: cc_final_heading_mode(enum) -1 # out, cmd->heading_mode
sensor: cc_final_heading_value(X)    0 #      argument for heading_mode
sensor: cc_final_pitch_mode(enum)   -1 # out, cmd->pitch_mode
sensor: cc_final_pitch_value(X)      0 #      argument for pitch_mode
sensor: cc_final_bpump_mode(enum)   -1 # out, cmd->bump_mode
sensor: cc_final_bpump_value(X)      0 #      argument for bpump_mode
sensor: cc_final_de_eng_mode(enum) -1 # out, cmd->de_eng_mode
sensor: cc_final_threng_mode(enum) -1 # out, cmd->threng_mode
sensor: cc_final_inflection_mode(enum) -1 # out, cmd->inflection_mode
sensor: cc_final_depth_state_mode(enum) -1    # out, cmd->depth_state_mode
sensor: cc_final_mission_status_mode(enum) -3 # out, cmd->mission_status_mode
sensor: cc_final_is_comatose(bool)          0 # out, cmd->is_comatose

# behavior specific

    # behavior specific, have not sorted it all out
sensor: c_depth(m) -1 # ascend.c, descend.c, glider_yo.c layer_control.c

    # surface
sensor: u_max_num_files_to_xmit_at_once(nodim) 30    # in, max files batched in sending
                                                     #     files from glider to shore
sensor: m_free_heap(bytes)                     -1    # out, the amount of free heap space
sensor: m_spare_heap(bytes)                    -1    # out, projected amt of heap if every
                                                     #      big consumer is activated.
sensor: x_in_surface_dialog(nodim)            0    # out, non-zero means surface behavior
                                                     #      is in surface dialog and others
                                                     #      specifically behavior abend should
                                                     #      not try to read any chars.  This is
                                                     #      a bitfield, with bit assigned to each
                                                     #      surface behavior by their behavior number
                                                     #         bit =  1 << (behavior_num-1)

sensor: x_num_bang_cmds_done(nodim)           0      # incremented every time a !cmd execute in
                                                     # a surface dialogue, see secs_after_bang_cmd()

sensor: x_sent_data_files(nodim)              0      # set to the number of files sent via zmodem
                                                     # set to 0 on failure.
                                                     # see secs_after_data_transmission()



    # hydro_smp
sensor: dhs_valid(bool)          0   #non-zero means remaining sensors are valid
sensor: dhs_start_time(abstime)  0   #secs since 1970 GMT
sensor: dhs_duration(s)          0
sensor: dhs_gain(dB)             0
sensor: dhs_channel(nodim)       0
sensor: dhs_xmit_files(nodim)    0
sensor: dhs_silence_lvl(nodim)   0

sensor: dhs_sampling(bool)       0  # is set true when data collection in process

    # yo
sensor: c_yo_reread_mafile(bool)        0  # 1 -> reread mafile during a mission

    # goto_list
sensor: c_goto_list_reread_mafile(bool) 0  # 1 -> reread mafile during a mission


# --- dynamic control.c
        # For use in abort sequences, see doco/abort-sequences.txt
sensor: u_abort_min_burn_time(sec)  600  # Never drop the weight before this time
sensor: u_abort_max_burn_time(sec) 14400 # Always drop the weight after this time
sensor: u_abort_c_battpos(in)    -100. # C_BATTPOS to use during aborts
                                       #  max aft, rocket to surface, it will clip
sensor: u_abort_turn_time(sec)     300  # Max time it takes glider to "turn around vertically"

sensor: x_inflecting(bool) 0           # out, true implies in an inflection
sensor: m_tot_num_inflections(nodim) 0 # out, running count of number of inflections
sensor: m_last_yo_time(sec) 0.0        # out, twice the time between last inflections
sensor: m_avg_yo_time(sec) 60.0        # out, twice the average time between inflections
                                       #      exponential average of m_last_yo_time

sensor: m_num_half_yos_in_segment(nodim) # out, number of dive/climbs since last surface
                                         # 0 on first dive after surfacing
                                         # incremented on each inflection

sensor: c_speed(m/s) -1		      # out, horizontal speed, <0 means no speed specified
sensor: dc_c_ballast_pumped(cc) 0 # out, what dynamic control wants ballast to be
  sensor: f_neutral_ballast(cc) 0 # in, amt of ballast for neutral (~0)

sensor: c_pitch(rad) 0 # out, commanded pitch, <0 to dive
sensor: dc_c_battpos(in) 0          # out, what dynamic control wants fore/aft battery to be
sensor: dc_c_thermal_updown(enum)  # out, what dynamic_control wants thermal engine to do
sensor: dc_c_de_updown(enum)  # out, what dynamic_control wants deep electric engine to do
sensor: dc_c_oil_volume(cc) 0 # out, what dynamic control wants oil volume to be
  sensor: f_neutral_oil_volume(cc) 0 # in, amt of oil volume for neutral (~0)
                                     # also used in g_shell.c: GCmdBallast()

    # Generic location stuff, see coord_sys.h for description
sensor: x_lmc_utm_zone_digit(byte)         0  # The utm zone of lmc (0,0)
sensor: x_lmc_utm_zone_char(byte)          0  #  ditto, 0->A 1->B etc

sensor: x_lmc_utm_vehicle_zone_digit(byte) 0  # The utm zone of the vehicle
sensor: x_lmc_utm_vehicle_zone_char(byte)  0  #  ditto, 0->A 1->B etc

sensor: x_utm_to_lmc_00(nodim)       0  # matrix such that: lmc = [] * utm + off
sensor: x_utm_to_lmc_01(nodim)       0  #   |x|   |00 01|   ( |e|   |x0| )
sensor: x_utm_to_lmc_10(nodim)       0  #   | | = |     | * ( | | + |  | )
sensor: x_utm_to_lmc_11(nodim)       0  #   |y|   |10 11|   ( |n|   |y0| )
sensor: x_utm_to_lmc_x0(nodim)       0
sensor: x_utm_to_lmc_y0(nodim)       0

sensor: x_last_utm_easting_correction(m)  0  # needed for crossing lon UTM zones
sensor: x_last_utm_northing_correction(m) 0  # needed for crossing equator
    #The first two are just used to produce a warning if we cross a UTM zone.
    #The second pair are to record current vehicle UTM zone
    #The next six convert (northing,easting) -> (x,y).
    #All of these are computed when the origin in LMC is established.
    #And the last two are used to correct for lon UTM zone and equator crossings.


    # Generic heading related stuff
sensor: c_heading(rad) 0   # out, commanded heading
sensor: c_roll(rad) 0      # out, commanded roll
sensor: dc_c_battroll(rad) 0 # out, what dynamic control wants roll battery to be
sensor: f_battroll_offset(rad) 0.0 # in, added to c_roll to handle off center batteries

sensor: m_hdg_error(rad)      0 # out, m_heading - c_heading
sensor: m_hdg_ierror(rad-sec) 0 # out, integrated m_hdg_error

  # Waypoint control
sensor: u_use_current_correction(nodim) 1   #  0 calculate, but do not use m_water_vx/y
                                            #  1 use m_water_vx/y to navigate AND aim

sensor: c_wpt_x_lmc(m)   0 # in, command waypoint in lmc units
sensor: c_wpt_y_lmc(m)   0 #
sensor: x_hit_a_waypoint(bool) 0 # set by behavior when reach a waypoint
sensor: x_last_wpt_x_lmc(m)    0 # set by behavior when reach a waypoint
sensor: x_last_wpt_y_lmc(m)    0

  # Heading autopilot variables
  # Mostly parameteric inputs to control autopilot
  # The X_ guys are working variables
  # See doco/how-it-works/heading_autopilot.txt



   # servo on Heading by adjusting fin
       # controls/knobs: the user might change these
       # read glider/doco/how-it-works/heading_autopilot.txt
sensor: u_hd_fin_ap_gain(1/rad)      1.00 # The "gain" of controller: 57 deg proportional band
                                          # 1/57 deg
sensor: u_hd_fin_ap_igain(1/rad-sec) 0.03
                                      # percent C_FIN = (-U_HD_FIN_AP_GAIN  * M_HDG_ERROR) +
                                      #                 (-U_HD_FIN_AP_IGAIN * M_HDG_IERROR)

sensor: u_hd_fin_ap_run_time(secs)  -1  # How often to "run" the loop
                                        # <= 0, every cycle
                                        #  > 0, this many seconds

        # What to do around inflections
sensor: u_hd_fin_ap_inflection_holdoff(sec)   -1.0 # in, controls steering around inflections
                                                   #     -1 always steer/integrate_errors during inflection
                                                   #     >=0 don't steer/integrate errors:
                                                   #     during inflection  --AND--
                                                   #     for this many secs after START of inflection

        # How long to not integrate after big course changes
sensor: u_hd_fin_ap_hardover_holdoff(sec)  120.0   # in, how long to keep zeroing the integrated
                                                   # error after fin is "hard over".
                                                   # <= 0 causes no holdoff time, i.e. starts integrating
                                                   # immediately after fin is NOT hardover.

        # various clipping limits
sensor: u_hd_fin_ap_limit_gain_x_error(rad) 1000.0 # Limits the gain*error term, (flattens gain curve)
                                                   # Set it large to disable it.

sensor: u_hd_fin_ap_limit_absolute(rad) 1000 # limits final C_FIN value to beween +/- this value.
                                             # Set it large to disable it.
                                             # Note: this is also limited to the
                                             #       fin safety limit X_FIN_MAX.

sensor: u_hd_fin_abort_after_y_misses(nodim) 5.0 # in, how many missed attitude measurements
                                                #     before we aborting the mission
                                                # <= 0   never abort
                                                #    1   abort on first miss
                                                # >= 2   abort when miss this many times in a row

       # state: user shouldn't change, they are outputs only
sensor: x_hd_fin_ap_ran(bool)      -10 # Updated on a cycle where heading autopilot executed
                                       #  -1     First time initialization
                                       #   0 ;   called, but chose not to command motor
                                       #   1 ;   did not run cause no fresh input
                                       #   2 ;   "ran", controlled motor
sensor: x_hd_fin_ap_is_hardover(bool) 0 # true implies fin is "hardover"


    # servo on Heading by adjusting battery roll
    # Note: These all are parallels of X_hd_fin_XXX.
    #       See those variables for a description.
    #       The Version 1 of battery steering wasn't tested
    #       on a battery steered glider when implemented.  These
    #       settings probably have to be changed.
sensor: u_hd_broll_ap_gain(1/rad)                   1.00
sensor: u_hd_broll_ap_igain(1/rad-sec)              0.03

sensor: u_hd_broll_ap_run_time(secs)               -1.0
sensor: u_hd_broll_ap_inflection_holdoff(sec)      -1.0
sensor: u_hd_broll_ap_hardover_holdoff(sec)       400.0

sensor: u_hd_broll_ap_limit_gain_x_error(rad)    1000
sensor: u_hd_broll_ap_limit_absolute(rad)        1000
sensor: u_hd_broll_abort_after_y_misses(nodim)      3.0

sensor: x_hd_broll_ap_ran(bool)                   -10
sensor: x_hd_broll_ap_is_hardover(bool)             0

# Pitch autopilot variables

# specify the curve relating vehicle pitch to battery postion
#  pitch(rad)  = F_PITCH_BATTPOS_CAL_M(rad/in) * battpos(in) + F_PITCH_BATTPOS_CAL_B(in)
#  note: signs on pitch/battpos are documented under C_PITCH and C_BATTPOS
#                             values for amy from lake seneca
sensor: f_pitch_battpos_cal_m(rad/in)  -1.2565 # input
sensor: f_pitch_battpos_cal_b(in)       0.055  # input

  # Mostly parameteric inputs to control servor
  # The X_ guys are working variables
  # Cloned from heading_autopilot, See doco/heading_autopilot.txt
sensor: u_max_pitch_ap_period(sec) 60 # 16 AutoPilot "runs" at least this often
sensor: u_min_pitch_ap_period(sec)  2 # AutoPilot "runs" no more than this often
sensor: x_pitch_ap_period(sec)      0 # Actual computed time  until next running of autopilot
sensor: x_pitch_ap_ran(bool)      0 # Updated on a cycle where pitch autopilot executed

sensor: u_pitch_ap_gain(1/rad)  -2.86  # 1/ 20deg
                                # The "gain" of controller:
                                # percent delta C_BATTPOS = -U_PITCH_AP_GAIN * M_PITCH_ERROR

sensor: u_pitch_ap_deadband(rad) 0.0524 # 3 deg
                                        # The deadband + or - from C_PITCH,
                                        # We do not make corrections if
                                        #  abs(M_PITCH_ERROR) < U_PITCH_AP_DEADBAND
sensor: u_pitch_max_delta_battpos(in)    0.020  # 40% of deadband
                                                # in, max delta battpos to apply
                                                #     a really big number sets no limit and is safe
                                                #     somebody else clips later on

sensor: u_pitch_correction_time_mult(nodim) 0.50 # What fraction assumed correction time we wait before
                                                 # running again.
sensor: u_pitch_deadband_time_mult(nodim)   2.0  # How much we increase the time til next attempt if
                                                 # we are in the dead band.

sensor: m_pitch_error(rad) 0 # out, difference between m_pitch - c_pitch

# --- sensor_processing.c
sensor: x_sensor_processing_ran(bool) 0 # out, updated on every cycle
                                        #      Used to compute integration times

sensor: m_tot_horz_dist(km) 0.0         # out, How far we have moved underwater

sensor: x_current_target_altitude(m) -1.0  # default is none, height above
                                           # bottom glider is currently
                                           # diving/climbing to

sensor: u_print_engine_status(sec)   -1.0  # controls printing of thermal/deep electric status
                                           # <0 do not print   >0 print status that often


#    compute_depth_stuff()
sensor: m_depth_rate(m/s)    0  # out, rate of change of depth, >0 is down

sensor: u_reqd_depth_at_surface(m) 1 # in, depths less than this considered "at surface"
sensor: u_hovering_frac_nom_dive_rate(nodim) 0.25 # in, fraction of f_nominal_dive_rate
                                                  #    used as threshold for hovering
                                                  #    clips to 0-1

sensor: m_depth_state(enum) 0  # based on m_depth_rate and u_surface_depth
                               # matches CC_DEPTH_STATE_MODE (enum depth_state_mode_t)

# compute_surface_estimate()
#     These run 0 to 1 and are estimates we are at the surface
sensor: m_surface_est_cmd(nodim)  0     # commanded to surface
sensor: m_surface_est_ctd(nodim)   0    # ctd pressure => depth
sensor: m_surface_est_gps(nodim)   0    # gps talking to satellite
sensor: m_surface_est_fw(nodim)    0    # freewave has carrier
sensor: m_surface_est_irid(nodim)  0    # iridium has carrier

sensor: u_surface_est_time_constant(secs) 30 # m_surface_est_XXX expontially decayed
                                             # by this when corresponding condition is false

sensor: m_surface_est_total(nodim)       0 # sum of above m_surface_est_XXX ....
sensor: u_surface_est_threshold(nodim) 1.5 # and are compared to this
                                           # in order to set...
sensor: m_appear_to_be_at_surface(bool)  0 # The final result

sensor: m_certainly_at_surface(bool)     0 # true if got a gps fix, or freewave/iridium carrier
                                           # on this cycle.




#    compute_altitude_stuff()
sensor: u_alt_reduced_usage_mode(bool) 1 # in, default is on, 0 -> off
                                         # reduced usage mode turns on
                                         # altimeter only when necessary

sensor: x_alt_time(sec) 0       # out, calculated c_alt_time value
                                # <0 altimeter off, =0 as fast as possible,
                                # >0 that many seconds between measurements

sensor: m_altitude(m)        0 # out, height above the bottom
sensor: m_altimeter_status(enum)   0  # out, 0 is good reading
                                      #      non-zero means rejected
                                      #      see sensor_processing.h for codes

sensor: u_min_altimeter(m)  2.0   # in, altimeter reading must be between these(inclusive)
sensor: u_max_altimeter(m) 30.0

sensor: m_aground_water_depth(m) -1 # out, set by behavior dive_to when it crashes
                                    #      into bottom
sensor: m_water_depth(m)  -1.0  # out, m_depth + m_altitude.
                                #      -1 ==> unknown

sensor: u_max_water_depth_lifetime(yos) 3.0 # in, how long we can use m_depth in absence
                                            # of measured data

sensor: u_max_bottom_slope(m/m) 3.0  # in, max slope of bottom.  <0 disables all filters
                                     #     max change in altitude/horizontal movement
sensor: u_min_water_depth(m)    0  # in, altimeter reading + M_DEPTH must be between these
sensor: u_max_water_depth(m) 2000  #              inclusive

# compute_alt_measure_delay()
sensor: u_alt_measure_secs_prior_inflection(sec) 15.0 # seconds prior to
                                                      # inflection to start
                                                      # measuring continuously
                                                      # min legal value is 15.0 secs
sensor: u_alt_measure_fraction(nodim) 0.5  # must be > 0 and < 1, fraction
                                           # of time till inflection to measure
                                           # altitude, used in reduced-usage mode

# compute_heading_rate()
sensor: m_hdg_rate(rad/sec) 0  # rate of change of heading


# compute_vehicle_velocity()
sensor: m_speed(m/s)  0           # out, vehicle horizontal speed THRU WATER
sensor: m_is_speed_estimated(bool) 0 # out, Tells if m_speed is computed from
                                  #      M_DEPTH_RATE,M_PITCH -or-
                                  # estimated from M_MISSION_AVG_SPEED_DIVING/CLIMBING when
                                  # M_PITCH is too small

sensor: m_avg_speed(m/s)  0  # out, avg vehicle horizontal speed THRU WATER
                             # used only computing C_HEADING to way point
sensor: u_avg_speed_alpha(nodim) 0.001  # in, time constant for exponential averaging of
                                        #   m_speed ==> m_avg_speed
                                        #     1==> no averaging, i.e. m_avg_speed = m_speed
                                        #     smaller numbers (>0) ==> longer time constant

sensor: m_mission_avg_speed_diving(m/s)   0    # out, running average of computed m_speed
sensor: m_mission_avg_speed_climbing(m/s) 0    # since start of mission.  Used to estimate
                                               # M_SPEED when M_PITCH is too small (< 11 deg)
sensor: u_coast_time(s)                7.5     # in, how long it takes the gliders
                                               # horizontal speed to go to 0 due to drag
                                               # Used when estimating M_SPEED by linearly
                                               # reducing M_MISSION_AVG_SPEED_* to 0 over
                                               # this time
                                               # <0 ==> disables the damping
                                         # Note: see sensor_processing.c:damp_horz_speed()
                                         #       for justification of this time

sensor: m_vx_lmc(m/s) 0  # out, vehicle horizontal velocity OVER GROUND
sensor: m_vy_lmc(m/s) 0



# compute_water_velocity()   See doco/water-velocity-caclulation.txt
sensor: m_water_vx(m/s)  0 # in/out How fast the water is going. LMC coord. sys.
sensor: m_water_vy(m/s)  0 #    used as input here (if u_use_current_correction is true)

sensor: m_initial_water_vx(m/s) 0 # out, initial computation of m_water_vx/y
sensor: m_initial_water_vy(m/s) 0 #

sensor: m_final_water_vx(m/s) 0 # out, initial computation of m_water_vx/y
sensor: m_final_water_vy(m/s) 0 #

sensor: m_water_delta_vx(m/s) 0 # out, change in water_vx/vy this segment
sensor: m_water_delta_vy(m/s) 0 #
                         # both computed in compute_water_velocity() when get gps fix.

sensor: x_prior_seg_water_vx(m/s) 0  # in/out water speed used for navigation on prior segment
sensor: x_prior_seg_water_vy(m/s) 0


sensor: u_max_water_speed(m/s) 2.8   # in, 5 knots
                                     # magnitude of (m_water_vx,m_water_vy) clipped to this

    # These are part of the state machine used in computing water velocity
    #  See doco/water-velocity-calculation.txt for writeup
sensor: x_dr_state(enum)    0.0 # out, mission_start=0, underwater=1,awaiting_fix=2,
                                #      awaiting_postfix=3, awaiting_dive=4
sensor: m_dr_time(sec)      -1.0    # out, how long underwater, subject to currents
sensor: m_dr_surf_x_lmc(m)   0      #      Dead Reckoned location when surface
sensor: m_dr_surf_y_lmc(m)   0

sensor: m_dr_fix_time(sec)  -1.0    # out, surface drift time til first gps fix
sensor: m_gps_fix_x_lmc(m)   0      #      location of first gps fix
sensor: m_gps_fix_y_lmc(m)   0
sensor: m_dr_x_ini_err(m) 0         # out, m_gps_fix_x/y_lmc - m_dr_surf_x/y_lmc
sensor: m_dr_y_ini_err(m) 0


sensor: m_dr_postfix_time(sec) -1.0 # out, surface drift time til later gps fix that is
                                    #      used to correct for surface drift during
                                    #      m_dr_fix_time
sensor: m_gps_postfix_x_lmc(m) 0
sensor: m_gps_postfix_y_lmc(m) 0    #      Location used to measure surface drift
sensor: m_dr_x_postfix_drift(m) 0     # out, m_gps_postfix_x/y_lmc - x_gps_fix_x/y_lmc
sensor: m_dr_y_postfix_drift(m) 0
sensor: m_dr_x_ta_postfix_drift(m) 0     # out, m_dr_x/y_postfix_drift * time adjusted value
sensor: m_dr_y_ta_postfix_drift(m) 0

sensor: m_dr_x_actual_err(m) 0      # out, m_dr_x/y_ini_err - timeadj(m_dr_x/y_postfix_drift)
sensor: m_dr_y_actual_err(m) 0


# compute_lmc_position()
sensor: m_x_lmc(m)  0     # vehicle position in Local Mission Coordinates
sensor: m_y_lmc(m)  0     # (0,0) at mission start Y axis is magnetic north

sensor: x_lmc_xy_source(enum) 0 # out, how m_x/y_lmc was computed this cycle
                                # >= 0 means an (x,y) was computed
                                #   3 gps (surface)
                                #   2 dead reckon(uw)
                                #   1 dr estimated speed (uw)
                                #   0 inited to (0,0)  first cycle of mission
                                #  -1 not computed cause at surface and no gps fix this cycle
                                #  -2 not computed cause no DR data (cycle overrun?)
                                # -10 indicates software error, you should never see this

# compute_waypoint_metrics()
sensor: m_dist_to_wpt(m)  # out, How far to (c_wpt_x_lmc,c_wpt_y_lmc)
sensor: m_vmg_to_wpt(m/s) # out, Velocity Made good to (c_wpt_x_lmc,c_wpt_y_lmc)

# translate_to_latlon()
sensor: m_lat(lat)   69696969  # vehicle position in latitude
sensor: m_lon(lon)   69696969  # vehicle position in longitude
sensor: c_wpt_lat(lat) 0 # current waypoint in latitude
sensor: c_wpt_lon(lon) 0 # current waypoint in longitude
sensor: x_last_wpt_lat(lat) # last achieved waypoint
sensor: x_last_wpt_lon(lon)

# compute_comms_stuff
sensor: u_stable_comms_reqd_secs(sec)  60.0 # in, continous seconds of carrier detect
                                            #     required to have stable comms
sensor: m_stable_comms(bool) 0.0            # out, true-> comms are stable, i.e. we have
                                            #      had m_console_cd for reqd number of secs
                                            #      in a row
sensor: u_zmodem_verbosity(nodim)      29.0 # in, controls output to config\zmodem.log
                                            # the higher the number, the more output
                                            # see zmdebug.h for a description

# --- device driver level
sensor: m_device_drivers_called_abnormally(nodim) 0 # non-zero means time base is suspect because
                                                    # glider busy, after data transmission, etc
                                                    # It is results of:
                                                    # devsched.c:device_drivers_called_normally()
                                                    # It is a bit-field, there is a bit set for
                                                    # each of the possible reasons.  See top of
                                                    # devsched.c for definitions (#define DDCA_xxx)

sensor: m_device_oddity(nodim)  -1.0  # These set to the device number of offending device
sensor: m_device_warning(nodim) -1.0  # whenever it generates error/warning/oddity
sensor: m_device_error(nodim)   -1.0


sensor: f_max_time_per_device_ctrl(msec) 500 # In, default max allowable time for
                                             #     a device driver to run. oddities
                                             #     generated if this time execeeded

sensor: f_noise_floor(volts) 0.050 # Electrical noise in system
                                   # Used to compute how often motor
                                   # velocities are computed and checked

sensor: f_crush_depth(m)        225.0 # When the glider gets crushed
sensor: f_time_to_burn_wire(sec) 20.0 # How long it takes burn wire to drop weight
sensor: m_at_risk_depth(m)      221.0 # When have to start burning the wire to drop the
                                      #  in order to drop the weight before f_crush_depth
                                      #  when diving at f_nominal_dive_rate
                                      #  default=    225m - 20s * 0.19 m/s =

# common to all motors
sensor: u_comatose_enabled(bool)       0.0   # in, true->enables comatose mode
sensor: u_comatose_deadband_mult(nodim) 10.0 # in, how much to increase motor deadbands
                                             #     when in comatose mode

sensor: u_motor_fs_travel_mult(nodim)  2.0 # in, used to compute worst case motor travel time
                                           # = U_MOTOR_FS_TRAVEL_MULT *
                                           #   2 * F__SAFETY_MAX / F_NOMINAL_VEL

sensor: f_motor_analyze_deadband(nodim) 1800.0 # enables computation and printing of
                                               # all motor positioning stats, i.e. diffence
                                               # between C_xxx(commanded) and M_xxx(measured)
                                               # <= 0    no action, zero stats
                                               # >  0    accumulate stats (min, mean, max, standev)
                                               #         every F_MOTOR_ANALYZE_DEADBAND calls...
                                               #             print and zero stats


# ballast/buoyancy pump: motor.c motor_drivers.
sensor: c_ballast_pumped(cc) 0  #in >0 pumps ballast overboard, goes up
sensor: m_ballast_pumped(cc)        #out,
sensor: f_ballast_pumped_stall_retry(sec) 10.0 # in, how long to wait for retry if
                                             #     pump jams, not moving fast enuf

sensor: x_ballast_pumped_max(cc) 226 # out, Maximum OPERATIONAL limit
sensor: x_ballast_pumped_deadband(cc)  0.0 # out, how close is good enuf
                              #   = f_ballast_pumped_deadz_width * f_ballast_pumped_db_frac_dz
sensor: m_is_ballast_pump_moving(bool) 0   # out, t-> motor is moving
sensor: m_ballast_pumped_vel(cc/sec)     0   # out, measured motor speed

sensor: m_ballast_pumped_energy(joules)  0     #out,  How much energy to pump water on last command
                                               #      = pressure * volume when extending
sensor: m_tot_ballast_pumped_energy(kjoules) 0 #out,  totalized m_ballast_pumped_energy


sensor: u_ballast_pumped_microposition(bool)    0   # T==> microposition the motor
sensor:   u_ballast_pumped_micropos_rt(msec)   250  # "run time"  >0 max allowable microposition time
sensor:   u_ballast_pumped_micropos_wp(nodim)  0.01 #"when pulse" 0-1  when start pulsing the motor
                                                    #  0 immediately, 0.5 when half way there, 1 never
sensor:   u_ballast_pumped_micropos_dc(nodim)  10   # "duty cycle" 1-N  once pulsing,
                                                    #    pulse motor 1 cycle out of this many



  # max = safety_max - deadzone
  sensor: f_ballast_pumped_safety_max(cc) 268.0  # in, damage to glider
  sensor: f_ballast_pumped_deadz_width(cc)  42.0  # in, sets x_ limit
  sensor: f_ballast_pumped_db_frac_dz(nodim) 1.0   # deadband as fraction of dead zone
  sensor: f_ballast_pumped_nominal_vel(cc/sec) 132.0 # in, nominal speed
  sensor: f_ballast_pumped_reqd_vel_frac(nodim) 0.25 # in, fraction of nominal
                                                     # required before saying not
                                                     # moving fast enuf


  # Specs linear relationship between sensor units (cc) and the
  # voltage we actually read out of the AD for position
  # pumped(cc) = pumped_cal_m(cc/Volt) * volts + pumped_cal_b(cc)
  sensor: f_ballast_pumped_cal_m(cc/Volt) 366.93 # in, slope
  sensor: f_ballast_pumped_cal_b(cc) 	 -412.19 # in, y-intercept


# Battery (fore/aft) position: motor.c motor_drivers.
sensor: c_battpos(in) 0   # in, >0 vehicle dives (nose down)
                              #     the battery is moved forward
sensor: m_battpos(in)     # out
sensor: x_battpos_max(in) # out, Maximum OPERATIONAL limit
sensor: x_battpos_deadband(in) 0.0 # out, how close is good enuf
                    # = f_battpos_deadzone_width * f_battpos_db_frac_dz
sensor: m_is_battpos_moving(bool) 0   # out, t-> motor is moving
sensor: m_battpos_vel(in/sec)  0  # out, measured motor velocity

sensor: u_battpos_microposition(bool)   1  # T==> microposition the motor
sensor:   u_battpos_micropos_rt(msec)   1000  # "run time"  >0 max allowable microposition time
sensor:   u_battpos_micropos_wp(nodim)  0.01 #"when pulse" 0-1  when start pulsing the motor
                                             #  0 immediately, 0.5 when half way there, 1 never
sensor:   u_battpos_micropos_dc(nodim)  10   # "duty cycle" 1-N  once pulsing,
                                             #    pulse motor 1 cycle out of this many


  # max = safety_max - deadzone
  # x_battpos_max = f_safety_max_battpos - f_deadzone_width_battpos

  sensor: f_battpos_safety_max(inches) 0.45  # in, damage to glider
  sensor: f_battpos_deadzone_width(inches) 0.068 # Sets x_ limit
  sensor: f_battpos_db_frac_dz(nodim)      1.0   # deadband as fraction of dead zone
  sensor: f_battpos_nominal_vel(inches/sec)  0.16 # nominal speed
  sensor: f_battpos_reqd_vel_frac(nodim) 0.25 # in, fraction of nominal
                                              # required before saying not
                                              # moving fast enuf

  # Specs linear relationship between sensor units (inches) and the
  # voltage we actually read out of the AD for position
  # battpos(inches) = _cal_m(inches/Volt) * volts + _cal_b(inches)
  sensor: f_battpos_cal_m(inches/Volt)  0.571 # slope
  sensor: f_battpos_cal_b(inches)      -0.506 # y-intercept


# battery roll, motor.c motor_drivers.
# battroll

sensor: c_battroll(rad) 0 # in, >0 puts stbd wing down
                          #     the battery is rotated ClockWise (CW)
                          #     when looking fwd
sensor: m_battroll(rad)     # out
sensor: x_battroll_max(rad) # out, Maximum OPERATIONAL limit
sensor: x_battroll_deadband(rad)  0.0  # out, how close is good enuf
                        # = f_battroll_deadzone_width * f_battroll_db_frac_dz
sensor: m_is_battroll_moving(bool) 0   # out, t-> motor is moving
sensor: m_battroll_vel(rad/sec)    0  # out, measured motor velocity

sensor: u_battroll_microposition(bool) 0  # T==> microposition the motor
sensor:   u_battroll_micropos_rt(msec)   250  # "run time"  >0 max allowable microposition time
sensor:   u_battroll_micropos_wp(nodim)  0.01 #"when pulse" 0-1  when start pulsing the motor
                                              #  0 immediately, 0.5 when half way there, 1 never
sensor:   u_battroll_micropos_dc(nodim)  10   # "duty cycle" 1-N  once pulsing,
                                              #    pulse motor 1 cycle out of this many


  # max = safety_max - deadzone
  sensor: f_battroll_safety_max(rad) 0.52  # in, damage to glider
  sensor: f_battroll_deadzone_width(rad) 0.088 # in, Sets x_ limit
  sensor: f_battroll_db_frac_dz(nodim)      1.0   # deadband as fraction of dead zone
  sensor: f_battroll_nominal_vel(rad/sec) 0.09 # in, nominal speed
  sensor: f_battroll_reqd_vel_frac(nodim)0.25 # in, fraction of nominal
                                              # required before saying not
                                              # moving fast enuf


  # Specs linear relationship between sensor units (rads) and the
  # voltage we actually read out of the AD for position
  # battroll(rad) = _cal_m(rad/Volt) * volts + battroll_cal_b(rad)
  sensor: f_battroll_cal_m(rad/Volt)  0.950 # slope
  sensor: f_battroll_cal_b(rad)       -1.22 # y-intercept


# fin, motor.c motor_drivers
sensor: f_fin_offset(rad) 0.0 # in, added to c_fin to trim (after autopilot)
sensor: c_fin(rad) 0      # in, >0 vehicle turns right
sensor: m_fin(rad)     # out
sensor: x_fin_max(rad) # out, Maximum OPERATIONAL limit
sensor: x_fin_deadband(rad)  0.0  # out, how close is good enuf
                        # = f_fin_deadzone_width * f_fin_db_frac_dz
sensor: m_is_fin_moving(bool) 0   # out, t-> motor is moving
sensor: m_fin_vel(rad/sec)    0  # out, measured motor velocity

sensor: u_fin_microposition(bool) 1  # T==> microposition the motor
sensor:   u_fin_micropos_rt(msec)   750  # "run time"  >0 max allowable microposition time
sensor:   u_fin_micropos_wp(nodim)  0.01 #"when pulse" 0-1  when start pulsing the motor
                                         #  0 immediately, 0.5 when half way there, 1 never
sensor:   u_fin_micropos_dc(nodim)  5    # "duty cycle" 1-N  once pulsing,
                                         #    pulse motor 1 cycle out of this many


  # max = safety_max - deadzone
  sensor: f_fin_safety_max(rad) 0.47  # in, damage to glider
  sensor: f_fin_deadzone_width(rad) 0.020 # in, Sets x_ limit
  sensor: f_fin_db_frac_dz(nodim)      1.0   # deadband as fraction of dead zone
  sensor: f_fin_nominal_vel(rad/sec) 0.0981 # in, nominal speed
  sensor: f_fin_reqd_vel_frac(nodim) 0.25   # in, fraction of nominal
                                            # required before saying not
                                            # moving fast enuf


  # Specs linear relationship between sensor units (rads) and the
  # voltage we actually read out of the AD for position
  # fin(rad) = _cal_m(rad/Volt) * volts + fin_cal_b(rad)
  sensor: f_fin_cal_m(rad/Volt)  0.6461 # slope
  sensor: f_fin_cal_b(rad)       -.7904 # y-intercept

# de_eng.c

sensor: c_de_recall(msec) 1000.0 # in, <= 0 next_cycle
                                 # > millisecs between state machine calls

sensor: m_de_recall(msec) 0.0    # out, = 0 next_cycle
                                 # > millisecs between state machine calls

sensor: c_de_updown(enum) 0.0 # in
#                               C_DE_ENG_DONT_USE(-1)   Disable this driver (thrvalve still active)
#                               C_DE_ENG_UP(0)          UP
#                               C_DE_ENG_DOWN(1)        DOWN

sensor: m_de_updown(enum) 3.0  # out
#                              M_DE_ENG_UP(0)           In the ascending state
#                              M_DE_ENG_DOWN(1)         In the descending state
#                              M_DE_ENG_STABLE(2)       In the stable state
#                              M_DE_ENG_NOT_IN_USE(3)   Higher level driver disabled
#                              M_DE_ENG_ERROR(-1)       Something bad happened, someone should abort

sensor: m_is_de_engine_moving(bool) 0   # out, t-> engine is moving

sensor: m_secs_since_de_substate_change(secs) 0 #       timer for state machine

sensor: u_max_secs_in_de_substate(secs) 50 # max time in a deep electric substate

sensor: f_de_max_secs_for_updown_to_finish(secs) 540 # 9 minutes (~1.5 x time
                                                     # to retract full oil
                                                     # volume at surface)

# de_pump.c
sensor: c_de_pump(enum) 0.0 # in
#                          C_DE_PUMP_OFF(0)
#                          C_DE_PUMP_UP(1)
#                          C_DE_PUMP_UP_IN_LAB(3)    lab_mode (-lab) only, ignore

sensor: m_de_pump(enum) 0.0 # out
#                          M_DE_PUMP_OFF(0)
#                          M_DE_PUMP_UP(1)
#                          M_DE_AWAITING_VALVE(-1)   M_THERMAL_VALVE != THRVALVE_UP...THRVALVE_DOWN


# threng.c
sensor: c_thermal_updown(enum) 0.0 # in
#                               CTHRENG_DONT_USE(-1)    Disable this driver (thrvalve still active)
#                               CTHRENG_UP_CHARGE(0)    Go thru an UP, CHARGE cycle
#                               CTHRENG_DOWN(1)         DOWN

sensor: m_thermal_updown(enum) 3.0  # out
#                              MTHRENG_CHARGE(0)       Stable in the charge position
#                              MTHRENG_DOWN(1)         Stable In the down position
#                              MTHRENG_MOVING(2)       Moving between states
#                              MTHRENG_NOT_IN_USE(3)   Higher level driver disabled
#                              MTHRENG_ERROR(-1)       Something bad happened, someone should abort

sensor: u_thermal_valve_time_in_up_pos(s) 60.0    # in, how long thermal valve says in up position
                                                  #     before being automatically moved to charge
sensor: u_thermal_valve_time_in_down_pos(s) 300   # in, 5 minutes in seconds
                                                  # how long the valve must be in the down
                                                  # position before allowed to go to up position
                                                  # Used to prevent "double charges".  Ignored
                                                  # for safety sake if glider is deeper than the
                                                  # minimum of f_max_working_depth or f_at_risk_depth

# thrvalve.c
sensor: f_thermal_valve_time_over_slot(msec) 550 # millisecs the thermal valve hole is over the sensor
sensor: c_thermal_valve(enum)    # in, THRVALVE_UP(1),THRVALVE_CHARGE(2), THRVALVE_DOWN(3)

sensor: m_thermal_valve(enum)    # out, THRVALVE_UNKNOWN(0), THRVALVE_UP(1), THRVALVE_MOVING_TO_UP(-1)
                                 #      THRVALVE_CHARGE(2), THRVALVE_MOVING_TO_CHARGE(-2),
                                 #      THRVALVE_DOWN(3), THRVALVE_MOVING_TO_DOWN(-3)
sensor: m_is_thermal_valve_moving(bool) # out, true if valve is moving

sensor: x_thermal_valve_move_backwards(bool) 0 # In, non-zero means move valve backwards
                                               # DO NOT MANUALLY set this, it is maintained
                                               # by gliderdos TVALVE command. Only used in -lab.

sensor: u_thermal_valve_check_time(sec) 180 # how often check valve position
                                            # <= 0 to disable

# ballast.c
sensor: c_neutral_oil_vol_deadband(cc) 5.0 # in, user commanded limit on how close
                                           # is close enough for setting the
                                           # neutral buoyancy volume

# tcm3.c
sensor: f_tcm3_cal_points(nodim)   50  # Default number of sample points in calibration
sensor: m_tcm3_stddeverr(uT)       -1  # The compass samples magnetic field
                                       # standard deviation error.
sensor: m_tcm3_xcoverage(%)        -1  # Percentage of how much of the X magnetometer
                                       # axis was covered by the sampling.
sensor: m_tcm3_ycoverage(%)        -1  # Percentage of how much of the Y magnetometer
                                       # axis was covered by the sampling.
sensor: m_tcm3_zcoverage(%)        -1  # Percentage of how much of the Z magnetometer
                                       # axis was covered by the sampling.
sensor: m_tcm3_magbearth(uT)       -1  # The calculated Earth's magnetic field
                                       # magnitude from the calibration samples.
sensor: m_tcm3_is_calibrated(bool)  0  # The compass calibration status flag.
sensor: m_tcm3_poll_time(ms)        0  # Time after open_uart() call we poll for data
sensor: m_tcm3_recv_start_time(ms)  0  # Time after open_uart() call we start receiving data
sensor: m_tcm3_recv_stop_time(ms)   0  # Time after open_uart() call we stop receiving data


# attitude.c/attitude_tcm3.c
sensor: c_att_time(sec) 0 # in, time spacing for attitude checks
                        # <0 is off, =0 as fast as possible
                        # otherwise secs between measurements
sensor: c_att_recall(msec) -1.0 # in, <=0 no subcycle measurements
                                # >0 millisecs between subcycle measurements
                                # (c_att_time must be 0 to enable)
sensor: m_roll(rad) 0          # out, >0 is port wing up
sensor: m_pitch(rad) 0         # out, >0 is nose up
sensor: m_heading(rad) 0       # out
sensor: m_vehicle_temp(degC) 0 # out

# oceanpres.c
sensor: c_pressure_time(sec) 1 # in, <0 is off, =0 as fast as possible
                             # >0 num seconds betweens measurements
sensor: c_pressure_recall(msec) -1 # in, <=0 no subcycle measurements
                                   # >0 millisecs between subcycle measurements
                                   # c_pressure_time must be 0 to enable
sensor: m_pressure_voltage(volts) # out, measured, raw reading from AD
sensor: m_pressure(bar)           # out, measured NOT clipped:
                                  #       <0 not good, glider above the surface,
                                  #        0 surface
                                  #       >0 glider below surface in water
sensor: m_depth(m) 0		      # out, calculated clips at 0
                                  #         0 surface
                                  #        >0 glider below surface in water

sensor: u_use_ctd_depth_for_flying(bool) 0  # true=> use ctd measurement for m_depth
                                            # implemented as emergency workaround for
                                            # broken ocean pressure

sensor: m_depth_rejected(bool) 0  # out, true if depth measurement is filtered
                                  #       1 ==> thinks glider at surface
                                  #             U_DEPTH_RATE_FILTER_SUB_SUR_DEP ==> M_DEPTH
                                  #       2 ==> thinks glider is NOT surface
                                  #             no M_DEPTH is output
sensor: u_depth_rate_filter_sub_sur_dep(m) 0.05    # used for M_DEPTH when m_pressure rejected at
                                                   # the surface

sensor: u_depth_rate_filter_factor(nodim) 4.0 # <=0 disables bad depth filter,
                                              # otherwise multiplies
                                              # f_nominal_dive_rate by this
                                              # value to create the cutoff value
                                              # for an acceptable depth
                                              # rate of change
sensor: x_measured_depth(m)    0.0  # The last published M_DEPTH where M_DEPTH_REJECTED is 0
                                    # i.e. actually came from pressure sensor in lieu of a
                                    # made up value at the surface.  Depth rate filter compares
                                    # current "depth" being evaluated against this


sensor: u_pressure_autocal_min_time_between(secs) 180     # minimum interval time
                                                          # between auto calibrations
sensor: u_pressure_autocal_enabled(bool)            1     # 0=turned off, 1=turned on
sensor: u_pressure_autocal_deadband(bar)            0.025 # re-calibrate when drift is
                                                          # beyond + or - this
sensor: u_pressure_autocal_max_allowed(bar)         0.2   # print oddity when drift is
                                                          # beyond + or - this, don't
                                                          # re-calibrate
sensor: u_pressure_autocal_performed(bool)          0     # becomes  1 when auto   re-calibration is done
                                                          # becomes  2 when manual re-calibration is done
                                                          # becomes -1 when excessive pressure drift is detect:
                                                          #            (no calibration is done!)

sensor: x_pressure_manual_cal_now(bool)             0     # non-zero causes manual (non-auto) re-calibration
                                                          # set to 1 by GliderDos>zero_pressure_sensor
                                                          # set to 0 by ocean_pressure device driver when
                                                          #  manual re-calibration is done

  # inputs, config stuff  FS-->full scale
  sensor: u_bar_per_meter(bar/m) 0.1 # Converts m_pressure to m_depth
  sensor: f_ocean_pressure_full_scale(bar) 13.8 # pressure @ FS volts
  sensor: f_ocean_pressure_min(volts) 0.20 # voltage for 0 pressure
  sensor: f_ocean_pressure_max(volts) 2.40 # voltage for FS pressure

# oilvol.c
sensor: c_de_oil_vol_time(sec) 0 # in, <0 is off, =0 as fast as possible
                                 # >0 num seconds between measurements

sensor: c_de_oil_vol_recall(msec) 1000.0 # in, <=0 no subcycle sampling
                                         # >0 millisecs between subcycle
                                         # measurements, c_de_oil_vol_time must
                                         # be 0 to enable

sensor: c_de_oil_vol_measuring_delay(sec) 180 # stable state periodic monitoring rate

sensor: c_de_oil_vol(cc)  270.0 # in >0, goes up
sensor: m_de_oil_vol(cc)  0 # out, calibrated from m_de_oil_vol_pot_voltage

sensor: m_de_oil_vol_pot_voltage(volts)   0 # out, raw voltage from AD

# set these to illegal values to insure them getting set in autoexec.mi
sensor: f_de_oil_vol_pot_voltage_min(volts) -20 # raw AD voltage of fully retracted pot
sensor: f_de_oil_vol_pot_voltage_max(volts) -20 # raw AD voltage of fully extended pot

sensor: f_de_oil_vol_in_system(cc) 650          # volume of internal oil reservoir

sensor: x_de_oil_vol_deadband(cc) 0.0 # out, how close is good enuf
                                       # = f_de_oil_vol_deadz_width *
                                       #   f_de_oil_vol_db_frac_dz


sensor: x_de_oil_vol_max(cc)           0.0 # out, Maximum OPERATIONAL limit
# max = safety_max - deadz_width
sensor: f_de_oil_vol_safety_max(cc)  300.0  # in, damage to glider
sensor: f_de_oil_vol_deadz_width(cc)  30.0  # in, sets x_ limit
sensor: f_de_oil_vol_db_frac_dz(nodim) 0.5  # deadband as fraction of dead zone

# Needed to reduce over-retractions on descents
# on ascents:
#   x_de_target_oil_vol(cc) = c_de_oil_vol(cc)
# on descents:
#   x_de_target_oil_vol(cc) = c_de_oil_vol(cc) -
#   (m_pressure(bar) * f_de_target_oil_drift_m(cc/bar) + f_de_target_oil_drift_b(cc))
sensor: x_de_target_oil_vol(cc)	        0.0
sensor: f_de_target_oil_drift_m(cc/bar) -7.22
sensor: f_de_target_oil_drift_b(cc)     -4.23

# Keeps tract of the oil flux in the deep electric
sensor: x_de_oil_flux(cc/sec)	# positive = pumping, negative = retracting

# engpres.c (driver name: thermal_acc_pres)
sensor: c_thermal_acc_pres_time(sec) 1 # in, <0 is off, =0 as fast as possible
                                 # >0 num seconds between measurements
sensor: c_thermal_acc_pres_recall(msec) -1.0 # in, <=0 no subcycle measurements
                                         # >0 millisecs between subcycle measurements
                                         # c_thermal_acc_pres_time must be 0 to enable
sensor: m_thermal_acc_pres_voltage(volts) 0 # out, raw voltage from AD
sensor: m_thermal_acc_pres(bar)           0 # out, calibrated from m_thermal_acc_pres_voltage


  # inputs, volts/pressure config stuff  FS-->full scale
  sensor: f_thermal_acc_pres_full_scale(bar) 248.222 # pressure @ FS volts
  sensor: f_thermal_acc_pres_min(volts) 0.143 # voltage for 0 pressure
  sensor: f_thermal_acc_pres_max(volts) 2.400 # voltage for FS pressure

sensor: m_thermal_acc_vol(cc)        # out, computed oil volume from m_thermal_acc_pres
  # inputs, volume/pressure config stuff
  #      specs PV=k relationship between pressure and volume
  #      m_thermal_acc_vol(cc) = f_thermal_acc_vol_cal_v0(cc) *
  #                            (1 - f_thermal_acc_vol_cal_p0(bar)/m_thermal_acc_pres(bar))
  sensor: f_thermal_acc_vol_cal_v0(cc)  2263.3036 # in, invariant volume with piston full out
  sensor: f_thermal_acc_vol_cal_p0(bar)   31.0114 # in, initial pressure with piston full out

sensor: m_thermal_enuf_acc_vol(bool)  0  # out, reflects state of switch that measure
                                       #      adequate thermal displacement.
                                       # 0==> not enuf    !=0 ==> enuf
sensor: x_thermal_reqd_acc_vol(cc)   300 # out, the volume of oil in accumulator when
                                       #      switch says we have enuf

  # thrpump.c
sensor: c_thermal_pump(enum)  0   # in, commanded state of thermal pump:
                                  #    CTHRPUMP_OFF              0.0
                                  #    CTHRPUMP_ON_WITH_CHECKS   1.0
                                  #    CTHRPUMP_ON_REGARDLESS    2.0  note: only in -lab
sensor: m_thermal_pump(enum)  0   # out, actual state of thermal pump:
                                  #    MTHR_PUMP_OFF                    0.0
                                  #    MTHR_PUMP_ON                     1.0
                                  #    MTHR_AWAITING_NOT_ENUF_VOLUME   -1.0
                                  #    MTHR_AWAITING_REQD_PITCH        -2.0
                                  #    MTHR_AWAITING_VALVE             -3.0
                                  #    MTHR_AWAITING_AIR               -4.0
sensor: u_thermal_pump_reqd_pitch(rad) -0.1745  # in,   how far down glider must be pointing in
                                                #       to use the pump   (-0.1745rad => -10deg)
sensor: x_thermal_pump_start_in(sec)   -1.0     # in/out, advisory time until thermal pump is engaged

# altimeter.c
sensor: c_alt_time(sec) 0 # in, time spacing for altimeter pings
                        # <0 is off, =0 as fast as possible
                        # >0 that many seconds betweens measurements

sensor: c_alt_recall(msecs) -1.0 # in, <=0 no subcycle sampling
                                 # >0 millisecs between subcycle measurements
                                 # c_alt_time must be 0 to enable

sensor: f_altimeter_model(enum)  0  # in, which altimeter is installed:
                                    # 0   Benthos, sample 400ms after power on
                                    # 1   AirMar(mod1), sample 1.1 to 5 sec after power on
                                    # -1  experimental, sample u_exp_alt_pwr_stb_time secs
                                    #                   after power on

sensor: u_exp_alt_pwr_stb_time(s) 0 # in, only looked at if f_altimeter_model == -1
                                    # control when to sample experimental altimeter
                                    # >0 the seconds to wait before reading altimeter
                                    #  0  Never power off the altimeter, i.e. leave
                                    #     it powered on all the time.
sensor: u_exp_alt_correction(m) 0 # in, only looked at if f_altimeter_model == -1 (experimental)
                                    # used to compensate for fixed offsets in altimeters
                                    # M_RAW_ALTITUDE(m) = M_RAW_ALTITUDE(m) + U_EXP_ALT_CORRECTION(m)


sensor: u_alt_min_post_inflection_time(sec)  10.0  # num secs after inflection before we take data
sensor: u_alt_min_depth(m)     2.0  # how deep vehicle must be to use altitude
sensor: u_alt_reqd_good_in_a_row(nodim)  3 # how many in a row we require before accepting reading

sensor: m_raw_altitude(m) # out, height above bottom, unfiltered
sensor: m_raw_altitude_rejected(bool) # out, true if altimeter did not supply reading
sensor: m_altimeter_voltage(volts)     # out, voltage read from the A/D

# watchdog.c
sensor: c_weight_drop(bool)          0 # in, non-zero->drop the weight
sensor: u_tickle_on_gps(bool)        1 # in, non-zero reset watchdog on every gps fix
sensor: u_tickle_on_console_cd(bool) 1 # in, non-zero reset watchdog if have freewave

sensor: x_hardware_cop_timeout(hours) -1 # out, reflects state of jumper
                                         #      -1 can't tell, >=RevE will be 2 or 16
sensor: m_cop_tickle(bool)           1 # out, set to 1 whenever COP is tickled
sensor: m_tot_on_time(days)          0 # out, How long we have been powered on

# airpump.c
sensor: c_air_pump(enum) 0   # in, <0 turns it off regardless
                             #      0 turns it off unless thermal or deep electric engine needs it
                             #     >0 turns it on
sensor: u_thermal_min_time_in_esc_pos(s) 1800.0 # in, for thermal only
                             # the number of seconds the air pump solenoid must
                             # stay in escape position before it is automatically
                             # returned to fill position.  Note: The glider must also
                             # NOT be at the surface for the valve to be automatically
                             # moved to fill position for thermal or electric.

sensor: m_air_pump(bool) 0   # out, whether it is on or not
sensor: m_air_fill(bool) 0   # out, T->air pump solenoid in fill position
                             #      F->air pump solenoid in escape position

# battery.c
sensor: u_battery_time(sec) 0 # in, Time between battery measurements
                              # <0 is off, =0 as fast as possible
                              # >0 num seconds betweens measurements
sensor: u_battery_recall(msecs) -1.0 # <=0 no subcycle measurements
                                     # >0 millisecs between subcycle measurements
                                     # u_battery_time must be 0 to enable
sensor: m_battery_inst(volts) 12   # out, Instantaneous battery voltage
sensor: m_battery(volts)      12   # out, Average Battery voltage
sensor: u_battery_alpha(nodim) 0.1 # in, The weighting factor to produce the average.
                                   #     Should be between 0 and 1.
                                   #     1 ==> no averaging at all
                                   #     smaller numbers mean more averaging
                                   #M_BATTERY =    U_BATTERY_ALPHA  * M_BATTERY_INST +
                                   #            (1-U_BATTERY_ALPHA) * M_BATTERY


# vacuum.c
sensor: u_vacuum_time(sec) 0 # in, Time between vacuum measurements
                           # <0 is off, =0 as fast as possible
                           # >0 that many seconds betweens measurements
sensor: u_vacuum_recall(msec) -1 # in, <=0 no subcycle measurements
                                 # >0 millisecs between subcycle measurements
                                 # u_vacuum_time must be 0 to enable
sensor: m_vacuum(inHg) # out, Internal glider pressure
sensor:    u_vacuum_cal_m(inHg/Volt) -14.4059  # Factory Calibration data
sensor:    u_vacuum_cal_b(inHg)      31.64615  #      inHg = m V + b


# leakdetect.c
sensor: c_leakdetect_time(s) 0.0 # in, Time between leakdetect measurements
                                 #   <0 is off, =0 as fast as possible
                                 #   >0 that many seconds betweens measurements
sensor: c_leakdetect_recall(msec) -1.0 # in, <=0, no subcycle measurements
                                       # >0 millisecs between subcycle measurements
                                       # c_leakdetect_time must be 0 to enable

sensor: f_leakdetect_threshold(volts)  2.0 # in, Any M_LEAKDETECT_VOLTAGE below this is considered
                                           #     a leak.

sensor: m_leakdetect_voltage(volts) 0.0 # out Voltage that was read
                                        #     The lower the voltage, the worse the leak.
sensor: m_leak(bool) 0.0                # non-zero ==> m_leakdetect_voltage < f_leakdetect_threshold



# pinger.c
sensor: u_pinger_rep_rate(sec) 8    #in, secs between primary depth pings
                                    # 0 turns it off

sensor: u_pinger_max_depth(m)  1000 #in, Secondary ping at 1 second when m_depth
                                    #    is >= this depth. (assuming nominal
                                    #    8 second u_pinger_rep_rate)

sensor: u_ping_n_enabled(bool) 1    # if non-zero enable "ping N times"
                                    # functionality, 0 turns it off for
                                    # "quiet missions"

sensor: c_pinger_on(bool)      1    # in, non-zero means ping N times once


# gps.c
sensor: c_gps_on(enum) 0 # in, <0-> off always 0->off, but surface autoon, 1->gps take fixes
                         # >1 take fixes + diag output [see gps.h]

sensor: u_gps_reqd_valid_fixes(nodim) 6  # in, reqd number of valid fixes since power on
                                         #     before we publish as m_gps_lat/lon

sensor: m_gps_on(bool) 0         # out, >0 means gps is actually turned on
sensor: m_gps_lat(lat) 69696969  # out  DDMM.MMMM   >0 ==> North   <0 ==> South
sensor: m_gps_lon(lon) 69696969  # out  DDMM.MMMM   >0 ==> East    <0 ==> West
sensor: m_gps_x_lmc(m) 0         # out  position in local mission coordinates
sensor: m_gps_y_lmc(m) 0         # out
sensor: m_gps_status(enum)      69 # out, updated with status of gps after received a line
sensor: m_gps_full_status(enum) 69 # out, updated with status of gps after every attempt to
                                   #      to read characters from the gps
                                   # 0 is good fix, m_gps_lat/lon update
                                   # >0 no fix see gps.h for list of why

sensor: m_gps_ignored_lat(lat) 69696969 # out, first few ignored gps fixes here
sensor: m_gps_ignored_lon(lon) 69696969 # published when m_gps_status == GPS_STATUS_FIRST_IGNORED_VALID(1)

sensor: m_gps_invalid_lat(lat) 69696969 # out, published on A lines
sensor: m_gps_invalid_lon(lon) 69696969

sensor: m_gps_toofar_lat(lat)  69696969 # out, published if too far from DR point
sensor: m_gps_toofar_lon(lat)  69696969 #      M_GPS_STATUS == GPS_STATUS_TOOFAR_FIX(3)

sensor: m_gps_dist_from_dr(m)      69696969 # out, how far fix is from dead reckoned position
sensor: x_gps_reasonable_radius(m) 69696969 # out, how far fix CAN BE from dead reckoned position
           # = U_GPS_REASONABLE_FACTOR *
           # ( U_GPS_UNCERTAINITY + secs_since_last_valid_gps_fix *
           #  (U_MAX_WATER_SPEED + nominal glider horizontal speed))
sensor: u_gps_reasonable_factor(nodim) 1.0 # in, see equation above
sensor: u_gps_uncertainity(m)         30.0 # in, see equation above

           # This data is read from gps and published
sensor: m_gps_utc_day(byte)     0 # 1-31           Date/Time of position
sensor: m_gps_utc_month(byte)   0 # 1-12
sensor: m_gps_utc_year(byte)    0 # 00, 01, ... until Y3K
sensor: m_gps_utc_hour(byte)   0 # 0-23
sensor: m_gps_utc_minute(byte) 0 # 0-59
sensor: m_gps_utc_second(nodim) 0 # 0-59.xxxxxx
sensor: m_gps_speed(m/s)        0 # speed over ground
sensor: m_gps_heading(rad)      0 #  magnetic heading
sensor: m_gps_mag_var(rad)      0 # mag_heading = true_heading + mag_var
                                  #    mag_var>0 ==>  variation is West (like on cape cod)

sensor: m_system_clock_lags_gps(sec)            0 # lagtime between persistor and gps clock
sensor: m_avg_system_clock_lags_gps(sec)        0 # exponential mean of above lagtime
sensor: u_alpha_system_clock_lags_gps(nodim) 0.05 # weight in exponential mean

# generic time syncing sensor, called in surface.c and g_shell.c
sensor: u_max_lag_before_syncing_time(sec)     12 # sync_time when avg lag exceeds 12 secs
# generic sensor to record syncing offsets, called in g_shell.c
sensor: x_system_clock_adjusted(sec)            0 # records the last sync_time offset



# argos.c
sensor: c_argos_on(enum) 0   # <0 PTT is always turned off, even at surface
                             # 0 PTT powered off, but can be auto turned on at surface
                             #     >0 PTT is powered on and transmitting:
                             #          1 no diagnostic output
                             #          2 output xmitted chars to MLOG/TERM
                             #          3 output xmitted/recvd chars to MLOG/TERM
sensor: m_argos_on(bool) 0 # out, >0 means argos is actually turned on
sensor: m_argos_sent_data(bool)   0 # out, > 0 means data was sent to PTT
sensor: m_argos_is_xmitting(bool) 0 # out, > 0 means PTT is radiating

# sensors to support new PTT format, along with legacy stuff
sensor: x_argos_type(enum) 0   # 0  SmartCAT (legacy)
                               # 1  X-CAT (external PIC)

sensor: f_argos_format(enum) 0 # 0  rev0 legacy (32 byte)
                               # 1  rev1 Mar05  (31 byte)

# ctd.c
sensor: c_profile_on(sec) 0		# in, <0 is off, =0 as fast as possible
                                # >0 that many seconds betweens measurements
sensor: c_profile_recall(msec) -1 # in, <=0 no subcycle measurements
                                  # millisecs between subcycle measurements
                                  # c_profile_on must be 0 to enable

sensor: m_water_cond(S/m) 3       # out, conductivity
sensor: m_water_temp(degC) 10     # out
sensor: m_water_pressure(bar) 0 # out

# iridium.c
sensor: c_iridium_on(enum) 1 # in
                             #  <0 turns it off
                             #   0 turns it off
                             #   1 turns it on, becomes 2nd console when connected
                             #   2 turns it on, no 2nd console
                             #   3 turns it on in "send data" mode
                             #   4 turns it on in "echo data" mode
                             #  >4 turns it off
                                      # Phone number+prefix, assuming 508 548-2446 target
                                      # For a commercial card:   0015085482446
                                      # For a military card:   006975085482446
                                      # You should put YOUR number in autoexec.mi
sensor: c_iridium_phone_num(digits) 15085482446 #  WRC phone number !no spaces!
sensor: c_iridium_lead_zeros(nodim) 2 # number of leading zeros in phone number
                                      #   typically 2 for both commercial or military

    # How long to wait for modem to respond at various times

sensor: c_iridium_atok_timeout(sec)    30  # how long to wait for OK after AT
                                           # should be immediate if phone is attached
sensor: c_iridium_register(sec) 30 # minimum time for iridium to register after
                                   #  powerup. We do not try to dial for this many secs.
sensor: c_iridium_await_connect_max(mins) 5 # how long we will wait for a response
                                         #  after dialing the iridium phone number.
                                         #  When exceeded the iridium power is cycled.
                                         # Zero or negative means wait forever.

sensor: c_iridium_no_char_timeout(mins) 10  # How long to wait for a character at all other times
                                            # This is internally to clipped to never be less than 5 minutes
                                            # unless you are in lab_mode.  This is catch all to force an iridium
                                            # error (and a redial) if it ever gets "stuck"






sensor: c_iridium_power_on_delay(sec) 3 # min time between power on and sending AT
                                        # internally clipped to maximum of c_iridium_register secs
sensor: c_iridium_redial_delay(sec) 1 # delay time between redials. Values less than
                                      #  the cycle time (nominally two seconds)
                                      #  will delay till next cycle (i.e. 2 seconds)





sensor: c_iridium_time_til_callback(sec) 0.0 # Set this non-zero to have iridium
                                         # hang up and call back in that many seconds.
                                         # Call back is canceled if anyone sets C_IRIDUM_ON
sensor: u_iridium_max_time_til_callback(sec) 1800.0 # Maximum legal value for
                                                    # C_IRIDIUM_TIME_TIL_CALLBACK




sensor: c_iridium_redials_per_on_off(nodim) 1 # how often we cycle the iridium
                                        #  power when trying to connect. Min 1, Max 10.
sensor: c_iridium_cmd_echo(enum) 1 # 0 = do not echo modem commands; 1 = do echo



sensor: m_iridium_on(bool)       0.0  # out  0 it's off, 1 it's on
sensor: m_iridium_connected(bool) 0      # out  1==> modem is connected
sensor: m_iridium_console_on(enum) 0. # out. 0 = iridium console off, 1 = on
sensor: m_iridium_status(enum)  99.0  # out  MODEM_NO_CARRIER   = 0
                                      #      MODEM_OK,          = 1
                                      #      MODEM_CONNECT,     = 2
                                      #      MODEM_ERROR,       = 3
                                      #      MODEM_NO_ANSWER,   = 4
                                      #      MODEM_BUSY,        = 5
                                      #      MODEM_NO_DIALTONE, = 6
                                      #      LOGGING_IN         = 7
                                      #      LOGGED_ON          = 8
                                      #      MODEM_AWAITING_OK = 10,
                                      #      MODEM_AWAITING_CONNECTION, = 11
                                      #      MODEM_TIMEOUT,    = 12
                                      #      MODEM_UNKNOWN     = 99,
                                      #      NO_CHARS_TIMEOUT  = 100,
sensor: m_iridium_waiting_registration(bool)  # out, 1 ==> waiting for phone to register
sensor: m_iridium_waiting_redial_delay(bool)  # out, 1 ==> waiting to redial



sensor: m_iridium_redials(nodim)  0.0 # out, number of redials since phone was on
sensor: m_iridium_dialed_num(nodim) 0.0 # out, number of times phone was dialed
                                        #      incremented on every dial attempt
                                        #      it is never reset
sensor: m_iridium_call_num(nodim) 0.0 # out, is incremented on every connection,
                                      #      it is never reset




# science.c/science_super.c
sensor: c_science_on(bool) 1  # In, nonzero turns on science uart
                              #     0  off
                              #     1  on + log only errors
                              #     2  on + log successfully received variables
                              #           + log all transmitted lines
                              #     3  on _log all received chars
                              #           + log all transmitted lines
sensor: m_science_on(bool) 0  # Out, actual power state of science uart

sensor: sci_m_science_on(bool) 0           # In, set by science when powered on
                                           #     clr by science when safe to power off

sensor: c_science_all_on(secs)          2  # in, if enabled this value is set into the
                                           #     C_xxx_ON for all installed sensors on
                                           #     the science computer as detected by
                                           #     SCI_xxx_IS_INSTALLED on every cycle
sensor: c_science_all_on_enabled(bool)  1  # in, non-zero enables c_science_all_on

sensor: sci_software_ver(nodim)  0         # In, software version running on science

sensor: sci_reqd_heartbeat(secs) -1.0        # In.  How often each side must communicate
                                             #      over the clothesline
                                             # DISABLED, too many false alarms
sensor: m_science_sent_some_data(timestamp) 0 # Out, incremented when the glider pulls a character
                                              #      out of the clothesline buffer where chars received
                                              #      from science processor are stored.


sensor: u_science_max_power_off_time(s) 120  # In, how long to wait for sci_m_science_on
                                             #     to go low before giving up and yanking power
sensor: u_science_power_off_delay(s)   0.5 # In, how long to wait AFTER sci_m_science_on
                                           #     has gone to 0 before yanking power.  This
                                           #     gives science a little time to clean up

sensor: x_sci_cmd_mode_state(enum)  0      # out, state of science console state machine
                                           #      see science_cmd_execution.h, enum science_cmd_mode_t
sensor: u_sci_cmd_max_ack_wait_time(s) 60.0 # in, how long to wait for science to acknowdge request
                                            #     to go to command mode
sensor: u_sci_cmd_max_consci_time(s)   1200. # in, maximum time in consci

sensor: f_sci_max_input_process_time(msec) 200. # In, how long science driver can spend
                                                #     processing input lines from science
                                                #     on each call.  Set only to prevent
                                                #     science data from consuming all the
                                                #     glider cpu time.  Not really an issue
                                                #     with superscience, this replaces
                                                #     f_sci_max_sensors_per_call(nodim)

sensor: c_science_printout(nodim) 2  # How much science printout is seen
                                     # on the glider:
                                     #    0   none
                                     #    1   proglet _begin()/_end()
                                     #    2   proglet _start()/_stop()
                                     #    3   proglet _run

sensor: c_science_stress_on(sensors/sec) 0 # causes proglet to send SCI_GENERIC_A-Z
                                           # this many times/sec for diagnostic purposes


sensor: sci_m_present_time(sec)      0  # In, written by science on every cycle
                                        #     their notion of time
sensor: m_science_clothesline_lag(s) 0  # out, How far behind science is
                                        #      M_PRESENT_TIME - SCI_M_PRESENT_TIME

sensor: sci_m_free_heap(bytes)      -1  # In, written by science proglet house_elf
                                        # when it is started or stopped

sensor: f_sci_max_sensors_per_call(nodim)  2 # max. number of sensor lines
                                             # that glider will consume from
                                             # the clothesline before relinquishing
                                             # control.
                                             # see science.c/exchange_sensors_with_science()



sensor: sci_wants_surface(enum) 0 # In, requests from science computer
                                  #   0    science does not need to surface
                                  #   1    science wants to surface at next reasonable opportunity
                                  #   2    science wants to surface NOW!
sensor: sci_has_error(enum)     0 # In, t-> science has error condition
sensor: sci_has_warning(enum)   0 # In, t-> science has warning
sensor: sci_has_oddity(enum)    0 # In, t-> science has oddity
sensor: sci_wants_comms(bool)   0 # In, t-> science computer wants direct comms
sensor: u_sci_max_comm_time(sec) 300 # In, max time that science can have direct comms

sensor: c_console_to_science(bool) 0 # Set by a behavior to switch the console
                                     # cleared by science driver when recognized
                                     #   >0 give science console
                                     #         1 science computer requested (CONS2SCI_VAL_SCIENCE)
                                     #         2 behavior Bconsci requested (CONS2SCI_VAL_BCONSCI)
                                     #   <0 take console back
                                     #   reset to 0 by driver


sensor: m_console_to_science(bool) 0 # out, set by science driver when science has console

             # CTD data measured by Science. Updates m_water_cond, m_water_temp, & m_water_pressure
sensor: sci_ctd_is_installed(bool) 0 # in, t--> ctd installed on science
                                     #
  sensor: sci_ctd41_is_installed(bool)   0 # in, t--> ctd installed on science
  sensor: sci_ctd41cp_is_installed(bool) 0 # in, t--> ctd installed on science
  sensor: sci_ctd41cp_sim_is_installed(bool) 0 # in, t--> ctd being simulated on science computer

sensor: sci_water_cond(S/m) 3        # out, conductivity
sensor: sci_water_temp(degC) 10      # out
sensor: sci_water_pressure(bar) 0    # out

sensor: sci_generic_a(nodim)    0 # unspecified variables for science to use
sensor: sci_generic_b(nodim)    0
sensor: sci_generic_c(nodim)    0
sensor: sci_generic_d(nodim)    0
sensor: sci_generic_e(nodim)    0
sensor: sci_generic_f(nodim)    0
sensor: sci_generic_g(nodim)    0
sensor: sci_generic_h(nodim)    0
sensor: sci_generic_i(nodim)    0
sensor: sci_generic_j(nodim)    0
sensor: sci_generic_k(nodim)    0
sensor: sci_generic_l(nodim)    0
sensor: sci_generic_m(nodim)    0
sensor: sci_generic_n(nodim)    0
sensor: sci_generic_o(nodim)    0
sensor: sci_generic_p(nodim)    0
sensor: sci_generic_q(nodim)    0
sensor: sci_generic_r(nodim)    0
sensor: sci_generic_s(nodim)    0
sensor: sci_generic_t(nodim)    0
sensor: sci_generic_u(nodim)    0
sensor: sci_generic_v(nodim)    0
sensor: sci_generic_w(nodim)    0
sensor: sci_generic_x(nodim)    0
sensor: sci_generic_y(nodim)    0
sensor: sci_generic_z(nodim)    0

                                       # For testing connectivity
sensor: x_ping_glider_to_sci(nodim) 0   # Out, science driver increments this each cycle
                                        #      and can be sent to science for testing
sensor: sci_ping_sci_to_glider(nodim) 0 # In, science can send this to us if its copy
                                        #     does not match recvd version of x_ping_glider_to_sci

        # legacy sensor for Benthos Acoustic Modem amconnect.RUN
sensor: c_acoustic_modem_target_id(enum) 0 # Out, the address of the remote modem
                                   #  (typically a deck unit) being called. Used by
                                   #   the science program amconnct. min 0, max 31.

        # sensors for Benthos Acoustic Modem (bam) proglet

sensor: c_bam_on(sec)                0 # >0 secs between run cycles, <0 off,
                                       # 0 = fast as possible
sensor: c_bam_mode(enum)             0 # 0: command mode
                                       # 1: data collect mode
sensor: c_bam_target_id(enum) 1 # The address of the remote host modem being
                                # called (typically a deck unit, min 0, max 31).
sensor: c_bam_update_secs(sec)     120 # how often to transmit location and depth,
                                         # <0 => don't transmit location and depth
                                         # minimum value = c_bam_cmd_parse(sec) *
                                         #     (c_bam_number_of_echos(nodim) + 1)
sensor: c_bam_inactivity_secs(sec)  60 # how long the modem must be quiet before
                                         # location is broadcast
sensor: c_bam_cmd_parse_secs(sec)    5 # How often to check command input buffer
sensor: c_bam_number_of_echos(nodim) 3 # Number of times to echo commands
sensor: c_bam_chars_to_get_before_surfacing(nodim) 1000 # how many chars to collect
                                                   # in modmdata.dat before
                                                   # surfacing, <0 => don't
                                                   # collect any data
sensor: c_bam_datacol_report_secs(sec) 10 # How often to send bam_datacol
                                          # output sensors to glider
                                          # (xx_rcvd_chars_xx)

sensor: sci_bam_is_installed(bool)    # true -> proglet is installed
sensor: sci_bam_science_on(bool)      # false -> exit supersci app
                                      # maps to c_science_on
sensor: sci_bam_rcvd_chars_since_last_report(nodim)   # num of chars heard in last 10 seconds
sensor: sci_bam_rcvd_chars_since_last_surfacing(nodim) # num of chars heard since last surfacing

    # HydroScat2 sensors
sensor: c_hs2_on(sec)        0 # in, sets seconds between hs2 measurements
                               #  < 0 stops hs2 data collection
                               #  >=0 values are forced to be between 2 and 10 inclusive.
sensor: sci_hs2_is_installed(bool) 0 # in, t--> installed on science
sensor: sci_hs2_1bb(nodim)   0 # out, "bb"  backscatter for hs2 channel 1
sensor: sci_hs2_1bbu(nodim)  0 #      "bbu" backscatter for hs2 channel 1
sensor: sci_hs2_2bb(nodim)   0 #      "bb"  backscatter for hs2 channel 2
sensor: sci_hs2_2bbu(nodim)  0 #      "bbu" backscatter for hs2 channel 2
sensor: sci_hs2_3bb(nodim)   0 #      "bb"  backscatter for hs2 channel 3
sensor: sci_hs2_3bbu(nodim)  0 #      "bbu" backscatter for hs2 channel 3

    # proglet bb2f: wet labs bb2f fluorometer / backscatter sensor
sensor: c_bb2f_on(sec)       0 # in, sets secs between measurements
                               # <0 stops, 0 fast as possible, >0 that many secs
sensor: sci_bb2f_is_installed(bool) 0 # in, t--> installed on science

sensor: c_bb2f_num_fields_to_send(nodim)   7   # in, number of columns to send on each
                                               #    measurement, fields to send chosen
                                               #    by order in the list below

                     # output sensors, listed in PRIORITY order
                     # e.g. if c_bb2f_num_fields_to_send is 3, cols 3,5,6 sent
sensor: sci_bb2f_b470(nodim)     0   # col 3, blue scatter
sensor: sci_bb2f_b700(nodim)     0   # col 5, red scatter
sensor: sci_bb2f_fluor(nodim)    0   # col 6, fluorescence
sensor: sci_bb2f_therm(nodim)    0   # col 7, thermistor
sensor: sci_bb2f_b470_ref(nodim) 0   # col 2, blue ref
sensor: sci_bb2f_b700_ref(nodim) 0   # col 4, red ref
sensor: sci_bb2f_counter(nodim)  0   # col 1, counter (resets to zero at each power-up)


    # proglet bb2c: Wetlabs no clue what name is or data means
sensor: c_bb2c_on(sec)  2 # in, sets secs between measurements
                          # <0 stops, 0 fast as possible, >0 that many secs
sensor: sci_bb2c_is_installed(bool) 0 # in, t--> installed on science

sensor: u_bb2c_is_calibrated(bool) 0 # false, assume not calibrated

# for deriving bb2c engineering units, these should be tailered for each
# glider with this device in the science bay (these are defaults for RU04)
sensor: u_bb2c_beta532_factor(Mnodim) 7.494  # really 0.000007494 (see Mnodim doco above)
sensor: u_bb2c_beta660_factor(Mnodim) 1.8    # really 0.0000018     "    "     "     "
sensor: u_bb2c_beta532_offset(nodim)  55.37  # offset for eng unit conversion
sensor: u_bb2c_beta660_offset(nodim)  55.0   #  "    "           "        "

sensor: c_bb2c_num_fields_to_send(nodim)  9 # in, number of columns to send on each
                                            #    measurement, fields to send chosen
                                            #    by order in the list below
                     # output sensors, listed in PRIORITY order
                     # Note: date(col1) and time(col2) fields tossed
sensor: sci_bb2c_beta532_eng_units(nodim) 0 # derived from col 4
sensor: sci_bb2c_beta660_eng_units(nodim) 0 # derived from col 6
sensor: sci_bb2c_beta532(nodim)           0 # col 4
sensor: sci_bb2c_beta660(nodim)           0 # col 6
sensor: sci_bb2c_cdom(nodim)              0 # col 8
sensor: sci_bb2c_ref1(nodim)              0 # col 3
sensor: sci_bb2c_ref2(nodim)              0 # col 5
sensor: sci_bb2c_ref3(nodim)              0 # col 7
sensor: sci_bb2c_temp(nodim)              0 # col 9


   # proglet bb2lss, wetlabs Light Scatter Sensor
sensor: c_bb2lss_on(sec)  2 # in, sets secs between measurements
                           # <0 stops, 0 fast as possible, >0 that many secs
sensor: sci_bb2lss_is_installed(bool) 0 # in, t--> installed on science

sensor: u_bb2lss_is_calibrated(bool) 0 # false, assume not calibrated

# for deriving bb2lss engineering units, these should be tailered for each
# glider with this device in the science bay (these are defaults for RU04)
sensor: u_bb2lss_beta880_factor(Mnodim) 2.664  # really 0.000002664 (see Mnodim doco above)
sensor: u_bb2lss_beta880_offset(nodim)  52.97  # offset for eng unit conversion

sensor: c_bb2lss_num_fields_to_send(nodim)  6 # in, number of columns to send on each
                                              #    measurement, fields to send chosen
                                              #    by order in the list below
                     # output sensors, listed in PRIORITY order
                     # Note: date(col1) and time(col2) fields tossed
sensor: sci_bb2lss_beta880_eng_units(nodim) 0 # derived from col4
sensor: sci_bb2lss_beta880(nodim)           0 # col4
sensor: sci_bb2lss_lss(nodim)               0 # col6
sensor: sci_bb2lss_ref1(nodim)              0 # col3
sensor: sci_bb2lss_ref2(nodim)              0 # col5
sensor: sci_bb2lss_temp(nodim)              0 # col7


  #proglet sam:  Wetlabs: Scattering Attenuation Meter
sensor: c_sam_on(sec)  2 # in, sets secs between measurements
                         # <0 stops, 0 fast as possible, >0 that many secs
sensor: sci_sam_is_installed(bool) 0 # in, t--> installed on science

sensor: u_sam_is_calibrated(bool) 0 # false, assume not calibrated

# sensor specific calibration constants
sensor: u_sam_do1(nodim)            68.0   #  for deriving engineering units
sensor: u_sam_do2(nodim)            85.0   #  "    "           "        "
sensor: u_sam_exp1coeff(nodim)       0.055 #  "    "           "        "
sensor: u_sam_exp2coeff(nodim)       4.448 #  "    "           "        "
sensor: u_sam_offset(nodim)          7.0   #  "    "           "        "
sensor: u_sam_eff_pathlength(nodim)  0.104 #  "    "           "        "
sensor: u_sam_a(nodim)              10.0   #  "    "           "        "
sensor: u_sam_transition_val(nodim)  1.8   #  "    "           "        "
sensor: u_sam_median_window(nodim)  10     # valid range 1-15 (for eng units)

sensor: c_sam_num_fields_to_send(nodim)  9 # in, number of columns to send on each
                                           #    measurement, fields to send chosen
                                           #    by order in the list below
                     # output sensors, listed in PRIORITY order
sensor: sci_sam_c_mix(nodim)           0 # engineering unit1, derived from cols 2 and 3
sensor: sci_sam_vis(nodim)             0 # engineering unit2, derived from cols 2 and 3
sensor: sci_sam_filter_age(sec)        0 # age of oldest sample in median window
sensor: sci_sam_s1_filtered(nodim)     0 # median filtered version of sci_sam_s1
sensor: sci_sam_s2_filtered(nodim)     0 # median filtered version of sci_sam_s2
sensor: sci_sam_s1(nodim)              0 # col 2
sensor: sci_sam_s2(nodim)              0 # col 3
sensor: sci_sam_ref(nodim)             0 # col 1
sensor: sci_sam_temp(nodim)            0 # col 4


    # proglet whpar: WHOI Photosynthetic Active Radiation
sensor: c_whpar_on(sec)       0 # in, sets secs between measurements
                               # <0 stops, 0 fast as possible, >0 that many secs
sensor: sci_whpar_is_installed(bool) 0 # in, t--> installed on science

sensor: c_whpar_num_fields_to_send(nodim)  6   # in, number of columns to send on each
                                               #    measurement, fields to send chosen
                                               #    by order in the list below

                     # output sensors, listed in PRIORITY order
                     # e.g. if c_whpar_num_fields_to_send is 2, par and voltage sent
sensor: sci_whpar_par(nodim)     0 # col 2, Primary PAR
sensor: sci_whpar_ref(nodim)     0 # col 3, Second PAR or reference
sensor: sci_whpar_therm(nodim)   0 # col 4, Temperature
sensor: sci_whpar_volt(nodim)    0 # col 5, Voltage
sensor: sci_whpar_counter(nodim) 0 # col 1, Frame counter
sensor: sci_whpar_spare(nodim)   0 # col 6, Spare

    # proglet whgpbm: WHOI Photosynthetic Active Radiation
sensor: c_whgpbm_on(sec)       0 # in, sets secs between measurements
                               # <0 stops, 0 fast as possible, >0 that many secs
sensor: sci_whgpbm_is_installed(bool) 0 # in, t--> installed on science

sensor: c_whgpbm_num_fields_to_send(nodim)  7   # in, number of columns to send on each
                                                #    measurement, fields to send chosen
                                                #    by order in the list below

                     # output sensors, listed in PRIORITY order
                     # e.g. if c_whgpbm_num_fields_to_send is 2, par and bio are sent
sensor: sci_whgpbm_par(nodim)           0 # col 3, PPPPP
sensor: sci_whgpbm_biolumin(nodim)      0 # col 2, BBBBB
sensor: sci_whgpbm_interval(nodim)      0 # col 7, RR
sensor: sci_whgpbm_volt_excite(nodim)   0 # col 4, LLLL
sensor: sci_whgpbm_volt_left(nodim)     0 # col 5, QQQQ
sensor: sci_whgpbm_volt_bat(nodim)      0 # col 6, VVVV
sensor: sci_whgpbm_counter(nodim)       0 # col 1, CCCC


    # proglet whfctd: WHoi Fast CTD
sensor: c_whfctd_on(sec)  10.0 # in, sets secs between measurements
                               # <0 stops, 0 fast as possible, >0 that many secs

sensor: c_whfctd_num_fields_to_send(nodim) 8
sensor: c_whfctd_num_fields_to_send(nodim) 8
            # in, number of columns to send on each measurement,
            # fields to send chosen by order in the list above

sensor: sci_whfctd_is_installed(bool) 0 # in, t--> installed on science

sensor: sci_whfctd_ref_hi(nodim)     0 # col 1, AAAAAAAA
sensor: sci_whfctd_ref_mid(nodim)    0 # col 2, BBBBBBB
sensor: sci_whfctd_ref_lo(nodim)     0 # col 3, CCCCCC
sensor: sci_whfctd_raw_temp(nodim)   0 # col 4, DDDDDDD
sensor: sci_whfctd_raw_con1(nodim)   0 # col 5, EEEEEE
sensor: sci_whfctd_raw_con2(nodim)   0 # col 6, FFFFFFF
sensor: sci_whfctd_raw_pres(nodim)   0 # col 7, GGGGGG
sensor: sci_whfctd_elap_time(nodim)  0 # col 8, HHHHH


    # Mote Marine Lab Optical Phytoplankton Detector (BrevBuster)
    # last modified: 24 May-05 jhillier@mote.org
sensor: c_motebb_on(sec)               0 #
sensor: sci_motebb_is_installed(bool)  0 #  installed on science
sensor: sci_motebb_sn(nodim)           0 #
sensor: sci_motebb_status(nodim)       0 #
sensor: sci_motebb_volt(nodim)         0 #
sensor: sci_motebb_press(nodim)        0 #
sensor: sci_motebb_cdomref(nodim)      0 #
sensor: sci_motebb_int_time(nodim)     0 #
sensor: sci_motebb_start_time(nodim)   0 #
sensor: sci_motebb_stop_time(nodim)    0 #
sensor: sci_motebb_absorb_a(nodim)     0 #
sensor: sci_motebb_absorb_b(nodim)     0 #
sensor: sci_motebb_corr0(nodim)        0 #
sensor: sci_motebb_cell0(nodim)        0 #
sensor: sci_motebb_corr1(nodim)        0 #
sensor: sci_motebb_cell1(nodim)        0 #
sensor: sci_motebb_corr2(nodim)        0 #
sensor: sci_motebb_cell2(nodim)        0 #
sensor: sci_motebb_corr3(nodim)        0 #
sensor: sci_motebb_cell3(nodim)        0 #
sensor: sci_motebb_corr4(nodim)        0 #
sensor: sci_motebb_cell4(nodim)        0 #
sensor: sci_motebb_corr5(nodim)        0 #
sensor: sci_motebb_cell5(nodim)        0 #


# proglet hydrophone
sensor: c_hydrophone_on(sec)            -1.0 # positive or zero turns it on and starts sampling sequence
sensor: c_hydrophone_pre_delay(sec)     15.0 # delay between proglet start and sample start
sensor: c_hydrophone_post_delay(sec)    30.0 # delay between sample done and starting over
sensor: c_hydrophone_duration(sec)      30.0 # how long a measurement
sensor: c_hydrophone_gain(nodim)         3.0 # 0-7
sensor: c_hydrophone_num_channels(nodim) 1.0 # 1-4
sensor: c_hydrophone_sample_rate(Hz)  5000.0 # 1000-5000, how fast to AD
sensor: c_hydrophone_drive_num(nodim)    3.0 # 2->C:, 3:->D: etc
sensor: c_hydrophone_pre_pings(nodim)    1.0 # number of pings before sample
sensor: c_hydrophone_post_pings(nodim)   2.0 # number of pings after sample

sensor: sci_hydrophone_is_installed(bool) 0.0 # T-> if proglet installed
sensor: sci_hydrophone_collecting(nodim)  0.0 # set during collection to sample#, DDHHMM
                                              # sample as filename, less two alpha chars
                                              # which encode year and month

# proglet hard_disk
sensor: sci_hard_disk_is_installed(bool)  0.0  # true means installed


# proglet bbfl2s: wet labs bbfl2slo fluorometer / backscatter sensor

sensor: c_bbfl2s_on(sec)        2 # in, sets secs between measurements
                                  # <0 stops, 0 fast as possible, >0 that many secs

sensor: sci_bbfl2s_is_installed(bool) 0 # in, t--> installed on science

sensor: c_bbfl2s_num_fields_to_send(nodim)   10 # in, number of columns to send on each
                                                #    measurement, fields to send chosen
                                                #    by order in the list below

sensor: u_bbfl2s_is_calibrated(bool) 0 # false, assume not calibrated

# sensor specific input calibration constants (defaults for BBFL2SLO-234)
sensor: u_bbfl2s_bb_cwo(nodim)       55  # clean water offset, nodim == counts
sensor: u_bbfl2s_chlor_cwo(nodim)    56  # clean water offset, nodim == counts
sensor: u_bbfl2s_cdom_cwo(nodim)     54  # clean water offset, nodim == counts
sensor: u_bbfl2s_bb_sf(Mnodim)        2.47   # scale factor (0.00000247)
sensor: u_bbfl2s_chlor_sf(ug/l/nodim) 0.0125 # scale factor to get units
sensor: u_bbfl2s_cdom_sf(ppb/nodim)   0.0979 # scale factor to get units

                     # output sensors, listed in PRIORITY order
                     # e.g. if c_bbfl2s_num_fields_to_send is 3, cols derived
                     # from 4,6,8 sent
sensor: sci_bbfl2s_bb_scaled(nodim)     0   # derived from col 4
sensor: sci_bbfl2s_chlor_scaled(ug/l)   0   # derived from col 6
sensor: sci_bbfl2s_cdom_scaled(ppb)     0   # derived from col 8
sensor: sci_bbfl2s_bb_sig(nodim)        0   # col 4
sensor: sci_bbfl2s_chlor_sig(nodim)     0   # col 6
sensor: sci_bbfl2s_cdom_sig(nodim)      0   # col 8
sensor: sci_bbfl2s_bb_ref(nodim)        0   # col 3
sensor: sci_bbfl2s_chlor_ref(nodim)     0   # col 5
sensor: sci_bbfl2s_cdom_ref(nodim)      0   # col 7
sensor: sci_bbfl2s_temp(nodim)          0   # col 9


# proglet fl3slo: wet labs fl3slo fluorometer triplet sensor
sensor: c_fl3slo_on(sec)       2 # in, sets secs between measurements
                                 # <0 stops, 0 fast as possible, >0 that many secs
sensor: sci_fl3slo_is_installed(bool) 0 # in, t--> installed on science

sensor: c_fl3slo_num_fields_to_send(nodim) 10 # in, number of columns to send on each
                                              # measurement, fields to send chosen
                                              # by order in the list below

sensor: u_fl3slo_is_calibrated(bool) 0 # false, assume not calibrated

# sensor specific input calibration constants (defaults for FL3-341)
sensor: u_fl3slo_chlor_cwo(nodim)      55 # clean water offset, nodim == counts
sensor: u_fl3slo_phyco_cwo(nodim)      55 # clean water offset, nodim == counts
sensor: u_fl3slo_cdom_cwo(nodim)       55 # clean water offset, nodim == counts
sensor: u_fl3slo_chlor_sf(ug/l/nodim)  0.0126 # scale factor to get units
sensor: u_fl3slo_phyco_sf(ppb/l/nodim) 0.0459 # scale factor to get units
sensor: u_fl3slo_cdom_sf(ppb/l/nodim)  0.0984 # scale factor to get units

                     # output sensors, listed in PRIORITY order
                     # e.g. if c_fl3slo_num_fields_to_send is 3, cols derived
                     # from 4,6,8 sent
sensor: sci_fl3slo_chlor_units(ug/l) 0   # derived from col 4
sensor: sci_fl3slo_phyco_units(ppb)  0   # derived from col 6
sensor: sci_fl3slo_cdom_units(QSDE)  0   # derived from col 8
sensor: sci_fl3slo_chlor_sig(nodim)  0   # col 4
sensor: sci_fl3slo_phyco_sig(nodim)  0   # col 6
sensor: sci_fl3slo_cdom_sig(nodim)   0   # col 8
sensor: sci_fl3slo_chlor_ref(nodim)  0   # col 3
sensor: sci_fl3slo_phyco_ref(nodim)  0   # col 5
sensor: sci_fl3slo_cdom_ref(nodim)   0   # col 7
sensor: sci_fl3slo_temp(nodim)       0   # col 9


# proglet bb3slo: wet labs bb3slo backscatter triplet sensor
sensor: c_bb3slo_on(sec)       2 # in, sets secs between measurements
                                 # <0 stops, 0 fast as possible, >0 that many secs
sensor: sci_bb3slo_is_installed(bool) 0 # in, t--> installed on science

sensor: c_bb3slo_num_fields_to_send(nodim) 10 # in, number of columns to send on each
                                              # measurement, fields to send chosen
                                              # by order in the list below

sensor: u_bb3slo_is_calibrated(bool) 0 # false, assume not calibrated

# sensor specific input calibration constants (defaults for BB3SLO-207)
sensor: u_bb3slo_b470_do(nodim)   51     # dark offset, nodim == counts
sensor: u_bb3slo_b532_do(nodim)   51     # dark offset, nodim == counts
sensor: u_bb3slo_b660_do(nodim)  114     # dark offset, nodim == counts
sensor: u_bb3slo_b470_sf(Mnodim)   0.117 # scale factor (0.000000117)
sensor: u_bb3slo_b532_sf(Mnodim)   8.17  # scale factor (0.00000817)
sensor: u_bb3slo_b660_sf(Mnodim)   3.85  # scale factor (0.00000385)

# output sensors, listed in PRIORITY order
# e.g. if c_bb3slo_num_fields_to_send is 3, cols derived from 4,6,8 sent
sensor: sci_bb3slo_b470_scaled(nodim) 0   # from col 4, blue
sensor: sci_bb3slo_b532_scaled(nodim) 0   # from col 6, green
sensor: sci_bb3slo_b660_scaled(nodim) 0   # from col 8, red
sensor: sci_bb3slo_b470_sig(nodim)    0   # col 4, blue
sensor: sci_bb3slo_b532_sig(nodim)    0   # col 6, green
sensor: sci_bb3slo_b660_sig(nodim)    0   # col 8, red
sensor: sci_bb3slo_b470_ref(nodim)    0   # col 3, blue
sensor: sci_bb3slo_b532_ref(nodim)    0   # col 5, green
sensor: sci_bb3slo_b660_ref(nodim)    0   # col 7, red
sensor: sci_bb3slo_temp(nodim)        0   # col 9


# proglet oxy3835: Aanderaa Oxygen Optode 3835
sensor: c_oxy3835_on(sec)       2 # in, sets secs between measurements
                               # <0 stops, 0 fast as possible, >0 that many secs
sensor: sci_oxy3835_is_installed(bool) 0 # in, t--> installed on science

sensor: c_oxy3835_num_fields_to_send(nodim)   3   # in, number of columns to send on each
                                               #    measurement, fields to send chosen
                                               #    by order in the list below

                     # output sensors, listed in PRIORITY order
                     # e.g. if c_oxy3835_num_fields_to_send is 3, cols 3,4,5 sent
sensor: sci_oxy3835_oxygen(nodim)     0   # col 3, oxygen
sensor: sci_oxy3835_saturation(nodim) 0   # col 4, saturation
sensor: sci_oxy3835_temp(nodim)       0   # col 5, temperature


# proglet viper: DMA Viper Processor
sensor: c_viper_on(sec)                      -1.0 # positive or zero turns it on and starts sampling sequence
sensor: c_viper_turn_on_timeout(sec)        120.0 # max wait time for viper to power on
sensor: c_viper_collect_timeout(sec)        200.0 # max wait time for viper to collect/analyse acoustic data
sensor: c_viper_reset_timeout(sec)           60.0 # max wait time for viper to respond to reset gain command
sensor: c_viper_start_sampling_timeout(sec)  60.0 # max wait time for viper to respond to start sampling command
sensor: c_viper_detection_done_timeout(sec)  60.0 # max wait time for viper to respond to detection done command
sensor: c_viper_turn_off_timeout(sec)       120.0 # max wait time for viper to power off
sensor: c_viper_gain(nodim)                   3.0 # 0-7 gain sent to viper
sensor: c_viper_max_sample_starts(nodim)      3.0 # max allowable attempts to obtain a definitive detection
sensor: c_viper_max_errors(nodim)             3.0 # max number of viper errors before mission abort

sensor: sci_viper_power_on(bool)     0 # power state of the Viper, true -> on
sensor: sci_viper_error(nodim)       0 # unique number for each error sequence
sensor: sci_viper_target(enum)       0 # target priority returned by Viper
sensor: sci_viper_collect_time(sec)  0 # data collection time returned by Viper
sensor: sci_viper_is_installed(bool) 0.0 # T-> if proglet installed
sensor: sci_viper_finished(bool)     0.0 # T-> viper is ready to be powered down
sensor: sci_viper_collecting(bool)   0.0 # T-> viper is doing it's thing, comatose time


# proglet ocr504R: Satlantic OCR-504 Radiance configuration

#Inputs
sensor: c_ocr504R_on(sec)  0    # sets secs between how often data is sent
                                # <0 stops, 0 fast as possible, 0> that many secs

sensor: u_ocr504R_is_calibrated(bool)  0 # needs to be set in autoexec.mi

# sensor specific calibration constants (defaults for S/N 004)

sensor: u_ocr504R_dark_counts_c1(nodim) 2147326431.3 # dark offset for channel 1
sensor: u_ocr504R_cal_coeff_c1(Tnodim) 29310.139102  # calibration factor for channel 1
sensor: u_ocr504R_immersion_coeff_c1(nodim) 1.758    # immersion factor for channel 1

sensor: u_ocr504R_dark_counts_c2(nodim) 2147357165.1 # dark offset for channel 2
sensor: u_ocr504R_cal_coeff_c2(Tnodim)  33825.794480 # calibration factor for channel 2
sensor: u_ocr504R_immersion_coeff_c2(nodim) 1.752    # immersion factor for channel 2

sensor: u_ocr504R_dark_counts_c3(nodim) 2147621476.7 # dark offset for channel 3
sensor: u_ocr504R_cal_coeff_c3(Tnodim)  29314.178969 # calibration factor for channel 3
sensor: u_ocr504R_immersion_coeff_c3(nodim) 1.746    # immersion factor for channel 3

sensor: u_ocr504R_dark_counts_c4(nodim) 2147499550.4 # dark offset for channel 4
sensor: u_ocr504R_cal_coeff_c4(Tnodim)  18677.199017 # calibration factor for channel 4
sensor: u_ocr504R_immersion_coeff_c4(nodim) 1.739    # immersion factor for channel 4

sensor: u_ocr504R_Vin_a0(nodim) 0.0  # polynomial coefficient to scale Vin
sensor: u_ocr504R_Vin_a1(nodim) 0.03 # polynomial coefficient to scale Vin

sensor: u_ocr504R_itemp_a0(nodim) -50.0 # polynomial coefficient to scale itemp
sensor: u_ocr504R_itemp_a1(nodim)   0.5 # polynomial coefficient to scale itemp

sensor: c_ocr504R_num_fields_to_send(nodim) 16
                        # number of columns to send on each
                        # measurement, fields to send chosen
                        # by order in the list below

sensor: sci_ocr504R_is_installed(bool) 0 # in, t--> installed on science

#Outputs, in order of priority:
sensor: sci_ocr504R_rad1(uW/cm^2/nm) # from channel1
sensor: sci_ocr504R_rad2(uW/cm^2/nm) # from channel2
sensor: sci_ocr504R_rad3(uW/cm^2/nm) # from channel3
sensor: sci_ocr504R_rad4(uW/cm^2/nm) # from channel4
sensor: sci_ocr504R_itemp(Celsius)   # internal temperature of instrument
sensor: sci_ocr504R_Vin(volts)       # regulated input voltage
sensor: sci_ocr504R_fcount(nodim)    # 0-255, count of frame transmitted
sensor: sci_ocr504R_channel1(nodim)  # raw counts from discrete optical waveband 1
sensor: sci_ocr504R_channel2(nodim)  # raw counts from discrete optical waveband 2
sensor: sci_ocr504R_channel3(nodim)  # raw counts from discrete optical waveband 3
sensor: sci_ocr504R_channel4(nodim)  # raw counts from discrete optical waveband 4
sensor: sci_ocr504R_itemp_raw(nodim) # raw pre-scaled temperature
sensor: sci_ocr504R_Vin_raw(nodim)   # raw pre-scaled regulated input voltage
sensor: sci_ocr504R_timer(sec)       # seconds since initialization (power-on)
sensor: sci_ocr504R_delay(msec)      # milliseconds offset to timer for
                                     # accurate indication of when frame's sensors
                                     # were sampled
sensor: sci_ocr504R_cksum(nodim)     # data integrity sensor, checksum on frame


# proglet ocr504I: Satlantic OCR-504 Irradiance configuration

#Inputs
sensor: c_ocr504I_on(sec)   0   # sets secs between how often data is sent
                                # <0 stops, 0 fast as possible, 0> that many secs

sensor: u_ocr504I_is_calibrated(bool)  0 # needs to be set in autoexec.mi

# sensor specific calibration constants (defaults for S/N 089)

sensor: u_ocr504I_dark_counts_c1(nodim) 2147679780.3 # dark offset for channel 1
sensor: u_ocr504I_cal_coeff_c1(Tnodim) 1636922.3650  # calibration factor for channel 1
sensor: u_ocr504I_immersion_coeff_c1(nodim) 1.368    # immersion factor for channel 1

sensor: u_ocr504I_dark_counts_c2(nodim) 2147446582.0 # dark offset for channel 2
sensor: u_ocr504I_cal_coeff_c2(Tnodim) 1940758.5765  # calibration factor for channel 2
sensor: u_ocr504I_immersion_coeff_c2(nodim) 1.410    # immersion factor for channel 2

sensor: u_ocr504I_dark_counts_c3(nodim) 2147390884.4 # dark offset for channel 3
sensor: u_ocr504I_cal_coeff_c3(Tnodim) 2286152.2061  # calibration factor for channel 3
sensor: u_ocr504I_immersion_coeff_c3(nodim) 1.365    # immersion factor for channel 3

sensor: u_ocr504I_dark_counts_c4(nodim) 2147443303.2 # dark offset for channel 4
sensor: u_ocr504I_cal_coeff_c4(Tnodim) 1804514.9462  # calibration factor for channel 4
sensor: u_ocr504I_immersion_coeff_c4(nodim) 1.372    # immersion factor for channel 4

sensor: u_ocr504I_Vin_a0(nodim) 0.0  # polynomial coefficient to scale Vin
sensor: u_ocr504I_Vin_a1(nodim) 0.03 # polynomial coefficient to scale Vin

sensor: u_ocr504I_itemp_a0(nodim) -50.0 # polynomial coefficient to scale itemp
sensor: u_ocr504I_itemp_a1(nodim)   0.5 # polynomial coefficient to scale itemp



sensor: c_ocr504I_num_fields_to_send(nodim) 16
                        # number of columns to send on each
                        # measurement, fields to send chosen
                        # by order in the list below

sensor: sci_ocr504I_is_installed(bool) 0 # in, t--> installed on science

#Outputs, in order of priority:
sensor: sci_ocr504I_irrad1(uW/cm^2/nm) # from channel1
sensor: sci_ocr504I_irrad2(uW/cm^2/nm) # from channel2
sensor: sci_ocr504I_irrad3(uW/cm^2/nm) # from channel3
sensor: sci_ocr504I_irrad4(uW/cm^2/nm) # from channel4
sensor: sci_ocr504I_itemp(Celsius)     # internal temperature of instrument
sensor: sci_ocr504I_Vin(volts)         # regulated input voltage
sensor: sci_ocr504I_fcount(nodim)      # 0-255, count of frame transmitted
sensor: sci_ocr504I_channel1(nodim)    # raw counts from discrete optical waveband 1
sensor: sci_ocr504I_channel2(nodim)    # raw counts from discrete optical waveband 2
sensor: sci_ocr504I_channel3(nodim)    # raw counts from discrete optical waveband 3
sensor: sci_ocr504I_channel4(nodim)    # raw counts from discrete optical waveband 4
sensor: sci_ocr504I_itemp_raw(nodim)   # raw pre-scaled temperature
sensor: sci_ocr504I_Vin_raw(nodim)     # raw pre-scaled regulated input voltage
sensor: sci_ocr504I_timer(sec)         # seconds since initialization (power-on)
sensor: sci_ocr504I_delay(msec)        # milliseconds offset to timer for
                                       # accurate indication of when frame's sensors
                                       # were sampled
sensor: sci_ocr504I_cksum(nodim)       # data integrity sensor, checksum on frame

        # sensors for Benthos Acoustic Data Delivery (badd) proglet

#Inputs:

sensor: c_badd_on(sec)                    -1 # secs between run cycles
sensor: c_badd_mode(enum)                  0 # 0: search mode
                                             # 1: data collect mode
sensor: c_badd_target_id(enum)             0 # address of remote host modem being called
sensor: c_badd_range_secs(sec)            60 # how often to request range to remote mode
                                             # <0 => don't request range,
                                             # min value = c_badd_input_parse_secs(sec) * 2
sensor: c_badd_input_parse_secs(sec)      30 # How long to check command response
                                             # input buffer
sensor: c_badd_datacol_status_secs(sec)   30 # How often to check download status
sensor: c_badd_clear_remote_data(bool)     0 # 0: do NOT clear remote data after successful

#Outputs:

sensor: sci_badd_is_installed(bool)          # true -> proglet is installed
sensor: sci_badd_power_on(bool)              # power state of modem (true -> on)
sensor: sci_badd_error(enum)                 # unique number for each error type
sensor: sci_badd_remote_stored_bytes(nodim)  # number of stored bytes on remote modem
sensor: sci_badd_retrieved_bytes(nodim)      # number of bytes collected from remote modem
sensor: sci_badd_n_tries_to_connect(nodim)   # number of attempts to connect with target modem
sensor: sci_badd_target_range(m)             # response to range command
sensor: sci_badd_finished(bool)              # the proglet has finished

#  Add additional science proglets here


# console.c
sensor: c_console_on(bool)              2.0  # in  0 power it off
                                             #     1 power on automatically at surface
                                             #       power off automatically when underwater AND
                                             #       no carrier for U_CONSOLE_REQD_CD_OFF_TIME secs
                                             #     2 power on regardless

sensor: u_console_reqd_cd_off_time(sec)   15.0 # in, how long without CD before powering off
                                             #     modem if C_CONSOLE_ON == 1
sensor: m_console_on(bool)              1.0  # out, power state of RF modem
sensor: m_console_cd(bool)              1.0  # out, state of RF modem carrier detect

sensor: u_console_off_if_mission_iridium(bool) 1.0 # in, if non-zero causes the freewave
                                             # to be powered off during a mission if a
                                             # carrier isn't detected.

sensor: f_ignore_console_cd_time(sec)   5.0  # in, how long to "filter", i.e. ignore
                                             #     carrier detect after the freewave is
                                             #     just powered on.


sensor: m_chars_tossed_with_power_off(nodim) 0 # out, chars eaten with power off
sensor: m_chars_tossed_with_cd_off(nodim)    0 # out, chars eaten with CD off
sensor: m_chars_tossed_by_abend(nodim)       0 # out, chars eaten by abend
                                               #            this one maintained by behavior abend,
                                               #            listed here for completeness

sensor: u_console_announce_time(sec)  60    # controls how often glidername
                                            # is announced when M_CONSOLE_CD
                                            # <0 disables announcement
sensor: x_console_announcement_made(nodim) 0 # incremented whenever an announcement is made



# A variety of simulated variables.  These are all maintained by
# simdrvr.c.
    # Keep track of if simulating
sensor: x_are_simulating(enum)   0   # out
                                     # 0   not simulating
                                     # 3   on bench
                                     # 2   just electronics
                                     # 1   no electronics

sensor: s_hardware_ver(nodim)   128  # what no_electronics reports for X_HARDWARE_VER
                                     # RevE board.
                                     #  This is only read at startup, to change it,
                                     # you probably have to change it here
                                     # and recompile or store it as longterm sensor.
sensor: s_hardware_cop_jumper(bool) 0 # simulated jumper setting for no_electronics only
                                      # 0 2hr, 1 16hr

    # Configuration(environmental) controls
sensor: xs_water_depth(m) 30.0  # How deep the water is (COMPUTED! do not set directly)
                                # xs_water_depth = s_water_depth_avg -
                                #                 s_water_depth_delta *
                                #                 sin( 2PI * r / s_water_depth_wavelength)
                                # where r = current distance from (0,0) LMC
sensor: s_water_depth_avg(m)         30.0
sensor: s_water_depth_delta(m)        0.0
sensor: s_water_depth_wavelength(m) 100.0



sensor: s_water_cond(S/m)   4.0  # conductivity, How salty it is

sensor: xs_water_temp(degC) 00  # How warm water is, (COMPUTED! do not set directly)
  sensor: s_water_temp_surface(degc)   20.0   # temp above
  sensor: s_water_temp_depth_inft(m)    5.0   #      this depth (inflection top)

  sensor: s_water_temp_bottom(degc)     4.0   # temp below
  sensor: s_water_temp_depth_infb(m)  500.0   #      this depth (inflection bottom)
  # mnenonic: ....INF(T/B) stands for inflection top and inflection bottom.

        #XS_VEHICLE_TEMP = S_VEHICLE_TIME_TC * ( XS_WATER_TEMP - XS_VEHICLE_TEMP) * delta_t
sensor: xs_vehicle_temp(degC)  25.0   # How warm vehicle is
sensor: s_vehicle_temp_tc(1/sec) 0.01 #    tc ==> time constant
                                      #    See simdrvr.c do_xs_vehicle_temp() for derivation


sensor: s_wind_speed(m/s)      9.0  # how fast the wind is blowing, 3.0 ==> 5.4 knots
sensor: s_wind_direction(rad) 0.0  # Direction wind is blowing FROM

sensor: s_water_speed(m/s)      0.05     # Current speed,   0.5 ==> 1knot
sensor: s_water_direction(rad)  4.712    # direction current is going TO,
                                         # toward the west

sensor: s_mag_var(rad) 0.2810     # mag_heading = true_heading + mag_var
                                  #    mag_var>0 ==>  variation is West (like on cape cod)
                                  # This is cape cod number

sensor: xs_wax_temp(degC)         20    # temperature of working fluid
sensor: xs_wax_frac_frozen(nodim)  0    # what fraction of the fluid is frozen
sensor:  s_wax_freeze_temp(degC)  10    # where it freezes


    # combination config/working
    # Glider real world location
    # DO NOT CHANGE THESE SETTINGS
    # Users should PUT s_ini_lat or s_ini_lon to change
    # simulated glider location
sensor: xs_lat(deg)     4138.051  # Ashumet
sensor: xs_lon(deg)    -7032.124

    # Users should change these to move the simulated glider
    # position
sensor: s_ini_lat(deg)     69696969      # these are purposely set to
sensor: s_ini_lon(deg)     69696969      # unreasonable values

sensor: x_simulated_position_moved(bool) 0 # non-zero means user moved simulated position
                                           # flag between gps.c and simdrvr.c
                                           # to tell gps to skip moved too far check
                                           # set in simdrvr.c, cleared in gps.c

# deep electric observed oil pot voltage rate of change
sensor: s_de_oil_pot_volt_flux(volts/sec) 0.00625

    # working
sensor: x_simdrvr_ran(out)   0    # out, set to 1 on every simdrvr_ctrl() call
sensor: xs_battpos(in)        0    # simdrvr.c, do_glider_internals()
sensor: xs_battroll(rad)      0
sensor: xs_ballast_pumped(cc) 0
sensor: xs_fin(rad)           0

sensor: xs_roll(rad)          0   # simdrvr.c, do_glider_attitude()
sensor: xs_pitch(rad)         0

sensor: xs_depth(m)            0    # simdrvr.c, do_glider_depth()
sensor: xs_altitude(m)         0    #            how far above bottm
sensor: xs_vert_speed(m/s)     0    #            veh vert speed thru water

sensor: s_ocean_pressure_min(volts) 0.20 # used to generate voltage for 0 pressure
sensor: xs_pressure_drift(volts) 0  #            integrated pressure drift


sensor: xs_hdg_rate(rad/sec)    0

sensor: xs_heading(rad)       0
sensor: xs_speed(m/s)         0    # veh horz speed thru water

sensor: xs_vx_lmc(m/s) 0  # vehicle horizontal velocity OVER GROUND
sensor: xs_vy_lmc(m/s) 0

sensor: xs_x_lmc(m)  0     # vehicle position in Local Mission Coordinates
sensor: xs_y_lmc(m)  0     # (0,0) at mission start Y axis is magnetic north


    # These are set to 1 if bad data is generated for a device
sensor: s_corrupted_altitude(bool)          0  # altimeter
sensor: s_corrupted_gps(bool)               0  # The gps, valid or invalid
sensor: s_corrupted_gps_error(bool)         0  # The gps, error added to fix
sensor: s_corrupted_watchdog_oddity(bool)   0  # watchdog generated oddity
sensor: s_corrupted_bpump_stalled(bool)     0  # buoyancy pump "jammed"
sensor: s_corrupted_bpump_overheated(bool)  0  # buoyancy pump overheat bit went high
sensor: s_corrupted_pitch_stalled(bool)     0  # pitch motor "jammed"
sensor: s_corrupted_memory_leak(bool)       0  # We leaked some heap memory
sensor: s_corrupted_pressure_drift(bool)    0  # we generated a pressure drift
sensor: s_corrupted_pressure_spike(bool)    0  # we generated an ocean pressure spike
sensor: s_corrupted_oil_volume(bool)        0  # we generated an oil volume out-of-deadband


     # error metrics
sensor: xs_x_lmc_error(m)   0 # m_x/y_lmc - s_x/y_lmc
sensor: xs_y_lmc_error(m)   0
sensor: xs_speed_error(m/s) 0 #xs_speed_error = m_speed - xs_speed

# test_driver
sensor: u_test_driver_errors_per_min(nodim)   0.0 # Only for testing error handling
sensor: u_test_driver_warnings_per_min(nodim) 0.0 # Only for testing error handling
sensor: u_test_driver_oddities_per_min(nodim) 0.0 # Only for testing error handling

# DBD/SBD header control for header
sensor: u_dbd_sensor_list_xmit_control(enum)  1 # -1 = always transmit header, compatibility mode
                                                #         use for legacy shore side programs
                                                # 0  = always transmit header
                                                # 1  = transmit header on initial mission segment only
                                                # 2  = transmit header if THIS glider hasn't sent it before
                                                # 3  = never transmit header

# File system make-space pruning
sensor: u_reqd_disk_space(Mbytes)    10.0  # How much disk space do we want to keep free
                                           # as a minimum.  ~ 1 Mbyte/hour is generated
sensor: m_disk_usage(Mbytes)         0.0  # How much disk space is currently used
sensor: m_disk_free(Mbytes)          0.0  # How much disk space is currently free
sensor: x_disk_files_removed(nodim)  0    # Count of how many files pruned last time

# Send log files time requirement calculation
sensor: u_freewave_data_rate(KBps)   3.0  # Nominal data throughput on Freewave kilobytes per second
sensor: u_iridium_data_rate(KBps)    0.1  # Nominal data throughput on Iridium kilobytes per second

# Some documentation on b_args common to all behaviors
# NOTE: When you add these common b_args, put them at END of b_arg
#       list for behaviors.  They do not "naturally" belong there, but
#       it means you do not have to edit behaviors which typically have
#       hardwired b_arg positions in them

# NOTE: These are symbolically defined beh_args.h
# b_arg: START_WHEN     When the behavior should start, i.e. go from UNITIALIZED to ACTIVE
#    BAW_IMMEDIATELY    0   // immediately
#    BAW_STK_IDLE       1   // When stack is idle (nothing is being commanded)
#    BAW_PITCH_IDLE     2   // When pitch is idle(nothing is being commanded)
#    BAW_HEADING_IDLE   3   // When heading is idle(nothing is being commanded)
#    BAW_UPDWN_IDLE     4   // When bpump/threng is idle(nothing is being commanded)
#    BAW_NEVER          5   // Never stop
#    BAW_WHEN_SECS      6   // After behavior arg "when_secs", from prior END if cycling
#    BAW_WHEN_WPT_DIST  7   // When sensor(m_dist_to_wpt) < behavior arg "when_wpt_dist"
#    BAW_WHEN_HIT_WAYPOINT 8 // When X_HIT_A_WAYPOINT is set by goto_wpt behavior
#    BAW_EVERY_SECS     9   // After behavior arg "when_secs", from prior START if cycling
#    BAW_EVERY_SECS_UPDWN_IDLE 10  // After behavior arg "when_secs", from prior START AND
#                                  //       updown is idle, no one commanding vertical motion
#    BAW_SCI_SURFACE    11  // SCI_WANTS_SURFACE is non-zero
#    BAW_NOCOMM_SECS    12  // when have not had comms for WHEN_SECS secs
#    BAW_WHEN_UTC_TIME  13  // At a specific UTC time or UTC minute into the hour
#
# b_arg: STOP_WHEN
#   0   complete
#   1-N same as "start_when"




# ----- This is the start of a typical mission

behavior: abend
                                               # MS_ABORT_OVERDEPTH
    b_arg: overdepth(m)                10000.0 # <0 disables,
                                               # clipped to F_MAX_WORKING_DEPTH
    b_arg: overdepth_sample_time(sec)     60.0 # how often to check

                                               # MS_ABORT_OVERTIME
    b_arg: overtime(sec)                7200.0 # < 0 disables

                                               # MS_ABORT_UNDERVOLTS
    b_arg: undervolts(volts)              10.0 # < 0 disables
    b_arg: undervolts_sample_time(sec)    60.0 # how often to check

                                               # MS_ABORT_SAMEDEPTH
    b_arg: samedepth_for(sec)             1800.0 # <0 disables
    b_arg: samedepth_for_sample_time(sec) 1800.0 # how often to check

                                               # MS_ABORT_STALLED
    b_arg: stalled_for(sec)             1800.0 # <0 disables
    b_arg: stalled_for_sample_time(sec) 1800.0 # how often to check

                                               # MS_ABORT_NO_TICKLE
    b_arg: no_cop_tickle_for(sec)         6300.0 # secs, abort mission if watchdog
                                               # not tickled this often, <0 disables
    b_arg: no_cop_tickle_percent(%) 12.5       # 0-100, <0 disables
                                               # Abort this % of time before
                                               # hardware, i.e. for 12.5%
                                               #  hardware 2hr   15min before
                                               #          16hr    2hr  before
            # Note: no_cop_tickle_percento only used on RevE boards or later
            # If non-zero and hardware supports COP timeout readback...
            #            causes no_cop_tickle_for(sec) to be IGNORED
            # On old boards, no_cop_tickle_percent(%) is IGNORED and
            #       control reverts to no_cop_tickle_for(sec)

                                             # MS_ABORT_ENG_PRESSURE, thermal only
    b_arg: eng_pressure_mul(nodim)      1.10 # abort if M_THERMAL_ACC_PRES < eng_pressure_mul*M_PRESSURE
                                             # Must be > 1, make bigger to be safer
    b_arg: eng_pressure_sample_time(sec)  15.0 # how often to measure, <0 disables

    b_arg: max_wpt_distance(m)          3000 # MS_ABORT_WPT_TOOFAR
                                             # Maximum allowable distance to a waypoint
                                             # < 0 disables

    b_arg: chk_sensor_reasonableness(bool) 1 # MS_ABORT_UNREASONABLE_SETTINGS
                                             # 0 disables check

    b_arg: reqd_spare_heap(bytes)      30000  # MS_ABORT_NO_HEAP if M_SPARE_HEAP is less than this
                                              # <0 disables check
                                              ####################################################
                                              # NOTE - VALUE OF REQD_SPARE_HEAP IN LASTGASP.MI
                                              # SHOULD BE MAINTAINED LOWER THAN THIS NUMBER SO
                                              # IF A MISSION ABORTS WITH MS_ABORT_NO_HEAP AND WE
                                              # SEQUENCE TO LASTGASP.MI, THAT IN TURN WILL NOT
                                              # ITSELF LIKEWISE DO A HEAP ABORT
                                              ####################################################

    b_arg: leakdetect_sample_time(sec)  60.0  # MS_ABORT_LEAK, M_LEAK is non-zero
                                              # <0 disables check

    b_arg: vacuum_min(inHg)              4.0  # MS_ABORT_VACUUM, M_VACUUM out of limits
    b_arg: vacuum_max(inHg)             10.0
    b_arg: vacuum_sample_time(sec)     120.0  # <0 disables check
    b_arg: oil_volume_sample_time(sec) 180.0  # how often to measure, <0 disables check
    b_arg: max_allowable_busy_cpu_cycles(cycles) -1  # aborts if M_DEVICE_DRIVERS_CALLED_ABNORMALLY
                                                     # is true for this many cycles in a row
                                                     # <= 0 disables the abort
behavior: surface
    b_arg: args_from_file(enum) -1   # >= 0 enables reading from mafiles/surfac.ma

    b_arg: start_when(enum) 0     # See doco above
    b_arg: when_secs(sec)     180   # How long between surfacing, only if start_when==6,9, or 12
    b_arg: when_wpt_dist(m)  10   # how close to waypoint before surface, only if start_when==7
    b_arg: end_action(enum) 1     # 0-quit, 1-wait for ^C quit/resume, 2-resume, 3-drift til "end_wpt_dist"
                                  # 4-wait for ^C once  5-wait for ^C quit on timeout
    b_arg: report_all(bool) 0     # T->report all sensors once, F->just gps
    b_arg: gps_wait_time(sec) 120   # how long to wait for gps
    b_arg: keystroke_wait_time(sec) 30   # how long to wait for control-C
    b_arg: end_wpt_dist(m) 0     # end_action == 3   ==> stop when m_dist_to_wpt > this arg

                                     # Arguments for climb_to when going to surface
    b_arg: c_use_bpump(enum)      2
    b_arg: c_bpump_value(X)  1000.0
    b_arg: c_use_pitch(enum)      3  # servo on pitch
    b_arg: c_pitch_value(X)  0.4363  # 25 degrees

    b_arg: printout_cycle_time(sec) 20.0 # How often to print dialog

                                   # iridium related stuff
    b_arg: gps_postfix_wait_time(sec) 60.0  # How long to wait after initial
                                            # gps fix before turning the iridium
                                            # on (which disables the gps).  It will
                                            # wait the shorter of this time or until
                                            # all the water velocity calculations are
                                            # complete.

    b_arg: force_iridium_use(nodim)  0.0 #  Only for test.  non-zero values are set
                                         # into C_IRIDIUM_ON.  Used to force the
                                         # use of the iridium even if freewave is
                                         # present.

    b_arg: min_time_between_gps_fixes(sec)  300.0 # The irdium will be hung up this often
                                     # to get gps fixes.  It will call back however.
                                     # Primarily for use in hold missions to get
                                     # periodic gps fixes to tell how far the glider
                                     # has drifted.

    b_arg: sensor_input_wait_time(sec)  10.0 # Time limit to wait for input sensors at surface.



behavior: goto_wpt
    b_arg: start_when(enum) 0     # See doco above
    b_arg: stop_when(enum)  2     # See doco above

    b_arg: when_wpt_dist(m) 0     # stop_when == 7   ==> stop when m_dist_to_wpt < this arg

    b_arg: wpt_units(enum)  0     # 0 LMC, 1 UTM, 2 LAT/LONG
    b_arg: wpt_x(X)         0     # The waypoint (east or lon)
    b_arg: wpt_y(X)         0     #              (north or lat)
                                  # These only used for UTM waypoints
    b_arg: utm_zd(byte)   19.0   #     UTM Zone as digit (see coord_sys.h)
    b_arg: utm_zc(byte)   19.0   # (T) UTM Zone as char (see coord_sys.h)

    b_arg: end_action(enum) 0     # 0-quit, 2 resume

behavior: goto_list
    b_arg: args_from_file(enum) -1   # >= 0 enables reading from mafiles/goto_l.ma
    b_arg: start_when(enum)      0   # See doco above

    b_arg: num_waypoints(nodim)  0   # Number of valid waypoints in list
                                     # maximum of 8 (this can be increased at compile-time)
    b_arg: num_legs_to_run(nodim) 0  # Number of waypoints to sequence thru
                                     #  1-N    exactly this many waypoints
                                     #  0      illegal
                                     # -1      loop forever
                                     # -2      traverse list once (stop at last in list)
                                     # <-2     illegal

    b_arg: initial_wpt(enum)      0  # Which waypoint to head for first
                                     #  0 to N-1 the waypoint in the list
                                     # -1 ==> one after last one achieved
                                     # -2 ==> closest


    # Stopping condition applied to all of waypoints in the list
    b_arg: list_stop_when(enum)  7   # See doco above
    b_arg: list_when_wpt_dist(m) 10.  # used if list_stop_when == 7

    # The waypoints
    b_arg: wpt_units_0(enum) 0        # 0 LMC, 1 UTM, 2 LAT/LONG
    b_arg: wpt_x_0(X)        0        # The waypoint (east or lon)
    b_arg: wpt_y_0(X)        0        #              (north or lat)

    b_arg: wpt_units_1(enum) 0
    b_arg: wpt_x_1(X)        0
    b_arg: wpt_y_1(X)        0

    b_arg: wpt_units_2(enum) 0
    b_arg: wpt_x_2(X)        0
    b_arg: wpt_y_2(X)        0

    b_arg: wpt_units_3(enum) 0
    b_arg: wpt_x_3(X)        0
    b_arg: wpt_y_3(X)        0

    b_arg: wpt_units_4(enum) 0
    b_arg: wpt_x_4(X)        0
    b_arg: wpt_y_4(X)        0

    b_arg: wpt_units_5(enum) 0
    b_arg: wpt_x_5(X)        0
    b_arg: wpt_y_5(X)        0

    b_arg: wpt_units_6(enum) 0
    b_arg: wpt_x_6(X)        0
    b_arg: wpt_y_6(X)        0

    b_arg: wpt_units_7(enum) 0
    b_arg: wpt_x_7(X)        0
    b_arg: wpt_y_7(X)        0



behavior: yo
    b_arg: args_from_file(enum) -1   # >= 0 enables reading from mafiles/yo.ma
    b_arg: start_when(enum)      0   # See doco above
    b_arg: start_diving(bool)    1   # T-> dive first, F->climb first
    b_arg: num_half_cycles_to_do(nodim) 2   # Number of dive/climbs to perform
                                     # <0 is infinite, i.e. never finishes

    # arguments for dive_to
    b_arg: d_target_depth(m)     10
    b_arg: d_target_altitude(m)  -1
    b_arg: d_use_bpump(enum)      2
    b_arg: d_bpump_value(X) -1000.0
    b_arg: d_use_pitch(enum)      1
    b_arg: d_pitch_value(X)     0.0
    b_arg: d_stop_when_hover_for(sec) 180.0
    b_arg: d_stop_when_stalled_for(sec) 240.0
    b_arg: d_max_thermal_charge_time(sec) 1200.0
    b_arg: d_max_pumping_charge_time(sec) 300.0
    b_arg: d_thr_reqd_pres_mul(nodim) 1.10


    # arguments for climb_to
    b_arg: c_target_depth(m)     10
    b_arg: c_target_altitude(m)  -1
    b_arg: c_use_bpump(enum)      2
    b_arg: c_bpump_value(X)  1000.0
    b_arg: c_use_pitch(enum)      1
    b_arg: c_pitch_value(X)     0.0
    b_arg: c_stop_when_hover_for(sec) 180.0
    b_arg: c_stop_when_stalled_for(sec) 240.0

    b_arg: end_action(enum) 0     # 0-quit, 2 resume



behavior: prepare_to_dive
    b_arg: args_from_file(enum) -1   # >= 0 enables reading from mafiles/prepar.ma

    b_arg: start_when(enum) 0     # See doco above
    b_arg: wait_time(sec) 720     # 12minutes, how long to wait for gps
    b_arg: max_thermal_charge_time(sec) 120  # The maximum length of time to wait for
                                             # charge from thermal tubes.  After this time the
                                             # electric charge pump is used.
    b_arg: max_pumping_charge_time(sec) 300  # The maximum length of time to wait for a charge
                                           # after using electric c charge pump.
                                           # max time to wait = max_thermal_charge_time +
                                           #                    max_pumping_charge_time


behavior: sensors_in
    # <0 off, 0 as fast as possible, N, sample every N secs
    b_arg: c_att_time(sec)        -1.0
    b_arg: c_pressure_time(sec)   -1.0
    b_arg: c_alt_time(sec)        -1.0
    b_arg: u_battery_time(sec)    -1.0
    b_arg: u_vacuum_time(sec)     -1.0
    b_arg: c_profile_on(sec)      -1.0
    b_arg: c_leakdetect_time(sec) -1.0
    b_arg: c_gps_on(bool)          0.0  # Special, 1 is on, 0 is off
    b_arg: c_science_all_on(sec)  -1.0
    b_arg: c_hs2_on(sec)          -1.0
    b_arg: c_bb2f_on(sec)         -1.0
    b_arg: c_bb2c_on(sec)         -1.0
    b_arg: c_bb2lss_on(sec)       -1.0
    b_arg: c_sam_on(sec)          -1.0
    b_arg: c_whpar_on(sec)        -1.0
    b_arg: c_motebb_on(sec)       -1.0
    b_arg: c_bbfl2s_on(sec)       -1.0
    b_arg: c_fl3slo_on(sec)       -1.0
    b_arg: c_bb3slo_on(sec)       -1.0
    b_arg: c_oxy3835_on(sec)      -1.0
    b_arg: c_whfctd_on(sec)       -1.0
    b_arg: c_bam_on(sec)          -1.0
    b_arg: c_ocr504R_on(sec)      -1.0
    b_arg: c_ocr504I_on(sec)      -1.0


# ----- This is end of a typical mission


# These usually do not get called directly
behavior: set_heading
    b_arg: use_heading(bool) 2 # in, 1 HM_HEADING
                               # in, 2 HM_ROLL
                               # in, 3 HM_BATTROLL
                               # in, 4 HM_FIN

    b_arg: heading_value(X) 1000.0
                         # use_heading == 1 C_HEADING(rad) desired heading
                         # use_heading == 2 C_ROLL(rad),    >0 bank right
                         # use_heading == 3 C_BATTROLL(rad) >0 puts stbd wing down
                         # use_heading == 4 C_FIN(rad),     >0 turns to stbd

    b_arg: start_when(enum) 0     # See doco above
    b_arg: stop_when(enum)  2     # See doco above




behavior: dive_to
    b_arg: target_depth(m) 10    # how deep to dive
    b_arg: target_altitude(m) -1 # stop this far from bottom, <0 disables

                                 # bpump_mode_t values - ballast control
                                 # Electric only, ignored in thermal
    b_arg: use_bpump(enum) 2     # 0  Speed - servo
                                 # 1  Buoyancy Pump relative to neutral
                                 # 2  Buoyancy Pump absolute
    b_arg: bpump_value(X) -1000.0 # use_bpump == 0   m/s desired thru water
                                 # use_bpump == 1   cc, clips to max legal, >0 goes up
                                 # use_bpump == 2   cc, clips to max legal  >0 goes up

                                 # pitch_mode_t values - battery fore/aft control
    b_arg: use_pitch(enum) 1     # 3  Servo on Pitch
                                 # 2  Pitch, set once from curve
                                 # 1  BattPos
    b_arg: pitch_value(X)  0.0   # use_pitch ==  2,3  rad, desired pitch angle, <0 to dive
                                 # use_pitch == 1     in,  desired battpos, >0 to nose down
                                 #                      clips to max legal

    b_arg: start_when(enum) 0     # See doco above
    b_arg: stop_when_hover_for(sec) 180.0 # terminate dive when depth does not change for
                                          # this many secs, <0 to disable
    b_arg: stop_when_stalled_for(sec) 240.0 # terminate dive when glider not moving thru water
                                           # this many secs, i.e. M_SPEED is 0
                                           # <0 to disable

    b_arg: initial_inflection(bool) 1.0  # T->Want to start with an inflection

                                  # Thermal only, ignored in electric
    b_arg: max_thermal_charge_time(sec) 1200.0 # How long to wait for thermal
                                               # charge before using the thermal pump
    b_arg: max_pumping_charge_time(sec)  300.0 # how long to wait after starting charge pump
                                               # before an error
    b_arg: thr_reqd_pres_mul(nodim) 1.10   # engine pressure must be this many
                                           # times the ocean pressure at target_depth
                                           # before the dive is started.


behavior: climb_to
    b_arg: target_depth(m) 10    # how deep to dive
    b_arg: target_altitude(m) -1 # stop this far from bottom, <0 disables

                                 # bpump_mode_t values - ballast control
    b_arg: use_bpump(enum) 2     # 0  Speed - servo
                                 # 1  Buoyancy Pump relative to neutral
                                 # 2  Buoyancy Pump absolute
    b_arg: bpump_value(X) 1000.0 # use_bpump == 0   m/s desired thru water
                                 # use_bpump == 1   cc, clips to max legal, >0 goes up
                                 # use_bpump == 2   cc, clips to max legal  >0 goes up

                                 # pitch_mode_t values - battery fore/aft control
    b_arg: use_pitch(enum) 1     # 3  Servo on Pitch
                                 # 2  Pitch, set once from curve
                                 # 1  BattPos
    b_arg: pitch_value(X)  0.0   # use_pitch ==  2,3  rad, desired pitch angle, <0 to dive
                                 # use_pitch == 1     in,  desired battpos, >0 to nose down
                                 #                      clips to max legal

    b_arg: start_when(enum) 0     # See doco above
    b_arg: stop_when_hover_for(sec) -1.0 # terminate dive when depth does not change for
                                         # this many secs, <0 to disable
    b_arg: stop_when_stalled_for(sec) 240.0 # terminate climb when glider not moving thru water
                                            # this many secs, i.e. M_SPEED is 0
                                            # <0 to disable

    b_arg: initial_inflection(bool) 1.0  # T->Want to start with an inflection



# behaviors which control/communicate with the science computer

    # bconsci
    # A terminal session with the glider.
    # Stops by loss of carrier.  Package with abend
    # to stop by time/depth
behavior: bconsci
    b_arg: terminate_mission_when_done(bool) 1 # end mission when this behavior is done

    # Controls the sampling of the hydrophones
    # Obsolete, should be removed
    # replaced by behavior: bhydrophone
behavior: hydrosmp
    b_arg: args_from_file(enum) -1       # >= 0 enables reading from mafiles/hydros.ma
                                         #
    b_arg: num_samples(nodim)         1  # How many collections, -1 runs forever
    b_arg: time_between_samples(min) 10  # wait time between samples
                                         # controls initial start minute sych to hour
    b_arg: duration(sec)             30  # How long each sample is
    b_arg: gain(dB)                   0  # 0, 5, 10, .., 35
    b_arg: channel(nodim)             0  # 0-3, which channel
    b_arg: xmit_files(bool)           0  # t-> have science xmit files
    b_arg: silence_lvl(nodim)         0  # 0-1, higher the number, the quieter the glider

    b_arg: idle_stack_when_done(bool) 1  # T-> idle the stack to terminate
                                         #     mission when sampling is done

    # bhydrophone
    # A behavior to control the superscience (quest-2003) version of
    # drea hydrophone sampling
behavior: bhydrophone
    b_arg: args_from_file(enum) -1     # >= 0 enables reading from mafiles/bhydro.ma

    b_arg: start_when(enum) 0          # See doco above: 0, 9
    b_arg: when_secs(sec)   0          #

                                       # Behavior ends when either of these conditions met
    b_arg: max_collection_time(sec) -1 # Collect for this long maximum, <0 ==> forever
    b_arg: num_collections(nodim)   -1 # Number of collections to make, <0 ==> infinite

    # Timing of collection

    b_arg: c_hydrophone_duration(sec)   60.0 # How long to collect
    b_arg: c_hydrophone_pre_delay(sec)  15.0 # Delay between proglet start and collection
    b_arg: no_sample_time(sec)          15.0 # Time between collection
                                             # c_hydrophone_pre_delay+no_sample_time is total
                                             # time when NOT sampling

    b_arg: c_hydrophone_post_delay(sec) 30.0 # How long before proglet recycles
                                             # This is not part of duty cycle
                                             # only how long before proglet recycles
                                             # It is normally stopped after every measurement

    # Ping control
    b_arg: c_hydrophone_pre_pings(nodim)   1  # number of pings before sample
    b_arg: c_hydrophone_post_pings(nodim)  2  # number of pings after sample


    # Collection parameters
    b_arg: c_hydrophone_gain(nodim)         3.0 # 0-7
    b_arg: c_hydrophone_num_channels(nodim) 1.0 # 1-4
    b_arg: c_hydrophone_sample_rate(Hz)  5000.0 # 1000-5000, how fast to AD
    b_arg: c_hydrophone_drive_num(nodim)  3.0   # 2->C:, 3:->D: etc

    # bviper
    # A behavior to control the DMA Viper processor
behavior: bviper
    b_arg: args_from_file(enum) -1     # >= 0 enables reading from mafiles/bhydro.ma

    b_arg: start_when(enum) 0          # See doco above: 0, 9, 13
    b_arg: when_secs(sec)   0          #

    b_arg: when_utc_min     -1         # 0-59, -1 any minute
    b_arg: when_utc_hour    -1         # 0-23, -1 any hour
    b_arg: when_utc_day     -1         # 1-31, -1 any day
    b_arg: when_utc_month   -1         # 1-12, -1 any month

                                       # Behavior ends when either of these conditions met
    b_arg: max_collection_time(sec) -1 # Collect for this long maximum, <0 ==> forever
    b_arg: num_collections(nodim)   -1 # Number of collections to make, <0 ==> infinite

    # Timing of collection
    b_arg: no_sample_time(sec)   300.0 # Time between collection
                                       # time when NOT sampling
    # Collection parameters
    b_arg: c_viper_turn_on_timeout(sec)        120.0 # max wait time for viper to power on
    b_arg: c_viper_collect_timeout(sec)        200.0 # max wait time for viper to collect/analyse acoustic data
    b_arg: c_viper_reset_timeout(sec)           60.0 # max wait time for viper to respond to reset gain command
    b_arg: c_viper_start_sampling_timeout(sec)  60.0 # max wait time for viper to respond to start sampling command
    b_arg: c_viper_detection_done_timeout(sec)  60.0 # max wait time for viper to respond to detection done command
    b_arg: c_viper_turn_off_timeout(sec)       120.0 # max wait time for viper to power off
    b_arg: c_viper_gain(nodim)                   3.0 # 0-7 gain sent to viper
    b_arg: c_viper_max_sample_starts(nodim)      3.0 # max allowable attempts to obtain a definitive detection
    b_arg: c_viper_max_errors(nodim)             3.0 # max number of viper errors before mission abort

    # Added at sea (that's why out of order)
    b_arg: min_sample_depth(m)    20    # min depth to start, <0 disables
    b_arg: max_sample_depth(m)    60    # max depth to start, <0 disables

    # Controls the sampling of specified sensor type (b_arg: sensor_type)
behavior: sample

    b_arg: args_from_file(enum)             -1  # >= 0 enables reading from mafiles/sample.ma

    b_arg: sensor_type(enum)                 0  # 0  C_SCIENCE_ALL_ON
                                                # 1  C_PROFILE_ON
                                                # 2  C_HS2_ON
                                                # 3  C_BB2F_ON
                                                # 4  C_BB2C_ON
                                                # 5  C_BB2LSS_ON
                                                # 6  C_SAM_ON
                                                # 7  C_WHPAR_ON
                                                # 8  C_WHGPBM_ON
                                                # 9  C_MOTEBB_ON
                                                # 10 C_BBFL2S_ON
                                                # 11 C_FL3SLO_ON
                                                # 12 C_BB3SLO_ON
                                                # 13 C_OXY3835_ON
                                                # 14 C_WHFCTD_ON
                                                # 15 C_BAM_ON
                                                # 16 C_OCR504R_ON
                                                # 17 C_OCR504I_ON
                                                #  pick next number here for new proglet
                                                #  REQUIRED: also add it to: science_super.c: __ss_indexes[],
                                                #  add it to output_sensors[] in snsr_in.c,
                                                #  and update header doco in sample.c.



                                                # This is a bit-field, combine:
                                                # 8 on_surface, 4 climbing, 2 hovering, 1 diving
    b_arg: state_to_sample(enum)             1  # 0  none
                                                # 1  diving
                                                # 2  hovering
                                                # 3  diving|hovering
                                                # 4  climbing
                                                # 5  diving|climbing
                                                # 6  hovering|climbing
                                                # 7  diving|hovering|climbing
                                                # 8  on_surface
                                                # 9  diving|on_surface
                                                # 10 hovering|on_surface
                                                # 11 diving|hovering|on_surface
                                                # 12 climbing|on_surface
                                                # 13 diving|climbing|on_surface
                                                # 14 hovering|climbing|on_surface
                                                # 15 diving|hovering|climbing|on_surface

    b_arg: sample_time_after_state_change(s) 15  # time after a positional stat
                                                 # change to continue sampling

    b_arg: intersample_time(s)                2  # if < 0 then off, if = 0 then
                                                 # as fast as possible, and if
                                                 # > 0 then that many seconds
                                                 # between measurements
behavior: badd_b
    b_arg: args_from_file(enum)            -1 # >= 0 enables reading from mafiles/bhydro.ma
    b_arg: start_when(enum)                 1 # See doco above: 0, 1, 2
    b_arg: stop_when(enum)                 12 # BAW_NOCOMM_SECS
    b_arg: max_collection_time(sec)      1800 # timeout for data collect mode
    b_arg: max_search_time(sec)          1800 # timeout for search mode
    b_arg: min_download_range(m)         2000 # minimum range to start collecting data
    b_arg: max_tries_to_connect(nodim)     15 # max number of connection attempts
    b_arg: max_badd_errors(nodim)          30 # abort after this many errors
    b_arg: run_on_surface(bool)             0 # 1 -> allow running on surface
                                              # 0 -> don't allow to run on surface
    b_arg: collect_data_after_range(bool)   1 # 1 -> collect data after range mode
                                              # 0 -> don't collect data after range mode

    # Collection parameters
    b_arg: c_badd_mode(enum)                0 # 0: search, 1: collect data
    b_arg: c_badd_target_id(enum)           0 # address of remote host modem being called
    b_arg: c_badd_range_secs(sec)          60 # how often to request range to remote modem
                                              # <0 => don't request range,
                                              # min value = c_badd_input_parse_secs(sec) * 2
    b_arg: c_badd_input_parse_secs(sec)    30 # How long to check command response input buffer
    b_arg: c_badd_datacol_status_secs(sec) 30 # How long to check command response input buffer
    b_arg: c_badd_clear_remote_data(bool)   0 # 0: do NOT clear remote data after successful
                                              # download, 1: clear remote data after download

# An alternative method of terminating a mission (b_arg: sensor_type)
behavior: mission_ender
    b_arg: start_when(enum) 1          # See doco above: 1,2,3, or 4

behavior: comatose
    b_arg: start_sci_hydrophone_collecting(bool)  1.0 # in, t-> start when this sensor true
    b_arg: start_sci_viper_collecting(bool)       1.0 # in, t-> start when this sensor true
    b_arg: post_inflection_holdoff(s)            30.0 # in, how many secs post inflection to
                                                      #     hold off before going comatose

# These do not get used to much.  Generally only for testing
behavior: nop_cmds
    b_arg: nop_pitch(bool)   0   # t-> cmd pitch   to _IGNORE to keep stack busy
    b_arg: nop_bpump(bool)   0   # t-> cmd bpump   to _IGNORE to keep stack busy
    b_arg: nop_heading(bool) 0   # t-> cmd heading to _IGNORE to keep stack busy
    b_arg: nop_threng(bool)  0   # t-> cmd threng  to _IGNORE to keep stack busy
    b_arg: nop_de_eng(bool)  0   # t-> cmd de_eng  to _IGNORE to keep stack busy
    b_arg: secs_to_run(sec)   -1   # how long this behavior runs, <0 to run forever

behavior: oob_abort
    b_arg: start_when(enum) 6     # see doco above
    b_arg: when_secs(sec)   120.0 # How long to wait for issuing out of band abort

    # For testing iridium, sends file irdatst.dat
behavior: iridium_ascii_test
    b_arg: time_between_xmit(secs)   900.0  # 15 minutes
    b_arg: tries_per_xmit(nodim)       5    # How many attempts to send file
    b_arg: link_ok_timeout(secs)      30.0  # How long to wait for link ok
                                            # < 0 means do not expect "link ok"
    b_arg: modem_drain_time(secs)     30.0  # How long to delay phone power off
END

#endif