fix(P4): Standby-Verzögerung, Dialog-Timeout, Kurvenhintergrund, Bindestrich (1.8.5) #65
@@ -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:
|
Version 1.8.4:
|
||||||
- Standby-Uhr und Aufweckdialog erscheinen jetzt sofort statt mit spürbarer Verzögerung.
|
- 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
|
Ursache waren die weichen Ein- und Ausblendungen: Eine Deckkraft-Animation ist bei einem
|
||||||
|
|||||||
@@ -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(g_statTime[i], dt);
|
||||||
lv_label_set_text_fmt(g_statDur[i], "%.1f s", d);
|
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);
|
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" : "");
|
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() {
|
static int standby_backlight() {
|
||||||
return g_state.standbyShowClock ? (int)g_state.backlightStandbyClock : 0;
|
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() {
|
static void wake_confirm_show() {
|
||||||
if (!g_wakeConfirm) return;
|
if (!g_wakeConfirm) return;
|
||||||
g_wakeDialogOpen = true;
|
g_wakeDialogOpen = true;
|
||||||
@@ -873,6 +887,9 @@ static void wake_confirm_show() {
|
|||||||
hal_backlight(bl);
|
hal_backlight(bl);
|
||||||
lv_obj_remove_flag(g_wakeConfirm, LV_OBJ_FLAG_HIDDEN);
|
lv_obj_remove_flag(g_wakeConfirm, LV_OBJ_FLAG_HIDDEN);
|
||||||
lv_obj_move_foreground(g_wakeConfirm);
|
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); }
|
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
|
// 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);
|
(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*) { 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();
|
wake_confirm_hide();
|
||||||
g_wakeDialogOpen = false;
|
g_wakeDialogOpen = false;
|
||||||
if (g_state.standbyActive) hal_backlight(standby_backlight());
|
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
|
static void wake_yes_cb(lv_event_t*) { // Aufwecken -> hell lassen, S3 beendet den Standby
|
||||||
|
wake_timeout_stop();
|
||||||
wake_confirm_hide();
|
wake_confirm_hide();
|
||||||
// g_wakeDialogOpen bleibt true, bis der Standby wirklich endet (ui_update) - sonst wuerde
|
// g_wakeDialogOpen bleibt true, bis der Standby wirklich endet (ui_update) - sonst wuerde
|
||||||
// das Display in der Uebergangsphase kurz auf Standby-Helligkeit abdunkeln.
|
// 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,
|
// stellen, dann den Standby beenden - sonst heizt der Wasserkreis in der Zwischenzeit an,
|
||||||
// und genau das soll die Funktion ja verhindern.
|
// und genau das soll die Funktion ja verhindern.
|
||||||
static void wake_cold_cb(lv_event_t*) {
|
static void wake_cold_cb(lv_event_t*) {
|
||||||
|
wake_timeout_stop();
|
||||||
wake_confirm_hide();
|
wake_confirm_hide();
|
||||||
if (g_client) {
|
if (g_client) {
|
||||||
g_client->sendAction("startColdExtraction");
|
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);
|
lv_chart_set_div_line_count(ch, 0, 0);
|
||||||
// Schwach abgesetzte Flaeche: Ohne sie waere der Bereich vor dem ersten Messwert
|
// Schwach abgesetzte Flaeche: Ohne sie waere der Bereich vor dem ersten Messwert
|
||||||
// vollstaendig unsichtbar - man haette gar nicht erkannt, dass dort eine Kurve gehoert.
|
// 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_TRANSP, 0);
|
||||||
lv_obj_set_style_bg_opa(ch, LV_OPA_COVER, 0);
|
|
||||||
lv_obj_set_style_radius(ch, 6, 0);
|
|
||||||
lv_obj_set_style_border_width(ch, 0, 0);
|
lv_obj_set_style_border_width(ch, 0, 0);
|
||||||
lv_obj_set_style_pad_all(ch, 4, 0);
|
lv_obj_set_style_pad_all(ch, 4, 0);
|
||||||
lv_obj_set_style_size(ch, 0, 0, LV_PART_INDICATOR); // keine Punktmarkierungen
|
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) {
|
if (!g_standbyShown) {
|
||||||
ui_fade_in(g_standbyScreen, UI_FADE_MS); // Einschlaf-Animation
|
ui_fade_in(g_standbyScreen, UI_FADE_MS); // Einschlaf-Animation
|
||||||
g_standbyShown = true;
|
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) {
|
} else if (g_standbyShown) {
|
||||||
ui_fade_out_hide(g_standbyScreen, UI_FADE_MS); // Aufweck-Animation
|
ui_fade_out_hide(g_standbyScreen, UI_FADE_MS); // Aufweck-Animation
|
||||||
g_standbyShown = false;
|
g_standbyShown = false;
|
||||||
|
|||||||
Reference in New Issue
Block a user