diff --git a/Software/Software.ino b/Software/Software.ino index 09da3129..647532d8 100644 --- a/Software/Software.ino +++ b/Software/Software.ino @@ -55,6 +55,7 @@ const char* version_number = "8.8.dev"; uint16_t intervalUpdateValues = INTERVAL_1_S; // Interval at which to update inverter values / Modbus registers unsigned long previousMillis10ms = 0; unsigned long previousMillisUpdateVal = 0; +unsigned long lastMillisOverflowCheck = 0; // Task time measurement for debugging and for setting CPU load events int64_t core_task_time_us; MyTimer core_task_timer_10s(INTERVAL_10_S); @@ -146,17 +147,8 @@ void setup() { #endif } -// Perform main program functions -void loop() { - START_TIME_MEASUREMENT(loop_func); - run_event_handling(); - END_TIME_MEASUREMENT_MAX(loop_func, datalayer.system.status.loop_task_10s_max_us); -#ifdef FUNCTION_TIME_MEASUREMENT - if (loop_task_timer_10s.elapsed()) { - datalayer.system.status.loop_task_10s_max_us = 0; - } -#endif -} +// Loop empty, all functionality runs in tasks +void loop() {} #if defined(LOG_CAN_TO_SD) || defined(LOG_TO_SD) void logging_loop(void* task_time_us) { @@ -499,6 +491,11 @@ void update_calculated_values() { datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh; } #endif // DOUBLE_BATTERY + // Check if millis() has overflowed. Used in events to keep better track of time + if (millis() < lastMillisOverflowCheck) { // Overflow detected + datalayer.system.status.millisrolloverCount++; + } + lastMillisOverflowCheck = millis(); } void update_values_inverter() { diff --git a/Software/src/datalayer/datalayer.h b/Software/src/datalayer/datalayer.h index 16997595..a1218d27 100644 --- a/Software/src/datalayer/datalayer.h +++ b/Software/src/datalayer/datalayer.h @@ -238,6 +238,8 @@ typedef struct { } DATALAYER_SYSTEM_INFO_TYPE; typedef struct { + /** Millis rollover count. Increments every 49.7 days. Used for keeping track on events */ + uint8_t millisrolloverCount = 0; #ifdef FUNCTION_TIME_MEASUREMENT /** Core task measurement variable */ int64_t core_task_max_us = 0; @@ -247,8 +249,6 @@ typedef struct { int64_t mqtt_task_10s_max_us = 0; /** Wifi sub-task measurement variable, reset each 10 seconds */ int64_t wifi_task_10s_max_us = 0; - /** loop() task measurement variable, reset each 10 seconds */ - int64_t loop_task_10s_max_us = 0; /** OTA handling function measurement variable */ int64_t time_ota_us = 0; diff --git a/Software/src/devboard/utils/events.cpp b/Software/src/devboard/utils/events.cpp index 06f4ed1e..cea0f4eb 100644 --- a/Software/src/devboard/utils/events.cpp +++ b/Software/src/devboard/utils/events.cpp @@ -58,8 +58,6 @@ static EVENT_TYPE events; static const char* EVENTS_ENUM_TYPE_STRING[] = {EVENTS_ENUM_TYPE(GENERATE_STRING)}; static const char* EVENTS_LEVEL_TYPE_STRING[] = {EVENTS_LEVEL_TYPE(GENERATE_STRING)}; -static uint32_t lastMillis = millis(); - /* Local function prototypes */ static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched); static void update_event_level(void); @@ -67,21 +65,6 @@ static void update_bms_status(void); static void log_event(EVENTS_ENUM_TYPE event, uint8_t millisrolloverCount, uint32_t timestamp, uint8_t data); static void print_event_log(void); -uint8_t millisrolloverCount = 0; - -/* Exported functions */ - -/* Main execution function, should handle various continuous functionality */ -void run_event_handling(void) { - uint32_t currentMillis = millis(); - if (currentMillis < lastMillis) { // Overflow detected - millisrolloverCount++; - } - lastMillis = currentMillis; - - update_event_level(); -} - /* Initialization function */ void init_events(void) { @@ -510,7 +493,7 @@ static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched) { // We should set the event, update event info events.entries[event].timestamp = millis(); - events.entries[event].millisrolloverCount = millisrolloverCount; + events.entries[event].millisrolloverCount = datalayer.system.status.millisrolloverCount; events.entries[event].data = data; // Check if the event is latching events.entries[event].state = latched ? EVENT_STATE_ACTIVE_LATCHED : EVENT_STATE_ACTIVE; @@ -583,8 +566,10 @@ static void log_event(EVENTS_ENUM_TYPE event, uint8_t millisrolloverCount, uint3 int entry_address = EE_EVENT_ENTRY_START_ADDRESS + EE_EVENT_ENTRY_SIZE * events.event_log_head_index; // Prepare an event block to write - EVENT_LOG_ENTRY_TYPE entry = { - .event = event, .millisrolloverCount = millisrolloverCount, .timestamp = timestamp, .data = data}; + EVENT_LOG_ENTRY_TYPE entry = {.event = event, + .millisrolloverCount = datalayer.system.status.millisrolloverCount, + .timestamp = timestamp, + .data = data}; // Put the event in (what I guess is) the RAM EEPROM mirror, or write buffer EEPROM.put(entry_address, entry); diff --git a/Software/src/devboard/utils/events.h b/Software/src/devboard/utils/events.h index 2ecf022b..607e7578 100644 --- a/Software/src/devboard/utils/events.h +++ b/Software/src/devboard/utils/events.h @@ -159,8 +159,6 @@ struct EventData { const EVENTS_STRUCT_TYPE* event_pointer; }; -extern uint8_t millisrolloverCount; // number of times millis rollovers - const char* get_event_enum_string(EVENTS_ENUM_TYPE event); const char* get_event_message_string(EVENTS_ENUM_TYPE event); const char* get_event_level_string(EVENTS_ENUM_TYPE event); @@ -177,8 +175,6 @@ void set_event_MQTTpublished(EVENTS_ENUM_TYPE event); const EVENTS_STRUCT_TYPE* get_event_pointer(EVENTS_ENUM_TYPE event); -void run_event_handling(void); - void run_sequence_on_target(void); bool compareEventsByTimestampAsc(const EventData& a, const EventData& b); diff --git a/Software/src/devboard/webserver/events_html.cpp b/Software/src/devboard/webserver/events_html.cpp index a602b938..e548bb71 100644 --- a/Software/src/devboard/webserver/events_html.cpp +++ b/Software/src/devboard/webserver/events_html.cpp @@ -1,4 +1,5 @@ #include "events_html.h" +#include "../../datalayer/datalayer.h" const char EVENTS_HTML_START[] = R"=====(