#if GARLAND_SUPPORT
|
|
|
|
#include <vector>
|
|
|
|
#include "../anim.h"
|
|
#include "../color.h"
|
|
#include "../palette.h"
|
|
|
|
//------------------------------------------------------------------------------
|
|
class AnimSalut : public Anim {
|
|
public:
|
|
AnimSalut() : Anim("Salut") {
|
|
}
|
|
|
|
void SetupImpl() override {
|
|
shots.clear();
|
|
// There can be more then one shot at the moment
|
|
// but looks like one is enough
|
|
// for (int i = 0; i < 3; ++i)
|
|
shots.emplace_back(palette, numLeds);
|
|
}
|
|
|
|
void Run() override {
|
|
for (int i = 0; i < numLeds; ++i) leds[i] = 0;
|
|
|
|
for (auto& c : shots) {
|
|
if (!c.Run(leds)) {
|
|
Shot new_shot(palette, numLeds);
|
|
std::swap(c, new_shot);
|
|
}
|
|
}
|
|
}
|
|
|
|
private:
|
|
struct Shot {
|
|
private:
|
|
struct Spark {
|
|
bool done = false;
|
|
float speed = ((float)secureRandom(1, 25)) / 10;
|
|
float speed_dec = ((float)secureRandom(1, 3)) / 10;
|
|
float pos;
|
|
int dir;
|
|
Color color;
|
|
uint16_t numLeds;
|
|
Spark(int pos, Palette* pal, uint16_t numLeds) : pos(pos), dir(secureRandom(10) > 5 ? -1 : 1), color(pal->getRndInterpColor()), numLeds(numLeds) {}
|
|
void Run(Color* leds) {
|
|
if (pos >= 0 && pos < numLeds) {
|
|
leds[(int)pos] = color;
|
|
if (speed > 0) {
|
|
pos += speed * dir;
|
|
speed -= speed_dec;
|
|
} else {
|
|
color.fade(5);
|
|
if (color.empty()) {
|
|
if (secureRandom(10) > 8)
|
|
leds[(int)pos] = 0xFFFFFF;
|
|
done = true;
|
|
}
|
|
}
|
|
} else {
|
|
done = true;
|
|
}
|
|
}
|
|
};
|
|
|
|
public:
|
|
int spark_num = secureRandom(30, 40);
|
|
int center;
|
|
std::vector<Spark> sparks;
|
|
Shot(Palette* pal, uint16_t numLeds) : center(secureRandom(15, numLeds - 15)) {
|
|
// DEBUG_MSG_P(PSTR("[GARLAND] Shot created center = %d spark_num = %d\n"), center, spark_num);
|
|
sparks.reserve(spark_num);
|
|
for (int i = 0; i < spark_num; ++i) {
|
|
sparks.emplace_back(center, pal, numLeds);
|
|
}
|
|
}
|
|
bool Run(Color* leds) {
|
|
bool done = true;
|
|
for (auto& s : sparks) {
|
|
if (!s.done) {
|
|
done = false;
|
|
s.Run(leds);
|
|
}
|
|
}
|
|
return !done;
|
|
}
|
|
};
|
|
|
|
std::vector<Shot> shots;
|
|
};
|
|
|
|
#endif // GARLAND_SUPPORT
|