From 326af4288af481424a8647fba1cf64f6a9bd3458 Mon Sep 17 00:00:00 2001 From: raw-designs Date: Thu, 3 Sep 2026 03:10:40 +0200 Subject: [PATCH] =?UTF-8?q?perf(P4):=20Auch=20feste=20H=C3=B6hen=20-=20LVG?= =?UTF-8?q?L=20markiert=20sonst=20das=20Layout=20als=20dirty=20(1.9.5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die festen Breiten aus 1.9.4 haben nicht gereicht. lv_label_set_text ruft lv_obj_refresh_self_size(); ist eines der beiden Maße LV_SIZE_CONTENT, gilt das Parent-Layout als dirty und der Container wird komplett invalidiert. - tempField(): big und setp bekommen zusätzlich eine feste Höhe aus lv_font_get_line_height(). - infoCell(): val ebenso, mit Platz für zwei Zeilen. - g_clock: feste Breite/Höhe, rechtsbündig. Erklärt den Bereich "x 6..57, y 2..41" (Menü-Knopf), der bei jedem Minutenwechsel durch das Header-Relayout mit invalidiert wurde. Zusätzlich eine gezielte Diagnose: LV_EVENT_INVALIDATE_AREA auf g_content und der Dashboard-Seite meldet, wenn ein ganzer Container invalidiert wird - damit ist "einzelnes Label" von "kompletter Bereich" zu unterscheiden. Beide Panel-Varianten mit arduino-cli gegengebaut. Co-Authored-By: Claude Opus 5 --- P4_Display_Firmware/Changelog.txt | 15 +++++++++++++++ P4_Display_Firmware/ui.cpp | 26 ++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index 1a331e5..253914e 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -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: - 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 diff --git a/P4_Display_Firmware/ui.cpp b/P4_Display_Firmware/ui.cpp index d4f6df0..817bafe 100644 --- a/P4_Display_Firmware/ui.cpp +++ b/P4_Display_Firmware/ui.cpp @@ -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. lv_obj_set_width(*big, LV_PCT(100)); 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 // 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); @@ -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_width(*setp, LV_PCT(100)); 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); 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_font(*val, font_title(), 0); 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 - // Layout der Zeile neu und macht die ganze Seite ungueltig (siehe tempField). + // Feste Masse in BEIDE Richtungen - siehe die ausfuehrliche Begruendung in 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_height(*val, lv_font_get_line_height(font_title()) * 2 + 6); return card; } // 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); } +// 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() { lv_display_t* d = lv_display_get_default(); 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_pad_right(g_clock, 10, 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); lv_label_set_text(g_wifiIcon, LV_SYMBOL_WIFI); @@ -3950,6 +3970,8 @@ void ui_init(ProtocolClient* client) { if (g_client) g_client->sendListProfiles(); 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; }