diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index 5e20372..ba5d260 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,12 @@ +Version 1.13.1: +- Zahlen und Nebenzeilen der Kacheln stehen in allen Kacheln auf derselben Höhe. Bisher + hatten nur Shot, Waage und Dampf einen Fortschrittsbalken - das Layout verteilte die Höhe + dadurch je Kachel anders, und Zahlen wie Nebenzeilen saßen unterschiedlich hoch. Der + Balken gehört jetzt zu jeder Kachel und bleibt dort durchsichtig, wo er nichts zu sagen + hat. +- Das Menü ist breiter (400 statt 340 Pixel), damit auch lange Beschriftungen samt + Nebenwert bequem in eine Zeile passen. + Version 1.13.0: - Neue Oberfläche für die Startseite und das Menü. Die Anordnung bleibt, was sie war - Statuszeile, zwei Kessel, darunter die Werte -, aber jede Beschriftung trägt jetzt ihr diff --git a/P4_Display_Firmware/config.h b/P4_Display_Firmware/config.h index d45217a..eba8725 100644 --- a/P4_Display_Firmware/config.h +++ b/P4_Display_Firmware/config.h @@ -126,7 +126,7 @@ // ------------------------------------------------------------------------------------- // Firmware // ------------------------------------------------------------------------------------- -#define DISPLAY_FW_VERSION "1.13.0" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) +#define DISPLAY_FW_VERSION "1.13.1" // Firmware-Stand der P4-Display-Steuerung (Info-Seite) // ------------------------------------------------------------------------------------- // Protokoll diff --git a/P4_Display_Firmware/ui.cpp b/P4_Display_Firmware/ui.cpp index 06cffa7..492d305 100644 --- a/P4_Display_Firmware/ui.cpp +++ b/P4_Display_Firmware/ui.cpp @@ -1702,7 +1702,8 @@ static void build_temp_row_content() { // Feste Masse in beide Richtungen - siehe die ausfuehrliche Begruendung in tempField. static lv_obj_t* infoCell(lv_obj_t* parent, const char* title, const lv_image_dsc_t* bild, lv_obj_t** val, lv_color_t accent, lv_obj_t** sub = nullptr, - lv_obj_t** titleOut = nullptr, lv_obj_t** iconOut = nullptr) { + lv_obj_t** bar = nullptr, lv_obj_t** titleOut = nullptr, + lv_obj_t** iconOut = nullptr) { lv_obj_t* card = th_card(parent); lv_obj_set_height(card, LV_PCT(100)); lv_obj_set_flex_grow(card, 1); // alle Zellen teilen sich die Breite gleichmaessig @@ -1738,11 +1739,10 @@ static lv_obj_t* infoCell(lv_obj_t* parent, const char* title, const lv_image_ds lv_obj_set_height(sl, lv_font_get_line_height(font_small()) + 2); if (sub) *sub = sl; - return card; -} - -// Zielfortschritt unter einer Kachel (Shot-Zeit, Bezugsgewicht, Dampfzeit). -static lv_obj_t* zielBalken(lv_obj_t* card) { + // Der Zielbalken gehoert zu JEDER Kachel, auch wenn sie ihn nie benutzt. Haetten nur + // manche Kacheln ihn, verteilte das Layout die Hoehe unterschiedlich - Zahlen und + // Nebenzeilen staenden dann von Kachel zu Kachel auf verschiedenen Hoehen. Wo er + // nichts zu sagen hat, bleibt er durchsichtig. lv_obj_t* b = lv_bar_create(card); lv_obj_set_width(b, LV_PCT(100)); lv_obj_set_height(b, 6); @@ -1753,12 +1753,12 @@ static lv_obj_t* zielBalken(lv_obj_t* card) { lv_obj_set_style_radius(b, 3, LV_PART_INDICATOR); lv_bar_set_range(b, 0, 100); lv_bar_set_value(b, 0, LV_ANIM_OFF); - // Ausserhalb eines Bezugs durchsichtig, NICHT versteckt: Ein verstecktes Element - // faellt aus dem Flex-Layout heraus, und die Zahl darueber rueckte dann bei jedem - // Bezugsbeginn ein Stueck nach unten. lv_obj_set_style_opa(b, LV_OPA_TRANSP, 0); - return b; + if (bar) *bar = b; + + return card; } + // Tipp auf die Statuszeile: Wartung -> Serviceseite, Reinigung -> Sub-Screen, // PID-Tuning -> Verlauf-Seite (dort liegen Live-Karte und Schwingungskurve) static void status_line_cb(lv_event_t*) { @@ -1841,13 +1841,13 @@ static void build_dashboard(lv_obj_t* p) { lv_obj_set_flex_flow(ir, LV_FLEX_FLOW_ROW); lv_obj_set_flex_align(ir, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); lv_obj_clear_flag(ir, LV_OBJ_FLAG_SCROLLABLE); - cellShot = infoCell(ir, "SHOT", &sym_stoppuhr, &lblShotTimer, COL_ACCENT, &lblShotSub); - g_bbtBar = zielBalken(cellShot); // Brew-by-Time: verstrichen/Ziel + cellShot = infoCell(ir, "SHOT", &sym_stoppuhr, &lblShotTimer, COL_ACCENT, + &lblShotSub, &g_bbtBar); // Balken: verstrichen/Ziel - cellBezug = infoCell(ir, "WAAGE", &sym_waage, &lblBezug, COL_ACCENT, &lblBezugSub); + cellBezug = infoCell(ir, "WAAGE", &sym_waage, &lblBezug, COL_ACCENT, + &lblBezugSub, &g_bbwBar); // Balken: Gewicht/Ziel lv_obj_add_flag(cellBezug, LV_OBJ_FLAG_CLICKABLE); // antippbar -> Brew-Control lv_obj_add_event_cb(cellBezug, brew_cell_cb, LV_EVENT_CLICKED, nullptr); - g_bbwBar = zielBalken(cellBezug); // Brew-by-Weight: Gewicht/Ziel // Die Flusskachel steht dauerhaft, auch wenn gerade nichts laeuft. Frueher erschien sie // erst mit dem Bezug - dabei ruecken alle anderen Kacheln zur Seite, und genau in dem @@ -1856,12 +1856,13 @@ static void build_dashboard(lv_obj_t* p) { lv_obj_add_flag(cellFlow, LV_OBJ_FLAG_CLICKABLE); // antippbar -> Brew-Control lv_obj_add_event_cb(cellFlow, brew_cell_cb, LV_EVENT_CLICKED, nullptr); - cellSteam = infoCell(ir, "DAMPF", &sym_dampf, &lblSteamTimer, lv_color_hex(0x80cbc4), &lblSteamSub); - g_sbtBar = zielBalken(cellSteam); // Steam-by-Time: verstrichen/Ziel + cellSteam = infoCell(ir, "DAMPF", &sym_dampf, &lblSteamTimer, lv_color_hex(0x80cbc4), + &lblSteamSub, &g_sbtBar); // Balken: verstrichen/Ziel - cellEco = infoCell(ir, "ECO", &sym_blatt, &lblEco, COL_OK, &lblEcoSub, &lblEcoTitle, &icoEco); + cellEco = infoCell(ir, "ECO", &sym_blatt, &lblEco, COL_OK, + &lblEcoSub, nullptr, &lblEcoTitle, &icoEco); cellCase = infoCell(ir, "TASSENABLAGE", &sym_tasse, &lblCase, lv_color_hex(0xffb74d), - &lblCaseSub, &lblCaseTitle, &icoCase); + &lblCaseSub, nullptr, &lblCaseTitle, &icoCase); // Beide zeigen sich, sobald es etwas zu zeigen gibt - unabhaengig voneinander. lv_obj_add_flag(cellEco, LV_OBJ_FLAG_HIDDEN); // erst zeigen, wenn die S3 Eco-Info meldet @@ -4323,7 +4324,9 @@ void ui_init(ProtocolClient* client) { lv_obj_add_event_cb(g_drawer, scrim_cb, LV_EVENT_CLICKED, nullptr); lv_obj_t* menu = lv_obj_create(g_drawer); - lv_obj_set_size(menu, 340, LV_PCT(100)); + // Breit genug, dass auch die langen Beschriftungen samt Nebenwert in eine Zeile passen + // ("Reinigung/Wartung" mit "fällig", "Cold Extraction"). + lv_obj_set_size(menu, 400, LV_PCT(100)); lv_obj_set_pos(menu, 0, 0); lv_obj_set_style_bg_color(menu, COL_CARD2, 0); lv_obj_set_style_border_width(menu, 0, 0);