Public Access
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>
66 lines
1.9 KiB
C++
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}); }
|
|
};
|