From a4c7710965feda5c9b53f0a78939842f23bb8d0d Mon Sep 17 00:00:00 2001 From: Chris Pyle Date: Mon, 15 Sep 2025 17:30:31 -0400 Subject: [PATCH 1/6] state rejection reasons --- Core/Inc/state_machine.h | 12 ++++++++++++ Core/Src/state_machine.c | 23 +++++++++++++++++++++++ Drivers/Embedded-Base | 2 +- 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Core/Inc/state_machine.h b/Core/Inc/state_machine.h index c811b23f..4c3dcf70 100644 --- a/Core/Inc/state_machine.h +++ b/Core/Inc/state_machine.h @@ -38,6 +38,17 @@ typedef enum { MAX_NERO_STATES } nero_menu_t; +typedef enum { + NO_ERROR, + REVERSE_DISABLED, + DRIVE_FROM_FAULT, + ENTER_DRIVE_DISABLED, + ENTER_DRIVE_TSMS_OFF, + ENTER_DRIVE_BREAKS_NOT_ENGAGED, + ENTER_GAMES_TSMS_ON, + ENTER_GAMES_WHILE_MOVING +} state_transition_error_t; + typedef struct { nero_menu_t nero_index; bool home_mode; @@ -50,6 +61,7 @@ typedef struct { typedef struct { func_state_t functional; nero_state_t nero; + uint8_t transition_error; } state_t; typedef struct { diff --git a/Core/Src/state_machine.c b/Core/Src/state_machine.c index 3f730b4a..c8a51fef 100644 --- a/Core/Src/state_machine.c +++ b/Core/Src/state_machine.c @@ -56,6 +56,7 @@ static void send_nero_msg(dti_t *mc) bitstream_add(&nero_msg, cerberus_state.functional != F_REVERSE, 1); bitstream_add(&nero_msg, get_regen_limit(), 10); bitstream_add(&nero_msg, get_launch_control(), 1); + bitstream_add(&nero_msg, cerberus_state.transition_error, 8); can_msg_t msg = { .id = 0x501, .len = sizeof(bitstream_data) }; @@ -119,6 +120,7 @@ static int transition_functional_state(func_state_t new_state, pdu_t *pdu, case F_REVERSE: #ifdef DISABLE_REVERSE printf("Reverse is disabled."); + cerberus_state.transition_error = (1 << REVERSE_DISABLED); return 4; #endif osTimerStart(reverse_sound_timer, pdMS_TO_TICKS(500)); @@ -132,22 +134,36 @@ static int transition_functional_state(func_state_t new_state, pdu_t *pdu, (!brake_state || cerberus_state.functional == FAULTED)) { // only enforce brake / fault if tsms is actually on + if (!brake_state) { + cerberus_state.transition_error |= (1 << ENTER_DRIVE_BREAKS_NOT_ENGAGED); + } + if (cerberus_state.functional == FAULTED) { + cerberus_state.transition_error |= (1 << DRIVE_FROM_FAULT); + } return 3; } printf("Ignoring tsms\n\n"); #else if (cerberus_state.functional == FAULTED) { printf("Cannot drive from a fault!\n"); + cerberus_state.transition_error |= (1 << DRIVE_FROM_FAULT); return 3; } if (!enter_drive_enabled) { printf("Must wait before entering drive!"); + cerberus_state.transition_error |= (1 << ENTER_DRIVE_DISABLED); return 3; } /* Only turn on motor if brakes engaged and tsms is on */ if (!brake_state || !get_tsms()) { + if (!brake_state) { + cerberus_state.transition_error |= (1 << ENTER_DRIVE_BREAKS_NOT_ENGAGED); + } + if (!get_tsms()) { + cerberus_state.transition_error |= (1 << ENTER_DRIVE_TSMS_OFF); + } return 3; } #endif @@ -196,6 +212,12 @@ static int transition_nero_state(nero_state_t new_state, pdu_t *pdu, dti_t *mc, if (new_state.nero_index == GAMES) { #ifndef TSMS_OVERRIDE if (get_tsms() || dti_get_mph(mc) >= 1) { + if (get_tsms()) { + cerberus_state.transition_error |= (1 << ENTER_GAMES_TSMS_ON); + } + if (dti_get_mph(mc) >= 1) { + cerberus_state.transition_error |= (1 << ENTER_GAMES_WHILE_MOVING); + } return 1; } #endif @@ -319,6 +341,7 @@ void rising_ts_cb(void *args) void vStateMachineDirector(void *pv_params) { cerberus_state.functional = READY; + cerberus_state.transition_error = NO_ERROR; cerberus_state.nero.nero_index = 0; cerberus_state.nero.home_mode = true; diff --git a/Drivers/Embedded-Base b/Drivers/Embedded-Base index 1bffad75..d1e541e9 160000 --- a/Drivers/Embedded-Base +++ b/Drivers/Embedded-Base @@ -1 +1 @@ -Subproject commit 1bffad75d8a2a7ec58f6512753d40ea6e2865296 +Subproject commit d1e541e959a90a601d71657472568bbbfa1e7045 From 8fa5828b5662cfed71b9c212772ebb3cec29204d Mon Sep 17 00:00:00 2001 From: Chris Pyle Date: Tue, 16 Sep 2025 09:01:03 -0400 Subject: [PATCH 2/6] bit shift in enum values --- Core/Inc/state_machine.h | 16 ++++++++-------- Core/Src/state_machine.c | 18 +++++++++--------- Drivers/Embedded-Base | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Core/Inc/state_machine.h b/Core/Inc/state_machine.h index 4c3dcf70..cd0c8ca7 100644 --- a/Core/Inc/state_machine.h +++ b/Core/Inc/state_machine.h @@ -39,14 +39,14 @@ typedef enum { } nero_menu_t; typedef enum { - NO_ERROR, - REVERSE_DISABLED, - DRIVE_FROM_FAULT, - ENTER_DRIVE_DISABLED, - ENTER_DRIVE_TSMS_OFF, - ENTER_DRIVE_BREAKS_NOT_ENGAGED, - ENTER_GAMES_TSMS_ON, - ENTER_GAMES_WHILE_MOVING + START_TRANSITION_OK = 0, + REVERSE_DISABLED = 1 << 0, + DRIVE_FROM_FAULT = 1 << 1, + ENTER_DRIVE_DISABLED = 1 << 2, + ENTER_DRIVE_TSMS_OFF = 1 << 3, + ENTER_DRIVE_BREAKS_NOT_ENGAGED = 1 << 4, + ENTER_GAMES_TSMS_ON = 1 << 5, + ENTER_GAMES_WHILE_MOVING = 1 << 6 } state_transition_error_t; typedef struct { diff --git a/Core/Src/state_machine.c b/Core/Src/state_machine.c index c8a51fef..f89995aa 100644 --- a/Core/Src/state_machine.c +++ b/Core/Src/state_machine.c @@ -135,10 +135,10 @@ static int transition_functional_state(func_state_t new_state, pdu_t *pdu, cerberus_state.functional == FAULTED)) { // only enforce brake / fault if tsms is actually on if (!brake_state) { - cerberus_state.transition_error |= (1 << ENTER_DRIVE_BREAKS_NOT_ENGAGED); + cerberus_state.transition_error |= ENTER_DRIVE_BREAKS_NOT_ENGAGED; } if (cerberus_state.functional == FAULTED) { - cerberus_state.transition_error |= (1 << DRIVE_FROM_FAULT); + cerberus_state.transition_error |= DRIVE_FROM_FAULT; } return 3; } @@ -146,23 +146,23 @@ static int transition_functional_state(func_state_t new_state, pdu_t *pdu, #else if (cerberus_state.functional == FAULTED) { printf("Cannot drive from a fault!\n"); - cerberus_state.transition_error |= (1 << DRIVE_FROM_FAULT); + cerberus_state.transition_error |= DRIVE_FROM_FAULT; return 3; } if (!enter_drive_enabled) { printf("Must wait before entering drive!"); - cerberus_state.transition_error |= (1 << ENTER_DRIVE_DISABLED); + cerberus_state.transition_error |= ENTER_DRIVE_DISABLED; return 3; } /* Only turn on motor if brakes engaged and tsms is on */ if (!brake_state || !get_tsms()) { if (!brake_state) { - cerberus_state.transition_error |= (1 << ENTER_DRIVE_BREAKS_NOT_ENGAGED); + cerberus_state.transition_error |= ENTER_DRIVE_BREAKS_NOT_ENGAGED; } if (!get_tsms()) { - cerberus_state.transition_error |= (1 << ENTER_DRIVE_TSMS_OFF); + cerberus_state.transition_error |= ENTER_DRIVE_TSMS_OFF; } return 3; } @@ -213,10 +213,10 @@ static int transition_nero_state(nero_state_t new_state, pdu_t *pdu, dti_t *mc, #ifndef TSMS_OVERRIDE if (get_tsms() || dti_get_mph(mc) >= 1) { if (get_tsms()) { - cerberus_state.transition_error |= (1 << ENTER_GAMES_TSMS_ON); + cerberus_state.transition_error |= ENTER_GAMES_TSMS_ON; } if (dti_get_mph(mc) >= 1) { - cerberus_state.transition_error |= (1 << ENTER_GAMES_WHILE_MOVING); + cerberus_state.transition_error |= ENTER_GAMES_WHILE_MOVING; } return 1; } @@ -341,7 +341,7 @@ void rising_ts_cb(void *args) void vStateMachineDirector(void *pv_params) { cerberus_state.functional = READY; - cerberus_state.transition_error = NO_ERROR; + cerberus_state.transition_error = START_TRANSITION_OK; cerberus_state.nero.nero_index = 0; cerberus_state.nero.home_mode = true; diff --git a/Drivers/Embedded-Base b/Drivers/Embedded-Base index d1e541e9..77243c27 160000 --- a/Drivers/Embedded-Base +++ b/Drivers/Embedded-Base @@ -1 +1 @@ -Subproject commit d1e541e959a90a601d71657472568bbbfa1e7045 +Subproject commit 77243c27239818d0de3930f8d50f1dca40734b75 From ae68bef9220d11d913aa80061c8cd03984832d53 Mon Sep 17 00:00:00 2001 From: Chris Pyle Date: Tue, 16 Sep 2025 22:06:50 -0400 Subject: [PATCH 3/6] add to 1 --- Drivers/Embedded-Base | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Drivers/Embedded-Base b/Drivers/Embedded-Base index 77243c27..03726f9a 160000 --- a/Drivers/Embedded-Base +++ b/Drivers/Embedded-Base @@ -1 +1 @@ -Subproject commit 77243c27239818d0de3930f8d50f1dca40734b75 +Subproject commit 03726f9ac83db0f5a12f6f1f55adec058d07b204 From 60413b58c8b763bdab48b36b3ede20e0e6ae637c Mon Sep 17 00:00:00 2001 From: Chris Pyle Date: Tue, 16 Sep 2025 22:19:43 -0400 Subject: [PATCH 4/6] right size for state --- Core/Src/state_machine.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Src/state_machine.c b/Core/Src/state_machine.c index f89995aa..6d7c7b85 100644 --- a/Core/Src/state_machine.c +++ b/Core/Src/state_machine.c @@ -44,7 +44,7 @@ static bool enter_drive_enabled = false; static void send_nero_msg(dti_t *mc) { bitstream_t nero_msg; - uint8_t bitstream_data[6]; + uint8_t bitstream_data[7]; bitstream_init(&nero_msg, bitstream_data, 6); // Create 5-byte bitstream From b0ba15fe5e70929f855915019ee14bbbb51c2d4c Mon Sep 17 00:00:00 2001 From: Chris Pyle Date: Tue, 16 Sep 2025 22:32:56 -0400 Subject: [PATCH 5/6] another size issue --- Core/Src/state_machine.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Core/Src/state_machine.c b/Core/Src/state_machine.c index 6d7c7b85..84676981 100644 --- a/Core/Src/state_machine.c +++ b/Core/Src/state_machine.c @@ -46,7 +46,7 @@ static void send_nero_msg(dti_t *mc) bitstream_t nero_msg; uint8_t bitstream_data[7]; bitstream_init(&nero_msg, bitstream_data, - 6); // Create 5-byte bitstream + 7); // Create 5-byte bitstream bitstream_add(&nero_msg, get_nero_state().home_mode, 4); bitstream_add(&nero_msg, get_nero_state().nero_index, 4); From ff12e35a3b937135eb718947658af20917c06b22 Mon Sep 17 00:00:00 2001 From: Chris Pyle Date: Sun, 21 Sep 2025 16:28:55 -0400 Subject: [PATCH 6/6] check both conditions before short circuit --- Core/Src/state_machine.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Core/Src/state_machine.c b/Core/Src/state_machine.c index 84676981..0e4c3cf0 100644 --- a/Core/Src/state_machine.c +++ b/Core/Src/state_machine.c @@ -144,15 +144,15 @@ static int transition_functional_state(func_state_t new_state, pdu_t *pdu, } printf("Ignoring tsms\n\n"); #else + cerberus_state.transition_error |= (cerberus_state.functional == FAULTED ? DRIVE_FROM_FAULT : 0); + cerberus_state.transition_error |= (!enter_drive_enabled ? ENTER_DRIVE_DISABLED : 0); if (cerberus_state.functional == FAULTED) { printf("Cannot drive from a fault!\n"); - cerberus_state.transition_error |= DRIVE_FROM_FAULT; return 3; } if (!enter_drive_enabled) { printf("Must wait before entering drive!"); - cerberus_state.transition_error |= ENTER_DRIVE_DISABLED; return 3; }