add basic system overview screen with can watchdogs and brake pressure

This commit is contained in:
2025-08-01 01:12:29 +02:00
parent 4354b03907
commit 77ba4249d3
28 changed files with 838 additions and 87 deletions

View File

@ -12,6 +12,8 @@
#include "vehicle_state.h"
#include <stdbool.h>
#define CHECK_WATCHDOG(param, timeout) vehicle_state.watchdog_timeout.param = tick - vehicle_state.watchdog_times.param >= timeout
// CAN filter constants
#define CAN_ID_AMS_SLAVE_PANIC 0x009
#define CAN_ID_AMS_STATUS 0x00A
@ -39,6 +41,9 @@
#define CAN_ID_PDU_CURRENT3 0x0CC
#define CAN_ID_PDU_CURRENT4 0x0CD
#define CAN_ID_SNF_100Hz_1 0x0D3 // only for watchdog
#define CAN_ID_SNR_100Hz 0x0D4 // only for watchdog
#define CAN_ID_DASHBOARD 0x420
#define CAN_ID_SSU 0x500
@ -109,6 +114,8 @@ void vehicle_thread_entry(ULONG hfdcan_addr) {
ftcan_add_filter(CAN_ID_PDU_CURRENT2, 0x7FF);
ftcan_add_filter(CAN_ID_PDU_CURRENT3, 0x7FF);
ftcan_add_filter(CAN_ID_PDU_CURRENT4, 0x7FF);
ftcan_add_filter(CAN_ID_SNF_100Hz_1, 0x7FF);
ftcan_add_filter(CAN_ID_SNR_100Hz, 0x7FF);
ftcan_add_filter(CAN_ID_DASHBOARD, 0x7FF);
ftcan_add_filter(CAN_ID_SSU, 0x7FF);
ftcan_add_filter(CAN_ID_SHUNT_CURRENT, 0x7FF);
@ -137,6 +144,16 @@ void vehicle_thread_entry(ULONG hfdcan_addr) {
}
tx_event_flags_set(&gui_update_events, GUI_UPDATE_VEHICLE_STATE, TX_OR);
#endif
uint32_t tick = HAL_GetTick();
CHECK_WATCHDOG(snf, 300);
CHECK_WATCHDOG(db, 600);
CHECK_WATCHDOG(ftcu, 300);
CHECK_WATCHDOG(pdu, 300);
CHECK_WATCHDOG(snr, 300);
CHECK_WATCHDOG(ams, 300);
CHECK_WATCHDOG(shunt, 300);
tx_event_flags_set(&gui_update_events, GUI_UPDATE_VEHICLE_STATE, TX_OR);
}
}
@ -184,15 +201,18 @@ float calculate_lv_soc(float lv_voltage) {
}
void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data) {
uint32_t tick = HAL_GetTick();
const uint8_t *ptr;
switch (id) {
case CAN_ID_AMS_SLAVE_PANIC:
vehicle_state.watchdog_times.ams = tick;
vehicle_state.last_ams_slave_panic.id = data[0];
vehicle_state.last_ams_slave_panic.kind = data[1];
ptr = &data[2];
vehicle_state.last_ams_slave_panic.arg = ftcan_unmarshal_unsigned(&ptr, 4);
break;
case CAN_ID_AMS_STATUS:
vehicle_state.watchdog_times.ams = tick;
vehicle_state.ts_state = data[0] & 0x7F;
vehicle_state.sdc_closed = (data[0] & 0x80) >> 7;
vehicle_state.soc_ts = data[1];
@ -207,30 +227,37 @@ void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data) {
vehicle_state.ams_error = (data[7] & 0x04) >> 2;
break;
case CAN_ID_AMS_ERROR:
vehicle_state.watchdog_times.ams = tick;
vehicle_state.last_ams_error.kind = data[0];
vehicle_state.last_ams_error.arg = data[1];
break;
case CAN_ID_AMS_DCDC:
vehicle_state.watchdog_times.ams = tick;
ptr = &data[0];
vehicle_state.dcdc_temp = ftcan_unmarshal_signed(&ptr, 2) * 0.01f;
vehicle_state.dcdc_current = ftcan_unmarshal_signed(&ptr, 2) * 0.001f;
break;
case CAN_ID_PWM_DUTYCYLE:
vehicle_state.watchdog_times.ftcu = tick;
// TODO
break;
case CAN_ID_PWM_CONFIG:
vehicle_state.watchdog_times.ftcu = tick;
// TODO
break;
case CAN_ID_FTCU_TIMINGS:
vehicle_state.watchdog_times.ftcu = tick;
vehicle_state.lap_time_best = (data[0] | (data[1] << 8)) * 0.01f;
vehicle_state.lap_time_last = (data[2] | (data[3] << 8)) * 0.01f;
vehicle_state.sector_time_best = (data[4] | (data[5] << 8)) * 0.01f;
vehicle_state.sector_time_last = (data[6] | (data[7] << 8)) * 0.01f;
break;
case CAN_ID_FTCU_DAMPER:
vehicle_state.watchdog_times.ftcu = tick;
// TODO
break;
case CAN_ID_FTCU_WHEELSPEED:
vehicle_state.watchdog_times.ftcu = tick;
vehicle_state.wheel_speeds.wss_fl = data[0] | ((data[1] & 0x0F) << 8);
vehicle_state.wheel_speeds.wss_fr = ((data[1] >> 4) & 0x0F) | (data[2] << 4);
vehicle_state.wheel_speeds.wss_rl = data[3] | ((data[4] & 0x0F) << 8);
@ -238,19 +265,23 @@ void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data) {
vehicle_state.distance_session = data[6] | (data[7] << 8);
break;
case CAN_ID_FTCU_BRAKE_T:
vehicle_state.watchdog_times.ftcu = tick;
vehicle_state.temps.brake_fl = (data[0] | (data[1] << 8)) * 0.01f;
vehicle_state.temps.brake_fr = (data[2] | (data[3] << 8)) * 0.01f;
vehicle_state.temps.brake_rl = (data[4] | (data[5] << 8)) * 0.01f;
vehicle_state.temps.brake_rr = (data[6] | (data[7] << 8)) * 0.01f;
break;
case CAN_ID_FTCU_COOLING:
vehicle_state.watchdog_times.ftcu = tick;
// TODO
break;
case CAN_ID_FTCU_PNEUMATIK:
vehicle_state.watchdog_times.ftcu = tick;
vehicle_state.tank_pressure_1 = data[0] | ((data[1] & 0x0F) << 8);
vehicle_state.tank_pressure_2 = data[2] | ((data[3] & 0x0F) << 8);
break;
case CAN_ID_FTCU_DRIVER:
vehicle_state.watchdog_times.ftcu = tick;
vehicle_state.apps_percent = data[0];
vehicle_state.brake_pressure_f = (data[1] | ((data[2] & 0x0F) << 8)) * 0.1f;
vehicle_state.brake_pressure_r = (((data[2] >> 4) & 0x0F) | (data[3] << 4)) * 0.1f;
@ -260,9 +291,11 @@ void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data) {
vehicle_state.sector_count = data[7];
break;
case CAN_ID_AS_MISSION_FB:
vehicle_state.watchdog_times.ftcu = tick;
vehicle_state.active_mission = data[0] & 0b111;
break;
case CAN_ID_STW_STATUS:
vehicle_state.watchdog_times.ftcu = tick;
// vehicle_state.lap_count = data[0] & 0b111111;
vehicle_state.errors.err_pdu = (data[0] >> 6) & 0b1;
vehicle_state.errors.err_res = (data[0] >> 7) & 0b1;
@ -285,52 +318,71 @@ void ftcan_msg_received_cb(uint16_t id, size_t datalen, const uint8_t *data) {
vehicle_state.initial_checkup_state = data[6];
break;
case CAN_ID_FTCU_PARAM_CONFIRMED:
vehicle_state.watchdog_times.ftcu = tick;
vehicle_state.last_param_confirmed = data[0];
tx_event_flags_set(&gui_update_events, GUI_UPDATE_PARAM_CONFIRMED, TX_OR);
break;
case CAN_ID_FTCU_TELEMETRIE1:
vehicle_state.watchdog_times.ftcu = tick;
// TODO
break;
case CAN_ID_FTCU_TELEMETRIE2:
vehicle_state.watchdog_times.ftcu = tick;
// TODO
break;
case CAN_ID_PDU_RESPONSE:
vehicle_state.watchdog_times.pdu = tick;
// TODO
break;
case CAN_ID_PDU_CURRENT1:
vehicle_state.watchdog_times.pdu = tick;
// TODO
break;
case CAN_ID_PDU_CURRENT2:
vehicle_state.watchdog_times.pdu = tick;
// TODO
break;
case CAN_ID_PDU_CURRENT3:
vehicle_state.watchdog_times.pdu = tick;
// TODO
break;
case CAN_ID_PDU_CURRENT4:
vehicle_state.watchdog_times.pdu = tick;
ptr = &data[2];
vehicle_state.lv_voltage = ftcan_unmarshal_signed(&ptr, 2) * 0.001f;
vehicle_state.lv_soc = calculate_lv_soc(vehicle_state.lv_voltage);
break;
case CAN_ID_SNF_100Hz_1:
vehicle_state.watchdog_times.snf = tick;
break;
case CAN_ID_SNR_100Hz:
vehicle_state.watchdog_times.snr = tick;
break;
case CAN_ID_DASHBOARD:
vehicle_state.watchdog_times.db = tick;
// TODO
break;
case CAN_ID_SSU:
// TODO
break;
case CAN_ID_SHUNT_CURRENT:
vehicle_state.watchdog_times.shunt = tick;
// The first two bytes of shunt result messages are metadata
ptr = &data[2];
vehicle_state.ts_current = ftcan_unmarshal_signed(&ptr, 4) * 0.001f;
break;
case CAN_ID_SHUNT_VOLTAGE1:
vehicle_state.watchdog_times.shunt = tick;
ptr = &data[2];
vehicle_state.ts_voltage_bat = ftcan_unmarshal_signed(&ptr, 4) * -0.001f;
break;
case CAN_ID_SHUNT_VOLTAGE2:
vehicle_state.watchdog_times.shunt = tick;
ptr = &data[2];
vehicle_state.ts_voltage_veh = vehicle_state.ts_voltage_bat - (ftcan_unmarshal_signed(&ptr, 4) * -0.001f);
break;
case CAN_ID_SHUNT_TEMPERATURE:
vehicle_state.watchdog_times.shunt = tick;
ptr = &data[2];
vehicle_state.shunt_temperature = ftcan_unmarshal_signed(&ptr, 4) * 0.1f;
break;