Public Access
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:
1 parent
58a7cb03c2
commit
090c2bf8ae
45 files changed
+1265
-157
No files matched your search
@@ -0,0 +1,43 @@
|
||||
#include "nano_link/nano_monitor.h"
|
||||
|
||||
NanoMonitor::NanoMonitor(NanoLink &nano, BROSE9323 &display) : _nano(nano), _display(display)
|
||||
{
|
||||
}
|
||||
|
||||
bool NanoMonitor::loop(uint32_t now, uint32_t resync_ms)
|
||||
{
|
||||
bool on = _nano.isOn();
|
||||
if (on != _was_on)
|
||||
{
|
||||
// Switched on (the Nano booted, NanoLink::on() took its READY) or off
|
||||
_was_on = on;
|
||||
_check.reset(now);
|
||||
_len = 0;
|
||||
}
|
||||
if (!on)
|
||||
return false;
|
||||
|
||||
// First the answers that arrived (also while loop() was blocked), then the timeouts
|
||||
Stream &serial = _nano.stream();
|
||||
while (serial.available())
|
||||
{
|
||||
char c = serial.read();
|
||||
if (c == '\n')
|
||||
{
|
||||
_line[_len] = '\0';
|
||||
_check.line(_line, now);
|
||||
_len = 0;
|
||||
}
|
||||
else if (_len < sizeof(_line) - 1)
|
||||
_line[_len++] = c;
|
||||
}
|
||||
bool resync = _check.resyncNow(now, resync_ms);
|
||||
|
||||
uint32_t frames = _display.framesSent();
|
||||
if (_check.due(frames, now))
|
||||
{
|
||||
serial.print("C\n");
|
||||
_check.sent(_display.crc(), frames, now);
|
||||
}
|
||||
return resync;
|
||||
}
|
||||
Reference in new issue
Block a user