FastLED 3.9.13
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 bool getEnabled() { return m_enabled; }
74
76 // If we added virtual to the AVR boards then we are going to add 600 bytes of memory to the binary
77 // flash size. This is because the virtual destructor pulls in malloc and free, which are the largest
78 // Testing shows that this virtual destructor adds a 600 bytes to the binary on
79 // attiny85 and about 1k for the teensy 4.X series.
80 // Attiny85:
81 // With CLEDController destructor virtual: 11018 bytes to binary.
82 // Without CLEDController destructor virtual: 10666 bytes to binary.
83 VIRTUAL_IF_NOT_AVR ~CLEDController();
84
85 Rgbw getRgbw() const { return mRgbMode; }
86
88 virtual void init() = 0;
89
92 VIRTUAL_IF_NOT_AVR void clearLeds(int nLeds = -1) {
94 showLeds(0);
95 }
96
97 // Compatibility with the 3.8.x codebase.
98 VIRTUAL_IF_NOT_AVR void showLeds(uint8_t brightness) {
99 void* data = beginShowLeds(m_nLeds);
100 showLedsInternal(brightness);
101 endShowLeds(data);
102 }
103
104 ColorAdjustment getAdjustmentData(uint8_t brightness);
105
113 void showInternal(const struct CRGB *data, int nLeds, uint8_t brightness) {
114 if (m_enabled) {
115 show(data, nLeds,brightness);
116 }
117 }
118
126 void showColorInternal(const struct CRGB &data, int nLeds, uint8_t brightness) {
127 if (m_enabled) {
128 showColor(data, nLeds, brightness);
129 }
130 }
131
135 void showLedsInternal(uint8_t brightness) {
136 if (m_enabled) {
137 show(m_Data, m_nLeds, brightness);
138 }
139 }
140
146 void showColorInternal(const struct CRGB & data, uint8_t brightness) {
147 if (m_enabled) {
148 showColor(data, m_nLeds, brightness);
149 }
150 }
151
154 static CLEDController *head() { return m_pHead; }
155
159
163 CLEDController & setLeds(CRGB *data, int nLeds) {
164 m_Data = data;
165 m_nLeds = nLeds;
166 return *this;
167 }
168
170 void clearLedDataInternal(int nLeds = -1);
171
174 virtual int size() { return m_nLeds; }
175
178 virtual int lanes() { return 1; }
179
182 CRGB* leds() { return m_Data; }
183
187 CRGB &operator[](int x) { return m_Data[x]; }
188
192 inline CLEDController & setDither(uint8_t ditherMode = BINARY_DITHER) { m_DitherMode = ditherMode; return *this; }
193
194 CLEDController& setScreenMap(const fl::XYMap& map) {
195 // EngineEvents::onCanvasUiSet(this, map);
196 fl::ScreenMap screenmap = map.toScreenMap();
197 fl::EngineEvents::onCanvasUiSet(this, screenmap);
198 return *this;
199 }
200
201 CLEDController& setScreenMap(const fl::ScreenMap& map) {
202 fl::EngineEvents::onCanvasUiSet(this, map);
203 return *this;
204 }
205
206 CLEDController& setScreenMap(uint16_t width, uint16_t height) {
207 return setScreenMap(fl::XYMap::constructRectangularGrid(width, height));
208 }
209
212 inline uint8_t getDither() { return m_DitherMode; }
213
214 virtual void* beginShowLeds(int size) {
215 FASTLED_UNUSED(size);
216 // By default, emit an integer. This integer will, by default, be passed back.
217 // If you override beginShowLeds() then
218 // you should also override endShowLeds() to match the return state.
219 //
220 // For async led controllers this should be used as a sync point to block
221 // the caller until the leds from the last draw frame have completed drawing.
222 // for each controller:
223 // beginShowLeds();
224 // for each controller:
225 // showLeds();
226 // for each controller:
227 // endShowLeds();
228 uintptr_t d = getDither();
229 void* out = reinterpret_cast<void*>(d);
230 return out;
231 }
232
233 virtual void endShowLeds(void* data) {
234 // By default recieves the integer that beginShowLeds() emitted.
235 //For async controllers this should be used to signal the controller
236 // to begin transmitting the current frame to the leds.
237 uintptr_t d = reinterpret_cast<uintptr_t>(data);
238 setDither(static_cast<uint8_t>(d));
239 }
240
244 CLEDController & setCorrection(CRGB correction) { m_ColorCorrection = correction; return *this; }
245
247 CLEDController & setCorrection(LEDColorCorrection correction) { m_ColorCorrection = correction; return *this; }
248
252
256 CLEDController & setTemperature(CRGB temperature) { m_ColorTemperature = temperature; return *this; }
257
259 CLEDController & setTemperature(ColorTemperature temperature) { m_ColorTemperature = temperature; return *this; }
260
264
271
274 virtual uint16_t getMaxRefreshRate() const { return 0; }
275};
276
278
279
central include file for FastLED, defines the CFastLED class/object
High level controller interface for FastLED.
Definition FastLED.h:353
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