#pragma once #include "BROSE9323.h" #include "logic/bitmap_format.h" #include "logic/display_controller.h" #include "logic/page_render.h" #include "logic/settings.h" // Draws the screens on the flipdot display. Each method sends one complete frame. class FlipdotFrames : public Frames { public: FlipdotFrames(BROSE9323 &display, PageResources &resources); // The page set with setDynamicPage(), drawn for this time. Only the changed dots are // sent (nothing when it looks the same), unless redraw. Moving pages are sent without // the refresh effect, and not faster than the Nano can receive and flip them. uint32_t dynamicPage(const LocalTime &time, uint32_t now, bool redraw) override; // "No WiFi" with the time below it void noWifi(int hour, int minute) override; // The bitmap set with setPageBitmap() void page() override; // The image set with setLiveBitmap() void live() override; // Blank, or the bitmap set with setOffBitmap() void off() override; void setDynamicPage(const DynamicPage &page); // How the Nano flips the dots: for the time a frame takes void setDrive(uint16_t flip_time, const DriveSettings &drive); void setPageBitmap(const uint8_t *bitmap); void setLiveBitmap(const uint8_t *bitmap); // nullptr: blank void setOffBitmap(const uint8_t *bitmap); private: BROSE9323 &_display; PageResources &_resources; DynamicPage _dynamic; uint32_t _dot_us = 1000; // per changed dot: pulses x (flip time + gap) uint8_t _page[BITMAP_BYTES] = {}; uint8_t _live[BITMAP_BYTES] = {}; uint8_t _off[BITMAP_BYTES] = {}; // all zero: blank void _drawFullScreen(const uint8_t *bitmap); uint32_t _show(const uint8_t *bitmap, bool changes_only, bool instant); };