Fix shifted pictures: non-blocking Nano drawing, frame check, refresh settings

The Nano's periodic full redraw blocked for ~0.8 s. A frame that arrived
meanwhile overflowed its 64-byte serial buffer; lost bytes in a bitmap
shift the rest of the image (picture moved up), and diff frames never
repaired it.

- Nano: all drawing (frames, effects, the dot refresh) runs from update()
  in ~1 ms slices; the refresh pauses while a frame is received or shown
- New commands: C (reply with the image checksum) and I (refresh minutes,
  EEPROM)
- ESP32: NanoMonitor asks for the checksum after frames and sends the whole
  image again on a mismatch, missing answer or Nano restart; counts ERR
  replies. Periodic whole-image resync.
- Settings: "Dot refresh" and "Image resync" intervals (settings v5,
  v4 records are migrated)
- System tab: loop timing, free memory, frame check counts
- test_driver: the real driver against a simulated panel

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mangavalkandClaude Opus 5.5 committed 2026-10-16 15:20:26 +02:00
1 parent 58a7cb03c2
commit 090c2bf8ae
45 files changed
+1265 -157

No files matched your search

+9 -1
View File
@@ -88,7 +88,9 @@ The display schedule (on/off, when the display is on, the late-evening quarter-h
when it switches off); the "No WiFi" screen; the flip time, the pause after each pulse,
pulses per dot and the refresh effect (instant, sparkle, wipe, rain, from the middle out,
diagonal, spiral, flip all then reveal, push, random; optionally only for small changes
like the clock's minutes); test patterns; the status LED.
like the clock's minutes); how often every dot is flipped again ("Dot refresh", default
2 min) and how often the whole image is sent again ("Image resync", default 10 min; 0
switches either off); test patterns; the status LED.
![Settings](../Pictures/web-ui/settings.png)
@@ -104,6 +106,12 @@ pages and the rules (REST API, plain http; empty URL: `http://<broker>:8123`). S
## System
Firmware status, uptime, WiFi, storage; restart; start the [recovery app](recovery.md).
**Loop:** how busy the ESP32 is: `loop()` passes per second and the average and longest
pass over the last 10 s (and the longest since boot; a Home Assistant request can take a
few seconds). `loop()` never sleeps, so a CPU percentage would always say 100 %.
**Frame check:** how many checks of the Nano's image matched, differed or got no answer,
how often the image was repaired, Nano restarts and `ERR` replies (with the last one).
**Memory:** free heap now and the lowest since boot.
**Backup:** export everything (settings, the schedule and rules, your bitmaps, pages and
fonts; the MQTT password and HA token only when ticked) to one JSON file, and import a