v0.4.0: device-bezel window, board-named targets
Highlights
Device-bezel window
serve --window now presents the device instead of a bare framebuffer:
- The screen renders pixel-exact inside a slim device bezel. Bezel chrome draws at desktop density, so
--scale Nenlarges the screen while the chrome stays crisp. - Physical buttons appear as clickable nubs on the bezel edge, at the positions the board declares (
SimButtongainededge/posfields; existing board definitions compile unchanged). Hover a nub for its label and keyboard shortcut. ?opens a key-map overlay; backtick opens a hardware-controls panel (battery level, charging/USB, rotation) on boards that declare those capabilities.- Input semantics hardened: opening an overlay releases every held button and in-flight drag, so no phantom input leaks into the firmware.
- Layout math lives in an SDL-free module with unit tests; SDL2 remains optional.
Targets are named by the board, not the app
The target formerly named agentgauge is now waveshare_amoled_18 (Waveshare ESP32-S3-Touch-AMOLED-1.8, 480x480). Boards are a finite, stable set while firmwares are open-ended, so target ids follow the hardware, matching cyd/cyd_tft. The agentgauge firmware itself keeps its name. If you scripted --target agentgauge, switch to --target waveshare_amoled_18.
More
motioninjection and serialexpectfor scenario tests against motion-driven firmware behavior.- The firmware's LVGL font sources are now globbed, so the sim build tolerates the firmware adding or dropping font sizes between checkouts.
Fixes
serveschema describes the bezel window accurately.- The board-variant integration tests skip cleanly when the firmware checkout is absent.
Binaries below carry the generic targets (sample_gfx, cyd, cyd_tft); the waveshare_amoled_18 target needs a source build against a firmware checkout (see README). esprite is alpha software; interfaces may change.