#if GARLAND_SUPPORT #include "../anim.h" #include "../color.h" #include "../palette.h" //------------------------------------------------------------------------------ class AnimSpread : public Anim { const byte minWidth = 10; const byte maxWidth = 15; const byte numTries = 5; const byte fade_ind = 255 / minWidth; int GeneratePos() { int pos = -1; for (int i = 0; i < numTries; ++i) { pos = secureRandom(0, numLeds); for (int j = pos - maxWidth; j < pos + maxWidth; ++j) { if (j >= 0 && j < numLeds && seq[j] > 0) { pos = -1; break; } } if (pos >= 0) break; } return pos; } public: AnimSpread() : Anim("Spread") { cycleFactor = 2; } void SetupImpl() override { inc = secureRandom(2, 4); // DEBUG_MSG_P(PSTR("[GARLAND] AnimSpread inc = %d\n"), inc); for (int i = 0; i < numLeds; ++i) seq[i] = 0; } void Run() override { for (int i = 0; i < numLeds; ++i) leds[i] = 0; for (int i = 0; i < numLeds; ++i) { if (seq[i] > 0) { byte width = maxWidth - seq[i]; for (int j = i - width; j <= (i + width); j++) { Color c = ledstmp[i]; if (j >= 0 && j < numLeds) { leds[j].r += c.r; leds[j].g += c.g; leds[j].b += c.b; } } ledstmp[i].fade(fade_ind); seq[i]--; } } if (secureRandom(inc) == 0) { int pos = GeneratePos(); if (pos == -1) return; ledstmp[pos] = palette->getRndInterpColor(); seq[pos] = secureRandom(minWidth, maxWidth); } } }; #endif // GARLAND_SUPPORT