FastLED 3.9.12
Loading...
Searching...
No Matches
cled_controller.h
Go to the documentation of this file.
1#pragma once
2
3#include <stddef.h>
4
7
8#include "FastLED.h"
9#include "led_sysdefs.h"
10#include "pixeltypes.h"
11#include "color.h"
12
13#include "fl/force_inline.h"
14#include "fl/unused.h"
15#include "pixel_controller.h"
16#include "dither_mode.h"
17#include "pixel_iterator.h"
18#include "fl/engine_events.h"
19#include "fl/screenmap.h"
20#include "fl/virtual_if_not_avr.h"
21
23
24
26//
27// LED Controller interface definition
28//
30
37protected:
38 friend class CFastLED;
44 bool m_enabled = true;
45 int m_nLeds;
48
49public:
50
55 virtual void showColor(const CRGB & data, int nLeds, uint8_t brightness) = 0;
56
61 virtual void show(const struct CRGB *data, int nLeds, uint8_t brightness) = 0;
62
63
64 Rgbw mRgbMode = RgbwInvalid::value();
65 CLEDController& setRgbw(const Rgbw& arg = RgbwDefault::value()) {
66 // Note that at this time (Sept 13th, 2024) this is only implemented in the ESP32 driver
67 // directly. For an emulated version please see RGBWEmulatedController in chipsets.h
68 mRgbMode = arg;
69 return *this; // builder pattern.
70 }
71
72 void setEnabled(bool enabled) { m_enabled = enabled; }
73
75 // If we added virtual to the AVR boards then we are going to add 600 bytes of memory to the binary
76 // flash size. This is because the virtual destructor pulls in malloc and free, which are the largest
77 // Testing shows that this virtual destructor adds a 600 bytes to the binary on
78 // attiny85 and about 1k for the teensy 4.X series.
79 // Attiny85:
80 // With CLEDController destructor virtual: 11018 bytes to binary.
81 // Without CLEDController destructor virtual: 10666 bytes to binary.
82 VIRTUAL_IF_NOT_AVR ~CLEDController();
83
84 Rgbw getRgbw() const { return mRgbMode; }
85
87 virtual void init() = 0;
88
91 VIRTUAL_IF_NOT_AVR void clearLeds(int nLeds = -1) {
93 showLeds(0);
94 }
95
96 // Compatibility with the 3.8.x codebase.
97 VIRTUAL_IF_NOT_AVR void showLeds(uint8_t brightness) {
98 void* data = beginShowLeds(m_nLeds);
99 showLedsInternal(brightness);
100 endShowLeds(data);
101 }
102
103 ColorAdjustment getAdjustmentData(uint8_t brightness);
104
112 void showInternal(const struct CRGB *data, int nLeds, uint8_t brightness) {
113 if (m_enabled) {
114 show(data, nLeds,brightness);
115 }
116 }
117
125 void showColorInternal(const struct CRGB &data, int nLeds, uint8_t brightness) {
126 if (m_enabled) {
127 showColor(data, nLeds, brightness);
128 }
129 }
130
134 void showLedsInternal(uint8_t brightness) {
135 if (m_enabled) {
136 show(m_Data, m_nLeds, brightness);
137 }
138 }
139
145 void showColorInternal(const struct CRGB & data, uint8_t brightness) {
146 if (m_enabled) {
147 showColor(data, m_nLeds, brightness);
148 }
149 }
150
153 static CLEDController *head() { return m_pHead; }
154
158
162 CLEDController & setLeds(CRGB *data, int nLeds) {
163 m_Data = data;
164 m_nLeds = nLeds;
165 return *this;
166 }
167
169 void clearLedDataInternal(int nLeds = -1);
170
173 virtual int size() { return m_nLeds; }
174
177 virtual int lanes() { return 1; }
178
181 CRGB* leds() { return m_Data; }
182
186 CRGB &operator[](int x) { return m_Data[x]; }
187
191 inline CLEDController & setDither(uint8_t ditherMode = BINARY_DITHER) { m_DitherMode = ditherMode; return *this; }
192
193 CLEDController& setScreenMap(const fl::XYMap& map) {
194 // EngineEvents::onCanvasUiSet(this, map);
195 fl::ScreenMap screenmap = map.toScreenMap();
196 fl::EngineEvents::onCanvasUiSet(this, screenmap);
197 return *this;
198 }
199
200 CLEDController& setScreenMap(const fl::ScreenMap& map) {
201 fl::EngineEvents::onCanvasUiSet(this, map);
202 return *this;
203 }
204
205 CLEDController& setScreenMap(uint16_t width, uint16_t height) {
206 return setScreenMap(fl::XYMap::constructRectangularGrid(width, height));
207 }
208
211 inline uint8_t getDither() { return m_DitherMode; }
212
213 virtual void* beginShowLeds(int size) {
214 FASTLED_UNUSED(size);
215 // By default, emit an integer. This integer will, by default, be passed back.
216 // If you override beginShowLeds() then
217 // you should also override endShowLeds() to match the return state.
218 //
219 // For async led controllers this should be used as a sync point to block
220 // the caller until the leds from the last draw frame have completed drawing.
221 // for each controller:
222 // beginShowLeds();
223 // for each controller:
224 // showLeds();
225 // for each controller:
226 // endShowLeds();
227 uintptr_t d = getDither();
228 void* out = reinterpret_cast<void*>(d);
229 return out;
230 }
231
232 virtual void endShowLeds(void* data) {
233 // By default recieves the integer that beginShowLeds() emitted.
234 //For async controllers this should be used to signal the controller
235 // to begin transmitting the current frame to the leds.
236 uintptr_t d = reinterpret_cast<uintptr_t>(data);
237 setDither(static_cast<uint8_t>(d));
238 }
239
243 CLEDController & setCorrection(CRGB correction) { m_ColorCorrection = correction; return *this; }
244
246 CLEDController & setCorrection(LEDColorCorrection correction) { m_ColorCorrection = correction; return *this; }
247
251
255 CLEDController & setTemperature(CRGB temperature) { m_ColorTemperature = temperature; return *this; }
256
258 CLEDController & setTemperature(ColorTemperature temperature) { m_ColorTemperature = temperature; return *this; }
259
263
270
273 virtual uint16_t getMaxRefreshRate() const { return 0; }
274};
275
277
278
central include file for FastLED, defines the CFastLED class/object
High level controller interface for FastLED.
Definition FastLED.h:350
Base definition for an LED controller.
CLEDController & setTemperature(ColorTemperature temperature)
Set the color temperature, aka white point, for this controller.
CRGB getCorrection()
Get the correction value used by this controller.
CLEDController * next()
Get the next controller in the linked list after this one.
CLEDController & setDither(uint8_t ditherMode=BINARY_DITHER)
Set the dithering mode for this controller to use.
virtual int lanes()
How many Lanes does this controller manage?
virtual uint16_t getMaxRefreshRate() const
Gets the maximum possible refresh rate of the strip.
CRGB * m_Data
pointer to the LED data used by this controller
CRGB & operator[](int x)
Reference to the n'th LED managed by the controller.
CRGB m_ColorCorrection
CRGB object representing the color correction to apply to the strip on show()
virtual int size()
How many LEDs does this controller manage?
uint8_t getDither()
Get the dithering option currently set for this controller.
CLEDController & setLeds(CRGB *data, int nLeds)
Set the default array of LEDs to be used by this controller.
VIRTUAL_IF_NOT_AVR void clearLeds(int nLeds=-1)
Clear out/zero out the given number of LEDs.
CLEDController & setCorrection(CRGB correction)
The color corrction to use for this controller, expressed as a CRGB object.
static CLEDController * head()
Get the first LED controller in the linked list of controllers.
CLEDController()
Create an led controller object, add it to the chain of controllers.
EDitherMode m_DitherMode
the current dither mode of the controller
CLEDController & setTemperature(CRGB temperature)
Set the color temperature, aka white point, for this controller.
CRGB * leds()
Pointer to the CRGB array for this controller.
CLEDController * m_pNext
pointer to the next LED controller in the linked list
int m_nLeds
the number of LEDs in the LED data array
static CLEDController * m_pTail
pointer to the last LED controller in the linked list
void showInternal(const struct CRGB *data, int nLeds, uint8_t brightness)
void showColorInternal(const struct CRGB &data, int nLeds, uint8_t brightness)
void showLedsInternal(uint8_t brightness)
Write the data to the LEDs managed by this controller.
void clearLedDataInternal(int nLeds=-1)
Zero out the LED data managed by this controller.
CLEDController & setCorrection(LEDColorCorrection correction)
The color corrction to use for this controller, expressed as a CRGB object.
CRGB m_ColorTemperature
CRGB object representing the color temperature to apply to the strip on show()
void showColorInternal(const struct CRGB &data, uint8_t brightness)
virtual void showColor(const CRGB &data, int nLeds, uint8_t brightness)=0
Set all the LEDs to a given color.
CRGB getAdjustment(uint8_t scale)
Get the combined brightness/color adjustment for this controller.
virtual void init()=0
Initialize the LED controller.
static CLEDController * m_pHead
pointer to the first LED controller in the linked list
virtual void show(const struct CRGB *data, int nLeds, uint8_t brightness)=0
Write the passed in RGB data out to the LEDs managed by this controller.
CRGB getTemperature()
Get the color temperature, aka white point, for this controller.
Declares dithering options and types.
uint8_t EDitherMode
The dither setting, either DISABLE_DITHER or BINARY_DITHER.
Definition dither_mode.h:16
#define BINARY_DITHER
Enable dithering using binary dithering (only option)
Definition dither_mode.h:13
ColorTemperature
Color temperature values.
Definition color.h:46
LEDColorCorrection
Color correction starting points.
Definition color.h:15
Determines which platform system definitions to include.
#define FASTLED_NAMESPACE_END
End of the FastLED namespace.
Definition namespace.h:16
#define FASTLED_NAMESPACE_BEGIN
Start of the FastLED namespace.
Definition namespace.h:14
Low level pixel data writing class.
Non-templated low level pixel data writing class.
Includes defintions for RGB and HSV pixels.
Contains definitions for color correction and temperature.
Representation of an RGB pixel (Red, Green, Blue)
Definition crgb.h:54
static CRGB computeAdjustment(uint8_t scale, const CRGB &colorCorrection, const CRGB &colorTemperature)
Calculates the combined color adjustment to the LEDs at a given scale, color correction,...
Definition crgb.cpp:25
Definition rgbw.h:28