fix: Zielgewicht bei Cold Extraction überall korrekt anzeigen (S3 5.4.1 / P4 1.2.1)
Während einer kalten Extraktion stand als Zielgewicht überall noch der Brew-by-Weight-Wert des normalen Espresso-Bezugs. OLED, Web-Dashboard und Touch-Display griffen alle direkt auf brewByWeightTargetGrams zu — die kalte Extraktion ersetzt Brew-by-Weight aber und stoppt nach coldExtractionTargetGrams. Neue Hilfsfunktion activeTargetWeightGrams() liefert das Ziel des aktuellen bzw. nächsten Bezugs. Das UART-Feld targetWeight führt jetzt diesen Wert; bbwTarget bleibt unverändert die Roh-Einstellung, damit die Brew-Control-Seite weiter das Richtige anzeigt. Zusätzlich hing die Gewichtsanzeige selbst an "Brew-by-Weight aktiv" — das ist bei kalter Extraktion typischerweise aus, obwohl ein Ziel existiert. OLED, Waage-Kachel und Live-Bezugsschirm zeigen Gewicht und Fortschritt jetzt auch beim kalten Bezug. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
e8b1832fc1
commit
334896b9cf
@@ -1858,12 +1858,16 @@ static void brew_live_tick() {
|
||||
}
|
||||
// Zielfortschritt: Brew-by-Weight (Gewicht) vor Brew-by-Time (Zeit), sonst versteckt
|
||||
if (g_bzBarRow && g_bzBar && g_bzBarLbl) {
|
||||
bool bbw = scale && g_state.bbwEnabled && g_state.bbwTarget > 0.0f;
|
||||
// Ein kalter Bezug hat sein eigenes Ziel (cxTarget) und ersetzt Brew-by-Weight -
|
||||
// sonst stuende hier das Espresso-Ziel.
|
||||
const bool cxShotNow = g_state.cxShot && g_state.cxTarget > 0.0f;
|
||||
const float wTarget = cxShotNow ? g_state.cxTarget : g_state.bbwTarget;
|
||||
bool bbw = scale && (cxShotNow || (g_state.bbwEnabled && g_state.bbwTarget > 0.0f));
|
||||
if (bbw || (g_shotBbtMode && g_bbtTarget > 0.0f)) {
|
||||
int pct;
|
||||
if (bbw) {
|
||||
pct = (int)(w / g_state.bbwTarget * 100.0f + 0.5f);
|
||||
snprintf(b, sizeof(b), "%.1f g / %.1f g", w, g_state.bbwTarget);
|
||||
pct = (int)(w / wTarget * 100.0f + 0.5f);
|
||||
snprintf(b, sizeof(b), "%.1f g / %.1f g", w, wTarget);
|
||||
} else {
|
||||
pct = (int)(el / g_bbtTarget * 100.0f + 0.5f);
|
||||
snprintf(b, sizeof(b), "%.1f s / %.1f s", el, g_bbtTarget);
|
||||
@@ -3915,7 +3919,10 @@ void ui_update(const MachineState& st) {
|
||||
else lv_obj_add_flag(cellBezug, LV_OBJ_FLAG_HIDDEN);
|
||||
}
|
||||
if (lblBezug) {
|
||||
bool bbwShot = st.shotActive && st.bbwEnabled && st.bbwTarget > 0.0f;
|
||||
// Bei kaltem Bezug zaehlt cxTarget, nicht das Brew-by-Weight-Ziel
|
||||
const bool cxShotNow = st.cxShot && st.cxTarget > 0.0f;
|
||||
const float shotTarget = cxShotNow ? st.cxTarget : st.bbwTarget;
|
||||
bool bbwShot = st.shotActive && (cxShotNow || (st.bbwEnabled && st.bbwTarget > 0.0f));
|
||||
// Winzige negative Messwerte (z.B. -0.04 g) oder negatives Float-Null wuerden von
|
||||
// "%.1f" als "-0.0" dargestellt -> auf 0.0 normalisieren (kein fuehrendes Minus).
|
||||
float wDisp = st.weight;
|
||||
@@ -3924,14 +3931,14 @@ void ui_update(const MachineState& st) {
|
||||
lv_label_set_text(lblBezug, "--");
|
||||
} else if (bbwShot) {
|
||||
// Waehrend des Bezugs mit Brew-by-Weight: Ist oben, Ziel darunter (zweizeilig)
|
||||
lv_label_set_text_fmt(lblBezug, "%.1f g\n/ %.1f g", wDisp, st.bbwTarget);
|
||||
lv_label_set_text_fmt(lblBezug, "%.1f g\n/ %.1f g", wDisp, shotTarget);
|
||||
} else {
|
||||
lv_label_set_text_fmt(lblBezug, "%.1f g", wDisp);
|
||||
}
|
||||
// Fortschrittsbalken Gewicht/Ziel (nur waehrend BBW-Bezug)
|
||||
if (g_bbwBar) {
|
||||
if (bbwShot) {
|
||||
int pct = (int)(st.weight / st.bbwTarget * 100.0f + 0.5f);
|
||||
int pct = (int)(st.weight / shotTarget * 100.0f + 0.5f);
|
||||
if (pct < 0) pct = 0; if (pct > 100) pct = 100;
|
||||
lv_bar_set_value(g_bbwBar, pct, LV_ANIM_OFF);
|
||||
lv_obj_remove_flag(g_bbwBar, LV_OBJ_FLAG_HIDDEN);
|
||||
|
||||
Reference in New Issue
Block a user