A FSM Implementation
typedef void(*functionPointer)(); typedef functionPointer(*State)(); State idle(Battery *const battery); State start(Battery *const battery); State measure(Battery *const battery); State estimate_soc(Battery *const battery); State compute_resistance(Battery *const battery); State compute_capacity(Battery *const battery); State balancing(Battery *const battery); State send_data(Battery *const battery); State shutdown(Battery *const battery); #endif /* FSM_H_ */
// Set state to idle State currentState = idle; led_flash(IDLE); while (1) { currentState = (State)currentState(r_battery); } State idle(Battery *const battery){ HAL_UART_Receive_IT(&huart3, UART_receive_buffer, RX_BUFFER_LENGTH); if(restart_charge){ HAL_TIM_Base_Stop_IT(&htim3); battery->is_charging = true; return start; } else if(restart_discharge){ HAL_TIM_Base_Stop_IT(&htim3); battery->is_charging = false; discharge_led(); return start; } restart_charge = false; restart_discharge = false; tx_data = false; return idle; } State start(Battery *const battery){ start_cycle(); led_flash(START); // Initialise the SoC estimation model init_soc_model(); // Set under and over voltage thresholds set_UV_OV_threshold(); turn_off_balancing(battery); // Add 1s delay HAL_Delay(1000); if(restart_charge) { battery->is_charging = true; restart_charge = false; return start; } else if(restart_discharge){ battery->is_charging = false; restart_discharge = false; return start; } else if (tx_data) { return send_data; } else { return measure; } }