Public Access
Send only the changed dots of a frame to the Nano
Frames were sent as F0 plus one s command per yellow dot (thousands of characters). During scrolling that overran the Nano's serial buffer, and half-received frames redrew the whole screen. showBitmap() now sends two B commands over the changed rectangle (dots off, dots on), or one B command for a full frame, and the pacing counts the characters sent. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
89001ddbc6
commit
47ef65ee7d
8 files changed
+262
-25
No files matched your search
@@ -10,18 +10,15 @@ FlipdotFrames::FlipdotFrames(BROSE9323 &display, PageResources &resources) : _di
|
||||
{
|
||||
}
|
||||
|
||||
// Only the dots that changed are sent (unless redraw: the Nano's image is unknown)
|
||||
uint32_t FlipdotFrames::dynamicPage(const LocalTime &time, uint32_t now, bool redraw)
|
||||
{
|
||||
uint8_t bitmap[BITMAP_BYTES];
|
||||
uint32_t wait = renderPage(_dynamic, time, now, _resources, bitmap);
|
||||
bool moving = wait != 0;
|
||||
if (!redraw && memcmp(bitmap, _last_dynamic, BITMAP_BYTES) == 0)
|
||||
return wait;
|
||||
// The Nano has no acknowledgement: wait until it has flipped the dots of this frame,
|
||||
// or the next frame overflows its serial buffer
|
||||
uint32_t busy = _flipMs(bitmap, redraw);
|
||||
_drawFullScreen(bitmap, moving);
|
||||
memcpy(_last_dynamic, bitmap, BITMAP_BYTES);
|
||||
// The Nano has no acknowledgement: the next frame waits until it has received this one
|
||||
// and flipped its dots, or the next frame overflows its serial buffer
|
||||
uint32_t busy = _show(bitmap, !redraw, moving);
|
||||
return moving && wait < busy ? busy : wait;
|
||||
}
|
||||
|
||||
@@ -30,14 +27,17 @@ void FlipdotFrames::setDrive(uint16_t flip_time, const DriveSettings &drive)
|
||||
_dot_us = (uint32_t)drive.pulses * (flip_time + drive.flip_gap);
|
||||
}
|
||||
|
||||
// About how long the Nano takes to receive and show the bitmap (all: every dot flips)
|
||||
uint32_t FlipdotFrames::_flipMs(const uint8_t *bitmap, bool all) const
|
||||
// Sends the bitmap; returns about how long the Nano takes to receive and show it in ms
|
||||
uint32_t FlipdotFrames::_show(const uint8_t *bitmap, bool changes_only, bool instant)
|
||||
{
|
||||
uint32_t dots = 0;
|
||||
for (int y = 0; y < BITMAP_HEIGHT; y++)
|
||||
for (int x = 0; x < BITMAP_WIDTH; x++)
|
||||
dots += all || bitmapPixel(bitmap, x, y) != _display.shownPixel(x, y);
|
||||
return FRAME_SEND_TIME + dots * _dot_us / 1000;
|
||||
dots += bitmapPixel(bitmap, x, y) != _display.shownPixel(x, y);
|
||||
size_t chars = _display.showBitmap(bitmap, changes_only, instant);
|
||||
if (chars == 0)
|
||||
return 0;
|
||||
return chars / NANO_CHARS_PER_MS + dots * _dot_us / 1000 + FRAME_MARGIN;
|
||||
}
|
||||
|
||||
void FlipdotFrames::noWifi(int hour, int minute)
|
||||
@@ -86,9 +86,7 @@ void FlipdotFrames::setOffBitmap(const uint8_t *bitmap)
|
||||
memset(_off, 0, BITMAP_BYTES);
|
||||
}
|
||||
|
||||
void FlipdotFrames::_drawFullScreen(const uint8_t *bitmap, bool instant)
|
||||
void FlipdotFrames::_drawFullScreen(const uint8_t *bitmap)
|
||||
{
|
||||
_display.fillScreen(0);
|
||||
_display.drawBitmap(0, 0, bitmap, BITMAP_WIDTH, BITMAP_HEIGHT, 1);
|
||||
_display.display(false, instant);
|
||||
_show(bitmap, false, false);
|
||||
}
|
||||
Reference in new issue
Block a user