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

+8 -2
View File
@@ -20,7 +20,13 @@
3. **Home Assistant**: switches, dropdowns and sensors over MQTT, see
[Home Assistant](home-assistant.md).
4. **Nano.** The Nano reads commands from the serial line and updates its frame buffer.
On `D` it flips only the dots that changed. Every 2 minutes it redraws the whole screen
to fix dots that did not flip.
On `D` it flips only the dots that changed, in small steps so it never stops reading
the serial port. Every 2 minutes (Settings, "Dot refresh") it flips every dot once
more to fix dots that did not flip.
5. **Frame check.** After a frame the ESP asks the Nano for a checksum of its image and
compares it with what it sent. When they differ (lost bytes can shift the picture),
the Nano doesn't answer, or it restarted, the ESP sends the whole image again. It also
does that every 10 minutes (Settings, "Image resync"); only dots that differ flip, so
normally nothing changes. The counts are on the System tab.
The serial protocol is described in [src/nano/README.md](../src/nano/README.md).