Move millis() check into datalayer

This commit is contained in:
Daniel Öster 2025-03-06 22:45:42 +02:00
parent 873c5e249e
commit 51b0e80132
5 changed files with 15 additions and 15 deletions

View file

@ -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 uint16_t intervalUpdateValues = INTERVAL_1_S; // Interval at which to update inverter values / Modbus registers
unsigned long previousMillis10ms = 0; unsigned long previousMillis10ms = 0;
unsigned long previousMillisUpdateVal = 0; unsigned long previousMillisUpdateVal = 0;
unsigned long lastMillisOverflowCheck = 0;
// Task time measurement for debugging and for setting CPU load events // Task time measurement for debugging and for setting CPU load events
int64_t core_task_time_us; int64_t core_task_time_us;
MyTimer core_task_timer_10s(INTERVAL_10_S); MyTimer core_task_timer_10s(INTERVAL_10_S);
@ -490,6 +491,11 @@ void update_calculated_values() {
datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh; datalayer.battery.status.reported_remaining_capacity_Wh = datalayer.battery2.status.remaining_capacity_Wh;
} }
#endif // DOUBLE_BATTERY #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() { void update_values_inverter() {

View file

@ -238,6 +238,8 @@ typedef struct {
} DATALAYER_SYSTEM_INFO_TYPE; } DATALAYER_SYSTEM_INFO_TYPE;
typedef struct { typedef struct {
/** Millis rollover count. Increments every 49.7 days. Used for keeping track on events */
uint8_t millisrolloverCount = 0;
#ifdef FUNCTION_TIME_MEASUREMENT #ifdef FUNCTION_TIME_MEASUREMENT
/** Core task measurement variable */ /** Core task measurement variable */
int64_t core_task_max_us = 0; int64_t core_task_max_us = 0;

View file

@ -68,8 +68,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 log_event(EVENTS_ENUM_TYPE event, uint8_t millisrolloverCount, uint32_t timestamp, uint8_t data);
static void print_event_log(void); static void print_event_log(void);
uint8_t millisrolloverCount = 0;
/* Initialization function */ /* Initialization function */
void init_events(void) { void init_events(void) {
@ -227,13 +225,6 @@ void set_event_latched(EVENTS_ENUM_TYPE event, uint8_t data) {
} }
void clear_event(EVENTS_ENUM_TYPE event) { void clear_event(EVENTS_ENUM_TYPE event) {
//Not related to clearing, but good time to check if we have rollover on millis
currentMillis = millis();
if (currentMillis < lastMillis) { // Overflow detected
millisrolloverCount++;
}
lastMillis = currentMillis;
if (events.entries[event].state == EVENT_STATE_ACTIVE) { if (events.entries[event].state == EVENT_STATE_ACTIVE) {
events.entries[event].state = EVENT_STATE_INACTIVE; events.entries[event].state = EVENT_STATE_INACTIVE;
update_event_level(); update_event_level();
@ -505,7 +496,7 @@ static void set_event(EVENTS_ENUM_TYPE event, uint8_t data, bool latched) {
// We should set the event, update event info // We should set the event, update event info
events.entries[event].timestamp = millis(); events.entries[event].timestamp = millis();
events.entries[event].millisrolloverCount = millisrolloverCount; events.entries[event].millisrolloverCount = datalayer.system.status.millisrolloverCount;
events.entries[event].data = data; events.entries[event].data = data;
// Check if the event is latching // Check if the event is latching
events.entries[event].state = latched ? EVENT_STATE_ACTIVE_LATCHED : EVENT_STATE_ACTIVE; events.entries[event].state = latched ? EVENT_STATE_ACTIVE_LATCHED : EVENT_STATE_ACTIVE;
@ -578,8 +569,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; int entry_address = EE_EVENT_ENTRY_START_ADDRESS + EE_EVENT_ENTRY_SIZE * events.event_log_head_index;
// Prepare an event block to write // Prepare an event block to write
EVENT_LOG_ENTRY_TYPE entry = { EVENT_LOG_ENTRY_TYPE entry = {.event = event,
.event = event, .millisrolloverCount = millisrolloverCount, .timestamp = timestamp, .data = data}; .millisrolloverCount = datalayer.system.status.millisrolloverCount,
.timestamp = timestamp,
.data = data};
// Put the event in (what I guess is) the RAM EEPROM mirror, or write buffer // Put the event in (what I guess is) the RAM EEPROM mirror, or write buffer
EEPROM.put(entry_address, entry); EEPROM.put(entry_address, entry);

View file

@ -159,8 +159,6 @@ struct EventData {
const EVENTS_STRUCT_TYPE* event_pointer; 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_enum_string(EVENTS_ENUM_TYPE event);
const char* get_event_message_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); const char* get_event_level_string(EVENTS_ENUM_TYPE event);

View file

@ -1,4 +1,5 @@
#include "events_html.h" #include "events_html.h"
#include "../../datalayer/datalayer.h"
const char EVENTS_HTML_START[] = R"=====( const char EVENTS_HTML_START[] = R"=====(
<style>body{background-color:#000;color:#fff}.event-log{display:flex;flex-direction:column}.event{display:flex;flex-wrap:wrap;border:1px solid #fff;padding:10px}.event>div{flex:1;min-width:100px;max-width:90%;word-break:break-word}</style><div style="background-color:#303e47;padding:10px;margin-bottom:10px;border-radius:25px"><div class="event-log"><div class="event" style="background-color:#1e2c33;font-weight:700"><div>Event Type</div><div>Severity</div><div>Last Event</div><div>Count</div><div>Data</div><div>Message</div></div> <style>body{background-color:#000;color:#fff}.event-log{display:flex;flex-direction:column}.event{display:flex;flex-wrap:wrap;border:1px solid #fff;padding:10px}.event>div{flex:1;min-width:100px;max-width:90%;word-break:break-word}</style><div style="background-color:#303e47;padding:10px;margin-bottom:10px;border-radius:25px"><div class="event-log"><div class="event" style="background-color:#1e2c33;font-weight:700"><div>Event Type</div><div>Severity</div><div>Last Event</div><div>Count</div><div>Data</div><div>Message</div></div>
@ -48,7 +49,7 @@ String events_processor(const String& var) {
content.concat("<div class='event'>"); content.concat("<div class='event'>");
content.concat("<div>" + String(get_event_enum_string(event_handle)) + "</div>"); content.concat("<div>" + String(get_event_enum_string(event_handle)) + "</div>");
content.concat("<div>" + String(get_event_level_string(event_handle)) + "</div>"); content.concat("<div>" + String(get_event_level_string(event_handle)) + "</div>");
content.concat("<div class='sec-ago'>" + String(millisrolloverCount) + ";" + content.concat("<div class='sec-ago'>" + String(datalayer.system.status.millisrolloverCount) + ";" +
String(timestamp_now - event_pointer->timestamp) + "</div>"); String(timestamp_now - event_pointer->timestamp) + "</div>");
content.concat("<div>" + String(event_pointer->occurences) + "</div>"); content.concat("<div>" + String(event_pointer->occurences) + "</div>");
content.concat("<div>" + String(event_pointer->data) + "</div>"); content.concat("<div>" + String(event_pointer->data) + "</div>");