#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
|