From e8f3ea3281b0c698b14f9f1ff43c350d66e20222 Mon Sep 17 00:00:00 2001 From: Fabian Schlenz Date: Sun, 16 Jun 2019 12:43:05 +0200 Subject: [PATCH] Extended MatrixEffect to also get RainbowMatrixEffect and RandomMatrixEffect. Side note: You know you understand C++ when you understand the meaning and reason for "MatrixEffect** _columns". ;-) --- include/effect_matrix.h | 50 +++++++++++++++++++++-------- src/effect_matrix.cpp | 71 +++++++++++++++++++++++++++++++++++------ src/effects.cpp | 4 +++ 3 files changed, 103 insertions(+), 22 deletions(-) diff --git a/include/effect_matrix.h b/include/effect_matrix.h index 7e00a8e..0d6e5c7 100644 --- a/include/effect_matrix.h +++ b/include/effect_matrix.h @@ -1,5 +1,4 @@ -#ifndef effect_matrix_H -#define effect_matrix_H +#pragma once #include "prototypes.h" #include "Effect.h" @@ -8,10 +7,12 @@ #include "my_color_palettes.h" class MatrixEffectColumn { -private: - int x, y; - int length; +protected: Window* window; + int x, y; + int length = 1; + virtual CRGB _getColor(uint8_t height); +private: uint16_t speed; boolean running; unsigned long last_move = 0; @@ -19,24 +20,47 @@ public: MatrixEffectColumn(); MatrixEffectColumn(Window* win, int xPos); - void start(); - + virtual void start(); void advance(); - void draw(); - void loop(); }; +class RainbowMatrixEffectColumn : public MatrixEffectColumn { +protected: + CRGB _getColor(uint8_t height) override; +public: + RainbowMatrixEffectColumn() : MatrixEffectColumn() {}; + RainbowMatrixEffectColumn(Window* win, int xPos) : MatrixEffectColumn(win, xPos) {}; +}; + +class RandomMatrixEffectColumn : public MatrixEffectColumn { +protected: + uint8_t _hue = 42; + CRGB _getColor(uint8_t height) override; +public: + void start() override; + RandomMatrixEffectColumn() : MatrixEffectColumn() {}; + RandomMatrixEffectColumn(Window* win, int xPos) : MatrixEffectColumn(win, xPos) {}; +}; + class MatrixEffect : public Effect { -private: - MatrixEffectColumn* _columns; +protected: + MatrixEffectColumn** _columns; public: boolean can_be_shown_with_clock(); - void start(); + virtual void start(); void stop(); MatrixEffect(); void loop(); }; -#endif +class RainbowMatrixEffect : public MatrixEffect { +public: + void start() override; +}; + +class RandomMatrixEffect : public MatrixEffect { +public: + void start() override; +}; diff --git a/src/effect_matrix.cpp b/src/effect_matrix.cpp index b977654..0bc68a2 100644 --- a/src/effect_matrix.cpp +++ b/src/effect_matrix.cpp @@ -26,12 +26,7 @@ void MatrixEffectColumn::advance() { void MatrixEffectColumn::draw() { for(int i=0; isetPixel(x, y-i, &color); } } @@ -52,21 +47,79 @@ void MatrixEffectColumn::loop() { } } +CRGB MatrixEffectColumn::_getColor(uint8_t i) { + CRGB color; + if (i==0) { + color = CRGB(255, 255, 255); + } else { + color = CHSV(83, 255, 255 * (length - i) / length); + } + return color; +} + +CRGB RainbowMatrixEffectColumn::_getColor(uint8_t i) { + CRGB color; + if (i==0) { + color = CRGB(255, 255, 255); + } else { + color = CHSV(255 * x / window->width, 255, 255 * (length - i) / length); + } + return color; +} + +CRGB RandomMatrixEffectColumn::_getColor(uint8_t i) { + CRGB color; + //Serial.print("RandomMatrixEffectColumn::_getColor, hue="); Serial.println(_hue); + if (i==0) { + color = CRGB(255, 255, 255); + } else { + color = CHSV(_hue, 255, 255 * (length - i) / length); + } + return color; +} + +void RandomMatrixEffectColumn::start() { + MatrixEffectColumn::start(); + _hue = random8(); +} + + + + + + + + + + boolean MatrixEffect::can_be_shown_with_clock() { return true; }; MatrixEffect::MatrixEffect() { } void MatrixEffect::start() { - _columns = new MatrixEffectColumn[LED_WIDTH]; - for (int i=0; iwidth]; + for (int i=0; iwidth; i++) _columns[i] = new MatrixEffectColumn(window, i); +} + +void RandomMatrixEffect::start() { + _columns = new MatrixEffectColumn* [window->width]; + for (int i=0; iwidth; i++) _columns[i] = new RandomMatrixEffectColumn(window, i); +} + +void RainbowMatrixEffect::start() { + _columns = new MatrixEffectColumn* [window->width]; + for (int i=0; iwidth; i++) _columns[i] = new RainbowMatrixEffectColumn(window, i); } void MatrixEffect::stop() { + for (int i=0; iwidth; i++) { + delete _columns[i]; + } delete[] _columns; } void MatrixEffect::loop() { window->clear(); - for (int i=0; iwidth; i++) _columns[i].loop(); + for (int i=0; iwidth; i++) _columns[i]->loop(); } diff --git a/src/effects.cpp b/src/effects.cpp index ed6a48e..8fd5590 100644 --- a/src/effects.cpp +++ b/src/effects.cpp @@ -35,6 +35,8 @@ AnimationEffect effect_anim_cake(&animation_cake, new CRGB(0x000000), 0, 0); SingleDynamicEffect effect_single_dynamic; MultiDynamicEffect effect_multi_dynamic; MatrixEffect effect_matrix; +RandomMatrixEffect effect_random_matrix; +RainbowMatrixEffect effect_rainbow_matrix; CycleEffect effect_cycle; TwirlEffect effect_twirl; ConfettiEffect effect_confetti; @@ -60,6 +62,8 @@ void setup_effects() { effects->add((EffectEntry){"single_dynamic", (Effect *)&effect_single_dynamic}); effects->add((EffectEntry){"multi_dynamic", (Effect *)&effect_multi_dynamic}); effects->add((EffectEntry){"matrix", (Effect *)&effect_matrix}); + effects->add((EffectEntry){"rainbow_matrix", (Effect *)&effect_rainbow_matrix}); + effects->add((EffectEntry){"random_matrix", (Effect *)&effect_random_matrix}); effects->add((EffectEntry){"cycle", (Effect *)&effect_cycle}); effects->add((EffectEntry){"twirl", (Effect *)&effect_twirl}); effects->add((EffectEntry){"heart", (Effect*)&effect_anim_heart});