Files
Flipdot-display/test/mocks/BROSE9323.h
T
mangavalkandClaude Opus 5.5 1d3b084de1 Add HA dropdowns, off image, flip fixes and refresh effects
Home Assistant: remove the Clock switch (its entity is deleted on connect),
add an IP sensor and Mode / Off image dropdowns whose options follow the
saved bitmaps. Remove the built-in "Nintendo border" bitmap.

Off image: a bitmap (or blank) left on the dots when the display switches off.

Nano: pause after each flip pulse and repeat pulses for changed dots, both
stored in EEPROM (G/N commands). Refresh effects (E command): instant,
sparkle, wipe, rain, from the middle out, diagonal, spiral, flip all then
reveal, push and random, optionally only for small changes. Effects run in
steps from loop() so serial input keeps flowing.

Web UI: flip settings, refresh effect and test patterns under Settings; the
System tab shows why the ESP32 last restarted. Settings records from
versions 1 and 2 are migrated. Firmware 2.3.0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 01:29:01 +02:00

66 lines
1.9 KiB
C++

// Fake display driver for the native tests: records every call instead of flipping dots
#pragma once
#include <string>
#include <vector>
#include "Arduino.h"
#include "dot_sequence.h" // the real one, from lib/BROSE9323
struct DisplayCall
{
std::string what;
int a, b, c;
};
class BROSE9323
{
public:
std::vector<DisplayCall> calls;
bool direct = false;
bool effect_running = false; // what busy() returns
BROSE9323(uint8_t, uint8_t, uint8_t, uint16_t) {}
void begin() { log("begin"); }
void display(bool force = false) { log("display", force); }
void drawPixel(int16_t x, int16_t y, uint16_t color) { log(direct ? "directPixel" : "pixel", x, y, color); }
void fillScreen(uint16_t color) { log("fill", color); }
void setDirect(bool d) { direct = d; }
void setTiming(uint16_t t) { log("timing", t); }
void setGap(uint16_t t) { log("gap", t); }
void setPulses(uint8_t n) { log("pulses", n); }
void setEffect(uint8_t effect, uint16_t time_ms, uint8_t flags = 0) { log("effect", effect, time_ms, flags); }
bool update() { return effect_running; }
bool busy() const { return effect_running; }
void printBuffer() { log("printBuffer"); }
void setCursor(int16_t x, int16_t y) { log("cursor", x, y); }
void setTextColor(uint16_t color, uint16_t background) { log("textColor", color, background); }
void setTextSize(uint8_t size) { log("textSize", size); }
size_t write(uint8_t ch)
{
log("write", ch);
return 1;
}
void println() { log("newline"); }
// Helpers for the tests
int count(const std::string &what) const
{
int n = 0;
for (const DisplayCall &call : calls)
n += call.what == what;
return n;
}
const DisplayCall *last(const std::string &what) const
{
for (auto it = calls.rbegin(); it != calls.rend(); ++it)
if (it->what == what)
return &*it;
return nullptr;
}
private:
void log(const char *what, int a = 0, int b = 0, int c = 0) { calls.push_back({what, a, b, c}); }
};