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();