From f8d51a57b741963170e94d0385c6966174a66e3e Mon Sep 17 00:00:00 2001 From: raw-designs Date: Wed, 12 Aug 2026 07:19:50 +0200 Subject: [PATCH] fix: Abfrage beim Aufwecken geht in beide Richtungen (S3 5.6.2 / P4 1.4.1) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Abfrage erschien nicht, sobald der Cold-Extraction-Modus noch aktiv war — und da er seit 5.3.1 persistent ist, war er das nach dem ersten kalten Bezug dauerhaft. Damit erklärt sich, warum weder der Schalter- noch der Touch-Weg etwas zeigte. Die Bedingung "Modus ist aus" war falsch gedacht ("sonst gibt es nichts zu fragen"). Die Auswahl muss in beide Richtungen gehen, also auch von kalt zurück auf Espresso. Sonst hängt man nach dem ersten kalten Bezug im kalten Modus fest, ohne beim Aufwecken je wieder gefragt zu werden. - Bedingung aus beiden Öffnungspfaden entfernt (Standby-Übergang und Kaltstart). - Das Fenster bleibt bei aktivem Modus offen; bisher schloss es sofort wieder. - "wakeEspresso" beendet jetzt einen laufenden Modus, statt ihn nur nicht einzuschalten — sonst wäre die Auswahl eine Einbahnstraße. - Diagnose auf /Cold-Extraction listet den Modus nicht mehr als Voraussetzung, sondern zeigt ihn als Ist-Zustand. - P4: Der Cold-Knopf zeigt den Ist-Zustand ("aktiv lassen" und hervorgehoben, wenn der Modus läuft). Co-Authored-By: Claude Opus 5 --- Changelog.txt | 13 +++++++++++++ Dual-PID.ino | 26 ++++++++++++++++++++------ JC_Display_Firmware/Changelog.txt | 6 ++++++ JC_Display_Firmware/config.h | 2 +- JC_Display_Firmware/ui.cpp | 15 ++++++++++++++- 5 files changed, 54 insertions(+), 8 deletions(-) diff --git a/Changelog.txt b/Changelog.txt index f2b8f51..9b4329f 100644 --- a/Changelog.txt +++ b/Changelog.txt @@ -1,3 +1,16 @@ +Version 5.6.2: +- Bug-Fix: Die Abfrage beim Aufwecken erschien nicht, sobald der Cold-Extraction-Modus noch aktiv war - + und da er persistent ist, war er das nach dem ersten kalten Bezug dauerhaft. Die Bedingung „Modus ist + aus" war falsch gedacht („sonst gibt es nichts zu fragen"): Die Auswahl muss in BEIDE Richtungen gehen, + also auch von kalt zurück auf Espresso. Ohne das hing man nach dem ersten kalten Bezug im kalten Modus + fest, ohne beim Aufwecken je wieder gefragt zu werden. +- „Espresso" beendet jetzt einen laufenden Cold-Extraction-Modus, statt ihn nur nicht einzuschalten. + Sonst wäre die Auswahl eine Einbahnstraße gewesen. +- Das Auswahlfenster bleibt bei aktivem Modus offen (bisher wurde es sofort geschlossen); die Frage + lautet dann „weiter kalt oder zurück auf Espresso?". +- Die Diagnose auf /Cold-Extraction listet den Modus nicht mehr als Voraussetzung, sondern zeigt ihn + als Ist-Zustand an. + Version 5.6.1: - Diagnose: Die Seite /Cold-Extraction zeigt jetzt live, welche Voraussetzungen der Abfrage beim Aufwecken erfüllt sind (freigeschaltet, Abfrage eingeschaltet, Touch-Display verbunden, Modus diff --git a/Dual-PID.ino b/Dual-PID.ino index ff4d575..3b90f9b 100644 --- a/Dual-PID.ino +++ b/Dual-PID.ino @@ -369,7 +369,7 @@ Adafruit_SH1106G display = Adafruit_SH1106G(128, 64, &Wire); * Firmware-Informationen ************************************************************************************/ -String version = "5.6.1"; +String version = "5.6.2"; String versionHersteller = "Thomas Müller"; String versionHerstellerMail = "thomas@mueller.black"; @@ -5448,8 +5448,12 @@ void loop() { // Auswahlfenster oeffnen: gilt fuer JEDEN Weg aus dem Standby (Schalter, Touch, Web, // Timer). Nur sinnvoll mit angeschlossenem Display - ohne das koennte niemand waehlen, // und die Maschine wuerde nur unnoetig spaeter heizen. + // Bewusst OHNE Pruefung auf coldExtractionModeActive: Der Modus ist persistent, und + // die Abfrage muss in BEIDE Richtungen gehen - auch von "kalt" zurueck auf Espresso. + // Sonst bliebe man nach dem ersten kalten Bezug dauerhaft im kalten Modus haengen, + // ohne beim Aufwecken je wieder gefragt zu werden. if (coldExtractionEnabled && coldExtractionAskOnWake && touchUartClientActive && - !coldExtractionModeActive && coldExtractionArmable() && + coldExtractionArmable() && (coldExtractionWakeDecisionMs == 0 || (currentMillis - coldExtractionWakeDecisionMs) > COLDEX_WAKE_DECISION_GRACE_MS)) { coldExtractionWakeChoicePending = true; @@ -5461,8 +5465,7 @@ void loop() { // Einmal pro Laufzeit, sobald sich das Display gemeldet hat. static bool coldExtractionBootChoiceDone = false; if (!coldExtractionBootChoiceDone && !standbyModeActive && touchUartClientActive && - coldExtractionEnabled && coldExtractionAskOnWake && !coldExtractionModeActive && - coldExtractionArmable()) { + coldExtractionEnabled && coldExtractionAskOnWake && coldExtractionArmable()) { coldExtractionBootChoiceDone = true; coldExtractionWakeChoicePending = true; coldExtractionWakeChoiceUntilMs = currentMillis + COLDEX_WAKE_CHOICE_MS; @@ -5473,7 +5476,9 @@ void loop() { // Auswahlfenster beenden: Zeit abgelaufen, Standby, oder es wird ohnehin schon bezogen if (coldExtractionWakeChoicePending) { - if (standbyModeActive || coldExtractionModeActive || shotActive || shotSoftwareActive || + // coldExtractionModeActive ist hier KEIN Abbruchgrund: Bei aktivem Modus ist die + // Frage "weiter kalt oder zurueck auf Espresso?" - das Fenster muss offen bleiben. + if (standbyModeActive || shotActive || shotSoftwareActive || flushActive || !coldExtractionEnabled || (long)(currentMillis - coldExtractionWakeChoiceUntilMs) >= 0) { coldExtractionWakeChoicePending = false; @@ -7854,8 +7859,10 @@ void handleColdExtraction(AsyncWebServerRequest *request) { diag += flag(coldExtractionEnabled, "Funktion freigeschaltet"); diag += flag(coldExtractionAskOnWake, "Abfrage beim Aufwecken eingeschaltet"); diag += flag(touchUartClientActive, "Touch-Display verbunden"); - diag += flag(!coldExtractionModeActive, "Cold-Extraction-Modus derzeit aus (sonst gibt es nichts zu fragen)"); diag += flag(coldExtractionArmable(), "Kein Wartungsmodus / Reinigung / PID-Tuning"); + diag += "Aktueller Modus: "; + diag += coldExtractionModeActive ? "Cold Extraction aktiv" : "normal (Espresso)"; + diag += " - die Abfrage geht in beide Richtungen.
"; if (coldExtractionWakeChoicePending) { long remainMs = (long)(coldExtractionWakeChoiceUntilMs - millis()); long remainSec = (remainMs > 0) ? ((remainMs + 999) / 1000) : 0; @@ -15728,6 +15735,13 @@ bool executeDashboardAction(const String& action, const String& value, else if (action == "wakeEspresso") { coldExtractionWakeDecisionMs = millis(); coldExtractionWakeChoicePending = false; + // "Espresso" heisst auch: einen noch laufenden Cold-Extraction-Modus beenden. + // Ohne das waere die Auswahl eine Einbahnstrasse - der Modus ist persistent und + // liesse sich beim Aufwecken nie wieder abwaehlen. + if (coldExtractionModeActive && !shotActive && !shotSoftwareActive) { + String cxMsg; + setColdExtractionMode(false, cxMsg); + } if (standbyModeActive) { standbyModeActive = false; startupTime = millis(); diff --git a/JC_Display_Firmware/Changelog.txt b/JC_Display_Firmware/Changelog.txt index c379f6c..1b764f6 100644 --- a/JC_Display_Firmware/Changelog.txt +++ b/JC_Display_Firmware/Changelog.txt @@ -1,3 +1,9 @@ +Version 1.4.1: +- Passend zu S3 5.6.2: Die Auswahl beim Aufwecken erscheint auch dann, wenn der Cold-Extraction-Modus + bereits aktiv ist - sie geht in beide Richtungen. „Espresso" schaltet den Modus dann ab. +- Der Cold-Extraction-Knopf zeigt den Ist-Zustand: Bei aktivem Modus ist er hervorgehoben und heißt + „Cold Extraction (aktiv lassen)", sonst „Cold Extraction (Wasser bleibt kalt)". + Version 1.4.0: - Die Auswahl „Espresso oder Cold Extraction" erscheint jetzt auch beim Aufwecken über den Schalter (braucht S3-Firmware ab 5.6.0). Meldet die S3 ein offenes Auswahlfenster (cxWakeChoice), blendet das diff --git a/JC_Display_Firmware/config.h b/JC_Display_Firmware/config.h index 1cc578f..82a6110 100644 --- a/JC_Display_Firmware/config.h +++ b/JC_Display_Firmware/config.h @@ -65,7 +65,7 @@ // ------------------------------------------------------------------------------------- // Firmware // ------------------------------------------------------------------------------------- -#define DISPLAY_FW_VERSION "1.4.0" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) +#define DISPLAY_FW_VERSION "1.4.1" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) // ------------------------------------------------------------------------------------- // Protokoll diff --git a/JC_Display_Firmware/ui.cpp b/JC_Display_Firmware/ui.cpp index f06baad..9861dd9 100644 --- a/JC_Display_Firmware/ui.cpp +++ b/JC_Display_Firmware/ui.cpp @@ -3603,9 +3603,11 @@ void ui_update(const MachineState& st) { // Zwei Faelle: Vorab-Abfrage beim Antippen im Standby (askMode) und das von der S3 // geoeffnete Auswahlfenster NACH dem Aufwecken (choiceOpen) - letzteres deckt auch // das Aufwecken per Schalter ab, wo es keine Vorab-Abfrage geben kann. + // Kein "!st.cxActive": Der Modus ist persistent, die Auswahl muss in beide + // Richtungen gehen - sonst haengt man nach dem ersten kalten Bezug dauerhaft fest. const bool choiceOpen = st.cxWakeChoice; const bool askMode = choiceOpen || - (st.cxEnabled && st.cxArmable && !st.cxActive && st.cxAskOnWake); + (st.cxEnabled && st.cxArmable && st.cxAskOnWake); if (g_wakeColdBtn) { if (askMode) lv_obj_remove_flag(g_wakeColdBtn, LV_OBJ_FLAG_HIDDEN); else lv_obj_add_flag(g_wakeColdBtn, LV_OBJ_FLAG_HIDDEN); @@ -3631,6 +3633,17 @@ void ui_update(const MachineState& st) { if (g_wakeYesLbl) { label_set_if_changed(g_wakeYesLbl, askMode ? "Espresso" : "Aufwecken"); } + // Aktive Wahl hervorheben: Bei laufendem Modus ist "Cold Extraction" der Ist-Zustand, + // "Espresso" schaltet ihn ab - andersherum genauso. + if (g_wakeColdBtn && askMode) { + lv_obj_set_style_bg_color(g_wakeColdBtn, st.cxActive ? COL_ACCENT : COL_CARD2, 0); + lv_obj_t* coldLbl = lv_obj_get_child(g_wakeColdBtn, 0); + if (coldLbl) { + lv_obj_set_style_text_color(coldLbl, st.cxActive ? lv_color_hex(0x000000) : COL_ACCENT, 0); + label_set_if_changed(coldLbl, st.cxActive ? "Cold Extraction (aktiv lassen)" + : "Cold Extraction (Wasser bleibt kalt)"); + } + } // Auswahlfenster von der S3 -> Dialog von sich aus zeigen (kein Antippen noetig) if (choiceOpen && g_wakeConfirm && lv_obj_has_flag(g_wakeConfirm, LV_OBJ_FLAG_HIDDEN)) { wake_confirm_show();