ACS Sampled Data format

Protocol Documentation

channel.proto

Channel

Channel is a sample of a channel at an instance in time from a independent AVAPS II Style Receiver, which is constructed from analog components. These style receivers have been in use since 1996, and have served the community well for a long time.

The

Field Type Label Description
id int32 required Database Index - should be unique across a flight and perhaps a project
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
cid int32 required CID is the channel ID, starting from 0 to N-1, where N is the number of channels.
sample_time google.protobuf.Timestamp required SampleTime is the timestamp when this sample was measured.
start_time google.protobuf.Timestamp required StartTime is when the channel started. This is constant over the life of a sounding
launch_detect google.protobuf.Timestamp optional LaunchDetect, if not null, is the crude timestamp when the channel detected the launch detect bit was set. This value, if not empty, is the first ACS system time when the Launch Detect value transmitted by the sonde was non-zero as well as the associated checksum fields around the LaunchDetect value prove a matching checksum. Because of these criteria, the actual launch detect might have occur sooner than the time stored here.
uuid string required UUID is the sounding UUID. This UUID is unique over a sounding.
run_state RunState required RunState is the operational run state or health index of the channel. It should be one of the following values. 0 - Invalid Runstate 1 - Channel is operating (recording data) 2 - Channel stopped due to running longer than the maximum time set 3 - Channel stopped due to running longer than the sounding time: that is once launcher detect was triggered, it ran the maximum time. 4 - Channel stopped because it had not received data in some set amount of maximum time 5 - Channel stopped because it could not reconnect to the data stream after some maximal amount of time 6 - Channel stopped because it could not reconnect to the status stream after some maximal amount of time 7 - Channel was manually stopped.
stream_type Type required StreamType is the type of data stream this channel is decoding as. This should match to the different Telemetry stream types the sonde emits
human_name string required HumanName is the assigned human readable name associated in a 1:1 relationship with the UUID. This name exists so that soundings can be referred to easily during operations.
record_time double optional RecordTime is the duration, in fractional seconds, the channel has been running and recording data.
pll_lock_detect bool optional PllLockDetect is set (to True) if the PLL on the receiver hardware is currently tracking, or locked onto the sonde’s transmit signal. If empty or missing, this indicates the data frame that contained this value was mangled and not properly parsed.
rssi_power_level double optional RssiPowerLevel is the course signal strength of the sonde in dBm. If this value is missing or empty, it implies the parsing message was garbled
fm_deviation double optional FmDeviation is the sampled FM deviation of the channel in kHz. If this value is missing or empty, it implies the parsing message was garbled
frequency_error double optional FrequencyError is the RF frequency error, in Hz If this value is missing or empty, it implies the parsing message was garbled

RunState

RunState represents the current and final runstate of a channel. Values outside the defined values are errors

Name Number Description
INVALID_STATE 0  
CHANNEL_RUNNING 1  
CHANNEL_STOPPED_MAX_TIME 2  
CHANNEL_STOPPED_SOUNDING 3  
CHANNEL_STOPPED_NO_DATA 4  
CHANNEL_STOPPED_DATA_RECONNECT 5  
CHANNEL_STOPPED_RCVR_RECONNECT 6  
CHANNEL_STOPPED_MANUAL 7  

Type

Type is a channel type (only one type currently)

Name Number Description
TESTING_TYPE 0  
INVALID_TYPE 1  
TYPE_A 2  

chassis.proto

Chassis

Chassis is a sample of a AVAPS II style chassis hardware health

This message is created for AVAPS I and II Style chassis where the sonde interfaces provides some basic PCB temperature and voltage monitoring

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
sample_time google.protobuf.Timestamp required SampleTime is the timestamp when this sample was collected*/
raw_voltages bytes optional RawVoltages is the raw byte slice read from the chassis monitor for the voltage data
raw_temps bytes optional RawTemps is the raw byte slice read from the chassis monitor for the temperature data
v15 double optional V15 if the measured voltage of the 15 volt rail
v5 double optional V5 is the measured voltage of the 5 volt rail
temperature double optional Temperature is the sonde interface card’s measured PCB temperature

control.proto

Control

Control is a representation of a Control-Response sequence issued to some piece of hardware.

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
parent string required Parent functions as the name or UUID of the parent command issued.

Parent is always a UUID, but is either a UUID of a sounding, or a ‘master’ command. If Parent points to any Control.UUID, then this command should be understood as a sub command which was issued as part of some sequence or repeated command. For example, given the following list of commands (P1…Pn and Ua…Ub are actually UUIDs, not abbreviated strings):

ID Parent UUID
1 "P1" "Ua"
2 "P2" "Ub"
3 "Ua" "Uc"
4 "Ua" "Ud"
5 "P1" "Ue"
6 "Ud" "Uf"

If you reformed the above commands into a tree explicitly showing heirarchy, you would end up with something like below:

  • P1
    • Ua
      • Uc
      • Ud
        • Uf
    • Ue
  • P2
    • Ub
This implies that in order to gather all commands associated with a sounding, one must troll the database.        
  issued_at google.protobuf.Timestamp required IssuedAt is the timestamp the command was originally issued. This is assigned when the command is issued to the hardware
  completed_at google.protobuf.Timestamp optional CompletedAt is the timestamp the command completed, and is nil/null if this didn’t complete
  uuid string required Uuid is the UUID for this single command. This should always be Unique
  user_id int32 required UserId is the ID of the user responsible for issuing this command. Most often this is the system user, meaning this command was automatically sent as a course of normal operations, but if a user manually issued a command, that user ID will be here. One will need to reference data stored in the .ID portion of the Users data slice to query the details on that user
  command bytes optional Command is the raw bytes sent down the wire, or if this is a master command, it may be a string prefixed with “master-“.
  prototype bytes optional Prototype is is part of how the command was formed. Prototype + args = command. Usually, a value of “master” is used if this is command sequence rather than a single command
  args bytes optional Args is a textual form of the arguments pass to prototype
  error string optional Error is the returned error from attempting to issue the command. If empty, and .Completed is not nil/null, then there was no error issuing this command
  response bytes optional Response is the raw bytes returned from the command. For a master command, this is a comma separated list of UUIDs issued on behalf of the sequence.
  duration double optional Duration is how long the command took to complete in seconds
  completed bool optional completed is true if the command completed

gps.proto

Gps

Gps is a representation of an stored and partially decoded GPS message

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
sample_time google.protobuf.Timestamp required SampleTime is the timestamp when this message was parsed.
raw bytes required Raw is the raw byte slice representing the GPS message
message_type string required MessageType is a human readable string representing the type of message unpacked, The raw message is most likely binary, so this gives hints as to what is encoded. This often a string like “Aid::Eph” or “NMEA::GGA”
longitude double optional Longitude in decimal degrees, or nil/null if message does not contain this value
latitude double optional Latitude is the decimal degrees latitude, or nil/null if message does not contain this value
altitude double optional Altitude is the MSL altitude in meters, or nil/null if message does not contain this value
speed double optional Speed is the reported speed in m/s, or nil/null if message does not contain this value
heading double optional Heading is the decimal degrees the message is indicating, or nil/null if message does not contain this value
gpsfix int64 optional Gpsfix is the fix type the RCVR is in. This is usually some bitmapped int, but the bitmasked value are not defined, or nil/null if message does not contain this value
nsats int64 optional nsats is the number of SV in track, if known, or nil/null if message does not contain this value
gps_time google.protobuf.Timestamp optional GpsTime is the derived GPS time, if known, or nil/null if message does not contain this value
utc_time google.protobuf.Timestamp optional UtcTime is the corrected UTC time, if known, or nil/null if message does not contain this value

gvlnchr.proto

GvLnchrState

GvLnchrState is snapshot in time of the state of the GV launcher.

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
sample_time google.protobuf.Timestamp required SampleTime is the timestamp when this sample was collected*/
raw_data bytes required RawData is whatever was read off the wire that decomposes in the rest of the following data.

Generally, the message is formed as a comma separated value set, where some of the values have special meanings

Item # Bytes Value, Range & Description
1 2 00= No launcher Action system is healthy, other codes TBD
2 1 0 or 1 (0 = Pilot Interlock enabled, 1 = Pilot interlock disabled, OK to launch sonde) Pilot Safety Interlock - STATUS
3 1 Carriage Motor Status, 1= Static, (note: 2 is undefined), 3= motor active
4 1 SGV status 1=OPEN, 2= CLOSED, 3=Motor active, 4=Undetermined location
5 1 EGV Motor Running, 1= Home position, (note: 2 is undefined), 3= Motor active, 4=Undetermined location
6 1 Trigger Lock Actuator, 1=locked, 2=unlocked, 3=Motor Active, 4=Undetermined location
7 1 EGV status, 1=OPEN, 2=CLOSED
8 1 0 or 1 (0= No sonde, 1= sonde present) sonde in launch tube Sonde Proximity sensor in Bin 1
9 1 0 or 1 (0= No sonde, 1= sonde present) bin column #1 Sonde Proximity sensor in Bin 2
10 1 0 or 1 (0= No sonde, 1= sonde present) bin column #2 Sonde Proximity sensor in Bin 3
11 1 0 or 1 (0= No sonde, 1= sonde present) bin column #3 Sonde Proximity sensor in Bin 4
12 1 0 or 1 (0= No sonde, 1= sonde present) bin column #4 Sonde Proximity sensor in Bin 5
13 1 0 or 1 (0= No sonde, 1= sonde present) bin column #5 Sonde Proximity sensor in Launch Tube
14 2 Carriage Bin Position ( 00..05)
15 1 0 or 1 (0 = OK, 1 = IR Communications ERROR during LDS) Reset to 0 by PN1 command, or at start of LDS command-ERROR
16 1 0 or 1 (0 = OK, 1 = timeout ERROR, Carriage Motor) Timeout error of carriage motor-ERROR
17 1 0 or 1 (0 = OK, 1 = timeout ERROR, SGV Motor ) Timeout error of SGV motor-ERROR
18 1 0 or 1 (0 = OK, 1 = timeout ERROR, EGV Reset Motor) Timeout error of EGV Reset motor-ERROR
19 1 0 or 1 (0 = OK, 1 = timeout ERROR, Trigger Lock Actuator) Timeout error of safety servo-ERROR
20 1 0 or 1 (0 = OK, 1 = Thermal ERROR, Carriage Motor) Thermal error of carriage motor from Driver IC-ERROR
21 1 0 or 1 (0 = OK, 1 = Thermal ERROR, SGV Motor) Thermal error of Launcher motor from Driver IC-ERROR
22 4 Position pot for Carriage location, 0 to 1023, A/D count value Count position of carriage
23 4 Trigger Lock Actuator, 0 to 1023 A/D count value Safety Servo position
24 6 Pressure in units of mb, error response= 9999.0 Pressure sensor on Launcher electronics PCB
25 3 Humidity in %, error response= 999 SHT75 RH sensor on Launcher electronics PCB
26 5 -99.0 to +99.0, units are Celsius, error response= 999.0 SHT75 Air Temperature sensor on Launcher electronics PCB
27 5 -99.0 to +99.0, units are Celsius, error response= 999.0 LM92 Temperature sensor on Launcher electronics PCB
28 5 -99.0 to +99.0, units are Celsius, error response= 999.0 DS1820 Temperature sensor #1 in Sonde Bin, location Ejection unit
29 5 -99.0 to +99.0, units are Celsius, error response= 999.0 DS1820 Temperature sensor #2 in Sonde Bin, location Ejection unit
30 5 -99.0 to +99.0, units are Celsius, error response= 999.0 OptionalL, DS1820 Temperature sensor in Sonde Bin, location TBD
31 5 -99.0 to +99.0, units are Celsius, error response= 999.0 OptionalL, DS1820 Temperature sensor in Sonde Bin, location TBD
32 5 -99.0 to +99.0, units are Celsius, error response= 999.0 OptionalL, DS1820 Temperature sensor in Sonde Bin, location TBD
33 4 ex. format, units in volts, range 00.0 to 50.0, A/D Error = 99.0 +24Vdc System Power Supply
34 4 ex. format, units in volts, range 00.0 to 50.0, A/D Error = 99.0 +12V Carriage motor supply voltage
35 4 xx.x format, units in volts, range 00.0 to 50.0, A/D Error = 99.0 +12V DC-DC power supply for Optical proximity sensors
36 4 xx.x format, units in volts, range 00.0 to 50.0, A/D Error = 99.0 +5V PIC power supply voltage
37 4 xx.x format, units in volts, range 00.0 to 50.0, A/D Error = 99.0 +44v Solenoid Power Supply
38 4 xx.x format, units in Amps, range 00.0 to 05.0, A/D Error = 99.0 System Electronics Current
39 4 xx.x format, units in Amps, range 00.0 to 05.0, A/D Error = 99.0 SGV and EGV Motor Currents
40 1 0 or 1 (0 = GPS Re-radiation OFF, 1= GPS Re-radiation ON) Byte flag indicating GPS re-radiation amplifier power is OFF or ON
Generally the parser should be consulted for exact details        
  launcher_health GvLnchrHealth optional LauncherHealth is a self-reported launcher health value.
  pilot_interlock_armed bool optional PilotInterlockArmed is set to “true” if the pilot controlled interlock is ‘armed’ in that the AVAPS operator can utilize the launcher.
  carriage_state GvCarriageState optional CarriageState is the state of the GV Launcher Carriage State.
  safety_gate_valve GvSafetyGateState optional SafetyGateValve is the state of the safety gate valve
  ejection_gate_valve GvEjectionGateState optional GvEjectionGateValve is the state of the Ejection Gate Value
  trigger_lock GvTriggerLockState optional TrigerLock is the state of the trigger lock motor assembly
  egv_opened bool optional EgvOpened is the state of the EGV motor. True indicates it is opened.
  sonde_in_launcher bool optional SondeInLauncher is true if there is a sonde in the launcher
  sonde_in_bin1 bool optional SondeInBin1 is true if there is a sonde in a bin1
  sonde_in_bin2 bool optional SondeInBin2 is true if there is a sonde in a bin2
  sonde_in_bin3 bool optional SondeInBin3 is true if there is a sonde in a bin3
  sonde_in_bin4 bool optional SondeInBin4 is true if there is a sonde in a bin4
  sonde_in_bin5 bool optional SondeInBin5 is true if there is a sonde in a bin5
  carriage_position GvCarriagePosition optional CarriagePosition is the position of the carriage
  ir_error bool optional IrError is true if there is an IR Error
  carriage_error bool optional CarriageError is true if there is a carriage error
  sgv_error bool optional SgvError is true if the SGV motor is in an error condition
  egv_error bool optional EgvError is true if the EGC motor is in an error condition
  trigger_lock_error bool optional TriggerLockError is true if there are errors with the trigger lock motor
  carriage_too_hot bool optional CarriageToHot is true if the SGV motor is in thermal overload
  sgv_too_hot bool optional SgvTooHot is true if the SGV motor is in thermal overload
  carriage_adc int64 optional CarriageAdc is the ADC counts that is used to look up the position of the Carriage motor
  trigger_lock_adc int64 optional TriggerLockAdc is the counts associated with the Trigger Lock
  pressure double optional Pressure is the value emitted by the onboard barometer
  humidity double optional Humidity is the humidity in the electronics box
  air_temperature double optional AirTemperature is the ambient air temperature IN THE ELECTRONICS BOX
  pcb_temperature double optional PcbTemperature is the PCB (circuit board) temperature
  optional_temp1 double optional OptionalTemp1 is an arbitrarily placed DS1820B sensor that may not be plugged in
  optional_temp2 double optional OptionalTemp2 is an arbitrarily placed DS1820B sensor that may not be plugged in
  optional_temp3 double optional OptionalTemp3 is an arbitrarily placed DS1820B sensor that may not be plugged in
  optional_temp4 double optional OptionalTemp4 is an arbitrarily placed DS1820B sensor that may not be plugged in
  optional_temp5 double optional OptionalTemp5 is an arbitrarily placed DS1820B sensor that may not be plugged in
  v24_mains double optional V24Mains is the 24V Mains input
  v12_carriage double optional V12Carriage is the 12V input to the carriage motor
  v12_proximity double optional V12Proximity is the 123V input to the proximity sensors
  v5_controller double optional V5Controller is the 5V mains to the microcontrollers
  v44_solenoid double optional V44Solenoid is the 44V input to the solenoids
  mains_current double optional MainsCurrent is the current draw utilized by the whole system on the 24V lines
  motor_current double optional MotorCurrent is the current draw utilized by the SGV, EGV, and Trigger lock. Nominally 0.0 amps, but spikes during usage
  gps_coupling bool optional GpsCoupling is true if the GPS coupler is enabled, and false otherwise.

GvCarriagePosition

GvCarriagePosition is a representation of the carriage position

These constants define the Launcher carriage position states defined in hardware and mirror constants used in the hardware. Values outside the given ones are completely unknown, undefined, and should be considered highly aberrant.

Name Number Description
CarriageAtHome 0 GvCarriageAtHome indicate the Carriage is under home position
CarriageAtBin1 1 GvCarriageAtBin1 indicate the Carriage is under bin #1
CarriageAtBin2 2 GvCarriageAtBin2 indicate the Carriage is under bin #2
CarriageAtBin3 3 GvCarriageAtBin3 indicate the Carriage is under bin #3
CarriageAtBin4 4 GvCarriageAtBin4 indicate the Carriage is under bin #4
CarriageAtBin5 5 GvCarriageAtBin5 indicate the Carriage is under bin #5
CarriageLost 99 GvCarriageLost indicate the Carriage is lost and not under a known location

GvCarriageState

GvCarriageState is a representation of the active state of the carriage motor. Values outside the given ones are completely unknown, undefined, and should be considered highly aberrant.

Name Number Description
CarriageStationary 1 GvCarriageStationary is used when the Carriage is stationary
CarriageUndefined 2 GvCarriageUndefined is used when the Carriage is in undefined state
CarriageActive 3 GvCarriageActive is used when the Carriage is actively moving

GvEjectionGateState

GvEjectionGateState is a representation of the state of the ejection gate valve, which is the guillotine valve with a revolving motor to close and cock the blade.

These constants are the defined states associated with the EGVs position states and mirror constants used in the hardware. Values outside the given ones are completely unknown, undefined, and should be considered highly aberrant.

Name Number Description
EjectionGateHome 1 GvEjectionGateHome indicates the EjectionGate is In Home / Closed
EjectionGateMoving 3 GvEjectionGateMoving indicates the EjectionGate is actively moving
EjectionGateUndefined 4 GvEjectionGateUndefined indicates the EjectionGate is in undetermined state

GvLnchrHealth

GvLnchrHealth is a representation of the self-described launcher health, which is defined by the hardware. Values outside the given ones are completely unknown, undefined, and should be considered highly aberrant. These values are not a bitmask/bitmap, so do not try to treat them that way.

Name Number Description
HealthOk 0 GvHealthNominal indicates the launcher has no errors, and is ready to load a sonde
Health1 1 GvHealth1 indicates the launcher is currently loading or launching a sonde
Health21 21 GvHealth21 indicates the launcher EGV is closed, SGV is open, Trigger Lock is Unlocked
Health22 22 Health22 indicates that the GV launcher’s EGV is closed, SGV is open, and the EGV motor is NOT in the home position
Health23 23 Health23 indicates that the GV launcher’s EGV is closed, SGV is open, Trigger Lock is Unlocked, and the EGV motor is NOT in the home position
Health24 24 Health24 indicates that the GV launcher’s EGV is closed, SGV is closed, Trigger Lock is Unlocked
Health25 25 Health25 indicates that the GV launcher’s EGV is closed, SGV is closed, and the EGV motor is NOT in the home position
Health26 26 Health26 indicates that the GV launcher’s EGV is closed, SGV is closed, Trigger Lock in Unlocked, and the EGV motor not in Home position
Health27 27 Health27 indicates that the GV launcher’s EGV is open, SGV is closed, and the Trigger Lock is Unlocked
Health28 28 Health28 indicates that the GV launcher’s EGV is open, SGV is closed, Trigger Lock is Unlocked, and the EGV motor not in Home position
Health31 31 Health31 indicates that the GV launcher’s EGV is open, SGV is open, and the Trigger Lock is Locked. This should NOT be physically possible
Health32 32 Health32 indicates that the GV launcher’s EGV is open, SGV is open, and the Trigger Lock is Unlocked
Health33 33 Health33 indicates that the GV launcher’s EGV is open, SGV is open, Trigger Lock is Unlocked, and the EGV motor not in Home positionHealth33 = 33

GvSafetyGateState

SafetyGateState states are used to describe the current behaviour of the GV’s Safety Gate Valve (SGV) The SGV is the upper motor on the launcher’s ejector subsection These constants are the defined states associated with the SGV. These values mirror constants employed by the actual hardware. Values outside the given ones are completely unknown, undefined, and should be considered highly aberrant.

Name Number Description
SgvOpened 1 GvSgvOpened indicates that the SafetyGate is Open
SgvClosed 2 GvSgvClosed indicates that the SafetyGate is Closed
SgvMoving 3 GvSgvMoving indicates that the SafetyGate is actively moving
SgvUndefined 4 GvSgvUndefined indicates that the SafetyGate is in undetermined state

GvTriggerLockState

GvTriggerLockState is a representation of the trigger lock motor’s position.

These constants define the available Trigger Lock States defined in hardware and mirror constants used in the hardware. Values outside the given ones are completely unknown, undefined, and should be considered highly aberrant.

Name Number Description
TriggerLockLocked 1 GvTriggerLockLocked indicates that the TriggerLock is currently locked
TriggerLockUnlocked 2 GvTriggerLockUnlocked indicates that the TriggerLock is currently unlocked (unsafe)
TriggerLockMoving 3 GvTriggerLockMoving indicates that the TriggerLock is actively moving
TriggerLockUndefined 4 GvTriggerLockUndefined indicates that the TriggerLock is in undetermined state

iwgadts1.proto

Iwgadts1

Iwgadts1 is a representation of an IWGADTS1 message received over UDP The general documentation source is available at http://www.eol.ucar.edu/iwgadts/ or http://www.eol.ucar.edu/raf/Software/iwgadts/33_ISRSE_IWGADTS.pdf

The fields are somewhat open to debate as what each field means, so everyone does what is right in his own eyes: NCAR botches the timestamp, NOAA Add up to 73 extra fields, some with ‘NONE’ (rather than ,,) as a missing value, NASA does some odd crap with heights. This tries to undo it all. My understanding of IWGADTS is that GPS_MSL_ALT should be altitude, and WGS84_ALT is a correction offset, not the corrected altitude. For this particular problem, the 3 aircraft I am more familiar with, the signature of each is:

  • NCAR: GPS_MSL_ALT=height, WGS84_Alt=correction, but empty
  • NOAA: GPS_MSL_ALT=height, WGS84_Alt=correction
  • NASA: GPS_MSL_ALT=empty, WGS84_Alt=height

Additional fields are allowed and are not unpacked.

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
sample_time google.protobuf.Timestamp required SampleTime is the local time when we received the above RawFrame
raw_frame bytes required RawF.rame is what was received off the wire prior to attempting to decode
header string optional Header thru SunAzimuthFromGround are defined fields whose meaning should be derived from http://www.eol.ucar.edu/raf/Software/iwgadts/33_ISRSE_IWGADTS.pdf.
utc google.protobuf.Timestamp optional  
latitude double optional  
longitude double optional  
gps_mean_sea_level double optional  
wgs84_altitude double optional  
pressure_altitude double optional  
radar_altitude double optional  
ground_speed double optional  
true_airspeed double optional  
indicated_airspeed double optional  
mach_number double optional  
vertical_velocity double optional  
true_heading double optional  
track_angle double optional  
drift_angle double optional  
pitch double optional  
roll double optional  
side_slip_angle double optional  
angle_of_attack double optional  
ambient_temperature double optional  
dew_point double optional  
total_temperature double optional  
static_pressure double optional  
dynamic_pressure double optional  
cabin_pressure double optional  
wind_speed double optional  
wind_direction double optional  
vert_wind_speed double optional  
solar_zenith_angle double optional  
sun_azimuth_from_aircraft double optional  
sun_elevation_from_aircraft double optional  
sun_azimuth_from_ground double optional  

metadata.proto

Metadata

Metadata is a structure that represents a pieces of metadata stored at various times. It m

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
parent string required Parent is the parent of the key:value pair metadata piece. Usually this is a UUID of a sounding, but the additional word “system” is used by ACS. Additional reserved parent words can be defined for future used (eg “aspenqc” or “postflight”)
key string required Key is a name for the metadata. If this is strictly numeric, it is a known and named metadata piece as defined in AVAPS-Metadata, and that should be consulted for the meaning otherwise, the key is some freehand pieces of text
value string required Value is a value of associated with the metadata key. The definition is not controlled other than the value must not be entirely empty.

profile.proto

Profile

Profile is representation of an atmospheric profile

Field Type Label Description
originator string required Originator is the utility or function that created this Profile
description string required Description is some human readable explication of why this Profile exists.
created google.protobuf.Timestamp required Created is the timestamp when this profile was created.
Profile Profile.Layer repeated Profile is a collection of atmospheric measurements at various layers

Profile.Layer

Layer is a set of measured parameters at a particular altitude

Field Type Label Description
sample_time google.protobuf.Timestamp required SampleTime is the local system UTC time when this sample was gathered
pressure double optional Pressure is the atmospheric pressure at this level, in hPa / mBar
temperature double optional Temperature is the ambient air temperature, in degrees C
humidity double optional  
sensor_humidity double optional  
sensor_temp double optional  
wind_speed double optional  
wind_direction double optional  
gps_dz_dt double optional  
p_dz_dt double optional  
latitude double optional  
longitude double optional  
geo_altitude double optional  
gps_altitude double optional  
gps_sats int64 optional  
gps_speed_acc double optional  
sst_body double optional these are only present when the values are usable
sst_sfc double optional  
checksum_met bool optional ChecksumMet should be true iff the PTU parameters checksum matches the transmitted value
checksum_winds bool optional ChecksumWinds should be true iff the Wind block parameters checksum matches the transmitted value
checksum_lla bool optional ChecksumLla should be true iff the Lat, Long, and Alt block parameters checksum matches the transmitted values

raw_sample.proto

RawSample

RawSample is a representation of raw sample data

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
uuid string required Uuid is the declared UUID of the sounding
raw bytes required Raw is the raw bytes that decomposes into the values
sample_time google.protobuf.Timestamp optional SampleTime is the local system UTC time when this sample was gathered
pressure double optional  
temperature double optional  
humidity double optional  
sensor_humidity double optional  
sensor_temp double optional  
ptu_status int64 optional  
ptu_error_code int64 optional  
sst_surface double optional  
sst_body double optional  
internal_temp double optional  
gps_utc_flag int64 optional  
gps_latitude double optional  
gps_longitude double optional  
utc_time1 double optional  
horz_acc double optional  
vert_acc double optional  
gps_speed1 double optional  
gps_heading1 double optional  
gps_vdown1 double optional  
gps_msl_alt1 double optional  
gps_num_svs1 int64 optional  
gps_fix1 int64 optional  
gps_speed_acc1 double optional  
utc1 google.protobuf.Timestamp optional  
gps_speed2 double optional  
gps_heading2 double optional  
gps_vdown2 double optional  
gps_msl_alt2 double optional  
gps_num_svs2 int64 optional  
gps_fix2 int64 optional  
gps_speed_acc2 double optional  
utc2 google.protobuf.Timestamp optional  
chksum_sensor bool optional  
chksum_eng bool optional  
chksum_met bool optional  
chksum_gps0 bool optional  
chksum_gps1 bool optional  
chksum_gps2 bool optional  
chksum_head bool optional  
framecount int64 optional  
launch_detect int64 optional  
stream_type int64 optional  
sonde_id int64 optional  
revision string optional  
battery double optional  
ad_cds_sensor int64 optional  
gps_reacqs int64 optional  
gps_loop_speed int64 optional  
gps_tracking_err int64 optional GpsTrackingErr is a tracking bitmask emitted by the GPS module. The exact mapping can very
spare_a int64 optional  
spare_b int64 optional  
spare_c int64 optional  
spare_d int64 optional  
spare_e int64 optional  
spare_f int64 optional  
spare_g int64 optional  
spare_h int64 optional  
spare_i int64 optional  

reference.proto

RefSample

RefSample is a sampled reference data point

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
sample_time google.protobuf.Timestamp required SampleTime is the timestamp when the data stored in this message was gathered.
raw_data bytes optional RawData is the set of raw bytes read off the wire. See above for how to decipher the data
source string required Source is the self-named reference source. Ideally this should be model number, serial number, or some sort of identifier of an ASCII instrument
pressure double optional Pressure is some referentially measured barometer value. Ideally this should be in hPa/mbar.
temperature double optional Temperature is some referentially measured thermometer value. Ideally this should be in degrees Celsius
humidity double optional Humidity is some referentially measured hygrometer value. Ideally this should be in % relative humidity

sampled.proto

Sampled

Sampled is a representation of all the data samples during a sounding or flight

Recension, Editio Princeps

Rather than reusing some of the common words for the various states of cooked data (raw, QCd etc) I have chosen to use more particular wording such that it is easier to discuss what is happening to a sounding as various QC algorithms are systematically applied. In order to aid in basic understanding of the vernacular.

recension: n. a critical revision of a text incorporating the most plausible elements found in varying sources. editio princeps: n. a work is the first printed edition of the work, that previously had existed only in manuscripts, which could be circulated only after being copied by hand

For our uses, Recension is the corrected sounding corpus based on Editio Princeps using the expert knowledge of the instrument, surrounding metadata, to extricate a usable atmospheric profile from the murky quagmire of bytes, bits, and floats.

Writers, and Modifiers

Generally, most fields inside a Sampled structure should be considered “read-only”, in that there ins a single writer, and generally, the fields should be read rather than written. In the comments above each field, there should exist a small block of text that looks like below, which should give insight to the expected writers (which write original data) and modifiers, who may add additional data to each field. It is assumed that anyone with a data file can read whatever they want, for what would be the purpose for writing and disseminating if you could not read the data?

Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None

ACS means tools from the ACS codebase, which might include tools to explicitly export data.

Field Type Label Description
min_aspen_version SemVer required MinAspenVersion is a version identifier for the requested ASPEN version required to process this data. Ideally this only changes for breaking changes, or when unforeseen data processing mayhem ensues. Not honoring this field should be considered highly dangerous and fraught with data corruption risks
AcsCreatedVersion SemVer required AcsCreatedVersion is the version of ACS that created this file. The same data is duplicated elsewhere (eg the metadata fields)
beginning google.protobuf.Timestamp optional Beginning time of Sampled data structure (if known)
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : ACS, Aspen        
  end google.protobuf.Timestamp optional End time of Sampled data structure (if known)

If the data encoded is a single sounding, this is usually the time when the channel was closed, otherwise this is normally the time when the data was extracted from the data store.

Writers, and Modifiers WRITER(S) : ACS MODIFIERS : ACS, Aspen        
  description string required Description is a human readable string describing the data stored within.

This is usually one of the following values:

A string of the form Instance (42) generally applied this is incomplete dump of a ACS run instance.

A string of the form project::mission is a data export from ACS containing a dump of a potentially singular data from a single flight instance related to a project named project and a flight / mission mission;

A string in the form EquatorialRegion-AD75A0E8-3C59-4A3B-A747-5AA224D3B0BE indicates the data within represents a sounding with the automatically assigned name “EquatorialRegion” & UUID “AD75A0E8-3C59-4A3B-A747-5AA224D3B0BE”

A string in the form export generally means the data within is a dump of all data recorded over multiple missions, projects, or soundings.

Writers, and Modifiers WRITER(S) : ACS MODIFIERS : ACS, Aspen, Other Tooling        
  samples RawSample repeated Samples is the set of all data that has been received from all sondes. This essentially is a 1:1 unpacking of binary values without any sort of filtering applied.
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  editio_princeps Profile optional EditioPrinceps is the first press of a sounding from a set of RawSample collection.

This is the first pass non-QC’d set of data that represents an atmospheric sample. The data is unmolested in any way, and has had nothing done other than getting the samples into their natural sample frequency. This only exists if the data has been extracted as a sounding.

Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  recensions Profile repeated Recensions is a slice of various Profiles that have been polished from the original EditioPrinceps
Writers, and Modifiers WRITER(S) : Aspen MODIFIERS : Aspen        
  metadata Metadata repeated Metadata is a snapshot of metadata related to this sounding, mission, or project.

End users are expected to NOT overwrite values, but simply add more parameters. In this sense, multiple values with the same parent, key, and differing values indicate that the most recent (eg: higher indexes in the repeated array) should be taken as definitive.

Writers, and Modifiers WRITER(S) : ACS MODIFIERS : Aspen, Others        
  iwgadts Iwgadts1 repeated Iwgadts is the set of all received IWGADTS1 messages received from in the time period specified by beginning and end
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  references RefSample repeated References is a set of reference pressure, temperature, or humidity samples that are taken over the source of a sounding. These values may be missing, or only contain particular parameters given whatever reference(s) that may be attached.
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  gps Gps repeated gps is the set of all received GPS messages received from the time period specified by beginning and end times
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  chassis Chassis repeated chassis is a set of chassis health messages received during the time period specified
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  channel Channel repeated Channel is the collection of channel messages gathered while a channel was running.

Most of this information is useful only for engineering purpose, and may aid in identifying different technical issues that may occur with a sounding.

Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  commands Control repeated Commands is a set of commands that were issued on behalf of, or related to, some specified time period
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  users User repeated Users is a set of all the users that this system has seen.
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  syslog Syslog repeated Syslog is a set of all the syslog messages this system has stored
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : Aspen        
  spectrum Sweep repeated Spectrum is a set of spectral sweeps performed over the specified time period.
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None        
  gv_state GvLnchrState repeated GvState is a set of state measurements taken over the course of a sounding or flight on a NCAR G-V system. This is mostly a large group of engineering data points that can be used to aid in system performance.
Writers, and Modifiers WRITER(S) : ACS MODIFIERS : None

SemVer

SemVer is a Semantic Version Identifier, as per https://semver.org

Field Type Label Description
Major uint32 required MAJOR version when you make incompatible API changes,
Minor uint32 required MINOR version when you add functionality in a backwards-compatible manner, and
Patch uint32 required PATCH version when you make backwards-compatible bug fixes.
Name string optional Name is some human given release name, or version control identifier

spectrum.proto

Sweep

Sweep is a spectral sweep taken at some point in time.

Most of this structure is metadata boilerplate. The important bits is the RawData byte slice which is a 606 byte long string that looks like the following

473F373635363536363735363636363635353636343636353636363735353538363536393C3935373F3E3A373741423A393A423D37363C3E39383E3B393837373736363736363A423A383837373735373637363C3938373637363735363636433937383739373637383637363837383737363837373839383637373637373738383837393839373637383737383737383739393838383B393739453A38393838383738373938373837373838373837383837393938373A3B393938393737383737373837363738383A3736373739383937373638383838804A3B39383939373939393838393F39383736383736373736363738373637393839394C3D383737363737373837363735353637383636353836353744463937363738393736363536363736353636363536363636000000\r\n

This is a representation of a spectral sweep of 299 points from 400.02 to 406.00MHz spaced at approximately 200KHz. There are 299 serial repetitions an analog to digital conversion (ADC) sample that is a 2 byte hex representation with an additional ignored ‘000000’ followed by a \r\n. Each 2-byte sample is expanded hex, meaning the 2-byte slice sequence of “4f” represents a measurement of 0x4f, or 79 decimal. From there, these ADC counts are converted to a RF power measurement via the following empirical formula:

RF_power_dBm = (count - 363.42) / 2.519

By way of example:

‘47’ -> 0x47 -> 71 -> RF_power_dBm(71) = -110.25 ‘3F’ -> 0x3F -> 63 -> RF_power_dBm(63) = -112.25

This operation is repeated for each of the pairs across the sweep.

The remaining 6 “0” bytes have some meaning, but as they never changes, their values can just be ignored.

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
sample_time google.protobuf.Timestamp required SampleTime is the timestamp when the data stored in this message was gathered.
raw_data bytes optional RawData is the set of raw bytes read off the wire. See above for how to decipher the data
gaus_sweep double repeated GausSweep is an array of 299 double values that represent the power level of the RF Spectrum from 400.02 to 405.98 MHz in 200kHz steps. If this is missing or there are less values, then this is an incomplete sweep and should be discarded. This is quite ugly, but given that the width (# elements) hasn’t changed in the last 30 years, this structure should be kept for now
These values are not populated in the database but are populated and values used internally

syslog.proto

Syslog

Syslog is a representation of an stored log message

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
uuid string required Uuid is the Users UUID, which is unique across logins, although the ID is used
sender string required Sender is the self-described name of who emitted the log message.
message string required Message is the freeform text message written by sender. There is no rhyme or reason as to what is contained within this, so don’t try to grep for values in here

user.proto

User

User is a representation of an ACS user, as stored in the database

Field Type Label Description
id int32 required Database ID - should be unique across a flight
created_at google.protobuf.Timestamp required CreatedAt is the timestamp when the database inserted this item
updated_at google.protobuf.Timestamp required UpdatedAt is the timestamp when the database may have updated this item.
deleted_at google.protobuf.Timestamp optional DeletedAt is the timestamp when this item was maked as deleted. This field is not currently used in ACS
instance_id int32 required InstanceID is a unique instance ID assigned at start time to every frame recorded during a particular application instance
uuid string required Uuid is the Users UUID, which is unique across logins, although the ID is used
email string required Email is he Users email, which should conform to user@domain.tld
agent string required Agent is the User Agent of the Browser the user logged in with. This is taken as-is from the client
role int32 required Role is the login role the user logged in as.

Scalar Value Types

.proto Type Notes C++ Type Java Type Python Type
double   double double float
float   float float float
int32 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint32 instead. int32 int int
int64 Uses variable-length encoding. Inefficient for encoding negative numbers – if your field is likely to have negative values, use sint64 instead. int64 long int/long
uint32 Uses variable-length encoding. uint32 int int/long
uint64 Uses variable-length encoding. uint64 long int/long
sint32 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int32s. int32 int int
sint64 Uses variable-length encoding. Signed int value. These more efficiently encode negative numbers than regular int64s. int64 long int/long
fixed32 Always four bytes. More efficient than uint32 if values are often greater than 2^28. uint32 int int
fixed64 Always eight bytes. More efficient than uint64 if values are often greater than 2^56. uint64 long int/long
sfixed32 Always four bytes. int32 int int
sfixed64 Always eight bytes. int64 long int/long
bool   bool boolean boolean
string A string must always contain UTF-8 encoded or 7-bit ASCII text. string String str/unicode
bytes May contain any arbitrary sequence of bytes. string ByteString str