Files
Max Gramser 1a6308aba7 Fix what a full test round of today's releases found: a ticking single clock, a switch that works in standby, no taps from a swipe (0.2.78)
A test and code-analysis round of 0.2.72 to 0.2.76 (suites at every tag, sanitizers, ESP32 and GitHub builds, host
harnesses on both boards, the editor in a browser, best practice checked against ESPHome, LVGL, Home Assistant and
Vue) found these, fixed here with Max's choices for the product questions:

- Firmware 0.2.65: the second hand of a single analog clock moves again; on a page that is one full on/off tile the
  waking push also switches it; on the Guition a flick is never a tap and a finger that slides off a tile doesn't tap
  it; Previous/Next react to a firm press; the same Go to page tile may sit on several pages; a layout the screen has
  no memory for is refused instead of crashing; 64-bit redraw mask for 48 tiles; Montserrat 14 no longer built.
- App: Save refuses a layout too long for one message or too big for eight pages; an offline screen keeps its
  firmware version from the device registry; HA refusals reach the editor; 128 KB requests; changelog out of the
  live stream; cached hashed assets; tini as init and a clean stop; changelog parsing without asterisks or crashes.
- Editor: clicking the open screen keeps unsaved edits, edits during a save stay unsaved, a Page row and phone
  dragging to other pages, repeated page tiles, limits from the server, HA's error messages, a type-checked build.
- tools/check.sh + GitHub Actions + a CYD flash budget; docs match 48 tiles and the new editor.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-18 17:25:23 +02:00

5.3 KiB

Test results app 0.2.72 / firmware 0.2.61 (2026-09-18)

Max: "als ik snel naar pagina 4 wil, kan ik niet snel doorklikken, dan moet je steeds wachten totdat de pagina geladen is". Next, Next, Next on the page bar took three waits of about half a second each. This release lets the page buttons keep up with the finger. See CHANGELOG 0.2.72 and the compatibility note in docs/RELEASING.md. Built on 0.2.71 (2cb3479).

What happened before

  • The < Previous and Next > bars ran their tap through cyd::touch_guard.accept(), the guard of every tile: it drops a second tap on the same tile within 600 ms as a bounce, so one contact can never switch a light twice. On the page bar that window dropped the second and third tap of Next, Next, Next. The page itself was never the problem: since 0.2.42 a page switch places the new page in the next frame and fills its cards two per refresh, and a new switch drops a fill still under way.
  • The -/+ keys of the setpoint pill had the same complaint in 0.2.25 and got accept_repeat(): every clean tap counts, only a contact within 150 ms of the last one on the same key is a bounce. The page buttons now use it.

Automated

  • C++ (clang++ -std=c++17 -Wall -Wextra -Werror -I.): 17/17 PASS in a clean export of the committed tree plus this round's changes. tests/test_cyd_ui.cpp now holds the page buttons: three Next taps 250 ms apart all count, the old accept() still refuses within its window, and Previous right after Next counts.
  • Python (.venv-portal): 386 tests OK, the same set as 0.2.71 (firmware only; the app raises FIRMWARE_VERSION).
  • generate_packages.py --check green.
  • The working tree also carried another session's uncommitted runtime_model.h / runtime_tiles.h work (the 48-tile round, 0.2.73); every build and test below ran from a clean export with only this round's changes.

Firmware on the Mac (host builds, driven over the ESPHome API)

pager_host.py (scratchpad, after wake_sleep_host.py): the living room layout of the demo home on 8099 (17 tiles, four pages), a pager_taps action that taps the page bar from an LVGL timer (count taps gap_ms apart, each a 90 ms contact ending in LV_EVENT_SHORT_CLICKED on the button, as the touch layer produces it), an old_rule mode that taps the way firmware 0.2.60 did, and a probe that logs the page, the page number label and the fill state. Guition 12/12, CYD 12/12 (the first run judged the bounce and old-rule bursts by the spacing asked for, and the host's LVGL loop stalls about a second on the first frame of a burst, macOS throttling the SDL window, so two taps meant to be 80 ms apart landed 1040 ms apart; the checks now judge every tap against the spacing that really happened, and the second run passed on both boards).

Check Guition CYD
The living room layout shows four pages, page 1 drawn pass pass
Next, Next, Next 200 ms apart lands on page 4 (4 / 4) pass pass
Every one of those taps moved a page: 2, 3, 4, none refused pass pass
Page 4 finishes drawing afterwards pass pass
Two more Next taps on the last page change nothing pass pass
Previous, Previous, Previous 200 ms apart lands on page 1 pass pass
Three Next taps 160 ms apart (six a second) land on page 4 pass pass
Three Previous taps 160 ms apart land on page 1 pass pass
Bounce: a Next within 150 ms of the last accepted tap is refused, a slower one counts and moves a page pass pass
The old rule (0.2.60): a Next within 600 ms of the last accepted tap was refused pass pass
Back on page 1 afterwards pass pass
No errors in the log pass pass

The bounce burst on the Guition landed at 98, 94 and 81 ms and was accepted, refused, accepted, refused, as the rule says (the third tap came 192 ms after the first accepted one); the CYD's at 84, 84 and 96 ms the same way. The old-rule burst on the Guition landed at 208, 202 and 203 ms and was accepted, refused, refused, accepted: that is what Max felt, one page per 600 ms, however fast he tapped.

Builds (ESPHome 2026.6.2)

Check profiles with the generated packages and local components; no errors or compiler warnings.

Profile RAM Flash vs 0.2.71
Guition 25.7% (84,372 B) 21.0% (1,708,943 B) same RAM, -24 B flash
CYD 24.0% (78,796 B) 79.2% (1,453,647 B) same RAM, -36 B flash

The check builds carry a device name of their own (check-<board>-f9) and placeholder Wi-Fi, API and OTA values, so the sizes differ from the bench profiles by the length of those strings; the code is the same.

Not tested

  • Real hardware: neither bench screen ran this firmware before the release. Max's own screens get it through Update; the tap that started this is the one to try there, on the Guition and on the CYD.
  • A resistive panel's lift-off bounce on the CYD, not measured again. Correction (2026-09-18, touch analysis): the first net for that bounce is the XPT2046 filter (components/xpt2046/touchscreen/touch_filter.h), which starts a contact only after three matching samples, ignores one empty sample and releases after two, so a bounce never reaches LVGL as a new tap. accept_repeat's 40 ms minimum contact and 150 ms same-button gap are backup nets behind it, the same the -/+ keys have had since 0.2.25 (physically tested then).