mirror of
https://github.com/dalathegreat/Battery-Emulator.git
synced 2025-10-04 18:29:48 +02:00
Lots of modifications... Hopefully the end
This commit is contained in:
parent
e2faaecfd4
commit
6cb7e55dad
36 changed files with 345 additions and 210 deletions
|
@ -8,9 +8,7 @@ typedef struct {
|
|||
EVENTS_STRUCT_TYPE entries[EVENT_NOF_EVENTS];
|
||||
uint32_t time_seconds;
|
||||
MyTimer second_timer;
|
||||
uint8_t nof_warning_events;
|
||||
uint8_t nof_debug_events;
|
||||
uint8_t nof_error_events;
|
||||
EVENTS_LEVEL_TYPE level;
|
||||
} EVENT_TYPE;
|
||||
|
||||
/* Local variables */
|
||||
|
@ -20,10 +18,8 @@ static const char* EVENTS_LEVEL_TYPE_STRING[] = {EVENTS_LEVEL_TYPE(GENERATE_STRI
|
|||
|
||||
/* Local function prototypes */
|
||||
static void update_event_time(void);
|
||||
static void set_message(EVENTS_ENUM_TYPE event);
|
||||
static void update_led_color(void);
|
||||
static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched);
|
||||
static void update_event_numbers(void);
|
||||
static void update_event_level(void);
|
||||
static void update_bms_status(void);
|
||||
|
||||
/* Exported functions */
|
||||
|
@ -31,6 +27,7 @@ static void update_bms_status(void);
|
|||
/* Main execution function, should handle various continuous functionality */
|
||||
void run_event_handling(void) {
|
||||
update_event_time();
|
||||
run_sequence_on_target();
|
||||
}
|
||||
|
||||
/* Initialization function */
|
||||
|
@ -40,34 +37,31 @@ void init_events(void) {
|
|||
events.entries[EVENT_CAN_FAILURE].data = 0;
|
||||
events.entries[EVENT_CAN_FAILURE].timestamp = 0;
|
||||
events.entries[EVENT_CAN_FAILURE].occurences = 0;
|
||||
events.entries[EVENT_CAN_FAILURE].state = EVENT_STATE_INACTIVE;
|
||||
}
|
||||
|
||||
events.entries[EVENT_CAN_FAILURE].led_color = RED;
|
||||
events.entries[EVENT_CAN_WARNING].led_color = YELLOW;
|
||||
events.entries[EVENT_WATER_INGRESS].led_color = RED;
|
||||
events.entries[EVENT_12V_LOW].led_color = YELLOW;
|
||||
events.entries[EVENT_SOC_PLAUSIBILITY_ERROR].led_color = RED;
|
||||
events.entries[EVENT_KWH_PLAUSIBILITY_ERROR].led_color = YELLOW;
|
||||
events.entries[EVENT_BATTERY_CHG_STOP_REQ].led_color = RED;
|
||||
events.entries[EVENT_BATTERY_DISCHG_STOP_REQ].led_color = RED;
|
||||
events.entries[EVENT_BATTERY_CHG_DISCHG_STOP_REQ].led_color = RED;
|
||||
events.entries[EVENT_LOW_SOH].led_color = RED;
|
||||
events.entries[EVENT_HVIL_FAILURE].led_color = RED;
|
||||
events.entries[EVENT_INTERNAL_OPEN_FAULT].led_color = RED;
|
||||
events.entries[EVENT_CELL_UNDER_VOLTAGE].led_color = RED;
|
||||
events.entries[EVENT_CELL_OVER_VOLTAGE].led_color = RED;
|
||||
events.entries[EVENT_CELL_DEVIATION_HIGH].led_color = YELLOW;
|
||||
events.entries[EVENT_UNKNOWN_EVENT_SET].led_color = RED;
|
||||
events.entries[EVENT_OTA_UPDATE].led_color = BLUE;
|
||||
events.entries[EVENT_DUMMY].led_color = RED;
|
||||
events.entries[EVENT_NOF_EVENTS].led_color = RED;
|
||||
events.entries[EVENT_CAN_FAILURE].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_CAN_WARNING].level = EVENT_LEVEL_WARNING;
|
||||
events.entries[EVENT_WATER_INGRESS].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_12V_LOW].level = EVENT_LEVEL_WARNING;
|
||||
events.entries[EVENT_SOC_PLAUSIBILITY_ERROR].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_KWH_PLAUSIBILITY_ERROR].level = EVENT_LEVEL_WARNING;
|
||||
events.entries[EVENT_BATTERY_CHG_STOP_REQ].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_BATTERY_DISCHG_STOP_REQ].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_BATTERY_CHG_DISCHG_STOP_REQ].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_LOW_SOH].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_HVIL_FAILURE].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_INTERNAL_OPEN_FAULT].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_CELL_UNDER_VOLTAGE].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_CELL_OVER_VOLTAGE].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_CELL_DEVIATION_HIGH].level = EVENT_LEVEL_WARNING;
|
||||
events.entries[EVENT_UNKNOWN_EVENT_SET].level = EVENT_LEVEL_ERROR;
|
||||
events.entries[EVENT_OTA_UPDATE].level = EVENT_LEVEL_DEBUG;
|
||||
events.entries[EVENT_DUMMY_INFO].level = EVENT_LEVEL_INFO;
|
||||
events.entries[EVENT_DUMMY_DEBUG].level = EVENT_LEVEL_DEBUG;
|
||||
events.entries[EVENT_DUMMY_WARNING].level = EVENT_LEVEL_WARNING;
|
||||
events.entries[EVENT_DUMMY_ERROR].level = EVENT_LEVEL_ERROR;
|
||||
|
||||
events.second_timer.interval = 1000;
|
||||
|
||||
events.nof_debug_events = 0;
|
||||
events.nof_error_events = 0;
|
||||
events.nof_warning_events = 0;
|
||||
events.second_timer.set_interval(1000);
|
||||
}
|
||||
|
||||
void set_event(EVENTS_ENUM_TYPE event, uint8_t data) {
|
||||
|
@ -81,96 +75,11 @@ void set_event_latched(EVENTS_ENUM_TYPE event, uint8_t data) {
|
|||
void clear_event(EVENTS_ENUM_TYPE event) {
|
||||
if (events.entries[event].state == EVENT_STATE_ACTIVE) {
|
||||
events.entries[event].state = EVENT_STATE_INACTIVE;
|
||||
update_event_numbers();
|
||||
update_led_color();
|
||||
update_event_level();
|
||||
update_bms_status();
|
||||
}
|
||||
}
|
||||
|
||||
/* Local functions */
|
||||
|
||||
static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched) {
|
||||
// Just some defensive stuff if someone sets an unknown event
|
||||
if (event >= EVENT_NOF_EVENTS) {
|
||||
event = EVENT_UNKNOWN_EVENT_SET;
|
||||
}
|
||||
|
||||
// If the event is already set, no reason to continue
|
||||
if ((events.entries[event].state != EVENT_STATE_ACTIVE) &&
|
||||
(events.entries[event].state != EVENT_STATE_ACTIVE_LATCHED)) {
|
||||
events.entries[event].occurences++;
|
||||
}
|
||||
|
||||
// We should set the event, update event info
|
||||
events.entries[event].timestamp = events.time_seconds;
|
||||
events.entries[event].data = data;
|
||||
// Check if the event is latching
|
||||
events.entries[event].state = latched ? EVENT_STATE_ACTIVE_LATCHED : EVENT_STATE_ACTIVE;
|
||||
|
||||
update_event_numbers();
|
||||
update_led_color();
|
||||
update_bms_status();
|
||||
|
||||
#ifdef DEBUG_VIA_USB
|
||||
Serial.println(get_event_message_string(event));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void update_bms_status(void) {
|
||||
if (events.nof_error_events > 0) {
|
||||
bms_status = FAULT;
|
||||
} else if (events.nof_debug_events > 0) {
|
||||
bms_status = UPDATING;
|
||||
} else if (events.nof_warning_events > 0) {
|
||||
// No bms_status update
|
||||
}
|
||||
}
|
||||
|
||||
static void update_event_numbers(void) {
|
||||
events.nof_error_events = 0;
|
||||
events.nof_debug_events = 0;
|
||||
events.nof_warning_events = 0;
|
||||
for (uint8_t i = 0u; i < EVENT_NOF_EVENTS; i++) {
|
||||
if ((events.entries[i].state == EVENT_STATE_ACTIVE) || (events.entries[i].state == EVENT_STATE_ACTIVE_LATCHED)) {
|
||||
switch (events.entries[i].led_color) {
|
||||
case GREEN:
|
||||
// Just informative
|
||||
break;
|
||||
case YELLOW:
|
||||
events.nof_warning_events++;
|
||||
break;
|
||||
case BLUE:
|
||||
events.nof_debug_events++;
|
||||
break;
|
||||
case RED:
|
||||
events.nof_error_events++;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void update_event_time(void) {
|
||||
unsigned long new_millis = millis();
|
||||
if (events.second_timer.elapsed() == true) {
|
||||
events.time_seconds++;
|
||||
}
|
||||
}
|
||||
|
||||
static void update_led_color(void) {
|
||||
if (events.nof_error_events > 0) {
|
||||
LEDcolor = RED;
|
||||
} else if (events.nof_debug_events > 0) {
|
||||
LEDcolor = BLUE;
|
||||
} else if (events.nof_warning_events > 0) {
|
||||
LEDcolor = YELLOW;
|
||||
} else {
|
||||
LEDcolor = GREEN;
|
||||
}
|
||||
}
|
||||
|
||||
const char* get_event_message_string(EVENTS_ENUM_TYPE event) {
|
||||
switch (event) {
|
||||
case EVENT_CAN_FAILURE:
|
||||
|
@ -207,8 +116,22 @@ const char* get_event_message_string(EVENTS_ENUM_TYPE event) {
|
|||
return "ERROR: HIGH CELL DEVIATION!!! Inspect battery!";
|
||||
case EVENT_UNKNOWN_EVENT_SET:
|
||||
return "An unknown event was set! Review your code!";
|
||||
case EVENT_DUMMY:
|
||||
return "The dummy event was set!"; // Don't change this event message!
|
||||
case EVENT_DUMMY_INFO:
|
||||
return "The dummy info event was set!"; // Don't change this event message!
|
||||
case EVENT_DUMMY_DEBUG:
|
||||
return "The dummy debug event was set!"; // Don't change this event message!
|
||||
case EVENT_DUMMY_WARNING:
|
||||
return "The dummy warning event was set!"; // Don't change this event message!
|
||||
case EVENT_DUMMY_ERROR:
|
||||
return "The dummy error event was set!"; // Don't change this event message!
|
||||
case EVENT_SERIAL_RX_WARNING:
|
||||
return "Error in serial function: No data received for some time, see data for minutes";
|
||||
case EVENT_SERIAL_RX_FAILURE:
|
||||
return "Error in serial function: No data for a long time!";
|
||||
case EVENT_SERIAL_TX_FAILURE:
|
||||
return "Error in serial function: No ACK from receiver!";
|
||||
case EVENT_SERIAL_TRANSMITTER_FAILURE:
|
||||
return "Error in serial function: Some ERROR level fault in transmitter, received by receiver";
|
||||
default:
|
||||
return "";
|
||||
}
|
||||
|
@ -221,9 +144,73 @@ const char* get_event_enum_string(EVENTS_ENUM_TYPE event) {
|
|||
|
||||
const char* get_event_level_string(EVENTS_ENUM_TYPE event) {
|
||||
// Return the event level but skip "EVENT_LEVEL_" that should always be first
|
||||
return EVENTS_LEVEL_TYPE_STRING[event] + 12;
|
||||
return EVENTS_LEVEL_TYPE_STRING[events.entries[event].level] + 12;
|
||||
}
|
||||
|
||||
const EVENTS_STRUCT_TYPE* get_event_pointer(EVENTS_ENUM_TYPE event) {
|
||||
return &events.entries[event];
|
||||
}
|
||||
|
||||
EVENTS_LEVEL_TYPE get_event_level(void) {
|
||||
return events.level;
|
||||
}
|
||||
|
||||
/* Local functions */
|
||||
|
||||
static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched) {
|
||||
// Just some defensive stuff if someone sets an unknown event
|
||||
if (event >= EVENT_NOF_EVENTS) {
|
||||
event = EVENT_UNKNOWN_EVENT_SET;
|
||||
}
|
||||
|
||||
// If the event is already set, no reason to continue
|
||||
if ((events.entries[event].state != EVENT_STATE_ACTIVE) &&
|
||||
(events.entries[event].state != EVENT_STATE_ACTIVE_LATCHED)) {
|
||||
events.entries[event].occurences++;
|
||||
}
|
||||
|
||||
// We should set the event, update event info
|
||||
events.entries[event].timestamp = events.time_seconds;
|
||||
events.entries[event].data = data;
|
||||
// Check if the event is latching
|
||||
events.entries[event].state = latched ? EVENT_STATE_ACTIVE_LATCHED : EVENT_STATE_ACTIVE;
|
||||
|
||||
update_event_level();
|
||||
update_bms_status();
|
||||
|
||||
#ifdef DEBUG_VIA_USB
|
||||
Serial.println(get_event_message_string(event));
|
||||
#endif
|
||||
}
|
||||
|
||||
static void update_bms_status(void) {
|
||||
switch (events.level) {
|
||||
case EVENT_LEVEL_INFO:
|
||||
case EVENT_LEVEL_WARNING:
|
||||
bms_status = ACTIVE;
|
||||
break;
|
||||
case EVENT_LEVEL_DEBUG:
|
||||
bms_status = UPDATING;
|
||||
break;
|
||||
case EVENT_LEVEL_ERROR:
|
||||
bms_status = FAULT;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void update_event_level(void) {
|
||||
events.level = EVENT_LEVEL_INFO;
|
||||
for (uint8_t i = 0u; i < EVENT_NOF_EVENTS; i++) {
|
||||
if ((events.entries[i].state == EVENT_STATE_ACTIVE) || (events.entries[i].state == EVENT_STATE_ACTIVE_LATCHED)) {
|
||||
events.level = max(events.entries[i].level, events.level);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void update_event_time(void) {
|
||||
if (events.second_timer.elapsed() == true) {
|
||||
events.time_seconds++;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue