#pragma once #include #include struct Color { uint8_t r, g, b; } __attribute__ ((packed)); typedef uint16_t Fixed; constexpr int factor = 65536; constexpr int shift = 16; class Pattern { public: virtual ~Pattern() = default; struct State { virtual ~State() = default; }; virtual State* start(int) const = 0; virtual void step(Color[], int, State*) const = 0; }; class LEDStrip { public: LEDStrip(int length = 0); ~LEDStrip() { if (state) delete state; } void step(); virtual void show() = 0; virtual void length_changing(int) {}; void setPattern(const Pattern *_pattern) { pattern = _pattern; update_state(); } const Pattern* getPattern() const { return pattern; } void setLength(int length); int getLength() const { return length; } protected: int length; const Pattern *pattern; Color *pixels; private: void update_state(); Pattern::State *state; }; class TerminalLEDs : public LEDStrip { public: TerminalLEDs(int length = 0) : LEDStrip(length) {} void show(); };