Fix compact tile text bounds and mini slider spacing
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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.
|
||||
@@ -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.
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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,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
|
||||
|
||||
@@ -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,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
|
||||
|
||||
Reference in New Issue
Block a user