Skip to content

v1.1.0 — Physical buttons + onboarding resilience

Choose a tag to compare

@dmellok dmellok released this 03 Jul 06:21

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 declare BOARD_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 and button / button_event_id to the status POST. event is 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