1#ifndef __INC_CHIPSETS_H
2#define __INC_CHIPSETS_H
6#include "five_bit_hd_gamma.h"
7#include "force_inline.h"
8#include "pixel_iterator.h"
14#ifndef FASTLED_CLOCKLESS_USES_NANOSECONDS
15 #if defined(FASTLED_TEENSY4)
16 #define FASTLED_CLOCKLESS_USES_NANOSECONDS 1
18 #include "platforms/esp/32/led_strip/enabled.h"
21 #define FASTLED_CLOCKLESS_USES_NANOSECONDS 1
23 #define FASTLED_CLOCKLESS_USES_NANOSECONDS 0
26 #define FASTLED_CLOCKLESS_USES_NANOSECONDS 0
44#if defined(SoftwareSerial_h) || defined(__SoftwareSerial_h)
45#include <SoftwareSerial.h>
49FASTLED_NAMESPACE_BEGIN
54template<u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
56 SoftwareSerial Serial;
60 PixieController() : Serial(-1, DATA_PIN) {}
72 while(pixels.
has(1)) {
102FASTLED_NAMESPACE_BEGIN
105 EOrder RGB_ORDER = GRB>
108 CONTROLLER::MASK_VALUE> {
110 static const int LANES = CONTROLLER::LANES_VALUE;
111 static const uint32_t MASK = CONTROLLER::MASK_VALUE;
114 static_assert(RGB == CONTROLLER::RGB_ORDER_VALUE,
"The delegated controller MUST NOT do reordering");
123 ensureBuffer(pixels.
size());
126 pixels_device.mColorAdjustment.premixed =
CRGB(255, 255, 255);
127 #if FASTLED_HD_COLOR_MIXING
128 pixels_device.mColorAdjustment.color =
CRGB(255, 255, 255);
129 pixels_device.mColorAdjustment.brightness = 255;
131 pixels_device.
mData =
reinterpret_cast<uint8_t *
>(mRGBWPixels);
132 pixels_device.
mLen = mNumRGBWLeds;
134 uint8_t *data =
reinterpret_cast<uint8_t *
>(mRGBWPixels);
135 PixelIterator iterator = pixels.as_iterator(this->getRgbw());
136 while (iterator.has(1)) {
138 iterator.loadAndScaleRGBW(data, data + 1, data + 2, data + 3);
140 iterator.advanceData();
149 void init()
override {}
151 void ensureBuffer(int32_t num_leds) {
152 if (num_leds != mNumRGBLeds) {
153 mNumRGBLeds = num_leds;
158 mNumRGBWLeds = (num_leds * 4 + 2) / 3;
159 size_t extra = mNumRGBWLeds % 3 ? 1 : 0;
160 delete[] mRGBWPixels;
161 mRGBWPixels =
new CRGB[mNumRGBWLeds + extra];
165 CRGB *mRGBWPixels =
nullptr;
166 int32_t mNumRGBLeds = 0;
167 int32_t mNumRGBWLeds = 0;
168 CONTROLLER mController;
186template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(12) >
190 class LPD8806_ADJUST {
193 FASTLED_FORCE_INLINE
static uint8_t adjust(FASTLED_REGISTER uint8_t data) {
return ((data>>1) | 0x80) + ((data && (data<254)) & 0x01); }
194 FASTLED_FORCE_INLINE
static void postBlock(
int len,
void* context = NULL) {
195 SPI* pSPI =
static_cast<SPI*
>(context);
213 mSPI.template writePixels<0, LPD8806_ADJUST, RGB_ORDER>(pixels, &mSPI);
229template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(1)>
249 mSPI.template writePixels<0, DATA_NOP, RGB_ORDER>(pixels, NULL);
256template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(25)>
267template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(12)>
288 while(pixels.
has(1)) {
289 FASTLED_REGISTER uint16_t command;
300 endBoundary(pixels.
size());
319 uint8_t DATA_PIN, uint8_t CLOCK_PIN,
320 EOrder RGB_ORDER = RGB,
327 FiveBitGammaCorrectionMode GAMMA_CORRECTION_MODE = kFiveBitGammaCorrectionMode_Null,
328 uint32_t START_FRAME = 0x00000000,
329 uint32_t END_FRAME = 0xFF000000
335 void startBoundary() {
339 void endBoundary(
int nLeds) {
340 int nDWords = (nLeds/32);
341 const uint8_t b0 = uint8_t(END_FRAME >> 24 & 0x000000ff);
342 const uint8_t b1 = uint8_t(END_FRAME >> 16 & 0x000000ff);
343 const uint8_t b2 = uint8_t(END_FRAME >> 8 & 0x000000ff);
344 const uint8_t b3 = uint8_t(END_FRAME >> 0 & 0x000000ff);
353 FASTLED_FORCE_INLINE
void writeLed(uint8_t brightness, uint8_t b0, uint8_t b1, uint8_t b2) {
354#ifdef FASTLED_SPI_BYTE_ONLY
360 uint16_t b = 0xE000 | (brightness << 8) | (uint16_t)b0;
362 uint16_t w = b1 << 8;
368 FASTLED_FORCE_INLINE
void write2Bytes(uint8_t b1, uint8_t b2) {
369#ifdef FASTLED_SPI_BYTE_ONLY
387 PixelIterator iterator = pixels.as_iterator(this->getRgbw());
388 switch (GAMMA_CORRECTION_MODE) {
389 case kFiveBitGammaCorrectionMode_Null: {
390 showPixelsDefault(iterator);
393 case kFiveBitGammaCorrectionMode_BitShift: {
394 showPixelsGammaBitShift(iterator);
402 static inline void getGlobalBrightnessAndScalingFactors(
404 uint8_t* out_s0, uint8_t* out_s1, uint8_t* out_s2, uint8_t* out_brightness) {
405#if FASTLED_HD_COLOR_MIXING
407 pixels.getHdScale(out_s0, out_s1, out_s2, &brightness);
409 static uint16_t map(uint16_t x, uint16_t in_min, uint16_t in_max, uint16_t out_min, uint16_t out_max) {
410 const uint16_t run = in_max - in_min;
411 const uint16_t rise = out_max - out_min;
412 const uint16_t delta = x - in_min;
413 return (delta * rise) / run + out_min;
416 *out_brightness = Math::map(brightness, 0, 255, 0, 31);
420 pixels.loadAndScaleRGB(&s0, &s1, &s2);
421#if FASTLED_USE_GLOBAL_BRIGHTNESS == 1
423 const uint16_t maxBrightness = 0x1F;
424 uint16_t brightness = ((((uint16_t)max(max(s0, s1), s2) + 1) * maxBrightness - 1) >> 8) + 1;
425 s0 = (maxBrightness * s0 + (brightness >> 1)) / brightness;
426 s1 = (maxBrightness * s1 + (brightness >> 1)) / brightness;
427 s2 = (maxBrightness * s2 + (brightness >> 1)) / brightness;
429 const uint8_t brightness = 0x1F;
434 *out_brightness =
static_cast<uint8_t
>(brightness);
441 uint8_t s0, s1, s2, global_brightness;
442 getGlobalBrightnessAndScalingFactors(pixels, &s0, &s1, &s2, &global_brightness);
444 while (pixels.has(1)) {
446 pixels.loadAndScaleRGB(&c0, &c1, &c2);
447 writeLed(global_brightness, c0, c1, c2);
448 pixels.stepDithering();
449 pixels.advanceData();
451 endBoundary(pixels.size());
460 while (pixels.has(1)) {
462 uint8_t brightness, c0, c1, c2;
463 pixels.loadAndScale_APA102_HD(&c0, &c1, &c2, &brightness);
464 writeLed(brightness, c0, c1, c2);
465 pixels.stepDithering();
466 pixels.advanceData();
468 endBoundary(pixels.size());
482 EOrder RGB_ORDER = RGB,
495 kFiveBitGammaCorrectionMode_BitShift,
496 uint32_t(0x00000000),
497 uint32_t(0x00000000)> {
511 EOrder RGB_ORDER = RGB,
519 kFiveBitGammaCorrectionMode_Null,
533 EOrder RGB_ORDER = RGB,
541 kFiveBitGammaCorrectionMode_BitShift,
560template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(10)>
567 FASTLED_FORCE_INLINE
void writeLed(uint8_t r, uint8_t g, uint8_t b) {
568 FASTLED_REGISTER uint8_t top = 0xC0 | ((~b & 0xC0) >> 2) | ((~g & 0xC0) >> 4) | ((~r & 0xC0) >> 6);
585 while(pixels.
has(1)) {
610template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(16)>
618 mSPI.template writeBit<0>(0);
622 mSPI.template writeBit<0>(0);
643 mSPI.template writePixels<FLAG_START_BIT, DATA_NOP, RGB_ORDER>(pixels, NULL);
657#ifdef FASTLED_HAS_CLOCKLESS
682#if !defined(CLOCKLESS_FREQUENCY)
683 #define CLOCKLESS_FREQUENCY F_CPU
688#if defined(__LGT8F__) || (CLOCKLESS_FREQUENCY == 8000000 || CLOCKLESS_FREQUENCY == 16000000 || CLOCKLESS_FREQUENCY == 24000000) || defined(FASTLED_DOXYGEN)
692#define FMUL (CLOCKLESS_FREQUENCY/8000000)
696template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
701template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
706template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
712template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
717template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
718class WS2815Controller :
public ClocklessController<DATA_PIN, 2 * FMUL, 9 * FMUL, 4 * FMUL, RGB_ORDER> {};
722template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
727template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
732template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
737template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
738class WS2813Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 4 * FMUL, 3 * FMUL, RGB_ORDER> {};
742template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
747template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
748class SK6822Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 8 * FMUL, 3 * FMUL, RGB_ORDER> {};
752template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
753class SM16703Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 4 * FMUL, 3 * FMUL, RGB_ORDER> {};
757template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
758class SK6812Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 3 * FMUL, 4 * FMUL, RGB_ORDER> {};
762template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
767template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
772template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
777template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
778class UCS2903Controller :
public ClocklessController<DATA_PIN, 2 * FMUL, 6 * FMUL, 2 * FMUL, RGB_ORDER> {};
782template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
787template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
792template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
793class TM1829Controller800Khz :
public ClocklessController<DATA_PIN, 2 * FMUL, 5 * FMUL, 3 * FMUL, RGB_ORDER, 0, true, 500> {};
797template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
802template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
807template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
808class PL9823Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 8 * FMUL, 3 * FMUL, RGB_ORDER> {};
811template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
812class UCS1912Controller :
public ClocklessController<DATA_PIN, 2 * FMUL, 8 * FMUL, 3 * FMUL, RGB_ORDER> {};
821#ifndef FASTLED_LED_OVERCLOCK
822#define FASTLED_LED_OVERCLOCK 1.0
830#ifndef FASTLED_LED_OVERCLOCK_WS2812
831#define FASTLED_LED_OVERCLOCK_WS2812 FASTLED_LED_OVERCLOCK
834#ifndef FASTLED_LED_OVERCLOCK_WS2811
835#define FASTLED_LED_OVERCLOCK_WS2811 FASTLED_LED_OVERCLOCK
838#ifndef FASTLED_LED_OVERCLOCK_WS2813
839#define FASTLED_LED_OVERCLOCK_WS2813 FASTLED_LED_OVERCLOCK
842#ifndef FASTLED_LED_OVERCLOCK_WS2815
843#define FASTLED_LED_OVERCLOCK_WS2815 FASTLED_LED_OVERCLOCK
846#ifndef FASTLED_LED_OVERCLOCK_SK6822
847#define FASTLED_LED_OVERCLOCK_SK6822 FASTLED_LED_OVERCLOCK
850#ifndef FASTLED_LED_OVERCLOCK_SK6812
851#define FASTLED_LED_OVERCLOCK_SK6812 FASTLED_LED_OVERCLOCK
856#if FASTLED_CLOCKLESS_USES_NANOSECONDS
860#define C_NS(_NS) (((_NS * ((CLOCKLESS_FREQUENCY / 1000000L)) + 999)) / 1000)
866#define C_NS_WS2812(_NS) (C_NS(int(_NS / FASTLED_LED_OVERCLOCK_WS2812)))
867#define C_NS_WS2811(_NS) (C_NS(int(_NS / FASTLED_LED_OVERCLOCK_WS2811)))
868#define C_NS_WS2813(_NS) (C_NS(int(_NS / FASTLED_LED_OVERCLOCK_WS2813)))
869#define C_NS_WS2815(_NS) (C_NS(int(_NS / FASTLED_LED_OVERCLOCK_WS2815)))
870#define C_NS_SK6822(_NS) (C_NS(int(_NS / FASTLED_LED_OVERCLOCK_SK6822)))
871#define C_NS_SK6812(_NS) (C_NS(int(_NS / FASTLED_LED_OVERCLOCK_SK6812)))
900template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
901class GE8822Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(350), C_NS(660), C_NS(350), RGB_ORDER, 4> {};
904template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
905class GW6205Controller400Khz :
public ClocklessController<DATA_PIN, C_NS(800), C_NS(800), C_NS(800), RGB_ORDER, 4> {};
908template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
909class GW6205Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(400), C_NS(400), C_NS(400), RGB_ORDER, 4> {};
912template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
913class UCS1903Controller400Khz :
public ClocklessController<DATA_PIN, C_NS(500), C_NS(1500), C_NS(500), RGB_ORDER> {};
916template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
917class UCS1903BController800Khz :
public ClocklessController<DATA_PIN, C_NS(400), C_NS(450), C_NS(450), RGB_ORDER> {};
920template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
921class UCS1904Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(400), C_NS(400), C_NS(450), RGB_ORDER> {};
924template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
925class UCS2903Controller :
public ClocklessController<DATA_PIN, C_NS(250), C_NS(750), C_NS(250), RGB_ORDER> {};
928template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
929class TM1809Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(350), C_NS(350), C_NS(450), RGB_ORDER> {};
932template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
933class WS2811Controller800Khz :
public ClocklessController<DATA_PIN, C_NS_WS2811(320), C_NS_WS2811(320), C_NS_WS2811(640), RGB_ORDER> {};
936template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
937class WS2813Controller :
public ClocklessController<DATA_PIN, C_NS_WS2813(320), C_NS_WS2813(320), C_NS_WS2813(640), RGB_ORDER> {};
939#ifndef FASTLED_WS2812_T1
940#define FASTLED_WS2812_T1 250
943#ifndef FASTLED_WS2812_T2
944#define FASTLED_WS2812_T2 625
947#ifndef FASTLED_WS2812_T3
948#define FASTLED_WS2812_T3 375
952template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
955 C_NS_WS2812(FASTLED_WS2812_T1),
956 C_NS_WS2812(FASTLED_WS2812_T2),
957 C_NS_WS2812(FASTLED_WS2812_T3),
961template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
962class WS2811Controller400Khz :
public ClocklessController<DATA_PIN, C_NS_WS2811(800), C_NS_WS2811(800), C_NS_WS2811(900), RGB_ORDER> {};
967template <u
int8_t DATA_PIN, EOrder RGB_ORDER = GRB>
968class WS2815Controller :
public ClocklessController<DATA_PIN, C_NS_WS2815(250), C_NS_WS2815(1090), C_NS_WS2815(550), RGB_ORDER> {};
971template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
972class TM1803Controller400Khz :
public ClocklessController<DATA_PIN, C_NS(700), C_NS(1100), C_NS(700), RGB_ORDER> {};
974template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
975class TM1829Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(340), C_NS(340), C_NS(550), RGB_ORDER, 0, true, 500> {};
977template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
978class TM1829Controller1600Khz :
public ClocklessController<DATA_PIN, C_NS(100), C_NS(300), C_NS(200), RGB_ORDER, 0, true, 500> {};
980template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
981class LPD1886Controller1250Khz :
public ClocklessController<DATA_PIN, C_NS(200), C_NS(400), C_NS(200), RGB_ORDER, 4> {};
983template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
987template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
988class SK6822Controller :
public ClocklessController<DATA_PIN, C_NS_SK6822(375), C_NS_SK6822(1000), C_NS_SK6822(375), RGB_ORDER> {};
990template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
991class SK6812Controller :
public ClocklessController<DATA_PIN, C_NS_SK6812(300), C_NS_SK6812(300), C_NS_SK6812(600), RGB_ORDER> {};
993template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
994class SM16703Controller :
public ClocklessController<DATA_PIN, C_NS(300), C_NS(600), C_NS(300), RGB_ORDER> {};
996template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
997class PL9823Controller :
public ClocklessController<DATA_PIN, C_NS(350), C_NS(1010), C_NS(350), RGB_ORDER> {};
1000template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
1001class UCS1912Controller :
public ClocklessController<DATA_PIN, C_NS(250), C_NS(1000), C_NS(350), RGB_ORDER> {};
1008FASTLED_NAMESPACE_END
central include file for FastLED, defines the CFastLED class/object
APA102 high definition controller class.
virtual void showPixels(PixelController< RGB_ORDER > &pixels)
Send the LED data to the strip.
virtual void init()
Initialize the LED controller.
void select()
Select the SPI output (chip select)
static void writeWord(uint16_t w)
Write a word (two bytes) over SPI.
static void writeByte(uint8_t b)
Write a single byte over SPI.
void release()
Release the SPI chip select line.
static void writeBytesValueRaw(uint8_t value, int len)
Write multiple bytes of the given value over SPI, without selecting the interface.
static void waitFully()
Wait until the SPI subsystem is ready for more data to write.
void init()
Set the clock/data pins to output and make sure the chip select is released.
virtual void init()=0
Initialize the LED controller.
Class to ensure that a minimum amount of time has kicked since the last time run - and delay if not e...
void mark()
Reset the timestamp that marks the start of the wait period.
void wait()
Blocking delay until WAIT time since mark() has passed.
Template extension of the CLEDController class.
virtual void showPixels(PixelController< RGB_ORDER, LANES, MASK > &pixels)=0
Send the LED data to the strip.
DP1903 controller class @ 400 KHz.
DP1903 controller class @ 800 KHz.
GW6205 controller class @ 400 KHz.
UCS1904 controller class @ 800 KHz.
LPD1886 controller class.
LPD1886 controller class.
LPD6803 controller class (LPD1101).
virtual void showPixels(PixelController< RGB_ORDER > &pixels)
Send the LED data to the strip.
virtual void init()
Initialize the LED controller.
LPD8806 controller class.
virtual void showPixels(PixelController< RGB_ORDER > &pixels)
Send the LED data to the strip.
virtual void init()
Initialize the LED controller.
virtual void showPixels(PixelController< RGB_ORDER > &pixels)
Send the LED data to the strip.
virtual void init()
Initialize the LED controller.
virtual void showPixels(PixelController< RGB_ORDER, LANES, MASK > &pixels)
Send the LED data to the strip.
SM16703 controller class.
SM16716 controller class.
virtual void init()
Initialize the LED controller.
virtual void showPixels(PixelController< RGB_ORDER > &pixels)
Send the LED data to the strip.
UCS1903B controller class.
UCS1903 controller class @ 400 KHz.
UCS1904 controller class.
UCS2903 controller class.
virtual void showPixels(PixelController< RGB_ORDER > &pixels)
Send the LED data to the strip.
virtual void init()
Initialize the controller.
WS2811 controller class @ 400 KHz.
WS2811 controller class @ 800 KHz.
WS2812 controller class @ 800 KHz.
WS2815 controller class @ 400 KHz.
#define DATA_RATE_MHZ(X)
Convert data rate from megahertz (MHz) to clock cycles per bit.
Representation of an RGB pixel (Red, Green, Blue)
FASTLED_FORCE_INLINE uint8_t loadAndScale1(int lane, uint8_t scale)
non-template alias of loadAndScale<1>()
int mLenRemaining
counter for the number of LEDs left to process
FASTLED_FORCE_INLINE uint8_t loadAndScale2(int lane, uint8_t scale)
non-template alias of loadAndScale<2>()
FASTLED_FORCE_INLINE uint8_t loadAndScale0(int lane, uint8_t scale)
non-template alias of loadAndScale<0>()
const uint8_t * mData
pointer to the underlying LED data
int mLen
number of LEDs in the data for one lane
FASTLED_FORCE_INLINE int size()
Get the length of the LED strip.
FASTLED_FORCE_INLINE void advanceData()
Advance the data pointer forward, adjust position counter.
FASTLED_FORCE_INLINE bool has(int n)
Do we have n pixels left to process?
FASTLED_FORCE_INLINE void stepDithering()
Step the dithering forward.