diff --git a/src/Power.cpp b/src/Power.cpp index f84c7b71d..dac26e971 100644 --- a/src/Power.cpp +++ b/src/Power.cpp @@ -198,7 +198,7 @@ Power::Power() : OSThread("Power") statusHandler = {}; low_voltage_counter = 0; #ifdef DEBUG_HEAP - lastheap = ESP.getFreeHeap(); + lastheap = memGet.getFreeHeap(); #endif } @@ -302,7 +302,7 @@ void Power::readPowerStatus() powerStatus2.getIsCharging(), powerStatus2.getBatteryVoltageMv(), powerStatus2.getBatteryChargePercent()); newStatus.notifyObservers(&powerStatus2); #ifdef DEBUG_HEAP - if (lastheap != ESP.getFreeHeap()) { + if (lastheap != memGet.getFreeHeap()) { LOG_DEBUG("Threads running:"); int running = 0; for (int i = 0; i < MAX_THREADS; i++) { @@ -313,9 +313,9 @@ void Power::readPowerStatus() } } LOG_DEBUG("\n"); - LOG_DEBUG("Heap status: %d/%d bytes free (%d), running %d/%d threads\n", ESP.getFreeHeap(), ESP.getHeapSize(), - ESP.getFreeHeap() - lastheap, running, concurrency::mainController.size(false)); - lastheap = ESP.getFreeHeap(); + LOG_DEBUG("Heap status: %d/%d bytes free (%d), running %d/%d threads\n", memGet.getFreeHeap(), memGet.getHeapSize(), + memGet.getFreeHeap() - lastheap, running, concurrency::mainController.size(false)); + lastheap = memGet.getFreeHeap(); } #ifdef DEBUG_HEAP_MQTT if (mqtt) { @@ -324,11 +324,11 @@ void Power::readPowerStatus() getMacAddr(dmac); // Get our hardware ID char mac[18]; sprintf(mac, "!%02x%02x%02x%02x", dmac[2], dmac[3], dmac[4], dmac[5]); - auto newHeap = ESP.getFreeHeap(); + auto newHeap = memGet.getFreeHeap(); std::string heapTopic = "msh/2/heap/" + std::string(mac); std::string heapString = std::to_string(newHeap); mqtt->pubSub.publish(heapTopic.c_str(), heapString.c_str(), false); - // auto fragHeap = ESP.getHeapFragmentation(); + // auto fragHeap = memGet.getHeapFragmentation(); auto wifiRSSI = WiFi.RSSI(); heapTopic = "msh/2/wifi/" + std::string(mac); std::string wifiString = std::to_string(wifiRSSI); diff --git a/src/concurrency/OSThread.cpp b/src/concurrency/OSThread.cpp index af50d28f5..c71d3510e 100644 --- a/src/concurrency/OSThread.cpp +++ b/src/concurrency/OSThread.cpp @@ -1,5 +1,6 @@ #include "OSThread.h" #include "configuration.h" +#include "memGet.h" #include namespace concurrency @@ -75,12 +76,12 @@ bool OSThread::shouldRun(unsigned long time) void OSThread::run() { #ifdef DEBUG_HEAP - auto heap = ESP.getFreeHeap(); + auto heap = memGet.getFreeHeap(); #endif currentThread = this; auto newDelay = runOnce(); #ifdef DEBUG_HEAP - auto newHeap = ESP.getFreeHeap(); + auto newHeap = memGet.getFreeHeap(); if (newHeap < heap) LOG_DEBUG("------ Thread %s leaked heap %d -> %d (%d) ------\n", ThreadName.c_str(), heap, newHeap, newHeap - heap); if (heap < newHeap) diff --git a/src/main.cpp b/src/main.cpp index 89148c22b..9f907aee0 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -134,16 +134,14 @@ static int32_t ledBlinker() setLed(ledOn); -#ifdef ARCH_ESP32 - auto newHeap = ESP.getFreeHeap(); - if (newHeap < 11000) { - LOG_DEBUG("\n\n====== heap too low [11000] -> reboot in 1s ======\n\n"); + auto newHeap = memGet.getFreeHeap(); + if (newHeap < 10000) { + LOG_DEBUG("\n\n====== heap too low [10000] -> reboot in 1s ======\n\n"); #ifdef HAS_SCREEN screen->startRebootScreen(); #endif rebootAtMsec = millis() + 900; } -#endif // have a very sparse duty cycle of LED being on, unless charging, then blink 0.5Hz square wave rate to indicate that return powerStatus->getIsCharging() ? 1000 : (ledOn ? 1 : 1000); diff --git a/src/main.h b/src/main.h index b1bee1b06..66de776da 100644 --- a/src/main.h +++ b/src/main.h @@ -4,6 +4,7 @@ #include "NodeStatus.h" #include "PowerStatus.h" #include "graphics/Screen.h" +#include "memGet.h" #include "mesh/generated/meshtastic/telemetry.pb.h" #include #if !defined(ARCH_PORTDUINO) && !defined(ARCH_STM32WL) diff --git a/src/memGet.cpp b/src/memGet.cpp new file mode 100644 index 000000000..9f59d29ff --- /dev/null +++ b/src/memGet.cpp @@ -0,0 +1,46 @@ +#include "memGet.h" +#include "configuration.h" + +MemGet memGet; + +uint32_t MemGet::getFreeHeap() +{ +#ifdef ARCH_ESP32 + return ESP.getFreeHeap(); +#elif defined(ARCH_NRF52) + return dbgHeapFree(); +#else + // this platform does not have heap management function implemented + return UINT32_MAX; +#endif +} + +uint32_t MemGet::getHeapSize() +{ +#ifdef ARCH_ESP32 + return ESP.getHeapSize(); +#elif defined(ARCH_NRF52) + return dbgHeapTotal(); +#else + // this platform does not have heap management function implemented + return UINT32_MAX; +#endif +} + +uint32_t MemGet::getFreePsram() +{ +#ifdef ARCH_ESP32 + return ESP.getFreePsram(); +#else + return 0; +#endif +} + +uint32_t MemGet::getPsramSize() +{ +#ifdef ARCH_ESP32 + return ESP.getPsramSize(); +#else + return 0; +#endif +} diff --git a/src/memGet.h b/src/memGet.h new file mode 100644 index 000000000..130d2ca7e --- /dev/null +++ b/src/memGet.h @@ -0,0 +1,18 @@ +#pragma once +#ifndef _MT_MEMGET_H +#define _MT_MEMGET_H + +#include + +class MemGet +{ + public: + uint32_t getFreeHeap(); + uint32_t getHeapSize(); + uint32_t getFreePsram(); + uint32_t getPsramSize(); +}; + +extern MemGet memGet; + +#endif diff --git a/src/mesh/http/ContentHandler.cpp b/src/mesh/http/ContentHandler.cpp index 8683f9cb1..c77dae1c7 100644 --- a/src/mesh/http/ContentHandler.cpp +++ b/src/mesh/http/ContentHandler.cpp @@ -622,10 +622,10 @@ void handleReport(HTTPRequest *req, HTTPResponse *res) // data->memory JSONObject jsonObjMemory; - jsonObjMemory["heap_total"] = new JSONValue((int)ESP.getHeapSize()); - jsonObjMemory["heap_free"] = new JSONValue((int)ESP.getFreeHeap()); - jsonObjMemory["psram_total"] = new JSONValue((int)ESP.getPsramSize()); - jsonObjMemory["psram_free"] = new JSONValue((int)ESP.getFreePsram()); + jsonObjMemory["heap_total"] = new JSONValue((int)memGet.getHeapSize()); + jsonObjMemory["heap_free"] = new JSONValue((int)memGet.getFreeHeap()); + jsonObjMemory["psram_total"] = new JSONValue((int)memGet.getPsramSize()); + jsonObjMemory["psram_free"] = new JSONValue((int)memGet.getFreePsram()); jsonObjMemory["fs_total"] = new JSONValue((int)FSCom.totalBytes()); jsonObjMemory["fs_used"] = new JSONValue((int)FSCom.usedBytes()); jsonObjMemory["fs_free"] = new JSONValue(int(FSCom.totalBytes() - FSCom.usedBytes())); diff --git a/src/modules/esp32/StoreForwardModule.cpp b/src/modules/esp32/StoreForwardModule.cpp index fbebc77e8..38e983669 100644 --- a/src/modules/esp32/StoreForwardModule.cpp +++ b/src/modules/esp32/StoreForwardModule.cpp @@ -5,6 +5,7 @@ #include "Router.h" #include "airtime.h" #include "configuration.h" +#include "memGet.h" #include "mesh-pb-constants.h" #include "mesh/generated/meshtastic/storeforward.pb.h" #include "modules/ModuleDev.h" @@ -63,8 +64,8 @@ void StoreForwardModule::populatePSRAM() https://learn.upesy.com/en/programmation/psram.html#psram-tab */ - LOG_DEBUG("*** Before PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(), - ESP.getFreePsram(), ESP.getPsramSize()); + LOG_DEBUG("*** Before PSRAM initilization: heap %d/%d PSRAM %d/%d\n", memGet.getFreeHeap(), memGet.getHeapSize(), + memGet.getFreePsram(), memGet.getPsramSize()); this->packetHistoryTXQueue = static_cast(ps_calloc(this->historyReturnMax, sizeof(PacketHistoryStruct))); @@ -72,13 +73,14 @@ void StoreForwardModule::populatePSRAM() /* Use a maximum of 2/3 the available PSRAM unless otherwise specified. Note: This needs to be done after every thing that would use PSRAM */ - uint32_t numberOfPackets = (this->records ? this->records : (((ESP.getFreePsram() / 3) * 2) / sizeof(PacketHistoryStruct))); + uint32_t numberOfPackets = + (this->records ? this->records : (((memGet.getFreePsram() / 3) * 2) / sizeof(PacketHistoryStruct))); this->records = numberOfPackets; this->packetHistory = static_cast(ps_calloc(numberOfPackets, sizeof(PacketHistoryStruct))); - LOG_DEBUG("*** After PSRAM initilization: heap %d/%d PSRAM %d/%d\n", ESP.getFreeHeap(), ESP.getHeapSize(), ESP.getFreePsram(), - ESP.getPsramSize()); + LOG_DEBUG("*** After PSRAM initilization: heap %d/%d PSRAM %d/%d\n", memGet.getFreeHeap(), memGet.getHeapSize(), + memGet.getFreePsram(), memGet.getPsramSize()); LOG_DEBUG("*** numberOfPackets for packetHistory - %u\n", numberOfPackets); } @@ -445,8 +447,8 @@ StoreForwardModule::StoreForwardModule() if ((config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER) || (config.device.role == meshtastic_Config_DeviceConfig_Role_ROUTER_CLIENT)) { LOG_INFO("*** Initializing Store & Forward Module in Router mode\n"); - if (ESP.getPsramSize() > 0) { - if (ESP.getFreePsram() >= 1024 * 1024) { + if (memGet.getPsramSize() > 0) { + if (memGet.getFreePsram() >= 1024 * 1024) { // Do the startup here