From b557d9f0dfbdb3fb9a4d3d6e6ad28f34ac50935e Mon Sep 17 00:00:00 2001 From: Chad Date: Mon, 20 Apr 2026 13:47:56 -0500 Subject: [PATCH] Fix countdown timer overflow using modulo arithmetic --- src/main.cpp | 58 +++++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 19 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 4ad53b0..5a94399 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1178,8 +1178,13 @@ indexY += 65; } lcd.drawString("WiFi: " + wifiStatus, 20, SCREEN_HEIGHT - 20); - int secondsLeft = (REFRESH_INTERVAL - (millis() - lastRefresh)) / 1000; - if (secondsLeft < 0) secondsLeft = 0; + unsigned long elapsed = millis() - lastRefresh; + int secondsLeft; + if (lastRefresh == 0) { + secondsLeft = 0; + } else { + secondsLeft = (REFRESH_INTERVAL - (elapsed % REFRESH_INTERVAL)) / 1000; + } int mins = secondsLeft / 60; int secs = secondsLeft % 60; char timeStr[8]; @@ -1862,8 +1867,13 @@ void drawHardMoneyDetailScreen() { lcd.drawString("WiFi: " + wifiStatus, 20, SCREEN_HEIGHT - 20); lcd.setTextDatum(textdatum_t::middle_center); - int secondsLeft = (REFRESH_INTERVAL - (millis() - lastRefresh)) / 1000; - if (secondsLeft < 0) secondsLeft = 0; + unsigned long elapsed = millis() - lastRefresh; + int secondsLeft; + if (lastRefresh == 0) { + secondsLeft = 0; + } else { + secondsLeft = (REFRESH_INTERVAL - (elapsed % REFRESH_INTERVAL)) / 1000; + } int mins = secondsLeft / 60; int secs = secondsLeft % 60; char timeStr[8]; @@ -2064,13 +2074,18 @@ void setup() { } void drawFooterCountdown() { - int secondsLeft = (REFRESH_INTERVAL - (millis() - lastRefresh)) / 1000; - if (secondsLeft < 0) secondsLeft = 0; + unsigned long elapsed = millis() - lastRefresh; + int secondsLeft; + if (lastRefresh == 0) { + secondsLeft = 0; + } else { + secondsLeft = (REFRESH_INTERVAL - (elapsed % REFRESH_INTERVAL)) / 1000; + } int mins = secondsLeft / 60; int secs = secondsLeft % 60; char timeStr[8]; sprintf(timeStr, "%d:%02d", mins, secs); - + lcd.setFont(&fonts::DejaVu18); lcd.setTextColor(TFT_WHITE, TFT_ORANGE); lcd.setTextDatum(textdatum_t::middle_center); @@ -2142,18 +2157,23 @@ if (currentScreen == SCREEN_DASHBOARD && millis() - lastCountdownUpdate >= 1000) drawFooterCountdown(); } if (currentScreen == SCREEN_HARD_MONEY_DETAIL && millis() - lastCountdownUpdate >= 1000) { - lastCountdownUpdate = millis(); - lcd.setFont(&fonts::DejaVu18); - lcd.setTextColor(TFT_WHITE, TFT_ORANGE); - lcd.setTextDatum(textdatum_t::middle_center); - int secondsLeft = (REFRESH_INTERVAL - (millis() - lastRefresh)) / 1000; - if (secondsLeft < 0) secondsLeft = 0; - int mins = secondsLeft / 60; - int secs = secondsLeft % 60; - char timeStr[8]; - sprintf(timeStr, "%d:%02d", mins, secs); - lcd.drawString(String(timeStr), SCREEN_WIDTH / 2, SCREEN_HEIGHT - 20); -} + lastCountdownUpdate = millis(); + lcd.setFont(&fonts::DejaVu18); + lcd.setTextColor(TFT_WHITE, TFT_ORANGE); + lcd.setTextDatum(textdatum_t::middle_center); + unsigned long elapsed = millis() - lastRefresh; + int secondsLeft; + if (lastRefresh == 0) { + secondsLeft = 0; + } else { + secondsLeft = (REFRESH_INTERVAL - (elapsed % REFRESH_INTERVAL)) / 1000; + } + int mins = secondsLeft / 60; + int secs = secondsLeft % 60; + char timeStr[8]; + sprintf(timeStr, "%d:%02d", mins, secs); + lcd.drawString(String(timeStr), SCREEN_WIDTH / 2, SCREEN_HEIGHT - 20); + } if (currentScreen == SCREEN_HARD_MONEY_DETAIL) { if (hmNeedsRefresh || !btcHmLoaded || !goldHmLoaded || !silverHmLoaded) {