From 083564caefb105f76a5a5d12d21dc54dcbda8dd5 Mon Sep 17 00:00:00 2001 From: Fabian Schlenz Date: Wed, 2 Oct 2019 06:16:07 +0200 Subject: [PATCH] Reorganized effect selection stuff: No longer a big case clause comparing CRC32. Instead an array of structs. Much nicer. Also, other code can now see which effects there are. --- README.md | 1 - include/effect_cycle.h | 1 + include/effects.h | 17 +++++---- platformio.ini | 1 - src/effect_cycle.cpp | 26 +++++++++++--- src/effects.cpp | 82 +++++++++++++++++++++++------------------- 6 files changed, 77 insertions(+), 51 deletions(-) diff --git a/README.md b/README.md index f7e83b7..016dc80 100644 --- a/README.md +++ b/README.md @@ -95,7 +95,6 @@ If you enabled `DEBUG`, log messages will be sent to `MQTT_TOPIC/log`. | FastLED (with small modifications) | Daniel Garcia & Mark Kriegsman | https://fastled.io | NTPClient (with modifications) | | https://github.com/arduino-libraries/NTPClient | ESP8266WebServer | | https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266WebServer -| ErriezCRC32 | Erriez | https://github.com/Erriez/ErriezCRC32 | ESPAsyncTCP | me-no-dev | https://github.com/me-no-dev/ESPAsyncTCP ### Inspirations and stuff diff --git a/include/effect_cycle.h b/include/effect_cycle.h index 0f4dd22..2cd685f 100644 --- a/include/effect_cycle.h +++ b/include/effect_cycle.h @@ -8,6 +8,7 @@ private: Effect* effect = NULL; uint16_t effect_id = -1; unsigned long effectSince = 0; + uint8_t _effects_count; public: CycleEffect(); ~CycleEffect(); diff --git a/include/effects.h b/include/effects.h index 6ab0258..ba4696d 100644 --- a/include/effects.h +++ b/include/effects.h @@ -1,17 +1,20 @@ -#ifndef effects_H -#define effects_H +#pragma once #include "Effect.h" #include "effect_clock.h" -extern const char* cycle_effects[]; -extern uint8_t cycle_effects_count; +struct EffectEntry { + const char* name; + bool use_in_cycle; + std::function create; +}; +extern const EffectEntry effects[]; +extern const uint8_t effects_size; extern Effect* current_effect; extern ClockEffect effect_clock; -Effect* select_effect(uint32_t c); +Effect* select_effect(char* name); +Effect* select_effect(uint8_t id); bool change_current_effect(String s); void setup_effects(); - -#endif diff --git a/platformio.ini b/platformio.ini index a8a7978..cf3a20a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -18,7 +18,6 @@ lib_deps = https://github.com/fabianonline/FastLED.git https://github.com/fabianonline/NTPClient.git ESP8266WebServer - ErriezCRC32 ESPAsyncTCP [env:ota] diff --git a/src/effect_cycle.cpp b/src/effect_cycle.cpp index 24811f1..a26a21e 100644 --- a/src/effect_cycle.cpp +++ b/src/effect_cycle.cpp @@ -3,6 +3,11 @@ #include CycleEffect::CycleEffect() { + _effects_count = 0; + for (uint8_t i=0; i1) { do { - new_id = random8(cycle_effects_count); + new_id = random8(_effects_count); } while (new_id == effect_id); } else { - new_id = (effect_id + 1) % cycle_effects_count; + new_id = (effect_id + 1) % _effects_count; } LOGln("CycleEffect * Changing effect from #%d to #%d", effect_id, new_id); delay(25); + if (effect) delete effect; - LOGln("CycleEffect * Searching for new effect '%s'", cycle_effects[new_id]); + delay(25); - effect = select_effect( crc32String(cycle_effects[new_id]) ); + LOGln("CycleEffect * Searching for new effect #%d", new_id); + for (uint8_t i=0; i #include "effect_bell.h" #include "effect_sinematrix3.h" #include "effect_big_clock.h" @@ -28,41 +27,50 @@ Effect* current_effect; ClockEffect effect_clock; -Effect* select_effect(uint32_t code) { - switch (code) { - // use e.g. https://crccalc.com/ for the conversion of name to crc. - case 0: case 0xD682E3C8 /* sinematrix3 */ : return new Sinematrix3Effect(); - case 1: case 0x90A887DA /* big_clock */ : return new BigClockEffect(); - case 2: case 0xBE7BBE92 /* clock */ : return new ClockEffect(); - case 3: case 0x733BE087 /* bell */ : return new BellEffect(); //(new AnimationEffect("/bell.pia", 0x000000, 0, 0))->setFgColor(0xFFFF00); - case 4: case 0x2BBC5D43 /* off */ : return new StaticEffect(0x000000); - case 5: case 0x1D84F231 /* koopa */ : return new AnimationEffect("/koopa.pia", CRGB(0x000000), 0, 0); - case 6: case 0xAC43BCF1 /* couple_rain */ : return new AnimationEffect("/couple_rain.pia", CRGB(0x000000), -8, -16); - case 7: case 0xF1B117F7 /* single_dynamic */ : return new SingleDynamicEffect(); - case 8: case 0xF52F2804 /* multi_dynamic */ : return new MultiDynamicEffect(); - case 9: case 0xF83341CF /* matrix */ : return new MatrixEffect(); - case 10: case 0xD2B79DD0 /* rainbow_matrix */ : return new RainbowMatrixEffect(); - case 11: case 0xE8DD3433 /* random_matrix */ : return new RandomMatrixEffect(); - case 12: case 0xB086D193 /* cycle */ : return new CycleEffect(); - case 13: case 0x2293EF9F /* twirl */ : return new TwirlEffect(); - case 14: case 0x60ECC3E6 /* heart */ : return new AnimationEffect("/heart.pia", CRGB(0x000000), 0, 0); - case 15: case 0x42090A49 /* confetti */ : return new ConfettiEffect(); - case 16: case 0x516D6B9E /* snake */ : return new SnakeEffect(); - case 17: case 0x58DE09CF /* fire */ : return new FireEffect(); - case 18: case 0x08BA9C08 /* firework */ : return new FireworkEffect(); - case 19: case 0x14B85EAC /* gol */ : return new GolEffect(); - case 20: case 0xFA13015D /* cake */ : return new AnimationEffect("/cake.pia", CRGB(0x000000), 0, 0); - case 21: case 0xA2B0D68B /* pixel_clock */ : return new PixelClockEffect(); - case 22: case 0x2C0E6962 /* big_dynamic */ : return new BigDynamicEffect(); - case 23: case 0xDA6F31A5 /* random_confetti */ : return new RandomConfettiEffect(); - case 24: case 0x8325C1DF /* dvd */ : return new DvdEffect(); - case 25: case 0x8CA97519 /* analog_clock */ : return new AnalogClockEffect(); - case 26: case 0xADB18CC5 /* sines */ : return new SinesEffect(); - case 27: case 0x0407881E /* blur2d */ : return new Blur2DEffect(); - case 28: case 0x935CFA7C /* marquee */ : return new MarqueeEffect(); - case 29: case 0xE27D739E /* night_clock */ : return new NightClockEffect(); - default : return NULL; - }; +const EffectEntry effects[] = { + /* 0 */ {"sinematrix3", true, [](){ return new Sinematrix3Effect(); }}, + /* 1 */ {"big_clock", true, [](){ return new BigClockEffect(); }}, + /* 2 */ {"clock", false, [](){ return new ClockEffect(); }}, + /* 3 */ {"bell", false, [](){ return new BellEffect(); }}, + /* 4 */ {"off", false, [](){ return new StaticEffect(0x000000); }}, + /* 5 */ {"single_dynamic", true, [](){ return new SingleDynamicEffect(); }}, + /* 6 */ {"multi_dynamic", true, [](){ return new MultiDynamicEffect(); }}, + /* 7 */ {"big_dynamic", true, [](){ return new BigDynamicEffect(); }}, + /* 8 */ {"matrix", true, [](){ return new MatrixEffect(); }}, + /* 9 */ {"random_matrix", true, [](){ return new RandomMatrixEffect(); }}, + /* 10 */ {"rainbow_matrix", true, [](){ return new RainbowMatrixEffect(); }}, + /* 11 */ {"cycle", false, [](){ return new CycleEffect(); }}, + /* 12 */ {"twirl", true, [](){ return new TwirlEffect(); }}, + /* 13 */ {"confetti", true, [](){ return new ConfettiEffect(); }}, + /* 14 */ {"random_confetti", true, [](){ return new RandomConfettiEffect(); }}, + /* 15 */ {"snake", true, [](){ return new SnakeEffect(); }}, + /* 16 */ {"firework", true, [](){ return new FireworkEffect(); }}, + /* 17 */ {"gol", true, [](){ return new GolEffect(); }}, + /* 18 */ {"pixel_clock", false, [](){ return new PixelClockEffect(); }}, + /* 19 */ {"dvd", false, [](){ return new DvdEffect(); }}, + /* 20 */ {"analog_clock", false, [](){ return new AnalogClockEffect(); }}, + /* 21 */ {"sines", true, [](){ return new SinesEffect(); }}, + /* 22 */ {"blur2d", true, [](){ return new Blur2DEffect(); }}, + /* 23 */ {"marquee", 0, [](){ return new MarqueeEffect(); }}, + /* 24 */ {"night_clock", false, [](){ return new NightClockEffect(); }} +}; +const uint8_t effects_size = 25; + + +Effect* select_effect(const char* name) { + for(int i=0; i