#ifndef INC_TS_STATE_MACHINE_H #define INC_TS_STATE_MACHINE_H #include "stm32f3xx_hal.h" #include // Minimum vehicle side voltage to exit precharge #define MIN_VEHICLE_SIDE_VOLTAGE 150000 // mV // Time to wait after reaching 95% of battery voltage before exiting precharge #define PRECHARGE_95_DURATION 500 // ms // Time to wait after there is no more error condition before exiting TS_ERROR #define NO_ERROR_TIME 1000 // ms // Time to wait for charger voltage before going to TS_ERROR #define MAX_CHARGING_CHECK_DURATION 2000 // ms // Time to wait between closing relays #define RELAY_CLOSE_WAIT 10 // ms typedef enum { TS_INACTIVE, TS_ACTIVE, TS_PRECHARGE, TS_DISCHARGE, TS_ERROR, TS_CHARGING_CHECK, TS_CHARGING } TSState; #define TS_ERROR_SOURCE_SHUNT (1 << 0) #define TS_ERROR_SOURCE_SLAVES (1 << 1) typedef struct { TSState current_state; TSState target_state; uint32_t error; } TSStateHandle; extern TSStateHandle ts_state; void ts_sm_init(); void ts_sm_update(); TSState ts_sm_update_inactive(); TSState ts_sm_update_active(); TSState ts_sm_update_precharge(); TSState ts_sm_update_discharge(); TSState ts_sm_update_error(); TSState ts_sm_update_charging_check(); TSState ts_sm_update_charging(); typedef enum { RELAY_NEG, RELAY_POS, RELAY_PRECHARGE } Relay; void ts_sm_set_relay_positions(TSState state); void ts_sm_set_relay_position(Relay relay, int closed); void ts_sm_check_close_wait(int *is_closed, int should_close); void ts_sm_handle_ams_in(uint8_t *data); void ts_sm_set_error_source(uint32_t flag, int state); #endif // INC_TS_STATE_MACHINE_H