Skip to content

Commit

Permalink
CAN 2.0B migration (#19)
Browse files Browse the repository at this point in the history
  • Loading branch information
JasonBrave authored Feb 25, 2025
2 parents 511d550 + e028255 commit cb9bea5
Show file tree
Hide file tree
Showing 5 changed files with 231 additions and 290 deletions.
2 changes: 1 addition & 1 deletion parsley/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from . import message_definitions
from . import message_types
from .parsley import (
parse_fields, parse, parse_board_id,
parse_fields, parse, parse_board_type_id, parse_board_inst_id,
parse_bitstring,
parse_live_telemetry,
parse_usb_debug,
Expand Down
107 changes: 33 additions & 74 deletions parsley/message_definitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,86 +4,45 @@

# returns data scaled in seconds (ie. reads raw data in milliseconds and outputs seconds)
TIMESTAMP_2 = Numeric('time', 16, scale=1/1000, unit='s')
TIMESTAMP_3 = Numeric('time', 24, scale=1/1000, unit='s')

MESSAGE_TYPE = Enum('msg_type', 6, mt.adjusted_msg_type)
BOARD_ID = Enum('board_id', 5, mt.board_id)
MESSAGE_SID = Enum('msg_sid', MESSAGE_TYPE.length + BOARD_ID.length, {}) # used purely as a length constant

BOARD_STATUS = {
'E_NOMINAL': [],

'E_5V_OVER_CURRENT': [Numeric('current', 16)],
'E_5V_UNDER_VOLTAGE': [Numeric('voltage', 16)],
'E_5V_OVER_VOLTAGE': [Numeric('voltage', 16)],

'E_BATT_OVER_CURRENT': [Numeric('current', 16)],
'E_BATT_UNDER_VOLTAGE': [Numeric('voltage', 16)],
'E_BATT_OVER_VOLTAGE': [Numeric('voltage', 16)],

'E_13V_OVER_CURRENT': [],
'E_MOTOR_OVER_CURRENT': [],

'E_BOARD_FEARED_DEAD': [Enum('dead_board_id', 8, mt.board_id)],
'E_NO_CAN_TRAFFIC': [Numeric('err_time', 16)],
'E_MISSING_CRITICAL_BOARD': [Enum('missing_board_id', 8, mt.board_id)],
'E_RADIO_SIGNAL_LOST': [Numeric('err_time', 16)],

'E_ACTUATOR_STATE': [Enum('req_state', 8, mt.actuator_states), Enum('cur_state', 8, mt.actuator_states)],
'E_CANNOT_INIT_DACS': [],
'E_VENT_POT_RANGE': [Numeric('upper', 8, scale=1/1000), Numeric('lower', 8, scale=1/1000), Numeric('pot', 8, scale=1/1000)],

'E_LOGGING': [Enum('error', 8, mt.logger_error)],
'E_GPS': [],
'E_SENSOR': [Enum('sensor_id', 8, mt.sensor_id)],
'E_VIDEO': [Enum('state', 8, mt.video_state)],

'E_ILLEGAL_CAN_MSG': [],
'E_SEGFAULT': [],
'E_UNHANDLED_INTERRUPT': [],
'E_CODING_SCREWUP': []
}
MESSAGE_PRIO = Enum('msg_prio', 2, mt.msg_prio)
MESSAGE_TYPE = Enum('msg_type', 9, mt.msg_type)
BOARD_TYPE_ID = Enum('board_type_id', 8, mt.board_type_id)
BOARD_INST_ID = Enum('board_inst_id', 8, mt.board_inst_id)
MESSAGE_SID = Enum('msg_sid', MESSAGE_PRIO.length + MESSAGE_TYPE.length + 2 + BOARD_TYPE_ID.length + BOARD_INST_ID.length, {}) # used purely as a length constant

# we parse BOARD_ID seperately from the CAN message (since we want to continue parsing even if BOARD_ID throws)
# but BOARD_ID is still here so that Omnibus has all the fields it needs when creating messages to send
MESSAGES = {
'GENERAL_CMD': [BOARD_ID, TIMESTAMP_3, Enum('command', 8, mt.gen_cmd)],
'ACTUATOR_CMD': [BOARD_ID, TIMESTAMP_3, Enum('actuator', 8, mt.actuator_id), Enum('req_state', 8, mt.actuator_states)],
'ALT_ARM_CMD': [BOARD_ID, TIMESTAMP_3, Enum('state', 4, mt.arm_states), Numeric('altimeter', 4)],
'RESET_CMD': [BOARD_ID, TIMESTAMP_3, Enum('reset_board_id', 8, mt.board_id)],

'DEBUG_MSG': [BOARD_ID, TIMESTAMP_3, Numeric('level', 4), Numeric('line', 12), ASCII('data', 24)],
'DEBUG_PRINTF': [BOARD_ID, ASCII('string', 64)],
'DEBUG_RADIO_CMD': [BOARD_ID, ASCII('string', 64)],
'ACT_ANALOG_CMD': [BOARD_ID, TIMESTAMP_3, Enum('actuator', 8, mt.actuator_id), Numeric('act_state', 8)],

'ACTUATOR_STATUS': [BOARD_ID, TIMESTAMP_3, Enum('actuator', 8, mt.actuator_id), Enum('cur_state', 8, mt.actuator_states), Enum('req_state', 8, mt.actuator_states)],
'ALT_ARM_STATUS': [BOARD_ID, TIMESTAMP_3, Enum('state', 4, mt.arm_states), Numeric('altimeter', 4), Numeric('drogue_v', 16), Numeric('main_v', 16)],
'GENERAL_BOARD_STATUS': [BOARD_ID, TIMESTAMP_3, Switch('status', 8, mt.board_status, BOARD_STATUS)],

'SENSOR_TEMP': [BOARD_ID, TIMESTAMP_3, Numeric('sensor_id', 8), Numeric('temperature', 24, scale=1/2**10, unit='°C', signed=True)],
'SENSOR_ALTITUDE': [BOARD_ID, TIMESTAMP_3, Numeric('altitude', 32, signed=True)],
'SENSOR_ACC': [BOARD_ID, TIMESTAMP_2, Numeric('x', 16, scale=8/2**16, unit='m/s²', signed=True), Numeric('y', 16, scale=8/2**16, unit='m/s²', signed=True), Numeric('z', 16, scale=8/2**16, unit='m/s²', signed=True)],
'SENSOR_ACC2': [BOARD_ID, TIMESTAMP_2, Numeric('x', 16, scale=16/2**16, unit='m/s²', signed=True), Numeric('y', 16, scale=16/2**16, unit='m/s²', signed=True), Numeric('z', 16, scale=16/2**16, unit='m/s²', signed=True)],
'SENSOR_GYRO': [BOARD_ID, TIMESTAMP_2, Numeric('x', 16, scale=2000/2**16, unit='°/s', signed=True), Numeric('y', 16, scale=2000/2**16, unit='°/s', signed=True), Numeric('z', 16, scale=2000/2**16, unit='°/s', signed=True)],

'STATE_EST_CALIB': [BOARD_ID, TIMESTAMP_3, Numeric('ack_flag', 8), Numeric('apogee', 16)],
'SENSOR_MAG': [BOARD_ID, TIMESTAMP_2, Numeric('x', 16, unit='µT', signed=True), Numeric('y', 16, unit='µT', signed=True), Numeric('z', 16, unit='µT', signed=True)],
'SENSOR_ANALOG': [BOARD_ID, TIMESTAMP_2, Enum('sensor_id', 8, mt.sensor_id), Numeric('value', 16, signed=True)],

'GPS_TIMESTAMP': [BOARD_ID, TIMESTAMP_3, Numeric('hrs', 8), Numeric('mins', 8), Numeric('secs', 8), Numeric('dsecs', 8)],
'GPS_LATITUDE': [BOARD_ID, TIMESTAMP_3, Numeric('degs', 8), Numeric('mins', 8), Numeric('dmins', 16), ASCII('direction', 8)],
'GPS_LONGITUDE': [BOARD_ID, TIMESTAMP_3, Numeric('degs', 8), Numeric('mins', 8), Numeric('dmins', 16), ASCII('direction', 8)],
'GPS_ALTITUDE': [BOARD_ID, TIMESTAMP_3, Numeric('altitude', 16), Numeric('daltitude', 8), ASCII('unit', 8)],
'GPS_INFO': [BOARD_ID, TIMESTAMP_3, Numeric('num_sats', 8), Numeric('quality', 8)],

'FILL_LVL': [BOARD_ID, TIMESTAMP_3, Numeric('level', 8), Enum('direction', 8, mt.fill_direction)],
'STATE_EST_DATA': [BOARD_ID, TIMESTAMP_3, Floating('data', big_endian=False), Enum('state_id', 8, mt.state_id)],

'LEDS_ON': [BOARD_ID],
'LEDS_OFF': [BOARD_ID]
'GENERAL_BOARD_STATUS': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Numeric('general_error_bitfield', 32), Numeric('board_error_bitfield', 16)],
'RESET_CMD': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('board_type_id', 8, mt.board_type_id), Enum('board_inst_id', 8, mt.board_inst_id)],
'DEBUG_RAW': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, ASCII('string', 48)],
'CONFIG_SET': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('board_type_id', 8, mt.board_type_id), Enum('board_inst_id', 8, mt.board_inst_id), Numeric('config_id', 16), Numeric('config_value', 16)],
'CONFIG_STATUS': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Numeric('config_id', 16), Numeric('config_value', 16)],
'ACTUATOR_CMD': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('actuator', 8, mt.actuator_id), Enum('cmd_state', 8, mt.actuator_state)],
'ACTUATOR_ANALOG_CMD': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('actuator', 8, mt.actuator_id), Numeric('cmd_state', 16)],
'ACTUATOR_STATUS': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('actuator', 8, mt.actuator_id), Enum('curr_state', 8, mt.actuator_state), Enum('cmd_state', 8, mt.actuator_state)],
'ALT_ARM_CMD': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('alt_id', 8, mt.altimeter_id), Enum('alt_arm_state', 8, mt.alt_arm_state)],
'ALT_ARM_STATUS': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('alt_id', 8, mt.altimeter_id), Enum('alt_arm_state', 8, mt.alt_arm_state), Numeric('drogue_v', 16), Numeric('main_v', 16)],
'SENSOR_TEMP': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Numeric('temp_sensor_id', 8), Numeric('temperature', 32, scale=1/2**10, unit='°C', signed=True)],
'SENSOR_ALTITUDE': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Numeric('altitude', 32, signed=True)],
'SENSOR_IMU_X': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('imu_id', 8, mt.imu_id), Numeric('linear_accel', 16, scale=8/2**16, unit='m/s²', signed=True), Numeric('angular_velocity', 16, scale=2000/2**16, unit='°/s', signed=True)],
'SENSOR_IMU_Y': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('imu_id', 8, mt.imu_id), Numeric('linear_accel', 16, scale=8/2**16, unit='m/s²', signed=True), Numeric('angular_velocity', 16, scale=2000/2**16, unit='°/s', signed=True)],
'SENSOR_IMU_Z': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('imu_id', 8, mt.imu_id), Numeric('linear_accel', 16, scale=8/2**16, unit='m/s²', signed=True), Numeric('angular_velocity', 16, scale=2000/2**16, unit='°/s', signed=True)],
'SENSOR_MAG_X': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('imu_id', 8, mt.imu_id), Numeric('mag', 16)],
'SENSOR_MAG_Y': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('imu_id', 8, mt.imu_id), Numeric('mag', 16)],
'SENSOR_MAG_Z': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('imu_id', 8, mt.imu_id), Numeric('mag', 16)],
'SENSOR_ANALOG': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('sensor_id', 8, mt.analog_sensor_id), Numeric('value', 16)],
'GPS_TIMESTAMP': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Numeric('hrs', 8), Numeric('mins', 8), Numeric('secs', 8), Numeric('dsecs', 8)],
'GPS_LATITUDE': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Numeric('degs', 8), Numeric('mins', 8), Numeric('dmins', 16), ASCII('direction', 8)],
'GPS_LONGITUDE': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Numeric('degs', 8), Numeric('mins', 8), Numeric('dmins', 16), ASCII('direction', 8)],
'GPS_ALTITUDE': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Numeric('altitude', 16), Numeric('daltitude', 8), ASCII('unit', 8)],
'GPS_INFO': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Numeric('num_sats', 8), Numeric('quality', 8)],
'STATE_EST_DATA': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID, TIMESTAMP_2, Enum('state_id', 8, mt.state_est_id), Floating('data', big_endian=True)],
'LEDS_ON': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID],
'LEDS_OFF': [MESSAGE_PRIO, BOARD_TYPE_ID, BOARD_INST_ID]
}

# entire CAN message minus board_id
# board_id is parsed seperately because if it throws, we want to continue parsing
CAN_MESSAGE = Switch('msg_type', MESSAGE_TYPE.length, mt.adjusted_msg_type, MESSAGES)
CAN_MESSAGE = Switch('msg_type', MESSAGE_TYPE.length, mt.msg_type, MESSAGES)
Loading

0 comments on commit cb9bea5

Please sign in to comment.