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;
}
}