M5Unit-RGB 0.0.1 git rev:55cb205
Loading...
Searching...
No Matches
unit_LED.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_RGB_UNIT_LED_HPP
11#define M5_UNIT_RGB_UNIT_LED_HPP
12
13#include <M5UnitComponent.hpp>
14#include <vector>
15
16namespace m5 {
17namespace unit {
18
23namespace rgb {
24
26using wrgb32_color_t = uint32_t;
27
32union Color {
33 explicit constexpr Color(const wrgb32_color_t c = 0) : wrgb{c}
34 {
35 }
36 constexpr Color(const uint8_t rr, const uint8_t gg, const uint8_t bb, const uint8_t ww = 0)
37 : b{bb}, g{gg}, r{rr}, w{ww}
38 {
39 }
40 constexpr operator wrgb32_color_t() const
41 {
42 return wrgb;
43 }
45 static Color fromHSV(const uint8_t h, const uint8_t s, const uint8_t v);
46
48 struct {
49 uint8_t b;
50 uint8_t g;
51 uint8_t r;
52 uint8_t w;
53 };
54 uint8_t a[4];
55};
56constexpr bool operator==(const Color& lhs, const Color& rhs)
57{
58 return lhs.wrgb == rhs.wrgb;
59}
60
65enum class Order : int8_t {
66 unknown = -1,
67 // 24 bits
68 rgb24,
69 rbg24,
70 grb24,
71 gbr24,
72 brg24,
73 bgr24,
74 // 32 bits
75 hasWhite,
76 //
77 wrgb32 = hasWhite,
78 wrbg32,
79 wgrb32,
80 wgbr32,
81 wbrg32,
82 wbgr32,
83 //
84 rwgb32,
85 rwbg32,
86 rgwb32,
87 rgbw32,
88 rbwg32,
89 rbgw32,
90 //
91 gwrb32,
92 gwbr32,
93 grwb32,
94 grbw32,
95 gbwr32,
96 gbrw32,
97 //
98 bwrg32,
99 bwgr32,
100 brwg32,
101 brgw32,
102 bgwr32,
103 bgrw32,
104};
105
107int8_t offsetR(const Order f);
109int8_t offsetG(const Order f);
111int8_t offsetB(const Order f);
113int8_t offsetW(const Order f);
114} // namespace rgb
115
120class UnitLED : public Component {
121 M5_UNIT_COMPONENT_HPP_BUILDER(UnitLED, 0x00);
122
124 class PixelProxy {
125 public:
126 PixelProxy(UnitLED& u, const uint32_t i) : _u(u), _i(i), _c{u.color(i)}
127 {
128 }
129
130 inline operator rgb::Color() const
131 {
132 return _c;
133 }
134
135 PixelProxy& operator=(const rgb::Color& c)
136 {
137 _c = c;
138 _u.setPixelColor(_i, _c);
139 return *this;
140 }
141 PixelProxy& operator=(const PixelProxy& o)
142 {
143 _c = static_cast<rgb::Color>(o);
144 _u.setPixelColor(_i, _c);
145 return *this;
146 }
147
148 private:
149 UnitLED& _u;
150 uint32_t _i;
151 rgb::Color _c; // Color at the time of Proxy creation
152 };
154
155public:
156 using container_type = std::vector<uint8_t>;
157 using item_container_type = std::vector<gpio::m5_rmt_item_t>;
158
163 struct config_t {
164 uint8_t brightness{10};
166 uint8_t mem_blocks{0};
168 bool with_dma{false};
169 };
170
173
175 {
176 return _cfg;
177 }
179 inline void config(const config_t& cfg)
180 {
181 _cfg = cfg;
182 }
184
188 explicit UnitLED(const uint16_t num_of_pixels, const rgb::Order order)
189 : Component(0x00), _order{order}, _numPixels{num_of_pixels}
190 {
191 _offsetR = rgb::offsetR(_order);
192 _offsetG = rgb::offsetG(_order);
193 _offsetB = rgb::offsetB(_order);
194 _offsetW = rgb::offsetW(_order);
195 _pixels.resize(_numPixels * (3 + hasWhite()));
196 }
197
198 virtual ~UnitLED()
199 {
200 }
201
203 virtual bool begin() override;
204
208 inline uint16_t numPixels() const
209 {
210 return _numPixels;
211 }
216 inline uint8_t brightness() const
217 {
218 return _brightness;
219 }
220
221 inline virtual uint16_t width() const
222 {
223 return numPixels();
224 }
225 inline virtual uint16_t height() const
226 {
227 return 1;
228 }
229
231 inline bool hasWhite() const
232 {
233 return (_order >= rgb::Order::hasWhite);
234 }
236 inline rgb::Order order() const
237 {
238 return _order;
239 }
241 inline int8_t offsetR() const
242 {
243 return _offsetR;
244 }
246 inline int8_t offsetG() const
247 {
248 return _offsetG;
249 }
251 inline int8_t offsetB() const
252 {
253 return _offsetB;
254 }
256 inline int8_t offsetW() const
257 {
258 return _offsetW;
259 }
260
262 const container_type& pixels() const
263 {
264 return _pixels;
265 }
272 inline rgb::Color color(const uint16_t n) const
273 {
274 return (n < _numPixels) ? get_pixel_color(index_of(n)) : rgb::Color();
275 }
282 inline rgb::Color absoluteColor(const uint16_t n) const
283 {
284 return (n < _numPixels) ? get_pixel_color(n) : rgb::Color();
285 }
287
291 bool writePixels();
293 inline bool show()
294 {
295 return writePixels();
296 }
298
302
309 inline void setBrightness(const uint8_t b)
310 {
311 _brightness = b;
312 }
323 bool setPixelColor(const uint16_t n, const uint8_t r, const uint8_t g, const uint8_t b);
335 inline bool setPixelColor(const uint16_t n, const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w)
336 {
337 return setPixelColor(n, rgb::Color(r, g, b, w));
338 }
347 inline bool setPixelColor(const uint16_t n, const rgb::wrgb32_color_t c)
348 {
349 return setPixelColor(n, rgb::Color(c));
350 }
359 inline bool setPixelColor(const uint16_t n, const rgb::Color& c)
360 {
361 return set_pixel_color(index_of(n), c);
362 }
372 bool fill(const rgb::Color& c, const uint16_t first = 0, const uint16_t count = 0);
377 inline void clear(void)
378 {
379 fill(rgb::Color());
380 }
389 bool fillRainbow(const uint16_t first = 0, const uint16_t count = 0, const uint8_t firstHue = 0);
399 bool fillGradation(const rgb::Color& firstClr, const rgb::Color& lastClr, const uint16_t first = 0,
400 const uint16_t count = 0);
408 bool fillRandom(const uint16_t first = 0, const uint16_t count = 0);
415 inline void shiftLeft(const uint16_t count = 1)
416 {
417 shift_left(count, false);
418 }
425 inline void shiftRight(const uint16_t count = 1)
426 {
427 shift_right(count, false);
428 }
434 inline void rotateLeft(const uint16_t count = 1)
435 {
436 shift_left(count, true);
437 }
443 inline void rotateRight(const uint16_t count = 1)
444 {
445 shift_right(count, true);
446 }
448
455 inline virtual uint8_t maxRotation() const
456 {
457 return 2; // 0,180 deg
458 }
460 inline float rotationDegree() const
461 {
462 return 360.f / maxRotation();
463 }
465 inline int8_t rotation() const
466 {
467 return _rot;
468 }
470 void setRotation(const int8_t rot);
472
477 rgb::Color operator[](const uint16_t i) const
478 {
479 return color(i);
480 }
482 PixelProxy operator[](const uint16_t i)
483 {
484 return PixelProxy(*this, i);
485 }
487
489 // Class that abstracts the interaction between classes and adapters
490 class Interface {
491 public:
492 explicit Interface(UnitLED& u) : _unit{u}
493 {
494 }
495 virtual ~Interface()
496 {
497 }
498 virtual bool write(const uint8_t*, const uint32_t) = 0;
499 // For items
500 virtual UnitLED::item_container_type items()
501 {
502 return {};
503 }
504 virtual UnitLED::item_container_type items_from_root()
505 {
506 return {};
507 }
508 // For RGB888
509 virtual UnitLED::container_type rgb888_items()
510 {
511 return {};
512 }
513 virtual UnitLED::container_type rgb888_items_from_root()
514 {
515 return {};
516 }
517
519 virtual bool writePixelsDirect()
520 {
521 return false;
522 }
523
524 protected:
525 UnitLED& _unit;
526 };
528
529protected:
530 inline virtual types::category_t unit_category() const override
531 {
532 return types::category_t::UnitLED;
533 }
534 inline virtual gpio::adapter_config_t rmt_config()
535 {
536 return gpio::adapter_config_t{};
537 }
538 inline virtual gpio::m5_rmt_item_t rmt_item_one()
539 {
540 return gpio::m5_rmt_item_t{};
541 }
542 inline virtual gpio::m5_rmt_item_t rmt_item_zero()
543 {
544 return gpio::m5_rmt_item_t{};
545 }
546 inline virtual gpio::m5_rmt_item_t rmt_item_reset()
547 {
548 return gpio::m5_rmt_item_t{};
549 }
550 inline container_type& pixels()
551 {
552 return _pixels;
553 }
554
555 // Not affected by rotation
556 rgb::Color get_pixel_color(const uint16_t n) const;
557 bool set_pixel_color(const uint16_t n, const rgb::Color& c);
558
559 inline uint8_t rotation_of(const int8_t r) const
560 {
561 return (r % maxRotation() + maxRotation()) % maxRotation();
562 }
563
564 inline virtual uint16_t index_of(const uint16_t n) const
565 {
566 // 0 or 180 deg
567 return _rot ? _numPixels - (n % _numPixels) - 1 : n;
568 }
569
570 container_type rgb888_items();
571 item_container_type items();
572
573 void shift_left(const uint16_t count, const bool wrap);
574 void shift_right(const uint16_t count, const bool wrap);
575
576private:
577 rgb::Order _order{rgb::Order::unknown};
578 uint8_t _brightness{10};
579 int8_t _rot{};
580 int8_t _offsetR{-1}, _offsetG{-1}, _offsetB{-1}, _offsetW{-1};
581 uint16_t _numPixels{};
582 container_type _pixels{}; // Order by rgb::Order
583 std::unique_ptr<Interface> _interface{};
584 config_t _cfg{};
585
586 friend class InterfaceGPIO;
587 friend class InterfacePbHub;
588};
589
590} // namespace unit
591} // namespace m5
592#endif
LED base unit.
bool fillRandom(const uint16_t first=0, const uint16_t count=0)
Fill the specified range to random color pixels.
Definition unit_LED.cpp:612
bool setPixelColor(const uint16_t n, const rgb::wrgb32_color_t c)
Set pixel color.
Definition unit_LED.hpp:347
int8_t rotation() const
Get the rotation.
Definition unit_LED.hpp:465
void setBrightness(const uint8_t b)
Set the brightness.
Definition unit_LED.hpp:309
int8_t offsetW() const
Offset of white.
Definition unit_LED.hpp:256
rgb::Color color(const uint16_t n) const
Get the Color.
Definition unit_LED.hpp:272
virtual uint16_t height() const
Number of the pixels.
Definition unit_LED.hpp:225
void rotateRight(const uint16_t count=1)
Rotate pixels right.
Definition unit_LED.hpp:443
std::vector< uint8_t > container_type
pixel container
Definition unit_LED.hpp:156
void shiftRight(const uint16_t count=1)
Shift pixels right.
Definition unit_LED.hpp:425
virtual bool begin() override
Begin the unit.
Definition unit_LED.cpp:481
int8_t offsetB() const
Offset of blue.
Definition unit_LED.hpp:251
PixelProxy operator[](const uint16_t i)
lvalue
Definition unit_LED.hpp:482
int8_t offsetR() const
Offset of red.
Definition unit_LED.hpp:241
bool setPixelColor(const uint16_t n, const rgb::Color &c)
Set pixel color.
Definition unit_LED.hpp:359
void setRotation(const int8_t rot)
Set the rotation.
Definition unit_LED.cpp:625
int8_t offsetG() const
Offset of green.
Definition unit_LED.hpp:246
bool fill(const rgb::Color &c, const uint16_t first=0, const uint16_t count=0)
Fill the specified range with the specified color.
Definition unit_LED.cpp:562
config_t config()
Gets the configuration.
Definition unit_LED.hpp:174
virtual uint16_t width() const
Number of the pixels.
Definition unit_LED.hpp:221
bool show()
Write pixel color to LED (alias)
Definition unit_LED.hpp:293
UnitLED(const uint16_t num_of_pixels, const rgb::Order order)
Constructor.
Definition unit_LED.hpp:188
bool hasWhite() const
Has white data?
Definition unit_LED.hpp:231
uint8_t brightness() const
Brightness.
Definition unit_LED.hpp:216
void clear(void)
Clear pixels.
Definition unit_LED.hpp:377
rgb::Color operator[](const uint16_t i) const
rvalue
Definition unit_LED.hpp:477
void config(const config_t &cfg)
Set the configuration.
Definition unit_LED.hpp:179
virtual uint8_t maxRotation() const
Get the max rotation.
Definition unit_LED.hpp:455
bool setPixelColor(const uint16_t n, const uint8_t r, const uint8_t g, const uint8_t b)
Set pixel color (RGB)
Definition unit_LED.cpp:549
void shiftLeft(const uint16_t count=1)
Shift pixels left.
Definition unit_LED.hpp:415
bool fillRainbow(const uint16_t first=0, const uint16_t count=0, const uint8_t firstHue=0)
Fill the specified range to rainbow.
Definition unit_LED.cpp:574
rgb::Color absoluteColor(const uint16_t n) const
Get the Color.
Definition unit_LED.hpp:282
void rotateLeft(const uint16_t count=1)
Rotate pixels left.
Definition unit_LED.hpp:434
rgb::Order order() const
Color order.
Definition unit_LED.hpp:236
uint16_t numPixels() const
Number of the pixels.
Definition unit_LED.hpp:208
bool writePixels()
Write pixel color to LED.
Definition unit_LED.cpp:528
std::vector< gpio::m5_rmt_item_t > item_container_type
item container
Definition unit_LED.hpp:157
const container_type & pixels() const
pixels container
Definition unit_LED.hpp:262
float rotationDegree() const
Get the rotation angle per 1 (degree)
Definition unit_LED.hpp:460
bool fillGradation(const rgb::Color &firstClr, const rgb::Color &lastClr, const uint16_t first=0, const uint16_t count=0)
Fill the specified range to gradation pixels.
Definition unit_LED.cpp:591
bool setPixelColor(const uint16_t n, const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w)
Set pixel color (RGBW)
Definition unit_LED.hpp:335
Top level namespace of M5stack.
For M5Unit-RGB.
Unit-related namespace.
Settings for begin.
Definition unit_LED.hpp:163
bool with_dma
Use DMA for RMT (RMT v2 only, e.g. ESP32-S3/C6). Ignored via PbHub.
Definition unit_LED.hpp:168
uint8_t mem_blocks
RMT memory blocks (0 = use chip default). Ignored via PbHub.
Definition unit_LED.hpp:166
uint8_t brightness
Definition unit_LED.hpp:164
WRGB 32bits.
Definition unit_LED.hpp:32
uint8_t b
Blue.
Definition unit_LED.hpp:49
wrgb32_color_t wrgb
WRGB 32bits.
Definition unit_LED.hpp:47
uint8_t a[4]
Array.
Definition unit_LED.hpp:54
uint8_t w
White.
Definition unit_LED.hpp:52
uint8_t g
Green.
Definition unit_LED.hpp:50
uint8_t r
Red.
Definition unit_LED.hpp:51
static Color fromHSV(const uint8_t h, const uint8_t s, const uint8_t v)
Make Color from HSV.
Definition unit_LED.cpp:143
uint32_t wrgb32_color_t
WRGB 32bits.
Definition unit_LED.hpp:26
Order
Color order.
Definition unit_LED.hpp:65