From 19b8d96ffe4a8e3041fda82b21619602fb7352a4 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Wed, 2 Sep 2026 09:02:53 +0200 Subject: [PATCH] fix(diag): report real heap/stack stats on ESP32, not just nRF52 DeviceDiag::getHeapStats()/getStackFreeBytes() only had an implementation for NRF52_PLATFORM; every other platform fell through to the 0/0 stub, so Diagnostics > Live showed "N/A" for Heap free and Stack free on ESP32 boards (Heltec v3/v4) -- exactly the boards where that number is most useful to see. Added an ESP32 branch using heap_caps_get_free_size()/ heap_caps_get_total_size() (MALLOC_CAP_8BIT, matching the general-purpose heap `new`/malloc() actually draw from) and the same uxTaskGetStackHighWaterMark() call nRF52 already uses, since Arduino-ESP32 runs on FreeRTOS too. Co-Authored-By: Claude Sonnet 5 --- src/helpers/DeviceDiag.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/helpers/DeviceDiag.cpp b/src/helpers/DeviceDiag.cpp index 117dd72d..1581533b 100644 --- a/src/helpers/DeviceDiag.cpp +++ b/src/helpers/DeviceDiag.cpp @@ -24,6 +24,25 @@ uint32_t DeviceDiag::getStackFreeBytes() { return (uint32_t)uxTaskGetStackHighWaterMark(NULL) * sizeof(StackType_t); } +#elif defined(ESP32) +#include +#include +#include + +// MALLOC_CAP_8BIT: the general-purpose byte-addressable heap (what `new`/ +// malloc() actually draw from) -- excludes DMA-only/IRAM regions a plain +// allocation could never land in, so this matches what's really available to +// the rest of the firmware rather than overstating it with capability pools +// nothing here can use. +void DeviceDiag::getHeapStats(uint32_t& free_bytes, uint32_t& total_bytes) { + free_bytes = (uint32_t)heap_caps_get_free_size(MALLOC_CAP_8BIT); + total_bytes = (uint32_t)heap_caps_get_total_size(MALLOC_CAP_8BIT); +} + +uint32_t DeviceDiag::getStackFreeBytes() { + return (uint32_t)uxTaskGetStackHighWaterMark(NULL) * sizeof(StackType_t); +} + #else void DeviceDiag::getHeapStats(uint32_t& free_bytes, uint32_t& total_bytes) {