Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
co2ampel
ampel-firmware
Commits
a224c1fa
Commit
a224c1fa
authored
Jan 25, 2022
by
Eric Duminil
Browse files
Update NeoPixel to 1.10.3
parent
9d9f4ebf
Changes
7
Expand all
Show whitespace changes
Inline
Side-by-side
ampel-firmware/src/lib/Adafruit_NeoPixel/Adafruit_NeoPixel.cpp
View file @
a224c1fa
This diff is collapsed.
Click to expand it.
ampel-firmware/src/lib/Adafruit_NeoPixel/Adafruit_NeoPixel.h
View file @
a224c1fa
...
...
@@ -37,16 +37,28 @@
#define ADAFRUIT_NEOPIXEL_H
#ifdef ARDUINO
#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#include <pins_arduino.h>
#endif
#if (ARDUINO >= 100)
#include <Arduino.h>
#else
#include <WProgram.h>
#include <pins_arduino.h>
#endif
#ifdef USE_TINYUSB // For Serial when selecting TinyUSB
#include <Adafruit_TinyUSB.h>
#endif
#endif
#ifdef TARGET_LPC1768
#include <Arduino.h>
#include <Arduino.h>
#endif
#if defined(ARDUINO_ARCH_RP2040)
#include <stdlib.h>
#include "hardware/pio.h"
#include "hardware/clocks.h"
#include "rp2040_pio.h"
#endif
// The order of primary colors in the NeoPixel data stream can vary among
...
...
@@ -76,42 +88,42 @@
// RGB NeoPixel permutations; white and red offsets are always same
// Offset: W R G B
#define NEO_RGB
((0<<6) | (0<<4) | (1<<2) | (2)) ///< Transmit as R,G,B
#define NEO_RBG
((0<<6) | (0<<4) | (2<<2) | (1)) ///< Transmit as R,B,G
#define NEO_GRB
((1<<6) | (1<<4) | (0<<2) | (2)) ///< Transmit as G,R,B
#define NEO_GBR
((2<<6) | (2<<4) | (0<<2) | (1)) ///< Transmit as G,B,R
#define NEO_BRG
((1<<6) | (1<<4) | (2<<2) | (0)) ///< Transmit as B,R,G
#define NEO_BGR
((2<<6) | (2<<4) | (1<<2) | (0)) ///< Transmit as B,G,R
#define NEO_RGB ((0
<<
6) | (0
<<
4) | (1
<<
2) | (2)) ///< Transmit as R,G,B
#define NEO_RBG ((0
<<
6) | (0
<<
4) | (2
<<
2) | (1)) ///< Transmit as R,B,G
#define NEO_GRB ((1
<<
6) | (1
<<
4) | (0
<<
2) | (2)) ///< Transmit as G,R,B
#define NEO_GBR ((2
<<
6) | (2
<<
4) | (0
<<
2) | (1)) ///< Transmit as G,B,R
#define NEO_BRG ((1
<<
6) | (1
<<
4) | (2
<<
2) | (0)) ///< Transmit as B,R,G
#define NEO_BGR ((2
<<
6) | (2
<<
4) | (1
<<
2) | (0)) ///< Transmit as B,G,R
// RGBW NeoPixel permutations; all 4 offsets are distinct
// Offset: W R G B
#define NEO_WRGB ((0<<6) | (1<<4) | (2<<2) | (3)) ///< Transmit as W,R,G,B
#define NEO_WRBG ((0<<6) | (1<<4) | (3<<2) | (2)) ///< Transmit as W,R,B,G
#define NEO_WGRB ((0<<6) | (2<<4) | (1<<2) | (3)) ///< Transmit as W,G,R,B
#define NEO_WGBR ((0<<6) | (3<<4) | (1<<2) | (2)) ///< Transmit as W,G,B,R
#define NEO_WBRG ((0<<6) | (2<<4) | (3<<2) | (1)) ///< Transmit as W,B,R,G
#define NEO_WBGR ((0<<6) | (3<<4) | (2<<2) | (1)) ///< Transmit as W,B,G,R
#define NEO_WRGB ((0
<<
6) | (1
<<
4) | (2
<<
2) | (3)) ///< Transmit as W,R,G,B
#define NEO_WRBG ((0
<<
6) | (1
<<
4) | (3
<<
2) | (2)) ///< Transmit as W,R,B,G
#define NEO_WGRB ((0
<<
6) | (2
<<
4) | (1
<<
2) | (3)) ///< Transmit as W,G,R,B
#define NEO_WGBR ((0
<<
6) | (3
<<
4) | (1
<<
2) | (2)) ///< Transmit as W,G,B,R
#define NEO_WBRG ((0
<<
6) | (2
<<
4) | (3
<<
2) | (1)) ///< Transmit as W,B,R,G
#define NEO_WBGR ((0
<<
6) | (3
<<
4) | (2
<<
2) | (1)) ///< Transmit as W,B,G,R
#define NEO_RWGB ((1<<6) | (0<<4) | (2<<2) | (3)) ///< Transmit as R,W,G,B
#define NEO_RWBG ((1<<6) | (0<<4) | (3<<2) | (2)) ///< Transmit as R,W,B,G
#define NEO_RGWB ((2<<6) | (0<<4) | (1<<2) | (3)) ///< Transmit as R,G,W,B
#define NEO_RGBW ((3<<6) | (0<<4) | (1<<2) | (2)) ///< Transmit as R,G,B,W
#define NEO_RBWG ((2<<6) | (0<<4) | (3<<2) | (1)) ///< Transmit as R,B,W,G
#define NEO_RBGW ((3<<6) | (0<<4) | (2<<2) | (1)) ///< Transmit as R,B,G,W
#define NEO_RWGB ((1
<<
6) | (0
<<
4) | (2
<<
2) | (3)) ///< Transmit as R,W,G,B
#define NEO_RWBG ((1
<<
6) | (0
<<
4) | (3
<<
2) | (2)) ///< Transmit as R,W,B,G
#define NEO_RGWB ((2
<<
6) | (0
<<
4) | (1
<<
2) | (3)) ///< Transmit as R,G,W,B
#define NEO_RGBW ((3
<<
6) | (0
<<
4) | (1
<<
2) | (2)) ///< Transmit as R,G,B,W
#define NEO_RBWG ((2
<<
6) | (0
<<
4) | (3
<<
2) | (1)) ///< Transmit as R,B,W,G
#define NEO_RBGW ((3
<<
6) | (0
<<
4) | (2
<<
2) | (1)) ///< Transmit as R,B,G,W
#define NEO_GWRB ((1<<6) | (2<<4) | (0<<2) | (3)) ///< Transmit as G,W,R,B
#define NEO_GWBR ((1<<6) | (3<<4) | (0<<2) | (2)) ///< Transmit as G,W,B,R
#define NEO_GRWB ((2<<6) | (1<<4) | (0<<2) | (3)) ///< Transmit as G,R,W,B
#define NEO_GRBW ((3<<6) | (1<<4) | (0<<2) | (2)) ///< Transmit as G,R,B,W
#define NEO_GBWR ((2<<6) | (3<<4) | (0<<2) | (1)) ///< Transmit as G,B,W,R
#define NEO_GBRW ((3<<6) | (2<<4) | (0<<2) | (1)) ///< Transmit as G,B,R,W
#define NEO_GWRB ((1
<<
6) | (2
<<
4) | (0
<<
2) | (3)) ///< Transmit as G,W,R,B
#define NEO_GWBR ((1
<<
6) | (3
<<
4) | (0
<<
2) | (2)) ///< Transmit as G,W,B,R
#define NEO_GRWB ((2
<<
6) | (1
<<
4) | (0
<<
2) | (3)) ///< Transmit as G,R,W,B
#define NEO_GRBW ((3
<<
6) | (1
<<
4) | (0
<<
2) | (2)) ///< Transmit as G,R,B,W
#define NEO_GBWR ((2
<<
6) | (3
<<
4) | (0
<<
2) | (1)) ///< Transmit as G,B,W,R
#define NEO_GBRW ((3
<<
6) | (2
<<
4) | (0
<<
2) | (1)) ///< Transmit as G,B,R,W
#define NEO_BWRG ((1<<6) | (2<<4) | (3<<2) | (0)) ///< Transmit as B,W,R,G
#define NEO_BWGR ((1<<6) | (3<<4) | (2<<2) | (0)) ///< Transmit as B,W,G,R
#define NEO_BRWG ((2<<6) | (1<<4) | (3<<2) | (0)) ///< Transmit as B,R,W,G
#define NEO_BRGW ((3<<6) | (1<<4) | (2<<2) | (0)) ///< Transmit as B,R,G,W
#define NEO_BGWR ((2<<6) | (3<<4) | (1<<2) | (0)) ///< Transmit as B,G,W,R
#define NEO_BGRW ((3<<6) | (2<<4) | (1<<2) | (0)) ///< Transmit as B,G,R,W
#define NEO_BWRG ((1
<<
6) | (2
<<
4) | (3
<<
2) | (0)) ///< Transmit as B,W,R,G
#define NEO_BWGR ((1
<<
6) | (3
<<
4) | (2
<<
2) | (0)) ///< Transmit as B,W,G,R
#define NEO_BRWG ((2
<<
6) | (1
<<
4) | (3
<<
2) | (0)) ///< Transmit as B,R,W,G
#define NEO_BRGW ((3
<<
6) | (1
<<
4) | (2
<<
2) | (0)) ///< Transmit as B,R,G,W
#define NEO_BGWR ((2
<<
6) | (3
<<
4) | (1
<<
2) | (0)) ///< Transmit as B,G,W,R
#define NEO_BGRW ((3
<<
6) | (2
<<
4) | (1
<<
2) | (0)) ///< Transmit as B,G,R,W
// Add NEO_KHZ400 to the color order value to indicate a 400 KHz device.
// All but the earliest v1 NeoPixels expect an 800 KHz data stream, this is
...
...
@@ -149,22 +161,24 @@ for x in range(256):
if x&15 == 15: print
*/
static
const
uint8_t
PROGMEM
_NeoPixelSineTable
[
256
]
=
{
128
,
131
,
134
,
137
,
140
,
143
,
146
,
149
,
152
,
155
,
158
,
162
,
165
,
167
,
170
,
173
,
176
,
179
,
182
,
185
,
188
,
190
,
193
,
196
,
198
,
201
,
203
,
206
,
208
,
211
,
213
,
215
,
218
,
220
,
222
,
224
,
226
,
228
,
230
,
232
,
234
,
235
,
237
,
238
,
240
,
241
,
243
,
244
,
245
,
246
,
248
,
249
,
250
,
250
,
251
,
252
,
253
,
253
,
254
,
254
,
254
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
254
,
254
,
254
,
253
,
253
,
252
,
251
,
250
,
250
,
249
,
248
,
246
,
245
,
244
,
243
,
241
,
240
,
238
,
237
,
235
,
234
,
232
,
230
,
228
,
226
,
224
,
222
,
220
,
218
,
215
,
213
,
211
,
208
,
206
,
203
,
201
,
198
,
196
,
193
,
190
,
188
,
185
,
182
,
179
,
176
,
173
,
170
,
167
,
165
,
162
,
158
,
155
,
152
,
149
,
146
,
143
,
140
,
137
,
134
,
131
,
128
,
124
,
121
,
118
,
115
,
112
,
109
,
106
,
103
,
100
,
97
,
93
,
90
,
88
,
85
,
82
,
79
,
76
,
73
,
70
,
67
,
65
,
62
,
59
,
57
,
54
,
52
,
49
,
47
,
44
,
42
,
40
,
37
,
35
,
33
,
31
,
29
,
27
,
25
,
23
,
21
,
20
,
18
,
17
,
15
,
14
,
12
,
11
,
10
,
9
,
7
,
6
,
5
,
5
,
4
,
3
,
2
,
2
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
2
,
2
,
3
,
4
,
5
,
5
,
6
,
7
,
9
,
10
,
11
,
12
,
14
,
15
,
17
,
18
,
20
,
21
,
23
,
25
,
27
,
29
,
31
,
33
,
35
,
37
,
40
,
42
,
44
,
47
,
49
,
52
,
54
,
57
,
59
,
62
,
65
,
67
,
70
,
73
,
76
,
79
,
82
,
85
,
88
,
90
,
93
,
97
,
100
,
103
,
106
,
109
,
112
,
115
,
118
,
121
,
124
};
128
,
131
,
134
,
137
,
140
,
143
,
146
,
149
,
152
,
155
,
158
,
162
,
165
,
167
,
170
,
173
,
176
,
179
,
182
,
185
,
188
,
190
,
193
,
196
,
198
,
201
,
203
,
206
,
208
,
211
,
213
,
215
,
218
,
220
,
222
,
224
,
226
,
228
,
230
,
232
,
234
,
235
,
237
,
238
,
240
,
241
,
243
,
244
,
245
,
246
,
248
,
249
,
250
,
250
,
251
,
252
,
253
,
253
,
254
,
254
,
254
,
255
,
255
,
255
,
255
,
255
,
255
,
255
,
254
,
254
,
254
,
253
,
253
,
252
,
251
,
250
,
250
,
249
,
248
,
246
,
245
,
244
,
243
,
241
,
240
,
238
,
237
,
235
,
234
,
232
,
230
,
228
,
226
,
224
,
222
,
220
,
218
,
215
,
213
,
211
,
208
,
206
,
203
,
201
,
198
,
196
,
193
,
190
,
188
,
185
,
182
,
179
,
176
,
173
,
170
,
167
,
165
,
162
,
158
,
155
,
152
,
149
,
146
,
143
,
140
,
137
,
134
,
131
,
128
,
124
,
121
,
118
,
115
,
112
,
109
,
106
,
103
,
100
,
97
,
93
,
90
,
88
,
85
,
82
,
79
,
76
,
73
,
70
,
67
,
65
,
62
,
59
,
57
,
54
,
52
,
49
,
47
,
44
,
42
,
40
,
37
,
35
,
33
,
31
,
29
,
27
,
25
,
23
,
21
,
20
,
18
,
17
,
15
,
14
,
12
,
11
,
10
,
9
,
7
,
6
,
5
,
5
,
4
,
3
,
2
,
2
,
1
,
1
,
1
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
2
,
2
,
3
,
4
,
5
,
5
,
6
,
7
,
9
,
10
,
11
,
12
,
14
,
15
,
17
,
18
,
20
,
21
,
23
,
25
,
27
,
29
,
31
,
33
,
35
,
37
,
40
,
42
,
44
,
47
,
49
,
52
,
54
,
57
,
59
,
62
,
65
,
67
,
70
,
73
,
76
,
79
,
82
,
85
,
88
,
90
,
93
,
97
,
100
,
103
,
106
,
109
,
112
,
115
,
118
,
121
,
124
};
/* Similar to above, but for an 8-bit gamma-correction table.
Copy & paste this snippet into a Python REPL to regenerate:
...
...
@@ -175,22 +189,24 @@ for x in range(256):
if x&15 == 15: print
*/
static
const
uint8_t
PROGMEM
_NeoPixelGammaTable
[
256
]
=
{
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
3
,
3
,
3
,
3
,
3
,
3
,
4
,
4
,
4
,
4
,
5
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
8
,
8
,
8
,
9
,
9
,
9
,
10
,
10
,
10
,
11
,
11
,
11
,
12
,
12
,
13
,
13
,
13
,
14
,
14
,
15
,
15
,
16
,
16
,
17
,
17
,
18
,
18
,
19
,
19
,
20
,
20
,
21
,
21
,
22
,
22
,
23
,
24
,
24
,
25
,
25
,
26
,
27
,
27
,
28
,
29
,
29
,
30
,
31
,
31
,
32
,
33
,
34
,
34
,
35
,
36
,
37
,
38
,
38
,
39
,
40
,
41
,
42
,
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
,
68
,
69
,
70
,
71
,
72
,
73
,
75
,
76
,
77
,
78
,
80
,
81
,
82
,
84
,
85
,
86
,
88
,
89
,
90
,
92
,
93
,
94
,
96
,
97
,
99
,
100
,
102
,
103
,
105
,
106
,
108
,
109
,
111
,
112
,
114
,
115
,
117
,
119
,
120
,
122
,
124
,
125
,
127
,
129
,
130
,
132
,
134
,
136
,
137
,
139
,
141
,
143
,
145
,
146
,
148
,
150
,
152
,
154
,
156
,
158
,
160
,
162
,
164
,
166
,
168
,
170
,
172
,
174
,
176
,
178
,
180
,
182
,
184
,
186
,
188
,
191
,
193
,
195
,
197
,
199
,
202
,
204
,
206
,
209
,
211
,
213
,
215
,
218
,
220
,
223
,
225
,
227
,
230
,
232
,
235
,
237
,
240
,
242
,
245
,
247
,
250
,
252
,
255
};
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
2
,
3
,
3
,
3
,
3
,
3
,
3
,
4
,
4
,
4
,
4
,
5
,
5
,
5
,
5
,
5
,
6
,
6
,
6
,
6
,
7
,
7
,
7
,
8
,
8
,
8
,
9
,
9
,
9
,
10
,
10
,
10
,
11
,
11
,
11
,
12
,
12
,
13
,
13
,
13
,
14
,
14
,
15
,
15
,
16
,
16
,
17
,
17
,
18
,
18
,
19
,
19
,
20
,
20
,
21
,
21
,
22
,
22
,
23
,
24
,
24
,
25
,
25
,
26
,
27
,
27
,
28
,
29
,
29
,
30
,
31
,
31
,
32
,
33
,
34
,
34
,
35
,
36
,
37
,
38
,
38
,
39
,
40
,
41
,
42
,
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
,
68
,
69
,
70
,
71
,
72
,
73
,
75
,
76
,
77
,
78
,
80
,
81
,
82
,
84
,
85
,
86
,
88
,
89
,
90
,
92
,
93
,
94
,
96
,
97
,
99
,
100
,
102
,
103
,
105
,
106
,
108
,
109
,
111
,
112
,
114
,
115
,
117
,
119
,
120
,
122
,
124
,
125
,
127
,
129
,
130
,
132
,
134
,
136
,
137
,
139
,
141
,
143
,
145
,
146
,
148
,
150
,
152
,
154
,
156
,
158
,
160
,
162
,
164
,
166
,
168
,
170
,
172
,
174
,
176
,
178
,
180
,
182
,
184
,
186
,
188
,
191
,
193
,
195
,
197
,
199
,
202
,
204
,
206
,
209
,
211
,
213
,
215
,
218
,
220
,
223
,
225
,
227
,
230
,
232
,
235
,
237
,
240
,
242
,
245
,
247
,
250
,
252
,
255
};
/*!
@brief Class that stores state and functions for interacting with
...
...
@@ -198,22 +214,20 @@ static const uint8_t PROGMEM _NeoPixelGammaTable[256] = {
*/
class
Adafruit_NeoPixel
{
public:
public:
// Constructor: number of LEDs, pin number, LED type
Adafruit_NeoPixel
(
uint16_t
n
,
u
int16_t
pin
=
6
,
neoPixelType
type
=
NEO_GRB
+
NEO_KHZ800
);
Adafruit_NeoPixel
(
uint16_t
n
,
int16_t
pin
=
6
,
neoPixelType
type
=
NEO_GRB
+
NEO_KHZ800
);
Adafruit_NeoPixel
(
void
);
~
Adafruit_NeoPixel
();
void
begin
(
void
);
void
show
(
void
);
void
setPin
(
u
int16_t
p
);
void
setPin
(
int16_t
p
);
void
setPixelColor
(
uint16_t
n
,
uint8_t
r
,
uint8_t
g
,
uint8_t
b
);
void
setPixelColor
(
uint16_t
n
,
uint8_t
r
,
uint8_t
g
,
uint8_t
b
,
uint8_t
w
);
void
setPixelColor
(
uint16_t
n
,
uint8_t
r
,
uint8_t
g
,
uint8_t
b
,
uint8_t
w
);
void
setPixelColor
(
uint16_t
n
,
uint32_t
c
);
void
fill
(
uint32_t
c
=
0
,
uint16_t
first
=
0
,
uint16_t
count
=
0
);
void
fill
(
uint32_t
c
=
0
,
uint16_t
first
=
0
,
uint16_t
count
=
0
);
void
setBrightness
(
uint8_t
);
void
clear
(
void
);
void
updateLength
(
uint16_t
n
);
...
...
@@ -232,10 +246,26 @@ class Adafruit_NeoPixel {
if show() would block (meaning some idle time is available).
*/
bool
canShow
(
void
)
{
if
(
endTime
>
micros
())
{
endTime
=
micros
();
// It's normal and possible for endTime to exceed micros() if the
// 32-bit clock counter has rolled over (about every 70 minutes).
// Since both are uint32_t, a negative delta correctly maps back to
// positive space, and it would seem like the subtraction below would
// suffice. But a problem arises if code invokes show() very
// infrequently...the micros() counter may roll over MULTIPLE times in
// that interval, the delta calculation is no longer correct and the
// next update may stall for a very long time. The check below resets
// the latch counter if a rollover has occurred. This can cause an
// extra delay of up to 300 microseconds in the rare case where a
// show() call happens precisely around the rollover, but that's
// neither likely nor especially harmful, vs. other code that might
// stall for 30+ minutes, or having to document and frequently remind
// and/or provide tech support explaining an unintuitive need for
// show() calls at least once an hour.
uint32_t
now
=
micros
();
if
(
endTime
>
now
)
{
endTime
=
now
;
}
return
(
micros
()
-
endTime
)
>=
300L
;
return
(
now
-
endTime
)
>=
300L
;
}
/*!
@brief Get a pointer directly to the NeoPixel data buffer in RAM.
...
...
@@ -322,7 +352,7 @@ class Adafruit_NeoPixel {
static
uint32_t
Color
(
uint8_t
r
,
uint8_t
g
,
uint8_t
b
,
uint8_t
w
)
{
return
((
uint32_t
)
w
<<
24
)
|
((
uint32_t
)
r
<<
16
)
|
((
uint32_t
)
g
<<
8
)
|
b
;
}
static
uint32_t
ColorHSV
(
uint16_t
hue
,
uint8_t
sat
=
255
,
uint8_t
val
=
255
);
static
uint32_t
ColorHSV
(
uint16_t
hue
,
uint8_t
sat
=
255
,
uint8_t
val
=
255
);
/*!
@brief A gamma-correction function for 32-bit packed RGB or WRGB
colors. Makes color transitions appear more perceptially
...
...
@@ -337,8 +367,17 @@ class Adafruit_NeoPixel {
*/
static
uint32_t
gamma32
(
uint32_t
x
);
protected:
void
rainbow
(
uint16_t
first_hue
=
0
,
int8_t
reps
=
1
,
uint8_t
saturation
=
255
,
uint8_t
brightness
=
255
,
bool
gammify
=
true
);
private:
#if defined(ARDUINO_ARCH_RP2040)
void
rp2040Init
(
uint8_t
pin
,
bool
is800KHz
);
void
rp2040Show
(
uint8_t
pin
,
uint8_t
*
pixels
,
uint32_t
numBytes
,
bool
is800KHz
);
#endif
protected:
#ifdef NEO_KHZ400 // If 400 KHz NeoPixel support enabled...
bool
is800KHz
;
///< true if 800 KHz pixels
#endif
...
...
@@ -361,6 +400,11 @@ class Adafruit_NeoPixel {
GPIO_TypeDef
*
gpioPort
;
///< Output GPIO PORT
uint32_t
gpioPin
;
///< Output GPIO PIN
#endif
#if defined(ARDUINO_ARCH_RP2040)
PIO
pio
=
pio0
;
int
sm
=
0
;
bool
init
=
true
;
#endif
};
#endif // ADAFRUIT_NEOPIXEL_H
ampel-firmware/src/lib/Adafruit_NeoPixel/README.md
View file @
a224c1fa
...
...
@@ -56,6 +56,10 @@ Compatibility notes: Port A is not supported on any AVR processors at this time
-
ESP8266 any speed
-
ESP32 any speed
-
Nordic nRF52 (Adafruit Feather nRF52), nRF51 (micro:bit)
-
Infineon XMC1100 BootKit @ 32 MHz
-
Infineon XMC1100 2Go @ 32 MHz
-
Infineon XMC1300 BootKit @ 32 MHz
-
Infineon XMC4700 RelaxKit, XMC4800 RelaxKit, XMC4800 IoT Amazon FreeRTOS Kit @ 144 MHz
Check forks for other architectures not listed here!
...
...
ampel-firmware/src/lib/Adafruit_NeoPixel/esp.c
View file @
a224c1fa
...
...
@@ -22,6 +22,12 @@
#include <Arduino.h>
#include "driver/rmt.h"
#if defined(ESP_IDF_VERSION)
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 0, 0)
#define HAS_ESP_IDF_4
#endif
#endif
// This code is adapted from the ESP-IDF v3.4 RMT "led_strip" example, altered
// to work with the Arduino version of the ESP-IDF (3.2)
...
...
@@ -89,6 +95,7 @@ void espShow(uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz)
if
(
!
rmt_reserved_channels
[
i
])
{
rmt_reserved_channels
[
i
]
=
true
;
channel
=
i
;
break
;
}
}
if
(
channel
==
ADAFRUIT_RMT_CHANNEL_MAX
)
{
...
...
@@ -96,6 +103,10 @@ void espShow(uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz)
return
;
}
#if defined(HAS_ESP_IDF_4)
rmt_config_t
config
=
RMT_DEFAULT_CONFIG_TX
(
pin
,
channel
);
config
.
clk_div
=
2
;
#else
// Match default TX config from ESP-IDF version 3.4
rmt_config_t
config
=
{
.
rmt_mode
=
RMT_MODE_TX
,
...
...
@@ -113,12 +124,16 @@ void espShow(uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz)
.
idle_output_en
=
true
,
}
};
#endif
rmt_config
(
&
config
);
rmt_driver_install
(
config
.
channel
,
0
,
0
);
// Convert NS timings to ticks
uint32_t
counter_clk_hz
=
0
;
#if defined(HAS_ESP_IDF_4)
rmt_get_counter_clock
(
channel
,
&
counter_clk_hz
);
#else
// this emulates the rmt_get_counter_clock() function from ESP-IDF 3.4
if
(
RMT_LL_HW_BASE
->
conf_ch
[
config
.
channel
].
conf1
.
ref_always_on
==
RMT_BASECLK_REF
)
{
uint32_t
div_cnt
=
RMT_LL_HW_BASE
->
conf_ch
[
config
.
channel
].
conf0
.
div_cnt
;
...
...
@@ -129,6 +144,7 @@ void espShow(uint8_t pin, uint8_t *pixels, uint32_t numBytes, boolean is800KHz)
uint32_t
div
=
div_cnt
==
0
?
256
:
div_cnt
;
counter_clk_hz
=
APB_CLK_FREQ
/
(
div
);
}
#endif
// NS to tick converter
float
ratio
=
(
float
)
counter_clk_hz
/
1e9
;
...
...
ampel-firmware/src/lib/Adafruit_NeoPixel/esp8266.c
View file @
a224c1fa
...
...
@@ -17,16 +17,16 @@ static inline uint32_t _getCycleCount(void) {
}
#ifdef ESP8266
void
ICACHE_
RAM_ATTR
espShow
(
uint8_t
pin
,
uint8_t
*
pixels
,
uint32_t
numBytes
,
boolean
is800KHz
)
{
I
RAM_ATTR
void
espShow
(
uint8_t
pin
,
uint8_t
*
pixels
,
uint32_t
numBytes
,
__attribute__
((
unused
))
boolean
is800KHz
)
{
#else
void
espShow
(
uint8_t
pin
,
uint8_t
*
pixels
,
uint32_t
numBytes
,
boolean
is800KHz
)
{
#endif
#define CYCLES_800_T0H (F_CPU / 250000
0
) // 0.4us
#define CYCLES_800_T1H (F_CPU / 125000
0
) // 0.8us
#define CYCLES_800 (F_CPU / 80000
0
) // 1.25us per bit
#define CYCLES_800_T0H (F_CPU / 250000
1
) // 0.4us
#define CYCLES_800_T1H (F_CPU / 125000
1
) // 0.8us
#define CYCLES_800 (F_CPU / 80000
1
) // 1.25us per bit
#define CYCLES_400_T0H (F_CPU / 2000000) // 0.5uS
#define CYCLES_400_T1H (F_CPU / 833333) // 1.2us
#define CYCLES_400 (F_CPU / 400000) // 2.5us per bit
...
...
ampel-firmware/src/lib/Adafruit_NeoPixel/library.properties
View file @
a224c1fa
name
=
Adafruit NeoPixel
version
=
1.
7.0
version
=
1.
10.3
author
=
Adafruit
maintainer
=
Adafruit <info@adafruit.com>
sentence
=
Arduino library for controlling single-wire-based LED pixels and strip.
...
...
ampel-firmware/src/lib/Adafruit_NeoPixel/rp2040_pio.h
0 → 100644
View file @
a224c1fa
// -------------------------------------------------- //
// This file is autogenerated by pioasm; do not edit! //
// -------------------------------------------------- //
// Unless you know what you are doing...
// Lines 47 and 52 have been edited to set transmit bit count
#if !PICO_NO_HARDWARE
#include "hardware/pio.h"
#endif
// ------ //
// ws2812 //
// ------ //
#define ws2812_wrap_target 0
#define ws2812_wrap 3
#define ws2812_T1 2
#define ws2812_T2 5
#define ws2812_T3 3
static
const
uint16_t
ws2812_program_instructions
[]
=
{
// .wrap_target
0x6221
,
// 0: out x, 1 side 0 [2]
0x1123
,
// 1: jmp !x, 3 side 1 [1]
0x1400
,
// 2: jmp 0 side 1 [4]
0xa442
,
// 3: nop side 0 [4]
// .wrap
};
#if !PICO_NO_HARDWARE
static
const
struct
pio_program
ws2812_program
=
{
.
instructions
=
ws2812_program_instructions
,
.
length
=
4
,
.
origin
=
-
1
,
};
static
inline
pio_sm_config
ws2812_program_get_default_config
(
uint
offset
)
{
pio_sm_config
c
=
pio_get_default_sm_config
();
sm_config_set_wrap
(
&
c
,
offset
+
ws2812_wrap_target
,
offset
+
ws2812_wrap
);
sm_config_set_sideset
(
&
c
,
1
,
false
,
false
);
return
c
;
}
#include "hardware/clocks.h"
static
inline
void
ws2812_program_init
(
PIO
pio
,
uint
sm
,
uint
offset
,
uint
pin
,
float
freq
,
uint
bits
)
{
pio_gpio_init
(
pio
,
pin
);
pio_sm_set_consecutive_pindirs
(
pio
,
sm
,
pin
,
1
,
true
);
pio_sm_config
c
=
ws2812_program_get_default_config
(
offset
);
sm_config_set_sideset_pins
(
&
c
,
pin
);
sm_config_set_out_shift
(
&
c
,
false
,
true
,
bits
);
// <----<<< Length changed to "bits"
sm_config_set_fifo_join
(
&
c
,
PIO_FIFO_JOIN_TX
);
int
cycles_per_bit
=
ws2812_T1
+
ws2812_T2
+
ws2812_T3
;
float
div
=
clock_get_hz
(
clk_sys
)
/
(
freq
*
cycles_per_bit
);
sm_config_set_clkdiv
(
&
c
,
div
);
pio_sm_init
(
pio
,
sm
,
offset
,
&
c
);
pio_sm_set_enabled
(
pio
,
sm
,
true
);
}
#endif
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment