diff --git a/.gitignore b/.gitignore index f15bf21..000c413 100644 --- a/.gitignore +++ b/.gitignore @@ -52,5 +52,6 @@ Mkfile.old dkms.conf # Extras +.vscode/ FS-AI_API_Console/fs-ai_api_console FS-AI_API_Tester/fs-ai_api_tester diff --git a/Docs/ADS-DV_Software_Interface_Specification_v3.0.pdf b/Docs/ADS-DV_Software_Interface_Specification_v3.0.pdf new file mode 100644 index 0000000..3ce8167 Binary files /dev/null and b/Docs/ADS-DV_Software_Interface_Specification_v3.0.pdf differ diff --git a/Docs/PCAN-GPS_UserMan_eng.pdf b/Docs/PCAN-GPS_UserMan_eng.pdf new file mode 100644 index 0000000..7d29752 Binary files /dev/null and b/Docs/PCAN-GPS_UserMan_eng.pdf differ diff --git a/Docs/ads-dv-software-interface-specification-v2-0.pdf b/Docs/ads-dv-software-interface-specification-v2-0.pdf deleted file mode 100644 index 156bf28..0000000 Binary files a/Docs/ads-dv-software-interface-specification-v2-0.pdf and /dev/null differ diff --git a/Docs/adsdv_2019_vcu_ai_interface_v2.dbc b/Docs/adsdv_2021_vcu_ai_interface_v1.dbc similarity index 65% rename from Docs/adsdv_2019_vcu_ai_interface_v2.dbc rename to Docs/adsdv_2021_vcu_ai_interface_v1.dbc index 5f1cf9a..b9cc792 100644 --- a/Docs/adsdv_2019_vcu_ai_interface_v2.dbc +++ b/Docs/adsdv_2021_vcu_ai_interface_v1.dbc @@ -1,389 +1,327 @@ -VERSION "HIPBNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY/4/%%%/4/'%**4YYY///" - - -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_ - -BS_: - -BU_: AI UMB VCU DIS RES BMS PC - - -BO_ 1280 VCU2LOG_Dynamics1: 8 VCU - SG_ Speed_actual_kmh : 0|8@1+ (1,0) [0|255] "km/h" Vector__XXX - SG_ Speed_target_kmh : 8|8@1+ (1,0) [0|255] "km/h" Vector__XXX - SG_ Steer_actual_deg : 16|8@1- (0.5,0) [-64|63.5] "deg" Vector__XXX - SG_ Steer_target_deg : 24|8@1- (0.5,0) [-64|63.5] "deg" Vector__XXX - SG_ Brake_actual_pct : 32|8@1+ (1,0) [0|100] "%" Vector__XXX - SG_ Brake_target_pct : 40|8@1+ (1,0) [0|100] "%" Vector__XXX - SG_ Drive_trq_actual_pct : 48|8@1+ (1,0) [0|100] "%" Vector__XXX - SG_ Drive_trq_target_pct : 56|8@1+ (1,0) [0|100] "%" Vector__XXX - -BO_ 1281 AI2LOG_Dynamics2: 6 AI - SG_ Accel_longitudinal_mps2 : 0|16@1- (0.00195313,0) [-64|63.998] "m/s^2" Vector__XXX - SG_ Accel_lateral_mps2 : 16|16@1- (0.00195313,0) [-64|63.998] "m/s^2" Vector__XXX - SG_ Yaw_rate_degps : 32|16@1- (0.0078125,0) [-256|255.992] "deg/s" Vector__XXX - -BO_ 1282 VCU2LOG_Status: 5 VCU - SG_ State_ASSI : 0|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ State_EBS : 3|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ State_AMI : 5|3@1+ (1,0) [0|7] "" Vector__XXX - SG_ State_steering : 8|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ State_service_brake : 9|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ Lap_counter : 11|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ Cones_count_actual : 15|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ Cones_count_all : 23|17@1+ (1,0) [0|131071] "" Vector__XXX - -BO_ 1296 AI2VCU_Status: 8 AI - SG_ DIRECTION_REQUEST : 14|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ ESTOP_REQUEST : 8|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MISSION_STATUS : 12|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ HANDSHAKE : 0|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ LAP_COUNTER : 16|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ CONES_COUNT_ACTUAL : 24|8@1+ (1,0) [0|255] "" Vector__XXX - SG_ CONES_COUNT_ALL : 32|16@1+ (1,0) [0|65535] "" Vector__XXX - SG_ VEH_SPEED_ACTUAL_kmh : 48|8@1+ (1,0) [0|255] "km/h" Vector__XXX - SG_ VEH_SPEED_DEMAND_kmh : 56|8@1+ (1,0) [0|255] "km/h" Vector__XXX - -BO_ 1297 AI2VCU_Drive_F: 8 AI - SG_ FRONT_AXLE_TRQ_REQUEST_Nm : 0|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX - SG_ FRONT_MOTOR_SPEED_MAX_rpm : 16|16@1+ (1,0) [0|4000] "rpm" Vector__XXX - -BO_ 1298 AI2VCU_Drive_R: 8 AI - SG_ REAR_AXLE_TRQ_REQUEST_Nm : 0|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX - SG_ REAR_MOTOR_SPEED_MAX_rpm : 16|16@1+ (1,0) [0|4000] "rpm" Vector__XXX - -BO_ 1299 AI2VCU_Steer: 8 AI - SG_ STEER_REQUEST_deg : 0|16@1- (0.1,0) [-27.2|27.2] "deg" Vector__XXX - -BO_ 1300 AI2VCU_Brake: 8 AI - SG_ HYD_PRESSURE_REQUEST_pct : 0|8@1+ (0.5,0) [0|100] "%" Vector__XXX - -BO_ 1312 VCU2AI_Status: 8 VCU - SG_ AS_SWITCH_STATUS : 9|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ TS_SWITCH_STATUS : 10|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AS_STATE : 16|4@1+ (1,0) [0|7] "" Vector__XXX - SG_ STEERING_STATUS : 12|2@1+ (1,0) [0|3] "" Vector__XXX - SG_ SHUTDOWN_REQUEST : 8|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_STATUS : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WARNING_STATUS : 25|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HANDSHAKE : 0|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AMI_STATE : 20|4@1+ (1,0) [0|7] "" Vector__XXX - SG_ GO_SIGNAL : 11|1@1+ (1,0) [0|0] "" Vector__XXX - SG_ AI_ESTOP_REQUEST : 40|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HVIL_OPEN_FAULT : 41|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ HVIL_SHORT_FAULT : 42|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ EBS_FAULT : 43|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ OFFBOARD_CHARGER_FAULT : 44|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AI_COMMS_LOST : 45|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WARN_BATT_TEMP_HIGH : 32|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ WARN_BATT_SOC_LOW : 33|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ RESERVED_1 : 48|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ RESERVED_2 : 49|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ AUTONOMOUS_BRAKING_FAULT : 46|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ MISSION_STATUS_FAULT : 47|1@1+ (1,0) [0|1] "" Vector__XXX - -BO_ 1313 VCU2AI_Drive_F: 8 VCU - SG_ FRONT_AXLE_TRQ_Nm : 0|16@1- (0.1,0) [-195|195] "Nm" Vector__XXX - SG_ FRONT_AXLE_TRQ_MAX_Nm : 32|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX - SG_ FRONT_AXLE_TRQ_REQUEST_Nm : 16|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX - -BO_ 1314 VCU2AI_Drive_R: 8 VCU - SG_ REAR_AXLE_TRQ_Nm : 0|16@1- (0.1,0) [-195|195] "Nm" Vector__XXX - SG_ REAR_AXLE_TRQ_REQUEST_Nm : 16|16@1- (0.1,0) [-195|195] "Nm" Vector__XXX - SG_ REAR_AXLE_TRQ_MAX_Nm : 32|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX - -BO_ 1315 VCU2AI_Steer: 8 VCU - SG_ STEER_ANGLE_deg : 0|16@1- (0.1,0) [-27.2|27.2] "deg" Vector__XXX - SG_ STEER_ANGLE_MAX_deg : 16|16@1+ (0.1,0) [0|27.2] "deg" Vector__XXX - SG_ STEER_ANGLE_REQUEST_deg : 32|16@1- (0.1,0) [-27.2|27.2] "deg" Vector__XXX - -BO_ 1316 VCU2AI_Brake: 8 VCU - SG_ HYD_PRESSURE_pct : 0|8@1+ (0.5,0) [0|100] "%" Vector__XXX - SG_ HYD_PRESSURE_REQUEST_pct : 8|8@1+ (0.5,0) [0|100] "%" Vector__XXX - -BO_ 1317 VCU2AI_Wheel_speeds: 8 VCU - SG_ FL_WHEEL_SPEED_rpm : 0|16@1+ (1,0) [0|1250] "rpm" Vector__XXX - SG_ FR_WHEEL_SPEED_rpm : 16|16@1+ (1,0) [0|1250] "rpm" Vector__XXX - SG_ RL_WHEEL_SPEED_rpm : 32|16@1+ (1,0) [0|1250] "rpm" Vector__XXX - SG_ RR_WHEEL_SPEED_rpm : 48|16@1+ (1,0) [0|1250] "rpm" Vector__XXX - -BO_ 1318 VCU2AI_Wheel_counts: 8 VCU - SG_ FL_PULSE_COUNT : 0|16@1+ (1,0) [0|65535] "" Vector__XXX - SG_ FR_PULSE_COUNT : 16|16@1+ (1,0) [0|65535] "" Vector__XXX - SG_ RL_PULSE_COUNT : 32|16@1+ (1,0) [0|65535] "" Vector__XXX - SG_ RR_PULSE_COUNT : 48|16@1+ (1,0) [0|65535] "" Vector__XXX - -BO_ 1319 VCU2AI_Drive_motor_data: 8 VCU - SG_ MOTOR_F_TEMP_degC : 0|8@1+ (1,-30) [-30|225] "degC" Vector__XXX - SG_ MOTOR_R_TEMP_degC : 8|8@1+ (1,-30) [-30|225] "degC" Vector__XXX - SG_ MOTOR_F_CURR_0A05 : 16|16@1- (0.05,0) [-1638.4|1638.35] "A" Vector__XXX - SG_ MOTOR_R_CURR_0A05 : 32|16@1- (0.05,0) [-1638.4|1638.35] "A" Vector__XXX - -BO_ 1320 VCU2AI_Diagnostics: 8 VCU - SG_ BATTERY_SOC_pc : 0|8@1+ (1,0) [0|100] "%" Vector__XXX - SG_ BATTERY_MAX_CELL_TEMP_degC : 8|8@1+ (1,-30) [-30|225] "degC" Vector__XXX - SG_ FAULT_CELL_OVER_TEMP : 16|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_CELL_OVER_VOLT : 17|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_CELL_UNDER_VOLT : 18|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_CHG_AUX_OPEN : 19|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_CHG_AUX_SHORT : 20|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_FUSE_ACTIVATION : 21|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_HVPOS1_OPEN : 22|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_HVPOS2_OPEN : 23|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_PRECHG_OPEN : 24|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_VOLTAGE_DISAGREE : 25|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_PACK_OVER_CURRENT : 26|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_MEASUREMENT : 27|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ FAULT_LOW_SOC : 28|1@1+ (1,0) [0|1] "" Vector__XXX - SG_ SYS_ACTION : 32|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ SM_CONTACTOR : 40|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ SM_MAIN : 44|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ SM_MC_DRV : 48|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ SM_DRV_AUTO : 52|4@1+ (1,0) [0|15] "" Vector__XXX - SG_ SM_EBS : 56|4@1+ (1,0) [0|15] "" Vector__XXX - - -CM_ BU_ AI "AI Computer (NVIDIA Drive PX2)"; -CM_ BU_ UMB "Umbilical controller"; -CM_ BU_ VCU "Vehicle Control Unit"; -CM_ BU_ DIS "Display screen"; -CM_ BU_ RES "Remote Emergency Stop"; -CM_ BO_ 1280 "VCU T1"; -CM_ BO_ 1282 "VCU T1"; -CM_ BO_ 1296 "VCU R1"; -CM_ SG_ 1296 DIRECTION_REQUEST "Requested vehicle direction"; -CM_ SG_ 1296 ESTOP_REQUEST "Shutdown request to VCU"; -CM_ SG_ 1296 MISSION_STATUS "Autonomous mission status"; -CM_ SG_ 1296 HANDSHAKE "Handshake"; -CM_ SG_ 1296 LAP_COUNTER "Lap counter"; -CM_ SG_ 1296 CONES_COUNT_ACTUAL "Number of cones detected"; -CM_ SG_ 1296 CONES_COUNT_ALL "Total number of cones detected"; -CM_ SG_ 1296 VEH_SPEED_ACTUAL_kmh "Actual vehicle speed"; -CM_ SG_ 1296 VEH_SPEED_DEMAND_kmh "Demanded vehicle speed"; -CM_ BO_ 1297 "VCU R1"; -CM_ SG_ 1297 FRONT_AXLE_TRQ_REQUEST_Nm "Requested front axle torque"; -CM_ SG_ 1297 FRONT_MOTOR_SPEED_MAX_rpm "Front motor speed limit"; -CM_ BO_ 1298 "VCU R1"; -CM_ SG_ 1298 REAR_AXLE_TRQ_REQUEST_Nm "Requested rear axle torque"; -CM_ SG_ 1298 REAR_MOTOR_SPEED_MAX_rpm "Rear motor speed limit"; -CM_ BO_ 1299 "VCU R1"; -CM_ SG_ 1299 STEER_REQUEST_deg "Requested steer angle"; -CM_ BO_ 1300 "VCU R1"; -CM_ SG_ 1300 HYD_PRESSURE_REQUEST_pct "Requested hydraulic brake pressure"; -CM_ BO_ 1312 "VCU T1"; -CM_ SG_ 1312 AS_SWITCH_STATUS "Autonomous System switch status"; -CM_ SG_ 1312 TS_SWITCH_STATUS "Tractive System switch status"; -CM_ SG_ 1312 AS_STATE "State of the Autonomous System"; -CM_ SG_ 1312 STEERING_STATUS "State of the steering system"; -CM_ SG_ 1312 SHUTDOWN_REQUEST "Shutdown request to AI"; -CM_ SG_ 1312 FAULT_STATUS "System fault status"; -CM_ SG_ 1312 WARNING_STATUS "System warning status"; -CM_ SG_ 1312 HANDSHAKE "Handshake"; -CM_ SG_ 1312 AMI_STATE "State of the Mission Indicator"; -CM_ SG_ 1312 GO_SIGNAL "Autonomous System \"Go\" signal"; -CM_ SG_ 1312 AI_ESTOP_REQUEST "AI system E-stop request"; -CM_ SG_ 1312 HVIL_OPEN_FAULT "HVIL open-circuit fault"; -CM_ SG_ 1312 HVIL_SHORT_FAULT "HVIL short-circuit fault"; -CM_ SG_ 1312 EBS_FAULT "EBS fault"; -CM_ SG_ 1312 OFFBOARD_CHARGER_FAULT "Offboard charger fault"; -CM_ SG_ 1312 AI_COMMS_LOST "AI CAN communications fault"; -CM_ SG_ 1312 WARN_BATT_TEMP_HIGH "High traction battery temperature warning"; -CM_ SG_ 1312 WARN_BATT_SOC_LOW "Low traction battery SOC warning"; -CM_ SG_ 1312 RESERVED_1 ""; -CM_ SG_ 1312 RESERVED_2 ""; -CM_ SG_ 1312 AUTONOMOUS_BRAKING_FAULT "Braking in Autonomous Driving mode fault"; -CM_ SG_ 1312 MISSION_STATUS_FAULT "Autonomous mission status fault"; -CM_ BO_ 1313 "VCU T1"; -CM_ SG_ 1313 FRONT_AXLE_TRQ_Nm "Current front axle torque"; -CM_ SG_ 1313 FRONT_AXLE_TRQ_MAX_Nm "Maximum front axle drive torque"; -CM_ SG_ 1313 FRONT_AXLE_TRQ_REQUEST_Nm "Requested front axle torque"; -CM_ BO_ 1314 "VCU T1"; -CM_ SG_ 1314 REAR_AXLE_TRQ_Nm "Current rear axle torque"; -CM_ SG_ 1314 REAR_AXLE_TRQ_REQUEST_Nm "Requested rear axle torque"; -CM_ SG_ 1314 REAR_AXLE_TRQ_MAX_Nm "Maximum rear axle drive torque"; -CM_ BO_ 1315 "VCU T1"; -CM_ SG_ 1315 STEER_ANGLE_deg "Current steering angle"; -CM_ SG_ 1315 STEER_ANGLE_MAX_deg "Maximum allowable steering angle"; -CM_ SG_ 1315 STEER_ANGLE_REQUEST_deg "Requested steering angle"; -CM_ BO_ 1316 "VCU T1"; -CM_ SG_ 1316 HYD_PRESSURE_pct "Current hydraulic brake pressure"; -CM_ SG_ 1316 HYD_PRESSURE_REQUEST_pct "Requested hydraulic brake pressure"; -CM_ BO_ 1317 "VCU T1"; -CM_ SG_ 1317 FL_WHEEL_SPEED_rpm "Front left wheel speed"; -CM_ SG_ 1317 FR_WHEEL_SPEED_rpm "Front right wheel speed"; -CM_ SG_ 1317 RL_WHEEL_SPEED_rpm "Rear left wheel speed"; -CM_ SG_ 1317 RR_WHEEL_SPEED_rpm "Rear right wheel speed"; -CM_ BO_ 1318 "VCU T1"; -CM_ SG_ 1318 FL_PULSE_COUNT "Front left wheel speed pulse count"; -CM_ SG_ 1318 FR_PULSE_COUNT "Front right wheel speed pulse count"; -CM_ SG_ 1318 RL_PULSE_COUNT "Rear left wheel speed pulse count"; -CM_ SG_ 1318 RR_PULSE_COUNT "Rear right wheel speed pulse count"; -CM_ SG_ 1319 MOTOR_F_TEMP_degC "Front drive motor temperature"; -CM_ SG_ 1319 MOTOR_R_TEMP_degC "Rear drive motor temperature"; -CM_ SG_ 1319 MOTOR_F_CURR_0A05 "Front drive motor current"; -CM_ SG_ 1319 MOTOR_R_CURR_0A05 "Rear drive motor current"; -CM_ SG_ 1320 BATTERY_SOC_pc "Battery state of charge"; -CM_ SG_ 1320 BATTERY_MAX_CELL_TEMP_degC "Maximum battery cell temperature"; -CM_ SG_ 1320 FAULT_CELL_OVER_TEMP "Battery cell over-temperature fault"; -CM_ SG_ 1320 FAULT_CELL_OVER_VOLT "Battery cell over-voltage fault"; -CM_ SG_ 1320 FAULT_CELL_UNDER_VOLT "Battery cell under-voltage fault"; -CM_ SG_ 1320 FAULT_CHG_AUX_OPEN "Charge aux contactor open circuit fault"; -CM_ SG_ 1320 FAULT_CHG_AUX_SHORT "Charge aux contactor short circuit fault"; -CM_ SG_ 1320 FAULT_FUSE_ACTIVATION "Fuse activation fault"; -CM_ SG_ 1320 FAULT_HVPOS1_OPEN "Front drive motor contactor fault"; -CM_ SG_ 1320 FAULT_HVPOS2_OPEN "Rear drive motor contactor fault"; -CM_ SG_ 1320 FAULT_PRECHG_OPEN "Pre-charge contactor fault"; -CM_ SG_ 1320 FAULT_VOLTAGE_DISAGREE "Battery voltage measurement disagreement fault"; -CM_ SG_ 1320 FAULT_PACK_OVER_CURRENT "Battery pack over-current fault"; -CM_ SG_ 1320 FAULT_MEASUREMENT "BMS measurement fault"; -CM_ SG_ 1320 FAULT_LOW_SOC "Low battery SOC fault"; -CM_ SG_ 1320 SYS_ACTION "System action"; -CM_ SG_ 1320 SM_CONTACTOR "Contactor state machine state"; -CM_ SG_ 1320 SM_MAIN "Main state machine state"; -CM_ SG_ 1320 SM_MC_DRV "Drive motor controller state machine state"; -CM_ SG_ 1320 SM_DRV_AUTO "Autonomous driving state machine state"; -CM_ SG_ 1320 SM_EBS "Emergency braking system state machine state"; -BA_DEF_ "BusType" STRING ; -BA_DEF_ SG_ "GenSigStartValue" FLOAT -3.4e+038 3.4e+038; -BA_DEF_ SG_ "GenSigAutoGenSnd" ENUM "No","Yes"; -BA_DEF_ SG_ "GenSigAutoGenDsp" ENUM "No","Yes"; -BA_DEF_ SG_ "GenSigEnvVarType" ENUM "int","float","undef"; -BA_DEF_ SG_ "GenSigEVName" STRING ; -BA_DEF_ BU_ "GenNodAutoGenSnd" ENUM "No","Yes"; -BA_DEF_ BU_ "GenNodAutoGenDsp" ENUM "No","Yes"; -BA_DEF_ "GenEnvVarEndingDsp" STRING ; -BA_DEF_ "GenEnvVarEndingSnd" STRING ; -BA_DEF_ "GenEnvVarPrefix" STRING ; -BA_DEF_ BO_ "GenMsgCycleTime" INT 0 5; -BA_DEF_DEF_ "BusType" "CAN"; -BA_DEF_DEF_ "GenSigStartValue" 0; -BA_DEF_DEF_ "GenSigAutoGenSnd" ""; -BA_DEF_DEF_ "GenSigAutoGenDsp" ""; -BA_DEF_DEF_ "GenSigEnvVarType" "undef"; -BA_DEF_DEF_ "GenSigEVName" ""; -BA_DEF_DEF_ "GenNodAutoGenSnd" "Yes"; -BA_DEF_DEF_ "GenNodAutoGenDsp" "Yes"; -BA_DEF_DEF_ "GenEnvVarEndingDsp" "Dsp"; -BA_DEF_DEF_ "GenEnvVarEndingSnd" "Snd"; -BA_DEF_DEF_ "GenEnvVarPrefix" "Env"; -BA_DEF_DEF_ "GenMsgCycleTime" 5; -BA_ "GenSigStartValue" SG_ 1280 Speed_actual_kmh 0; -BA_ "GenSigStartValue" SG_ 1280 Speed_target_kmh 0; -BA_ "GenSigStartValue" SG_ 1280 Steer_actual_deg 0; -BA_ "GenSigStartValue" SG_ 1280 Steer_target_deg 0; -BA_ "GenSigStartValue" SG_ 1280 Brake_actual_pct 0; -BA_ "GenSigStartValue" SG_ 1280 Brake_target_pct 0; -BA_ "GenSigStartValue" SG_ 1280 Drive_trq_actual_pct 0; -BA_ "GenSigStartValue" SG_ 1280 Drive_trq_target_pct 0; -BA_ "GenSigStartValue" SG_ 1281 Accel_longitudinal_mps2 0; -BA_ "GenSigStartValue" SG_ 1281 Accel_lateral_mps2 0; -BA_ "GenSigStartValue" SG_ 1281 Yaw_rate_degps 0; -BA_ "GenSigStartValue" SG_ 1282 State_ASSI 0; -BA_ "GenSigStartValue" SG_ 1282 State_EBS 0; -BA_ "GenSigStartValue" SG_ 1282 State_AMI 0; -BA_ "GenSigStartValue" SG_ 1282 State_steering 0; -BA_ "GenSigStartValue" SG_ 1282 State_service_brake 0; -BA_ "GenSigStartValue" SG_ 1282 Lap_counter 0; -BA_ "GenSigStartValue" SG_ 1282 Cones_count_actual 0; -BA_ "GenSigStartValue" SG_ 1282 Cones_count_all 0; -BA_ "GenSigStartValue" SG_ 1296 DIRECTION_REQUEST 0; -BA_ "GenSigStartValue" SG_ 1296 ESTOP_REQUEST 0; -BA_ "GenSigStartValue" SG_ 1296 MISSION_STATUS 0; -BA_ "GenSigStartValue" SG_ 1296 HANDSHAKE 0; -BA_ "GenSigStartValue" SG_ 1296 LAP_COUNTER 0; -BA_ "GenSigStartValue" SG_ 1296 CONES_COUNT_ACTUAL 0; -BA_ "GenSigStartValue" SG_ 1296 CONES_COUNT_ALL 0; -BA_ "GenSigStartValue" SG_ 1297 FRONT_AXLE_TRQ_REQUEST_Nm 0; -BA_ "GenSigStartValue" SG_ 1297 FRONT_MOTOR_SPEED_MAX_rpm 0; -BA_ "GenSigStartValue" SG_ 1298 REAR_AXLE_TRQ_REQUEST_Nm 0; -BA_ "GenSigStartValue" SG_ 1298 REAR_MOTOR_SPEED_MAX_rpm 0; -BA_ "GenSigStartValue" SG_ 1299 STEER_REQUEST_deg 0; -BA_ "GenSigStartValue" SG_ 1300 HYD_PRESSURE_REQUEST_pct 0; -BA_ "GenSigStartValue" SG_ 1312 AS_SWITCH_STATUS 0; -BA_ "GenSigStartValue" SG_ 1312 TS_SWITCH_STATUS 0; -BA_ "GenSigStartValue" SG_ 1312 AS_STATE 0; -BA_ "GenSigStartValue" SG_ 1312 STEERING_STATUS 0; -BA_ "GenSigStartValue" SG_ 1312 SHUTDOWN_REQUEST 0; -BA_ "GenSigStartValue" SG_ 1312 FAULT_STATUS 0; -BA_ "GenSigStartValue" SG_ 1312 WARNING_STATUS 0; -BA_ "GenSigStartValue" SG_ 1312 HANDSHAKE 0; -BA_ "GenSigStartValue" SG_ 1312 AMI_STATE 0; -BA_ "GenSigStartValue" SG_ 1313 FRONT_AXLE_TRQ_Nm 0; -BA_ "GenSigStartValue" SG_ 1313 FRONT_AXLE_TRQ_MAX_Nm 0; -BA_ "GenSigStartValue" SG_ 1313 FRONT_AXLE_TRQ_REQUEST_Nm 0; -BA_ "GenSigStartValue" SG_ 1314 REAR_AXLE_TRQ_Nm 0; -BA_ "GenSigStartValue" SG_ 1314 REAR_AXLE_TRQ_REQUEST_Nm 0; -BA_ "GenSigStartValue" SG_ 1314 REAR_AXLE_TRQ_MAX_Nm 0; -BA_ "GenSigStartValue" SG_ 1315 STEER_ANGLE_deg 0; -BA_ "GenSigStartValue" SG_ 1315 STEER_ANGLE_MAX_deg 0; -BA_ "GenSigStartValue" SG_ 1315 STEER_ANGLE_REQUEST_deg 0; -BA_ "GenSigStartValue" SG_ 1316 HYD_PRESSURE_pct 0; -BA_ "GenSigStartValue" SG_ 1316 HYD_PRESSURE_REQUEST_pct 0; -BA_ "GenSigStartValue" SG_ 1317 FL_WHEEL_SPEED_rpm 0; -BA_ "GenSigStartValue" SG_ 1317 FR_WHEEL_SPEED_rpm 0; -BA_ "GenSigStartValue" SG_ 1317 RL_WHEEL_SPEED_rpm 0; -BA_ "GenSigStartValue" SG_ 1317 RR_WHEEL_SPEED_rpm 0; -VAL_ 1282 State_ASSI 1 "OFF" 2 "READY" 3 "DRIVING" 4 "EMERGENCY_BRAKE" 5 "FINISH" ; -VAL_ 1282 State_EBS 1 "UNAVAILABLE" 2 "ARMED" 3 "TRIGGERED" ; -VAL_ 1282 State_AMI 1 "ACCELERATION" 2 "SKIDPAD" 3 "AUTOCROSS" 4 "TRACK_DRIVE" 5 "BRAKE_TEST" 6 "INSPECTION" ; -VAL_ 1282 State_steering 0 "OFF" 1 "ON" ; -VAL_ 1282 State_service_brake 1 "DISENGAGED" 2 "ENGAGED" 3 "AVAILABLE" ; -VAL_ 1296 DIRECTION_REQUEST 0 "NEUTRAL" 1 "FORWARD" 2 "REVERSE" ; -VAL_ 1296 ESTOP_REQUEST 0 "NO SHUTDOWN" 1 "SHUTDOWN REQUESTED" ; -VAL_ 1296 MISSION_STATUS 0 "NOT SELECTED" 1 "SELECTED" 2 "RUNNING" 3 "FINISHED" ; -VAL_ 1312 AS_SWITCH_STATUS 0 "OFF" 1 "ON" ; -VAL_ 1312 TS_SWITCH_STATUS 0 "OFF" 1 "ON" ; -VAL_ 1312 AS_STATE 1 "AS_OFF" 2 "AS_READY" 3 "AS_DRIVING" 4 "EMERGENCY_BRAKE" 5 "AS_FINISHED" ; -VAL_ 1312 STEERING_STATUS 0 "OFF" 1 "ACTIVE" ; -VAL_ 1312 SHUTDOWN_REQUEST 0 "NO SHUTDOWN" 1 "SHUTDOWN REQUESTED" ; -VAL_ 1312 FAULT_STATUS 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1312 WARNING_STATUS 0 "NO WARNING" 1 "WARNING ACTIVE" ; -VAL_ 1312 AMI_STATE 0 "NOT SELECTED" 1 "ACCELERATION" 2 "SKIDPAD" 3 "AUTOCROSS" 4 "TRACK_DRIVE" 5 "BRAKE_TEST" 6 "INSPECTION" ; -VAL_ 1312 GO_SIGNAL 0 "NO GO" 1 "GO" ; -VAL_ 1312 AI_ESTOP_REQUEST 0 "FALSE" 1 "TRUE" ; -VAL_ 1312 HVIL_OPEN_FAULT 0 "FALSE" 1 "TRUE" ; -VAL_ 1312 HVIL_SHORT_FAULT 0 "FALSE" 1 "TRUE" ; -VAL_ 1312 EBS_FAULT 0 "FALSE" 1 "TRUE" ; -VAL_ 1312 OFFBOARD_CHARGER_FAULT 0 "FALSE" 1 "TRUE" ; -VAL_ 1312 AI_COMMS_LOST 0 "FALSE" 1 "TRUE" ; -VAL_ 1312 WARN_BATT_TEMP_HIGH 0 "FALSE" 1 "TRUE" ; -VAL_ 1312 WARN_BATT_SOC_LOW 0 "FALSE" 1 "TRUE" ; -VAL_ 1320 FAULT_CELL_OVER_TEMP 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_CELL_OVER_VOLT 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_CELL_UNDER_VOLT 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_CHG_AUX_OPEN 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_CHG_AUX_SHORT 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_FUSE_ACTIVATION 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_HVPOS1_OPEN 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_HVPOS2_OPEN 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_PRECHG_OPEN 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_VOLTAGE_DISAGREE 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_PACK_OVER_CURRENT 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_MEASUREMENT 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 FAULT_LOW_SOC 0 "NO FAULT" 1 "FAULT DETECTED" ; -VAL_ 1320 SYS_ACTION 0 "INITIALISE" 1 "CHARGE" 2 "DRIVE_AUTO" 3 "DRIVE_MAN" 4 "SHUTDOWN" ; -VAL_ 1320 SM_CONTACTOR 0 "SHUTDOWN" 1 "PRECHG_CHECK" 2 "CHG_AUX" 3 "DRIVE" 4 "FAULT" ; -VAL_ 1320 SM_MAIN 0 "SHUTDOWN_OFF" 1 "INITIAL_ACTIONS" 2 "POWER_ON_SELF_TEST" 3 "POWERTRAIN_ENABLE" 4 "DRIVE_AUTONOMOUS" 5 "DRIVE_MANUAL" 6 "SHUTDOWN_ACTIONS" 7 "CHARGE" 8 "AUX" ; -VAL_ 1320 SM_MC_DRV 1 "IDLE" 2 "DRIVE_STOP_SHUTDOWN" 3 "DRIVE_START_SHUTDOWN" 4 "DRIVE_START_SWITCH_ON" 5 "DRIVE_START_ENABLE_OP" 6 "RUNNING" 7 "END_START_SHUTDOWN" 8 "END_STOP_SHUTDOWN" 9 "ERROR" ; -VAL_ 1320 SM_DRV_AUTO 1 "AS_OFF" 2 "AS_READY" 3 "AS_DRIVING" 4 "EMERGENCY_BRAKE" 5 "AS_FINISHED" ; -VAL_ 1320 SM_EBS 0 "IDLE" 1 "CHARGE" 2 "HOLD" 3 "RECHARGE" 4 "FAULT" ; +VERSION "HIPBNYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY/4/%%%/4/'%**4YYY///" + + +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_ + +BS_: + +BU_: AI VCU + + +BO_ 1280 VCU2LOG_Dynamics1: 8 VCU + SG_ Speed_actual_kmh : 0|8@1+ (1,0) [0|255] "km/h" Vector__XXX + SG_ Speed_target_kmh : 8|8@1+ (1,0) [0|255] "km/h" Vector__XXX + SG_ Steer_actual_deg : 16|8@1- (0.5,0) [-64|63.5] "deg" Vector__XXX + SG_ Steer_target_deg : 24|8@1- (0.5,0) [-64|63.5] "deg" Vector__XXX + SG_ Brake_actual_pct : 32|8@1+ (1,0) [0|100] "%" Vector__XXX + SG_ Brake_target_pct : 40|8@1+ (1,0) [0|100] "%" Vector__XXX + SG_ Drive_trq_actual_pct : 48|8@1+ (1,0) [0|100] "%" Vector__XXX + SG_ Drive_trq_target_pct : 56|8@1+ (1,0) [0|100] "%" Vector__XXX + +BO_ 1281 AI2LOG_Dynamics2: 6 AI + SG_ Accel_longitudinal_mps2 : 0|16@1- (0.00195313,0) [-64|63.998] "m/s^2" Vector__XXX + SG_ Accel_lateral_mps2 : 16|16@1- (0.00195313,0) [-64|63.998] "m/s^2" Vector__XXX + SG_ Yaw_rate_degps : 32|16@1- (0.0078125,0) [-256|255.992] "deg/s" Vector__XXX + +BO_ 1282 VCU2LOG_Status: 5 VCU + SG_ State_ASSI : 0|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ State_EBS : 3|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ State_AMI : 5|3@1+ (1,0) [0|7] "" Vector__XXX + SG_ State_steering : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ State_service_brake : 9|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ Lap_counter : 11|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ Cones_count_actual : 15|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ Cones_count_all : 23|17@1+ (1,0) [0|131071] "" Vector__XXX + +BO_ 1296 AI2VCU_Status: 8 AI + SG_ DIRECTION_REQUEST : 14|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ ESTOP_REQUEST : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MISSION_STATUS : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ HANDSHAKE : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ LAP_COUNTER : 16|4@1+ (1,0) [0|15] "" Vector__XXX + SG_ CONES_COUNT_ACTUAL : 24|8@1+ (1,0) [0|255] "" Vector__XXX + SG_ CONES_COUNT_ALL : 32|16@1+ (1,0) [0|65535] "" Vector__XXX + SG_ VEH_SPEED_ACTUAL_kmh : 48|8@1+ (1,0) [0|255] "km/h" Vector__XXX + SG_ VEH_SPEED_DEMAND_kmh : 56|8@1+ (1,0) [0|255] "km/h" Vector__XXX + +BO_ 1297 AI2VCU_Drive_F: 8 AI + SG_ FRONT_AXLE_TRQ_REQUEST_Nm : 0|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX + SG_ FRONT_MOTOR_SPEED_MAX_rpm : 16|16@1+ (1,0) [0|4000] "rpm" Vector__XXX + +BO_ 1298 AI2VCU_Drive_R: 8 AI + SG_ REAR_AXLE_TRQ_REQUEST_Nm : 0|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX + SG_ REAR_MOTOR_SPEED_MAX_rpm : 16|16@1+ (1,0) [0|4000] "rpm" Vector__XXX + +BO_ 1299 AI2VCU_Steer: 8 AI + SG_ STEER_REQUEST_deg : 0|16@1- (0.1,0) [-24|24] "deg" Vector__XXX + +BO_ 1300 AI2VCU_Brake: 8 AI + SG_ HYD_PRESS_F_REQ_pct : 0|8@1+ (0.5,0) [0|100] "%" Vector__XXX + SG_ HYD_PRESS_R_REQ_pct : 8|8@1+ (0.5,0) [0|100] "%" Vector__XXX + +BO_ 1312 VCU2AI_Status: 8 VCU + SG_ AS_SWITCH_STATUS : 9|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ TS_SWITCH_STATUS : 10|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AS_STATE : 16|4@1+ (1,0) [0|7] "" Vector__XXX + SG_ STEERING_STATUS : 12|2@1+ (1,0) [0|3] "" Vector__XXX + SG_ SHUTDOWN_REQUEST : 8|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ FAULT_STATUS : 24|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WARNING_STATUS : 25|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HANDSHAKE : 0|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AMI_STATE : 20|4@1+ (1,0) [0|7] "" Vector__XXX + SG_ GO_SIGNAL : 11|1@1+ (1,0) [0|0] "" Vector__XXX + SG_ AI_ESTOP_REQUEST : 40|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HVIL_OPEN_FAULT : 41|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ HVIL_SHORT_FAULT : 42|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ EBS_FAULT : 43|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ OFFBOARD_CHARGER_FAULT : 44|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AI_COMMS_LOST : 45|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WARN_BATT_TEMP_HIGH : 32|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ WARN_BATT_SOC_LOW : 33|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ CHARGE_PROCEDURE_FAULT : 48|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ BMS_FAULT : 49|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ AUTONOMOUS_BRAKING_FAULT : 46|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ MISSION_STATUS_FAULT : 47|1@1+ (1,0) [0|1] "" Vector__XXX + SG_ SHUTDOWN_CAUSE : 56|8@1+ (1,0) [0|255] "" Vector__XXX + +BO_ 1313 VCU2AI_Drive_F: 8 VCU + SG_ FRONT_AXLE_TRQ_Nm : 0|16@1- (0.1,0) [-195|195] "Nm" Vector__XXX + SG_ FRONT_AXLE_TRQ_MAX_Nm : 32|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX + SG_ FRONT_AXLE_TRQ_REQUEST_Nm : 16|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX + +BO_ 1314 VCU2AI_Drive_R: 8 VCU + SG_ REAR_AXLE_TRQ_Nm : 0|16@1- (0.1,0) [-195|195] "Nm" Vector__XXX + SG_ REAR_AXLE_TRQ_REQUEST_Nm : 16|16@1- (0.1,0) [-195|195] "Nm" Vector__XXX + SG_ REAR_AXLE_TRQ_MAX_Nm : 32|16@1+ (0.1,0) [0|195] "Nm" Vector__XXX + +BO_ 1315 VCU2AI_Steer: 8 VCU + SG_ STEER_ANGLE_deg : 0|16@1- (0.1,0) [-24|24] "deg" Vector__XXX + SG_ STEER_ANGLE_MAX_deg : 16|16@1+ (0.1,0) [0|24] "deg" Vector__XXX + SG_ STEER_ANGLE_REQUEST_deg : 32|16@1- (0.1,0) [-24|24] "deg" Vector__XXX + +BO_ 1316 VCU2AI_Brake: 8 VCU + SG_ HYD_PRESS_F_pct : 0|8@1+ (0.5,0) [0|100] "%" Vector__XXX + SG_ HYD_PRESS_F_REQ_pct : 8|8@1+ (0.5,0) [0|100] "%" Vector__XXX + SG_ HYD_PRESS_R_pct : 16|8@1+ (0.5,0) [0|100] "%" Vector__XXX + SG_ HYD_PRESS_R_REQ_pct : 24|8@1+ (0.5,0) [0|100] "%" Vector__XXX + +BO_ 1317 VCU2AI_Wheel_speeds: 8 VCU + SG_ FL_WHEEL_SPEED_rpm : 0|16@1+ (1,0) [0|1250] "rpm" Vector__XXX + SG_ FR_WHEEL_SPEED_rpm : 16|16@1+ (1,0) [0|1250] "rpm" Vector__XXX + SG_ RL_WHEEL_SPEED_rpm : 32|16@1+ (1,0) [0|1250] "rpm" Vector__XXX + SG_ RR_WHEEL_SPEED_rpm : 48|16@1+ (1,0) [0|1250] "rpm" Vector__XXX + +BO_ 1318 VCU2AI_Wheel_counts: 8 VCU + SG_ FL_PULSE_COUNT : 0|16@1+ (1,0) [0|65535] "" Vector__XXX + SG_ FR_PULSE_COUNT : 16|16@1+ (1,0) [0|65535] "" Vector__XXX + SG_ RL_PULSE_COUNT : 32|16@1+ (1,0) [0|65535] "" Vector__XXX + SG_ RR_PULSE_COUNT : 48|16@1+ (1,0) [0|65535] "" Vector__XXX + + +CM_ BU_ AI "AI Computer"; +CM_ BU_ VCU "Vehicle Control Unit"; +CM_ BO_ 1280 "FSG data logging message"; +CM_ BO_ 1281 "FSG data logging message"; +CM_ BO_ 1282 "FSG data logging message"; +CM_ BO_ 1296 "AI Computer status"; +CM_ SG_ 1296 DIRECTION_REQUEST "Requested vehicle direction"; +CM_ SG_ 1296 ESTOP_REQUEST "Shutdown request to VCU"; +CM_ SG_ 1296 MISSION_STATUS "Autonomous mission status"; +CM_ SG_ 1296 HANDSHAKE "Handshake"; +CM_ SG_ 1296 LAP_COUNTER "Lap counter"; +CM_ SG_ 1296 CONES_COUNT_ACTUAL "Number of cones detected"; +CM_ SG_ 1296 CONES_COUNT_ALL "Total number of cones detected"; +CM_ SG_ 1296 VEH_SPEED_ACTUAL_kmh "Actual vehicle speed"; +CM_ SG_ 1296 VEH_SPEED_DEMAND_kmh "Demanded vehicle speed"; +CM_ BO_ 1297 "Front drive motor commands"; +CM_ SG_ 1297 FRONT_AXLE_TRQ_REQUEST_Nm "Requested front axle torque"; +CM_ SG_ 1297 FRONT_MOTOR_SPEED_MAX_rpm "Front motor speed limit"; +CM_ BO_ 1298 "Rear drive motor commands"; +CM_ SG_ 1298 REAR_AXLE_TRQ_REQUEST_Nm "Requested rear axle torque"; +CM_ SG_ 1298 REAR_MOTOR_SPEED_MAX_rpm "Rear motor speed limit"; +CM_ BO_ 1299 "Steering commands"; +CM_ SG_ 1299 STEER_REQUEST_deg "Requested steer angle"; +CM_ BO_ 1300 "Friction braking commands"; +CM_ SG_ 1300 HYD_PRESS_F_REQ_pct "Requested front axle hydraulic brake pressure"; +CM_ SG_ 1300 HYD_PRESS_R_REQ_pct "Requested rear axle hydraulic brake pressure"; +CM_ BO_ 1312 "VCU status"; +CM_ SG_ 1312 AS_SWITCH_STATUS "Autonomous System switch status"; +CM_ SG_ 1312 TS_SWITCH_STATUS "Tractive System switch status"; +CM_ SG_ 1312 AS_STATE "State of the Autonomous System"; +CM_ SG_ 1312 STEERING_STATUS "State of the steering system"; +CM_ SG_ 1312 SHUTDOWN_REQUEST "Shutdown request to AI"; +CM_ SG_ 1312 FAULT_STATUS "System fault status"; +CM_ SG_ 1312 WARNING_STATUS "System warning status"; +CM_ SG_ 1312 HANDSHAKE "Handshake"; +CM_ SG_ 1312 AMI_STATE "State of the Mission Indicator"; +CM_ SG_ 1312 GO_SIGNAL "Autonomous System \"Go\" signal"; +CM_ SG_ 1312 AI_ESTOP_REQUEST "AI system E-stop request"; +CM_ SG_ 1312 HVIL_OPEN_FAULT "HVIL open-circuit fault"; +CM_ SG_ 1312 HVIL_SHORT_FAULT "HVIL short-circuit fault"; +CM_ SG_ 1312 EBS_FAULT "EBS fault"; +CM_ SG_ 1312 OFFBOARD_CHARGER_FAULT "Offboard charger fault"; +CM_ SG_ 1312 AI_COMMS_LOST "AI CAN communications fault"; +CM_ SG_ 1312 WARN_BATT_TEMP_HIGH "High traction battery temperature warning"; +CM_ SG_ 1312 WARN_BATT_SOC_LOW "Low traction battery SOC warning"; +CM_ SG_ 1312 CHARGE_PROCEDURE_FAULT "Battery charging procedure fault"; +CM_ SG_ 1312 BMS_FAULT "BMS fault"; +CM_ SG_ 1312 AUTONOMOUS_BRAKING_FAULT "Braking in Autonomous Driving mode fault"; +CM_ SG_ 1312 MISSION_STATUS_FAULT "Autonomous mission status fault"; +CM_ SG_ 1312 SHUTDOWN_CAUSE "Fault causing a system shutdown"; +CM_ BO_ 1313 "Front drive motor feedback"; +CM_ SG_ 1313 FRONT_AXLE_TRQ_Nm "Current front axle torque"; +CM_ SG_ 1313 FRONT_AXLE_TRQ_MAX_Nm "Maximum front axle drive torque"; +CM_ SG_ 1313 FRONT_AXLE_TRQ_REQUEST_Nm "Requested front axle torque"; +CM_ BO_ 1314 "Rear drive motor feedback"; +CM_ SG_ 1314 REAR_AXLE_TRQ_Nm "Current rear axle torque"; +CM_ SG_ 1314 REAR_AXLE_TRQ_REQUEST_Nm "Requested rear axle torque"; +CM_ SG_ 1314 REAR_AXLE_TRQ_MAX_Nm "Maximum rear axle drive torque"; +CM_ BO_ 1315 "Feedback from steering system"; +CM_ SG_ 1315 STEER_ANGLE_deg "Current steering angle"; +CM_ SG_ 1315 STEER_ANGLE_MAX_deg "Maximum allowable steering angle"; +CM_ SG_ 1315 STEER_ANGLE_REQUEST_deg "Requested steering angle"; +CM_ BO_ 1316 "Braking system feedback"; +CM_ SG_ 1316 HYD_PRESS_F_pct "Front axle brake pressure"; +CM_ SG_ 1316 HYD_PRESS_F_REQ_pct "Requested front axle brake pressure"; +CM_ SG_ 1316 HYD_PRESS_R_pct "Rear axle brake pressure"; +CM_ SG_ 1316 HYD_PRESS_R_REQ_pct "Requested rear axle brake pressure"; +CM_ BO_ 1317 "Measured wheel speeds"; +CM_ SG_ 1317 FL_WHEEL_SPEED_rpm "Front left wheel speed"; +CM_ SG_ 1317 FR_WHEEL_SPEED_rpm "Front right wheel speed"; +CM_ SG_ 1317 RL_WHEEL_SPEED_rpm "Rear left wheel speed"; +CM_ SG_ 1317 RR_WHEEL_SPEED_rpm "Rear right wheel speed"; +CM_ BO_ 1318 "Measured wheel odometry counts"; +CM_ SG_ 1318 FL_PULSE_COUNT "Front left wheel speed pulse count"; +CM_ SG_ 1318 FR_PULSE_COUNT "Front right wheel speed pulse count"; +CM_ SG_ 1318 RL_PULSE_COUNT "Rear left wheel speed pulse count"; +CM_ SG_ 1318 RR_PULSE_COUNT "Rear right wheel speed pulse count"; +BA_DEF_ "BusType" STRING ; +BA_DEF_ SG_ "GenSigStartValue" FLOAT -3.4e+038 3.4e+038; +BA_DEF_ SG_ "GenSigAutoGenSnd" ENUM "No","Yes"; +BA_DEF_ SG_ "GenSigAutoGenDsp" ENUM "No","Yes"; +BA_DEF_ SG_ "GenSigEnvVarType" ENUM "int","float","undef"; +BA_DEF_ SG_ "GenSigEVName" STRING ; +BA_DEF_ BU_ "GenNodAutoGenSnd" ENUM "No","Yes"; +BA_DEF_ BU_ "GenNodAutoGenDsp" ENUM "No","Yes"; +BA_DEF_ "GenEnvVarEndingDsp" STRING ; +BA_DEF_ "GenEnvVarEndingSnd" STRING ; +BA_DEF_ "GenEnvVarPrefix" STRING ; +BA_DEF_ BO_ "GenMsgCycleTime" INT 0 5; +BA_DEF_DEF_ "BusType" "CAN"; +BA_DEF_DEF_ "GenSigStartValue" 0; +BA_DEF_DEF_ "GenSigAutoGenSnd" ""; +BA_DEF_DEF_ "GenSigAutoGenDsp" ""; +BA_DEF_DEF_ "GenSigEnvVarType" "undef"; +BA_DEF_DEF_ "GenSigEVName" ""; +BA_DEF_DEF_ "GenNodAutoGenSnd" "Yes"; +BA_DEF_DEF_ "GenNodAutoGenDsp" "Yes"; +BA_DEF_DEF_ "GenEnvVarEndingDsp" "Dsp"; +BA_DEF_DEF_ "GenEnvVarEndingSnd" "Snd"; +BA_DEF_DEF_ "GenEnvVarPrefix" "Env"; +BA_DEF_DEF_ "GenMsgCycleTime" 5; +BA_ "GenSigStartValue" SG_ 1280 Speed_actual_kmh 0; +BA_ "GenSigStartValue" SG_ 1280 Speed_target_kmh 0; +BA_ "GenSigStartValue" SG_ 1280 Steer_actual_deg 0; +BA_ "GenSigStartValue" SG_ 1280 Steer_target_deg 0; +BA_ "GenSigStartValue" SG_ 1280 Brake_actual_pct 0; +BA_ "GenSigStartValue" SG_ 1280 Brake_target_pct 0; +BA_ "GenSigStartValue" SG_ 1280 Drive_trq_actual_pct 0; +BA_ "GenSigStartValue" SG_ 1280 Drive_trq_target_pct 0; +BA_ "GenSigStartValue" SG_ 1281 Accel_longitudinal_mps2 0; +BA_ "GenSigStartValue" SG_ 1281 Accel_lateral_mps2 0; +BA_ "GenSigStartValue" SG_ 1281 Yaw_rate_degps 0; +BA_ "GenSigStartValue" SG_ 1282 State_ASSI 0; +BA_ "GenSigStartValue" SG_ 1282 State_EBS 0; +BA_ "GenSigStartValue" SG_ 1282 State_AMI 0; +BA_ "GenSigStartValue" SG_ 1282 State_steering 0; +BA_ "GenSigStartValue" SG_ 1282 State_service_brake 0; +BA_ "GenSigStartValue" SG_ 1282 Lap_counter 0; +BA_ "GenSigStartValue" SG_ 1282 Cones_count_actual 0; +BA_ "GenSigStartValue" SG_ 1282 Cones_count_all 0; +BA_ "GenSigStartValue" SG_ 1296 DIRECTION_REQUEST 0; +BA_ "GenSigStartValue" SG_ 1296 ESTOP_REQUEST 0; +BA_ "GenSigStartValue" SG_ 1296 MISSION_STATUS 0; +BA_ "GenSigStartValue" SG_ 1296 HANDSHAKE 0; +BA_ "GenSigStartValue" SG_ 1296 LAP_COUNTER 0; +BA_ "GenSigStartValue" SG_ 1296 CONES_COUNT_ACTUAL 0; +BA_ "GenSigStartValue" SG_ 1296 CONES_COUNT_ALL 0; +BA_ "GenSigStartValue" SG_ 1297 FRONT_AXLE_TRQ_REQUEST_Nm 0; +BA_ "GenSigStartValue" SG_ 1297 FRONT_MOTOR_SPEED_MAX_rpm 0; +BA_ "GenSigStartValue" SG_ 1298 REAR_AXLE_TRQ_REQUEST_Nm 0; +BA_ "GenSigStartValue" SG_ 1298 REAR_MOTOR_SPEED_MAX_rpm 0; +BA_ "GenSigStartValue" SG_ 1299 STEER_REQUEST_deg 0; +BA_ "GenSigStartValue" SG_ 1300 HYD_PRESS_F_REQ_pct 0; +BA_ "GenSigStartValue" SG_ 1312 AS_SWITCH_STATUS 0; +BA_ "GenSigStartValue" SG_ 1312 TS_SWITCH_STATUS 0; +BA_ "GenSigStartValue" SG_ 1312 AS_STATE 0; +BA_ "GenSigStartValue" SG_ 1312 STEERING_STATUS 0; +BA_ "GenSigStartValue" SG_ 1312 SHUTDOWN_REQUEST 0; +BA_ "GenSigStartValue" SG_ 1312 FAULT_STATUS 0; +BA_ "GenSigStartValue" SG_ 1312 WARNING_STATUS 0; +BA_ "GenSigStartValue" SG_ 1312 HANDSHAKE 0; +BA_ "GenSigStartValue" SG_ 1312 AMI_STATE 0; +BA_ "GenSigStartValue" SG_ 1313 FRONT_AXLE_TRQ_Nm 0; +BA_ "GenSigStartValue" SG_ 1313 FRONT_AXLE_TRQ_MAX_Nm 0; +BA_ "GenSigStartValue" SG_ 1313 FRONT_AXLE_TRQ_REQUEST_Nm 0; +BA_ "GenSigStartValue" SG_ 1314 REAR_AXLE_TRQ_Nm 0; +BA_ "GenSigStartValue" SG_ 1314 REAR_AXLE_TRQ_REQUEST_Nm 0; +BA_ "GenSigStartValue" SG_ 1314 REAR_AXLE_TRQ_MAX_Nm 0; +BA_ "GenSigStartValue" SG_ 1315 STEER_ANGLE_deg 0; +BA_ "GenSigStartValue" SG_ 1315 STEER_ANGLE_MAX_deg 0; +BA_ "GenSigStartValue" SG_ 1315 STEER_ANGLE_REQUEST_deg 0; +BA_ "GenSigStartValue" SG_ 1316 HYD_PRESS_F_pct 0; +BA_ "GenSigStartValue" SG_ 1316 HYD_PRESS_F_REQ_pct 0; +BA_ "GenSigStartValue" SG_ 1317 FL_WHEEL_SPEED_rpm 0; +BA_ "GenSigStartValue" SG_ 1317 FR_WHEEL_SPEED_rpm 0; +BA_ "GenSigStartValue" SG_ 1317 RL_WHEEL_SPEED_rpm 0; +BA_ "GenSigStartValue" SG_ 1317 RR_WHEEL_SPEED_rpm 0; +VAL_ 1282 State_ASSI 1 "OFF" 2 "READY" 3 "DRIVING" 4 "EMERGENCY_BRAKE" 5 "FINISH" ; +VAL_ 1282 State_EBS 1 "UNAVAILABLE" 2 "ARMED" 3 "TRIGGERED" ; +VAL_ 1282 State_AMI 1 "ACCELERATION" 2 "SKIDPAD" 3 "AUTOCROSS" 4 "TRACK_DRIVE" 5 "BRAKE_TEST" 6 "INSPECTION" ; +VAL_ 1282 State_steering 0 "OFF" 1 "ON" ; +VAL_ 1282 State_service_brake 1 "DISENGAGED" 2 "ENGAGED" 3 "AVAILABLE" ; +VAL_ 1296 DIRECTION_REQUEST 0 "NEUTRAL" 1 "FORWARD" 2 "REVERSE" ; +VAL_ 1296 ESTOP_REQUEST 0 "NO SHUTDOWN" 1 "SHUTDOWN REQUESTED" ; +VAL_ 1296 MISSION_STATUS 0 "NOT SELECTED" 1 "SELECTED" 2 "RUNNING" 3 "FINISHED" ; +VAL_ 1312 AS_SWITCH_STATUS 0 "OFF" 1 "ON" ; +VAL_ 1312 TS_SWITCH_STATUS 0 "OFF" 1 "ON" ; +VAL_ 1312 AS_STATE 1 "AS_OFF" 2 "AS_READY" 3 "AS_DRIVING" 4 "EMERGENCY_BRAKE" 5 "AS_FINISHED" ; +VAL_ 1312 STEERING_STATUS 0 "OFF" 1 "ACTIVE" ; +VAL_ 1312 SHUTDOWN_REQUEST 0 "NO SHUTDOWN" 1 "SHUTDOWN REQUESTED" ; +VAL_ 1312 FAULT_STATUS 0 "NO FAULT" 1 "FAULT DETECTED" ; +VAL_ 1312 WARNING_STATUS 0 "NO WARNING" 1 "WARNING ACTIVE" ; +VAL_ 1312 AMI_STATE 0 "NOT_SELECTED" 1 "ACCELERATION" 2 "SKIDPAD" 3 "AUTOCROSS" 4 "TRACK_DRIVE" 5 "STATIC_INSPECTION_A" 6 "STATIC_INSPECTION_B" 7 "AUTONOMOUS_DEMO" ; +VAL_ 1312 GO_SIGNAL 0 "NO GO" 1 "GO" ; +VAL_ 1312 AI_ESTOP_REQUEST 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 HVIL_OPEN_FAULT 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 HVIL_SHORT_FAULT 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 EBS_FAULT 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 OFFBOARD_CHARGER_FAULT 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 AI_COMMS_LOST 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 WARN_BATT_TEMP_HIGH 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 WARN_BATT_SOC_LOW 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 CHARGE_PROCEDURE_FAULT 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 BMS_FAULT 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 AUTONOMOUS_BRAKING_FAULT 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 MISSION_STATUS_FAULT 0 "FALSE" 1 "TRUE" ; +VAL_ 1312 SHUTDOWN_CAUSE 0 "NO SHUTDOWN" 1 "AI COMPUTER REQUEST" 2 "HVIL OPEN FAULT" 3 "HVIL SHORT FAULT" 4 "EBS FAULT" 5 "OFFBOARD CHARGER FAULT" 6 "AI COMMS FAULT" 7 "AUTONOMOUS BRAKING FAULT" 8 "MISSION STATUS FAULT" 9 "CHARGE PROCEDURE FAULT" 10 "BMS FAULT" ; diff --git a/FS-AI_API/fs-ai_api.c b/FS-AI_API/fs-ai_api.c index e1c72db..46735c3 100644 --- a/FS-AI_API/fs-ai_api.c +++ b/FS-AI_API/fs-ai_api.c @@ -1,11 +1,36 @@ -/********************************************************************* - * Copyright: Preston EV Limited 2018, Rockfort Engineering Ltd. 2019 +/************************************************************************** + * Copyright: Preston EV Limited 2018, Rockfort Engineering Ltd. 2019, 2021 * * File: fs-ai_api.c * Author: Ian Murphy - * Date: 2018-06-25, 2019-05-14 + * Date: 2018-06-25, 2019-05-14, 2021-05-22 * - ********************************************************************/ + *************************************************************************/ + + +/************************************************************************** +MIT License + +Copyright (c) 2021 IMechE Formula Student AI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*************************************************************************/ #include @@ -30,12 +55,23 @@ typedef enum boolean_e { TRUE = 1, } boolean_e; -typedef struct pack_int16_t { +typedef struct pack_16_t { union { - volatile int16_t word; + volatile uint16_t uword; + volatile int16_t sword; volatile uint8_t bytes[2]; }; -} pack_int16_t; +} pack_16_t; + +typedef union can_data_t { + volatile uint8_t ubytes[8]; + volatile int8_t sbytes[8]; + volatile uint16_t uwords[4]; + volatile int16_t swords[4]; + volatile uint32_t ulongs[2]; + volatile int32_t slongs[2]; + volatile float floats[2]; +} can_data_t; // statics @@ -47,19 +83,11 @@ static volatile uint32_t loop_count = 0; static const float MOTOR_RATIO = 3.5f; static const float MOTOR_MAX_RPM = 4000.0f; -static const float ACCEL_X_OFFSET = 0.0f; -static const float ACCEL_Y_OFFSET = -9.80665f; -static const float ACCEL_Z_OFFSET = 0.0f; -static const float GYRO_X_OFFSET = -1.63f; -static const float GYRO_Y_OFFSET = +0.38f; -static const float GYRO_Z_OFFSET = +0.43f; - static pthread_t can_read_tid; static pthread_mutex_t can_read_mutex = PTHREAD_MUTEX_INITIALIZER; static struct timespec last_set, this_set; - // tx frames static struct can_frame AI2LOG_Dynamics2 = {0x501,6}; static struct can_frame AI2VCU_Status = {0x510,8}; @@ -68,8 +96,15 @@ static struct can_frame AI2VCU_Drive_R = {0x512,8}; static struct can_frame AI2VCU_Steer = {0x513,8}; static struct can_frame AI2VCU_Brake = {0x514,8}; - // rx frames +#define VCU2AI_STATUS_ID 0x520 +#define VCU2AI_DRIVE_F_ID 0x521 +#define VCU2AI_DRIVE_R_ID 0x522 +#define VCU2AI_STEER_ID 0x523 +#define VCU2AI_BRAKE_ID 0x524 +#define VCU2AI_WHEEL_SPEEDS_ID 0x525 +#define VCU2AI_WHEEL_COUNTS_ID 0x526 + static struct can_frame VCU2AI_Status; static struct can_frame VCU2AI_Drive_F; static struct can_frame VCU2AI_Drive_R; @@ -77,10 +112,34 @@ static struct can_frame VCU2AI_Steer; static struct can_frame VCU2AI_Brake; static struct can_frame VCU2AI_Wheel_speeds; static struct can_frame VCU2AI_Wheel_counts; -static struct can_frame PCAN_GPS_Accels; -static struct can_frame PCAN_GPS_Gyro; -static struct can_frame DEBUG_1; +#define PCAN_GPS_BMC_ACCELERATION_ID 0X600 +#define PCAN_GPS_BMC_MAGNETICFIELD_ID 0X628 // requires changing in PCAN-GPS firmware to avoid RES ID clash +#define PCAN_GPS_L3GD20_ROTATION_A_ID 0X610 +#define PCAN_GPS_L3GD20_ROTATION_B_ID 0X611 +#define PCAN_GPS_GPS_STATUS_ID 0X620 +#define PCAN_GPS_GPS_COURSESPEED_ID 0X621 +#define PCAN_GPS_GPS_POSITIONLONGITUDE_ID 0X622 +#define PCAN_GPS_GPS_POSITIONLATITUDE_ID 0X623 +#define PCAN_GPS_GPS_POSITIONALTITUDE_ID 0X624 +#define PCAN_GPS_GPS_DELUSIONS_A_ID 0X625 +#define PCAN_GPS_GPS_DELUSIONS_B_ID 0X626 +#define PCAN_GPS_GPS_DATETIME_ID 0X627 + +static struct can_frame PCAN_GPS_BMC_Acceleration; +static struct can_frame PCAN_GPS_BMC_MagneticField; +static struct can_frame PCAN_GPS_L3GD20_Rotation_A; +static struct can_frame PCAN_GPS_L3GD20_Rotation_B; +static struct can_frame PCAN_GPS_GPS_Status; +static struct can_frame PCAN_GPS_GPS_CourseSpeed; +static struct can_frame PCAN_GPS_GPS_Longitude; +static struct can_frame PCAN_GPS_GPS_Latitude; +static struct can_frame PCAN_GPS_GPS_Altitude; +static struct can_frame PCAN_GPS_GPS_Delusions_A; +static struct can_frame PCAN_GPS_GPS_Delusions_B; +static struct can_frame PCAN_GPS_GPS_DateTime; + +// static local data static volatile uint16_t VCU2AI_Status_count = 0; static volatile uint16_t VCU2AI_Drive_F_count = 0; static volatile uint16_t VCU2AI_Drive_R_count = 0; @@ -88,9 +147,19 @@ static volatile uint16_t VCU2AI_Steer_count = 0; static volatile uint16_t VCU2AI_Brake_count = 0; static volatile uint16_t VCU2AI_Wheel_speeds_count = 0; static volatile uint16_t VCU2AI_Wheel_counts_count = 0; -static volatile uint16_t PCAN_GPS_Accels_count = 0; -static volatile uint16_t PCAN_GPS_Gyro_count = 0; -static volatile uint16_t DEBUG_1_count = 0; + +static volatile uint16_t PCAN_GPS_BMC_Acceleration_count = 0; +static volatile uint16_t PCAN_GPS_BMC_MagneticField_count = 0; +static volatile uint16_t PCAN_GPS_L3GD20_Rotation_A_count = 0; +static volatile uint16_t PCAN_GPS_L3GD20_Rotation_B_count = 0; +static volatile uint16_t PCAN_GPS_GPS_Status_count = 0; +static volatile uint16_t PCAN_GPS_GPS_CourseSpeed_count = 0; +static volatile uint16_t PCAN_GPS_GPS_Longitude_count = 0; +static volatile uint16_t PCAN_GPS_GPS_Latitude_count = 0; +static volatile uint16_t PCAN_GPS_GPS_Altitude_count = 0; +static volatile uint16_t PCAN_GPS_GPS_Delusions_A_count = 0; +static volatile uint16_t PCAN_GPS_GPS_Delusions_B_count = 0; +static volatile uint16_t PCAN_GPS_GPS_DateTime_count = 0; static volatile boolean_e VCU2AI_Status_fresh = FALSE; static volatile boolean_e VCU2AI_Drive_F_fresh = FALSE; @@ -99,10 +168,19 @@ static volatile boolean_e VCU2AI_Steer_fresh = FALSE; static volatile boolean_e VCU2AI_Brake_fresh = FALSE; static volatile boolean_e VCU2AI_Wheel_speeds_fresh = FALSE; static volatile boolean_e VCU2AI_Wheel_counts_fresh = FALSE; -static volatile boolean_e PCAN_GPS_Accels_fresh = FALSE; -static volatile boolean_e PCAN_GPS_Gyro_fresh = FALSE; -static volatile boolean_e DEBUG_1_fresh = FALSE; +static volatile boolean_e PCAN_GPS_BMC_Acceleration_fresh = FALSE; +static volatile boolean_e PCAN_GPS_BMC_MagneticField_fresh = FALSE; +static volatile boolean_e PCAN_GPS_L3GD20_Rotation_A_fresh = FALSE; +static volatile boolean_e PCAN_GPS_L3GD20_Rotation_B_fresh = FALSE; +static volatile boolean_e PCAN_GPS_GPS_Status_fresh = FALSE; +static volatile boolean_e PCAN_GPS_GPS_CourseSpeed_fresh = FALSE; +static volatile boolean_e PCAN_GPS_GPS_Longitude_fresh = FALSE; +static volatile boolean_e PCAN_GPS_GPS_Latitude_fresh = FALSE; +static volatile boolean_e PCAN_GPS_GPS_Altitude_fresh = FALSE; +static volatile boolean_e PCAN_GPS_GPS_Delusions_A_fresh = FALSE; +static volatile boolean_e PCAN_GPS_GPS_Delusions_B_fresh = FALSE; +static volatile boolean_e PCAN_GPS_GPS_DateTime_fresh = FALSE; // AI2VCU_Status; static volatile fs_ai_api_handshake_send_bit_e AI2VCU_HANDSHAKE_BIT = HANDSHAKE_SEND_BIT_OFF; @@ -116,76 +194,116 @@ static volatile uint8_t AI2VCU_VEH_SPEED_ACTUAL_kmh = 0; static volatile uint8_t AI2VCU_VEH_SPEED_DEMAND_kmh = 0; // AI2VCU_Drive_F -static volatile int16_t AI2VCU_FRONT_AXLE_TRQ_REQUEST_Nm = 0; +static volatile uint16_t AI2VCU_FRONT_AXLE_TRQ_REQUEST_raw = 0; static volatile uint16_t AI2VCU_FRONT_MOTOR_SPEED_MAX_rpm = 0; // AI2VCU_Drive_R -static volatile int16_t AI2VCU_REAR_AXLE_TRQ_REQUEST_Nm = 0; +static volatile uint16_t AI2VCU_REAR_AXLE_TRQ_REQUEST_raw = 0; static volatile uint16_t AI2VCU_REAR_MOTOR_SPEED_MAX_rpm = 0; // AI2VCU_Steer -static volatile int16_t AI2VCU_STEER_REQUEST_deg = 0; +static volatile int16_t AI2VCU_STEER_REQUEST_raw = 0; // AI2VCU_Brake -static volatile uint8_t AI2VCU_HYD_PRESSURE_REQUEST_pct = 0; - +static volatile uint8_t AI2VCU_HYD_PRESS_F_REQ_raw = 0; +static volatile uint8_t AI2VCU_HYD_PRESS_R_REQ_raw = 0; // VCU2AI_Status static volatile fs_ai_api_handshake_receive_bit_e VCU2AI_HANDSHAKE_RECEIVE_BIT = HANDSHAKE_RECEIVE_BIT_OFF; -static volatile boolean_e VCU2AI_SHUTDOWN_REQUEST = 0; // TODO: remove? -static volatile boolean_e VCU2AI_AS_SWITCH_STATUS = 0; -static volatile boolean_e VCU2AI_TS_SWITCH_STATUS = 0; -static volatile boolean_e VCU2AI_RES_GO_SIGNAL = 0; -static volatile uint8_t VCU2AI_STEERING_STATE = 0; // TODO: replace with STATUS +static volatile fs_ai_api_res_go_signal_bit_e VCU2AI_RES_GO_SIGNAL = RES_GO_SIGNAL_NO_GO; static volatile fs_ai_api_as_state_e VCU2AI_AS_STATE = AS_OFF; static volatile fs_ai_api_ami_state_e VCU2AI_AMI_STATE = AMI_NOT_SELECTED; -static volatile boolean_e VCU2AI_FAULT_STATUS = 0; -static volatile boolean_e VCU2AI_WARNING_STATUS = 0; -static volatile uint8_t VCU2AI_WARNING_CAUSE = 0; // TODO: replace with flags -static volatile uint8_t VCU2AI_SHUTDOWN_CAUSE = 0; // TODO: replace with flags +// remaining fields not relevant to API // VCU2AI_Drive_F -static volatile int16_t VCU2AI_FRONT_AXLE_TORQUE_Nm = 0; -static volatile int16_t VCU2AI_FRONT_AXLE_TRQ_REQUEST_Nm = 0; -static volatile uint16_t VCU2AI_FRONT_AXLE_TORQUE_MAX_Nm = 0; -static volatile int16_t VCU2AI_FRONT_AXLE_TORQUE_MIN_Nm = 0; +static volatile uint16_t VCU2AI_FRONT_AXLE_TORQUE_MAX_raw = 0; +// remaining fields not relevant to API // VCU2AI_Drive_R -static volatile int16_t VCU2AI_REAR_AXLE_TORQUE_Nm = 0; -static volatile int16_t VCU2AI_REAR_AXLE_TRQ_REQUEST_Nm = 0; -static volatile uint16_t VCU2AI_REAR_AXLE_TORQUE_MAX_Nm = 0; -static volatile int16_t VCU2AI_REAR_AXLE_TORQUE_MIN_Nm = 0; +static volatile uint16_t VCU2AI_REAR_AXLE_TORQUE_MAX_raw = 0; +// remaining fields not relevant to API // VCU2AI_Steer -static volatile int16_t VCU2AI_STEER_ANGLE_deg = 0; -static volatile uint16_t VCU2AI_STEER_ANGLE_MAX_deg = 0; -static volatile int16_t VCU2AI_STEER_ANGLE_REQUEST_deg = 0; +static volatile int16_t VCU2AI_STEER_ANGLE_raw = 0; +static volatile uint16_t VCU2AI_STEER_ANGLE_MAX_raw = 0; +// remaining fields not relevant to API // VCU2AI_Brake -static volatile uint8_t VCU2AI_HYD_PRESSURE_pct = 0; -static volatile uint8_t VCU2AI_HYD_PRESSURE_REQUEST_pct = 0; +static volatile uint8_t VCU2AI_BRAKE_PRESS_F_raw = 0; +static volatile uint8_t VCU2AI_BRAKE_PRESS_R_raw = 0; +// remaining fields not relevant to API // VCU2AI_Wheel_speeds -static volatile uint16_t VCU2AI_FL_WHEEL_SPEED_rpm = 0; -static volatile uint16_t VCU2AI_FR_WHEEL_SPEED_rpm = 0; -static volatile uint16_t VCU2AI_RL_WHEEL_SPEED_rpm = 0; -static volatile uint16_t VCU2AI_RR_WHEEL_SPEED_rpm = 0; +static volatile uint16_t VCU2AI_FL_WHEEL_SPEED_rpm = 0; +static volatile uint16_t VCU2AI_FR_WHEEL_SPEED_rpm = 0; +static volatile uint16_t VCU2AI_RL_WHEEL_SPEED_rpm = 0; +static volatile uint16_t VCU2AI_RR_WHEEL_SPEED_rpm = 0; // VCU2AI_Wheel_counts -static volatile uint16_t VCU2AI_FL_PULSE_COUNT = 0; -static volatile uint16_t VCU2AI_FR_PULSE_COUNT = 0; -static volatile uint16_t VCU2AI_RL_PULSE_COUNT = 0; -static volatile uint16_t VCU2AI_RR_PULSE_COUNT = 0; - -// PCAN-GPS -static volatile int16_t VCU2AI_Accel_X = 0.0; -static volatile int16_t VCU2AI_Accel_Y = 0.0; -static volatile int16_t VCU2AI_Accel_Z = 0.0; -static volatile float VCU2AI_Gyro_X = 0.0f; -static volatile float VCU2AI_Gyro_Y = 0.0f; -static volatile float VCU2AI_Gyro_Z = 0.0f; - - +static volatile uint16_t VCU2AI_FL_PULSE_COUNT = 0; +static volatile uint16_t VCU2AI_FR_PULSE_COUNT = 0; +static volatile uint16_t VCU2AI_RL_PULSE_COUNT = 0; +static volatile uint16_t VCU2AI_RR_PULSE_COUNT = 0; + +// PCAN_GPS_BMC_Acceleration +static volatile float IMU_Acceleration_X_mG = 0.0f; +static volatile float IMU_Acceleration_Y_mG = 0.0f; +static volatile float IMU_Acceleration_Z_mG = 0.0f; +static volatile float IMU_Temperature_degC = 0.0f; +static volatile uint8_t IMU_VerticalAxis = 0; +static volatile uint8_t IMU_Orientation = 0; + +// PCAN_GPS_BMC_MagneticField +static volatile float IMU_MagneticField_X_uT = 0.0f; +static volatile float IMU_MagneticField_Y_uT = 0.0f; +static volatile float IMU_MagneticField_Z_uT = 0.0f; + +// PCAN_GPS_L3GD20_Rotation_A +static volatile float IMU_Rotation_X_degps = 0.0f; +static volatile float IMU_Rotation_Y_degps = 0.0f; + +// PCAN_GPS_L3GD20_Rotation_B +static volatile float IMU_Rotation_Z_degps = 0.0f; + +// PCAN_GPS_GPS_Status +static volatile uint8_t GPS_AntennaStatus = 0; +static volatile uint8_t GPS_NumSatellites = 0; +static volatile uint8_t GPS_NavigationMethod = 0; + +// PCAN_GPS_GPS_CourseSpeed +static volatile float GPS_Course_deg = 0.0f; +static volatile float GPS_Speed_kmh = 0.0f; + +// PCAN_GPS_GPS_Longitude +static volatile float GPS_Longitude_Minutes = 0.0f; +static volatile uint16_t GPS_Longitude_Degree = 0; +static volatile uint8_t GPS_Longitude_IndicatorEW = 0; + +// PCAN_GPS_GPS_Latitude +static volatile float GPS_Latitude_Minutes = 0.0f; +static volatile uint16_t GPS_Latitude_Degree = 0; +static volatile uint8_t GPS_Latitude_IndicatorNS = 0; + +// PCAN_GPS_GPS_Altitude +static volatile float GPS_Altitude = 0.0f; + +// PCAN_GPS_GPS_Delusions_A +static volatile float GPS_PDOP = 0.0f; +static volatile float GPS_HDOP = 0.0f; + +// PCAN_GPS_GPS_Delusions_B +static volatile float GPS_VDOP = 0.0f; + +// PCAN_GPS_GPS_DateTime +static volatile uint8_t GPS_UTC_Year = 0; +static volatile uint8_t GPS_UTC_Month = 0; +static volatile uint8_t GPS_UTC_DayOfMonth = 0; +static volatile uint8_t GPS_UTC_Hour = 0; +static volatile uint8_t GPS_UTC_Minute = 0; +static volatile uint8_t GPS_UTC_Second = 0; + + +// functions static void *can_read_thread() { struct can_frame read_frame; @@ -198,7 +316,7 @@ static void *can_read_thread() { pthread_mutex_lock(&can_read_mutex); // protect the buffers from race conditions switch(read_frame.can_id) { - case 0x520 : { // VCU2AI_Status + case VCU2AI_STATUS_ID : { VCU2AI_Status.data[0] = read_frame.data[0]; VCU2AI_Status.data[1] = read_frame.data[1]; VCU2AI_Status.data[2] = read_frame.data[2]; @@ -211,7 +329,7 @@ static void *can_read_thread() { VCU2AI_Status_count++; break; } - case 0x521 : { // VCU2AI_Drive_F + case VCU2AI_DRIVE_F_ID : { VCU2AI_Drive_F.data[0] = read_frame.data[0]; VCU2AI_Drive_F.data[1] = read_frame.data[1]; VCU2AI_Drive_F.data[2] = read_frame.data[2]; @@ -224,7 +342,7 @@ static void *can_read_thread() { VCU2AI_Drive_F_count++; break; } - case 0x522 : { // VCU2AI_Drive_R + case VCU2AI_DRIVE_R_ID : { VCU2AI_Drive_R.data[0] = read_frame.data[0]; VCU2AI_Drive_R.data[1] = read_frame.data[1]; VCU2AI_Drive_R.data[2] = read_frame.data[2]; @@ -237,7 +355,7 @@ static void *can_read_thread() { VCU2AI_Drive_R_count++; break; } - case 0x523 : { // VCU2AI_Steer + case VCU2AI_STEER_ID : { VCU2AI_Steer.data[0] = read_frame.data[0]; VCU2AI_Steer.data[1] = read_frame.data[1]; VCU2AI_Steer.data[2] = read_frame.data[2]; @@ -250,7 +368,7 @@ static void *can_read_thread() { VCU2AI_Steer_count++; break; } - case 0x524 : { // VCU2AI_Brake + case VCU2AI_BRAKE_ID : { VCU2AI_Brake.data[0] = read_frame.data[0]; VCU2AI_Brake.data[1] = read_frame.data[1]; VCU2AI_Brake.data[2] = read_frame.data[2]; @@ -263,7 +381,7 @@ static void *can_read_thread() { VCU2AI_Brake_count++; break; } - case 0x525 : { // VCU2AI_Wheel_speeds + case VCU2AI_WHEEL_SPEEDS_ID : { VCU2AI_Wheel_speeds.data[0] = read_frame.data[0]; VCU2AI_Wheel_speeds.data[1] = read_frame.data[1]; VCU2AI_Wheel_speeds.data[2] = read_frame.data[2]; @@ -276,7 +394,7 @@ static void *can_read_thread() { VCU2AI_Wheel_speeds_count++; break; } - case 0x526 : { // VCU2AI_Wheel_counts + case VCU2AI_WHEEL_COUNTS_ID : { VCU2AI_Wheel_counts.data[0] = read_frame.data[0]; VCU2AI_Wheel_counts.data[1] = read_frame.data[1]; VCU2AI_Wheel_counts.data[2] = read_frame.data[2]; @@ -289,43 +407,160 @@ static void *can_read_thread() { VCU2AI_Wheel_counts_count++; break; } - case 0x620 : { // PCAN_GPS_Accels - PCAN_GPS_Accels.data[0] = read_frame.data[0]; - PCAN_GPS_Accels.data[1] = read_frame.data[1]; - PCAN_GPS_Accels.data[2] = read_frame.data[2]; - PCAN_GPS_Accels.data[3] = read_frame.data[3]; - PCAN_GPS_Accels.data[4] = read_frame.data[4]; - PCAN_GPS_Accels.data[5] = read_frame.data[5]; - PCAN_GPS_Accels.data[6] = read_frame.data[6]; - PCAN_GPS_Accels.data[7] = read_frame.data[7]; - PCAN_GPS_Accels_fresh = TRUE; - PCAN_GPS_Accels_count++; + case PCAN_GPS_BMC_ACCELERATION_ID : { + PCAN_GPS_BMC_Acceleration.data[0] = read_frame.data[0]; + PCAN_GPS_BMC_Acceleration.data[1] = read_frame.data[1]; + PCAN_GPS_BMC_Acceleration.data[2] = read_frame.data[2]; + PCAN_GPS_BMC_Acceleration.data[3] = read_frame.data[3]; + PCAN_GPS_BMC_Acceleration.data[4] = read_frame.data[4]; + PCAN_GPS_BMC_Acceleration.data[5] = read_frame.data[5]; + PCAN_GPS_BMC_Acceleration.data[6] = read_frame.data[6]; + PCAN_GPS_BMC_Acceleration.data[7] = read_frame.data[7]; + PCAN_GPS_BMC_Acceleration_fresh = TRUE; + PCAN_GPS_BMC_Acceleration_count++; + break; + } + case PCAN_GPS_BMC_MAGNETICFIELD_ID : { + PCAN_GPS_BMC_MagneticField.data[0] = read_frame.data[0]; + PCAN_GPS_BMC_MagneticField.data[1] = read_frame.data[1]; + PCAN_GPS_BMC_MagneticField.data[2] = read_frame.data[2]; + PCAN_GPS_BMC_MagneticField.data[3] = read_frame.data[3]; + PCAN_GPS_BMC_MagneticField.data[4] = read_frame.data[4]; + PCAN_GPS_BMC_MagneticField.data[5] = read_frame.data[5]; + PCAN_GPS_BMC_MagneticField.data[6] = read_frame.data[6]; + PCAN_GPS_BMC_MagneticField.data[7] = read_frame.data[7]; + PCAN_GPS_BMC_MagneticField_fresh = TRUE; + PCAN_GPS_BMC_MagneticField_count++; + break; + } + case PCAN_GPS_L3GD20_ROTATION_A_ID : { + PCAN_GPS_L3GD20_Rotation_A.data[0] = read_frame.data[0]; + PCAN_GPS_L3GD20_Rotation_A.data[1] = read_frame.data[1]; + PCAN_GPS_L3GD20_Rotation_A.data[2] = read_frame.data[2]; + PCAN_GPS_L3GD20_Rotation_A.data[3] = read_frame.data[3]; + PCAN_GPS_L3GD20_Rotation_A.data[4] = read_frame.data[4]; + PCAN_GPS_L3GD20_Rotation_A.data[5] = read_frame.data[5]; + PCAN_GPS_L3GD20_Rotation_A.data[6] = read_frame.data[6]; + PCAN_GPS_L3GD20_Rotation_A.data[7] = read_frame.data[7]; + PCAN_GPS_L3GD20_Rotation_A_fresh = TRUE; + PCAN_GPS_L3GD20_Rotation_A_count++; + break; + } + case PCAN_GPS_L3GD20_ROTATION_B_ID : { + PCAN_GPS_L3GD20_Rotation_B.data[0] = read_frame.data[0]; + PCAN_GPS_L3GD20_Rotation_B.data[1] = read_frame.data[1]; + PCAN_GPS_L3GD20_Rotation_B.data[2] = read_frame.data[2]; + PCAN_GPS_L3GD20_Rotation_B.data[3] = read_frame.data[3]; + PCAN_GPS_L3GD20_Rotation_B.data[4] = read_frame.data[4]; + PCAN_GPS_L3GD20_Rotation_B.data[5] = read_frame.data[5]; + PCAN_GPS_L3GD20_Rotation_B.data[6] = read_frame.data[6]; + PCAN_GPS_L3GD20_Rotation_B.data[7] = read_frame.data[7]; + PCAN_GPS_L3GD20_Rotation_B_fresh = TRUE; + PCAN_GPS_L3GD20_Rotation_B_count++; break; } - case 0x622 : { // PCAN_GPS_GyroXY - PCAN_GPS_Gyro.data[0] = read_frame.data[0]; - PCAN_GPS_Gyro.data[1] = read_frame.data[1]; - PCAN_GPS_Gyro.data[2] = read_frame.data[2]; - PCAN_GPS_Gyro.data[3] = read_frame.data[3]; - PCAN_GPS_Gyro.data[4] = read_frame.data[4]; - PCAN_GPS_Gyro.data[5] = read_frame.data[5]; - PCAN_GPS_Gyro.data[6] = read_frame.data[6]; - PCAN_GPS_Gyro.data[7] = read_frame.data[7]; - PCAN_GPS_Gyro_fresh = TRUE; - PCAN_GPS_Gyro_count++; + case PCAN_GPS_GPS_STATUS_ID : { + PCAN_GPS_GPS_Status.data[0] = read_frame.data[0]; + PCAN_GPS_GPS_Status.data[1] = read_frame.data[1]; + PCAN_GPS_GPS_Status.data[2] = read_frame.data[2]; + PCAN_GPS_GPS_Status.data[3] = read_frame.data[3]; + PCAN_GPS_GPS_Status.data[4] = read_frame.data[4]; + PCAN_GPS_GPS_Status.data[5] = read_frame.data[5]; + PCAN_GPS_GPS_Status.data[6] = read_frame.data[6]; + PCAN_GPS_GPS_Status.data[7] = read_frame.data[7]; + PCAN_GPS_GPS_Status_fresh = TRUE; + PCAN_GPS_GPS_Status_count++; break; } - case 0x150 : { // DEBUG_1 - DEBUG_1.data[0] = read_frame.data[0]; - DEBUG_1.data[1] = read_frame.data[1]; - DEBUG_1.data[2] = read_frame.data[2]; - DEBUG_1.data[3] = read_frame.data[3]; - DEBUG_1.data[4] = read_frame.data[4]; - DEBUG_1.data[5] = read_frame.data[5]; - DEBUG_1.data[6] = read_frame.data[6]; - DEBUG_1.data[7] = read_frame.data[7]; - DEBUG_1_fresh = TRUE; - DEBUG_1_count++; + case PCAN_GPS_GPS_COURSESPEED_ID : { + PCAN_GPS_GPS_CourseSpeed.data[0] = read_frame.data[0]; + PCAN_GPS_GPS_CourseSpeed.data[1] = read_frame.data[1]; + PCAN_GPS_GPS_CourseSpeed.data[2] = read_frame.data[2]; + PCAN_GPS_GPS_CourseSpeed.data[3] = read_frame.data[3]; + PCAN_GPS_GPS_CourseSpeed.data[4] = read_frame.data[4]; + PCAN_GPS_GPS_CourseSpeed.data[5] = read_frame.data[5]; + PCAN_GPS_GPS_CourseSpeed.data[6] = read_frame.data[6]; + PCAN_GPS_GPS_CourseSpeed.data[7] = read_frame.data[7]; + PCAN_GPS_GPS_CourseSpeed_fresh = TRUE; + PCAN_GPS_GPS_CourseSpeed_count++; + break; + } + case PCAN_GPS_GPS_POSITIONLONGITUDE_ID : { + PCAN_GPS_GPS_Longitude.data[0] = read_frame.data[0]; + PCAN_GPS_GPS_Longitude.data[1] = read_frame.data[1]; + PCAN_GPS_GPS_Longitude.data[2] = read_frame.data[2]; + PCAN_GPS_GPS_Longitude.data[3] = read_frame.data[3]; + PCAN_GPS_GPS_Longitude.data[4] = read_frame.data[4]; + PCAN_GPS_GPS_Longitude.data[5] = read_frame.data[5]; + PCAN_GPS_GPS_Longitude.data[6] = read_frame.data[6]; + PCAN_GPS_GPS_Longitude.data[7] = read_frame.data[7]; + PCAN_GPS_GPS_Longitude_fresh = TRUE; + PCAN_GPS_GPS_Longitude_count++; + break; + } + case PCAN_GPS_GPS_POSITIONLATITUDE_ID : { + PCAN_GPS_GPS_Latitude.data[0] = read_frame.data[0]; + PCAN_GPS_GPS_Latitude.data[1] = read_frame.data[1]; + PCAN_GPS_GPS_Latitude.data[2] = read_frame.data[2]; + PCAN_GPS_GPS_Latitude.data[3] = read_frame.data[3]; + PCAN_GPS_GPS_Latitude.data[4] = read_frame.data[4]; + PCAN_GPS_GPS_Latitude.data[5] = read_frame.data[5]; + PCAN_GPS_GPS_Latitude.data[6] = read_frame.data[6]; + PCAN_GPS_GPS_Latitude.data[7] = read_frame.data[7]; + PCAN_GPS_GPS_Latitude_fresh = TRUE; + PCAN_GPS_GPS_Latitude_count++; + break; + } + case PCAN_GPS_GPS_POSITIONALTITUDE_ID : { + PCAN_GPS_GPS_Altitude.data[0] = read_frame.data[0]; + PCAN_GPS_GPS_Altitude.data[1] = read_frame.data[1]; + PCAN_GPS_GPS_Altitude.data[2] = read_frame.data[2]; + PCAN_GPS_GPS_Altitude.data[3] = read_frame.data[3]; + PCAN_GPS_GPS_Altitude.data[4] = read_frame.data[4]; + PCAN_GPS_GPS_Altitude.data[5] = read_frame.data[5]; + PCAN_GPS_GPS_Altitude.data[6] = read_frame.data[6]; + PCAN_GPS_GPS_Altitude.data[7] = read_frame.data[7]; + PCAN_GPS_GPS_Altitude_fresh = TRUE; + PCAN_GPS_GPS_Altitude_count++; + break; + } + case PCAN_GPS_GPS_DELUSIONS_A_ID : { + PCAN_GPS_GPS_Delusions_A.data[0] = read_frame.data[0]; + PCAN_GPS_GPS_Delusions_A.data[1] = read_frame.data[1]; + PCAN_GPS_GPS_Delusions_A.data[2] = read_frame.data[2]; + PCAN_GPS_GPS_Delusions_A.data[3] = read_frame.data[3]; + PCAN_GPS_GPS_Delusions_A.data[4] = read_frame.data[4]; + PCAN_GPS_GPS_Delusions_A.data[5] = read_frame.data[5]; + PCAN_GPS_GPS_Delusions_A.data[6] = read_frame.data[6]; + PCAN_GPS_GPS_Delusions_A.data[7] = read_frame.data[7]; + PCAN_GPS_GPS_Delusions_A_fresh = TRUE; + PCAN_GPS_GPS_Delusions_A_count++; + break; + } + case PCAN_GPS_GPS_DELUSIONS_B_ID : { + PCAN_GPS_GPS_Delusions_B.data[0] = read_frame.data[0]; + PCAN_GPS_GPS_Delusions_B.data[1] = read_frame.data[1]; + PCAN_GPS_GPS_Delusions_B.data[2] = read_frame.data[2]; + PCAN_GPS_GPS_Delusions_B.data[3] = read_frame.data[3]; + PCAN_GPS_GPS_Delusions_B.data[4] = read_frame.data[4]; + PCAN_GPS_GPS_Delusions_B.data[5] = read_frame.data[5]; + PCAN_GPS_GPS_Delusions_B.data[6] = read_frame.data[6]; + PCAN_GPS_GPS_Delusions_B.data[7] = read_frame.data[7]; + PCAN_GPS_GPS_Delusions_B_fresh = TRUE; + PCAN_GPS_GPS_Delusions_B_count++; + break; + } + case PCAN_GPS_GPS_DATETIME_ID : { + PCAN_GPS_GPS_DateTime.data[0] = read_frame.data[0]; + PCAN_GPS_GPS_DateTime.data[1] = read_frame.data[1]; + PCAN_GPS_GPS_DateTime.data[2] = read_frame.data[2]; + PCAN_GPS_GPS_DateTime.data[3] = read_frame.data[3]; + PCAN_GPS_GPS_DateTime.data[4] = read_frame.data[4]; + PCAN_GPS_GPS_DateTime.data[5] = read_frame.data[5]; + PCAN_GPS_GPS_DateTime.data[6] = read_frame.data[6]; + PCAN_GPS_GPS_DateTime.data[7] = read_frame.data[7]; + PCAN_GPS_GPS_DateTime_fresh = TRUE; + PCAN_GPS_GPS_DateTime_count++; break; } default : @@ -361,7 +596,6 @@ int fs_ai_api_init(char* CAN_interface, int debug, int simulate) { if(debug_mode) { printf("Simulate Mode enabled...\r\n"); } } - if(can_init(CAN_interface) < 0) { if(debug_mode) { printf("Can't open [%s]", CAN_interface); } return(EXIT_FAILURE); @@ -387,46 +621,36 @@ void fs_ai_api_vcu2ai_get_data(fs_ai_api_vcu2ai *data) { if(VCU2AI_Status_fresh) { VCU2AI_Status_fresh = FALSE; VCU2AI_HANDSHAKE_RECEIVE_BIT = (VCU2AI_Status.data[0] & 0b00000001); - VCU2AI_SHUTDOWN_REQUEST = (VCU2AI_Status.data[1] & 0b00000001); - VCU2AI_AS_SWITCH_STATUS = (VCU2AI_Status.data[1] & 0b00000010) >> 1; - VCU2AI_TS_SWITCH_STATUS = (VCU2AI_Status.data[1] & 0b00000100) >> 2; VCU2AI_RES_GO_SIGNAL = (VCU2AI_Status.data[1] & 0b00001000) >> 3; - VCU2AI_STEERING_STATE = (VCU2AI_Status.data[1] & 0b00110000) >> 4; VCU2AI_AS_STATE = (VCU2AI_Status.data[2] & 0b00001111); VCU2AI_AMI_STATE = (VCU2AI_Status.data[2] & 0b11110000) >> 4; - VCU2AI_FAULT_STATUS = (VCU2AI_Status.data[3] & 0b00000001); - VCU2AI_WARNING_STATUS = (VCU2AI_Status.data[3] & 0b00000010) >> 1; - VCU2AI_WARNING_CAUSE = (VCU2AI_Status.data[4] & 0b00001111); - VCU2AI_SHUTDOWN_CAUSE = VCU2AI_Status.data[5]; + // remaining fields not relevant to API } if(VCU2AI_Drive_F_fresh) { VCU2AI_Drive_F_fresh = FALSE; - VCU2AI_FRONT_AXLE_TORQUE_Nm = ((int16_t)(VCU2AI_Drive_F.data[0] + (VCU2AI_Drive_F.data[1] << 8))); - VCU2AI_FRONT_AXLE_TRQ_REQUEST_Nm = ((int16_t)(VCU2AI_Drive_F.data[2] + (VCU2AI_Drive_F.data[3] << 8))); - VCU2AI_FRONT_AXLE_TORQUE_MAX_Nm = ((uint16_t)(VCU2AI_Drive_F.data[4] + (VCU2AI_Drive_F.data[5] << 8))); - VCU2AI_FRONT_AXLE_TORQUE_MIN_Nm = ((int16_t)(VCU2AI_Drive_F.data[6] + (VCU2AI_Drive_F.data[7] << 8))); + VCU2AI_FRONT_AXLE_TORQUE_MAX_raw = ((uint16_t)(VCU2AI_Drive_F.data[4] + (VCU2AI_Drive_F.data[5] << 8))); + // remaining fields not relevant to API } if(VCU2AI_Drive_R_fresh) { VCU2AI_Drive_R_fresh = FALSE; - VCU2AI_REAR_AXLE_TORQUE_Nm = ((int16_t)(VCU2AI_Drive_R.data[0] + (VCU2AI_Drive_R.data[1] << 8))); - VCU2AI_REAR_AXLE_TRQ_REQUEST_Nm = ((int16_t)(VCU2AI_Drive_R.data[2] + (VCU2AI_Drive_R.data[3] << 8))); - VCU2AI_REAR_AXLE_TORQUE_MAX_Nm = ((uint16_t)(VCU2AI_Drive_R.data[4] + (VCU2AI_Drive_R.data[5] << 8))); - VCU2AI_REAR_AXLE_TORQUE_MIN_Nm = ((int16_t)(VCU2AI_Drive_R.data[6] + (VCU2AI_Drive_R.data[7] << 8))); + VCU2AI_REAR_AXLE_TORQUE_MAX_raw = ((uint16_t)(VCU2AI_Drive_R.data[4] + (VCU2AI_Drive_R.data[5] << 8))); + // remaining fields not relevant to API } if(VCU2AI_Steer_fresh) { VCU2AI_Steer_fresh = FALSE; - VCU2AI_STEER_ANGLE_deg = ((int16_t)(VCU2AI_Steer.data[0] + (VCU2AI_Steer.data[1] << 8))); - VCU2AI_STEER_ANGLE_MAX_deg = ((uint16_t)(VCU2AI_Steer.data[2] + (VCU2AI_Steer.data[3] << 8))); - VCU2AI_STEER_ANGLE_REQUEST_deg = ((int16_t)(VCU2AI_Steer.data[4] + (VCU2AI_Steer.data[5] << 8))); + VCU2AI_STEER_ANGLE_raw = ((int16_t)(VCU2AI_Steer.data[0] + (VCU2AI_Steer.data[1] << 8))); + VCU2AI_STEER_ANGLE_MAX_raw = ((uint16_t)(VCU2AI_Steer.data[2] + (VCU2AI_Steer.data[3] << 8))); + // remaining fields not relevant to API } if(VCU2AI_Brake_fresh) { VCU2AI_Brake_fresh = FALSE; - VCU2AI_HYD_PRESSURE_pct = (VCU2AI_Brake.data[0]); - VCU2AI_HYD_PRESSURE_REQUEST_pct = (VCU2AI_Brake.data[1]); + VCU2AI_BRAKE_PRESS_F_raw = (VCU2AI_Brake.data[0]); + VCU2AI_BRAKE_PRESS_R_raw = (VCU2AI_Brake.data[2]); + // remaining fields not relevant to API } if(VCU2AI_Wheel_speeds_fresh) { @@ -445,36 +669,26 @@ void fs_ai_api_vcu2ai_get_data(fs_ai_api_vcu2ai *data) { VCU2AI_RR_PULSE_COUNT = VCU2AI_Wheel_counts.data[6] + (VCU2AI_Wheel_counts.data[7] << 8); } - if(PCAN_GPS_Accels_fresh) { - PCAN_GPS_Accels_fresh = FALSE; - VCU2AI_Accel_X = ((int16_t)(PCAN_GPS_Accels.data[0] + (PCAN_GPS_Accels.data[1] << 8))); - VCU2AI_Accel_Y = ((int16_t)(PCAN_GPS_Accels.data[2] + (PCAN_GPS_Accels.data[3] << 8))); - VCU2AI_Accel_Z = ((int16_t)(PCAN_GPS_Accels.data[4] + (PCAN_GPS_Accels.data[5] << 8))); - } - - if(PCAN_GPS_Gyro_fresh) { - PCAN_GPS_Gyro_fresh = FALSE; - VCU2AI_Gyro_X = ((int16_t)(PCAN_GPS_Gyro.data[0] + (PCAN_GPS_Gyro.data[1] << 8))); - VCU2AI_Gyro_Y = ((int16_t)(PCAN_GPS_Gyro.data[2] + (PCAN_GPS_Gyro.data[3] << 8))); - VCU2AI_Gyro_Z = ((int16_t)(PCAN_GPS_Gyro.data[4] + (PCAN_GPS_Gyro.data[5] << 8))); - } - pthread_mutex_unlock(&can_read_mutex); // don't forget! - if(simulate_mode) { static unsigned int counter = 0; if(0 == (counter % 1000)) { if(++VCU2AI_AS_STATE > AS_FINISHED) { VCU2AI_AS_STATE = AS_OFF; } - if(++VCU2AI_AMI_STATE > AMI_MANUAL) { VCU2AI_AMI_STATE = AMI_NOT_SELECTED; } + if(++VCU2AI_AMI_STATE > AMI_AUTONOMOUS_DEMO) { VCU2AI_AMI_STATE = AMI_NOT_SELECTED; } } - VCU2AI_STEER_ANGLE_MAX_deg = 272; - if(++VCU2AI_STEER_ANGLE_deg > VCU2AI_STEER_ANGLE_MAX_deg) { - VCU2AI_STEER_ANGLE_deg = -1*VCU2AI_STEER_ANGLE_MAX_deg; + VCU2AI_STEER_ANGLE_MAX_raw = 272; + if(++VCU2AI_STEER_ANGLE_raw > VCU2AI_STEER_ANGLE_MAX_raw) { + VCU2AI_STEER_ANGLE_raw = -1*VCU2AI_STEER_ANGLE_MAX_raw; } - + + VCU2AI_FL_WHEEL_SPEED_rpm = 999; + VCU2AI_FR_WHEEL_SPEED_rpm = 999; + VCU2AI_RL_WHEEL_SPEED_rpm = 999; + VCU2AI_RR_WHEEL_SPEED_rpm = 999; + VCU2AI_FL_PULSE_COUNT++; VCU2AI_FR_PULSE_COUNT++; VCU2AI_RL_PULSE_COUNT++; @@ -485,14 +699,14 @@ void fs_ai_api_vcu2ai_get_data(fs_ai_api_vcu2ai *data) { counter++; } - // output the data, converting where needed + data->VCU2AI_HANDSHAKE_RECEIVE_BIT = VCU2AI_HANDSHAKE_RECEIVE_BIT; + data->VCU2AI_RES_GO_SIGNAL = VCU2AI_RES_GO_SIGNAL; data->VCU2AI_AS_STATE = VCU2AI_AS_STATE; data->VCU2AI_AMI_STATE = VCU2AI_AMI_STATE; - data->VCU2AI_HANDSHAKE_RECEIVE_BIT = VCU2AI_HANDSHAKE_RECEIVE_BIT; - data->VCU2AI_STEER_ANGLE_MAX_deg = 0.1f*VCU2AI_STEER_ANGLE_MAX_deg; - data->VCU2AI_STEER_ANGLE_deg = 0.1f*VCU2AI_STEER_ANGLE_deg; - data->VCU2AI_WHEEL_SPEED_MAX_rpm = MOTOR_MAX_RPM / MOTOR_RATIO; + data->VCU2AI_STEER_ANGLE_deg = 0.1f*VCU2AI_STEER_ANGLE_raw; + data->VCU2AI_BRAKE_PRESS_F_pct = 0.5f*VCU2AI_BRAKE_PRESS_F_raw; + data->VCU2AI_BRAKE_PRESS_R_pct = 0.5f*VCU2AI_BRAKE_PRESS_R_raw; data->VCU2AI_FL_WHEEL_SPEED_rpm = (float)VCU2AI_FL_WHEEL_SPEED_rpm; data->VCU2AI_FR_WHEEL_SPEED_rpm = (float)VCU2AI_FR_WHEEL_SPEED_rpm; data->VCU2AI_RL_WHEEL_SPEED_rpm = (float)VCU2AI_RL_WHEEL_SPEED_rpm; @@ -501,118 +715,101 @@ void fs_ai_api_vcu2ai_get_data(fs_ai_api_vcu2ai *data) { data->VCU2AI_FR_PULSE_COUNT = VCU2AI_FR_PULSE_COUNT; data->VCU2AI_RL_PULSE_COUNT = VCU2AI_RL_PULSE_COUNT; data->VCU2AI_RR_PULSE_COUNT = VCU2AI_RR_PULSE_COUNT; - data->VCU2AI_Accel_longitudinal_ms2 = -1.0f*((9.80665f*0.001f*3.91f*(float)VCU2AI_Accel_Z)+ACCEL_Z_OFFSET); - data->VCU2AI_Accel_lateral_ms2 = -1.0f*((9.80665f*0.001f*3.91f*(float)VCU2AI_Accel_X)+ACCEL_X_OFFSET); - data->VCU2AI_Accel_vertical_ms2 = (9.80665f*0.001f*3.91f*(float)VCU2AI_Accel_Y)+ACCEL_Y_OFFSET; - data->VCU2AI_Yaw_rate_degps = -1.0f*((0.00875f*(float)VCU2AI_Gyro_Y)+GYRO_Y_OFFSET); - data->VCU2AI_Pitch_rate_degps = (0.00875f*(float)VCU2AI_Gyro_X)+GYRO_X_OFFSET; - data->VCU2AI_Roll_rate_degps = -1.0f*((0.00875f*(float)VCU2AI_Gyro_Z)+GYRO_Z_OFFSET); } void fs_ai_api_ai2vcu_set_data(fs_ai_api_ai2vcu *data) { - // temporary input data buffers - float AI_FRONT_MOTOR_SPEED_REQUEST_rpm = 0; - float AI_REAR_MOTOR_SPEED_REQUEST_rpm = 0; - float AI_STEER_REQUEST_deg = 0; - fs_ai_api_mission_status_e AI_MISSION_STATUS = 0; - fs_ai_api_direction_request_e AI_DIRECTION_REQUEST = 0; - fs_ai_api_estop_request_e AI_ESTOP_REQUEST = 0; - fs_ai_api_handshake_send_bit_e AI_HANDSHAKE_SEND_BIT = 0; - - AI_FRONT_MOTOR_SPEED_REQUEST_rpm = data->AI2VCU_WHEEL_SPEED_REQUEST_rpm * MOTOR_RATIO; - AI_REAR_MOTOR_SPEED_REQUEST_rpm = data->AI2VCU_WHEEL_SPEED_REQUEST_rpm * MOTOR_RATIO; - AI_STEER_REQUEST_deg = data->AI2VCU_STEER_ANGLE_REQUEST_deg; - AI_MISSION_STATUS = data->AI2VCU_MISSION_STATUS; - AI_DIRECTION_REQUEST = data->AI2VCU_DIRECTION_REQUEST; - AI_ESTOP_REQUEST = data->AI2VCU_ESTOP_REQUEST; - AI_HANDSHAKE_SEND_BIT = data->AI2VCU_HANDSHAKE_SEND_BIT; + // local input data buffers + fs_ai_api_mission_status_e t_AI2VCU_MISSION_STATUS = 0; + fs_ai_api_direction_request_e t_AI2VCU_DIRECTION_REQUEST = 0; + fs_ai_api_estop_request_e t_AI2VCU_ESTOP_REQUEST = 0; + fs_ai_api_handshake_send_bit_e t_AI2VCU_HANDSHAKE_SEND_BIT = 0; + float t_AI2VCU_STEER_ANGLE_REQUEST_deg = 0; + float t_AI2VCU_FRONT_MOTOR_SPEED_REQUEST_rpm = 0; + float t_AI2VCU_REAR_MOTOR_SPEED_REQUEST_rpm = 0; + float t_AI2VCU_FRONT_AXLE_TORQUE_REQUEST_Nm = 0; + float t_AI2VCU_REAR_AXLE_TORQUE_REQUEST_Nm = 0; + float t_AI2VCU_FRONT_BRAKE_PRESS_REQUEST_pct = 0; + float t_AI2VCU_REAR_BRAKE_PRESS_REQUEST_pct = 0; + + float t_FRONT_AXLE_TORQUE_MAX = (0.1f*VCU2AI_FRONT_AXLE_TORQUE_MAX_raw); + float t_REAR_AXLE_TORQUE_MAX = (0.1f*VCU2AI_REAR_AXLE_TORQUE_MAX_raw); + float t_STEER_ANGLE_MAX = (0.1f*VCU2AI_STEER_ANGLE_MAX_raw); + + t_AI2VCU_MISSION_STATUS = data->AI2VCU_MISSION_STATUS; + t_AI2VCU_DIRECTION_REQUEST = data->AI2VCU_DIRECTION_REQUEST; + t_AI2VCU_ESTOP_REQUEST = data->AI2VCU_ESTOP_REQUEST; + t_AI2VCU_HANDSHAKE_SEND_BIT = data->AI2VCU_HANDSHAKE_SEND_BIT; + t_AI2VCU_STEER_ANGLE_REQUEST_deg = data->AI2VCU_STEER_ANGLE_REQUEST_deg; + t_AI2VCU_FRONT_MOTOR_SPEED_REQUEST_rpm = data->AI2VCU_AXLE_SPEED_REQUEST_rpm * MOTOR_RATIO; + t_AI2VCU_REAR_MOTOR_SPEED_REQUEST_rpm = data->AI2VCU_AXLE_SPEED_REQUEST_rpm * MOTOR_RATIO; + t_AI2VCU_FRONT_AXLE_TORQUE_REQUEST_Nm = data->AI2VCU_AXLE_TORQUE_REQUEST_Nm; + t_AI2VCU_REAR_AXLE_TORQUE_REQUEST_Nm = data->AI2VCU_AXLE_TORQUE_REQUEST_Nm; + t_AI2VCU_FRONT_BRAKE_PRESS_REQUEST_pct = data->AI2VCU_BRAKE_PRESS_REQUEST_pct; + t_AI2VCU_REAR_BRAKE_PRESS_REQUEST_pct = data->AI2VCU_BRAKE_PRESS_REQUEST_pct; // validate the 'float' requests - if(AI_FRONT_MOTOR_SPEED_REQUEST_rpm > MOTOR_MAX_RPM) { AI_FRONT_MOTOR_SPEED_REQUEST_rpm = MOTOR_MAX_RPM; } - if(AI_FRONT_MOTOR_SPEED_REQUEST_rpm < 0.0f) { AI_FRONT_MOTOR_SPEED_REQUEST_rpm = 0.0f; } + if(t_AI2VCU_STEER_ANGLE_REQUEST_deg > t_STEER_ANGLE_MAX) { t_AI2VCU_STEER_ANGLE_REQUEST_deg = t_STEER_ANGLE_MAX; } + if(t_AI2VCU_STEER_ANGLE_REQUEST_deg < (-1.0f*t_STEER_ANGLE_MAX)) { t_AI2VCU_STEER_ANGLE_REQUEST_deg = (-1.0f*t_STEER_ANGLE_MAX); } - if(AI_REAR_MOTOR_SPEED_REQUEST_rpm > MOTOR_MAX_RPM) { AI_REAR_MOTOR_SPEED_REQUEST_rpm = MOTOR_MAX_RPM; } - if(AI_REAR_MOTOR_SPEED_REQUEST_rpm < 0.0f) { AI_REAR_MOTOR_SPEED_REQUEST_rpm = 0.0f; } + if(t_AI2VCU_FRONT_MOTOR_SPEED_REQUEST_rpm > MOTOR_MAX_RPM) { t_AI2VCU_FRONT_MOTOR_SPEED_REQUEST_rpm = MOTOR_MAX_RPM; } + if(t_AI2VCU_FRONT_MOTOR_SPEED_REQUEST_rpm < 0.0f) { t_AI2VCU_FRONT_MOTOR_SPEED_REQUEST_rpm = 0.0f; } - if(AI_STEER_REQUEST_deg > (0.1f*(float)VCU2AI_STEER_ANGLE_MAX_deg)) { AI_STEER_REQUEST_deg = (0.1f*(float)VCU2AI_STEER_ANGLE_MAX_deg); } - if(AI_STEER_REQUEST_deg < (-0.1f*(float)VCU2AI_STEER_ANGLE_MAX_deg)) { AI_STEER_REQUEST_deg = (-0.1f*(float)VCU2AI_STEER_ANGLE_MAX_deg); } + if(t_AI2VCU_REAR_MOTOR_SPEED_REQUEST_rpm > MOTOR_MAX_RPM) { t_AI2VCU_REAR_MOTOR_SPEED_REQUEST_rpm = MOTOR_MAX_RPM; } + if(t_AI2VCU_REAR_MOTOR_SPEED_REQUEST_rpm < 0.0f) { t_AI2VCU_REAR_MOTOR_SPEED_REQUEST_rpm = 0.0f; } - // validate the 'enum' requests - if(AI_MISSION_STATUS < MISSION_NOT_SELECTED) { AI_MISSION_STATUS = MISSION_NOT_SELECTED; } - if(AI_MISSION_STATUS > MISSION_FINISHED) { AI_MISSION_STATUS = MISSION_FINISHED; } + if(t_AI2VCU_FRONT_AXLE_TORQUE_REQUEST_Nm > t_FRONT_AXLE_TORQUE_MAX) { t_AI2VCU_FRONT_AXLE_TORQUE_REQUEST_Nm = t_FRONT_AXLE_TORQUE_MAX; } + if(t_AI2VCU_FRONT_AXLE_TORQUE_REQUEST_Nm < 0.0f) { t_AI2VCU_FRONT_AXLE_TORQUE_REQUEST_Nm = 0.0f; } - if(AI_DIRECTION_REQUEST < DIRECTION_NEUTRAL) { AI_DIRECTION_REQUEST = DIRECTION_NEUTRAL; } - if(AI_DIRECTION_REQUEST > DIRECTION_FORWARD) { AI_DIRECTION_REQUEST = DIRECTION_FORWARD; } + if(t_AI2VCU_REAR_AXLE_TORQUE_REQUEST_Nm > t_REAR_AXLE_TORQUE_MAX) { t_AI2VCU_REAR_AXLE_TORQUE_REQUEST_Nm = t_REAR_AXLE_TORQUE_MAX; } + if(t_AI2VCU_REAR_AXLE_TORQUE_REQUEST_Nm < 0.0f) { t_AI2VCU_REAR_AXLE_TORQUE_REQUEST_Nm = 0.0f; } - if(AI_ESTOP_REQUEST < ESTOP_NO) { AI_ESTOP_REQUEST = ESTOP_NO; } - if(AI_ESTOP_REQUEST > ESTOP_YES) { AI_ESTOP_REQUEST = ESTOP_YES; } + if(t_AI2VCU_FRONT_BRAKE_PRESS_REQUEST_pct > 100.0f) { t_AI2VCU_FRONT_BRAKE_PRESS_REQUEST_pct = 100.0f; } + if(t_AI2VCU_FRONT_BRAKE_PRESS_REQUEST_pct < 0.0f) { t_AI2VCU_FRONT_BRAKE_PRESS_REQUEST_pct = 0.0f; } - if(AI_HANDSHAKE_SEND_BIT < HANDSHAKE_SEND_BIT_OFF) { AI_HANDSHAKE_SEND_BIT = HANDSHAKE_SEND_BIT_OFF; } - if(AI_HANDSHAKE_SEND_BIT > HANDSHAKE_SEND_BIT_ON) { AI_HANDSHAKE_SEND_BIT = HANDSHAKE_SEND_BIT_ON; } + if(t_AI2VCU_REAR_BRAKE_PRESS_REQUEST_pct > 100.0f) { t_AI2VCU_REAR_BRAKE_PRESS_REQUEST_pct = 100.0f; } + if(t_AI2VCU_REAR_BRAKE_PRESS_REQUEST_pct < 0.0f) { t_AI2VCU_REAR_BRAKE_PRESS_REQUEST_pct = 0.0f; } + // validate the 'enum' requests + if(t_AI2VCU_MISSION_STATUS < MISSION_NOT_SELECTED) { t_AI2VCU_MISSION_STATUS = MISSION_NOT_SELECTED; } + if(t_AI2VCU_MISSION_STATUS > MISSION_FINISHED) { t_AI2VCU_MISSION_STATUS = MISSION_FINISHED; } - // set the torque values appropriate to the AS_STATE - switch(VCU2AI_AS_STATE) { - case 1: // AS_OFF - case 2: // AS_READY - case 4: // EMERGENCY_BRAKE - case 5: // AS_FINISHED - default: { // UNDEFINED - AI2VCU_FRONT_AXLE_TRQ_REQUEST_Nm = 0; - AI2VCU_REAR_AXLE_TRQ_REQUEST_Nm = 0; - break; - } - case 3: { // AS_DRIVING - // TODO: establish if decel requires this to be set -ve - if(VCU2AI_FL_WHEEL_SPEED_rpm > 700) { - AI2VCU_FRONT_AXLE_TRQ_REQUEST_Nm = 500; - AI2VCU_REAR_AXLE_TRQ_REQUEST_Nm = 500; - } else if(VCU2AI_FL_WHEEL_SPEED_rpm > 600) { - AI2VCU_FRONT_AXLE_TRQ_REQUEST_Nm = 850; - AI2VCU_REAR_AXLE_TRQ_REQUEST_Nm = 850; - } else if(VCU2AI_FL_WHEEL_SPEED_rpm > 500) { - AI2VCU_FRONT_AXLE_TRQ_REQUEST_Nm = 1000; - AI2VCU_REAR_AXLE_TRQ_REQUEST_Nm = 1000; - } else if(VCU2AI_FL_WHEEL_SPEED_rpm > 400) { - AI2VCU_FRONT_AXLE_TRQ_REQUEST_Nm = 1200; - AI2VCU_REAR_AXLE_TRQ_REQUEST_Nm = 1200; - } else if(VCU2AI_FL_WHEEL_SPEED_rpm > 300) { - AI2VCU_FRONT_AXLE_TRQ_REQUEST_Nm = 1500; - AI2VCU_REAR_AXLE_TRQ_REQUEST_Nm = 1500; - } else { - AI2VCU_FRONT_AXLE_TRQ_REQUEST_Nm = VCU2AI_FRONT_AXLE_TORQUE_MAX_Nm; - AI2VCU_REAR_AXLE_TRQ_REQUEST_Nm = VCU2AI_REAR_AXLE_TORQUE_MAX_Nm; - } - break; - } - } + if(t_AI2VCU_DIRECTION_REQUEST < DIRECTION_NEUTRAL) { t_AI2VCU_DIRECTION_REQUEST = DIRECTION_NEUTRAL; } + if(t_AI2VCU_DIRECTION_REQUEST > DIRECTION_FORWARD) { t_AI2VCU_DIRECTION_REQUEST = DIRECTION_FORWARD; } + + if(t_AI2VCU_ESTOP_REQUEST < ESTOP_NO) { t_AI2VCU_ESTOP_REQUEST = ESTOP_NO; } + if(t_AI2VCU_ESTOP_REQUEST > ESTOP_YES) { t_AI2VCU_ESTOP_REQUEST = ESTOP_YES; } + + if(t_AI2VCU_HANDSHAKE_SEND_BIT < HANDSHAKE_SEND_BIT_OFF) { t_AI2VCU_HANDSHAKE_SEND_BIT = HANDSHAKE_SEND_BIT_OFF; } + if(t_AI2VCU_HANDSHAKE_SEND_BIT > HANDSHAKE_SEND_BIT_ON) { t_AI2VCU_HANDSHAKE_SEND_BIT = HANDSHAKE_SEND_BIT_ON; } // set requests, converting where needed - AI2VCU_HANDSHAKE_BIT = AI_HANDSHAKE_SEND_BIT; - AI2VCU_ESTOP_REQUEST = AI_ESTOP_REQUEST; - AI2VCU_MISSION_STATUS = AI_MISSION_STATUS; - AI2VCU_DIRECTION_REQUEST = AI_DIRECTION_REQUEST; + AI2VCU_HANDSHAKE_BIT = t_AI2VCU_HANDSHAKE_SEND_BIT; + AI2VCU_ESTOP_REQUEST = t_AI2VCU_ESTOP_REQUEST; + AI2VCU_MISSION_STATUS = t_AI2VCU_MISSION_STATUS; + AI2VCU_DIRECTION_REQUEST = t_AI2VCU_DIRECTION_REQUEST; AI2VCU_LAP_COUNTER = 0; AI2VCU_CONES_COUNT_ACTUAL = 0; AI2VCU_CONES_COUNT_ALL = 0; - AI2VCU_FRONT_MOTOR_SPEED_MAX_rpm = (uint16_t)AI_FRONT_MOTOR_SPEED_REQUEST_rpm; - AI2VCU_REAR_MOTOR_SPEED_MAX_rpm = (uint16_t)AI_REAR_MOTOR_SPEED_REQUEST_rpm; - AI2VCU_STEER_REQUEST_deg = (int16_t)(10.0f*AI_STEER_REQUEST_deg); - - AI2VCU_HYD_PRESSURE_REQUEST_pct = 0; + AI2VCU_STEER_REQUEST_raw = (int16_t)(10.0f*t_AI2VCU_STEER_ANGLE_REQUEST_deg); + AI2VCU_FRONT_MOTOR_SPEED_MAX_rpm = (uint16_t)t_AI2VCU_FRONT_MOTOR_SPEED_REQUEST_rpm; + AI2VCU_REAR_MOTOR_SPEED_MAX_rpm = (uint16_t)t_AI2VCU_REAR_MOTOR_SPEED_REQUEST_rpm; + AI2VCU_FRONT_AXLE_TRQ_REQUEST_raw = (uint16_t)(10.0f*t_AI2VCU_FRONT_AXLE_TORQUE_REQUEST_Nm); + AI2VCU_REAR_AXLE_TRQ_REQUEST_raw = (uint16_t)(10.0f*t_AI2VCU_REAR_AXLE_TORQUE_REQUEST_Nm); + AI2VCU_HYD_PRESS_F_REQ_raw = (uint8_t)(2.0f*t_AI2VCU_FRONT_BRAKE_PRESS_REQUEST_pct); + AI2VCU_HYD_PRESS_R_REQ_raw = (uint8_t)(2.0f*t_AI2VCU_REAR_BRAKE_PRESS_REQUEST_pct); // load the CAN frames with the validated data - volatile pack_int16_t temp; + volatile pack_16_t temp; - temp.word = (int16_t)((1.0f/0.00195313f)*((9.80665f*0.001f*3.91f*(float)VCU2AI_Accel_X)+ACCEL_X_OFFSET)); + temp.sword = (int16_t)((512.0f)*((9.80665f*0.001f*(float)IMU_Acceleration_X_mG))); AI2LOG_Dynamics2.data[0] = temp.bytes[0]; AI2LOG_Dynamics2.data[1] = temp.bytes[1]; - temp.word = (int16_t)((1.0f/0.00195313f)*((9.80665f*0.001f*3.91f*(float)VCU2AI_Accel_Y)+ACCEL_Y_OFFSET)); + temp.sword = (int16_t)((512.0f)*((9.80665f*0.001f*(float)IMU_Acceleration_Y_mG))); AI2LOG_Dynamics2.data[2] = temp.bytes[0]; AI2LOG_Dynamics2.data[3] = temp.bytes[1]; - temp.word = (int16_t)((1.0f/0.0078125f)*((0.00875f*(float)VCU2AI_Gyro_Z)+GYRO_X_OFFSET)); + temp.sword = (int16_t)((128.0f)*((float)IMU_Rotation_Z_degps)); AI2LOG_Dynamics2.data[4] = temp.bytes[0]; AI2LOG_Dynamics2.data[5] = temp.bytes[1]; @@ -625,10 +822,10 @@ void fs_ai_api_ai2vcu_set_data(fs_ai_api_ai2vcu *data) { AI2VCU_Status.data[6] = 0; AI2VCU_Status.data[7] = 0; - temp.word = AI2VCU_FRONT_AXLE_TRQ_REQUEST_Nm; + temp.uword = AI2VCU_FRONT_AXLE_TRQ_REQUEST_raw; AI2VCU_Drive_F.data[0] = temp.bytes[0]; AI2VCU_Drive_F.data[1] = temp.bytes[1]; - temp.word = AI2VCU_FRONT_MOTOR_SPEED_MAX_rpm; + temp.uword = AI2VCU_FRONT_MOTOR_SPEED_MAX_rpm; AI2VCU_Drive_F.data[2] = temp.bytes[0]; AI2VCU_Drive_F.data[3] = temp.bytes[1]; AI2VCU_Drive_F.data[4] = 0; @@ -636,10 +833,10 @@ void fs_ai_api_ai2vcu_set_data(fs_ai_api_ai2vcu *data) { AI2VCU_Drive_F.data[6] = 0; AI2VCU_Drive_F.data[7] = 0; - temp.word = AI2VCU_REAR_AXLE_TRQ_REQUEST_Nm; + temp.uword = AI2VCU_REAR_AXLE_TRQ_REQUEST_raw; AI2VCU_Drive_R.data[0] = temp.bytes[0]; AI2VCU_Drive_R.data[1] = temp.bytes[1]; - temp.word = AI2VCU_REAR_MOTOR_SPEED_MAX_rpm; + temp.uword = AI2VCU_REAR_MOTOR_SPEED_MAX_rpm; AI2VCU_Drive_R.data[2] = temp.bytes[0]; AI2VCU_Drive_R.data[3] = temp.bytes[1]; AI2VCU_Drive_R.data[4] = 0; @@ -647,7 +844,7 @@ void fs_ai_api_ai2vcu_set_data(fs_ai_api_ai2vcu *data) { AI2VCU_Drive_R.data[6] = 0; AI2VCU_Drive_R.data[7] = 0; - temp.word = AI2VCU_STEER_REQUEST_deg; + temp.sword = AI2VCU_STEER_REQUEST_raw; AI2VCU_Steer.data[0] = temp.bytes[0]; AI2VCU_Steer.data[1] = temp.bytes[1]; AI2VCU_Steer.data[2] = 0; @@ -657,9 +854,8 @@ void fs_ai_api_ai2vcu_set_data(fs_ai_api_ai2vcu *data) { AI2VCU_Steer.data[6] = 0; AI2VCU_Steer.data[7] = 0; - temp.word = AI2VCU_HYD_PRESSURE_REQUEST_pct; - AI2VCU_Brake.data[0] = (uint8_t)temp.word; - AI2VCU_Brake.data[1] = 0; + AI2VCU_Brake.data[0] = AI2VCU_HYD_PRESS_F_REQ_raw; + AI2VCU_Brake.data[1] = AI2VCU_HYD_PRESS_R_REQ_raw; AI2VCU_Brake.data[2] = 0; AI2VCU_Brake.data[3] = 0; AI2VCU_Brake.data[4] = 0; @@ -685,22 +881,148 @@ void fs_ai_api_ai2vcu_set_data(fs_ai_api_ai2vcu *data) { } -void fs_ai_api_debug_get_data(uint8_t *data) { +void fs_ai_api_imu_get_data(fs_ai_api_imu *data) { pthread_mutex_lock(&can_read_mutex); // protect the buffers from race conditions - if(DEBUG_1_fresh) { - DEBUG_1_fresh = FALSE; + can_data_t* temp; + + // decode the CAN buffers if fresh data present + if(PCAN_GPS_BMC_Acceleration_fresh) { + PCAN_GPS_BMC_Acceleration_fresh = FALSE; + temp = (can_data_t*)&PCAN_GPS_BMC_Acceleration.data[0]; + IMU_Acceleration_X_mG = 3.91f*temp->swords[0]; + IMU_Acceleration_Y_mG = 3.91f*temp->swords[1]; + IMU_Acceleration_Z_mG = 3.91f*temp->swords[2]; + IMU_Temperature_degC = 0.5f*temp->sbytes[6]; + IMU_VerticalAxis = temp->sbytes[7] & 0b00000011; + IMU_Orientation = (temp->sbytes[7] & 0b00011100) >> 2; + } + + if(PCAN_GPS_BMC_MagneticField_fresh) { + PCAN_GPS_BMC_MagneticField_fresh = FALSE; + temp = (can_data_t*)&PCAN_GPS_BMC_MagneticField.data[0]; + IMU_MagneticField_X_uT = 0.3f*temp->swords[0]; + IMU_MagneticField_Y_uT = 0.3f*temp->swords[1]; + IMU_MagneticField_Z_uT = 0.3f*temp->swords[2]; } - // always copy - data[0] = DEBUG_1.data[0]; - data[1] = DEBUG_1.data[1]; - data[2] = DEBUG_1.data[2]; - data[3] = DEBUG_1.data[3]; - data[4] = DEBUG_1.data[4]; - data[5] = DEBUG_1.data[5]; - data[6] = DEBUG_1.data[6]; - data[7] = DEBUG_1.data[7]; + if(PCAN_GPS_L3GD20_Rotation_A_fresh) { + PCAN_GPS_L3GD20_Rotation_A_fresh = FALSE; + temp = (can_data_t*)&PCAN_GPS_L3GD20_Rotation_A.data[0]; + IMU_Rotation_X_degps = temp->floats[0]; + IMU_Rotation_Y_degps = temp->floats[1]; + } + + if(PCAN_GPS_L3GD20_Rotation_B_fresh) { + temp = (can_data_t*)&PCAN_GPS_L3GD20_Rotation_B.data[0]; + PCAN_GPS_L3GD20_Rotation_B_fresh = FALSE; + IMU_Rotation_Z_degps = temp->floats[0]; + } pthread_mutex_unlock(&can_read_mutex); // don't forget! -} \ No newline at end of file + + // output the data, conversions done above + data->IMU_Acceleration_X_mG = IMU_Acceleration_X_mG; + data->IMU_Acceleration_Y_mG = IMU_Acceleration_Y_mG; + data->IMU_Acceleration_Z_mG = IMU_Acceleration_Z_mG; + data->IMU_Temperature_degC = IMU_Temperature_degC; + data->IMU_VerticalAxis = IMU_VerticalAxis; + data->IMU_Orientation = IMU_Orientation; + data->IMU_MagneticField_X_uT = IMU_MagneticField_X_uT; + data->IMU_MagneticField_Y_uT = IMU_MagneticField_Y_uT; + data->IMU_MagneticField_Z_uT = IMU_MagneticField_Z_uT; + data->IMU_Rotation_X_degps = IMU_Rotation_X_degps; + data->IMU_Rotation_Y_degps = IMU_Rotation_Y_degps; + data->IMU_Rotation_Z_degps = IMU_Rotation_Z_degps; +} + + +void fs_ai_api_gps_get_data(fs_ai_api_gps *data) { + pthread_mutex_lock(&can_read_mutex); // protect the buffers from race conditions + + can_data_t* temp; + + // decode the CAN buffers if fresh data present + if(PCAN_GPS_GPS_Status_fresh) { + PCAN_GPS_GPS_Status_fresh = FALSE; + GPS_AntennaStatus = PCAN_GPS_GPS_Status.data[0]; + GPS_NumSatellites = PCAN_GPS_GPS_Status.data[1]; + GPS_NavigationMethod = PCAN_GPS_GPS_Status.data[2]; + } + + if(PCAN_GPS_GPS_CourseSpeed_fresh) { + PCAN_GPS_GPS_CourseSpeed_fresh = FALSE; + temp = (can_data_t*)&PCAN_GPS_GPS_CourseSpeed.data[0]; + GPS_Course_deg = temp->floats[0]; + GPS_Speed_kmh = temp->floats[1]; } + + if(PCAN_GPS_GPS_Longitude_fresh) { + PCAN_GPS_GPS_Longitude_fresh = FALSE; + temp = (can_data_t*)&PCAN_GPS_GPS_Longitude.data[0]; + GPS_Longitude_Minutes = temp->floats[0]; + GPS_Longitude_Degree = temp->uwords[2]; + GPS_Longitude_IndicatorEW = temp->ubytes[6]; + } + + if(PCAN_GPS_GPS_Latitude_fresh) { + PCAN_GPS_GPS_Latitude_fresh = FALSE; + temp = (can_data_t*)&PCAN_GPS_GPS_Latitude.data[0]; + GPS_Latitude_Minutes = temp->floats[0]; + GPS_Latitude_Degree = temp->uwords[2]; + GPS_Latitude_IndicatorNS = temp->ubytes[6]; + } + + if(PCAN_GPS_GPS_Altitude_fresh) { + PCAN_GPS_GPS_Altitude_fresh = FALSE; + temp = (can_data_t*)&PCAN_GPS_GPS_Altitude.data[0]; + GPS_Altitude = temp->floats[0]; + } + + if(PCAN_GPS_GPS_Delusions_A_fresh) { + PCAN_GPS_GPS_Delusions_A_fresh = FALSE; + temp = (can_data_t*)&PCAN_GPS_GPS_Delusions_A.data[0]; + GPS_PDOP = temp->floats[0]; + GPS_HDOP = temp->floats[0]; + } + + if(PCAN_GPS_GPS_Delusions_B_fresh) { + PCAN_GPS_GPS_Delusions_B_fresh = FALSE; + temp = (can_data_t*)&PCAN_GPS_GPS_Delusions_B.data[0]; + GPS_VDOP = temp->floats[0]; + } + + if(PCAN_GPS_GPS_DateTime_fresh) { + PCAN_GPS_GPS_DateTime_fresh = FALSE; + GPS_UTC_Year = PCAN_GPS_GPS_DateTime.data[0]; + GPS_UTC_Month = PCAN_GPS_GPS_DateTime.data[1]; + GPS_UTC_DayOfMonth = PCAN_GPS_GPS_DateTime.data[2]; + GPS_UTC_Hour = PCAN_GPS_GPS_DateTime.data[3]; + GPS_UTC_Minute = PCAN_GPS_GPS_DateTime.data[4]; + GPS_UTC_Second = PCAN_GPS_GPS_DateTime.data[5]; + } + + pthread_mutex_unlock(&can_read_mutex); // don't forget! + + // output the data, no conversions needed + data->GPS_AntennaStatus = GPS_AntennaStatus; + data->GPS_NumSatellites = GPS_NumSatellites; + data->GPS_NavigationMethod = GPS_NavigationMethod; + data->GPS_Course_deg = GPS_Course_deg; + data->GPS_Speed_kmh = GPS_Speed_kmh; + data->GPS_Longitude_Minutes = GPS_Longitude_Minutes; + data->GPS_Longitude_Degree = GPS_Longitude_Degree; + data->GPS_Longitude_IndicatorEW = GPS_Longitude_IndicatorEW; + data->GPS_Latitude_Minutes = GPS_Latitude_Minutes; + data->GPS_Latitude_Degree = GPS_Latitude_Degree; + data->GPS_Latitude_IndicatorNS = GPS_Latitude_IndicatorNS; + data->GPS_Altitude = GPS_Altitude; + data->GPS_PDOP = GPS_PDOP; + data->GPS_HDOP = GPS_HDOP; + data->GPS_VDOP = GPS_VDOP; + data->GPS_UTC_Year = GPS_UTC_Year; + data->GPS_UTC_Month = GPS_UTC_Month; + data->GPS_UTC_DayOfMonth = GPS_UTC_DayOfMonth; + data->GPS_UTC_Hour = GPS_UTC_Hour; + data->GPS_UTC_Minute = GPS_UTC_Minute; + data->GPS_UTC_Second = GPS_UTC_Second; +} diff --git a/FS-AI_API/fs-ai_api.h b/FS-AI_API/fs-ai_api.h index ea91f24..54e9895 100644 --- a/FS-AI_API/fs-ai_api.h +++ b/FS-AI_API/fs-ai_api.h @@ -1,11 +1,36 @@ -/********************************************************************* - * Copyright: Preston EV Limited 2018, Rockfort Engineering Ltd. 2019 +/************************************************************************** + * Copyright: Preston EV Limited 2018, Rockfort Engineering Ltd. 2019, 2021 * * File: fs-ai_api.h * Author: Ian Murphy - * Date: 2018-06-25, 2019-05-14 + * Date: 2018-06-25, 2019-05-14, 2021-05-22 * - ********************************************************************/ + *************************************************************************/ + + +/************************************************************************** +MIT License + +Copyright (c) 2021 IMechE Formula Student AI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*************************************************************************/ #ifndef FS_AI_API_H @@ -33,9 +58,9 @@ typedef enum fs_ai_api_ami_state_e { AMI_SKIDPAD = 2, AMI_AUTOCROSS = 3, AMI_TRACK_DRIVE = 4, - AMI_BRAKE_TEST = 5, - AMI_INSPECTION = 6, - AMI_MANUAL = 7, + AMI_STATIC_INSPECTION_A = 5, + AMI_STATIC_INSPECTION_B = 6, + AMI_AUTONOMOUS_DEMO = 7, } fs_ai_api_ami_state_e; @@ -45,14 +70,21 @@ typedef enum fs_ai_api_handshake_receive_bit_e { } fs_ai_api_handshake_receive_bit_e; +typedef enum fs_ai_api_res_go_signal_bit_e { + RES_GO_SIGNAL_NO_GO = 0, + RES_GO_SIGNAL_GO = 1, +} fs_ai_api_res_go_signal_bit_e; + + #ifdef __cplusplus typedef volatile struct alignas(4) fs_ai_api_vcu2ai_struct { + volatile fs_ai_api_handshake_receive_bit_e VCU2AI_HANDSHAKE_RECEIVE_BIT; + volatile fs_ai_api_res_go_signal_bit_e VCU2AI_RES_GO_SIGNAL; volatile fs_ai_api_as_state_e VCU2AI_AS_STATE; volatile fs_ai_api_ami_state_e VCU2AI_AMI_STATE; - volatile fs_ai_api_handshake_receive_bit_e VCU2AI_HANDSHAKE_RECEIVE_BIT; - volatile float VCU2AI_STEER_ANGLE_MAX_deg; volatile float VCU2AI_STEER_ANGLE_deg; - volatile float VCU2AI_WHEEL_SPEED_MAX_rpm; + volatile float VCU2AI_BRAKE_PRESS_F_pct; + volatile float VCU2AI_BRAKE_PRESS_R_pct; volatile float VCU2AI_FL_WHEEL_SPEED_rpm; volatile float VCU2AI_FR_WHEEL_SPEED_rpm; volatile float VCU2AI_RL_WHEEL_SPEED_rpm; @@ -61,21 +93,16 @@ typedef volatile struct alignas(4) fs_ai_api_vcu2ai_struct { volatile uint16_t VCU2AI_FR_PULSE_COUNT; volatile uint16_t VCU2AI_RL_PULSE_COUNT; volatile uint16_t VCU2AI_RR_PULSE_COUNT; - volatile float VCU2AI_Accel_longitudinal_ms2; - volatile float VCU2AI_Accel_lateral_ms2; - volatile float VCU2AI_Accel_vertical_ms2; - volatile float VCU2AI_Yaw_rate_degps; - volatile float VCU2AI_Roll_rate_degps; - volatile float VCU2AI_Pitch_rate_degps; } fs_ai_api_vcu2ai; #else typedef volatile struct fs_ai_api_vcu2ai_struct { + volatile _Alignas(4) fs_ai_api_handshake_receive_bit_e VCU2AI_HANDSHAKE_RECEIVE_BIT; + volatile _Alignas(4) fs_ai_api_res_go_signal_bit_e VCU2AI_RES_GO_SIGNAL; volatile _Alignas(4) fs_ai_api_as_state_e VCU2AI_AS_STATE; volatile _Alignas(4) fs_ai_api_ami_state_e VCU2AI_AMI_STATE; - volatile _Alignas(4) fs_ai_api_handshake_receive_bit_e VCU2AI_HANDSHAKE_RECEIVE_BIT; - volatile _Alignas(4) float VCU2AI_STEER_ANGLE_MAX_deg; volatile _Alignas(4) float VCU2AI_STEER_ANGLE_deg; - volatile _Alignas(4) float VCU2AI_WHEEL_SPEED_MAX_rpm; + volatile _Alignas(4) float VCU2AI_BRAKE_PRESS_F_pct; + volatile _Alignas(4) float VCU2AI_BRAKE_PRESS_R_pct; volatile _Alignas(4) float VCU2AI_FL_WHEEL_SPEED_rpm; volatile _Alignas(4) float VCU2AI_FR_WHEEL_SPEED_rpm; volatile _Alignas(4) float VCU2AI_RL_WHEEL_SPEED_rpm; @@ -84,12 +111,6 @@ typedef volatile struct fs_ai_api_vcu2ai_struct { volatile _Alignas(4) uint16_t VCU2AI_FR_PULSE_COUNT; volatile _Alignas(4) uint16_t VCU2AI_RL_PULSE_COUNT; volatile _Alignas(4) uint16_t VCU2AI_RR_PULSE_COUNT; - volatile _Alignas(4) float VCU2AI_Accel_longitudinal_ms2; - volatile _Alignas(4) float VCU2AI_Accel_lateral_ms2; - volatile _Alignas(4) float VCU2AI_Accel_vertical_ms2; - volatile _Alignas(4) float VCU2AI_Yaw_rate_degps; - volatile _Alignas(4) float VCU2AI_Roll_rate_degps; - volatile _Alignas(4) float VCU2AI_Pitch_rate_degps; } fs_ai_api_vcu2ai; #endif @@ -127,7 +148,9 @@ typedef volatile struct alignas(4) fs_ai_api_ai2vcu_struct { volatile fs_ai_api_estop_request_e AI2VCU_ESTOP_REQUEST; volatile fs_ai_api_handshake_send_bit_e AI2VCU_HANDSHAKE_SEND_BIT; volatile float AI2VCU_STEER_ANGLE_REQUEST_deg; - volatile float AI2VCU_WHEEL_SPEED_REQUEST_rpm; + volatile float AI2VCU_AXLE_SPEED_REQUEST_rpm; + volatile float AI2VCU_AXLE_TORQUE_REQUEST_Nm; + volatile float AI2VCU_BRAKE_PRESS_REQUEST_pct; } fs_ai_api_ai2vcu; #else typedef volatile struct fs_ai_api_ai2vcu_struct { @@ -136,16 +159,105 @@ typedef volatile struct fs_ai_api_ai2vcu_struct { volatile _Alignas(4) fs_ai_api_estop_request_e AI2VCU_ESTOP_REQUEST; volatile _Alignas(4) fs_ai_api_handshake_send_bit_e AI2VCU_HANDSHAKE_SEND_BIT; volatile _Alignas(4) float AI2VCU_STEER_ANGLE_REQUEST_deg; - volatile _Alignas(4) float AI2VCU_WHEEL_SPEED_REQUEST_rpm; + volatile _Alignas(4) float AI2VCU_AXLE_SPEED_REQUEST_rpm; + volatile _Alignas(4) float AI2VCU_AXLE_TORQUE_REQUEST_Nm; + volatile _Alignas(4) float AI2VCU_BRAKE_PRESS_REQUEST_pct; } fs_ai_api_ai2vcu; #endif +#ifdef __cplusplus +typedef volatile struct alignas(4) fs_ai_api_gps_struct { + volatile uint8_t GPS_AntennaStatus; + volatile uint8_t GPS_NumSatellites; + volatile uint8_t GPS_NavigationMethod; + volatile float GPS_Course_deg; + volatile float GPS_Speed_kmh; + volatile float GPS_Longitude_Minutes; + volatile uint16_t GPS_Longitude_Degree; + volatile uint8_t GPS_Longitude_IndicatorEW; + volatile float GPS_Latitude_Minutes; + volatile uint16_t GPS_Latitude_Degree; + volatile uint8_t GPS_Latitude_IndicatorNS; + volatile float GPS_Altitude; + volatile float GPS_PDOP; + volatile float GPS_HDOP; + volatile float GPS_VDOP; + volatile uint8_t GPS_UTC_Year; + volatile uint8_t GPS_UTC_Month; + volatile uint8_t GPS_UTC_DayOfMonth; + volatile uint8_t GPS_UTC_Hour; + volatile uint8_t GPS_UTC_Minute; + volatile uint8_t GPS_UTC_Second; +} fs_ai_api_gps; +#else +typedef volatile struct fs_ai_api_gps_struct { + volatile _Alignas(4) uint8_t GPS_AntennaStatus; + volatile _Alignas(4) uint8_t GPS_NumSatellites; + volatile _Alignas(4) uint8_t GPS_NavigationMethod; + volatile _Alignas(4) float GPS_Course_deg; + volatile _Alignas(4) float GPS_Speed_kmh; + volatile _Alignas(4) float GPS_Longitude_Minutes; + volatile _Alignas(4) uint16_t GPS_Longitude_Degree; + volatile _Alignas(4) uint8_t GPS_Longitude_IndicatorEW; + volatile _Alignas(4) float GPS_Latitude_Minutes; + volatile _Alignas(4) uint16_t GPS_Latitude_Degree; + volatile _Alignas(4) uint8_t GPS_Latitude_IndicatorNS; + volatile _Alignas(4) float GPS_Altitude; + volatile _Alignas(4) float GPS_PDOP; + volatile _Alignas(4) float GPS_HDOP; + volatile _Alignas(4) float GPS_VDOP; + volatile _Alignas(4) uint8_t GPS_UTC_Year; + volatile _Alignas(4) uint8_t GPS_UTC_Month; + volatile _Alignas(4) uint8_t GPS_UTC_DayOfMonth; + volatile _Alignas(4) uint8_t GPS_UTC_Hour; + volatile _Alignas(4) uint8_t GPS_UTC_Minute; + volatile _Alignas(4) uint8_t GPS_UTC_Second; +} fs_ai_api_gps; +#endif + + +#ifdef __cplusplus +typedef volatile struct alignas(4) fs_ai_api_imu_struct { + volatile float IMU_Acceleration_X_mG; + volatile float IMU_Acceleration_Y_mG; + volatile float IMU_Acceleration_Z_mG; + volatile float IMU_Temperature_degC; + volatile uint8_t IMU_VerticalAxis; + volatile uint8_t IMU_Orientation; + volatile float IMU_MagneticField_X_uT; + volatile float IMU_MagneticField_Y_uT; + volatile float IMU_MagneticField_Z_uT; + volatile float IMU_Rotation_X_degps; + volatile float IMU_Rotation_Y_degps; + volatile float IMU_Rotation_Z_degps; +} fs_ai_api_imu; +#else +typedef volatile struct fs_ai_api_imu_struct { + volatile _Alignas(4) float IMU_Acceleration_X_mG; + volatile _Alignas(4) float IMU_Acceleration_Y_mG; + volatile _Alignas(4) float IMU_Acceleration_Z_mG; + volatile _Alignas(4) float IMU_Temperature_degC; + volatile _Alignas(4) uint8_t IMU_VerticalAxis; + volatile _Alignas(4) uint8_t IMU_Orientation; + volatile _Alignas(4) float IMU_MagneticField_X_uT; + volatile _Alignas(4) float IMU_MagneticField_Y_uT; + volatile _Alignas(4) float IMU_MagneticField_Z_uT; + volatile _Alignas(4) float IMU_Rotation_X_degps; + volatile _Alignas(4) float IMU_Rotation_Y_degps; + volatile _Alignas(4) float IMU_Rotation_Z_degps; +} fs_ai_api_imu; +#endif + + int fs_ai_api_init(char *CAN_interface, int debug, int simulate); void fs_ai_api_vcu2ai_get_data(fs_ai_api_vcu2ai *data); void fs_ai_api_ai2vcu_set_data(fs_ai_api_ai2vcu *data); +void fs_ai_api_imu_get_data(fs_ai_api_imu *data); +void fs_ai_api_gps_get_data(fs_ai_api_gps *data); + #ifdef __cplusplus } diff --git a/FS-AI_API_Console/fs-ai_api_console.c b/FS-AI_API_Console/fs-ai_api_console.c index 7feaee6..0bd5726 100644 --- a/FS-AI_API_Console/fs-ai_api_console.c +++ b/FS-AI_API_Console/fs-ai_api_console.c @@ -1,11 +1,36 @@ -/********************************************************************* - * Copyright: Preston EV Limited 2018, Rockfort Engineering Ltd. 2019 +/************************************************************************** + * Copyright: Preston EV Limited 2018, Rockfort Engineering Ltd. 2019, 2021 * - * File: fs-ai_api_tester.c + * File: fs-ai_api_console.c * Author: Ian Murphy - * Date: 2018-06-25, 2019-05-14 + * Date: 2018-06-25, 2019-05-14, 2021-05-22 * - ********************************************************************/ + *************************************************************************/ + + +/************************************************************************** +MIT License + +Copyright (c) 2021 IMechE Formula Student AI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*************************************************************************/ #include @@ -23,19 +48,15 @@ static char inputs[10] = "", outputs[80] = " static int data = 0; static int timing_us = 5000; -// DEBUG_1 -void fs_ai_api_debug_get_data(uint8_t *data); -static uint8_t DEBUG_data[8] = {0,0,0,0,0,0,0,0}; - int main(int argc, char** argv) { if (argc < 2) { printf("Too few arguments!\r\n"); - printf("Usage: fs-ai_api_tester \r\n"); + printf("Usage: fs-ai_api_console \r\n"); return(1); } - if(fs_ai_api_init(argv[1],1,0)) { // initialise with Debug & Simulate flags + if(fs_ai_api_init(argv[1],1,0)) { // initialise with Debug flag printf("fs_ai_api_init() failed\r\n"); return(1); } @@ -48,7 +69,9 @@ int main(int argc, char** argv) { printf("\r\n"); printf("Ready Player One...\r\n"); - + + printf("\033[2J"); // clear the screen + while(1) { // background loop scanf("%s %d", inputs, &data); @@ -60,7 +83,17 @@ int main(int argc, char** argv) { if(0 == strcmp(inputs, "r")) { sprintf(outputs, "rpm: %d \r\n", data); - ai2vcu_data.AI2VCU_WHEEL_SPEED_REQUEST_rpm = (float)data; + ai2vcu_data.AI2VCU_AXLE_SPEED_REQUEST_rpm = (float)data; + } + + if(0 == strcmp(inputs, "b")) { + sprintf(outputs, "Brakes: %d \r\n", data); + ai2vcu_data.AI2VCU_BRAKE_PRESS_REQUEST_pct = (float)data; + } + + if(0 == strcmp(inputs, "t")) { + sprintf(outputs, "Torque: %d \r\n", data); + ai2vcu_data.AI2VCU_AXLE_TORQUE_REQUEST_Nm = (float)data; } if(0 == strcmp(inputs, "m")) { @@ -78,8 +111,8 @@ int main(int argc, char** argv) { ai2vcu_data.AI2VCU_ESTOP_REQUEST = data; } - if(0 == strcmp(inputs, "t")) { - sprintf(outputs, "Timing: %d \r\n", data); + if(0 == strcmp(inputs, "l")) { + sprintf(outputs, "Loop_us: %d \r\n", data); timing_us = data; } } @@ -91,26 +124,16 @@ static void *loop_thread() { while(1) { // get some data fs_ai_api_vcu2ai_get_data(&vcu2ai_data); - fs_ai_api_debug_get_data(DEBUG_data); - - // low pass filter the IMU for better screen display - static float VCU2AI_Accel_longitudinal_ms2_lpf,VCU2AI_Accel_lateral_ms2_lpf,VCU2AI_Accel_vertical_ms2_lpf; - static float VCU2AI_Yaw_rate_degps_lpf,VCU2AI_Roll_rate_degps_lpf,VCU2AI_Pitch_rate_degps_lpf; - - VCU2AI_Accel_longitudinal_ms2_lpf = 0.95f*VCU2AI_Accel_longitudinal_ms2_lpf + 0.05f*vcu2ai_data.VCU2AI_Accel_longitudinal_ms2; - VCU2AI_Accel_lateral_ms2_lpf = 0.95f*VCU2AI_Accel_lateral_ms2_lpf + 0.05f*vcu2ai_data.VCU2AI_Accel_lateral_ms2; - VCU2AI_Accel_vertical_ms2_lpf = 0.95f*VCU2AI_Accel_vertical_ms2_lpf + 0.05f*vcu2ai_data.VCU2AI_Accel_vertical_ms2; - VCU2AI_Yaw_rate_degps_lpf = 0.95f*VCU2AI_Yaw_rate_degps_lpf + 0.05f*vcu2ai_data.VCU2AI_Yaw_rate_degps; - VCU2AI_Roll_rate_degps_lpf = 0.95f*VCU2AI_Roll_rate_degps_lpf + 0.05f*vcu2ai_data.VCU2AI_Roll_rate_degps; - VCU2AI_Pitch_rate_degps_lpf = 0.95f*VCU2AI_Pitch_rate_degps_lpf + 0.05f*vcu2ai_data.VCU2AI_Pitch_rate_degps; // output + printf("\033[H"); // home the cursor + printf("VCU2AI_HANDSHAKE_RECEIVE_BIT %u \r\n",vcu2ai_data.VCU2AI_HANDSHAKE_RECEIVE_BIT); + printf("VCU2AI_RES_GO_SIGNAL %u \r\n",vcu2ai_data.VCU2AI_RES_GO_SIGNAL); printf("VCU2AI_AS_STATE %u \r\n",vcu2ai_data.VCU2AI_AS_STATE); printf("VCU2AI_AMI_STATE %u \r\n",vcu2ai_data.VCU2AI_AMI_STATE); - printf("VCU2AI_HANDSHAKE_RECEIVE_BIT %u \r\n",vcu2ai_data.VCU2AI_HANDSHAKE_RECEIVE_BIT); - printf("VCU2AI_STEER_ANGLE_MAX_deg %4.1f \r\n",vcu2ai_data.VCU2AI_STEER_ANGLE_MAX_deg); printf("VCU2AI_STEER_ANGLE_deg %+5.1f \r\n",vcu2ai_data.VCU2AI_STEER_ANGLE_deg); - printf("VCU2AI_WHEEL_SPEED_MAX_rpm %4.0f \r\n",vcu2ai_data.VCU2AI_WHEEL_SPEED_MAX_rpm); + printf("VCU2AI_BRAKE_PRESS_F_pct %4.1f \r\n",vcu2ai_data.VCU2AI_BRAKE_PRESS_F_pct); + printf("VCU2AI_BRAKE_PRESS_R_pct %4.1f \r\n",vcu2ai_data.VCU2AI_BRAKE_PRESS_R_pct); printf("VCU2AI_FL_WHEEL_SPEED_rpm %4.0f \r\n",vcu2ai_data.VCU2AI_FL_WHEEL_SPEED_rpm); printf("VCU2AI_FR_WHEEL_SPEED_rpm %4.0f \r\n",vcu2ai_data.VCU2AI_FR_WHEEL_SPEED_rpm); printf("VCU2AI_RL_WHEEL_SPEED_rpm %4.0f \r\n",vcu2ai_data.VCU2AI_RL_WHEEL_SPEED_rpm); @@ -119,23 +142,19 @@ static void *loop_thread() { printf("VCU2AI_FR_PULSE_COUNT %5u \r\n",vcu2ai_data.VCU2AI_FR_PULSE_COUNT); printf("VCU2AI_RL_PULSE_COUNT %5u \r\n",vcu2ai_data.VCU2AI_RL_PULSE_COUNT); printf("VCU2AI_RR_PULSE_COUNT %5u \r\n",vcu2ai_data.VCU2AI_RR_PULSE_COUNT); - printf("VCU2AI_Accel_longitudinal_ms2 %+6.2f \r\n",VCU2AI_Accel_longitudinal_ms2_lpf); - printf("VCU2AI_Accel_lateral_ms2 %+6.2f \r\n",VCU2AI_Accel_lateral_ms2_lpf); - printf("VCU2AI_Accel_vertical_ms2 %+6.2f \r\n",VCU2AI_Accel_vertical_ms2_lpf); - printf("VCU2AI_Yaw_rate_degps %+5.1f \r\n",VCU2AI_Yaw_rate_degps_lpf); - printf("VCU2AI_Roll_rate_degps %+5.1f \r\n",VCU2AI_Roll_rate_degps_lpf); - printf("VCU2AI_Pitch_rate_degps %+5.1f \r\n",VCU2AI_Pitch_rate_degps_lpf); - - printf("DEBUG_1: %u %u %u %u %u %u %u %u\r\n",DEBUG_data[0],DEBUG_data[1],DEBUG_data[2],DEBUG_data[3],DEBUG_data[4],DEBUG_data[5],DEBUG_data[6],DEBUG_data[7]); - + printf("AI2VCU_DIRECTION_REQUEST %u \r\n",ai2vcu_data.AI2VCU_DIRECTION_REQUEST); printf("AI2VCU_ESTOP_REQUEST %u \r\n",ai2vcu_data.AI2VCU_ESTOP_REQUEST); printf("AI2VCU_MISSION_STATUS %u \r\n",ai2vcu_data.AI2VCU_MISSION_STATUS); printf("AI2VCU_STEER_ANGLE_REQUEST_deg %+5.1f \r\n",ai2vcu_data.AI2VCU_STEER_ANGLE_REQUEST_deg); - printf("AI2VCU_WHEEL_SPEED_REQUEST_rpm %4.0f \r\n",ai2vcu_data.AI2VCU_WHEEL_SPEED_REQUEST_rpm); + printf("AI2VCU_AXLE_SPEED_REQUEST_rpm %4.0f \r\n",ai2vcu_data.AI2VCU_AXLE_SPEED_REQUEST_rpm); + printf("AI2VCU_AXLE_TORQUE_REQUEST_Nm %4.0f \r\n",ai2vcu_data.AI2VCU_AXLE_TORQUE_REQUEST_Nm); + printf("AI2VCU_BRAKE_PRESS_REQUEST_pct %4.0f \r\n",ai2vcu_data.AI2VCU_BRAKE_PRESS_REQUEST_pct); - printf("%s %d\r\n ", inputs, data); - printf("\033[27A"); // move cursor back up + printf(" \r\n"); + printf("%s \r\n",outputs); + + // printf("\033[27A"); // move cursor back up // send some data if(HANDSHAKE_RECEIVE_BIT_OFF == vcu2ai_data.VCU2AI_HANDSHAKE_RECEIVE_BIT) { @@ -146,12 +165,6 @@ static void *loop_thread() { printf("HANDSHAKE_BIT error\r\n"); } -// ai2vcu_data.AI2VCU_DIRECTION_REQUEST = DIRECTION_NEUTRAL; -// ai2vcu_data.AI2VCU_ESTOP_REQUEST = ESTOP_NO; -// ai2vcu_data.AI2VCU_MISSION_STATUS = MISSION_SELECTED; -// ai2vcu_data.AI2VCU_STEER_ANGLE_REQUEST_deg = 9.9f; -// ai2vcu_data.AI2VCU_WHEEL_SPEED_REQUEST_rpm = 0.0f; - fs_ai_api_ai2vcu_set_data(&ai2vcu_data); // repeat roughly every 5ms diff --git a/FS-AI_API_Tester/fs-ai_api_tester.c b/FS-AI_API_Tester/fs-ai_api_tester.c index 895dd22..2db4980 100644 --- a/FS-AI_API_Tester/fs-ai_api_tester.c +++ b/FS-AI_API_Tester/fs-ai_api_tester.c @@ -1,11 +1,36 @@ -/********************************************************************* - * Copyright: Preston EV Limited 2018, Rockfort Engineering Ltd. 2019 +/************************************************************************** + * Copyright: Preston EV Limited 2018, Rockfort Engineering Ltd. 2019, 2021 * * File: fs-ai_api_tester.c * Author: Ian Murphy - * Date: 2018-06-25, 2019-05-14 + * Date: 2018-06-25, 2019-05-14, 2021-05-22 * - ********************************************************************/ + *************************************************************************/ + + +/************************************************************************** +MIT License + +Copyright (c) 2021 IMechE Formula Student AI + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*************************************************************************/ #include @@ -29,17 +54,22 @@ int main(int argc, char** argv) { printf("fs_ai_api_init() failed\r\n"); return(1); } - + + printf("\033[2J"); // clear the screen + while(1) { // get some data fs_ai_api_vcu2ai_get_data(&vcu2ai_data); - printf("VCU2AI_AS_STATE %u \r\n",vcu2ai_data.VCU2AI_AS_STATE); - printf("VCU2AI_AMI_STATE %u \r\n",vcu2ai_data.VCU2AI_AMI_STATE); - printf("VCU2AI_HANDSHAKE_RECEIVE_BIT %u \r\n",vcu2ai_data.VCU2AI_HANDSHAKE_RECEIVE_BIT); - printf("VCU2AI_STEER_ANGLE_MAX_deg %4.1f \r\n",vcu2ai_data.VCU2AI_STEER_ANGLE_MAX_deg); + // output + printf("\033[H"); // home the cursor + printf("VCU2AI_HANDSHAKE_RECEIVE_BIT %u \r\n",vcu2ai_data.VCU2AI_HANDSHAKE_RECEIVE_BIT); + printf("VCU2AI_RES_GO_SIGNAL %u \r\n",vcu2ai_data.VCU2AI_RES_GO_SIGNAL); + printf("VCU2AI_AS_STATE %u \r\n",vcu2ai_data.VCU2AI_AS_STATE); + printf("VCU2AI_AMI_STATE %u \r\n",vcu2ai_data.VCU2AI_AMI_STATE); printf("VCU2AI_STEER_ANGLE_deg %+5.1f \r\n",vcu2ai_data.VCU2AI_STEER_ANGLE_deg); - printf("VCU2AI_WHEEL_SPEED_MAX_rpm %4.0f \r\n",vcu2ai_data.VCU2AI_WHEEL_SPEED_MAX_rpm); + printf("VCU2AI_BRAKE_PRESS_F_pct %4.1f \r\n",vcu2ai_data.VCU2AI_BRAKE_PRESS_F_pct); + printf("VCU2AI_BRAKE_PRESS_R_pct %4.1f \r\n",vcu2ai_data.VCU2AI_BRAKE_PRESS_R_pct); printf("VCU2AI_FL_WHEEL_SPEED_rpm %4.0f \r\n",vcu2ai_data.VCU2AI_FL_WHEEL_SPEED_rpm); printf("VCU2AI_FR_WHEEL_SPEED_rpm %4.0f \r\n",vcu2ai_data.VCU2AI_FR_WHEEL_SPEED_rpm); printf("VCU2AI_RL_WHEEL_SPEED_rpm %4.0f \r\n",vcu2ai_data.VCU2AI_RL_WHEEL_SPEED_rpm); @@ -48,14 +78,8 @@ int main(int argc, char** argv) { printf("VCU2AI_FR_PULSE_COUNT %5u \r\n",vcu2ai_data.VCU2AI_FR_PULSE_COUNT); printf("VCU2AI_RL_PULSE_COUNT %5u \r\n",vcu2ai_data.VCU2AI_RL_PULSE_COUNT); printf("VCU2AI_RR_PULSE_COUNT %5u \r\n",vcu2ai_data.VCU2AI_RR_PULSE_COUNT); - printf("VCU2AI_Accel_longitudinal_ms2 %+5.1f \r\n",vcu2ai_data.VCU2AI_Accel_longitudinal_ms2); - printf("VCU2AI_Accel_lateral_ms2 %+5.1f \r\n",vcu2ai_data.VCU2AI_Accel_lateral_ms2); - printf("VCU2AI_Accel_vertical_ms2 %+5.1f \r\n",vcu2ai_data.VCU2AI_Accel_vertical_ms2); - printf("VCU2AI_Yaw_rate_degps %+6.1f \r\n",vcu2ai_data.VCU2AI_Yaw_rate_degps); - printf("VCU2AI_Roll_rate_degps %+6.1f \r\n",vcu2ai_data.VCU2AI_Roll_rate_degps); - printf("VCU2AI_Pitch_rate_degps %+6.1f \r\n",vcu2ai_data.VCU2AI_Pitch_rate_degps); - printf("\033[21A"); // move cursor back up + // printf("\033[21A"); // move cursor back up // send some data if(HANDSHAKE_RECEIVE_BIT_OFF == vcu2ai_data.VCU2AI_HANDSHAKE_RECEIVE_BIT) { @@ -70,7 +94,9 @@ int main(int argc, char** argv) { ai2vcu_data.AI2VCU_ESTOP_REQUEST = ESTOP_NO; ai2vcu_data.AI2VCU_MISSION_STATUS = MISSION_SELECTED; ai2vcu_data.AI2VCU_STEER_ANGLE_REQUEST_deg = 9.9f; - ai2vcu_data.AI2VCU_WHEEL_SPEED_REQUEST_rpm = 999.0f; + ai2vcu_data.AI2VCU_AXLE_SPEED_REQUEST_rpm = 999.0f; + ai2vcu_data.AI2VCU_AXLE_TORQUE_REQUEST_Nm = 99.0f; + ai2vcu_data.AI2VCU_BRAKE_PRESS_REQUEST_pct = 99.0f; fs_ai_api_ai2vcu_set_data(&ai2vcu_data); diff --git a/README.md b/README.md index ec9b9c8..7a8542e 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ## NOTE: -### This initial commit of the **FS-AI_API** repository contains the source code for the ***2019*** software revision version of the IMechE FS-AI ADS-DV. +### This *draft* commit of the **FS-AI_API** repository contains the source code for the 2021 software revision version of the IMechE FS-AI ADS-DV. It has been provided as a reference for teams to start implementing their vehicle interface code. @@ -13,7 +13,7 @@ Previously the 2019 interface was provided as a library 'libfs-ai_api_amd64.a' i Source code for the library is now released under the MIT license so it may be compiled for any Linux architecture and modified if required. -The 2021 FS-AI ADS-DV has an updated CAN interface and the interface library will be updated to suit as soon as it is tested. +The 2021 FS-AI ADS-DV has an updated CAN interface. Further work will be done to improve the quality of the Console & Tester example programmes. @@ -83,10 +83,11 @@ NOTE: This function must be called frequently enough to prevent the CAN timeout ## Further Documentation -Please refer to the full specification document for full information on the FS-AI ADS-DV CAN interface: [ads-dv-software-interface-specification-v2-0.pdf](./Docs/ads-dv-software-interface-specification-v2-0.pdf). +Please refer to the full specification document for full information on the FS-AI ADS-DV CAN interface: [ADS-DV Software Interface Specification-v3.0.pdf](./Docs/ADS-DV_Software_Interface_Specification_v3.0.pdf). -(also published on the IMechE website as: [https://www.imeche.org/docs/default-source/1-oscar/formula-student/2019/fs-ai/ads-dv-software-interface-specification-v2-0.pdf](https://www.imeche.org/docs/default-source/1-oscar/formula-student/2019/fs-ai/ads-dv-software-interface-specification-v2-0.pdf) ). +(also published on the IMechE website as: https://www.imeche.org/docs/default-source/1-oscar/formula-student/2021/forms/ai/ads-dv-software-interface-specification-v3-0.pdf?sfvrsn=2 ). -The referenced CAN database can be found here: [adsdv_2019_vcu_ai_interface_v2.dbc](./Docs/adsdv_2019_vcu_ai_interface_v2.dbc). +The referenced CAN database can be found here: [adsdv_2021_vcu_ai_interface_v1.dbc](./Docs/adsdv_2021_vcu_ai_interface_v1.dbc). + +This software library exposes only those aspects of the full interface that are deemed essential for the 2021 Formula Student AI DDT competition using the FS-AI ADS-DV. -This software library exposes only those aspects of the full interface that are deemed essential for the 2019 Formula Student AI DDT competition using the FS-AI ADS-DV.