From 9993306751183a0a139606034489f035a9bbb137 Mon Sep 17 00:00:00 2001 From: HarukiToreda <116696711+HarukiToreda@users.noreply.github.com> Date: Mon, 31 Mar 2025 14:34:01 -0400 Subject: [PATCH] Add heap leak counter will be removed to be toggled in the future. --- src/graphics/Screen.cpp | 66 +++++++++++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 5 deletions(-) diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 5d4205e8e..a534c0698 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -2488,7 +2488,6 @@ static void drawMemoryScreen(OLEDDisplay *display, OLEDDisplayUiState *state, in // === Layout === const int rowYOffset = FONT_HEIGHT_SMALL - 3; const int barHeight = 6; - const int labelX = x; const int barsOffset = (screenWidth > 128) ? 24 : 0; const int barX = x + 40 + barsOffset; @@ -2496,9 +2495,14 @@ static void drawMemoryScreen(OLEDDisplay *display, OLEDDisplayUiState *state, in int rowY = y + rowYOffset; - auto drawUsageRow = [&](const char *label, uint32_t used, uint32_t total) { - if (total == 0) - return; + // === Heap delta tracking === + static uint32_t previousHeapFree = 0; + static int32_t lastHeapDelta = 0; + static int32_t totalHeapDelta = 0; + static int deltaChangeCount = 0; + + auto drawUsageRow = [&](const char *label, uint32_t used, uint32_t total, bool isHeap = false) { + if (total == 0) return; int percent = (used * 100) / total; @@ -2535,6 +2539,42 @@ static void drawMemoryScreen(OLEDDisplay *display, OLEDDisplayUiState *state, in display->drawString(SCREEN_WIDTH - 2, rowY, combinedStr); rowY += rowYOffset; + + // === Heap delta (inline with heap row only) + if (isHeap && previousHeapFree > 0) { + int32_t delta = (int32_t)(memGet.getFreeHeap() - previousHeapFree); + lastHeapDelta = delta; + + if (delta != 0) { + totalHeapDelta += delta; + deltaChangeCount++; + + char deltaStr[16]; + snprintf(deltaStr, sizeof(deltaStr), "%ld", delta); + + int deltaX = centerX - display->getStringWidth(deltaStr) / 2 - 8; + int deltaY = rowY + 1; + + // Triangle + if (delta > 0) { + display->drawLine(deltaX, deltaY + 6, deltaX + 3, deltaY); + display->drawLine(deltaX + 3, deltaY, deltaX + 6, deltaY + 6); + display->drawLine(deltaX, deltaY + 6, deltaX + 6, deltaY + 6); + } else { + display->drawLine(deltaX, deltaY, deltaX + 3, deltaY + 6); + display->drawLine(deltaX + 3, deltaY + 6, deltaX + 6, deltaY); + display->drawLine(deltaX, deltaY, deltaX + 6, deltaY); + } + + display->setTextAlignment(TEXT_ALIGN_CENTER); + display->drawString(centerX + 6, deltaY, deltaStr); + rowY += rowYOffset; + } + } + + if (isHeap) { + previousHeapFree = memGet.getFreeHeap(); + } }; // === Memory values === @@ -2561,7 +2601,7 @@ static void drawMemoryScreen(OLEDDisplay *display, OLEDDisplayUiState *state, in #endif // === Draw memory rows - drawUsageRow("Heap:", heapUsed, heapTotal); + drawUsageRow("Heap:", heapUsed, heapTotal, true); drawUsageRow("PSRAM:", psramUsed, psramTotal); #ifdef ESP32 if (flashTotal > 0) @@ -2569,6 +2609,22 @@ static void drawMemoryScreen(OLEDDisplay *display, OLEDDisplayUiState *state, in #endif if (hasSD && sdTotal > 0) drawUsageRow("SD:", sdUsed, sdTotal); + + // === Final summary (always visible) + char summaryStr[32]; + snprintf(summaryStr, sizeof(summaryStr), "seen: %dx total: %ldB", deltaChangeCount, totalHeapDelta); + + // Draw triangle manually + int triY = rowY + 4; + int triX = centerX - display->getStringWidth(summaryStr) / 2 - 8; + + display->drawLine(triX, triY + 6, triX + 3, triY); + display->drawLine(triX + 3, triY, triX + 6, triY + 6); + display->drawLine(triX, triY + 6, triX + 6, triY + 6); + + // Draw the text to the right of the triangle + display->setTextAlignment(TEXT_ALIGN_LEFT); + display->drawString(triX + 10, rowY + 2, summaryStr); } #if defined(ESP_PLATFORM) && defined(USE_ST7789)