From 1c518df39c59c8863624eb4a402d0b77edae59b2 Mon Sep 17 00:00:00 2001 From: Nicholas Tang Date: Sat, 18 Oct 2025 23:17:46 -0700 Subject: [PATCH 1/9] update dbc with correct min/max vals. rudimentary lap counter added --- CANbus.dbc | 785 +++++++++++++------------ Telemetry-Main/CANProtocol.hpp | 34 +- Telemetry-Main/VehicleStateManager.cpp | 25 + Telemetry-Main/VehicleStateManager.hpp | 17 +- 4 files changed, 454 insertions(+), 407 deletions(-) diff --git a/CANbus.dbc b/CANbus.dbc index bdd2e765..a4f0afff 100644 --- a/CANbus.dbc +++ b/CANbus.dbc @@ -1,389 +1,396 @@ -VERSION "" - - -NS_ : - NS_DESC_ - CM_ - BA_DEF_ - BA_ - VAL_ - CAT_DEF_ - CAT_ - FILTER - BA_DEF_DEF_ - EV_DATA_ - ENVVAR_DATA_ - SGTYPE_ - SGTYPE_VAL_ - BA_DEF_SGTYPE_ - BA_SGTYPE_ - SIG_TYPE_REF_ - VAL_TABLE_ - SIG_GROUP_ - SIG_VALTYPE_ - SIGTYPE_VALTYPE_ - BO_TX_BU_ - BA_DEF_REL_ - BA_REL_ - BA_DEF_DEF_REL_ - BU_SG_REL_ - BU_EV_REL_ - BU_BO_REL_ - SG_MUL_VAL_ - -BS_: - -BU_: SME ACC ETC PDB TMAIN VDM TPERIPH_FL TPERIPH_FR TPERIPH_BL TPERIPH_BR SMPC CHARGER_BOARD - - -BO_ 2147483648 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX - SG_ ACC_STATUS_PRECARGE_DONE : 5|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_SEG5_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG5_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG5_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG5_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG5_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG5_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG5_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG5_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG5_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG5_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG5_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG5_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX - -BO_ 128 SYNC: 0 ETC - -BO_ 390 SME_RPDO_Throttle_Demand: 8 ETC - SG_ SME_THROTL_PowerReady : 35|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_THROTL_MBB_Alive : 40|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ SME_THROTL_Reverse : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_THROTL_Forward : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_THROTL_MaxSpeed : 16|16@1- (1,0) [-32768|32767] "RPM" Vector__XXX - SG_ SME_THROTL_TorqueDemand : 0|16@1- (1,0) [-32767|32767] "Q15" Vector__XXX - -BO_ 646 SME_RPDO_Max_Currents: 8 ETC - SG_ SME_CURRLIM_ChargeCurrentLim : 0|16@1+ (1,0) [0|65535] "A" Vector__XXX - SG_ SME_CURRLIM_DischargeCurrentLim : 16|16@1+ (1,0) [0|65535] "A" Vector__XXX - -BO_ 1154 SME_TPDO_Torque_speed: 8 SME - SG_ SME_TRQSPD_SOC_Low_Traction : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_SOC_Low_Hydraulic : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Reverse : 34|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Forward : 35|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Park_Brake : 36|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Pedal_Brake : 37|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Controller_Overtermp : 38|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Key_switch_overvolt : 39|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Key_switch_undervolt : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Running : 41|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Traction : 42|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Hydraulic : 43|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Powering_Enabled : 44|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Powering_Ready : 45|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_contactor_closed : 47|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Precharging : 46|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SME_TRQSPD_Speed : 0|16@1+ (1,0) [-32768|32767] "RPM" Vector__XXX - SG_ SME_TRQSPD_MotorFlags : 48|16@1+ (1,0) [0|65535] "" Vector__XXX - SG_ SME_TRQSPD_Torque : 16|16@1- (1,0) [-32767|32767] "Q15" Vector__XXX - -BO_ 1666 SME_TPDO_Temperature: 8 SME - SG_ SME_TEMP_FaultLevel : 40|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ SME_TEMP_FaultCode : 32|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ SME_TEMP_DC_Bus_V : 16|16@1+ (0.1,0) [0|6553.5] "V" Vector__XXX - SG_ SME_TEMP_ControllerTemperature : 8|8@1+ (1,-40) [0|255] "C" Vector__XXX - SG_ SME_TEMP_MotorTemperature : 0|8@1+ (1,-40) [0|255] "C" Vector__XXX - SG_ SME_TEMP_BusCurrent : 48|16@1- (0.1,0) [-3276.8|3276.7] "A" Vector__XXX - -BO_ 392 ACC_TPDO_STATUS: 8 ACC - SG_ ACC_STATUS_BMS_FAULT : 0|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_IMD_FAULT : 1|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_SHUTDOWN_STATE : 2|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_PRECHARGE_DONE : 3|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_PRECHARGING : 4|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_CELL_TOO_LOW : 8|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_CELL_TOO_HIGH : 9|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_TEMP_TOO_LOW : 10|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_TEMP_TOO_HIGH : 11|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_TEMP_TOO_HIGH_CRG : 12|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_CHARGING : 5|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_GLV_VOLTAGE : 16|16@1+ (1,0) [0|65.635] "mV" Vector__XXX - SG_ ACC_STATUS_CELL_FAULT_INDEX : 32|32@1+ (1,0) [0|0] "" Vector__XXX - SG_ ACC_STATUS_BALANCING : 13|1@1+ (1,0) [0|0] "" Vector__XXX - -BO_ 648 ACC_TPDO_POWER: 8 ACC - SG_ ACC_POWER_PACK_VOLTAGE : 0|16@1+ (0.01,0) [0|655.35] "V" Vector__XXX - SG_ ACC_POWER_SOC : 16|8@1+ (1,0) [0|255] "Percentage" Vector__XXX - SG_ ACC_POWER_CURRENT : 24|16@1- (0.1,0) [-3276.8|3276.7] "A" Vector__XXX - -BO_ 401 ACC_TPDO_SEG0_VOLTS: 6 ACC - SG_ ACC_SEG0_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG0_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG0_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG0_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG0_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG0_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - -BO_ 657 ACC_TPDO_SEG0_TEMPS: 6 ACC - SG_ ACC_SEG0_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG0_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG0_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG0_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG0_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG0_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX - -BO_ 402 ACC_TPDO_SEG1_VOLTS: 6 ACC - SG_ ACC_SEG1_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG1_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG1_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG1_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG1_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG1_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - -BO_ 658 ACC_TPDO_SEG1_TEMPS: 6 ACC - SG_ ACC_SEG1_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG1_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG1_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG1_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG1_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG1_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX - -BO_ 403 ACC_TPDO_SEG2_VOLTS: 6 ACC - SG_ ACC_SEG2_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG2_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG2_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG2_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG2_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG2_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - -BO_ 659 ACC_TPDO_SEG2_TEMPS: 6 ACC - SG_ ACC_SEG2_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG2_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG2_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG2_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG2_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG2_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX - -BO_ 404 ACC_TPDO_SEG3_VOLTS: 6 ACC - SG_ ACC_SEG3_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG3_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG3_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG3_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG3_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG3_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - -BO_ 660 ACC_TPDO_SEG3_TEMPS: 6 ACC - SG_ ACC_SEG3_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG3_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG3_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG3_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG3_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG3_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX - -BO_ 405 ACC_TPDO_SEG4_VOLTS: 6 ACC - SG_ ACC_SEG4_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG4_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG4_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG4_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG4_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - SG_ ACC_SEG4_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX - -BO_ 661 ACC_TPDO_SEG4_TEMPS: 6 ACC - SG_ ACC_SEG4_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG4_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG4_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG4_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG4_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX - SG_ ACC_SEG4_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX - -BO_ 2148139008 VDM_GPS_LAT_LONG: 8 VDM - SG_ VDM_GPS_Latitude : 7|32@0- (1,0) [0|0] "deg" Vector__XXX - SG_ VDM_GPS_Longitude : 39|32@0- (1,0) [0|0] "deg" Vector__XXX - -BO_ 2148139009 VDM_GPS_DATA: 8 VDM - SG_ VDM_GPS_SPEED : 7|16@0+ (0.01,0) [0|0] "mph" Vector__XXX - SG_ VDM_GPS_ALTITUDE : 23|16@0- (1,0) [0|0] "ft" Vector__XXX - SG_ VDM_GPS_TRUE_COURSE : 39|16@0+ (0.01,0) [0|0] "deg" Vector__XXX - SG_ VDM_GPS_SATELLITES_IN_USE : 55|8@0+ (1,0) [0|0] "" Vector__XXX - SG_ VDM_GPS_VALID1 : 63|8@0+ (1,0) [0|0] "" Vector__XXX - -BO_ 2148139010 VDM_DATE_TIME: 8 VDM - SG_ VDM_GPS_VALID2 : 7|8@0+ (1,0) [0|0] "" Vector__XXX - SG_ VDM_UTC_DATE_YEAR : 15|8@0+ (1,0) [0|0] "years" Vector__XXX - SG_ VDM_UTC_DATE_MONTH : 23|8@0+ (1,0) [0|0] "months" Vector__XXX - SG_ VDM_UTC_DATE_DAY : 31|8@0+ (1,0) [0|0] "days" Vector__XXX - SG_ VDM_UTC_TIME_HOURS : 47|8@0+ (1,0) [0|0] "hours" Vector__XXX - SG_ VDM_UTC_TIME_MINUTES : 55|8@0+ (1,0) [0|0] "minutes" Vector__XXX - SG_ VDM_UTC_TIME_SECONDS : 63|8@0+ (1,0) [0|0] "seconds" Vector__XXX - -BO_ 2148139011 VDM_ACCELERATION: 8 VDM - SG_ VDM_X_AXIS_ACCELERATION : 7|16@0- (0.000244141,0) [0|0] "gs" Vector__XXX - SG_ VDM_Y_AXIS_ACCELERATION : 23|16@0- (0.000244141,0) [0|0] "gs" Vector__XXX - SG_ VDM_Z_AXIS_ACCELERATION : 39|16@0- (0.000244141,0) [0|0] "gs" Vector__XXX - -BO_ 2148139012 VDM_YAW_RATE: 8 VDM - SG_ VDM_X_AXIS_YAW_RATE : 7|16@0- (0.0152588,0) [0|0] "deg/s" Vector__XXX - SG_ VDM_Y_AXIS_YAW_RATE : 23|16@0- (0.0152588,0) [0|0] "deg/s" Vector__XXX - SG_ VDM_Z_AXIS_YAW_RATE : 39|16@0- (0.0152588,0) [0|0] "deg/s" Vector__XXX - -BO_ 393 ETC_TPDO_STATUS: 8 ETC - SG_ ETC_STATUS_HE1 : 0|16@1+ (1,0) [0|65535] "mV" Vector__XXX - SG_ ETC_STATUS_HE2 : 16|16@1+ (1,0) [0|65535] "mV" Vector__XXX - SG_ ETC_STATUS_BRAKE_SENSE_VOLTAGE : 32|16@1+ (1,0) [0|65535] "mV" Vector__XXX - SG_ ETC_STATUS_RTD_BUTTON : 56|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ETC_STATUS_RTDS : 57|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ETC_STATUS_REVERSE : 58|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ETC_STATUS_BRAKELIGHT : 59|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ETC_STATUS_PEDAL_TRAVEL : 48|8@1+ (1,0) [0|100] "%" Vector__XXX - SG_ ETC_STATUS_RTD : 60|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ETC_STATUS_IMPLAUSIBILITY : 61|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ ETC_STATUS_TS_ACTIVE : 62|1@1+ (1,0) [0|0] "" Vector__XXX - -BO_ 410 PDB_TPDO_POWER_A: 8 PDB - SG_ PDB_POWER_A_GLV_VOLTAGE : 0|16@1+ (1,0) [0|65535] "mV" Vector__XXX - SG_ PDB_POWER_A_CURRENT_SHUTDOWN : 16|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_A_CURRENT_ACC : 24|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_A_CURRENT_ETC : 32|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_A_CURRENT_BPS : 40|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_A_CURRENT_TRACTIVE : 48|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_A_CURRENT_BSPD : 56|8@1+ (1,0) [0|255] "lsb" Vector__XXX - -BO_ 666 PDB_TPDO_POWER_B: 8 PDB - SG_ PDB_POWER_B_CURRENT_TELEMETRY : 0|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_B_CURRENT_PDB : 8|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_B_CURRENT_DASH : 16|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_B_CURRENT_RTML : 24|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_B_CURRENT_EXTRA_1 : 32|8@1+ (1,0) [0|255] "lsb" Vector__XXX - SG_ PDB_POWER_B_CURRENT_EXTRA_2 : 40|8@1+ (1,0) [0|255] "lsb" Vector__XXX - -BO_ 416 TMAIN_TPDO_DATA: 8 TMAIN - SG_ TMAIN_DATA_BRAKES_F : 0|16@1+ (0.1,0) [0|0] "psi" Vector__XXX - SG_ TMAIN_DATA_BRAKES_R : 16|16@1+ (0.1,0) [0|0] "psi" Vector__XXX - -BO_ 418 TPERIPH_FL_TPDO_DATA: 7 TPERIPH_FL - SG_ TPERIPH_FL_DATA_WHEELSPEED : 0|16@1- (0.1,0) [0|0] "rpm" Vector__XXX - SG_ TPERIPH_FL_DATA_SUSTRAVEL : 16|16@1+ (0.01,0) [0|655.35] "mm" Vector__XXX - SG_ TPERIPH_FL_DATA_STRAIN : 32|16@1- (1e-07,0) [0|0] "%" Vector__XXX - SG_ TPERIPH_FL_DATA_SIDE_TIRE_TEMP : 48|8@1+ (1,0) [0|255] "C" Vector__XXX - -BO_ 419 TPERIPH_FR_TPDO_DATA: 7 TPERIPH_FR - SG_ TPERIPH_FR_DATA_WHEELSPEED : 0|16@1- (0.1,0) [0|0] "rpm" Vector__XXX - SG_ TPERIPH_FR_DATA_SUSTRAVEL : 16|16@1+ (0.01,0) [0|655.35] "mm" Vector__XXX - SG_ TPERIPH_FR_DATA_STRAIN : 32|16@1- (1e-07,0) [0|0] "%" Vector__XXX - SG_ TPERIPH_FR_DATA_SIDE_TIRE_TEMP : 48|8@1+ (1,0) [0|255] "C" Vector__XXX - -BO_ 420 TPERIPH_BL_TPDO_DATA: 7 TPERIPH_BL - SG_ TPERIPH_BL_DATA_WHEELSPEED : 0|16@1- (0.1,0) [0|0] "rpm" Vector__XXX - SG_ TPERIPH_BL_DATA_SUSTRAVEL : 16|16@1+ (0.01,0) [0|655.35] "mm" Vector__XXX - SG_ TPERIPH_BL_DATA_STRAIN : 32|16@1- (1e-07,0) [0|0] "%" Vector__XXX - SG_ TPERIPH_BL_DATA_SIDE_TIRE_TEMP : 48|8@1+ (1,0) [0|255] "C" Vector__XXX - -BO_ 421 TPERIPH_BR_TPDO_DATA: 7 TPERIPH_BR - SG_ TPERIPH_BR_DATA_WHEELSPEED : 0|16@1- (0.1,0) [0|0] "rpm" Vector__XXX - SG_ TPERIPH_BR_DATA_SUSTRAVEL : 16|16@1+ (0.01,0) [0|655.35] "mm" Vector__XXX - SG_ TPERIPH_BR_DATA_STRAIN : 32|16@1- (1e-07,0) [0|0] "%" Vector__XXX - SG_ TPERIPH_BR_DATA_SIDE_TIRE_TEMP : 48|8@1+ (1,0) [0|255] "C" Vector__XXX - -BO_ 673 TPERIPH_FL_TPDO_TIRETEMP: 8 TPERIPH_FL - SG_ TPERIPH_FL_TIRETEMP_1 : 0|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FL_TIRETEMP_2 : 8|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FL_TIRETEMP_3 : 16|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FL_TIRETEMP_4 : 24|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FL_TIRETEMP_5 : 32|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FL_TIRETEMP_6 : 40|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FL_TIRETEMP_7 : 48|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FL_TIRETEMP_8 : 56|8@1+ (1,0) [0|0] "C" Vector__XXX - -BO_ 674 TPERIPH_FR_TPDO_TIRETEMP: 8 TPERIPH_FR - SG_ TPERIPH_FR_TIRETEMP_1 : 0|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FR_TIRETEMP_2 : 8|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FR_TIRETEMP_3 : 16|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FR_TIRETEMP_4 : 24|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FR_TIRETEMP_5 : 32|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FR_TIRETEMP_6 : 40|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FR_TIRETEMP_7 : 48|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_FR_TIRETEMP_8 : 56|8@1+ (1,0) [0|0] "C" Vector__XXX - -BO_ 675 TPERIPH_BL_TPDO_TIRETEMP: 8 TPERIPH_BL - SG_ TPERIPH_BL_TIRETEMP_1 : 0|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BL_TIRETEMP_2 : 8|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BL_TIRETEMP_3 : 16|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BL_TIRETEMP_4 : 24|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BL_TIRETEMP_5 : 32|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BL_TIRETEMP_6 : 40|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BL_TIRETEMP_7 : 48|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BL_TIRETEMP_8 : 56|8@1+ (1,0) [0|0] "C" Vector__XXX - -BO_ 676 TPERIPH_BR_TPDO_TIRETEMP: 8 TPERIPH_BR - SG_ TPERIPH_BR_TIRETEMP_1 : 0|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BR_TIRETEMP_2 : 8|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BR_TIRETEMP_3 : 16|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BR_TIRETEMP_4 : 24|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BR_TIRETEMP_5 : 32|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BR_TIRETEMP_6 : 40|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BR_TIRETEMP_7 : 48|8@1+ (1,0) [0|0] "C" Vector__XXX - SG_ TPERIPH_BR_TIRETEMP_8 : 56|8@1+ (1,0) [0|0] "C" Vector__XXX - -BO_ 2021 LSS_COMMAND: 8 CHARGER_BOARD - SG_ COMMAND_MODE : 8|8@1+ (1,0) [0|0] "" Vector__XXX - SG_ COMMAND_COMMAND_SPECIFIER : 0|8@1+ (1,0) [0|0] "" Vector__XXX - -BO_ 2020 LSS_RESPONSE: 8 SMPC - SG_ RESPONSE_COMMAND_SPECIFIER : 0|8@1+ (1,0) [0|0] "" Vector__XXX - -BO_ 518 SMPC_RPDO_CONTROL: 8 CHARGER_BOARD - SG_ SMPC_CONTROL_PACK_VOLTAGE : 16|32@1+ (1,0) [0|65535] "mV" Vector__XXX - SG_ SMPC_CONTROL_DEST_NODE_ID : 0|8@1+ (1,0) [0|0] "" Vector__XXX - SG_ SMPC_CONTROL_ENABLE : 9|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ SMPC_CONTROL_CURRENT_10X_MULT : 11|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ SMPC_CONTROL_EVSE_OVERRIDE : 13|1@1+ (1,0) [0|0] "" Vector__XXX - -BO_ 774 SMPC_RPDO_MAX_VOLTAGE_CURRENT: 8 CHARGER_BOARD - SG_ SMPC_MAX_DEST_NODE_ID : 0|8@1+ (1,0) [0|0] "" Vector__XXX - SG_ SMPC_MAX_CHRG_VOLTAGE : 8|32@1+ (1,0) [0|0] "mV" Vector__XXX - SG_ SMPC_MAX_CHRG_CURRENT : 40|16@1+ (1,0) [0|0] "mA" Vector__XXX - SG_ SMPC_MAX_INPUT_EVSE_OVERRIDE : 56|8@1+ (1,0) [0|255] "A" Vector__XXX - -BO_ 400 SMPC_TPDO_STATUS: 8 SMPC - SG_ SMPC_STATUS_CURRENT_MA : 48|16@1+ (1,0) [0|65535] "mA" Vector__XXX - SG_ SMPC_STATUS_VOLTAGE_MV : 16|32@1+ (1,0) [0|2704] "mV" Vector__XXX - SG_ SMPC_STATUS_J1772_DISCONN : 13|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_REQUEST_EXCLUSIVE : 12|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_CHARGER_UNPLUGGED : 8|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_CHARGING : 7|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_INTERNAL_FAULT : 6|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_UNDERVOLTAGE_FAULT : 5|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_OVERVOLTAGE_FAULT : 4|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_OVERCURRENT_FAULT : 3|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_OVERTEMP_FAULT : 2|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_CHARGE_COMPLETE : 1|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_STATUS_READY : 0|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 656 SMPC_TPDO_MAX_VOLTAGE_CURRENT: 8 SMPC - SG_ SMPC_MAX2_INPUT_CURR_LIM : 56|8@1+ (1,0) [0|255] "A" Vector__XXX - SG_ SMPC_MAX2_EVSE_CURRENT : 48|8@1+ (1,0) [0|255] "A" Vector__XXX - SG_ SMPC_MAX2_MAX_CURRENT_MA : 32|16@1+ (1,0) [0|65535] "mA" Vector__XXX - SG_ SMPC_MAX2_MAX_VOLTAGE_MV : 0|32@1+ (1,0) [0|2704] "mV" Vector__XXX - -BO_ 912 SMPC_TPDO_INPUT_AC: 8 SMPC - SG_ SMPC_INPUT_MAX_CHARGER_TEMP_C : 40|8@1+ (1,-50) [-50|205] "C" Vector__XXX - SG_ SMPC_INPUT_AC_INPUT_FREQUENCY_HZ : 32|8@1+ (1,0) [0|255] "HZ" Vector__XXX - SG_ SMPC_INPUT_AC_INPUT_CURRENT_MA : 16|16@1+ (1,0) [0|65535] "mA" Vector__XXX - SG_ SMPC_INPUT_J1772_TRIGGERED : 10|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_INPUT_J1772_DISCONNECTED : 9|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_INPUT_J1772_CONNECTED : 8|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SMPC_INPUT_AC_INPUT_VOLTAGE : 0|8@1+ (1,0) [0|255] "Vac" Vector__XXX - -BO_ 1168 SMPC_TPDO_SERIAL_PART_NUM: 8 SMPC - SG_ SMPC_SER_FIRMWARE_VER : 48|16@1+ (1,0) [0|65535] "" Vector__XXX - SG_ SMPC_SER_SERIAL_NUMBER : 16|32@1+ (1,0) [0|2704] "" Vector__XXX - SG_ SMPC_SER_PART_NUMBER : 0|16@1+ (1,0) [0|65535] "" Vector__XXX - - - -BA_DEF_ "BusType" STRING ; -BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ; -BA_DEF_ BO_ "GenMsgForegroundColor" STRING ; -BA_DEF_DEF_ "BusType" "CAN"; -BA_DEF_DEF_ "GenMsgBackgroundColor" "#c8c8c8"; -BA_DEF_DEF_ "GenMsgForegroundColor" "#000000"; - +VERSION "" + + +NS_ : + NS_DESC_ + CM_ + BA_DEF_ + BA_ + VAL_ + CAT_DEF_ + CAT_ + FILTER + BA_DEF_DEF_ + EV_DATA_ + ENVVAR_DATA_ + SGTYPE_ + SGTYPE_VAL_ + BA_DEF_SGTYPE_ + BA_SGTYPE_ + SIG_TYPE_REF_ + VAL_TABLE_ + SIG_GROUP_ + SIG_VALTYPE_ + SIGTYPE_VALTYPE_ + BO_TX_BU_ + BA_DEF_REL_ + BA_REL_ + BA_DEF_DEF_REL_ + BU_SG_REL_ + BU_EV_REL_ + BU_BO_REL_ + SG_MUL_VAL_ + +BS_: + +BU_: SME ACC ETC PDB TMAIN VDM TPERIPH_FL TPERIPH_FR TPERIPH_BL TPERIPH_BR SMPC CHARGER_BOARD + + +BO_ 2147483648 VECTOR__INDEPENDENT_SIG_MSG: 0 Vector__XXX + SG_ ACC_STATUS_PRECARGE_DONE : 5|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_SEG5_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG5_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG5_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG5_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG5_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG5_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG5_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG5_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG5_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG5_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG5_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG5_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX + +BO_ 128 SYNC: 0 ETC + +BO_ 390 SME_RPDO_Throttle_Demand: 8 ETC + SG_ SME_THROTL_PowerReady : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_THROTL_MBB_Alive : 40|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ SME_THROTL_Reverse : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_THROTL_Forward : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_THROTL_MaxSpeed : 16|16@1- (1,0) [-32768|32767] "RPM" Vector__XXX + SG_ SME_THROTL_TorqueDemand : 0|16@1- (1,0) [-32767|32767] "Q15" Vector__XXX + +BO_ 646 SME_RPDO_Max_Currents: 8 ETC + SG_ SME_CURRLIM_ChargeCurrentLim : 0|16@1+ (1,0) [0|65535] "A" Vector__XXX + SG_ SME_CURRLIM_DischargeCurrentLim : 16|16@1+ (1,0) [0|65535] "A" Vector__XXX + +BO_ 1154 SME_TPDO_Torque_speed: 8 SME + SG_ SME_TRQSPD_SOC_Low_Traction : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_SOC_Low_Hydraulic : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Reverse : 34|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Forward : 35|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Park_Brake : 36|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Pedal_Brake : 37|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Controller_Overtermp : 38|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Key_switch_overvolt : 39|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Key_switch_undervolt : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Running : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Traction : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Hydraulic : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Powering_Enabled : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Powering_Ready : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_contactor_closed : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Precharging : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SME_TRQSPD_Speed : 0|16@1+ (1,0) [-32768|32767] "RPM" Vector__XXX + SG_ SME_TRQSPD_MotorFlags : 48|16@1+ (1,0) [0|65535] "" Vector__XXX + SG_ SME_TRQSPD_Torque : 16|16@1- (1,0) [-32767|32767] "Q15" Vector__XXX + +BO_ 1666 SME_TPDO_Temperature: 8 SME + SG_ SME_TEMP_FaultLevel : 40|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ SME_TEMP_FaultCode : 32|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ SME_TEMP_DC_Bus_V : 16|16@1+ (0.1,0) [0|6553.5] "V" Vector__XXX + SG_ SME_TEMP_ControllerTemperature : 8|8@1+ (1,-40) [0|255] "C" Vector__XXX + SG_ SME_TEMP_MotorTemperature : 0|8@1+ (1,-40) [0|255] "C" Vector__XXX + SG_ SME_TEMP_BusCurrent : 48|16@1- (0.1,0) [-3276.8|3276.7] "A" Vector__XXX + +BO_ 392 ACC_TPDO_STATUS: 8 ACC + SG_ ACC_STATUS_BMS_FAULT : 0|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_IMD_FAULT : 1|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_SHUTDOWN_STATE : 2|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_PRECHARGE_DONE : 3|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_PRECHARGING : 4|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_CELL_TOO_LOW : 8|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_CELL_TOO_HIGH : 9|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_TEMP_TOO_LOW : 10|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_TEMP_TOO_HIGH : 11|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_TEMP_TOO_HIGH_CRG : 12|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_CHARGING : 5|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_GLV_VOLTAGE : 16|16@1+ (1,0) [0|65.635] "mV" Vector__XXX + SG_ ACC_STATUS_CELL_FAULT_INDEX : 32|32@1+ (1,0) [0|0] "" Vector__XXX + SG_ ACC_STATUS_BALANCING : 13|1@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 648 ACC_TPDO_POWER: 8 ACC + SG_ ACC_POWER_PACK_VOLTAGE : 0|16@1+ (0.01,0) [0|655.35] "V" Vector__XXX + SG_ ACC_POWER_SOC : 16|8@1+ (1,0) [0|255] "Percentage" Vector__XXX + SG_ ACC_POWER_CURRENT : 24|16@1- (0.1,0) [-3276.8|3276.7] "A" Vector__XXX + +BO_ 401 ACC_TPDO_SEG0_VOLTS: 6 ACC + SG_ ACC_SEG0_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG0_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG0_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG0_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG0_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG0_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + +BO_ 657 ACC_TPDO_SEG0_TEMPS: 6 ACC + SG_ ACC_SEG0_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG0_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG0_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG0_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG0_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG0_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX + +BO_ 402 ACC_TPDO_SEG1_VOLTS: 6 ACC + SG_ ACC_SEG1_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG1_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG1_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG1_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG1_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG1_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + +BO_ 658 ACC_TPDO_SEG1_TEMPS: 6 ACC + SG_ ACC_SEG1_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG1_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG1_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG1_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG1_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG1_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX + +BO_ 403 ACC_TPDO_SEG2_VOLTS: 6 ACC + SG_ ACC_SEG2_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG2_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG2_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG2_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG2_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG2_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + +BO_ 659 ACC_TPDO_SEG2_TEMPS: 6 ACC + SG_ ACC_SEG2_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG2_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG2_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG2_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG2_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG2_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX + +BO_ 404 ACC_TPDO_SEG3_VOLTS: 6 ACC + SG_ ACC_SEG3_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG3_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG3_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG3_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG3_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG3_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + +BO_ 660 ACC_TPDO_SEG3_TEMPS: 6 ACC + SG_ ACC_SEG3_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG3_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG3_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG3_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG3_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG3_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX + +BO_ 405 ACC_TPDO_SEG4_VOLTS: 6 ACC + SG_ ACC_SEG4_VOLTS_CELL0 : 0|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG4_VOLTS_CELL1 : 8|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG4_VOLTS_CELL2 : 16|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG4_VOLTS_CELL3 : 24|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG4_VOLTS_CELL4 : 32|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + SG_ ACC_SEG4_VOLTS_CELL5 : 40|8@1+ (0.01,2) [2|4.55] "V" Vector__XXX + +BO_ 661 ACC_TPDO_SEG4_TEMPS: 6 ACC + SG_ ACC_SEG4_TEMPS_CELL0 : 0|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG4_TEMPS_CELL1 : 8|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG4_TEMPS_CELL2 : 16|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG4_TEMPS_CELL3 : 24|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG4_TEMPS_CELL4 : 32|8@1- (1,0) [-128|127] "C" Vector__XXX + SG_ ACC_SEG4_TEMPS_CELL5 : 40|8@1- (1,0) [-128|127] "C" Vector__XXX + +BO_ 2148139008 VDM_GPS_LAT_LONG: 8 VDM + SG_ VDM_GPS_Latitude : 7|32@0- (1,0) [-90|90] "deg" Vector__XXX + SG_ VDM_GPS_Longitude : 39|32@0- (1,0) [-180|180] "deg" Vector__XXX + +BO_ 2148139009 VDM_GPS_DATA: 8 VDM + SG_ VDM_GPS_SPEED : 7|16@0+ (0.01,0) [0|65535] "mph" Vector__XXX + SG_ VDM_GPS_ALTITUDE : 23|16@0- (1,0) [-32768|32767] "ft" Vector__XXX + SG_ VDM_GPS_TRUE_COURSE : 39|16@0+ (0.01,0) [0|65535] "deg" Vector__XXX + SG_ VDM_GPS_SATELLITES_IN_USE : 55|8@0+ (1,0) [0|255] "" Vector__XXX + SG_ VDM_GPS_VALID1 : 63|8@0+ (1,0) [0|255] "" Vector__XXX + +BO_ 2148139010 VDM_DATE_TIME: 8 VDM + SG_ VDM_GPS_VALID2 : 7|8@0+ (1,0) [0|0] "" Vector__XXX + SG_ VDM_UTC_DATE_YEAR : 15|8@0+ (1,0) [0|0] "years" Vector__XXX + SG_ VDM_UTC_DATE_MONTH : 23|8@0+ (1,0) [0|0] "months" Vector__XXX + SG_ VDM_UTC_DATE_DAY : 31|8@0+ (1,0) [0|0] "days" Vector__XXX + SG_ VDM_UTC_TIME_HOURS : 47|8@0+ (1,0) [0|0] "hours" Vector__XXX + SG_ VDM_UTC_TIME_MINUTES : 55|8@0+ (1,0) [0|0] "minutes" Vector__XXX + SG_ VDM_UTC_TIME_SECONDS : 63|8@0+ (1,0) [0|0] "seconds" Vector__XXX + +BO_ 2148139011 VDM_ACCELERATION: 8 VDM + SG_ VDM_X_AXIS_ACCELERATION : 7|16@0- (0.000244141,0) [0|0] "gs" Vector__XXX + SG_ VDM_Y_AXIS_ACCELERATION : 23|16@0- (0.000244141,0) [0|0] "gs" Vector__XXX + SG_ VDM_Z_AXIS_ACCELERATION : 39|16@0- (0.000244141,0) [0|0] "gs" Vector__XXX + +BO_ 2148139012 VDM_YAW_RATE: 8 VDM + SG_ VDM_X_AXIS_YAW_RATE : 7|16@0- (0.0152588,0) [0|0] "deg/s" Vector__XXX + SG_ VDM_Y_AXIS_YAW_RATE : 23|16@0- (0.0152588,0) [0|0] "deg/s" Vector__XXX + SG_ VDM_Z_AXIS_YAW_RATE : 39|16@0- (0.0152588,0) [0|0] "deg/s" Vector__XXX + +BO_ 393 ETC_TPDO_STATUS: 8 ETC + SG_ ETC_STATUS_HE1 : 0|16@1+ (1,0) [0|65535] "mV" Vector__XXX + SG_ ETC_STATUS_HE2 : 16|16@1+ (1,0) [0|65535] "mV" Vector__XXX + SG_ ETC_STATUS_BRAKE_SENSE_VOLTAGE : 32|16@1+ (1,0) [0|65535] "mV" Vector__XXX + SG_ ETC_STATUS_RTD_BUTTON : 56|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ETC_STATUS_RTDS : 57|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ETC_STATUS_REVERSE : 58|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ETC_STATUS_BRAKELIGHT : 59|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ETC_STATUS_PEDAL_TRAVEL : 48|8@1+ (1,0) [0|100] "%" Vector__XXX + SG_ ETC_STATUS_RTD : 60|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ETC_STATUS_IMPLAUSIBILITY : 61|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ ETC_STATUS_TS_ACTIVE : 62|1@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 410 PDB_TPDO_POWER_A: 8 PDB + SG_ PDB_POWER_A_GLV_VOLTAGE : 0|16@1+ (1,0) [0|65535] "mV" Vector__XXX + SG_ PDB_POWER_A_CURRENT_SHUTDOWN : 16|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_A_CURRENT_ACC : 24|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_A_CURRENT_ETC : 32|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_A_CURRENT_BPS : 40|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_A_CURRENT_TRACTIVE : 48|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_A_CURRENT_BSPD : 56|8@1+ (1,0) [0|255] "lsb" Vector__XXX + +BO_ 666 PDB_TPDO_POWER_B: 8 PDB + SG_ PDB_POWER_B_CURRENT_TELEMETRY : 0|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_B_CURRENT_PDB : 8|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_B_CURRENT_DASH : 16|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_B_CURRENT_RTML : 24|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_B_CURRENT_EXTRA_1 : 32|8@1+ (1,0) [0|255] "lsb" Vector__XXX + SG_ PDB_POWER_B_CURRENT_EXTRA_2 : 40|8@1+ (1,0) [0|255] "lsb" Vector__XXX + +BO_ 416 TMAIN_TPDO_DATA: 8 TMAIN + SG_ TMAIN_DATA_BRAKES_F : 0|16@1+ (0.1,0) [0|0] "psi" Vector__XXX + SG_ TMAIN_DATA_BRAKES_R : 16|16@1+ (0.1,0) [0|0] "psi" Vector__XXX + +BO_ 418 TPERIPH_FL_TPDO_DATA: 7 TPERIPH_FL + SG_ TPERIPH_FL_DATA_WHEELSPEED : 0|16@1- (0.1,0) [0|0] "rpm" Vector__XXX + SG_ TPERIPH_FL_DATA_SUSTRAVEL : 16|16@1+ (0.01,0) [0|655.35] "mm" Vector__XXX + SG_ TPERIPH_FL_DATA_STRAIN : 32|16@1- (1e-07,0) [0|0] "%" Vector__XXX + SG_ TPERIPH_FL_DATA_SIDE_TIRE_TEMP : 48|8@1+ (1,0) [0|255] "C" Vector__XXX + +BO_ 419 TPERIPH_FR_TPDO_DATA: 7 TPERIPH_FR + SG_ TPERIPH_FR_DATA_WHEELSPEED : 0|16@1- (0.1,0) [0|0] "rpm" Vector__XXX + SG_ TPERIPH_FR_DATA_SUSTRAVEL : 16|16@1+ (0.01,0) [0|655.35] "mm" Vector__XXX + SG_ TPERIPH_FR_DATA_STRAIN : 32|16@1- (1e-07,0) [0|0] "%" Vector__XXX + SG_ TPERIPH_FR_DATA_SIDE_TIRE_TEMP : 48|8@1+ (1,0) [0|255] "C" Vector__XXX + +BO_ 420 TPERIPH_BL_TPDO_DATA: 7 TPERIPH_BL + SG_ TPERIPH_BL_DATA_WHEELSPEED : 0|16@1- (0.1,0) [0|0] "rpm" Vector__XXX + SG_ TPERIPH_BL_DATA_SUSTRAVEL : 16|16@1+ (0.01,0) [0|655.35] "mm" Vector__XXX + SG_ TPERIPH_BL_DATA_STRAIN : 32|16@1- (1e-07,0) [0|0] "%" Vector__XXX + SG_ TPERIPH_BL_DATA_SIDE_TIRE_TEMP : 48|8@1+ (1,0) [0|255] "C" Vector__XXX + +BO_ 421 TPERIPH_BR_TPDO_DATA: 7 TPERIPH_BR + SG_ TPERIPH_BR_DATA_WHEELSPEED : 0|16@1- (0.1,0) [0|0] "rpm" Vector__XXX + SG_ TPERIPH_BR_DATA_SUSTRAVEL : 16|16@1+ (0.01,0) [0|655.35] "mm" Vector__XXX + SG_ TPERIPH_BR_DATA_STRAIN : 32|16@1- (1e-07,0) [0|0] "%" Vector__XXX + SG_ TPERIPH_BR_DATA_SIDE_TIRE_TEMP : 48|8@1+ (1,0) [0|255] "C" Vector__XXX + +BO_ 673 TPERIPH_FL_TPDO_TIRETEMP: 8 TPERIPH_FL + SG_ TPERIPH_FL_TIRETEMP_1 : 0|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FL_TIRETEMP_2 : 8|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FL_TIRETEMP_3 : 16|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FL_TIRETEMP_4 : 24|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FL_TIRETEMP_5 : 32|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FL_TIRETEMP_6 : 40|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FL_TIRETEMP_7 : 48|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FL_TIRETEMP_8 : 56|8@1+ (1,0) [0|0] "C" Vector__XXX + +BO_ 674 TPERIPH_FR_TPDO_TIRETEMP: 8 TPERIPH_FR + SG_ TPERIPH_FR_TIRETEMP_1 : 0|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FR_TIRETEMP_2 : 8|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FR_TIRETEMP_3 : 16|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FR_TIRETEMP_4 : 24|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FR_TIRETEMP_5 : 32|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FR_TIRETEMP_6 : 40|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FR_TIRETEMP_7 : 48|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_FR_TIRETEMP_8 : 56|8@1+ (1,0) [0|0] "C" Vector__XXX + +BO_ 675 TPERIPH_BL_TPDO_TIRETEMP: 8 TPERIPH_BL + SG_ TPERIPH_BL_TIRETEMP_1 : 0|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BL_TIRETEMP_2 : 8|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BL_TIRETEMP_3 : 16|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BL_TIRETEMP_4 : 24|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BL_TIRETEMP_5 : 32|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BL_TIRETEMP_6 : 40|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BL_TIRETEMP_7 : 48|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BL_TIRETEMP_8 : 56|8@1+ (1,0) [0|0] "C" Vector__XXX + +BO_ 676 TPERIPH_BR_TPDO_TIRETEMP: 8 TPERIPH_BR + SG_ TPERIPH_BR_TIRETEMP_1 : 0|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BR_TIRETEMP_2 : 8|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BR_TIRETEMP_3 : 16|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BR_TIRETEMP_4 : 24|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BR_TIRETEMP_5 : 32|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BR_TIRETEMP_6 : 40|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BR_TIRETEMP_7 : 48|8@1+ (1,0) [0|0] "C" Vector__XXX + SG_ TPERIPH_BR_TIRETEMP_8 : 56|8@1+ (1,0) [0|0] "C" Vector__XXX + +BO_ 2021 LSS_COMMAND: 8 CHARGER_BOARD + SG_ COMMAND_MODE : 8|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ COMMAND_COMMAND_SPECIFIER : 0|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 2020 LSS_RESPONSE: 8 SMPC + SG_ RESPONSE_COMMAND_SPECIFIER : 0|8@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 518 SMPC_RPDO_CONTROL: 8 CHARGER_BOARD + SG_ SMPC_CONTROL_PACK_VOLTAGE : 16|32@1+ (1,0) [0|65535] "mV" Vector__XXX + SG_ SMPC_CONTROL_DEST_NODE_ID : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ SMPC_CONTROL_ENABLE : 9|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ SMPC_CONTROL_CURRENT_10X_MULT : 11|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ SMPC_CONTROL_EVSE_OVERRIDE : 13|1@1+ (1,0) [0|0] "" Vector__XXX + +BO_ 774 SMPC_RPDO_MAX_VOLTAGE_CURRENT: 8 CHARGER_BOARD + SG_ SMPC_MAX_DEST_NODE_ID : 0|8@1+ (1,0) [0|0] "" Vector__XXX + SG_ SMPC_MAX_CHRG_VOLTAGE : 8|32@1+ (1,0) [0|0] "mV" Vector__XXX + SG_ SMPC_MAX_CHRG_CURRENT : 40|16@1+ (1,0) [0|0] "mA" Vector__XXX + SG_ SMPC_MAX_INPUT_EVSE_OVERRIDE : 56|8@1+ (1,0) [0|255] "A" Vector__XXX + +BO_ 400 SMPC_TPDO_STATUS: 8 SMPC + SG_ SMPC_STATUS_CURRENT_MA : 48|16@1+ (1,0) [0|65535] "mA" Vector__XXX + SG_ SMPC_STATUS_VOLTAGE_MV : 16|32@1+ (1,0) [0|2704] "mV" Vector__XXX + SG_ SMPC_STATUS_J1772_DISCONN : 13|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_REQUEST_EXCLUSIVE : 12|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_CHARGER_UNPLUGGED : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_CHARGING : 7|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_INTERNAL_FAULT : 6|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_UNDERVOLTAGE_FAULT : 5|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_OVERVOLTAGE_FAULT : 4|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_OVERCURRENT_FAULT : 3|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_OVERTEMP_FAULT : 2|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_CHARGE_COMPLETE : 1|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_STATUS_READY : 0|1@1+ (1,0) [0|1] "" Vector__XXX + +BO_ 656 SMPC_TPDO_MAX_VOLTAGE_CURRENT: 8 SMPC + SG_ SMPC_MAX2_INPUT_CURR_LIM : 56|8@1+ (1,0) [0|255] "A" Vector__XXX + SG_ SMPC_MAX2_EVSE_CURRENT : 48|8@1+ (1,0) [0|255] "A" Vector__XXX + SG_ SMPC_MAX2_MAX_CURRENT_MA : 32|16@1+ (1,0) [0|65535] "mA" Vector__XXX + SG_ SMPC_MAX2_MAX_VOLTAGE_MV : 0|32@1+ (1,0) [0|2704] "mV" Vector__XXX + +BO_ 912 SMPC_TPDO_INPUT_AC: 8 SMPC + SG_ SMPC_INPUT_MAX_CHARGER_TEMP_C : 40|8@1+ (1,-50) [-50|205] "C" Vector__XXX + SG_ SMPC_INPUT_AC_INPUT_FREQUENCY_HZ : 32|8@1+ (1,0) [0|255] "HZ" Vector__XXX + SG_ SMPC_INPUT_AC_INPUT_CURRENT_MA : 16|16@1+ (1,0) [0|65535] "mA" Vector__XXX + SG_ SMPC_INPUT_J1772_TRIGGERED : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_INPUT_J1772_DISCONNECTED : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_INPUT_J1772_CONNECTED : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SMPC_INPUT_AC_INPUT_VOLTAGE : 0|8@1+ (1,0) [0|255] "Vac" Vector__XXX + +BO_ 1168 SMPC_TPDO_SERIAL_PART_NUM: 8 SMPC + SG_ SMPC_SER_FIRMWARE_VER : 48|16@1+ (1,0) [0|65535] "" Vector__XXX + SG_ SMPC_SER_SERIAL_NUMBER : 16|32@1+ (1,0) [0|2704] "" Vector__XXX + SG_ SMPC_SER_PART_NUMBER : 0|16@1+ (1,0) [0|65535] "" Vector__XXX + + + +CM_ SG_ 2148139008 VDM_GPS_Latitude "north is positive +south is negative\t +reference is WGS-84 +"; +CM_ SG_ 2148139008 VDM_GPS_Longitude "east is positive +west is negative +reference is WGS-84"; +BA_DEF_ "BusType" STRING ; +BA_DEF_ BO_ "GenMsgBackgroundColor" STRING ; +BA_DEF_ BO_ "GenMsgForegroundColor" STRING ; +BA_DEF_DEF_ "BusType" "CAN"; +BA_DEF_DEF_ "GenMsgBackgroundColor" "#c8c8c8"; +BA_DEF_DEF_ "GenMsgForegroundColor" "#000000"; + diff --git a/Telemetry-Main/CANProtocol.hpp b/Telemetry-Main/CANProtocol.hpp index 5b3bf2fb..4a726e19 100644 --- a/Telemetry-Main/CANProtocol.hpp +++ b/Telemetry-Main/CANProtocol.hpp @@ -128,14 +128,14 @@ struct PDB_POWER_B_t { }; struct SME_THROTTLE_DEMAND_t { - uint16_t TORQUE_DEMAND; // bits 0-15 - uint16_t MAX_SPEED; // bits 16-31 - uint8_t FORWARD : 1; // bit 32 - uint8_t REVERSE : 1; // bit 33 - uint8_t padding_34 : 1; // bit 34 (used for alignment) - uint8_t POWER_READY : 1; // bit 35 - uint8_t padding2 : 4; // bits 36-39 - uint8_t MBB_ALIVE: 4; // bits 40-43 + uint16_t TORQUE_DEMAND; // bits 0-15 + uint16_t MAX_SPEED; // bits 16-31 + uint8_t FORWARD : 1; // bit 32 + uint8_t REVERSE : 1; // bit 33 + uint8_t padding_34 : 1; // bit 34 (used for alignment) + uint8_t POWER_READY : 1; // bit 35 + uint8_t padding2 : 4; // bits 36-39 + uint8_t MBB_ALIVE: 4; // bits 40-43 }; struct SME_TRQSPD_t { @@ -199,13 +199,13 @@ struct TPERIPH_TIRETEMP_t { }; struct VDM_GPS_LAT_LONG_t { - int32_t LATITUDE; // bits 7-38 - int32_t LONGITUDE; // bits 39-50 + int32_t LATITUDE; // bits 7-38 + int32_t LONGITUDE; // bits 39-50 }; struct VDM_GPS_DATA_t { uint16_t SPEED; // bits 7-22 - int16_t ALTITUDE; // bits 23-38 + int16_t ALTITUDE; // bits 23-38 uint16_t TRUE_COURSE; // bits 39-54 uint8_t SATELLITES_IN_USE; // bits 55-62 uint8_t VALID1; // bits 63-70 @@ -222,15 +222,15 @@ struct VDM_DATE_TIME_t { }; struct VDM_ACCELERATION_t { - int16_t X; // bits 7-22 - int16_t Y; // bits 23-38 - int16_t Z; // bits 39-54 + int16_t X; // bits 7-22 + int16_t Y; // bits 23-38 + int16_t Z; // bits 39-54 }; struct VDM_YAW_RATE_t { - int16_t X; // bits 7-22 - int16_t Y; // bits 23-38 - int16_t Z; // bits 39-54 + int16_t X; // bits 7-22 + int16_t Y; // bits 23-38 + int16_t Z; // bits 39-54 }; #endif // CANPROTOCOL_HPP diff --git a/Telemetry-Main/VehicleStateManager.cpp b/Telemetry-Main/VehicleStateManager.cpp index a69442e7..dcaeb078 100644 --- a/Telemetry-Main/VehicleStateManager.cpp +++ b/Telemetry-Main/VehicleStateManager.cpp @@ -1,5 +1,6 @@ #include "VehicleStateManager.hpp" #include +#include #include #include #include @@ -8,6 +9,9 @@ #include "CANProtocol.hpp" #include "mbed.h" +#define LAP_COUNT_HEADING_THRESHOLD 10 // degrees +#define LAP_COUNT_TIME_THRESHOLD ((int) 30e9) // microseconds + VehicleStateManager::VehicleStateManager( MbedCAN* mbedCAN, PinName steering_sensor, @@ -198,6 +202,27 @@ void VehicleStateManager::processCANMessage() { } } +void VehicleStateManager::resetLapCounter() { + _vehicleState.lap_latitude_f = _vehicleState.vdmGpsLatLong.LATITUDE; + _vehicleState.lap_longitude_f = _vehicleState.vdmGpsLatLong.LONGITUDE; + _vehicleState.lap_heading_f = (float) (_vehicleState.vdmGpsData.TRUE_COURSE % 36000) * 0.01f; // scale + // to + // 0-35999 + _vehicleState.lap_counter = 0; + + _lapTimer.reset(); + _lapTimer.start(); +} + +bool VehicleStateManager::lapCompleted() { + std::chrono::microseconds mu_s(LAP_COUNT_TIME_THRESHOLD); + + if (_lapTimer.elapsed_time() < mu_s) return false; + if (abs(_vehicleState.vdmGpsData.TRUE_COURSE - _vehicleState.lap_heading_f) > LAP_COUNT_HEADING_THRESHOLD) return false; + + return true; +} + void VehicleStateManager::updateLapTime() { uint32_t milliseconds = std::chrono::duration_cast(_lapTimer.elapsed_time()).count(); uint32_t minutes = milliseconds / 60000; diff --git a/Telemetry-Main/VehicleStateManager.hpp b/Telemetry-Main/VehicleStateManager.hpp index bacd67c7..50a47daf 100644 --- a/Telemetry-Main/VehicleStateManager.hpp +++ b/Telemetry-Main/VehicleStateManager.hpp @@ -40,7 +40,12 @@ struct VehicleState { float steering_sensor; float brake_sensor_f; float brake_sensor_r; - + + // ---- LAP COUNTING ---- + float lap_latitude_f; + float lap_longitude_f; + float lap_heading_f; + uint8_t lap_counter; // MARK: surely we don't do more than 255 laps(?) }; class VehicleStateManager { @@ -55,6 +60,15 @@ class VehicleStateManager { VehicleState getState() const; void update(); + /** + * Resets all fields relating to lap counting to match current + * VehicleState. Assumes VehicleState was recently updated. + */ + void resetLapCounter(); + /** + * Returns true if a lap was detected as completed + */ + bool lapCompleted(); void startLapTimer(); const char* getLapTime() const; @@ -68,6 +82,7 @@ class VehicleStateManager { char _lapTime[16]; Timer _lapTimer; + // LowPowerTimer _lapTimer; void processCANMessage(); void updateLapTime(); From 8a23b12fabbce9408ebc41ac6cdca4da1003616f Mon Sep 17 00:00:00 2001 From: Nicholas Tang Date: Sat, 18 Oct 2025 23:19:54 -0700 Subject: [PATCH 2/9] formatting --- Telemetry-Main/VehicleStateManager.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Telemetry-Main/VehicleStateManager.cpp b/Telemetry-Main/VehicleStateManager.cpp index dcaeb078..6e234e01 100644 --- a/Telemetry-Main/VehicleStateManager.cpp +++ b/Telemetry-Main/VehicleStateManager.cpp @@ -9,7 +9,7 @@ #include "CANProtocol.hpp" #include "mbed.h" -#define LAP_COUNT_HEADING_THRESHOLD 10 // degrees +#define LAP_COUNT_HEADING_THRESHOLD 10 // degrees #define LAP_COUNT_TIME_THRESHOLD ((int) 30e9) // microseconds VehicleStateManager::VehicleStateManager( @@ -206,8 +206,8 @@ void VehicleStateManager::resetLapCounter() { _vehicleState.lap_latitude_f = _vehicleState.vdmGpsLatLong.LATITUDE; _vehicleState.lap_longitude_f = _vehicleState.vdmGpsLatLong.LONGITUDE; _vehicleState.lap_heading_f = (float) (_vehicleState.vdmGpsData.TRUE_COURSE % 36000) * 0.01f; // scale - // to - // 0-35999 + // to + // 0-35999 _vehicleState.lap_counter = 0; _lapTimer.reset(); From 6d43f3d2ecf83787ec907ecad03cf32ab7dd462e Mon Sep 17 00:00:00 2001 From: Nicholas Tang Date: Mon, 20 Oct 2025 14:51:17 -0700 Subject: [PATCH 3/9] refactor lap counting into own file, update CMake accordingly --- Telemetry-Main/CMakeLists.txt | 2 +- Telemetry-Main/LapCounter.cpp | 69 ++++++++++++++++++++++++++ Telemetry-Main/LapCounter.hpp | 45 +++++++++++++++++ Telemetry-Main/VehicleStateManager.cpp | 26 ++-------- Telemetry-Main/VehicleStateManager.hpp | 6 --- 5 files changed, 119 insertions(+), 29 deletions(-) create mode 100644 Telemetry-Main/LapCounter.cpp create mode 100644 Telemetry-Main/LapCounter.hpp diff --git a/Telemetry-Main/CMakeLists.txt b/Telemetry-Main/CMakeLists.txt index 41de1f67..1135dbf0 100644 --- a/Telemetry-Main/CMakeLists.txt +++ b/Telemetry-Main/CMakeLists.txt @@ -23,6 +23,6 @@ add_library(fsdaq STATIC ./fsdaq/data_logger.cpp) # ./fsdaq/can_processor_genera target_include_directories(fsdaq PUBLIC ./fsdaq) target_link_libraries(fsdaq mbed-core-flags mbed-storage-sd mbed-storage-fat libradio) -add_executable(${PROJECT_NAME} main.cpp VehicleStateManager.cpp) +add_executable(${PROJECT_NAME} main.cpp VehicleStateManager.cpp LapCounter.cpp) target_link_libraries(${PROJECT_NAME} mbed-os dash fsdaq libradio mbed-storage-sd mbed-storage-fat) mbed_set_post_build(${PROJECT_NAME}) diff --git a/Telemetry-Main/LapCounter.cpp b/Telemetry-Main/LapCounter.cpp new file mode 100644 index 00000000..ef4fb1e4 --- /dev/null +++ b/Telemetry-Main/LapCounter.cpp @@ -0,0 +1,69 @@ +#include + +#include "LapCounter.hpp" + +#define EARTH_RADIUS 6378137 // earths radius in meters, used for conversion to local coordinate plane +#define X_TOLERANCE 8.0f // check lap completion if x is within +- X_TOLERANCE meters of home x coord +#define Y_TOLERANCE 8.0f // check lap completion if y is within +- Y_TOLERANCE meters of home y coord +#define HEADING_TOLERANCE 30.0f // check lap completion if heading is within +- HEADING_TOLERANCE degrees of home + +LapCounter::LapCounter(VehicleState state) { + resetLapCounter(state); +} + +void LapCounter::resetLapCounter(VehicleState state) { + data.lap_home_latitude_f = state.vdmGpsLatLong.LATITUDE; + data.lap_home_longitude_f = state.vdmGpsLatLong.LONGITUDE; + data.lap_home_x_f = 0.0f; + data.lap_home_y_f = 0.0f; + data.lap_home_heading_f = (float) (state.vdmGpsData.TRUE_COURSE % 36000) * 0.01f; //scale to 0-359.99 + + data.lap_prev_latitude_f = 0.0f; + data.lap_prev_longitude_f = 0.0f; + data.lap_prev_x_f = 0.0f; + data.lap_prev_y_f = 0.0f; + data.lap_prev_heading_f = 0.0f; + + data.lap_curr_latitude_f = data.lap_home_latitude_f; + data.lap_curr_longitude_f = data.lap_home_longitude_f; + data.lap_curr_x_f = data.lap_home_x_f; + data.lap_curr_y_f = data.lap_home_y_f; + data.lap_curr_heading_f = data.lap_home_heading_f; + + timer.reset(); + timer.start(); +} + +void LapCounter::updateLapCounter(VehicleState state) { + // Weighted avg for prev to average out noise + data.lap_prev_latitude_f = data.lap_prev_latitude_f / 4.0f + 0.75f * data.lap_curr_latitude_f; + data.lap_prev_longitude_f = data.lap_prev_longitude_f / 4.0f + 0.75f * data.lap_curr_longitude_f; + data.lap_prev_x_f = data.lap_prev_x_f / 4.0f + 0.75f * data.lap_curr_x_f; + data.lap_prev_y_f = data.lap_prev_y_f / 4.0f + 0.75f * data.lap_curr_y_f; + data.lap_prev_heading_f = data.lap_prev_heading_f / 4.0f + 0.75f * data.lap_curr_heading_f; + + // Get curr data, transform to local coordinate plane + data.lap_curr_latitude_f = state.vdmGpsLatLong.LATITUDE; + data.lap_curr_longitude_f = state.vdmGpsLatLong.LONGITUDE; + data.lap_curr_x_f = EARTH_RADIUS * (data.lap_curr_longitude_f - + data.lap_home_longitude_f) * cos(data.lap_home_longitude_f); + data.lap_curr_y_f = EARTH_RADIUS * (data.lap_curr_latitude_f - + data.lap_home_latitude_f); + // TRANSFORM: Apply rotation matrix, home heading is x axis. + data.lap_curr_x_f = data.lap_curr_x_f * cos(data.lap_home_heading_f) + + data.lap_curr_y_f * sin(data.lap_home_heading_f); + data.lap_curr_y_f = data.lap_curr_x_f * -sin(data.lap_home_heading_f) + + data.lap_curr_y_f * cos(data.lap_home_heading_f); + data.lap_curr_heading_f = (float) (state.vdmGpsData.TRUE_COURSE % 36000) * 0.01f; //scale to 0-359.99 + + // If nowhere near home coords/heading, return immediately + if (abs(data.lap_curr_x_f - data.lap_home_x_f) > X_TOLERANCE) return; + if (abs(data.lap_curr_y_f - data.lap_home_y_f) > Y_TOLERANCE) return; + if (abs(data.lap_curr_heading_f - data.lap_home_heading_f) > HEADING_TOLERANCE) return; + + // If close enough and crossed home line, increment counter + if (data.lap_curr_x_f > data.lap_home_x_f && data.lap_prev_x_f < data.lap_home_x_f) { + data.lap_counter++; + return; + } +} diff --git a/Telemetry-Main/LapCounter.hpp b/Telemetry-Main/LapCounter.hpp new file mode 100644 index 00000000..03537c27 --- /dev/null +++ b/Telemetry-Main/LapCounter.hpp @@ -0,0 +1,45 @@ +#ifndef LAP_COUNTER_HPP +#define LAP_COUNTER_HPP + +#include "CANProtocol.hpp" +#include "VehicleStateManager.hpp" +#include "mbed.h" + +struct LapCounterData { + float lap_home_latitude_f; + float lap_home_longitude_f; + float lap_home_x_f; + float lap_home_y_f; + float lap_home_heading_f; + + float lap_prev_latitude_f; + float lap_prev_longitude_f; + float lap_prev_x_f; + float lap_prev_y_f; + float lap_prev_heading_f; + + float lap_curr_latitude_f; + float lap_curr_longitude_f; + float lap_curr_x_f; + float lap_curr_y_f; + float lap_curr_heading_f; + + uint8_t lap_counter; // MARK: surely we don't do more than 255 laps(?) +}; + +class LapCounter { + public: + LapCounterData data; + Timer timer; + LapCounter(VehicleState state); + /** + * Resets object field. GPS data is set to wherever is in vehicle state + */ + void resetLapCounter(VehicleState state); + /** + * Checks if a lap has been completed. If so, increments lap counter + */ + void updateLapCounter(VehicleState state); +}; + +#endif diff --git a/Telemetry-Main/VehicleStateManager.cpp b/Telemetry-Main/VehicleStateManager.cpp index 6e234e01..701edcf1 100644 --- a/Telemetry-Main/VehicleStateManager.cpp +++ b/Telemetry-Main/VehicleStateManager.cpp @@ -1,6 +1,7 @@ #include "VehicleStateManager.hpp" #include #include +#include #include #include #include @@ -9,8 +10,10 @@ #include "CANProtocol.hpp" #include "mbed.h" -#define LAP_COUNT_HEADING_THRESHOLD 10 // degrees +#define LAP_COUNT_HEADING_THRESHOLD 15 // degrees #define LAP_COUNT_TIME_THRESHOLD ((int) 30e9) // microseconds +#define LAP_COUNT_LATITUDE_THRESHOLD 0.003 // degrees (arbitrary number for now) +#define LAP_COUNT_LONGITUDE_THRESHOLD 0.003 // degrees (arbitrary number for now) VehicleStateManager::VehicleStateManager( MbedCAN* mbedCAN, @@ -202,27 +205,6 @@ void VehicleStateManager::processCANMessage() { } } -void VehicleStateManager::resetLapCounter() { - _vehicleState.lap_latitude_f = _vehicleState.vdmGpsLatLong.LATITUDE; - _vehicleState.lap_longitude_f = _vehicleState.vdmGpsLatLong.LONGITUDE; - _vehicleState.lap_heading_f = (float) (_vehicleState.vdmGpsData.TRUE_COURSE % 36000) * 0.01f; // scale - // to - // 0-35999 - _vehicleState.lap_counter = 0; - - _lapTimer.reset(); - _lapTimer.start(); -} - -bool VehicleStateManager::lapCompleted() { - std::chrono::microseconds mu_s(LAP_COUNT_TIME_THRESHOLD); - - if (_lapTimer.elapsed_time() < mu_s) return false; - if (abs(_vehicleState.vdmGpsData.TRUE_COURSE - _vehicleState.lap_heading_f) > LAP_COUNT_HEADING_THRESHOLD) return false; - - return true; -} - void VehicleStateManager::updateLapTime() { uint32_t milliseconds = std::chrono::duration_cast(_lapTimer.elapsed_time()).count(); uint32_t minutes = milliseconds / 60000; diff --git a/Telemetry-Main/VehicleStateManager.hpp b/Telemetry-Main/VehicleStateManager.hpp index 50a47daf..4499d6d3 100644 --- a/Telemetry-Main/VehicleStateManager.hpp +++ b/Telemetry-Main/VehicleStateManager.hpp @@ -40,12 +40,6 @@ struct VehicleState { float steering_sensor; float brake_sensor_f; float brake_sensor_r; - - // ---- LAP COUNTING ---- - float lap_latitude_f; - float lap_longitude_f; - float lap_heading_f; - uint8_t lap_counter; // MARK: surely we don't do more than 255 laps(?) }; class VehicleStateManager { From d89c8e2634ee302da2eee7b7709a7937d94abc54 Mon Sep 17 00:00:00 2001 From: Nicholas Tang Date: Mon, 20 Oct 2025 15:43:52 -0700 Subject: [PATCH 4/9] add minimum time check for a lap --- Telemetry-Main/LapCounter.cpp | 35 +++++++++++++++++++++++++---------- Telemetry-Main/LapCounter.hpp | 31 +++++++++++++++++++++++++------ 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/Telemetry-Main/LapCounter.cpp b/Telemetry-Main/LapCounter.cpp index ef4fb1e4..29145d34 100644 --- a/Telemetry-Main/LapCounter.cpp +++ b/Telemetry-Main/LapCounter.cpp @@ -6,6 +6,7 @@ #define X_TOLERANCE 8.0f // check lap completion if x is within +- X_TOLERANCE meters of home x coord #define Y_TOLERANCE 8.0f // check lap completion if y is within +- Y_TOLERANCE meters of home y coord #define HEADING_TOLERANCE 30.0f // check lap completion if heading is within +- HEADING_TOLERANCE degrees of home +#define MIN_LAP_TIME 10 // minimum lap time in seconds. used to ensure same lap isn't counted twice LapCounter::LapCounter(VehicleState state) { resetLapCounter(state); @@ -30,40 +31,54 @@ void LapCounter::resetLapCounter(VehicleState state) { data.lap_curr_y_f = data.lap_home_y_f; data.lap_curr_heading_f = data.lap_home_heading_f; + data.lap_counter = 0; + timer.reset(); timer.start(); } void LapCounter::updateLapCounter(VehicleState state) { // Weighted avg for prev to average out noise - data.lap_prev_latitude_f = data.lap_prev_latitude_f / 4.0f + 0.75f * data.lap_curr_latitude_f; - data.lap_prev_longitude_f = data.lap_prev_longitude_f / 4.0f + 0.75f * data.lap_curr_longitude_f; - data.lap_prev_x_f = data.lap_prev_x_f / 4.0f + 0.75f * data.lap_curr_x_f; - data.lap_prev_y_f = data.lap_prev_y_f / 4.0f + 0.75f * data.lap_curr_y_f; - data.lap_prev_heading_f = data.lap_prev_heading_f / 4.0f + 0.75f * data.lap_curr_heading_f; + data.lap_prev_latitude_f = 0.25f * data.lap_prev_latitude_f + 0.75f * data.lap_curr_latitude_f; + data.lap_prev_longitude_f = 0.25f * data.lap_prev_longitude_f + 0.75f * data.lap_curr_longitude_f; + data.lap_prev_x_f = 0.25f * data.lap_prev_x_f + 0.75f * data.lap_curr_x_f; + data.lap_prev_y_f = 0.25f * data.lap_prev_y_f + 0.75f * data.lap_curr_y_f; + data.lap_prev_heading_f = 0.25f * data.lap_prev_heading_f + 0.75f * data.lap_curr_heading_f; // Get curr data, transform to local coordinate plane data.lap_curr_latitude_f = state.vdmGpsLatLong.LATITUDE; data.lap_curr_longitude_f = state.vdmGpsLatLong.LONGITUDE; data.lap_curr_x_f = EARTH_RADIUS * (data.lap_curr_longitude_f - - data.lap_home_longitude_f) * cos(data.lap_home_longitude_f); + data.lap_home_longitude_f) * cos(M_PI * data.lap_home_latitude_f / + 180); data.lap_curr_y_f = EARTH_RADIUS * (data.lap_curr_latitude_f - data.lap_home_latitude_f); // TRANSFORM: Apply rotation matrix, home heading is x axis. - data.lap_curr_x_f = data.lap_curr_x_f * cos(data.lap_home_heading_f) + - data.lap_curr_y_f * sin(data.lap_home_heading_f); - data.lap_curr_y_f = data.lap_curr_x_f * -sin(data.lap_home_heading_f) + - data.lap_curr_y_f * cos(data.lap_home_heading_f); + double home_heading_rad_f = M_PI * data.lap_home_heading_f / 180; // convert to rad for trig funcs + double temp_x_f = data.lap_curr_x_f * cos(home_heading_rad_f) + data.lap_curr_y_f * sin(home_heading_rad_f); + double temp_y_f = data.lap_curr_x_f * -sin(home_heading_rad_f) + data.lap_curr_y_f * cos(home_heading_rad_f); + data.lap_curr_x_f = temp_x_f; + data.lap_curr_y_f = temp_y_f; + data.lap_curr_heading_f = (float) (state.vdmGpsData.TRUE_COURSE % 36000) * 0.01f; //scale to 0-359.99 // If nowhere near home coords/heading, return immediately if (abs(data.lap_curr_x_f - data.lap_home_x_f) > X_TOLERANCE) return; if (abs(data.lap_curr_y_f - data.lap_home_y_f) > Y_TOLERANCE) return; if (abs(data.lap_curr_heading_f - data.lap_home_heading_f) > HEADING_TOLERANCE) return; + if (timer.elapsed_time().count() < MIN_LAP_TIME) return; // If close enough and crossed home line, increment counter if (data.lap_curr_x_f > data.lap_home_x_f && data.lap_prev_x_f < data.lap_home_x_f) { data.lap_counter++; + data.lap_time = timer.elapsed_time(); + + timer.reset(); + timer.start(); return; } } + +std::chrono::microseconds LapCounter::getTime() { + return timer.elapsed_time(); +} diff --git a/Telemetry-Main/LapCounter.hpp b/Telemetry-Main/LapCounter.hpp index 03537c27..64e53c45 100644 --- a/Telemetry-Main/LapCounter.hpp +++ b/Telemetry-Main/LapCounter.hpp @@ -1,3 +1,13 @@ +/** + * Lap Counter + * Author: Nicholas Tang + * + * Made to separate lap counting from VSM. Uses VSM GPS and HEADING/TRUE_COURSE + * data. Make sure to call updateLapCounter a lot. + * + * Note: "local coordinate plane" is defined as: nose towards positive x + */ + #ifndef LAP_COUNTER_HPP #define LAP_COUNTER_HPP @@ -8,29 +18,34 @@ struct LapCounterData { float lap_home_latitude_f; float lap_home_longitude_f; - float lap_home_x_f; - float lap_home_y_f; + float lap_home_x_f; // relative to local coordinate plane + float lap_home_y_f; // relative to local coordinate plane float lap_home_heading_f; float lap_prev_latitude_f; float lap_prev_longitude_f; - float lap_prev_x_f; - float lap_prev_y_f; + float lap_prev_x_f; // relative to local coordinate plane + float lap_prev_y_f; // relative to local coordinate plane float lap_prev_heading_f; float lap_curr_latitude_f; float lap_curr_longitude_f; - float lap_curr_x_f; - float lap_curr_y_f; + float lap_curr_x_f; // relative to local coordinate plane + float lap_curr_y_f; // relative to local coordinate plane float lap_curr_heading_f; uint8_t lap_counter; // MARK: surely we don't do more than 255 laps(?) + std::chrono::microseconds lap_time; }; class LapCounter { public: LapCounterData data; Timer timer; + + /** + * Constructor, initializes all fields to 0 but lat/long + */ LapCounter(VehicleState state); /** * Resets object field. GPS data is set to wherever is in vehicle state @@ -40,6 +55,10 @@ class LapCounter { * Checks if a lap has been completed. If so, increments lap counter */ void updateLapCounter(VehicleState state); + /** + * Gets the lap time in microseconds. + */ + std::chrono::microseconds getTime(); }; #endif From 0487ef7e89d3e6d4a4ea3892bb57746d772ea15e Mon Sep 17 00:00:00 2001 From: Nicholas Tang Date: Mon, 20 Oct 2025 15:48:58 -0700 Subject: [PATCH 5/9] remove lap counting from vehicle state manager --- Telemetry-Main/VehicleStateManager.cpp | 27 -------------------------- Telemetry-Main/VehicleStateManager.hpp | 16 --------------- 2 files changed, 43 deletions(-) diff --git a/Telemetry-Main/VehicleStateManager.cpp b/Telemetry-Main/VehicleStateManager.cpp index 701edcf1..6866af9c 100644 --- a/Telemetry-Main/VehicleStateManager.cpp +++ b/Telemetry-Main/VehicleStateManager.cpp @@ -10,11 +10,6 @@ #include "CANProtocol.hpp" #include "mbed.h" -#define LAP_COUNT_HEADING_THRESHOLD 15 // degrees -#define LAP_COUNT_TIME_THRESHOLD ((int) 30e9) // microseconds -#define LAP_COUNT_LATITUDE_THRESHOLD 0.003 // degrees (arbitrary number for now) -#define LAP_COUNT_LONGITUDE_THRESHOLD 0.003 // degrees (arbitrary number for now) - VehicleStateManager::VehicleStateManager( MbedCAN* mbedCAN, PinName steering_sensor, @@ -23,14 +18,11 @@ VehicleStateManager::VehicleStateManager( ) : _mbedCAN(mbedCAN), _steering_sensor(steering_sensor), _brake_sensor_f(brake_sensor_r), _brake_sensor_r(brake_sensor_r) { _vehicleState = {}; - - strcpy(_lapTime, "0:00.000"); } void VehicleStateManager::update() { // printf("Updating CAN\n"); processCANMessage(); - updateLapTime(); readSensorValues(); } @@ -205,25 +197,6 @@ void VehicleStateManager::processCANMessage() { } } -void VehicleStateManager::updateLapTime() { - uint32_t milliseconds = std::chrono::duration_cast(_lapTimer.elapsed_time()).count(); - uint32_t minutes = milliseconds / 60000; - uint32_t seconds = (milliseconds % 60000) / 1000; - uint32_t ms = milliseconds % 1000; - - snprintf(_lapTime, sizeof(_lapTime), "%lu:%02lu.%03lu", - (unsigned long)minutes, (unsigned long)seconds, (unsigned long)ms); -} - -void VehicleStateManager::startLapTimer() { - _lapTimer.reset(); - _lapTimer.start(); -} - -const char* VehicleStateManager::getLapTime() const { - return _lapTime; -} - VehicleState VehicleStateManager::getState() const { return _vehicleState; } diff --git a/Telemetry-Main/VehicleStateManager.hpp b/Telemetry-Main/VehicleStateManager.hpp index 4499d6d3..b95490d4 100644 --- a/Telemetry-Main/VehicleStateManager.hpp +++ b/Telemetry-Main/VehicleStateManager.hpp @@ -54,17 +54,6 @@ class VehicleStateManager { VehicleState getState() const; void update(); - /** - * Resets all fields relating to lap counting to match current - * VehicleState. Assumes VehicleState was recently updated. - */ - void resetLapCounter(); - /** - * Returns true if a lap was detected as completed - */ - bool lapCompleted(); - void startLapTimer(); - const char* getLapTime() const; private: MbedCAN* _mbedCAN; @@ -74,12 +63,7 @@ class VehicleStateManager { VehicleState _vehicleState; - char _lapTime[16]; - Timer _lapTimer; - // LowPowerTimer _lapTimer; - void processCANMessage(); - void updateLapTime(); void readSensorValues(); }; From bbb0fe355c5736ad80e59e3a1efd6b1c88e6657f Mon Sep 17 00:00:00 2001 From: Nicholas Tang Date: Mon, 20 Oct 2025 16:19:10 -0700 Subject: [PATCH 6/9] update weighted averages for prev --- Telemetry-Main/LapCounter.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Telemetry-Main/LapCounter.cpp b/Telemetry-Main/LapCounter.cpp index 29145d34..fe92cac2 100644 --- a/Telemetry-Main/LapCounter.cpp +++ b/Telemetry-Main/LapCounter.cpp @@ -39,11 +39,11 @@ void LapCounter::resetLapCounter(VehicleState state) { void LapCounter::updateLapCounter(VehicleState state) { // Weighted avg for prev to average out noise - data.lap_prev_latitude_f = 0.25f * data.lap_prev_latitude_f + 0.75f * data.lap_curr_latitude_f; - data.lap_prev_longitude_f = 0.25f * data.lap_prev_longitude_f + 0.75f * data.lap_curr_longitude_f; - data.lap_prev_x_f = 0.25f * data.lap_prev_x_f + 0.75f * data.lap_curr_x_f; - data.lap_prev_y_f = 0.25f * data.lap_prev_y_f + 0.75f * data.lap_curr_y_f; - data.lap_prev_heading_f = 0.25f * data.lap_prev_heading_f + 0.75f * data.lap_curr_heading_f; + data.lap_prev_latitude_f = 0.1f * data.lap_prev_latitude_f + 0.9f * data.lap_curr_latitude_f; + data.lap_prev_longitude_f = 0.1f * data.lap_prev_longitude_f + 0.9f * data.lap_curr_longitude_f; + data.lap_prev_x_f = 0.1f * data.lap_prev_x_f + 0.9f * data.lap_curr_x_f; + data.lap_prev_y_f = 0.1f * data.lap_prev_y_f + 0.9f * data.lap_curr_y_f; + data.lap_prev_heading_f = 0.1f * data.lap_prev_heading_f + 0.9f * data.lap_curr_heading_f; // Get curr data, transform to local coordinate plane data.lap_curr_latitude_f = state.vdmGpsLatLong.LATITUDE; From 1617041295ef83bdc344da4277af55ee84cfa515 Mon Sep 17 00:00:00 2001 From: Nicholas Tang Date: Thu, 23 Oct 2025 23:22:04 -0700 Subject: [PATCH 7/9] working, adjust X,Y tolerances as needed. refactor main.cpp for this --- Telemetry-Main/LapCounter.cpp | 52 +++++++++++++++++++++-------------- Telemetry-Main/LapCounter.hpp | 8 +++--- 2 files changed, 35 insertions(+), 25 deletions(-) diff --git a/Telemetry-Main/LapCounter.cpp b/Telemetry-Main/LapCounter.cpp index fe92cac2..c3387830 100644 --- a/Telemetry-Main/LapCounter.cpp +++ b/Telemetry-Main/LapCounter.cpp @@ -2,12 +2,16 @@ #include "LapCounter.hpp" +#define DEG_TO_RAD ((float) M_PI / 180.0f) + #define EARTH_RADIUS 6378137 // earths radius in meters, used for conversion to local coordinate plane #define X_TOLERANCE 8.0f // check lap completion if x is within +- X_TOLERANCE meters of home x coord #define Y_TOLERANCE 8.0f // check lap completion if y is within +- Y_TOLERANCE meters of home y coord -#define HEADING_TOLERANCE 30.0f // check lap completion if heading is within +- HEADING_TOLERANCE degrees of home +#define HEADING_TOLERANCE 80.0f // check lap completion if heading is within +- HEADING_TOLERANCE degrees of home #define MIN_LAP_TIME 10 // minimum lap time in seconds. used to ensure same lap isn't counted twice +using namespace std; + LapCounter::LapCounter(VehicleState state) { resetLapCounter(state); } @@ -38,7 +42,10 @@ void LapCounter::resetLapCounter(VehicleState state) { } void LapCounter::updateLapCounter(VehicleState state) { - // Weighted avg for prev to average out noise + /** + * UPDATE POSITION + */ + // Get prev data, weighted avg to average out noise data.lap_prev_latitude_f = 0.1f * data.lap_prev_latitude_f + 0.9f * data.lap_curr_latitude_f; data.lap_prev_longitude_f = 0.1f * data.lap_prev_longitude_f + 0.9f * data.lap_curr_longitude_f; data.lap_prev_x_f = 0.1f * data.lap_prev_x_f + 0.9f * data.lap_curr_x_f; @@ -48,37 +55,40 @@ void LapCounter::updateLapCounter(VehicleState state) { // Get curr data, transform to local coordinate plane data.lap_curr_latitude_f = state.vdmGpsLatLong.LATITUDE; data.lap_curr_longitude_f = state.vdmGpsLatLong.LONGITUDE; - data.lap_curr_x_f = EARTH_RADIUS * (data.lap_curr_longitude_f - - data.lap_home_longitude_f) * cos(M_PI * data.lap_home_latitude_f / - 180); - data.lap_curr_y_f = EARTH_RADIUS * (data.lap_curr_latitude_f - - data.lap_home_latitude_f); + data.lap_curr_x_f = EARTH_RADIUS * DEG_TO_RAD * (data.lap_curr_longitude_f - data.lap_home_longitude_f) * cosf(DEG_TO_RAD * data.lap_home_latitude_f); // lat, long is degrees -> translate to rad + data.lap_curr_y_f = EARTH_RADIUS * DEG_TO_RAD * (data.lap_curr_latitude_f - data.lap_home_latitude_f); + data.lap_curr_heading_f = (float) (state.vdmGpsData.TRUE_COURSE % 36000) * 0.01f; //scale to 0-359.99 + // TRANSFORM: Apply rotation matrix, home heading is x axis. - double home_heading_rad_f = M_PI * data.lap_home_heading_f / 180; // convert to rad for trig funcs - double temp_x_f = data.lap_curr_x_f * cos(home_heading_rad_f) + data.lap_curr_y_f * sin(home_heading_rad_f); - double temp_y_f = data.lap_curr_x_f * -sin(home_heading_rad_f) + data.lap_curr_y_f * cos(home_heading_rad_f); + float home_heading_rad_f = DEG_TO_RAD * data.lap_home_heading_f; // convert to rad for trig funcs + float temp_x_f = data.lap_curr_x_f * cosf(home_heading_rad_f) + data.lap_curr_y_f * sinf(home_heading_rad_f); + float temp_y_f = data.lap_curr_x_f * -sinf(home_heading_rad_f) + data.lap_curr_y_f * cosf(home_heading_rad_f); data.lap_curr_x_f = temp_x_f; data.lap_curr_y_f = temp_y_f; - data.lap_curr_heading_f = (float) (state.vdmGpsData.TRUE_COURSE % 36000) * 0.01f; //scale to 0-359.99 - + /** + * CHECK IF LAP COMPLETED + */ // If nowhere near home coords/heading, return immediately if (abs(data.lap_curr_x_f - data.lap_home_x_f) > X_TOLERANCE) return; if (abs(data.lap_curr_y_f - data.lap_home_y_f) > Y_TOLERANCE) return; if (abs(data.lap_curr_heading_f - data.lap_home_heading_f) > HEADING_TOLERANCE) return; - if (timer.elapsed_time().count() < MIN_LAP_TIME) return; - - // If close enough and crossed home line, increment counter - if (data.lap_curr_x_f > data.lap_home_x_f && data.lap_prev_x_f < data.lap_home_x_f) { - data.lap_counter++; - data.lap_time = timer.elapsed_time(); - + if (timer.elapsed_time().count() < MIN_LAP_TIME) { timer.reset(); timer.start(); + return; } + + // Lap has been completed, all conditions pass + data.lap_counter++; + data.lap_time = std::chrono::duration{timer.elapsed_time()}.count(); + + timer.reset(); + timer.start(); + return; } -std::chrono::microseconds LapCounter::getTime() { - return timer.elapsed_time(); +float LapCounter::getTime() { + return std::chrono::duration{timer.elapsed_time()}.count(); } diff --git a/Telemetry-Main/LapCounter.hpp b/Telemetry-Main/LapCounter.hpp index 64e53c45..0421326a 100644 --- a/Telemetry-Main/LapCounter.hpp +++ b/Telemetry-Main/LapCounter.hpp @@ -5,7 +5,7 @@ * Made to separate lap counting from VSM. Uses VSM GPS and HEADING/TRUE_COURSE * data. Make sure to call updateLapCounter a lot. * - * Note: "local coordinate plane" is defined as: nose towards positive x + * Note: "local coordinate plane" is defined as: nose towards positive x, positive y is left i think */ #ifndef LAP_COUNTER_HPP @@ -35,7 +35,7 @@ struct LapCounterData { float lap_curr_heading_f; uint8_t lap_counter; // MARK: surely we don't do more than 255 laps(?) - std::chrono::microseconds lap_time; + float lap_time; }; class LapCounter { @@ -56,9 +56,9 @@ class LapCounter { */ void updateLapCounter(VehicleState state); /** - * Gets the lap time in microseconds. + * Gets the lap time in seconds. */ - std::chrono::microseconds getTime(); + float getTime(); }; #endif From d3b15ae20e118cae67fdb6105eca683d77d9590d Mon Sep 17 00:00:00 2001 From: Nicholas Tang Date: Thu, 23 Oct 2025 23:31:07 -0700 Subject: [PATCH 8/9] fix VDM structs for reinterpret casting the CAN msgs --- Telemetry-Main/CANProtocol.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Telemetry-Main/CANProtocol.hpp b/Telemetry-Main/CANProtocol.hpp index 4a726e19..02cb1cc8 100644 --- a/Telemetry-Main/CANProtocol.hpp +++ b/Telemetry-Main/CANProtocol.hpp @@ -199,8 +199,8 @@ struct TPERIPH_TIRETEMP_t { }; struct VDM_GPS_LAT_LONG_t { - int32_t LATITUDE; // bits 7-38 - int32_t LONGITUDE; // bits 39-50 + float LATITUDE; // bits 7-38 + float LONGITUDE; // bits 39-50 }; struct VDM_GPS_DATA_t { @@ -216,6 +216,7 @@ struct VDM_DATE_TIME_t { uint8_t UTC_DATE_YEAR; // bits 15-22 uint8_t UTC_DATE_MONTH; // bits 23-30 uint8_t UTC_DATE_DAY; // bits 31-38 + uint8_t padding; uint8_t UTC_TIME_HOURS; // bits 47-54 uint8_t UTC_TIME_MINUTES; // bits 55-62 uint8_t UTC_TIME_SECONDS; // bits 63-70 From 74b44048eea371a4db2a2e523a4d9e475d2cfb9d Mon Sep 17 00:00:00 2001 From: Matin Qurbanzadeh <61672425+MatinQurban@users.noreply.github.com> Date: Thu, 13 Nov 2025 01:13:59 -0800 Subject: [PATCH 9/9] Clarify padding field bits in VDM_DATE_TIME_t struct --- Telemetry-Main/CANProtocol.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Telemetry-Main/CANProtocol.hpp b/Telemetry-Main/CANProtocol.hpp index 02cb1cc8..ca9b1adb 100644 --- a/Telemetry-Main/CANProtocol.hpp +++ b/Telemetry-Main/CANProtocol.hpp @@ -216,7 +216,7 @@ struct VDM_DATE_TIME_t { uint8_t UTC_DATE_YEAR; // bits 15-22 uint8_t UTC_DATE_MONTH; // bits 23-30 uint8_t UTC_DATE_DAY; // bits 31-38 - uint8_t padding; + uint8_t padding; // bits 39-46 uint8_t UTC_TIME_HOURS; // bits 47-54 uint8_t UTC_TIME_MINUTES; // bits 55-62 uint8_t UTC_TIME_SECONDS; // bits 63-70