Fix compact tile text bounds and mini slider spacing

This commit is contained in:
Max Gramser
2026-09-12 18:15:26 +02:00
parent a14a66f699
commit 8171629678
9 changed files with 144 additions and 7 deletions
+32 -2
View File
@@ -413,6 +413,8 @@ inline void event(lv_event_t *event) {
if (d == "button" || d == "input_button") action(d + ".press", tile.entity);
}
inline void bind(size_t index, lv_obj_t *tile, lv_obj_t *title, lv_obj_t *value, lv_obj_t *circle, lv_obj_t *icon) {
// Compact cards need room for two text lines and a separate dimmer track.
if(lv_obj_get_height(tile)<=80){lv_obj_set_style_pad_top(tile,4,0);lv_obj_set_style_pad_bottom(tile,4,0);}
lv_obj_update_layout(tile);
widgets[index] = {tile, title, value, circle, icon, index};
auto &w=widgets[index]; w.title_x=lv_obj_get_x(title);w.title_y=lv_obj_get_y(title);w.value_x=lv_obj_get_x(value);w.value_y=lv_obj_get_y(value);w.value_font=lv_obj_get_style_text_font(value,LV_PART_MAIN);
@@ -489,13 +491,20 @@ inline void render(lv_obj_t *room) {
lv_obj_set_style_text_font(w.value,watch && watch_font ? watch_font : w.value_font,0);
lv_obj_set_height(w.value,lv_font_get_line_height(lv_obj_get_style_text_font(w.value,LV_PART_MAIN)));
lv_obj_set_pos(w.value,watch?0:w.value_x,watch?(lv_obj_get_height(w.tile)>80?42:19):w.value_y);
lv_obj_set_width(w.value,watch?lv_obj_get_width(w.tile)-24:lv_obj_get_width(w.title));
if(watch)lv_obj_add_flag(w.circle,LV_OBJ_FLAG_HIDDEN);else lv_obj_remove_flag(w.circle,LV_OBJ_FLAG_HIDDEN);
lv_obj_set_x(w.title,watch?0:w.title_x);
bool mini=t.inline_control=="slider" && !watch && t.available();
bool large_tile=lv_obj_get_height(w.tile)>80;
lv_obj_set_y(w.title,mini?0:w.title_y);
if(mini){lv_obj_set_y(w.value,large_tile?24:14);lv_obj_add_flag(w.circle,LV_OBJ_FLAG_HIDDEN);lv_obj_set_x(w.title,0);lv_obj_set_x(w.value,0);}
if(mini){lv_obj_set_y(w.value,large_tile?24:lv_obj_get_height(w.title)+1);lv_obj_add_flag(w.circle,LV_OBJ_FLAG_HIDDEN);lv_obj_set_x(w.title,0);lv_obj_set_x(w.value,0);}
// Labels default to content-sized widths. Explicit bounds are necessary for
// LVGL ellipsis, and must expand again when the icon is hidden for a slider.
lv_obj_update_layout(w.tile);
int content_width=lv_obj_get_content_width(w.tile);
lv_obj_set_width(w.title,std::max(1,content_width-(int)lv_obj_get_x(w.title)));
lv_obj_set_width(w.value,std::max(1,content_width-(int)lv_obj_get_x(w.value)));
lv_obj_set_size(w.slider,content_width,large_tile?28:8);
lv_obj_align(w.slider,LV_ALIGN_BOTTOM_MID,0,0);
if(mini){lv_obj_remove_flag(w.slider,LV_OBJ_FLAG_HIDDEN);if(!lv_obj_has_state(w.slider,LV_STATE_PRESSED))lv_slider_set_value(w.slider,slider_value(t),LV_ANIM_OFF);}
else lv_obj_add_flag(w.slider,LV_OBJ_FLAG_HIDDEN);
bool on = fresh() && t.active();
@@ -523,6 +532,27 @@ inline void render(lv_obj_t *room) {
}
}
// Inspect actual LVGL coordinates, including padding and the loaded font metrics.
inline bool check_tile_geometry() {
bool ok=true;
for(auto &w:widgets){
if(!w.tile || lv_obj_has_flag(w.tile,LV_OBJ_FLAG_HIDDEN))continue;
lv_obj_update_layout(w.tile);
lv_area_t title,value,track,content;
lv_obj_get_content_coords(w.tile,&content);
lv_obj_get_coords(w.title,&title);lv_obj_get_coords(w.value,&value);
bool fits=title.x1>=content.x1 && title.x2<=content.x2 &&
value.x1>=content.x1 && value.x2<=content.x2 && title.y2<value.y1 && value.y2<=content.y2;
if(!lv_obj_has_flag(w.slider,LV_OBJ_FLAG_HIDDEN)){
lv_obj_get_coords(w.slider,&track);
fits=fits && value.y2<track.y1 && track.y2<=content.y2;
}
if(!fits)ESP_LOGE("ui_test","Tile geometry FAIL slot=%u title_y=%d..%d value_y=%d..%d content_y=%d..%d",(unsigned)w.index,title.y1,title.y2,value.y1,value.y2,content.y1,content.y2);
ok=ok && fits;
}
return ok;
}
inline void show_page(int &page, lv_obj_t *previous, lv_obj_t *next, lv_obj_t *number) {
int pages=std::max(1,(int(model.count)+5)/6);
page=std::clamp(page,0,pages-1);
+66
View File
@@ -0,0 +1,66 @@
# Upgrade bestaand CYD-paneel naar runtime 0.2.7
Bord: ESP32-2432S028, ESP32-D0WD-V3; MAC b0:cb:d8:e7:bd:7c.
Bestaande identiteit CYD 2.8in Display / cyd-2432s028 behouden. USB-poort werd
vooraf met esptool geïdentificeerd; Guition zat op een andere USB-poort.
Eigen profiel: genegeerd easy-cyd-device.yaml, met de bestaande lokale
calibration.yaml en API/OTA/wifi-secretverwijzingen. Een back-up van de eerste
64 KiB (partitie/configuratieruimte) is lokaal opgeslagen. Een volledige snelle
uitlezing gaf een seriële fout; de volledige langzame uitlezing is afgebroken.
Dit is dus geen volledige oude-firmwareback-up. USB-upload op 115200 geslaagd;
verdere correctie via de geverifieerde OTA-host.
De bestaande affine kalibratie is eenmalig in preference-key 0x43594403 gezet.
Daarna gebruikt het definitieve profiel de standaard opstart en bestaande NVS.
## Tijdens de upgrade gevonden
Een tijdelijk on_boot-list in het lokale migratieprofiel verving het on_boot-
object van het pakket. Daardoor ontbrak de normale UI-initialisatie en crashte
het begin van de renderdiagnose. De tijdelijke import is verwijderd nadat de
kalibratie was opgeslagen. In de definitieve gegenereerde C++ zijn runtime-bind,
light_controls::setup en screen_calibration::setup weer aanwezig. De volledige
renderdiagnose slaagt daarna (tien paginacontroles en vijftig overlays).
Gebruik dit tijdelijke migratieprofiel niet voor toekomstige flashes.
HA ontdekte de nieuwe Tegelinstellingen-entity zonder nieuwe API-sleutel. De oude
tien entiteiten zijn overgezet; daarna heeft de gebruiker de indeling gewijzigd.
Die actuele indeling is behouden. Swipe is aan, standby 600 seconden. Bij maximaal
zes tegels blijft de paginering verborgen.
Definitieve build: ESPHome 2026.6.2, 2026-09-12 17:50:49 +0200,
config_hash=0x0a15a59f, broncommit a14a66f.
## Verificatie
- Definitieve build en OTA-upload geslaagd; identiteit en firmwareversie via de
versleutelde API gecontroleerd.
- Renderdiagnose: tien geslaagde paginacontroles, vijftig overlaycycli en
`Light sliders: PASS`. De diagnose gebruikte de toen ingestelde twee tegels;
dit is geen fysieke swipecontrole van vier pagina's.
- Home Assistant en ESP Screen Manager melden het paneel online met versie 0.2.7.
Wijzigingen van de gebruiker in de tegelindeling blijven behouden.
- Bestaande kalibratie hergebruikt; tijdens deze upgrade is geen nieuwe
onafhankelijke fysieke kalibratiemeting uitgevoerd.
De 0.2.7-observatie is vijftien minuten voltooid met een levende API-respons elke
dertig seconden, zonder herstart of verbindingsverlies. Vrij geheugen circa
111–119 kB. Door fysieke bediening werd tien minuten onafgebroken inactiviteit
niet bereikt; standby/ontwaken is in deze observatie niet bevestigd.
## Vervolg: tekstlayout 0.2.8
De eigenaar meldde vervolgens afvallende titels, te vroeg afgekorte ondertitels
en een overlappende mini-slider. Stabiliteit alleen bevestigt dus niet de
bruikbaarheid van de layout. De titels hadden geen expliciete breedte en de
ondertitel nam de inhoudsbreedte van de titel over. De compacte kaart had daarnaast
onvoldoende verticale ruimte voor de extra slider.
Runtime 0.2.8 begrenst beide regels op de beschikbare inhoudsbreedte, vergroot die
bij een verborgen icoon en reserveert op de CYD aparte ruimte voor de schuif.
De renderdiagnose controleert nu de echte LVGL-coördinaten op afkapping buiten het
vak en overlapping van tekstregels/slider. Met de actuele vier tegels, waaronder
een lamp met mini-slider: tien paginacontroles en vijftig overlaycycli geslaagd.
De slidertest slaagt ook. Fysieke bevestiging van de nieuwe layout staat nog open.
De vijftien minuten hierboven gelden voor 0.2.7, niet voor deze vervolgbuild.
+31
View File
@@ -0,0 +1,31 @@
# 0.2.8 — compacte tekst en mini-slider
## Wijziging
Tekstregels krijgen de beschikbare kaartbreedte in plaats van een van de
titelinhoud afgeleide breedte. LVGL kan lange titels daardoor met puntjes afkappen.
Bij mini-sliders wordt de ruimte van het verborgen icoon ook voor tekst gebruikt.
De compacte CYD-kaart heeft minder verticale padding en een apart spoor onder
de twee tekstregels. De normale grote detail-sliders zijn niet gewijzigd.
Opslagversie, tegelprotocol, API/OTA-sleutels en preferences zijn ongewijzigd.
ESP Screen Manager 0.2.7 kan deze firmware al bedienen. Alleen de app updaten
verandert de fysieke layout niet: daarvoor moet de schermfirmware worden gebouwd.
## Uitgevoerde controles
- 46 Python-tests geslaagd.
- Alle acht C++-testprogramma's geslaagd, gecompileerd met C++17 en warnings.
- Gegenereerde pakketten gecontroleerd; geen handmatige pakketwijzigingen.
- Beide runtime- en beide handmatige builds met ESPHome 2026.6.2 geslaagd.
CYD runtime via OTA geüpload; HA meldt versie 0.2.8 en vier behouden tegels.
- Op de CYD: tien paginacontroles, vijftig overlaycycli en de interne slidertest
geslaagd, met vier bestaande tegels waaronder een mini-slider.
- Daarna drie minuten aaneengesloten API-observatie voltooid zonder disconnect
of herstart, met circa 118 kB vrij geheugen. Geen stabiliteitsclaim over dagen.
- De paginacontrole toetst nu de echte LVGL-coördinaten inclusief padding en
fontafmetingen: horizontale tekstgrenzen, afstand tussen beide tekstregels en
vrije ruimte boven de slider. Dit vervangt geen fysieke touchtest.
De actuele gebruikersindeling is behouden. De fysieke beoordeling van de nieuwe
tekstlayout is bij het opstellen van dit rapport nog niet bevestigd.
+2 -1
View File
@@ -1,7 +1,7 @@
# Guition ESP32-S3-4848S040 / 4-inch EU wallbox, 480x480 IPS + GT911.
# Use guition-device.yaml; see docs/GUITION.md. CYD hardware is a separate profile.
substitutions:
SCREEN_FIRMWARE_VERSION: "0.2.7"
SCREEN_FIRMWARE_VERSION: "0.2.8"
DYNAMIC_TILES: "false"
DASHBOARD_INBOX_INTERNAL: "true"
DEVICE_NAME: "guition-wallbox"
@@ -4477,6 +4477,7 @@ script:
lv_obj_get_coords(id(page_next), &nav);
lv_obj_get_coords(id(tile_scroll), &grid);
ok = ok && (!paginated || grid.y2 < nav.y1);
if(runtime_tiles::enabled)ok = runtime_tiles::check_tile_geometry() && ok;
ESP_LOGI("ui_test", "page_check=%s count=%d heap=%u frames=%u grid_bottom=%d nav_top=%d", ok ? "PASS" : "FAIL", count, (unsigned) esp_get_free_heap_size(), (unsigned) id(rendered_frames), grid.y2, nav.y1);
id(tile_page) = 0;
- script.execute: show_tile_page
+2 -1
View File
@@ -58,7 +58,7 @@
############################################################
substitutions:
SCREEN_FIRMWARE_VERSION: "0.2.7"
SCREEN_FIRMWARE_VERSION: "0.2.8"
DYNAMIC_TILES: "false"
DASHBOARD_INBOX_INTERNAL: "true"
DEVICE_NAME: "cyd-new"
@@ -4612,6 +4612,7 @@ script:
lv_obj_get_coords(id(page_next), &nav);
lv_obj_get_coords(id(tile_scroll), &grid);
ok = ok && (!paginated || grid.y2 < nav.y1);
if(runtime_tiles::enabled)ok = runtime_tiles::check_tile_geometry() && ok;
ESP_LOGI("ui_test", "page_check=%s count=%d heap=%u frames=%u grid_bottom=%d nav_top=%d", ok ? "PASS" : "FAIL", count, (unsigned) esp_get_free_heap_size(), (unsigned) id(rendered_frames), grid.y2, nav.y1);
id(tile_page) = 0;
- script.execute: show_tile_page
+2 -1
View File
@@ -59,7 +59,7 @@
############################################################
substitutions:
SCREEN_FIRMWARE_VERSION: "0.2.7"
SCREEN_FIRMWARE_VERSION: "0.2.8"
DYNAMIC_TILES: "true"
DASHBOARD_INBOX_INTERNAL: "false"
DEVICE_NAME: "cyd-new"
@@ -4545,6 +4545,7 @@ script:
lv_obj_get_coords(id(page_next), &nav);
lv_obj_get_coords(id(tile_scroll), &grid);
ok = ok && (!paginated || grid.y2 < nav.y1);
if(runtime_tiles::enabled)ok = runtime_tiles::check_tile_geometry() && ok;
ESP_LOGI("ui_test", "page_check=%s count=%d heap=%u frames=%u grid_bottom=%d nav_top=%d", ok ? "PASS" : "FAIL", count, (unsigned) esp_get_free_heap_size(), (unsigned) id(rendered_frames), grid.y2, nav.y1);
id(tile_page) = 0;
- script.execute: show_tile_page
+2 -1
View File
@@ -2,7 +2,7 @@
# Guition ESP32-S3-4848S040 / 4-inch EU wallbox, 480x480 IPS + GT911.
# Use guition-device.yaml; see docs/GUITION.md. CYD hardware is a separate profile.
substitutions:
SCREEN_FIRMWARE_VERSION: "0.2.7"
SCREEN_FIRMWARE_VERSION: "0.2.8"
DYNAMIC_TILES: "true"
DASHBOARD_INBOX_INTERNAL: "false"
DEVICE_NAME: "guition-new"
@@ -4410,6 +4410,7 @@ script:
lv_obj_get_coords(id(page_next), &nav);
lv_obj_get_coords(id(tile_scroll), &grid);
ok = ok && (!paginated || grid.y2 < nav.y1);
if(runtime_tiles::enabled)ok = runtime_tiles::check_tile_geometry() && ok;
ESP_LOGI("ui_test", "page_check=%s count=%d heap=%u frames=%u grid_bottom=%d nav_top=%d", ok ? "PASS" : "FAIL", count, (unsigned) esp_get_free_heap_size(), (unsigned) id(rendered_frames), grid.y2, nav.y1);
id(tile_page) = 0;
- script.execute: show_tile_page
+6
View File
@@ -1,3 +1,9 @@
## 0.2.8
- Firmware: vaste tekstbreedtes voor nette afkapping met puntjes. Ondertitels gebruiken de beschikbare ruimte, ook bij korte titels.
- Firmware: op de CYD staat de mini-slider onder beide tekstregels, met minder verticale padding. Zonder icoon krijgen de tekstregels de volledige kaartbreedte.
- De renderdiagnose controleert nu ook de daadwerkelijke tekst- en slidercoördinaten. Installeer de schermfirmware om deze verbeteringen te gebruiken; bestaande tegels, instellingen en sleutels blijven behouden.
## 0.2.7
- Tot twintig tegels op vier vaste pagina’s; installeer eerst firmware 0.2.7. Zes tegelvakken worden hergebruikt om geheugen te sparen.
+1 -1
View File
@@ -1,5 +1,5 @@
name: ESP Screen Manager
version: "0.2.7"
version: "0.2.8"
slug: esp_screen_manager
description: Kies tegels voor je CYD en Guition touchscreen, zonder opnieuw flashen.
url: https://github.com/MaxGramser/homeassistant_espscreen