From 95373dc619691a646cc64afd584648115d5d538c Mon Sep 17 00:00:00 2001 From: raw-designs Date: Wed, 2 Sep 2026 17:24:42 +0200 Subject: [PATCH] feat(P4): Brew-Control zweispaltig auf dem 7-Zoll-Panel (1.7.0) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Seiten sind als einspaltige Stapel für 800x480 entstanden. Auf 1280x720 bleibt daneben rund 40 % der Fläche leer, während unten Karten aus dem Bild fallen - und Scrollen ist auf diesem Panel teuer, weil ohne Doppelpufferung jedes Bild komplett neu entsteht. - Neue Helfer page_grid() und grid_at() legen eine Seite als LVGL-Raster an. - build_brew() ordnet die vier Karten in zwei Spalten: links was den Bezug startet (Pre-Infusion, Brew-by-Time), rechts was ihn beendet (Brew-by-Weight, Dampf-Timer). - Der Speichern-Knopf steht frei unter allen Karten statt in einer davon - er speichert die ganze Seite. - Nur für WS_PANEL_7H; die JC-Panels bleiben einspaltig. Beide Panel-Varianten mit arduino-cli gegengebaut. Co-Authored-By: Claude Opus 5 --- P4_Display_Firmware/Changelog.txt | 12 +++++++ P4_Display_Firmware/ui.cpp | 53 +++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/P4_Display_Firmware/Changelog.txt b/P4_Display_Firmware/Changelog.txt index f3a29cb..3cb7c71 100644 --- a/P4_Display_Firmware/Changelog.txt +++ b/P4_Display_Firmware/Changelog.txt @@ -1,3 +1,15 @@ +Version 1.7.0: +- Brew-Control ist auf dem 7-Zoll-Panel zweispaltig: Pre-Infusion und Brew-by-Weight oben, + Brew-by-Time und Dampf-Timer darunter, der Speichern-Knopf frei unter allen Karten. + Damit passt die Seite vollstaendig auf den Bildschirm und muss nicht mehr gescrollt + werden - der teuerste Vorgang der Oberflaeche entfaellt dort ersatzlos. +- Die Anordnung folgt der Bedeutung: links steht, was den Bezug startet, rechts, was ihn + beendet. +- Der Speichern-Knopf sitzt bewusst nicht in einer der Karten. Er speichert die ganze Seite + und wuerde in einer einzelnen Karte so wirken, als gaelte er nur fuer diese. +- Die JC-Panels bleiben einspaltig - dort ist der Platz knapp, nicht ueppig. +- Cold Extraction und Reinigung/Wartung folgen als naechstes. + Version 1.6.27: - Beim Waveshare-Panel rollen scrollbare Listen nach dem Loslassen nicht mehr aus, sondern folgen nur dem Finger. Ohne Doppelpufferung entsteht beim Scrollen jedes Bild komplett diff --git a/P4_Display_Firmware/ui.cpp b/P4_Display_Firmware/ui.cpp index cc4f272..723ca1b 100644 --- a/P4_Display_Firmware/ui.cpp +++ b/P4_Display_Firmware/ui.cpp @@ -459,6 +459,43 @@ static void add_save_button(lv_obj_t* parent, const char* txt, lv_event_cb_t cb) // // Nur fuer das Waveshare-Panel: Die JC-Panels haben das Tempoproblem nicht, ihr // Bediengefuehl soll unveraendert bleiben. + +// ------------------------------------------------------------------------------------ +// Mehrspaltige Seiten fuer das grosse Panel +// +// Die Seiten sind als einspaltige Stapel entstanden - entworfen fuer 800x480, wo eine +// Spalte alles ist, was hineinpasst. Auf 1280x720 bleibt daneben rund 40 % der Flaeche +// leer, waehrend unten Karten aus dem Bild fallen und gescrollt werden muss. Und Scrollen +// ist auf diesem Panel teuer: Ohne Doppelpufferung entsteht dabei jedes Bild komplett neu. +// +// Deshalb hier ein Raster statt eines Stapels. Passt eine Seite vollstaendig auf den +// Bildschirm, entfaellt der teuerste Vorgang der Oberflaeche ersatzlos. +// +// Die JC-Panels bleiben einspaltig: Dort ist der Platz knapp, nicht ueppig. +// ------------------------------------------------------------------------------------ +#if JC_PANEL_TYPE == WS_PANEL_7H +static const int32_t PAGE_COLS_2[] = { LV_GRID_FR(1), LV_GRID_FR(1), LV_GRID_TEMPLATE_LAST }; +// Zwei Kartenreihen, darunter eine Reihe fuer den Speichern-Knopf. +static const int32_t PAGE_ROWS_2C[] = { LV_GRID_CONTENT, LV_GRID_CONTENT, LV_GRID_CONTENT, + LV_GRID_TEMPLATE_LAST }; + +static void page_grid(lv_obj_t* p, const int32_t* cols, const int32_t* rows) { + lv_obj_set_layout(p, LV_LAYOUT_GRID); + lv_obj_set_grid_dsc_array(p, cols, rows); + lv_obj_set_style_pad_column(p, 12, 0); + lv_obj_set_style_pad_row(p, 12, 0); +} + +// Karte in eine Rasterzelle setzen. Die Breite kommt ab jetzt aus der Spalte, deshalb muss +// die Prozentbreite aus group_card() zurueckgenommen werden - sie bezoege sich sonst auf +// die ganze Seite statt auf die Zelle. +static void grid_at(lv_obj_t* c, uint8_t col, uint8_t row, uint8_t col_span = 1) { + lv_obj_set_width(c, LV_SIZE_CONTENT); + lv_obj_set_grid_cell(c, LV_GRID_ALIGN_STRETCH, col, col_span, + LV_GRID_ALIGN_START, row, 1); +} +#endif + static void scroll_ohne_nachlauf(lv_obj_t* o) { #if JC_PANEL_TYPE == WS_PANEL_7H lv_obj_clear_flag(o, LV_OBJ_FLAG_SCROLL_MOMENTUM); @@ -2102,7 +2139,23 @@ static void build_brew(lv_obj_t* p) { swSBT = add_switch(cSBT, "Aktiv"); taSbtSecs = add_num(cSBT, "Zielzeit (s)"); +#if JC_PANEL_TYPE == WS_PANEL_7H + // Zwei Spalten: links, was den Bezug startet, rechts, was ihn beendet. + page_grid(p, PAGE_COLS_2, PAGE_ROWS_2C); + grid_at(cPI, 0, 0); + grid_at(cBBW, 1, 0); + grid_at(cBBT, 0, 1); + grid_at(cSBT, 1, 1); + + // Speichern frei unter den Karten, nicht in einer davon: Der Knopf speichert die ganze + // Seite und wuerde in einer einzelnen Karte so wirken, als gaelte er nur fuer diese. + lv_obj_t* sb = th_accent_button(p, "Brühen speichern"); + lv_obj_add_event_cb(sb, send_save_brew, LV_EVENT_CLICKED, nullptr); + lv_obj_set_width(sb, LV_SIZE_CONTENT); + lv_obj_set_grid_cell(sb, LV_GRID_ALIGN_END, 0, 2, LV_GRID_ALIGN_START, 2, 1); +#else add_save_button(p, "Brühen speichern", send_save_brew); +#endif } // ===================================================================================== -- 2.54.0