Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 25 additions & 1 deletion components/ecu/ecu_firmware/Core/Inc/fsm.h
Original file line number Diff line number Diff line change
Expand Up @@ -109,12 +109,36 @@ static void (*FSM_state_table[])(void) = {
DRD_on,
MDU_on,
ECU_monitor,
fault};
fault
};

/*============================================================================*/
/* STATE NAME TABLE */

static const char *FSM_state_name_table[] = {
"FSM_RESET",
"BMS_POWERUP",
"BMS_READY",
"HV_CONNECT",
"SWAP_DCDC",
"DISABLE_MDU_DCH",
"CHECK_LLIM",
"PC_Wait",
"LLIM_CLOSED",
"CHECK_HLIM",
"TELEM_ON",
"MEM_ON",
"DRD_ON",
"MDU_ON",
"MONITORING",
"FAULT"
};

/*============================================================================*/
/* FUNCTION PROTOTYPES */

// FSM
void FSM_Enter_State(FSM_state_t state);
void FSM_Init();
void FSM_run();

Expand Down
95 changes: 33 additions & 62 deletions components/ecu/ecu_firmware/Core/Src/fsm.c
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@ static volatile uint8_t count_awdg_faults = 0;
/*============================================================================*/
/* PRIVATE FUNCTION IMPLEMENTATIONS */

void FSM_Enter_State(FSM_state_t state){
FSM_state = state;
printf("Entering state: %s\r\n", FSM_state_name_table[state]);
}

/**
* @brief Initialization of FSM.
*/
Expand All @@ -54,12 +59,12 @@ void FSM_Init()
__HAL_RCC_CLEAR_RESET_FLAGS();

//IWDG triggered
printf("watchdog-triggered software reset \r\n");
printf("watchdog-triggered software reset \r\n"); // Debug print
ecu_data.status.bits.reset_from_watchdog = 1; //CAN_message now knows watchdog event has occured
FSM_state = FAULT;
FSM_Enter_State(FAULT);
}
else {
FSM_state = FSM_RESET;
FSM_Enter_State(FSM_RESET);
}

return;
Expand All @@ -86,8 +91,6 @@ void FSM_run()
*/
void FSM_reset()
{
printf("Top of FSM reset\r\n");

// Turn fans off
HAL_GPIO_WritePin(PACK_FANS_CTRL_GPIO_Port, PACK_FANS_CTRL_Pin, LOW);
HAL_GPIO_WritePin(MDU_FAN_CTRL_GPIO_Port, MDU_FAN_CTRL_Pin, LOW);
Expand All @@ -102,12 +105,10 @@ void FSM_reset()
// Read supplemental battery
check_supp_voltage();

FSM_state = WAIT_FOR_BMS_POWERUP;
FSM_Enter_State(WAIT_FOR_BMS_POWERUP);

ticks.last_generic_tick = HAL_GetTick();

printf("Bottom of FSM reset \r\n");

return;
}

Expand All @@ -124,16 +125,14 @@ void FSM_reset()
*/
void BMS_powerup()
{
printf("Top of BMS_powerup\r\n");

if (timer_check(BMS_STARTUP_INTERVAL, & (ticks.last_generic_tick) ))
{
FSM_state = FAULT;
FSM_Enter_State(FAULT);
}
else if (HAL_GPIO_ReadPin(FLT_BMS_GPIO_Port, FLT_BMS_Pin) == HIGH)
{
ticks.last_generic_tick = HAL_GetTick();
FSM_state = WAIT_FOR_BMS_READY;
FSM_Enter_State(WAIT_FOR_BMS_READY);
}

return;
Expand All @@ -152,20 +151,16 @@ void BMS_powerup()
*/
void BMS_ready()
{
printf("Top of BMS ready\r\n");

if (timer_check(BMS_STARTUP_INTERVAL, &(ticks.last_generic_tick) ))
{
FSM_state = FAULT;
FSM_Enter_State(FAULT);
}
else if (HAL_GPIO_ReadPin(FLT_BMS_GPIO_Port, FLT_BMS_Pin) == LOW)
{
ticks.last_generic_tick = HAL_GetTick();
FSM_state = HV_CONNECT;
FSM_Enter_State(HV_CONNECT);
}

printf("Bottom of BMS ready\r\n");

return;
}

Expand All @@ -178,8 +173,6 @@ void BMS_ready()
*/
void HV_Connect()
{
printf("Top of HV connect\r\n");

static bool first_delay_tick = false;
static bool second_delay_tick = false;

Expand Down Expand Up @@ -209,7 +202,7 @@ void HV_Connect()
if( timer_check(SHORT_INTERVAL, &(ticks.pos_tick)))
{
ticks.last_generic_tick = HAL_GetTick();
FSM_state = SWAP_DCDC;
FSM_Enter_State(SWAP_DCDC);
}
}
}
Expand All @@ -226,14 +219,12 @@ void HV_Connect()
*/
void swap_DCDC()
{
printf("Top of DCDC\r\n");

HAL_GPIO_WritePin(SWAP_CTRL_GPIO_Port, SWAP_CTRL_Pin, HIGH);
HAL_GPIO_WritePin(PACK_FANS_CTRL_GPIO_Port, PACK_FANS_CTRL_Pin, HIGH);
HAL_GPIO_WritePin(DCH_RST_GPIO_Port, DCH_RST_Pin, HIGH);

ticks.last_generic_tick = HAL_GetTick();
FSM_state = DISABLE_MDU_DCH;
FSM_Enter_State(DISABLE_MDU_DCH);

return;
}
Expand All @@ -251,11 +242,9 @@ void disable_MDU_DCH()
{
HAL_GPIO_WritePin(DCH_RST_GPIO_Port, DCH_RST_Pin, LOW);
ticks.last_generic_tick = HAL_GetTick();
FSM_state = CHECK_LLIM;
FSM_Enter_State(CHECK_LLIM);
}

printf("Bottom of MDU dch\r\n");

return;
}

Expand All @@ -275,17 +264,15 @@ void check_LLIM()
if (HAL_GPIO_ReadPin(LLIM_BMS_GPIO_Port, LLIM_BMS_Pin) == REQ_CONTACTOR_OPEN)
{
last_LLIM_status = CONTACTOR_OPEN;
FSM_state = CHECK_HLIM;
FSM_Enter_State(CHECK_HLIM);
}
else if (HAL_GPIO_ReadPin(LLIM_BMS_GPIO_Port, LLIM_BMS_Pin) == REQ_CONTACTOR_CLOSE)
{
HAL_GPIO_WritePin(PC_CTRL_GPIO_Port, PC_CTRL_Pin, CONTACTOR_CLOSED);
ticks.last_generic_tick = HAL_GetTick();
FSM_state = WAIT_FOR_PC;
FSM_Enter_State(WAIT_FOR_PC);
}

printf("Bottom of check LLIM\r\n");

return;
}

Expand All @@ -303,11 +290,9 @@ void PC_wait()
HAL_GPIO_WritePin(LLIM_CTRL_GPIO_Port, LLIM_CTRL_Pin, CONTACTOR_CLOSED);
last_LLIM_status = CONTACTOR_CLOSED;
ticks.last_generic_tick = HAL_GetTick();
FSM_state = LLIM_CLOSED;
FSM_Enter_State(LLIM_CLOSED);
}

printf("Bottom of PC wait\r\n");

return;
}

Expand All @@ -324,7 +309,7 @@ void LLIM_closed()
{
HAL_GPIO_WritePin(PC_CTRL_GPIO_Port, PC_CTRL_Pin, CONTACTOR_OPEN);
ticks.last_generic_tick = HAL_GetTick();
FSM_state = CHECK_HLIM;
FSM_Enter_State(CHECK_HLIM);
}

return;
Expand Down Expand Up @@ -356,16 +341,14 @@ void check_HLIM()
if (LVS_ALREADY_ON == true)
{
ticks.last_generic_tick = HAL_GetTick();
FSM_state = MONITORING;
FSM_Enter_State(MONITORING);
}
else
{
ticks.last_generic_tick = HAL_GetTick();
FSM_state = TELEM_ON;
FSM_Enter_State(TELEM_ON);
}

printf("Bottom of check HLIM\r\n");

return;
}

Expand All @@ -381,11 +364,9 @@ void TELEM_on()
{
HAL_GPIO_WritePin(TEL_CTRL_GPIO_Port, TEL_CTRL_Pin, HIGH);
ticks.last_generic_tick = HAL_GetTick();
FSM_state = MEM_ON;
FSM_Enter_State(MEM_ON);
}

printf("Bottom of TELEM on\r\n");

return;
}

Expand All @@ -401,11 +382,9 @@ void MEM_on()
{
HAL_GPIO_WritePin(SPAR1_CTRL_GPIO_Port, SPAR1_CTRL_Pin, HIGH);
ticks.last_generic_tick = HAL_GetTick();
FSM_state = DRD_ON;
FSM_Enter_State(DRD_ON);
}

printf("Bottom of MEM on\r\n");

return;
}

Expand All @@ -422,11 +401,9 @@ void DRD_on()
{
HAL_GPIO_WritePin(DRD_CTRL_GPIO_Port, DRD_CTRL_Pin, HIGH);
ticks.last_generic_tick = HAL_GetTick();
FSM_state = MDU_ON;
FSM_Enter_State(MDU_ON);
}

printf("Bottom of DRD on\r\n");

return;
}

Expand All @@ -440,20 +417,18 @@ void MDU_on()
{
// Don't turn on MDU if ESTOP pressed
if(ecu_data.status.bits.estop == true){
FSM_state = MONITORING;
FSM_Enter_State(MONITORING);
return;
}

if (timer_check(LVS_INTERVAL, &(ticks.last_generic_tick) ))
{
HAL_GPIO_WritePin(MDU_CTRL_GPIO_Port, MDU_CTRL_Pin, HIGH);
ticks.last_generic_tick = HAL_GetTick();
FSM_state = MONITORING;
FSM_Enter_State(MONITORING);
LVS_ALREADY_ON = true; // The last LVS board has been powered
}

printf("Bottom of MDU on\r\n");

return;
}

Expand All @@ -466,13 +441,11 @@ void MDU_on()
*/
void ECU_monitor()
{
printf("Top of Monitoring\r\n");

startup_complete = true; // Indicates all LV boards are up

// Additional ESTOP check to catch case where ESTOP is pressed during startup (see note in fault state)
if(ecu_data.status.bits.estop == true){
FSM_state = FAULT;
FSM_Enter_State(FAULT);
return;
}

Expand All @@ -495,7 +468,7 @@ void ECU_monitor()
**************************/
if (HAL_GPIO_ReadPin(FLT_BMS_GPIO_Port, FLT_BMS_Pin) == HIGH && HAL_GPIO_ReadPin(BAL_BMS_GPIO_Port, BAL_BMS_Pin) == LOW)
{
FSM_state = FAULT;
FSM_Enter_State(FAULT);
return;
}

Expand All @@ -516,7 +489,7 @@ void ECU_monitor()
{
HAL_GPIO_WritePin(PC_CTRL_GPIO_Port, PC_CTRL_Pin, CONTACTOR_CLOSED);
ticks.last_generic_tick = HAL_GetTick();
FSM_state = WAIT_FOR_PC;
FSM_Enter_State(WAIT_FOR_PC);
return;
}
else if (HAL_GPIO_ReadPin(LLIM_BMS_GPIO_Port, LLIM_BMS_Pin) == REQ_CONTACTOR_OPEN && last_LLIM_status == CONTACTOR_CLOSED)
Expand Down Expand Up @@ -557,8 +530,6 @@ void ECU_monitor()
*/
void fault()
{
printf("Top of Fault\r\n");

/*************************
Put Pack in Safe State
**************************/
Expand All @@ -571,7 +542,7 @@ void fault()

// If ESTOP pressed during startup, start all LV boards
if(!startup_complete){
FSM_state = TELEM_ON;
FSM_Enter_State(TELEM_ON);
return;
}

Expand Down Expand Up @@ -611,7 +582,7 @@ void FSM_ADC_WindowedAWDGCallback(){

HAL_GPIO_WritePin(DOC_COC_LED_GPIO_Port, DOC_COC_LED_Pin, HIGH);

FSM_state = FAULT;
FSM_Enter_State(FAULT);
FSM_run(); // Immediately transition to fault state
}

Expand All @@ -629,7 +600,7 @@ void FSM_ESTOPActivedCallback()
ecu_data.status.bits.estop = true;
HAL_GPIO_WritePin(ESTOP_LED_GPIO_Port, ESTOP_LED_Pin, HIGH);

FSM_state = FAULT;
FSM_Enter_State(FAULT);
FSM_run(); // Immediately transition to fault state
}

Expand Down