-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwaves.cpp
129 lines (118 loc) · 2.53 KB
/
waves.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "waves.h"
//Constructor
Waves::Waves(CRGB *Leds, int iLeds) : Animation(Leds, iLeds)
{
iGlobalPos = 0;
iRed = 200;
iGreen = 0;
iBlue = 0;
iColorStep = 0;
iColorSubStep = 0;
}
//animate next step
void Waves::doNextStep()
{
iGlobalPos++;
if(iGlobalPos >= iLedCount)
{
iGlobalPos = 0;
}
if(iColorSubStep < 200)
{
iColorSubStep++;
}
else
{
iColorSubStep = 1;
iColorStep++;
if(iColorStep > 5)
{
iColorStep = 0;
}
}
switch(iColorStep)
{
case 0: //red to yellow
iGreen++;
break;
case 1: //yellow to green
iRed--;
break;
case 2: //green to cyan
iBlue++;
break;
case 3: //cyan to blue
iGreen--;
break;
case 4: //blue to magenta
iRed++;
break;
case 5: //magenta to red
iBlue--;
break;
}
const int iStepCount = 10;
int iRest = iLedCount % (iStepCount*2);
iCurrentPos = iGlobalPos;
CRGB Led;
for(int iStep = 0; iStep < iStepCount; iStep++)
{
Led.setRGB(iRed, iGreen, iBlue);
//Down
int iWavePartLength = iLedCount / (iStepCount*2);
if(iRest > 0)
{
iWavePartLength++;
iRest--;
}
for(int iCurPos = 0; iCurPos < iWavePartLength; iCurPos++)
{
setLed(true, Led);
}
Led.setRGB(iRed, iGreen, iBlue);
//Up
iWavePartLength = iLedCount / (iStepCount*2);
if(iRest > 0)
{
iWavePartLength++;
iRest--;
}
//Reverse direction to ensure the brightness gets allways decreased
iCurrentPos += iWavePartLength - 1;
if(iCurrentPos >= iLedCount)
{
iCurrentPos -= iLedCount;
}
for(int iCurPos = 0; iCurPos < iWavePartLength; iCurPos++)
{
setLed(false, Led);
}
//Set cursor to the end of the current wave
iCurrentPos += iWavePartLength + 1; //+1 to reset the last iPos--.
if(iCurrentPos >= iLedCount)
{
iCurrentPos -= iLedCount;
}
}
}
void Waves::setLed(bool up, CRGB &Led)
{
Led.nscale8(200);
pLEDS[iCurrentPos] = Led;
if(up)
{
iCurrentPos++;
if(iCurrentPos >= iLedCount)
{
iCurrentPos = 0;
}
}
else
{
iCurrentPos--;
if(iCurrentPos < 0)
{
iCurrentPos = iLedCount - 1;
}
}
}