Mirror of espurna firmware for wireless switches and more
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.

112 lines
3.7 KiB

  1. #if GARLAND_SUPPORT
  2. #include "../anim.h"
  3. #include "../palette.h"
  4. #include "color_wave.h"
  5. //------------------------------------------------------------------------------
  6. class AnimWaves : public Anim {
  7. public:
  8. enum Type {
  9. LongWaves,
  10. ShortWaves,
  11. Comets,
  12. CrossWaves,
  13. };
  14. AnimWaves(Type _type) : Anim("Waves"), type(_type) {
  15. }
  16. void SetupImpl() override {
  17. switch (type) {
  18. case LongWaves:
  19. wave1 = generateLongWave();
  20. break;
  21. case ShortWaves:
  22. wave1 = generateShortWave();
  23. break;
  24. case Comets:
  25. wave1 = generateCometWave();
  26. break;
  27. case CrossWaves:
  28. WaveType wave1Type = secureRandom(100) > 70 ? WaveType::Comet : WaveType::Wave;
  29. wave1 = generateCrossingWave(1, wave1Type, ledstmp);
  30. WaveType wave2Type = secureRandom(100) > 60 ? WaveType::Comet : WaveType::Wave;
  31. // if first wave is comet - inverse second wave probability to be comer to 60%
  32. if (wave1Type == WaveType::Comet) {
  33. wave2Type = wave2Type == WaveType::Comet ? WaveType::Wave : WaveType::Comet;
  34. }
  35. // we have only one pixel array for cache
  36. wave2 = generateCrossingWave(-1, wave2Type, nullptr);
  37. break;
  38. }
  39. glowSetUp();
  40. }
  41. void Run() override {
  42. for (auto i = 0; i < numLeds; ++i) {
  43. leds[i] = wave1.getLedColor(i);
  44. if (type == LongWaves) {
  45. glowForEachLed(i);
  46. }
  47. }
  48. wave1.move();
  49. if (type == LongWaves) {
  50. glowRun();
  51. } else if (type == CrossWaves) {
  52. for (auto i = 0; i < numLeds; ++i) {
  53. leds[i] = leds[i].interpolate(wave2.getLedColor(i), 0.5);
  54. }
  55. wave2.move();
  56. }
  57. }
  58. private:
  59. ColorWave generateLongWave() {
  60. uint16_t waveLen = secureRandom(50, 100);
  61. bool cleanColors = secureRandom(10) > 7;
  62. float speed = secureRandom(5, 15) / 10.0;
  63. int dir = randDir();
  64. return ColorWave(ColorWave::Params{numLeds, palette, waveLen, cleanColors, 0, ledstmp, WaveType::Wave, speed, dir, false});
  65. }
  66. ColorWave generateShortWave() {
  67. uint16_t waveLen = secureRandom(10, 30);
  68. bool cleanColors = secureRandom(10) > 7;
  69. byte fade = palette->bright() ? secureRandom(180, 220) : 0;
  70. float speed = secureRandom(5, 15) / 10.0;
  71. int dir = randDir();
  72. return ColorWave(ColorWave::Params{numLeds, palette, waveLen, cleanColors, fade, ledstmp, WaveType::Wave, speed, dir, false});
  73. }
  74. ColorWave generateCometWave() {
  75. uint16_t waveLen = secureRandom(10, 40);
  76. bool cleanColors = secureRandom(10) > 5;
  77. float speed = secureRandom(5, 15) / 10.0;
  78. int dir = randDir();
  79. return ColorWave(ColorWave::Params{numLeds, palette, waveLen, cleanColors, 0, ledstmp, WaveType::Comet, speed, dir, false});
  80. }
  81. ColorWave generateCrossingWave(int dir, WaveType waveType, Color* pixelCache) {
  82. Palette* wavePal = &pals[secureRandom(palsNum)];
  83. uint16_t waveLen = secureRandom(10, 50);
  84. bool cleanColors = fiftyFifty();
  85. byte fade = fiftyFifty() ? 0 : palette->bright() ? secureRandom(180, 220) : 120;
  86. float speed = secureRandom(5, 20) / 10.0;
  87. bool startEmpty = fiftyFifty();
  88. return ColorWave(ColorWave::Params{numLeds, wavePal, waveLen, cleanColors, fade, pixelCache, waveType, speed, dir, startEmpty});
  89. }
  90. Type type;
  91. ColorWave wave1;
  92. ColorWave wave2;
  93. };
  94. #endif // GARLAND_SUPPORT