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.
 
 
 
 
 
 

66 lines
2.0 KiB

#if GARLAND_SUPPORT
#include <list>
#include "../anim.h"
#include "../color.h"
#include "../palette.h"
//------------------------------------------------------------------------------
class AnimComets : public Anim {
public:
AnimComets() : Anim("Comets") {
}
void SetupImpl() override {
comets.clear();
for (int i = 0; i < 4; ++i)
comets.emplace_back(palette, numLeds);
}
void Run() override {
for (int i = 0; i < numLeds; ++i) leds[i] = 0;
for (auto& c : comets) {
int tail = c.head + c.len * -c.dir;
// Check if Comet out of range and generate it again
if ((c.head < 0 && tail < 0) || (c.head >= numLeds && tail >= numLeds)) {
Comet new_comet(palette, numLeds);
std::swap(c, new_comet);
}
for (int l = 0; l < c.len; ++l) {
int p = c.head + l * -c.dir;
if (p >= 0 && p < numLeds) {
leds[p] = c.points[l];
}
}
c.head = c.head + c.speed * c.dir;
}
}
private:
struct Comet {
float head;
int len = secureRandom(10, 20);
float speed = ((float)secureRandom(4, 10)) / 10;
Color color;
int dir = 1;
std::vector<Color> points;
Comet(Palette* pal, uint16_t numLeds) : head(secureRandom(0, numLeds / 2)), color(pal->getRndInterpColor()), points(len) {
// DEBUG_MSG_P(PSTR("[GARLAND] Comet created head = %d len = %d speed = %g cr = %d cg = %d cb = %d\n"), head, len, speed, color.r, color.g, color.b);
if (secureRandom(10) > 5) {
head = numLeds - head;
dir = -1;
}
for (int i = 0; i < len; ++i) {
points[i] = Color((byte)(color.r * (len - i) / len), (byte)(color.g * (len - i) / len), (byte)(color.b * (len - i) / len));
}
}
};
std::list<Comet> comets;
};
#endif // GARLAND_SUPPORT