perf(P4): Auch feste Höhen - LVGL markiert sonst das Layout als dirty (1.9.5) #74

Merged
thomas merged 1 commits from perf/feste-hoehen-und-nachweis into main 2026-09-03 07:25:05 +02:00
2 changed files with 39 additions and 2 deletions
+15
View File
@@ -1,3 +1,18 @@
Version 1.9.5:
- Die festen Breiten aus 1.9.4 haben nicht gereicht: Auch die HÖHE muss festliegen. LVGL
prüft beim Setzen eines Textes, ob sich die Eigengröße der Beschriftung geändert haben
könnte - ist eines der beiden Maße frei, gilt das Layout des Elternteils als neu zu
berechnen, und das macht die ganze Seite ungültig. Temperaturwerte, Sollwerte, die Werte
der unteren Zeile und die Uhrzeit in der Kopfleiste haben jetzt feste Maße in beide
Richtungen.
- Die Uhrzeit hatte denselben Effekt in der Kopfleiste: Beim Wechsel der Minute wurde die
Leiste samt Menü-Knopf neu berechnet. Das erklärt den Bereich „x 6..57, y 2..41", der in
fast jedem Durchgang auftauchte.
- Zusätzlich meldet die Firmware jetzt, wenn der Inhaltsbereich oder die Dashboard-Seite als
Ganzes ungültig gemacht wird. Damit ist zu unterscheiden, ob eine einzelne Beschriftung
den Bildaufbau auslöst oder gleich der komplette Bereich - zwei verschiedene Ursachen mit
verschiedenen Gegenmitteln.
Version 1.9.4: Version 1.9.4:
- Die Messung mit Koordinaten hat den Verursacher benannt: Der ungültige Bereich war - Die Messung mit Koordinaten hat den Verursacher benannt: Der ungültige Bereich war
„x 0..1279, y 44..719" - also der gesamte Inhalt unterhalb der Kopfleiste, bei jeder „x 0..1279, y 44..719" - also der gesamte Inhalt unterhalb der Kopfleiste, bei jeder
+24 -2
View File
@@ -1063,6 +1063,11 @@ static lv_obj_t* tempField(lv_obj_t* parent, const char* title, lv_color_t accen
// jeder Zustandsmeldung. Mit fester Breite bleibt nur die Beschriftung selbst ungueltig. // jeder Zustandsmeldung. Mit fester Breite bleibt nur die Beschriftung selbst ungueltig.
lv_obj_set_width(*big, LV_PCT(100)); lv_obj_set_width(*big, LV_PCT(100));
lv_obj_set_style_text_align(*big, LV_TEXT_ALIGN_CENTER, 0); lv_obj_set_style_text_align(*big, LV_TEXT_ALIGN_CENTER, 0);
// Auch die HOEHE muss fest sein. LVGL prueft beim Setzen eines Textes, ob sich die
// Eigengroesse der Beschriftung geaendert haben koennte - ist eines der beiden Masse
// frei, gilt das Layout des Elternteils als neu zu berechnen, und das macht die ganze
// Seite ungueltig. Erst mit festen Massen bleibt nur die Beschriftung selbst ungueltig.
lv_obj_set_height(*big, lv_font_get_line_height(valueFont) + 6);
// Grosse Zahlen etwas enger setzen. Bei dieser Groesse wirken die Werksabstaende // Grosse Zahlen etwas enger setzen. Bei dieser Groesse wirken die Werksabstaende
// auseinandergezogen; ein paar Pixel weniger binden die Ziffern zu einer Zahl zusammen. // auseinandergezogen; ein paar Pixel weniger binden die Ziffern zu einer Zahl zusammen.
if (valueFont == &lv_font_maven_pro_bold_140) lv_obj_set_style_text_letter_space(*big, -3, 0); if (valueFont == &lv_font_maven_pro_bold_140) lv_obj_set_style_text_letter_space(*big, -3, 0);
@@ -1074,6 +1079,7 @@ static lv_obj_t* tempField(lv_obj_t* parent, const char* title, lv_color_t accen
lv_obj_set_style_text_font(*setp, font_text(), 0); lv_obj_set_style_text_font(*setp, font_text(), 0);
lv_obj_set_width(*setp, LV_PCT(100)); lv_obj_set_width(*setp, LV_PCT(100));
lv_obj_set_style_text_align(*setp, LV_TEXT_ALIGN_CENTER, 0); lv_obj_set_style_text_align(*setp, LV_TEXT_ALIGN_CENTER, 0);
lv_obj_set_height(*setp, lv_font_get_line_height(font_text()) + 6);
*bar = lv_bar_create(c); *bar = lv_bar_create(c);
lv_obj_set_size(*bar, LV_PCT(92), 8); lv_obj_set_size(*bar, LV_PCT(92), 8);
@@ -1219,9 +1225,10 @@ static lv_obj_t* infoCell(lv_obj_t* parent, const char* title, lv_obj_t** val, l
lv_obj_set_style_text_color(*val, COL_TEXT, 0); lv_obj_set_style_text_color(*val, COL_TEXT, 0);
lv_obj_set_style_text_font(*val, font_title(), 0); lv_obj_set_style_text_font(*val, font_title(), 0);
lv_obj_set_style_text_align(*val, LV_TEXT_ALIGN_CENTER, 0); // fuer mehrzeilige Werte lv_obj_set_style_text_align(*val, LV_TEXT_ALIGN_CENTER, 0); // fuer mehrzeilige Werte
// Feste Breite: Sonst aendert der Wert mit seinem Inhalt die Breite, LVGL rechnet das // Feste Masse in BEIDE Richtungen - siehe die ausfuehrliche Begruendung in tempField.
// Layout der Zeile neu und macht die ganze Seite ungueltig (siehe tempField). // Zwei Zeilen Platz, weil manche Werte zweizeilig sind ("32,4 g / 36,0 g").
lv_obj_set_width(*val, LV_PCT(100)); lv_obj_set_width(*val, LV_PCT(100));
lv_obj_set_height(*val, lv_font_get_line_height(font_title()) * 2 + 6);
return card; return card;
} }
// Tipp auf die Statuszeile: Wartung -> Serviceseite, Reinigung -> Sub-Screen, // Tipp auf die Statuszeile: Wartung -> Serviceseite, Reinigung -> Sub-Screen,
@@ -3545,6 +3552,14 @@ static void refr_ready_cb(lv_event_t*) {
(int)g_refrArea[i].y1, (int)g_refrArea[i].y2); (int)g_refrArea[i].y1, (int)g_refrArea[i].y2);
} }
// Meldet, wenn ein ganzer Container ungueltig gemacht wird. Damit laesst sich unterscheiden,
// ob eine einzelne Beschriftung den Bildaufbau ausloest oder ob gleich der komplette
// Inhaltsbereich neu gezeichnet werden soll - zwei verschiedene Ursachen.
static void inval_watch_cb(lv_event_t* e) {
const char* name = (const char*)lv_event_get_user_data(e);
esp_rom_printf("[UI] %s wird komplett ungueltig\n", name);
}
static void refr_monitor_install() { static void refr_monitor_install() {
lv_display_t* d = lv_display_get_default(); lv_display_t* d = lv_display_get_default();
if (!d) return; if (!d) return;
@@ -3662,6 +3677,11 @@ void ui_init(ProtocolClient* client) {
lv_obj_set_style_text_color(g_clock, COL_TEXT, 0); lv_obj_set_style_text_color(g_clock, COL_TEXT, 0);
lv_obj_set_style_pad_right(g_clock, 10, 0); lv_obj_set_style_pad_right(g_clock, 10, 0);
lv_obj_set_style_text_font(g_clock, font_text(), 0); lv_obj_set_style_text_font(g_clock, font_text(), 0);
// Feste Masse, sonst rechnet LVGL beim Wechsel der Minute das Layout der Kopfleiste neu
// und macht sie samt Menue-Knopf ungueltig (siehe tempField).
lv_obj_set_width(g_clock, 130);
lv_obj_set_height(g_clock, lv_font_get_line_height(font_text()) + 4);
lv_obj_set_style_text_align(g_clock, LV_TEXT_ALIGN_RIGHT, 0);
g_wifiIcon = lv_label_create(header); g_wifiIcon = lv_label_create(header);
lv_label_set_text(g_wifiIcon, LV_SYMBOL_WIFI); lv_label_set_text(g_wifiIcon, LV_SYMBOL_WIFI);
@@ -3950,6 +3970,8 @@ void ui_init(ProtocolClient* client) {
if (g_client) g_client->sendListProfiles(); if (g_client) g_client->sendListProfiles();
refr_monitor_install(); refr_monitor_install();
if (g_content) lv_obj_add_event_cb(g_content, inval_watch_cb, LV_EVENT_INVALIDATE_AREA, (void*)"Inhaltsbereich");
if (g_pages[PG_DASH]) lv_obj_add_event_cb(g_pages[PG_DASH], inval_watch_cb, LV_EVENT_INVALIDATE_AREA, (void*)"Dashboard-Seite");
g_uiReady = true; g_uiReady = true;
} }