fix(l2): the battery shows an icon, a percentage or a voltage, not the icon too

Battery display's percent and voltage modes still drew the icon before
the number. Each mode now shows one thing; the title bar no longer has a
battery level to fold away, so only the button words give way to a title.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jakub
2026-10-23 23:00:52 +02:00
co-authored by Claude Opus 5.5
parent b44ee6a599
commit 1552ca4383
+15 -19
View File
@@ -704,9 +704,9 @@ static void placeLeftOf(lv_obj_t* o, lv_obj_t* base, int32_t dx) {
} }
// Whether the title fits its bar. The bar is a row where the title takes what // Whether the title fits its bar. The bar is a row where the title takes what
// the rest leave, so the rest gives way, in this order: the battery's level // the rest leave, so the rest gives way: the words of the screen's buttons
// (the icon stays), then the words of the screen's buttons (their icons stay, // (their icons stay, last button first). Only when that is not enough is the
// last button first). Only when that is not enough is the title cut with "...". // title cut with "...".
// A label with a space after its icon is collapsible: clipped to the icon's // A label with a space after its icon is collapsible: clipped to the icon's
// width, its text untouched, so a screen may rewrite it later. // width, its text untouched, so a screen may rewrite it later.
static void collapseLabel(lv_obj_t* l, const lv_font_t* font, bool on) { static void collapseLabel(lv_obj_t* l, const lv_font_t* font, bool on) {
@@ -729,7 +729,7 @@ static void collapseLabel(lv_obj_t* l, const lv_font_t* font, bool on) {
void UITask::fitHeader() { void UITask::fitHeader() {
if (!_header || !_hdr_clock || !_hdr_title) return; if (!_header || !_hdr_clock || !_hdr_title) return;
lv_obj_t* lbl[8]; // the collapsible labels, in the row's order, the battery's apart lv_obj_t* lbl[8]; // the collapsible labels, in the row's order
int n = 0; int n = 0;
const int cnt = (int)lv_obj_get_child_count(_header); const int cnt = (int)lv_obj_get_child_count(_header);
for (int i = 0; i < cnt && n < 8; i++) { for (int i = 0; i < cnt && n < 8; i++) {
@@ -750,11 +750,8 @@ void UITask::fitHeader() {
layoutNow(_header); layoutNow(_header);
return lv_obj_get_width(_hdr_title) >= tsz.x; return lv_obj_get_width(_hdr_title) >= tsz.x;
}; };
collapseLabel(_hdr_batt, THEME_FONT_ICONS, false);
for (int i = 0; i < n; i++) collapseLabel(lbl[i], THEME_FONT_SMALL, false); for (int i = 0; i < n; i++) collapseLabel(lbl[i], THEME_FONT_SMALL, false);
if (place()) return; if (place()) return;
collapseLabel(_hdr_batt, THEME_FONT_ICONS, true);
if (place()) return;
for (int i = n - 1; i >= 0; i--) { for (int i = n - 1; i >= 0; i--) {
collapseLabel(lbl[i], THEME_FONT_SMALL, true); collapseLabel(lbl[i], THEME_FONT_SMALL, true);
if (place()) return; if (place()) return;
@@ -772,27 +769,26 @@ void UITask::refreshStatusBar() {
setText(_status_time, "--:--"); setText(_status_time, "--:--");
} }
// Battery: the icon, then % or volts per Settings > Power > Battery display. The // Battery: an icon, % or volts per Settings > Power > Battery display. The
// smoothed reading (checkLowBattery): an ADC read blocks the loop for 10 ms. // smoothed reading (checkLowBattery): an ADC read blocks the loop for 10 ms.
uint16_t mv = _batt_mv ? _batt_mv : getBattMilliVolts(); uint16_t mv = _batt_mv ? _batt_mv : getBattMilliVolts();
int pct = battery::percent(mv, _prefs ? _prefs->low_batt_mv : 0); int pct = battery::percent(mv, _prefs ? _prefs->low_batt_mv : 0);
const char* batt = pct > 80 ? LV_SYMBOL_BATTERY_FULL : pct > 55 ? LV_SYMBOL_BATTERY_3 char batt[12];
: pct > 30 ? LV_SYMBOL_BATTERY_2 : pct > 10 ? LV_SYMBOL_BATTERY_1 : LV_SYMBOL_BATTERY_EMPTY;
char level[12] = "";
switch (battery::mode(_prefs ? _prefs->batt_display_mode : 0)) { switch (battery::mode(_prefs ? _prefs->batt_display_mode : 0)) {
case battery::PERCENT: snprintf(level, sizeof(level), " %d%%", pct); break; case battery::PERCENT: snprintf(batt, sizeof(batt), "%d%%", pct); break;
case battery::VOLTAGE: snprintf(level, sizeof(level), " %u.%02u V", mv / 1000, (mv % 1000) / 10); break; case battery::VOLTAGE: snprintf(batt, sizeof(batt), "%u.%02uV", mv / 1000, (mv % 1000) / 10); break;
default: break; default:
snprintf(batt, sizeof(batt), "%s", pct > 80 ? LV_SYMBOL_BATTERY_FULL : pct > 55 ? LV_SYMBOL_BATTERY_3
: pct > 30 ? LV_SYMBOL_BATTERY_2 : pct > 10 ? LV_SYMBOL_BATTERY_1
: LV_SYMBOL_BATTERY_EMPTY);
} }
setTextFmt(_status_batt, "%s%s", batt, level); setText(_status_batt, batt);
const bool chg = _board->isExternalPowered(); const bool chg = _board->isExternalPowered();
if (_hdr_clock) { // the title bar's: the time over the battery, green on the charger if (_hdr_clock) { // the title bar's: the time over the battery, green on the charger
char hb[40];
snprintf(hb, sizeof(hb), "%s%s", batt, level);
// the pill's width changes with these: fitHeader() before the next frame // the pill's width changes with these: fitHeader() before the next frame
if (!labelShows(_hdr_time, lv_label_get_text(_status_time)) || !labelShows(_hdr_batt, hb)) s_hdr_fit = true; if (!labelShows(_hdr_time, lv_label_get_text(_status_time)) || !labelShows(_hdr_batt, batt)) s_hdr_fit = true;
setText(_hdr_time, lv_label_get_text(_status_time)); setText(_hdr_time, lv_label_get_text(_status_time));
setText(_hdr_batt, hb); setText(_hdr_batt, batt);
setTextColor(_hdr_batt, chg ? theme::OK : theme::TEXT_MUTED); setTextColor(_hdr_batt, chg ? theme::OK : theme::TEXT_MUTED);
} }
lv_obj_t* left_of = _status_batt; // the icons pack up to this lv_obj_t* left_of = _status_batt; // the icons pack up to this