From 742cd74f346d27b093c49ef7f4b9c75643b46ef4 Mon Sep 17 00:00:00 2001 From: TD-er Date: Thu, 20 Aug 2026 12:52:22 +0200 Subject: [PATCH] [EEPROM/RTC] Add timing stats for read/write to EEPROM/RTC --- src/ESPEasy/eeprom/Helpers/EEPROMExternal.cpp | 23 ++++++++++++------- src/ESPEasy/eeprom/Helpers/RTCSRAMStorage.cpp | 14 +++++++++++ src/src/DataStructs/TimingStats.cpp | 10 ++++++++ src/src/DataStructs/TimingStats.h | 10 ++++++++ 4 files changed, 49 insertions(+), 8 deletions(-) diff --git a/src/ESPEasy/eeprom/Helpers/EEPROMExternal.cpp b/src/ESPEasy/eeprom/Helpers/EEPROMExternal.cpp index 3339a43cf..6fd2bf331 100644 --- a/src/ESPEasy/eeprom/Helpers/EEPROMExternal.cpp +++ b/src/ESPEasy/eeprom/Helpers/EEPROMExternal.cpp @@ -1,9 +1,10 @@ #include "../Helpers/EEPROMExternal.h" #if FEATURE_EEPROM_EXTERNAL +# include "../../../ESPEasy_common.h" +# include "../../../src/DataStructs/TimingStats.h" # include "../../../src/Globals/Settings.h" # include "../../../src/Helpers/I2C_access.h" -# include "../../../ESPEasy_common.h" # include "../../../src/Helpers/StringConverter.h" @@ -362,10 +363,17 @@ bool writeEEPROMSlot(uint32_t slot, const uint32_t addr = getEEPROMAddressForSlot(slot); if ((addr != std::numeric_limits::max()) && !isEEPROMExternalWriteProtected()) { - const ESPEASY_RULES_FLOAT_TYPE oldData = EEPROMExternal->readDouble(addr); + ESPEASY_RULES_FLOAT_TYPE oldData{}; + { + START_TIMER; + oldData = EEPROMExternal->readDouble(addr); + STOP_TIMER(READ_EEPROM_SLOT); + } if (!essentiallyEqual(oldData, data)) { + START_TIMER; EEPROMExternal->writeDouble(addr, data); // Always write double size! + STOP_TIMER(WRITE_EEPROM_SLOT); } return true; } @@ -377,15 +385,14 @@ bool writeEEPROMSlot(uint32_t slot, */ ESPEASY_RULES_FLOAT_TYPE readEEPROMSlot(uint32_t slot) { const uint32_t addr = getEEPROMAddressForSlot(slot); + ESPEASY_RULES_FLOAT_TYPE res{}; if (addr != std::numeric_limits::max()) { - return EEPROMExternal->readDouble(addr); + START_TIMER; + res = EEPROMExternal->readDouble(addr); + STOP_TIMER(READ_EEPROM_SLOT); } - # if FEATURE_USE_DOUBLE_AS_ESPEASY_RULES_FLOAT_TYPE - return 0.0; - # else // if FEATURE_USE_DOUBLE_AS_ESPEASY_RULES_FLOAT_TYPE - return 0.0f; - # endif // if FEATURE_USE_DOUBLE_AS_ESPEASY_RULES_FLOAT_TYPE + return res; } } // namespace eeprom diff --git a/src/ESPEasy/eeprom/Helpers/RTCSRAMStorage.cpp b/src/ESPEasy/eeprom/Helpers/RTCSRAMStorage.cpp index 3910c50ee..8f88aa528 100644 --- a/src/ESPEasy/eeprom/Helpers/RTCSRAMStorage.cpp +++ b/src/ESPEasy/eeprom/Helpers/RTCSRAMStorage.cpp @@ -1,5 +1,7 @@ #include "../Helpers/RTCSRAMStorage.h" #if FEATURE_RTC_SRAM_STORAGE + +# include "../../../src/DataStructs/TimingStats.h" # include "../../../src/Globals/Settings.h" # include "../../../src/Helpers/I2C_access.h" # include "../../../ESPEasy_common.h" @@ -170,16 +172,20 @@ bool writeRTCSRAMSlot(uint32_t slot, const ExtTimeSource_e type = Settings.ExtTimeSource(); uint8_t _b[sizeof_rtcsram_slot]{}; + START_TIMER; + switch (type) { case ExtTimeSource_e::DS1307: { RTC_DS1307 rtc; rtc.readnvram(_b, sizeof_rtcsram_slot, addr); + STOP_TIMER(READ_RTC_SLOT); const SRAM_STORAGE_FLOAT_TYPE oldData = *(SRAM_STORAGE_FLOAT_TYPE *)&_b[0]; if (!essentiallyEqual(oldData, data)) { rtc.writenvram(addr, (uint8_t *)&data, sizeof_rtcsram_slot); + STOP_TIMER(WRITE_RTC_SLOT); } return true; } @@ -187,10 +193,12 @@ bool writeRTCSRAMSlot(uint32_t slot, { RTC_DS3231 rtc; rtc.readnvram(_b, sizeof_rtcsram_slot, addr); + STOP_TIMER(READ_RTC_SLOT); const SRAM_STORAGE_FLOAT_TYPE oldData = *(SRAM_STORAGE_FLOAT_TYPE *)&_b[0]; if (!essentiallyEqual(oldData, data)) { rtc.writenvram(addr, (uint8_t *)&data, sizeof_rtcsram_slot); + STOP_TIMER(WRITE_RTC_SLOT); } return true; } @@ -205,10 +213,12 @@ bool writeRTCSRAMSlot(uint32_t slot, } rtc.readnvram(_b, sizeof_rtcsram_slot, addr); + STOP_TIMER(READ_RTC_SLOT); const SRAM_STORAGE_FLOAT_TYPE oldData = *(SRAM_STORAGE_FLOAT_TYPE *)&_b[0]; if (!essentiallyEqual(oldData, data)) { rtc.writenvram(addr, (uint8_t *)&data, sizeof_rtcsram_slot); + STOP_TIMER(WRITE_RTC_SLOT); } return true; } @@ -233,6 +243,7 @@ SRAM_STORAGE_FLOAT_TYPE readRTCSRAMSlot(uint32_t slot) { if ((addr != std::numeric_limits::max()) && (selectRTCSRAMI2CBus() > 0)) { const ExtTimeSource_e type = Settings.ExtTimeSource(); uint8_t _b[sizeof_rtcsram_slot]{}; + START_TIMER; switch (type) { @@ -240,12 +251,14 @@ SRAM_STORAGE_FLOAT_TYPE readRTCSRAMSlot(uint32_t slot) { { RTC_DS1307 rtc; rtc.readnvram(_b, sizeof_rtcsram_slot, addr); + STOP_TIMER(READ_RTC_SLOT); return *(SRAM_STORAGE_FLOAT_TYPE *)&_b[0]; } case ExtTimeSource_e::DS3232: { RTC_DS3231 rtc; rtc.readnvram(_b, sizeof_rtcsram_slot, addr); + STOP_TIMER(READ_RTC_SLOT); return *(SRAM_STORAGE_FLOAT_TYPE *)&_b[0]; } # if FEATURE_EXT_RTC_PCF8583 @@ -259,6 +272,7 @@ SRAM_STORAGE_FLOAT_TYPE readRTCSRAMSlot(uint32_t slot) { } rtc.readnvram(_b, sizeof_rtcsram_slot, addr); + STOP_TIMER(READ_RTC_SLOT); return *(SRAM_STORAGE_FLOAT_TYPE *)&_b[0]; } # endif // if FEATURE_EXT_RTC_PCF8583 diff --git a/src/src/DataStructs/TimingStats.cpp b/src/src/DataStructs/TimingStats.cpp index 22e323278..8752b13f7 100644 --- a/src/src/DataStructs/TimingStats.cpp +++ b/src/src/DataStructs/TimingStats.cpp @@ -285,6 +285,16 @@ const __FlashStringHelper* getMiscStatsName_F(TimingStatsElements stat) { case TimingStatsElements::HANDLE_SERVING_WEBPAGE_JSON: return F("handle webpage JSON"); case TimingStatsElements::WIFI_SCAN_ASYNC: return F("WiFi Scan Async"); case TimingStatsElements::WIFI_SCAN_SYNC: return F("WiFi Scan Sync (blocking)"); + // EEPROM/RTC related +#if FEATURE_EEPROM_EXTERNAL + case TimingStatsElements::READ_EEPROM_SLOT: return F("readEEPROMSlot()"); + case TimingStatsElements::WRITE_EEPROM_SLOT: return F("writeEEPROMSlot()"); +#endif +#if FEATURE_RTC_SRAM_STORAGE + case TimingStatsElements::READ_RTC_SLOT: return F("readRTCSlot()"); + case TimingStatsElements::WRITE_RTC_SLOT: return F("writeRTCSlot()"); +#endif + case TimingStatsElements::NTP_SUCCESS: return F("NTP Success"); case TimingStatsElements::NTP_FAIL: return F("NTP Fail"); case TimingStatsElements::SYSTIME_UPDATED: return F("Systime Set"); diff --git a/src/src/DataStructs/TimingStats.h b/src/src/DataStructs/TimingStats.h index 354140a7a..4d48c0839 100644 --- a/src/src/DataStructs/TimingStats.h +++ b/src/src/DataStructs/TimingStats.h @@ -136,6 +136,16 @@ enum class TimingStatsElements { WIFI_SCAN_ASYNC, WIFI_SCAN_SYNC, + // EEPROM/RTC related +#if FEATURE_EEPROM_EXTERNAL + READ_EEPROM_SLOT, + WRITE_EEPROM_SLOT, +#endif +#if FEATURE_RTC_SRAM_STORAGE + READ_RTC_SLOT, + WRITE_RTC_SLOT, +#endif + // Time sync (also network related) NTP_SUCCESS, NTP_FAIL,