diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 051f3b31..bcc94d63 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -109,7 +109,13 @@ class HomeScreen : public UIScreen { bool _shutdown_init; AdvertPath recent[UI_RECENT_LIST_SIZE]; - + // Uptime tracking + // Stores the last 32-bit millis() value used to calculate elapsed time. + // uint32_t naturally handles the ~49.7-day millis() rollover. + uint32_t uptime_last_millis = millis(); + // 64-bit accumulated uptime in milliseconds. + // Allows uptime to continue beyond the 49.7-day millis() rollover. + uint64_t uptime_millis = 0; void renderBatteryIndicator(DisplayDriver& display, uint16_t batteryMilliVolts) { // Convert millivolts to percentage #ifndef BATT_MIN_MILLIVOLTS @@ -131,6 +137,27 @@ class HomeScreen : public UIScreen { int iconY = 0; display.setColor(UIColor::title_txt); + // Uptime + uint32_t now = millis(); + uptime_millis += (uint32_t)(now - uptime_last_millis); + uptime_last_millis = now; + + uint64_t uptimeMinutes = uptime_millis / 60000ULL; + char uptime[16]; + if (uptimeMinutes < 60) { + snprintf(uptime, sizeof(uptime), "%lum", (unsigned long)uptimeMinutes); + } else if (uptimeMinutes < 1440) { + snprintf(uptime, sizeof(uptime), "%luh", (unsigned long)(uptimeMinutes / 60)); + } else { + snprintf(uptime, sizeof(uptime), "%lud", (unsigned long)(uptimeMinutes / 1440)); + } + + display.setTextSize(1); + int uptimeWidth = display.getTextWidth(uptime); + int spaceWidth = display.getTextWidth(" "); + display.setCursor(iconX - uptimeWidth - spaceWidth, iconY); // 1 extra space between uptime and battery icon + display.print(uptime); + // battery outline display.drawRect(iconX, iconY, iconWidth, iconHeight);