From 6e13ad59ae0bcf71bb74303c13ad46fa15191a04 Mon Sep 17 00:00:00 2001 From: Jakub <106778416+MarekZegare4@users.noreply.github.com> Date: Wed, 7 Oct 2026 18:39:58 +0200 Subject: [PATCH] feat(ui-new): a bolt beside the battery while USB power is connected Co-Authored-By: Claude Sonnet 5.5 --- examples/companion_radio/ui-new/UITask.cpp | 3 ++- examples/companion_radio/ui-new/icons.h | 25 ++++++++++++++++++++++ variants/sim/SimMainBoard.h | 8 +++++++ 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/examples/companion_radio/ui-new/UITask.cpp b/examples/companion_radio/ui-new/UITask.cpp index 4d04fb96..241d44e2 100644 --- a/examples/companion_radio/ui-new/UITask.cpp +++ b/examples/companion_radio/ui-new/UITask.cpp @@ -766,7 +766,7 @@ class HomeScreen : public UIScreen { // icon won't fit above the reserved area, every lower-priority icon after // it is dropped too (the list is ordered high→low). // - // Priority: BT > GPS fix > alarm > mute > auto-advert > trail > live-share > + // Priority: power > BT > GPS fix > alarm > mute > auto-advert > trail > live-share > // repeater. Battery (drawn above) is always rightmost. The background modes // (advert / trail / live-share / repeater) stay outside any BT gate — they // keep running with Bluetooth off, so their cue must not vanish with it. @@ -782,6 +782,7 @@ class HomeScreen : public UIScreen { const bool gps_fix = gps_on && loc->isValid(); struct Sicon { bool active; const MiniIcon* icon; }; const Sicon icons[] = { + { board.isExternalPowered(), &ICON_CHARGE }, // USB power: next to the battery { _task->isSerialEnabled() && _task->isBLEConnected(), &ICON_BLUETOOTH }, { gps_on, gps_fix ? &ICON_GPS : &ICON_GPS_SEARCH }, { _node_prefs && _node_prefs->alarm_on, &ICON_ALARM }, diff --git a/examples/companion_radio/ui-new/icons.h b/examples/companion_radio/ui-new/icons.h index ed022aac..1757715a 100644 --- a/examples/companion_radio/ui-new/icons.h +++ b/examples/companion_radio/ui-new/icons.h @@ -488,6 +488,16 @@ MINI_ICON(ICON_ALARM, 9, // bell — an alarm is armed packRow("#########"), packRow("........."), packRow("...###...")); +MINI_ICON(ICON_CHARGE, 9, // lightning bolt -- on external power + packRow("......##."), + packRow(".....##.."), + packRow("....##..."), + packRow("...#####."), + packRow(".#####..."), + packRow("...##...."), + packRow("..##....."), + packRow(".##......"), + packRow(".#.......")); MINI_ICON(ICON_TRAIL, 7, // map pin (GPS trail logging) packRow("..###.."), packRow(".#####."), @@ -572,6 +582,14 @@ MINI_ICON(ICON_ALARM, 7, // bell — an alarm is armed packRow(".#####."), packRow("#######"), packRow("...#...")); +MINI_ICON(ICON_CHARGE, 7, // lightning bolt -- on external power + packRow("....##."), + packRow("...##.."), + packRow("..##..."), + packRow(".#####."), + packRow("...##.."), + packRow("..##..."), + packRow("..#....")); MINI_ICON(ICON_TRAIL, 7, // map pin (GPS trail logging) packRow("..###.."), packRow(".#####."), @@ -644,6 +662,13 @@ MINI_ICON(ICON_ALARM, 5, // bell — an alarm is armed packRow(".###."), packRow("#####"), packRow("..#..")); +MINI_ICON(ICON_CHARGE, 5, // lightning bolt -- on external power + packRow("...#."), + packRow("..##."), + packRow(".####"), + packRow("..##."), + packRow(".##.."), + packRow(".#...")); MINI_ICON(ICON_TRAIL, 6, // map pin / location marker (GPS trail logging) packRow(".####."), diff --git a/variants/sim/SimMainBoard.h b/variants/sim/SimMainBoard.h index 9ad4ddf3..4c1d48c6 100644 --- a/variants/sim/SimMainBoard.h +++ b/variants/sim/SimMainBoard.h @@ -16,9 +16,14 @@ class SimMainBoard : public mesh::MainBoard { // plumbed through, same reasoning as SimLocationProvider.h's singleton. static uint16_t& battMilliVoltsRef() { static uint16_t mv = 4000; return mv; } + static bool& externalPowerRef() { static bool on = false; return on; } + public: void begin() { } + bool isExternalPowered() override { return externalPowerRef(); } + static void setExternalPower(bool on) { externalPowerRef() = on; } + uint16_t getBattMilliVolts() override { return battMilliVoltsRef(); } static void setBattMilliVolts(uint16_t mv) { battMilliVoltsRef() = mv; } const char* getManufacturerName() const override { return "MeshCore Sim (native)"; } @@ -43,4 +48,7 @@ public: extern "C" inline EMSCRIPTEN_KEEPALIVE void sim_battery_set_mv(int mv) { SimMainBoard::setBattMilliVolts((uint16_t)mv); } +extern "C" inline EMSCRIPTEN_KEEPALIVE void sim_external_power_set(int on) { + SimMainBoard::setExternalPower(on != 0); +} #endif