MatrixMiniR4 1.1.5
Matrix Mini R4 Arduino Library API Documentation
Loading...
Searching...
No Matches
MiniR4LED.h
Go to the documentation of this file.
1
7#ifndef MINIR4LED_H
8#define MINIR4LED_H
9
17{
18public:
20
26 void begin(uint8_t pin)
27 {
28 port_table[0] = R_PORT0;
29 port_table[1] = R_PORT1;
30 port_table[2] = R_PORT2;
31 port_table[3] = R_PORT3;
32 port_table[4] = R_PORT4;
33 port_table[5] = R_PORT5;
34 port_table[6] = R_PORT6;
35 port_table[7] = R_PORT7;
36
37 for (uint8_t i = 0; i < 16; i++) {
38 mask_table[i] = 1 << i;
39 }
40
41 _brightness[0] = 255;
42 _brightness[1] = 255;
43
44 _pin = pin;
45 pinMode(_pin, OUTPUT);
46 digitalWriteFast(_pin, 0);
47 }
48
56 bool setColor(uint8_t idx, uint32_t rgb)
57 {
58 if (idx < 1 || idx > 2) {
59 return false;
60 }
61 _leds[idx - 1] = rgb;
62 Update();
63 return true;
64 }
65
75 bool setColor(uint8_t idx, uint8_t r, uint8_t g, uint8_t b)
76 {
77 uint32_t rgb = (r << 16) | (g << 8) | b;
78 return setColor(idx, rgb);
79 }
80
87 void setBrightness(uint8_t idx, uint8_t brightness)
88 {
89 if (idx < 1 || idx > 2) {
90 return;
91 }
92 _brightness[idx - 1] = brightness;
93 Update();
94 }
95
96private:
97 uint8_t _pin;
98 uint32_t _leds[2];
99 uint8_t _brightness[2];
100
101 R_PORT0_Type* port_table[8];
102 uint16_t mask_table[16];
103
104 void Update(void)
105 {
106 uint8_t r, g, b;
107 r = ((_leds[0] >> 16) & 0xFF) * _brightness[0] / 255;
108 g = ((_leds[0] >> 8) & 0xFF) * _brightness[0] / 255;
109 b = (_leds[0] & 0xFF) * _brightness[0] / 255;
110 ProcessWS2812BProtocol(r, g, b);
111 r = ((_leds[1] >> 16) & 0xFF) * _brightness[1] / 255;
112 g = ((_leds[1] >> 8) & 0xFF) * _brightness[1] / 255;
113 b = (_leds[1] & 0xFF) * _brightness[1] / 255;
114 ProcessWS2812BProtocol(r, g, b);
115 delayMicroseconds(500);
116 }
117
118 inline void digitalWriteFast(uint8_t pin, uint8_t val) __attribute__((always_inline, unused))
119 {
120 if (val) {
121 port_table[g_pin_cfg[pin].pin >> 8]->POSR = mask_table[g_pin_cfg[pin].pin & 0xff];
122 } else {
123 port_table[g_pin_cfg[pin].pin >> 8]->PORR = mask_table[g_pin_cfg[pin].pin & 0xff];
124 }
125 }
126
127 void ProcessWS2812BProtocol(uint8_t r, uint8_t g, uint8_t b)
128 {
129 volatile byte i, tempByte, m_Byte_R, m_Byte_G, m_Byte_B;
130
131 m_Byte_R = r;
132 m_Byte_G = g;
133 m_Byte_B = b;
134
135 noInterrupts();
136
137 // Color: G
138 for (i = 0; i < 8; i++) {
139 digitalWriteFast(_pin, 1);
140
141 if ((m_Byte_G & 0x80) == 0) {
142 // asm("nop;");
143 digitalWriteFast(_pin, 0);
144 m_Byte_G <<= 1;
145 tempByte >>= 1;
146 } else {
147 for (uint32_t i = 0; i < 5; i++) {
148 asm("nop;");
149 }
150 m_Byte_G <<= 1;
151 tempByte <<= 1;
152 digitalWriteFast(_pin, 0);
153 }
154 }
155
156 // Color: R
157 for (i = 0; i < 8; i++) {
158 digitalWriteFast(_pin, 1);
159
160 if ((m_Byte_R & 0x80) == 0) {
161 // asm("nop;");
162 digitalWriteFast(_pin, 0);
163 m_Byte_R <<= 1;
164 tempByte >>= 1;
165 } else {
166 for (uint32_t i = 0; i < 5; i++) {
167 asm("nop;");
168 }
169 m_Byte_R <<= 1;
170 tempByte <<= 1;
171 digitalWriteFast(_pin, 0);
172 }
173 }
174
175 // Color: B
176 for (i = 0; i < 8; i++) {
177 digitalWriteFast(_pin, 1);
178
179 if ((m_Byte_B & 0x80) == 0) {
180 // asm("nop;");
181 digitalWriteFast(_pin, 0);
182 m_Byte_B <<= 1;
183 tempByte >>= 1;
184 } else {
185 for (uint32_t i = 0; i < 5; i++) {
186 asm("nop;");
187 }
188 m_Byte_B <<= 1;
189 tempByte <<= 1;
190 digitalWriteFast(_pin, 0);
191 }
192 }
193
194 interrupts();
195 }
196};
197
198#endif // MINIR4LED_H
Class for controlling an RGB LED.
Definition MiniR4LED.h:17
void setBrightness(uint8_t idx, uint8_t brightness)
Sets the brightness of the LED.
Definition MiniR4LED.h:87
bool setColor(uint8_t idx, uint8_t r, uint8_t g, uint8_t b)
Sets the color of the LED using separate RGB values.
Definition MiniR4LED.h:75
bool setColor(uint8_t idx, uint32_t rgb)
Sets the color of the LED.
Definition MiniR4LED.h:56
void begin(uint8_t pin)
Initializes the LED. (Built-in at Uno Pin 7)
Definition MiniR4LED.h:26