Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b3b96362c3 | ||
|
|
14f1a4789d | ||
|
|
326af4288a | ||
|
|
2e8651bc00 | ||
|
|
b13e5fdaf1 | ||
|
|
671a6696ce | ||
|
|
288f61447d | ||
|
|
a91c792491 |
@@ -1,3 +1,50 @@
|
||||
Version 1.9.6:
|
||||
- Die Darstellungseinstellungen haben einen eigenen Menüpunkt „Darstellung" bekommen. Sie
|
||||
standen bisher oben auf der Info-Seite, zwischen Sachen, mit denen sie nichts zu tun
|
||||
haben. Die Info-Seite zeigt jetzt nur noch Firmware-Stände und Verbindungsdaten.
|
||||
- Die Uhr im Standby ist auf dem 7-Zoll-Panel deutlich größer geworden: Die drei Stufen
|
||||
liegen jetzt bei 180, 270 und 360 Pixeln statt bei 120, 180 und 240. Auf dem 4,3-Zoll-
|
||||
Panel bleiben die bisherigen Stufen, dort passen größere schlicht nicht auf den Schirm.
|
||||
|
||||
Version 1.9.5:
|
||||
- Die festen Breiten aus 1.9.4 haben nicht gereicht: Auch die HÖHE muss festliegen. LVGL
|
||||
prüft beim Setzen eines Textes, ob sich die Eigengröße der Beschriftung geändert haben
|
||||
könnte - ist eines der beiden Maße frei, gilt das Layout des Elternteils als neu zu
|
||||
berechnen, und das macht die ganze Seite ungültig. Temperaturwerte, Sollwerte, die Werte
|
||||
der unteren Zeile und die Uhrzeit in der Kopfleiste haben jetzt feste Maße in beide
|
||||
Richtungen.
|
||||
- Die Uhrzeit hatte denselben Effekt in der Kopfleiste: Beim Wechsel der Minute wurde die
|
||||
Leiste samt Menü-Knopf neu berechnet. Das erklärt den Bereich „x 6..57, y 2..41", der in
|
||||
fast jedem Durchgang auftauchte.
|
||||
- Zusätzlich meldet die Firmware jetzt, wenn der Inhaltsbereich oder die Dashboard-Seite als
|
||||
Ganzes ungültig gemacht wird. Damit ist zu unterscheiden, ob eine einzelne Beschriftung
|
||||
den Bildaufbau auslöst oder gleich der komplette Bereich - zwei verschiedene Ursachen mit
|
||||
verschiedenen Gegenmitteln.
|
||||
|
||||
Version 1.9.4:
|
||||
- Die Messung mit Koordinaten hat den Verursacher benannt: Der ungültige Bereich war
|
||||
„x 0..1279, y 44..719" - also der gesamte Inhalt unterhalb der Kopfleiste, bei jeder
|
||||
Zustandsmeldung.
|
||||
- Grund: Die Anzeigewerte hatten keine feste Breite. Wächst oder schrumpft eine Beschriftung
|
||||
mit ihrem Inhalt - etwa von „92,4 °C" auf „100,1 °C" -, rechnet LVGL das Layout der
|
||||
gesamten Seite neu und macht sie dabei komplett ungültig. Es genügt also nicht, den Text
|
||||
nur bei echter Änderung zu setzen; er darf beim Ändern auch die Breite nicht verändern.
|
||||
- Temperaturwerte, Sollwerte und die Werte der unteren Zeile haben jetzt eine feste Breite
|
||||
mit zentriertem Text. Sichtbar ändert sich dadurch nichts - die Werte standen ohnehin
|
||||
mittig.
|
||||
|
||||
Version 1.9.3:
|
||||
- Fehlerbehebung: Bei geöffnetem Menü war der Seiteninhalt dahinter verschwunden. Der
|
||||
Vorhang des Menüs war in 1.8.7 deckend gemacht worden, um Zeichenlast zu sparen - dabei
|
||||
verdeckt er aber genau das, was sichtbar bleiben soll. Er ist wieder durchscheinend.
|
||||
- Weitere Stellen umgestellt, die bei jeder Zustandsmeldung neu zeichnen ließen, obwohl sich
|
||||
nichts geändert hatte: das Zustandsband der Darstellung „Band" (es spannt sich über die
|
||||
volle Breite und machte damit allein schon einen Streifen über den ganzen Bildschirm
|
||||
ungültig), die Heizleistungsbalken und das WLAN-Symbol.
|
||||
- Die Messung nennt jetzt zusätzlich die Lage der neu gezeichneten Bereiche. Die Größe
|
||||
allein sagt nicht, welcher Teil der Oberfläche das Neuzeichnen auslöst - die Koordinaten
|
||||
schon.
|
||||
|
||||
Version 1.9.2:
|
||||
- Ursache der Trägheit endlich gefunden. Die erweiterte Messung zeigte: „1 Bereich, 100 %
|
||||
der Fläche" - LVGL zeichnete bei jeder Zustandsmeldung den kompletten Bildschirm neu, also
|
||||
|
||||
@@ -571,7 +571,9 @@
|
||||
LV_FONT_DECLARE(lv_font_maven_pro_bold_140) \
|
||||
LV_FONT_DECLARE(lv_font_clock_120) \
|
||||
LV_FONT_DECLARE(lv_font_clock_180) \
|
||||
LV_FONT_DECLARE(lv_font_clock_240)
|
||||
LV_FONT_DECLARE(lv_font_clock_240) \
|
||||
LV_FONT_DECLARE(lv_font_clock_270) \
|
||||
LV_FONT_DECLARE(lv_font_clock_360)
|
||||
|
||||
/*Always set a default font*/
|
||||
#define LV_FONT_DEFAULT &lv_font_maven_pro_14
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+79
-19
@@ -127,8 +127,8 @@ static lv_obj_t* g_otaStatus = nullptr;
|
||||
static lv_obj_t* g_otaBytes = nullptr;
|
||||
|
||||
// Navigation
|
||||
enum { PG_DASH = 0, PG_CHART, PG_STATS, PG_TEMP, PG_BREW, PG_COLDEX, PG_SERVICE, PG_PROFILE, PG_LIGHT, PG_WIFI, PG_INFO, PG_COUNT };
|
||||
static const char* PAGE_NAMES[PG_COUNT] = { "Dashboard", "Verlauf", "Statistik", "Temperatur", "Brew-Control", "Cold Extraction", "Reinigung/Wartung", "Profile", "Licht", "WiFi", "Info" };
|
||||
enum { PG_DASH = 0, PG_CHART, PG_STATS, PG_TEMP, PG_BREW, PG_COLDEX, PG_SERVICE, PG_PROFILE, PG_LIGHT, PG_WIFI, PG_DISPLAY, PG_INFO, PG_COUNT };
|
||||
static const char* PAGE_NAMES[PG_COUNT] = { "Dashboard", "Verlauf", "Statistik", "Temperatur", "Brew-Control", "Cold Extraction", "Reinigung/Wartung", "Profile", "Licht", "WiFi", "Darstellung", "Info" };
|
||||
static lv_obj_t* g_content = nullptr;
|
||||
static lv_obj_t* g_pages[PG_COUNT] = { nullptr };
|
||||
static lv_obj_t* g_drawer = nullptr;
|
||||
@@ -700,9 +700,17 @@ static lv_obj_t* g_clockSizeBtn[3] = {};
|
||||
|
||||
static const lv_font_t* clock_font() {
|
||||
switch (g_clockSize) {
|
||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
||||
// 7 Zoll, 1280x720: Hier war selbst die groesste Stufe noch zu klein.
|
||||
case UHR_KLEIN: return &lv_font_clock_180;
|
||||
case UHR_MITTEL: return &lv_font_clock_270;
|
||||
default: return &lv_font_clock_360;
|
||||
#else
|
||||
// 4,3 Zoll, 480x480: Groessere Stufen passen schlicht nicht auf das Panel.
|
||||
case UHR_KLEIN: return &lv_font_clock_120;
|
||||
case UHR_MITTEL: return &lv_font_clock_180;
|
||||
default: return &lv_font_clock_240;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -986,8 +994,11 @@ static lv_color_t temp_state_color(float temp, float set) {
|
||||
static void temp_progress_set(lv_obj_t* bar, lv_obj_t* arc, lv_obj_t* bulb, int pct, lv_color_t col) {
|
||||
if (pct > 100) pct = 100; else if (pct < 0) pct = 0;
|
||||
if (bar) {
|
||||
lv_bar_set_value(bar, pct, LV_ANIM_OFF);
|
||||
lv_obj_set_style_bg_color(bar, col, LV_PART_INDICATOR);
|
||||
// Wert und Farbe nur bei echter Aenderung setzen - beides macht den Balken sonst
|
||||
// bei jeder Zustandsmeldung ungueltig, obwohl sich meist nichts bewegt hat.
|
||||
if (lv_bar_get_value(bar) != pct) lv_bar_set_value(bar, pct, LV_ANIM_OFF);
|
||||
if (lv_color_to_u32(lv_obj_get_style_bg_color(bar, LV_PART_INDICATOR)) != lv_color_to_u32(col))
|
||||
lv_obj_set_style_bg_color(bar, col, LV_PART_INDICATOR);
|
||||
}
|
||||
if (arc) {
|
||||
lv_arc_set_value(arc, pct);
|
||||
@@ -1053,6 +1064,18 @@ static lv_obj_t* tempField(lv_obj_t* parent, const char* title, lv_color_t accen
|
||||
lv_label_set_text(*big, "--.-");
|
||||
lv_obj_set_style_text_color(*big, COL_TEXT, 0);
|
||||
lv_obj_set_style_text_font(*big, valueFont, 0);
|
||||
// Feste Breite, Text zentriert. Waechst oder schrumpft eine Beschriftung mit ihrem
|
||||
// Inhalt - etwa von "92,4 °C" auf "100,1 °C" -, rechnet LVGL das Flex-Layout der
|
||||
// gesamten Seite neu und macht sie damit komplett ungueltig. Genau das war im
|
||||
// Messprotokoll als "x 0..1279, y 44..719" zu sehen: der ganze Inhaltsbereich, bei
|
||||
// jeder Zustandsmeldung. Mit fester Breite bleibt nur die Beschriftung selbst ungueltig.
|
||||
lv_obj_set_width(*big, LV_PCT(100));
|
||||
lv_obj_set_style_text_align(*big, LV_TEXT_ALIGN_CENTER, 0);
|
||||
// Auch die HOEHE muss fest sein. LVGL prueft beim Setzen eines Textes, ob sich die
|
||||
// Eigengroesse der Beschriftung geaendert haben koennte - ist eines der beiden Masse
|
||||
// frei, gilt das Layout des Elternteils als neu zu berechnen, und das macht die ganze
|
||||
// Seite ungueltig. Erst mit festen Massen bleibt nur die Beschriftung selbst ungueltig.
|
||||
lv_obj_set_height(*big, lv_font_get_line_height(valueFont) + 6);
|
||||
// Grosse Zahlen etwas enger setzen. Bei dieser Groesse wirken die Werksabstaende
|
||||
// auseinandergezogen; ein paar Pixel weniger binden die Ziffern zu einer Zahl zusammen.
|
||||
if (valueFont == &lv_font_maven_pro_bold_140) lv_obj_set_style_text_letter_space(*big, -3, 0);
|
||||
@@ -1062,6 +1085,9 @@ static lv_obj_t* tempField(lv_obj_t* parent, const char* title, lv_color_t accen
|
||||
lv_label_set_text(*setp, "Soll --.-");
|
||||
lv_obj_set_style_text_color(*setp, COL_TEXT_DIM, 0);
|
||||
lv_obj_set_style_text_font(*setp, font_text(), 0);
|
||||
lv_obj_set_width(*setp, LV_PCT(100));
|
||||
lv_obj_set_style_text_align(*setp, LV_TEXT_ALIGN_CENTER, 0);
|
||||
lv_obj_set_height(*setp, lv_font_get_line_height(font_text()) + 6);
|
||||
|
||||
*bar = lv_bar_create(c);
|
||||
lv_obj_set_size(*bar, LV_PCT(92), 8);
|
||||
@@ -1207,6 +1233,10 @@ static lv_obj_t* infoCell(lv_obj_t* parent, const char* title, lv_obj_t** val, l
|
||||
lv_obj_set_style_text_color(*val, COL_TEXT, 0);
|
||||
lv_obj_set_style_text_font(*val, font_title(), 0);
|
||||
lv_obj_set_style_text_align(*val, LV_TEXT_ALIGN_CENTER, 0); // fuer mehrzeilige Werte
|
||||
// Feste Masse in BEIDE Richtungen - siehe die ausfuehrliche Begruendung in tempField.
|
||||
// Zwei Zeilen Platz, weil manche Werte zweizeilig sind ("32,4 g / 36,0 g").
|
||||
lv_obj_set_width(*val, LV_PCT(100));
|
||||
lv_obj_set_height(*val, lv_font_get_line_height(font_title()) * 2 + 6);
|
||||
return card;
|
||||
}
|
||||
// Tipp auf die Statuszeile: Wartung -> Serviceseite, Reinigung -> Sub-Screen,
|
||||
@@ -3078,8 +3108,10 @@ static void brew_live_sw_cb(lv_event_t* e) {
|
||||
{ Preferences prefs; prefs.begin("ui", false); prefs.putBool("brewlive", g_brewLiveEnabled); prefs.end(); }
|
||||
if (!g_brewLiveEnabled) brew_live_hide(); // laeuft gerade ein Bezug: sofort ausblenden
|
||||
}
|
||||
static void build_info(lv_obj_t* p) {
|
||||
section_title(p, "Darstellung");
|
||||
// Eigener Menuepunkt "Darstellung". Die Einstellungen sassen frueher oben auf der
|
||||
// Info-Seite; dort standen sie zwischen Firmware-Staenden und Verbindungsdaten,
|
||||
// mit denen sie nichts zu tun haben.
|
||||
static void build_display(lv_obj_t* p) {
|
||||
lv_obj_t* dcard = th_card(p);
|
||||
lv_obj_set_width(dcard, LV_PCT(100));
|
||||
lv_obj_set_height(dcard, LV_SIZE_CONTENT);
|
||||
@@ -3132,6 +3164,9 @@ static void build_info(lv_obj_t* p) {
|
||||
sw_set(swBrewLive, g_brewLiveEnabled);
|
||||
lv_obj_add_event_cb(swBrewLive, brew_live_sw_cb, LV_EVENT_VALUE_CHANGED, nullptr);
|
||||
|
||||
}
|
||||
|
||||
static void build_info(lv_obj_t* p) {
|
||||
section_title(p, "Firmware-Stände & Verbindung");
|
||||
|
||||
lv_obj_t* card = th_card(p);
|
||||
@@ -3493,6 +3528,8 @@ static uint32_t g_refrStart = 0;
|
||||
|
||||
static uint32_t g_refrPixels = 0;
|
||||
static uint32_t g_refrAreas = 0;
|
||||
static lv_area_t g_refrArea[6];
|
||||
static uint8_t g_refrAreaCnt = 0;
|
||||
|
||||
// Beim Start eines Zeichenzyklus festhalten, WIE VIEL neu gezeichnet wird. Erst damit laesst
|
||||
// sich unterscheiden, ob LVGL nur kleine Bereiche anfasst - dann ist das Zeichnen an sich zu
|
||||
@@ -3502,12 +3539,14 @@ static void refr_start_cb(lv_event_t*) {
|
||||
g_refrStart = lv_tick_get();
|
||||
g_refrPixels = 0;
|
||||
g_refrAreas = 0;
|
||||
g_refrAreaCnt = 0;
|
||||
lv_display_t* d = lv_display_get_default();
|
||||
if (!d) return;
|
||||
for (uint16_t i = 0; i < d->inv_p; i++) {
|
||||
if (d->inv_area_joined[i]) continue;
|
||||
const lv_area_t* a = &d->inv_areas[i];
|
||||
g_refrPixels += (uint32_t)(a->x2 - a->x1 + 1) * (uint32_t)(a->y2 - a->y1 + 1);
|
||||
if (g_refrAreaCnt < 6) g_refrArea[g_refrAreaCnt++] = *a;
|
||||
g_refrAreas++;
|
||||
}
|
||||
}
|
||||
@@ -3518,6 +3557,20 @@ static void refr_ready_cb(lv_event_t*) {
|
||||
unsigned pct = (unsigned)((uint64_t)g_refrPixels * 100ULL / ((uint64_t)LCD_H_RES * LCD_V_RES));
|
||||
esp_rom_printf("[UI] Bildaufbau %u ms, %u Bereiche, %u %% der Flaeche\n",
|
||||
(unsigned)d, (unsigned)g_refrAreas, pct);
|
||||
// Lage der Bereiche mit ausgeben. Erst daran ist zu erkennen, WELCHER Teil der
|
||||
// Oberflaeche das Neuzeichnen ausloest - die Groesse allein sagt das nicht.
|
||||
for (uint8_t i = 0; i < g_refrAreaCnt; i++)
|
||||
esp_rom_printf(" Bereich %u: x %d..%d, y %d..%d\n", (unsigned)i,
|
||||
(int)g_refrArea[i].x1, (int)g_refrArea[i].x2,
|
||||
(int)g_refrArea[i].y1, (int)g_refrArea[i].y2);
|
||||
}
|
||||
|
||||
// Meldet, wenn ein ganzer Container ungueltig gemacht wird. Damit laesst sich unterscheiden,
|
||||
// ob eine einzelne Beschriftung den Bildaufbau ausloest oder ob gleich der komplette
|
||||
// Inhaltsbereich neu gezeichnet werden soll - zwei verschiedene Ursachen.
|
||||
static void inval_watch_cb(lv_event_t* e) {
|
||||
const char* name = (const char*)lv_event_get_user_data(e);
|
||||
esp_rom_printf("[UI] %s wird komplett ungueltig\n", name);
|
||||
}
|
||||
|
||||
static void refr_monitor_install() {
|
||||
@@ -3637,6 +3690,11 @@ void ui_init(ProtocolClient* client) {
|
||||
lv_obj_set_style_text_color(g_clock, COL_TEXT, 0);
|
||||
lv_obj_set_style_pad_right(g_clock, 10, 0);
|
||||
lv_obj_set_style_text_font(g_clock, font_text(), 0);
|
||||
// Feste Masse, sonst rechnet LVGL beim Wechsel der Minute das Layout der Kopfleiste neu
|
||||
// und macht sie samt Menue-Knopf ungueltig (siehe tempField).
|
||||
lv_obj_set_width(g_clock, 130);
|
||||
lv_obj_set_height(g_clock, lv_font_get_line_height(font_text()) + 4);
|
||||
lv_obj_set_style_text_align(g_clock, LV_TEXT_ALIGN_RIGHT, 0);
|
||||
|
||||
g_wifiIcon = lv_label_create(header);
|
||||
lv_label_set_text(g_wifiIcon, LV_SYMBOL_WIFI);
|
||||
@@ -3664,22 +3722,18 @@ void ui_init(ProtocolClient* client) {
|
||||
g_pages[PG_SERVICE] = make_page(g_content); build_service(g_pages[PG_SERVICE]);
|
||||
g_pages[PG_WIFI] = make_page(g_content); build_wifi(g_pages[PG_WIFI]);
|
||||
g_pages[PG_PROFILE] = make_page(g_content); build_profiles(g_pages[PG_PROFILE]);
|
||||
g_pages[PG_DISPLAY] = make_page(g_content); build_display(g_pages[PG_DISPLAY]);
|
||||
g_pages[PG_INFO] = make_page(g_content); build_info(g_pages[PG_INFO]);
|
||||
|
||||
// --- Schublade (Scrim + Menue-Panel) ---
|
||||
g_drawer = lv_obj_create(scr);
|
||||
lv_obj_set_size(g_drawer, LV_PCT(100), DISP_VER_RES - 44);
|
||||
lv_obj_set_pos(g_drawer, 0, 44);
|
||||
#if JC_PANEL_TYPE == WS_PANEL_7H
|
||||
// Deckend statt halbdurchsichtig - aus demselben Grund wie beim Aufweckdialog: Ein
|
||||
// durchscheinender Vorhang laesst LVGL die ganze Flaeche darunter mitzeichnen und
|
||||
// mischen. Auf dunklem Grund sieht ein dunkles Deckend praktisch genauso aus.
|
||||
lv_obj_set_style_bg_color(g_drawer, lv_color_hex(0x0d0d0d), 0);
|
||||
lv_obj_set_style_bg_opa(g_drawer, LV_OPA_COVER, 0);
|
||||
#else
|
||||
// Bewusst durchscheinend: Der Vorhang legt sich ueber die ganze Seite, und der Inhalt
|
||||
// dahinter soll sichtbar bleiben. Ein Versuch mit deckendem Vorhang (gegen die
|
||||
// Zeichenlast) hat den Seiteninhalt verschwinden lassen und ist zurueckgenommen.
|
||||
lv_obj_set_style_bg_color(g_drawer, lv_color_hex(0x000000), 0);
|
||||
lv_obj_set_style_bg_opa(g_drawer, LV_OPA_50, 0);
|
||||
#endif
|
||||
lv_obj_set_style_border_width(g_drawer, 0, 0);
|
||||
lv_obj_set_style_pad_all(g_drawer, 0, 0);
|
||||
lv_obj_set_style_radius(g_drawer, 0, 0);
|
||||
@@ -3930,6 +3984,8 @@ void ui_init(ProtocolClient* client) {
|
||||
if (g_client) g_client->sendListProfiles();
|
||||
|
||||
refr_monitor_install();
|
||||
if (g_content) lv_obj_add_event_cb(g_content, inval_watch_cb, LV_EVENT_INVALIDATE_AREA, (void*)"Inhaltsbereich");
|
||||
if (g_pages[PG_DASH]) lv_obj_add_event_cb(g_pages[PG_DASH], inval_watch_cb, LV_EVENT_INVALIDATE_AREA, (void*)"Dashboard-Seite");
|
||||
g_uiReady = true;
|
||||
}
|
||||
|
||||
@@ -3996,10 +4052,14 @@ static void ready_band_update(const MachineState& st) {
|
||||
else if (wOk) { txt = "Wasser bereit — Dampf heizt"; bg = 0x3a2a05; fg = COL_ACCENT; }
|
||||
else { txt = "Heizt auf"; bg = 0x3a2a05; fg = COL_ACCENT; }
|
||||
}
|
||||
lv_label_set_text(g_readyBandLbl, txt);
|
||||
lv_obj_set_style_text_color(g_readyBandLbl, fg, 0);
|
||||
lv_obj_set_style_bg_color(g_readyBand, lv_color_hex(bg), 0);
|
||||
lv_obj_set_style_bg_opa(g_readyBand, LV_OPA_COVER, 0);
|
||||
// Das Band spannt sich ueber die volle Breite. Wuerde es bei jeder Zustandsmeldung neu
|
||||
// gesetzt, machte es allein schon einen Streifen ueber den ganzen Bildschirm ungueltig.
|
||||
label_set_if_changed(g_readyBandLbl, txt);
|
||||
label_color_if_changed(g_readyBandLbl, fg);
|
||||
if (lv_color_to_u32(lv_obj_get_style_bg_color(g_readyBand, LV_PART_MAIN)) != bg) {
|
||||
lv_obj_set_style_bg_color(g_readyBand, lv_color_hex(bg), 0);
|
||||
lv_obj_set_style_bg_opa(g_readyBand, LV_OPA_COVER, 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4092,7 +4152,7 @@ void ui_update(const MachineState& st) {
|
||||
|
||||
// WLAN-Symbol
|
||||
bool wifiOk = st.wifiConnected && !st.apMode;
|
||||
if (g_wifiIcon) lv_obj_set_style_text_color(g_wifiIcon, wifiOk ? COL_OK : (st.apMode ? COL_WARN : COL_TEXT_MUT), 0);
|
||||
label_color_if_changed(g_wifiIcon, wifiOk ? COL_OK : (st.apMode ? COL_WARN : COL_TEXT_MUT));
|
||||
|
||||
// Uhrzeit. Angezeigt wird die der Hauptplatine; faellt sie voruebergehend aus, zaehlt
|
||||
// der P4 die zuletzt bekannte Zeit selbst weiter (siehe clock_text).
|
||||
|
||||
Reference in New Issue
Block a user