From bd62cb991d424721e44cf107de5dbc9ca1a2ed19 Mon Sep 17 00:00:00 2001 From: Sebastian Nieto Date: Tue, 22 Sep 2026 00:19:57 -0300 Subject: [PATCH] fix(ui): inicializar spr.setTextFont(1) y spr.setFreeFont(NULL) para evitar excepcion LoadStoreError al renderizar fuente 1 --- sketch/obd2_gauge/meter.h | 17 ++++++++++++++--- sketch/obd2_gauge/obd2_gauge.ino | 11 +++++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/sketch/obd2_gauge/meter.h b/sketch/obd2_gauge/meter.h index 537a665..ceb039c 100644 --- a/sketch/obd2_gauge/meter.h +++ b/sketch/obd2_gauge/meter.h @@ -1363,13 +1363,18 @@ inline void renderPage1ToSprite(TFT_eSprite &s, int x_offset, int y_slice, int s // 100% Flicker-Free Double-Buffered Mobile Slide Transition // Safe 25KB sprite with pixel-perfect clipping and smooth ease-out pacing inline void animateSlideTransition(bool swipeLeft) { + Serial.println(">>> [DB] animateSlideTransition ENTER"); const int slice_h = 40; // 320x40 = only 25KB (100% safe, leaves 70KB+ free for Bluetooth) const uint8_t numSlices = 240 / slice_h; // exactly 6 slices TFT_eSprite spr(&tft); if (spr.createSprite(320, slice_h) == nullptr) { + Serial.println(">>> [DB] spr.createSprite FAILED (nullptr)!"); return; // Safety fallback } + spr.setTextFont(1); // CRITICAL: initializes textfont=1 and clears uninitialized gfxFont=NULL + spr.setFreeFont(NULL); // CRITICAL: prevents crash in textWidth() when drawing Font 1 on stack sprite + Serial.printf(">>> [DB] Sprite created OK. Heap: %u, MaxAlloc: %u\n", ESP.getFreeHeap(), ESP.getMaxAllocHeap()); const uint8_t FRAMES = 28; // High-density sine ease-out deceleration over 28 frames: @@ -1381,6 +1386,9 @@ inline void animateSlideTransition(bool swipeLeft) { }; for (uint8_t f = 0; f < FRAMES; f++) { + if (f == 0 || f == FRAMES / 2 || f == FRAMES - 1) { + Serial.printf(">>> [DB] Frame %d / %d (heap: %u)\n", f, FRAMES, ESP.getFreeHeap()); + } int16_t shift = step_shifts[f]; int16_t splitX = swipeLeft ? (320 - shift) : shift; int16_t x0 = swipeLeft ? (-shift) : (shift - 320); @@ -1422,15 +1430,14 @@ inline void animateSlideTransition(bool swipeLeft) { } spr.deleteSprite(); // Release the 25KB + Serial.printf(">>> [DB] animateSlideTransition LEAVE (heap: %u)\n", ESP.getFreeHeap()); } /*-------------------*/ // initialize display void initScreen() { terminalLineCount = 0; -#ifdef SERIAL_DEBUG - Serial.printf("Display init, fullScreenCell = %d\n", fullScreenCell); -#endif + Serial.printf(">>> [DB] initScreen START: page=%d, fullScreenCell=%d, heap=%u\n", currentScreenPage, fullScreenCell, ESP.getFreeHeap()); for (int i = 0; i < 4; i++) { pidList[i] = pidConfig[pidInCell[i]][2]; // get PID to list pidReadSkip[i] = pidConfig[pidInCell[i]][6].toInt(); // get read skip @@ -1444,10 +1451,13 @@ void initScreen() { old_data[i] = -999; } if (fullScreenCell >= 0 && fullScreenCell < 4) { + Serial.println(">>> [DB] initScreen: drawing fullScreenMeter"); fullScreenMeter(fullScreenCell, pidInCell[fullScreenCell]); } else if (currentScreenPage == 1) { + Serial.println(">>> [DB] initScreen: drawing drawTriTempScreen(0)"); drawTriTempScreen(0); } else { + Serial.println(">>> [DB] initScreen: drawing Page 0 quadrants"); tft.fillScreen(TFT_BLACK); // clear screen for (uint8_t c = 0; c < 4; c++) { uint8_t pid = pidInCell[c]; @@ -1462,6 +1472,7 @@ void initScreen() { badgeEcoDrawn = false; updateEcoBadge(true); } + Serial.printf(">>> [DB] initScreen FINISHED OK (heap: %u)\n", ESP.getFreeHeap()); } /*-------------------------------*/ diff --git a/sketch/obd2_gauge/obd2_gauge.ino b/sketch/obd2_gauge/obd2_gauge.ino index 96466b1..7925fd7 100644 --- a/sketch/obd2_gauge/obd2_gauge.ino +++ b/sketch/obd2_gauge/obd2_gauge.ino @@ -651,19 +651,29 @@ void loop() { if (waitingForDoubleTap && (millis() - firstTapReleaseTime <= 400)) { // DOUBLE CLICK DETECTED: Switch Screen Page! waitingForDoubleTap = false; + Serial.println(">>> [DB] DOUBLE CLICK DETECTED!"); + Serial.printf(">>> [DB] Free heap: %u, MaxAlloc: %u\n", ESP.getFreeHeap(), ESP.getMaxAllocHeap()); if (fullScreenCell != -1) { fullScreenCell = -1; } if (currentScreenPage == 0) { + Serial.println(">>> [DB] Transitioning Page 0 -> 1"); animateSlideTransition(true); + Serial.println(">>> [DB] Slide done. Setting currentScreenPage = 1"); currentScreenPage = 1; + Serial.println(">>> [DB] Calling initScreen()..."); initScreen(); + Serial.println(">>> [DB] initScreen() completed."); } else { + Serial.println(">>> [DB] Transitioning Page 1 -> 0"); animateSlideTransition(false); + Serial.println(">>> [DB] Slide done. Setting currentScreenPage = 0"); currentScreenPage = 0; + Serial.println(">>> [DB] Calling initScreen()..."); initScreen(); + Serial.println(">>> [DB] initScreen() completed."); } waitForTouchRelease(); lastActivityTime = millis(); @@ -673,6 +683,7 @@ void loop() { firstTapReleaseTime = millis(); firstTapX = lastTouchX; firstTapY = lastTouchY; + Serial.printf(">>> [DB] First tap (X=%d, Y=%d), waiting for 2nd tap...\n", firstTapX, firstTapY); } } }