fix(P4): Kachelwerte auf gleicher Höhe, Menü breiter (1.13.1) #93

Merged
thomas merged 1 commits from fix/p4-kachelhoehen-und-menuebreite into main 2026-09-13 01:26:20 +02:00
3 changed files with 32 additions and 20 deletions

No files matched your search

+9
View File
@@ -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: Version 1.13.0:
- Neue Oberfläche für die Startseite und das Menü. Die Anordnung bleibt, was sie war - - 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 Statuszeile, zwei Kessel, darunter die Werte -, aber jede Beschriftung trägt jetzt ihr
+1 -1
View File
@@ -126,7 +126,7 @@
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
// Firmware // 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 // Protokoll
+22 -19
View File
@@ -1702,7 +1702,8 @@ static void build_temp_row_content() {
// Feste Masse in beide Richtungen - siehe die ausfuehrliche Begruendung in tempField. // 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, 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** 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_t* card = th_card(parent);
lv_obj_set_height(card, LV_PCT(100)); lv_obj_set_height(card, LV_PCT(100));
lv_obj_set_flex_grow(card, 1); // alle Zellen teilen sich die Breite gleichmaessig 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); lv_obj_set_height(sl, lv_font_get_line_height(font_small()) + 2);
if (sub) *sub = sl; if (sub) *sub = sl;
return 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
// Zielfortschritt unter einer Kachel (Shot-Zeit, Bezugsgewicht, Dampfzeit). // nichts zu sagen hat, bleibt er durchsichtig.
static lv_obj_t* zielBalken(lv_obj_t* card) {
lv_obj_t* b = lv_bar_create(card); lv_obj_t* b = lv_bar_create(card);
lv_obj_set_width(b, LV_PCT(100)); lv_obj_set_width(b, LV_PCT(100));
lv_obj_set_height(b, 6); 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_obj_set_style_radius(b, 3, LV_PART_INDICATOR);
lv_bar_set_range(b, 0, 100); lv_bar_set_range(b, 0, 100);
lv_bar_set_value(b, 0, LV_ANIM_OFF); 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); 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, // Tipp auf die Statuszeile: Wartung -> Serviceseite, Reinigung -> Sub-Screen,
// PID-Tuning -> Verlauf-Seite (dort liegen Live-Karte und Schwingungskurve) // PID-Tuning -> Verlauf-Seite (dort liegen Live-Karte und Schwingungskurve)
static void status_line_cb(lv_event_t*) { 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_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_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); lv_obj_clear_flag(ir, LV_OBJ_FLAG_SCROLLABLE);
cellShot = infoCell(ir, "SHOT", &sym_stoppuhr, &lblShotTimer, COL_ACCENT, &lblShotSub); cellShot = infoCell(ir, "SHOT", &sym_stoppuhr, &lblShotTimer, COL_ACCENT,
g_bbtBar = zielBalken(cellShot); // Brew-by-Time: verstrichen/Ziel &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_flag(cellBezug, LV_OBJ_FLAG_CLICKABLE); // antippbar -> Brew-Control
lv_obj_add_event_cb(cellBezug, brew_cell_cb, LV_EVENT_CLICKED, nullptr); 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 // 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 // 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_flag(cellFlow, LV_OBJ_FLAG_CLICKABLE); // antippbar -> Brew-Control
lv_obj_add_event_cb(cellFlow, brew_cell_cb, LV_EVENT_CLICKED, nullptr); 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); cellSteam = infoCell(ir, "DAMPF", &sym_dampf, &lblSteamTimer, lv_color_hex(0x80cbc4),
g_sbtBar = zielBalken(cellSteam); // Steam-by-Time: verstrichen/Ziel &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), 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. // 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 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_add_event_cb(g_drawer, scrim_cb, LV_EVENT_CLICKED, nullptr);
lv_obj_t* menu = lv_obj_create(g_drawer); 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_pos(menu, 0, 0);
lv_obj_set_style_bg_color(menu, COL_CARD2, 0); lv_obj_set_style_bg_color(menu, COL_CARD2, 0);
lv_obj_set_style_border_width(menu, 0, 0); lv_obj_set_style_border_width(menu, 0, 0);