#if GARLAND_SUPPORT #include "../anim.h" #include "../palette.h" #include "color_wave.h" //------------------------------------------------------------------------------ class AnimWaves : public Anim { public: enum Type { LongWaves, ShortWaves, Comets, CrossWaves, }; AnimWaves(Type _type) : Anim("Waves"), type(_type) { } void SetupImpl() override { switch (type) { case LongWaves: wave1 = generateLongWave(); break; case ShortWaves: wave1 = generateShortWave(); break; case Comets: wave1 = generateCometWave(); break; case CrossWaves: WaveType wave1Type = secureRandom(100) > 70 ? WaveType::Comet : WaveType::Wave; wave1 = generateCrossingWave(1, wave1Type, ledstmp); WaveType wave2Type = secureRandom(100) > 60 ? WaveType::Comet : WaveType::Wave; // if first wave is comet - inverse second wave probability to be comer to 60% if (wave1Type == WaveType::Comet) { wave2Type = wave2Type == WaveType::Comet ? WaveType::Wave : WaveType::Comet; } // we have only one pixel array for cache wave2 = generateCrossingWave(-1, wave2Type, nullptr); break; } glowSetUp(); } void Run() override { for (auto i = 0; i < numLeds; ++i) { leds[i] = wave1.getLedColor(i); if (type == LongWaves) { glowForEachLed(i); } } wave1.move(); if (type == LongWaves) { glowRun(); } else if (type == CrossWaves) { for (auto i = 0; i < numLeds; ++i) { leds[i] = leds[i].interpolate(wave2.getLedColor(i), 0.5); } wave2.move(); } } private: ColorWave generateLongWave() { uint16_t waveLen = secureRandom(50, 100); bool cleanColors = secureRandom(10) > 7; float speed = secureRandom(5, 15) / 10.0; int dir = randDir(); return ColorWave(ColorWave::Params{numLeds, palette, waveLen, cleanColors, 0, ledstmp, WaveType::Wave, speed, dir, false}); } ColorWave generateShortWave() { uint16_t waveLen = secureRandom(10, 30); bool cleanColors = secureRandom(10) > 7; byte fade = palette->bright() ? secureRandom(180, 220) : 0; float speed = secureRandom(5, 15) / 10.0; int dir = randDir(); return ColorWave(ColorWave::Params{numLeds, palette, waveLen, cleanColors, fade, ledstmp, WaveType::Wave, speed, dir, false}); } ColorWave generateCometWave() { uint16_t waveLen = secureRandom(10, 40); bool cleanColors = secureRandom(10) > 5; float speed = secureRandom(5, 15) / 10.0; int dir = randDir(); return ColorWave(ColorWave::Params{numLeds, palette, waveLen, cleanColors, 0, ledstmp, WaveType::Comet, speed, dir, false}); } ColorWave generateCrossingWave(int dir, WaveType waveType, Color* pixelCache) { Palette* wavePal = &pals[secureRandom(palsNum)]; uint16_t waveLen = secureRandom(10, 50); bool cleanColors = fiftyFifty(); byte fade = fiftyFifty() ? 0 : palette->bright() ? secureRandom(180, 220) : 120; float speed = secureRandom(5, 20) / 10.0; bool startEmpty = fiftyFifty(); return ColorWave(ColorWave::Params{numLeds, wavePal, waveLen, cleanColors, fade, pixelCache, waveType, speed, dir, startEmpty}); } Type type; ColorWave wave1; ColorWave wave2; }; #endif // GARLAND_SUPPORT