From 7fec5d9fb5aa1dd764a6ea07a4e688a1fb521259 Mon Sep 17 00:00:00 2001 From: raw-designs Date: Thu, 3 Sep 2026 13:38:14 +0200 Subject: [PATCH] =?UTF-8?q?fix(P4):=20Kachelh=C3=B6he=20beim=20Bezug=20hal?= =?UTF-8?q?ten,=20Messzeilen=20mit=20Zeitmarke=20(1.9.9)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - dash_brew_mode() verteilt die flex_grow-Werte nicht mehr um. Die untere Zeile bekam während des Bezugs 3 statt 2 und die Temperaturzeile 1 statt 3; die kleinen Kacheln wurden dadurch enorm hoch und das Layout sprang. - Die Messzeilen aus dem .ino liefen über Serial und damit über USB-CDC, während der Monitor an der UART hängt - sie waren nie zu sehen. Jetzt durchgängig esp_rom_printf wie die Panel-Meldungen. - Alle Messzeilen tragen eine Zeitmarke in ms; ohne die sind die Lücken nicht zu erkennen. - onState() misst Ankunft der Zustandsmeldung, Wartezeit auf hal_lock() und Dauer von ui_update(). standby_screen_cb() klammert wake_confirm_show() ein. Das deckt beide Richtungen der gemeldeten Fünf-Sekunden-Verzögerung ab. Das Einblenden der Standby-Uhr scheidet als Ursache aus: laut Messung 2 ms. Beide Panel-Varianten mit arduino-cli gegengebaut. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01NeFMr439WcLMdebE3kU7fS --- P4_Display_Firmware/Changelog.txt | 13 +++++++++ P4_Display_Firmware/P4_Display_Firmware.ino | 19 +++++++++++-- P4_Display_Firmware/ui.cpp | 30 ++++++++++++++------- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index dcdea60..aedcae9 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,16 @@ +Version 1.9.9: +- Die kleinen Kacheln unten im Dashboard behalten beim Bezug ihre Höhe. Bisher bekam die + untere Zeile während des Bezugs deutlich mehr Platz - die Kacheln wurden enorm hoch und + das Dashboard sprang bei jedem Bezugsbeginn sichtbar um. +- Die Messzeilen gingen bisher teils über die USB-Verbindung hinaus und waren im seriellen + Monitor gar nicht zu sehen - die Messung der Helligkeit lief damit ins Leere. Alle + Messzeilen laufen jetzt über denselben Weg wie die Panel-Meldungen. +- Jede Messzeile trägt jetzt eine Zeitmarke. Nur so sind die Lücken zu sehen, in denen die + fünf Sekunden vergehen. +- Der Wechsel in den und aus dem Standby wird an jeder Station vermessen: Ankunft der + Meldung, Warten auf die Anzeigesperre, Dauer der Aktualisierung. Ebenso der Weg vom Tippen + auf die Standby-Uhr bis zur fertig aufgebauten Rückfrage. + Version 1.9.8: - Der Stillstand beim Wechsel in den Standby ist gefunden und behoben. LVGL legt für JEDE Textglyphe einen eigenen Zwischenpuffer an - bei der großen Uhr rund 48 KB pro Ziffer, mit diff --git a/P4_Display_Firmware/P4_Display_Firmware.ino b/P4_Display_Firmware/P4_Display_Firmware.ino index b4aa866..aca4ed1 100644 --- a/P4_Display_Firmware/P4_Display_Firmware.ino +++ b/P4_Display_Firmware/P4_Display_Firmware.ino @@ -47,10 +47,23 @@ static bool g_bootCountCleared = false; // --- Protokoll-Callbacks --------------------------------------------------------------- static void onState(const MachineState& st) { + // Vermessen: Zwischen dem Umschalten und dem sichtbaren Ergebnis vergehen rund fuenf + // Sekunden. Jede Station bekommt eine Zeitmarke, damit die Luecke zu sehen ist. + static bool s_lastStandby = false; + bool wechsel = (st.standbyActive != s_lastStandby); + s_lastStandby = st.standbyActive; + uint32_t t0 = millis(); + if (wechsel) esp_rom_printf("[Zustand] %u ms: Standby jetzt %s - Meldung angekommen\n", + (unsigned)t0, st.standbyActive ? "an" : "aus"); // LVGL laeuft im realen Modus in einem eigenen Task -> UI-Zugriff sperren. hal_lock(); + uint32_t t1 = millis(); ui_update(st); + uint32_t t2 = millis(); hal_unlock(); + if (wechsel || (t2 - t0) > 200) + esp_rom_printf("[Zustand] %u ms: Sperre %u ms, Anzeige aktualisiert %u ms\n", + (unsigned)millis(), (unsigned)(t1 - t0), (unsigned)(t2 - t1)); // Display im Standby aus; ist "Uhrzeit im Standby anzeigen" aktiv, bleibt es an, // aber abgedunkelt (nicht blendend bei Nacht). Helligkeiten kommen von der S3 @@ -72,7 +85,8 @@ static void onState(const MachineState& st) { uint32_t t0 = millis(); hal_backlight(bl); uint32_t dt = millis() - t0; - if (dt > 50) Serial.printf("[HAL] Helligkeit %d %% gesetzt, %u ms\n", bl, (unsigned)dt); + if (dt > 50) esp_rom_printf("[HAL] %u ms: Helligkeit %d %% gesetzt, brauchte %u ms\n", + (unsigned)millis(), bl, (unsigned)dt); s_lastBacklight = bl; } } @@ -83,7 +97,8 @@ static void main_heartbeat() { static uint32_t s_last = 0; if (millis() - s_last < 2000) return; s_last = millis(); - Serial.printf("[Haupt] Herzschlag, freier Speicher %u Byte\n", (unsigned)ESP.getFreeHeap()); + esp_rom_printf("[Haupt] %u ms: Herzschlag, freier Speicher %u Byte\n", + (unsigned)millis(), (unsigned)ESP.getFreeHeap()); } static void onAck(uint32_t id, bool ok, const String& message) { diff --git a/P4_Display_Firmware/ui.cpp b/P4_Display_Firmware/ui.cpp index 0cb1357..7b5caf6 100644 --- a/P4_Display_Firmware/ui.cpp +++ b/P4_Display_Firmware/ui.cpp @@ -930,7 +930,14 @@ static bool wake_choice_offered() { return g_state.cxWakeChoice || (g_state.cxEnabled && g_state.cxArmable && g_state.cxAskOnWake); } -static void standby_screen_cb(lv_event_t*) { wake_confirm_show(); } // Tipp auf Standby-Uhr -> nachfragen +static void standby_screen_cb(lv_event_t*) { // Tipp auf Standby-Uhr -> nachfragen + // Vermessen: Vom Tippen bis zur sichtbaren Rueckfrage vergehen rund fuenf Sekunden. + uint32_t t0 = lv_tick_get(); + esp_rom_printf("[Touch] %u ms: Tipp auf die Standby-Uhr erkannt\n", (unsigned)t0); + wake_confirm_show(); + esp_rom_printf("[Touch] %u ms: Rueckfrage aufgebaut, brauchte %u ms\n", + (unsigned)lv_tick_get(), (unsigned)(lv_tick_get() - t0)); +} static void wake_cancel() { // Abbrechen -> zurueck in die Standby-Helligkeit wake_timeout_stop(); wake_confirm_hide(); @@ -3556,7 +3563,7 @@ static void refr_ready_cb(lv_event_t*) { uint32_t d = lv_tick_get() - g_refrStart; if (d < REFR_WARN_MS) return; unsigned pct = (unsigned)((uint64_t)g_refrPixels * 100ULL / ((uint64_t)LCD_H_RES * LCD_V_RES)); - esp_rom_printf("[UI] Bildaufbau %u ms, %u Bereiche, %u %% der Flaeche\n", + esp_rom_printf("[UI] %u ms: Bildaufbau %u ms, %u Bereiche, %u %% der Flaeche\n", (unsigned)lv_tick_get(), (unsigned)d, (unsigned)g_refrAreas, pct); // Lage der Bereiche mit ausgeben. Erst daran ist zu erkennen, WELCHER Teil der // Oberflaeche das Neuzeichnen ausloest - die Groesse allein sagt das nicht. @@ -3568,8 +3575,9 @@ static void refr_ready_cb(lv_event_t*) { static void ui_heartbeat_cb(lv_timer_t*) { lv_mem_monitor_t m; lv_mem_monitor(&m); - esp_rom_printf("[UI] Herzschlag, LVGL-Speicher frei %u von %u Byte, groesster Block %u\n", - (unsigned)m.free_size, (unsigned)m.total_size, (unsigned)m.free_biggest_size); + esp_rom_printf("[UI] %u ms: Herzschlag, LVGL-Speicher frei %u von %u Byte, groesster Block %u\n", + (unsigned)lv_tick_get(), (unsigned)m.free_size, (unsigned)m.total_size, + (unsigned)m.free_biggest_size); } // LVGL legt fuer JEDE Textglyphe einen eigenen Zwischenpuffer an - Breite mal Hoehe, ein @@ -4114,12 +4122,14 @@ static void dash_brew_mode(bool on) { if (on == g_dashBrewMode) return; // nur bei echtem Wechsel neu anordnen g_dashBrewMode = on; if (!g_tempRow || !g_infoRow) return; - lv_obj_set_flex_grow(g_tempRow, on ? 1 : 3); - lv_obj_set_flex_grow(g_infoRow, on ? 3 : 2); - // Die Schrift von Shot-Timer und Waage bleibt unveraendert. Frueher wechselte sie - // waehrend des Bezugs auf den grossen fetten Schnitt - das wirkte gegenueber dem - // restlichen Dashboard zu laut. Der Bereich bekommt weiterhin mehr Platz, die Zahlen - // stehen dadurch freier, aber in derselben Schrift wie sonst auch. + // Die Zeilenhoehen bleiben unveraendert. Frueher bekam die untere Zeile waehrend des + // Bezugs deutlich mehr Platz - die kleinen Kacheln wurden dadurch enorm hoch und das + // Dashboard sprang bei jedem Bezugsbeginn sichtbar um. Der Bezug hebt sich jetzt allein + // ueber seine Inhalte hervor, nicht ueber die Groesse. + (void)on; + // Die Schrift von Shot-Timer und Waage bleibt ebenfalls unveraendert. Frueher wechselte + // sie waehrend des Bezugs auf den grossen fetten Schnitt - das wirkte gegenueber dem + // restlichen Dashboard zu laut. } static void dash_brew_mode_tick(const MachineState& st) {