diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index b0836d9..d5df872 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,21 @@ +Version 1.8.5: +- Die Verzögerung von rund zwei Sekunden rund um den Standby ist behoben. Sie lag nicht an + der Helligkeitsumschaltung, sondern daran, dass die Standby-Uhr bei JEDER Zustandsmeldung + der Hauptplatine nach vorn geholt wurde. Das ordnet die Ebenen neu und lässt LVGL den + gesamten Bildschirm neu zeichnen - einmal pro Sekunde, jedes Mal 1280x720 in 24 Bit. + Dadurch hing die Oberfläche dauerhaft ein bis zwei Sekunden hinterher. Nach vorn geholt + wird die Uhr jetzt beim Einblenden, danach bleibt sie dort. +- Der Aufweckdialog schließt sich nach 30 Sekunden ohne Auswahl von selbst und wird wie + „Abbrechen" gewertet. Vorher blieb das Display hell stehen - der Dialog schaltet auf + normale Helligkeit, und ein versehentlicher Tipp auf die Uhr hätte die Maschine die ganze + Nacht leuchten lassen. +- Die Verlaufskurve hat keinen eigenen Hintergrund mehr; sie liegt jetzt direkt auf der + Karte. Die abgesetzte Fläche war nur nötig, solange die Kurve vor dem ersten Messwert + leer blieb - seit sie beim aktuellen Wert startet, ist immer eine Linie da. +- Auf der Statistikseite erschien ein leeres Rechteck, wenn ohne Waage bezogen wurde. Dort + stand ein typografischer Gedankenstrich, den der Zeichensatz der Schrift nicht enthält. + Jetzt ein einfacher Bindestrich. + Version 1.8.4: - Standby-Uhr und Aufweckdialog erscheinen jetzt sofort statt mit spürbarer Verzögerung. Ursache waren die weichen Ein- und Ausblendungen: Eine Deckkraft-Animation ist bei einem diff --git a/P4_Display_Firmware/ui.cpp b/P4_Display_Firmware/ui.cpp index ace69fd..55035fc 100644 --- a/P4_Display_Firmware/ui.cpp +++ b/P4_Display_Firmware/ui.cpp @@ -676,7 +676,9 @@ static void stat_list_set(int i, const char* dt, float d, float w, bool kalt) { lv_label_set_text(g_statTime[i], dt); lv_label_set_text_fmt(g_statDur[i], "%.1f s", d); if (w >= 0.0f) lv_label_set_text_fmt(g_statWgt[i], "%.1f g", w); - else lv_label_set_text(g_statWgt[i], "–"); + // Bewusst ein einfacher Bindestrich: Der typografisch schoenere Gedankenstrich + // fehlt im Zeichensatz der Schrift und erschiene als leeres Rechteck. + else lv_label_set_text(g_statWgt[i], "-"); lv_label_set_text(g_statCold[i], kalt ? "kalt" : ""); } @@ -864,6 +866,18 @@ static void ui_fade_out_delete(lv_obj_t* obj, uint32_t ms) { static int standby_backlight() { return g_state.standbyShowClock ? (int)g_state.backlightStandbyClock : 0; } +// Der Aufweckdialog schliesst sich von selbst, wenn niemand entscheidet. Sonst bliebe das +// Display hell stehen, weil der Dialog auf normale Helligkeit schaltet - jemand tippt im +// Vorbeigehen versehentlich auf die Uhr, und die Maschine leuchtet die ganze Nacht. +// Zeitablauf wird wie "Abbrechen" gewertet: zurueck in die Standby-Helligkeit. +#define WAKE_DIALOG_TIMEOUT_MS 30000 +static lv_timer_t* g_wakeTimeout = nullptr; + +static void wake_timeout_stop() { + if (g_wakeTimeout) { lv_timer_delete(g_wakeTimeout); g_wakeTimeout = nullptr; } +} +static void wake_timeout_cb(lv_timer_t* t); // weiter unten, braucht wake_cancel() + static void wake_confirm_show() { if (!g_wakeConfirm) return; g_wakeDialogOpen = true; @@ -873,6 +887,9 @@ static void wake_confirm_show() { hal_backlight(bl); lv_obj_remove_flag(g_wakeConfirm, LV_OBJ_FLAG_HIDDEN); lv_obj_move_foreground(g_wakeConfirm); + wake_timeout_stop(); + g_wakeTimeout = lv_timer_create(wake_timeout_cb, WAKE_DIALOG_TIMEOUT_MS, nullptr); + lv_timer_set_repeat_count(g_wakeTimeout, 1); } static void wake_confirm_hide() { if (g_wakeConfirm) lv_obj_add_flag(g_wakeConfirm, LV_OBJ_FLAG_HIDDEN); } // Einzige Quelle der Wahrheit dafuer, ob der Aufweck-Dialog die Auswahl "Espresso oder Cold @@ -886,12 +903,19 @@ static bool wake_choice_offered() { (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 wake_no_cb(lv_event_t*) { // Abbrechen -> zurueck in die Standby-Helligkeit +static void wake_cancel() { // Abbrechen -> zurueck in die Standby-Helligkeit + wake_timeout_stop(); wake_confirm_hide(); g_wakeDialogOpen = false; if (g_state.standbyActive) hal_backlight(standby_backlight()); } +static void wake_no_cb(lv_event_t*) { wake_cancel(); } +static void wake_timeout_cb(lv_timer_t*) { // niemand hat entschieden -> wie Abbrechen + g_wakeTimeout = nullptr; // Timer laeuft nur einmal, loescht sich selbst + wake_cancel(); +} static void wake_yes_cb(lv_event_t*) { // Aufwecken -> hell lassen, S3 beendet den Standby + wake_timeout_stop(); wake_confirm_hide(); // g_wakeDialogOpen bleibt true, bis der Standby wirklich endet (ui_update) - sonst wuerde // das Display in der Uebergangsphase kurz auf Standby-Helligkeit abdunkeln. @@ -907,6 +931,7 @@ static void wake_yes_cb(lv_event_t*) { // Aufwecken -> hell lassen, S3 bee // stellen, dann den Standby beenden - sonst heizt der Wasserkreis in der Zwischenzeit an, // und genau das soll die Funktion ja verhindern. static void wake_cold_cb(lv_event_t*) { + wake_timeout_stop(); wake_confirm_hide(); if (g_client) { g_client->sendAction("startColdExtraction"); @@ -1044,9 +1069,7 @@ static lv_obj_t* tempSpark(lv_obj_t* parent, lv_color_t col, lv_chart_series_t** lv_chart_set_div_line_count(ch, 0, 0); // Schwach abgesetzte Flaeche: Ohne sie waere der Bereich vor dem ersten Messwert // vollstaendig unsichtbar - man haette gar nicht erkannt, dass dort eine Kurve gehoert. - lv_obj_set_style_bg_color(ch, lv_color_hex(0x151515), 0); - lv_obj_set_style_bg_opa(ch, LV_OPA_COVER, 0); - lv_obj_set_style_radius(ch, 6, 0); + lv_obj_set_style_bg_opa(ch, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(ch, 0, 0); lv_obj_set_style_pad_all(ch, 4, 0); lv_obj_set_style_size(ch, 0, 0, LV_PART_INDICATOR); // keine Punktmarkierungen @@ -3908,9 +3931,12 @@ void ui_update(const MachineState& st) { if (!g_standbyShown) { ui_fade_in(g_standbyScreen, UI_FADE_MS); // Einschlaf-Animation g_standbyShown = true; - } else { - lv_obj_move_foreground(g_standbyScreen); } + // Frueher wurde die Uhr hier bei JEDER Zustandsmeldung nach vorn geholt. Das + // ordnet die Ebenen neu und laesst LVGL den gesamten Bildschirm neu zeichnen - + // einmal pro Sekunde, jedesmal 1280x720 in 24 Bit. Genau das war der Grund, + // warum sich rund um den Standby alles um ein bis zwei Sekunden verzoegerte. + // Nach vorn geholt wird die Uhr beim Einblenden, danach bleibt sie dort. } else if (g_standbyShown) { ui_fade_out_hide(g_standbyScreen, UI_FADE_MS); // Aufweck-Animation g_standbyShown = false;