Releases: dmellok/tesserae-device-firmware
Releases · dmellok/tesserae-device-firmware
Release list
v1.1.1: fw_version heartbeat reports plain SemVer
Patch release: correct the firmware version reported in the device heartbeat.
Fixes
- The
/statusheartbeat now reportsfw_versionas plain SemVer with no leadingv(tagv1.1.1reports1.1.1). Release builds previously baked the raw tag intoFW_VERSION, producing a leadingv. This lets the Tesserae server compare the running build against the latest available for its firmware update check. - Fixes a related double
vin the provisioning portal footer.
Notes
- No device behaviour, protocol, panel, or button changes.
- Artifact and catalog paths are unchanged (they keep the
vprefix); only the compiled-inFW_VERSIONstring changed. - Documents the
fw_versionheartbeat field and its format in the README.
All eight targets build and publish to the browser flasher.
v1.1.0 — Physical buttons + onboarding resilience
Front-button support across the whole device family, WiFi reconnect resilience, and faster captive-portal onboarding. With the Tesserae server side now handling button events, pressing a physical key rotates or refreshes the display end-to-end.
✨ Features
Physical front buttons → rotate / refresh
- New board-agnostic button layer (
buttons.h): any board can declareBOARD_BTN_REFRESH_PIN/BOARD_BTN_LEFT_PIN/BOARD_BTN_RIGHT_PIN. All defined keys arm one ext1 deep-sleep wake mask; a press wakes the device early and forces a fresh repaint. - Device → server protocol: a button wake adds
?button=<refresh|left|right>&event=<seq>to the frame request andbutton/button_event_idto the status POST.eventis an RTC-retained monotonic counter (one per press, survives deep sleep) so the server can dedup a retried request to a single rotation step. - Server maps refresh → repaint, left → rotate to previous, right → rotate to next.
Hardware-verified button mappings
Confirmed on real hardware by pressing each key and reading the serial log:
- reTerminal E1001 / E1002 / E1003 — Left = GPIO5, Right = GPIO4, Refresh = GPIO3 (shared baseboard).
- reTerminal E1004 — Left = GPIO4, Right = GPIO3, Refresh = GPIO5 (its own layout — the keys are plain GPIOs, not a capacitive controller).
- Seeed EE02 — Key1/Key2/Key3 = refresh (GPIO2) / left (GPIO3) / right (GPIO5); Key1 confirmed, the other two pending an on-battery check.
WiFi reconnect resilience
- An already-onboarded device no longer drops to AP mode on a single failed connect. It retries over short wakes (tracking a consecutive-fail count in RTC memory) and only reopens the captive portal after 12 consecutive misses — a brief router reboot or out-of-range no longer strands it off-network.
Faster captive-portal onboarding
- The SoftAP now comes up first (~1–2 s) and the portal splash paints after, so the AP is joinable almost immediately instead of after the ~30 s splash.
- The pre-AP SSID scan switched to a short active scan (~0.5–1 s vs ~2–3 s passive).
🐛 Fixes & improvements
- EE02 battery sensing — GPIO1 / ADC1-CH0 ÷2, gated by the load switch on GPIO6 (the XIAO driver-board circuit), replacing the wrong reTerminal pin.
📖 Docs
- The README Flash section now leads with the tesserae.ink web flasher (no-toolchain WebSerial path — pick board + version in the browser), with the from-source PlatformIO route kept below.
📦 Targets in this release
All eight build green and publish factory images to the flasher: waveshare-133e6, waveshare-photopainter-73, seeed-reterminal-e1001, seeed-reterminal-e1002, seeed-reterminal-e1003, seeed-reterminal-e1004, seeed-ee02, xiao-epaper-75.
Full commit range: v1.0.0…v1.1.0