Files
Flipdot-display/src/esp32/display/frames.cpp
T

94 lines
2.3 KiB
C++
Raw Normal View History

#include "display/frames.h"
#include <stdio.h>
2026-10-13 01:52:34 +02:00
#include <string.h>
#include "config.h"
2026-10-13 01:34:04 +02:00
#include "display/text.h"
FlipdotFrames::FlipdotFrames(BROSE9323 &display, PageResources &resources) : _display(display), _resources(resources)
{
}
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);
return moving && wait < busy ? busy : wait;
}
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
{
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;
}
2026-10-13 01:34:04 +02:00
void FlipdotFrames::noWifi(int hour, int minute)
{
char time[6];
snprintf(time, sizeof(time), "%02d:%02d", hour, minute);
drawTextLines(_display, "No WiFi", time);
_display.display();
}
2026-10-13 01:52:34 +02:00
void FlipdotFrames::page()
{
_drawFullScreen(_page);
}
void FlipdotFrames::live()
{
_drawFullScreen(_live);
}
void FlipdotFrames::off()
{
_drawFullScreen(_off);
}
2026-10-13 01:52:34 +02:00
void FlipdotFrames::setDynamicPage(const DynamicPage &page)
{
_dynamic = page;
}
2026-10-13 01:52:34 +02:00
void FlipdotFrames::setPageBitmap(const uint8_t *bitmap)
{
memcpy(_page, bitmap, BITMAP_BYTES);
}
void FlipdotFrames::setLiveBitmap(const uint8_t *bitmap)
{
memcpy(_live, bitmap, BITMAP_BYTES);
}
void FlipdotFrames::setOffBitmap(const uint8_t *bitmap)
{
if (bitmap)
memcpy(_off, bitmap, BITMAP_BYTES);
else
memset(_off, 0, BITMAP_BYTES);
}
void FlipdotFrames::_drawFullScreen(const uint8_t *bitmap, bool instant)
2026-10-13 01:52:34 +02:00
{
_display.fillScreen(0);
_display.drawBitmap(0, 0, bitmap, BITMAP_WIDTH, BITMAP_HEIGHT, 1);
_display.display(false, instant);
2026-10-13 01:52:34 +02:00
}