heap monitoring features

This commit is contained in:
Yurii
2023-12-15 23:59:20 +03:00
parent 8d92409d7b
commit 21ed8f2a14

View File

@@ -22,6 +22,7 @@ protected:
unsigned long firstFailConnect = 0; unsigned long firstFailConnect = 0;
unsigned int heapSize = 0; unsigned int heapSize = 0;
unsigned int minFreeHeapSize = 0; unsigned int minFreeHeapSize = 0;
unsigned int minMaxFreeHeapBlockSize = 0;
unsigned long restartSignalTime = 0; unsigned long restartSignalTime = 0;
bool heatingEnabled = false; bool heatingEnabled = false;
unsigned long heatingDisabledTime = 0; unsigned long heatingDisabledTime = 0;
@@ -52,13 +53,14 @@ protected:
} }
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
heapSize = ESP.getHeapSize(); this->heapSize = ESP.getHeapSize();
#elif defined(ARDUINO_ARCH_ESP8266) #elif defined(ARDUINO_ARCH_ESP8266)
heapSize = 81920; this->heapSize = 81920;
#elif #elif
heapSize = 99999; this->heapSize = 99999;
#endif #endif
minFreeHeapSize = heapSize; this->minFreeHeapSize = heapSize;
this->minMaxFreeHeapBlockSize = heapSize;
} }
void loop() { void loop() {
@@ -73,7 +75,7 @@ protected:
if (vars.actions.restart) { if (vars.actions.restart) {
Log.sinfoln("MAIN", F("Restart signal received. Restart after 10 sec.")); Log.sinfoln("MAIN", F("Restart signal received. Restart after 10 sec."));
eeSettings.updateNow(); eeSettings.updateNow();
restartSignalTime = millis(); this->restartSignalTime = millis();
vars.actions.restart = false; vars.actions.restart = false;
} }
@@ -88,8 +90,8 @@ protected:
tMqtt->enable(); tMqtt->enable();
} }
if (firstFailConnect != 0) { if (this->firstFailConnect != 0) {
firstFailConnect = 0; this->firstFailConnect = 0;
} }
if ( Log.getLevel() != TinyLogger::Level::INFO && !settings.debug ) { if ( Log.getLevel() != TinyLogger::Level::INFO && !settings.debug ) {
@@ -105,11 +107,11 @@ protected:
} }
if (settings.emergency.enable && !vars.states.emergency) { if (settings.emergency.enable && !vars.states.emergency) {
if (firstFailConnect == 0) { if (this->firstFailConnect == 0) {
firstFailConnect = millis(); this->firstFailConnect = millis();
} }
if (millis() - firstFailConnect > EMERGENCY_TIME_TRESHOLD) { if (millis() - this->firstFailConnect > EMERGENCY_TIME_TRESHOLD) {
vars.states.emergency = true; vars.states.emergency = true;
Log.sinfoln("MAIN", F("Emergency mode enabled")); Log.sinfoln("MAIN", F("Emergency mode enabled"));
} }
@@ -120,7 +122,6 @@ protected:
#ifdef LED_STATUS_PIN #ifdef LED_STATUS_PIN
ledStatus(LED_STATUS_PIN); ledStatus(LED_STATUS_PIN);
#endif #endif
heap();
externalPump(); externalPump();
// anti memory leak // anti memory leak
@@ -131,8 +132,10 @@ protected:
} }
} }
if (restartSignalTime > 0 && millis() - restartSignalTime > 10000) { heap();
restartSignalTime = 0;
if (this->restartSignalTime > 0 && millis() - this->restartSignalTime > 10000) {
this->restartSignalTime = 0;
ESP.restart(); ESP.restart();
} }
} }
@@ -154,21 +157,31 @@ protected:
return; return;
} }
unsigned int minFreeHeapSizeDiff = 0;
#if defined(ARDUINO_ARCH_ESP32) #if defined(ARDUINO_ARCH_ESP32)
uint8_t heapFrag = 0; uint8_t heapFrag = 0;
#else #else
uint8_t heapFrag = ESP.getHeapFragmentation(); uint8_t heapFrag = ESP.getHeapFragmentation();
#endif #endif
if (freeHeapSize < minFreeHeapSize) { unsigned int minFreeHeapSizeDiff = 0;
minFreeHeapSizeDiff = minFreeHeapSize - freeHeapSize; if (freeHeapSize < this->minFreeHeapSize) {
minFreeHeapSize = freeHeapSize; minFreeHeapSizeDiff = this->minFreeHeapSize - freeHeapSize;
this->minFreeHeapSize = freeHeapSize;
} }
if (millis() - lastHeapInfo > 60000 || minFreeHeapSizeDiff > 0) { unsigned int minMaxFreeBlockSizeDiff = 0;
Log.sverboseln("MAIN", F("Free heap size: %u of %u bytes, frag: %hhu, max block: %u, min heap: %u bytes (diff: %u bytes)"), freeHeapSize, heapSize, heapFrag, maxFreeBlockSize, minFreeHeapSize, minFreeHeapSizeDiff); if (maxFreeBlockSize < this->minMaxFreeHeapBlockSize) {
lastHeapInfo = millis(); minMaxFreeBlockSizeDiff = this->minMaxFreeHeapBlockSize - maxFreeBlockSize;
this->minMaxFreeHeapBlockSize = maxFreeBlockSize;
}
if (millis() - this->lastHeapInfo > 20000 || minFreeHeapSizeDiff > 0 || minMaxFreeBlockSizeDiff > 0) {
Log.sverboseln(
"MAIN",
F("Free heap size: %u of %u bytes (min: %u, diff: %u), max free block: %u (min: %u, diff: %u, frag: %hhu)"),
freeHeapSize, this->heapSize, this->minFreeHeapSize, minFreeHeapSizeDiff, maxFreeBlockSize, this->minMaxFreeHeapBlockSize, minMaxFreeBlockSizeDiff, heapFrag
);
this->lastHeapInfo = millis();
} }
} }