|
8 | 8 |
|
9 | 9 | static bool rtd = false; |
10 | 10 |
|
11 | | -static uint32_t rtd_button_press_start_tick = 0; |
| 11 | +static bool rtd_timer_armed = false; |
| 12 | +static uint32_t rtd_trying_to_toggle_start_tick = 0; |
| 13 | +static bool rtd_toggle_complete = false; |
12 | 14 |
|
13 | 15 | // Minimum brake pressure required for RTD activation (safety interlock) |
14 | | -#define RTD_BRAKE_THRESHOLD 25 |
15 | | -static bool previous_rtd_button = false; |
| 16 | +#define RTD_BRAKE_THRESHOLD 5000 |
16 | 17 |
|
17 | | -static Buzzing_State_t buzzing_state = |
18 | | - NOT_BUZZED; // Here to ensure FEB_IO_Play_Buzzer() is not spammed and only called once |
| 18 | +// Any RTD input older than this is treated as missing — RTD will not arm on |
| 19 | +// stale CAN data. Matches BMS_STATE_TIMEOUT_MS. |
| 20 | +#define RTD_INPUT_FRESHNESS_MS 500 |
19 | 21 |
|
20 | 22 | void FEB_State_Update_RTD(void) |
21 | 23 | { |
22 | 24 | // MARK: Start buzzer code |
23 | | - // to react to BMS entering and exiting drive state |
| 25 | + // Buzz on any entry into / exit from BMS_STATE_DRIVE so faults that drop us |
| 26 | + // out of drive (DRIVE -> FAULT_*) still trigger the exit chime. |
24 | 27 | static BMS_State_t previous_bms_state = BMS_STATE_BOOT; |
25 | 28 | BMS_State_t bms_state = FEB_CAN_BMS_GetLastState(); |
26 | | - if (previous_bms_state == BMS_STATE_ENERGIZED && bms_state == BMS_STATE_DRIVE && buzzing_state != BUZZED_ENTER_RTD) |
| 29 | + if (previous_bms_state != BMS_STATE_DRIVE && bms_state == BMS_STATE_DRIVE) |
27 | 30 | { |
28 | 31 | FEB_IO_Play_Buzzer(BUZZER_DURATION_RTD_ENTER); |
29 | | - buzzing_state = BUZZED_ENTER_RTD; |
30 | 32 | } |
31 | | - else if (previous_bms_state == BMS_STATE_DRIVE && bms_state == BMS_STATE_ENERGIZED && |
32 | | - buzzing_state != BUZZED_EXIT_RTD) |
| 33 | + else if (previous_bms_state == BMS_STATE_DRIVE && bms_state != BMS_STATE_DRIVE) |
33 | 34 | { |
34 | 35 | FEB_IO_Play_Buzzer(BUZZER_DURATION_RTD_EXIT); |
35 | | - buzzing_state = BUZZED_EXIT_RTD; |
36 | 36 | } |
37 | 37 | previous_bms_state = bms_state; |
38 | 38 |
|
39 | 39 | // MARK: Signal enter rtd code |
40 | 40 | // Send the ready to drive message over CAN when all the conditions are met |
41 | 41 | IO_States_t states = FEB_IO_GetLastIOStates(); |
42 | | - uint16_t brake_pressure = FEB_CAN_PCU_GetLastBreakPosition(); |
43 | | - int8_t inv_enabled = FEB_CAN_PCU_GetLastRMSEnabled(); |
| 42 | + uint16_t brake_pressure = FEB_CAN_PCU_GetLastBrakePosition(); |
| 43 | + uint8_t inv_enabled = FEB_CAN_PCU_GetLastRMSEnabled(); |
44 | 44 |
|
45 | | - if (previous_rtd_button == false && states.button_rtd) |
| 45 | + bool inputs_fresh = FEB_CAN_PCU_IsBrakeDataFresh(RTD_INPUT_FRESHNESS_MS) && |
| 46 | + FEB_CAN_PCU_IsRMSDataFresh(RTD_INPUT_FRESHNESS_MS) && |
| 47 | + FEB_CAN_BMS_IsDataFresh(RTD_INPUT_FRESHNESS_MS); |
| 48 | + |
| 49 | + // RTD requires: fresh CAN inputs, button held, brake applied, inverter enabled, BMS energized |
| 50 | + // if (inputs_fresh && (brake_pressure >= RTD_BRAKE_THRESHOLD) && (inv_enabled == 1) && |
| 51 | + // (bms_state == BMS_STATE_ENERGIZED) && states.button_rtd) |
| 52 | + if (states.button_rtd) |
| 53 | + { |
| 54 | + if (!rtd_timer_armed) |
| 55 | + { |
| 56 | + rtd_timer_armed = true; |
| 57 | + rtd_trying_to_toggle_start_tick = HAL_GetTick(); |
| 58 | + } |
| 59 | + } |
| 60 | + else |
46 | 61 | { |
47 | | - rtd_button_press_start_tick = HAL_GetTick(); |
| 62 | + rtd_timer_armed = false; |
48 | 63 | } |
49 | 64 |
|
50 | | - // RTD requires: button held, brake applied, and inverter enabled |
51 | | - if (states.button_rtd && rtd_button_press_start_tick + RTD_BUTTON_HOLD_DURATION < HAL_GetTick() && |
52 | | - brake_pressure >= RTD_BRAKE_THRESHOLD && inv_enabled == 1) |
| 65 | + if (rtd_timer_armed && HAL_GetTick() - rtd_trying_to_toggle_start_tick >= RTD_SAFETY_DURATION) |
53 | 66 | { |
54 | | - // FEB_IO_Play_Buzzer(BUZZER_DURATION_RTD_ENTER); |
55 | | - rtd = true; |
| 67 | + if (!rtd_toggle_complete) |
| 68 | + { |
| 69 | + rtd = !rtd; |
| 70 | + rtd_toggle_complete = true; |
| 71 | + } |
| 72 | + } |
| 73 | + else |
| 74 | + { |
| 75 | + rtd_toggle_complete = false; |
56 | 76 | } |
57 | 77 |
|
58 | | - previous_rtd_button = states.button_rtd; |
| 78 | + if (bms_state != BMS_STATE_DRIVE && bms_state != BMS_STATE_ENERGIZED) |
| 79 | + { |
| 80 | + rtd = false; // just in case |
| 81 | + } |
59 | 82 | } |
60 | 83 |
|
61 | 84 | bool FEB_State_GetLastRTD(void) |
|
0 commit comments