Fix countdown timer overflow using modulo arithmetic

This commit is contained in:
Chad 2026-04-20 13:47:56 -05:00
parent 62e5882d1f
commit b557d9f0df

View file

@ -1178,8 +1178,13 @@ indexY += 65;
} }
lcd.drawString("WiFi: " + wifiStatus, 20, SCREEN_HEIGHT - 20); lcd.drawString("WiFi: " + wifiStatus, 20, SCREEN_HEIGHT - 20);
int secondsLeft = (REFRESH_INTERVAL - (millis() - lastRefresh)) / 1000; unsigned long elapsed = millis() - lastRefresh;
if (secondsLeft < 0) secondsLeft = 0; int secondsLeft;
if (lastRefresh == 0) {
secondsLeft = 0;
} else {
secondsLeft = (REFRESH_INTERVAL - (elapsed % REFRESH_INTERVAL)) / 1000;
}
int mins = secondsLeft / 60; int mins = secondsLeft / 60;
int secs = secondsLeft % 60; int secs = secondsLeft % 60;
char timeStr[8]; char timeStr[8];
@ -1862,8 +1867,13 @@ void drawHardMoneyDetailScreen() {
lcd.drawString("WiFi: " + wifiStatus, 20, SCREEN_HEIGHT - 20); lcd.drawString("WiFi: " + wifiStatus, 20, SCREEN_HEIGHT - 20);
lcd.setTextDatum(textdatum_t::middle_center); lcd.setTextDatum(textdatum_t::middle_center);
int secondsLeft = (REFRESH_INTERVAL - (millis() - lastRefresh)) / 1000; unsigned long elapsed = millis() - lastRefresh;
if (secondsLeft < 0) secondsLeft = 0; int secondsLeft;
if (lastRefresh == 0) {
secondsLeft = 0;
} else {
secondsLeft = (REFRESH_INTERVAL - (elapsed % REFRESH_INTERVAL)) / 1000;
}
int mins = secondsLeft / 60; int mins = secondsLeft / 60;
int secs = secondsLeft % 60; int secs = secondsLeft % 60;
char timeStr[8]; char timeStr[8];
@ -2064,13 +2074,18 @@ void setup() {
} }
void drawFooterCountdown() { void drawFooterCountdown() {
int secondsLeft = (REFRESH_INTERVAL - (millis() - lastRefresh)) / 1000; unsigned long elapsed = millis() - lastRefresh;
if (secondsLeft < 0) secondsLeft = 0; int secondsLeft;
if (lastRefresh == 0) {
secondsLeft = 0;
} else {
secondsLeft = (REFRESH_INTERVAL - (elapsed % REFRESH_INTERVAL)) / 1000;
}
int mins = secondsLeft / 60; int mins = secondsLeft / 60;
int secs = secondsLeft % 60; int secs = secondsLeft % 60;
char timeStr[8]; char timeStr[8];
sprintf(timeStr, "%d:%02d", mins, secs); sprintf(timeStr, "%d:%02d", mins, secs);
lcd.setFont(&fonts::DejaVu18); lcd.setFont(&fonts::DejaVu18);
lcd.setTextColor(TFT_WHITE, TFT_ORANGE); lcd.setTextColor(TFT_WHITE, TFT_ORANGE);
lcd.setTextDatum(textdatum_t::middle_center); lcd.setTextDatum(textdatum_t::middle_center);
@ -2142,18 +2157,23 @@ if (currentScreen == SCREEN_DASHBOARD && millis() - lastCountdownUpdate >= 1000)
drawFooterCountdown(); drawFooterCountdown();
} }
if (currentScreen == SCREEN_HARD_MONEY_DETAIL && millis() - lastCountdownUpdate >= 1000) { if (currentScreen == SCREEN_HARD_MONEY_DETAIL && millis() - lastCountdownUpdate >= 1000) {
lastCountdownUpdate = millis(); lastCountdownUpdate = millis();
lcd.setFont(&fonts::DejaVu18); lcd.setFont(&fonts::DejaVu18);
lcd.setTextColor(TFT_WHITE, TFT_ORANGE); lcd.setTextColor(TFT_WHITE, TFT_ORANGE);
lcd.setTextDatum(textdatum_t::middle_center); lcd.setTextDatum(textdatum_t::middle_center);
int secondsLeft = (REFRESH_INTERVAL - (millis() - lastRefresh)) / 1000; unsigned long elapsed = millis() - lastRefresh;
if (secondsLeft < 0) secondsLeft = 0; int secondsLeft;
int mins = secondsLeft / 60; if (lastRefresh == 0) {
int secs = secondsLeft % 60; secondsLeft = 0;
char timeStr[8]; } else {
sprintf(timeStr, "%d:%02d", mins, secs); secondsLeft = (REFRESH_INTERVAL - (elapsed % REFRESH_INTERVAL)) / 1000;
lcd.drawString(String(timeStr), SCREEN_WIDTH / 2, SCREEN_HEIGHT - 20); }
} 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 (currentScreen == SCREEN_HARD_MONEY_DETAIL) {
if (hmNeedsRefresh || !btcHmLoaded || !goldHmLoaded || !silverHmLoaded) { if (hmNeedsRefresh || !btcHmLoaded || !goldHmLoaded || !silverHmLoaded) {