-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAnimationPatterns.cpp
108 lines (90 loc) · 2.68 KB
/
AnimationPatterns.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#include "AnimationPatterns.h"
#include <Adafruit_NeoPixel.h>
extern float sinf(float);
extern float floorf(float);
uint8_t g_backBuffer[NUMBER_OF_PIXELS][3];
void rotateDown(Adafruit_NeoPixel& pix) {
uint32_t bottomPixel = pix.getPixelColor(0);
for (int i = 0; i < pix.numPixels() - 1; i++) {
pix.setPixelColor(i, pix.getPixelColor(i + 1));
}
pix.setPixelColor(pix.numPixels() - 1, bottomPixel);
}
void rotateUp(Adafruit_NeoPixel& pix) {
uint32_t topPixel = pix.getPixelColor(pix.numPixels() - 1);
for (int i = pix.numPixels() - 1; i > 0; i--) {
pix.setPixelColor(i, pix.getPixelColor(i - 1));
}
pix.setPixelColor(0, topPixel);
}
void rotateSmooth(Adafruit_NeoPixel& target, float offset) {
for (int i = 0; i < NUMBER_OF_PIXELS; i++) {
float fi = i + offset;
uint32_t value = lerpColor(fi);
target.setPixelColor(i, value);
}
}
uint32_t lerpColor(float index) {
float floored = floorf(index);
float prop = index - floored;
int lower = (int)floored;
int upper = lower + 1;
lower %= NUMBER_OF_PIXELS;
upper %= NUMBER_OF_PIXELS;
uint8_t lowerR = g_backBuffer[lower][0];
uint8_t lowerG = g_backBuffer[lower][1];
uint8_t lowerB = g_backBuffer[lower][2];
uint8_t upperR = g_backBuffer[upper][0];
uint8_t upperG = g_backBuffer[upper][1];
uint8_t upperB = g_backBuffer[upper][2];
uint8_t resultR = (int) ((lowerR * (1.0 - prop)) + (upperR * prop));
uint8_t resultG = (int)((lowerG * (1.0 - prop)) + (upperG * prop));
uint8_t resultB = (int)((lowerB * (1.0 - prop)) + (upperB * prop));
return Adafruit_NeoPixel::Color(resultR, resultG, resultB);
}
void directCopy(Adafruit_NeoPixel& pix) {
for (int i = 0; i < NUMBER_OF_PIXELS; i++) {
g_pixels.setPixelColor(i, g_backBuffer[i][0], g_backBuffer[i][1], g_backBuffer[i][2]);
}
}
const int GAP = 550;
void rainbowMode(int ms, Adafruit_NeoPixel& target) {
static unsigned int phase = 0;
phase += ms * (1.0f + 0.6f*sinf(phase / 2000.0f));
for (int led = 0; led < NUMBER_OF_PIXELS; led++) {
int localPhase = phase + (2 * GAP * led) / NUMBER_OF_PIXELS;
localPhase %= GAP * 6;
uint8_t r, g, b;
if (localPhase < GAP) {
r = 255;
g = map(localPhase % GAP, 0, GAP, 0, 255);
b = 0;
}
else if (localPhase < 2 * GAP) {
r = map(localPhase % GAP, 0, GAP, 255, 0);
g = 255;
b = 0;
}
else if (localPhase < 3 * GAP) {
r = 0;
g = 255;
b = map(localPhase % GAP, 0, GAP, 0, 255);
}
else if (localPhase < 4 * GAP) {
r = 0;
g = map(localPhase % GAP, 0, GAP, 255, 0);
b = 255;
}
else if (localPhase < 5 * GAP) {
r = map(localPhase % GAP, 0, GAP, 0, 255);
g = 0;
b = 255;
}
else {
r = 255;
g = 0;
b = map(localPhase % GAP, 0, GAP, 255, 0);
}
target.setPixelColor(led, r, g, b);
}
}