Fork of the espurna firmware for `mhsw` switches
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

73 lines
1.9 KiB

#if GARLAND_SUPPORT
#include "../anim.h"
#include "../color.h"
#include "../palette.h"
#include "debug.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