add basic system overview screen with can watchdogs and brake pressure
This commit is contained in:
@ -43,7 +43,7 @@ typedef enum {
|
||||
|
||||
typedef enum {
|
||||
SDC_OFF = 0,
|
||||
SDC_PDU_OK = 1, //
|
||||
SDC_PDU_OK = 1,
|
||||
SDC_RES_OK = 2,
|
||||
SDC_AMS_OK = 3,
|
||||
SDC_IMD_OK = 4,
|
||||
@ -218,6 +218,25 @@ typedef struct {
|
||||
uint16_t inv_warnings_1;
|
||||
uint16_t inv_warnings_2;
|
||||
|
||||
struct {
|
||||
bool snf : 1; // sensor node front
|
||||
bool db : 1; // dashboard
|
||||
bool ftcu : 1;
|
||||
bool pdu : 1;
|
||||
bool snr : 1; // sensor node rear
|
||||
bool ams : 1;
|
||||
bool shunt : 1;
|
||||
} watchdog_timeout; // true if watchdog timed out
|
||||
struct {
|
||||
uint32_t snf; // sensor node front
|
||||
uint32_t db; // dashboard
|
||||
uint32_t ftcu;
|
||||
uint32_t pdu;
|
||||
uint32_t snr; // sensor node rear
|
||||
uint32_t ams;
|
||||
uint32_t shunt;
|
||||
} watchdog_times; // last received message
|
||||
|
||||
ParamType last_param_confirmed;
|
||||
|
||||
uint8_t drs_led_active;
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user