1#ifndef __INC_CHIPSETS_H
2#define __INC_CHIPSETS_H
10FASTLED_NAMESPACE_BEGIN
20#if defined(SoftwareSerial_h) || defined(__SoftwareSerial_h)
21#include <SoftwareSerial.h>
28template<u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
30 SoftwareSerial Serial;
34 PixieController() : Serial(-1, DATA_PIN) {}
46 while(pixels.
has(1)) {
86template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(12) >
90 class LPD8806_ADJUST {
93 __attribute__((always_inline))
inline static uint8_t adjust(FASTLED_REGISTER uint8_t data) {
return ((data>>1) | 0x80) + ((data && (data<254)) & 0x01); }
94 __attribute__((always_inline))
inline static void postBlock(
int len) {
112 mSPI.template writePixels<0, LPD8806_ADJUST, RGB_ORDER>(pixels);
128template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(1)>
148 mSPI.template writePixels<0, DATA_NOP, RGB_ORDER>(pixels);
155template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(25)>
166template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(12)>
187 while(pixels.
has(1)) {
188 FASTLED_REGISTER uint16_t command;
199 endBoundary(pixels.
size());
217template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(12)>
225 inline void writeLed(uint8_t brightness, uint8_t b0, uint8_t b1, uint8_t b2) __attribute__((always_inline)) {
226#ifdef FASTLED_SPI_BYTE_ONLY
232 uint16_t b = 0xE000 | (brightness << 8) | (uint16_t)b0;
234 uint16_t w = b1 << 8;
253#if FASTLED_USE_GLOBAL_BRIGHTNESS == 1
254 const uint16_t maxBrightness = 0x1F;
255 uint16_t brightness = ((((uint16_t)max(max(s0, s1), s2) + 1) * maxBrightness - 1) >> 8) + 1;
256 s0 = (maxBrightness * s0 + (brightness >> 1)) / brightness;
257 s1 = (maxBrightness * s1 + (brightness >> 1)) / brightness;
258 s2 = (maxBrightness * s2 + (brightness >> 1)) / brightness;
260 const uint8_t brightness = 0x1F;
264 while (pixels.
has(1)) {
269 endBoundary(pixels.
size());
282template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(24)>
288 void endBoundary(
int nLeds) {
int nLongWords = (nLeds/32);
do { mSPI.
writeByte(0x00); mSPI.
writeByte(0x00); mSPI.
writeByte(0x00); mSPI.
writeByte(0x00); }
while(nLongWords--); }
290 inline void writeLed(uint8_t brightness, uint8_t b0, uint8_t b1, uint8_t b2) __attribute__((always_inline)) {
291#ifdef FASTLED_SPI_BYTE_ONLY
297 uint16_t b = 0xE000 | (brightness << 8) | (uint16_t)b0;
299 uint16_t w = b1 << 8;
318#if FASTLED_USE_GLOBAL_BRIGHTNESS == 1
319 const uint16_t maxBrightness = 0x1F;
320 uint16_t brightness = ((((uint16_t)max(max(s0, s1), s2) + 1) * maxBrightness - 1) >> 8) + 1;
321 s0 = (maxBrightness * s0 + (brightness >> 1)) / brightness;
322 s1 = (maxBrightness * s1 + (brightness >> 1)) / brightness;
323 s2 = (maxBrightness * s2 + (brightness >> 1)) / brightness;
325 const uint8_t brightness = 0x1F;
329 while (pixels.
has(1)) {
335 endBoundary(pixels.
size());
356template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(10)>
363 inline void writeLed(uint8_t r, uint8_t g, uint8_t b) __attribute__((always_inline)) {
364 FASTLED_REGISTER uint8_t top = 0xC0 | ((~b & 0xC0) >> 2) | ((~g & 0xC0) >> 4) | ((~r & 0xC0) >> 6);
381 while(pixels.
has(1)) {
406template <u
int8_t DATA_PIN, u
int8_t CLOCK_PIN, EOrder RGB_ORDER = RGB, u
int32_t SPI_SPEED = DATA_RATE_MHZ(16)>
414 mSPI.template writeBit<0>(0);
418 mSPI.template writeBit<0>(0);
439 mSPI.template writePixels<FLAG_START_BIT, DATA_NOP, RGB_ORDER>( pixels );
453#ifdef FASTLED_HAS_CLOCKLESS
478#if !defined(CLOCKLESS_FREQUENCY)
479 #define CLOCKLESS_FREQUENCY F_CPU
484#if defined(__LGT8F__) || (CLOCKLESS_FREQUENCY == 8000000 || CLOCKLESS_FREQUENCY == 16000000 || CLOCKLESS_FREQUENCY == 24000000) || defined(FASTLED_DOXYGEN)
488#define FMUL (CLOCKLESS_FREQUENCY/8000000)
492template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
497template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
502template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
508template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
513template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
518template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
523template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
528template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
529class WS2813Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 4 * FMUL, 3 * FMUL, RGB_ORDER> {};
533template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
538template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
539class SK6822Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 8 * FMUL, 3 * FMUL, RGB_ORDER> {};
543template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
544class SM16703Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 4 * FMUL, 3 * FMUL, RGB_ORDER> {};
548template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
549class SK6812Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 3 * FMUL, 4 * FMUL, RGB_ORDER> {};
553template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
558template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
563template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
568template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
569class UCS2903Controller :
public ClocklessController<DATA_PIN, 2 * FMUL, 6 * FMUL, 2 * FMUL, RGB_ORDER> {};
573template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
578template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
583template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
584class TM1829Controller800Khz :
public ClocklessController<DATA_PIN, 2 * FMUL, 5 * FMUL, 3 * FMUL, RGB_ORDER, 0, true, 500> {};
588template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
593template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
598template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
599class PL9823Controller :
public ClocklessController<DATA_PIN, 3 * FMUL, 8 * FMUL, 3 * FMUL, RGB_ORDER> {};
605#ifdef FASTLED_TEENSY4
609#define C_NS(_NS) (((_NS * ((CLOCKLESS_FREQUENCY / 1000000L)) + 999)) / 1000)
613template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
614class GE8822Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(350), C_NS(660), C_NS(350), RGB_ORDER, 4> {};
617template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
618class GW6205Controller400Khz :
public ClocklessController<DATA_PIN, C_NS(800), C_NS(800), C_NS(800), RGB_ORDER, 4> {};
621template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
622class GW6205Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(400), C_NS(400), C_NS(400), RGB_ORDER, 4> {};
625template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
626class UCS1903Controller400Khz :
public ClocklessController<DATA_PIN, C_NS(500), C_NS(1500), C_NS(500), RGB_ORDER> {};
629template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
630class UCS1903BController800Khz :
public ClocklessController<DATA_PIN, C_NS(400), C_NS(450), C_NS(450), RGB_ORDER> {};
633template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
634class UCS1904Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(400), C_NS(400), C_NS(450), RGB_ORDER> {};
637template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
638class UCS2903Controller :
public ClocklessController<DATA_PIN, C_NS(250), C_NS(750), C_NS(250), RGB_ORDER> {};
641template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
642class TM1809Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(350), C_NS(350), C_NS(450), RGB_ORDER> {};
645template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
646class WS2811Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(320), C_NS(320), C_NS(640), RGB_ORDER> {};
649template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
650class WS2813Controller :
public ClocklessController<DATA_PIN, C_NS(320), C_NS(320), C_NS(640), RGB_ORDER> {};
653template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
654class WS2812Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(250), C_NS(625), C_NS(375), RGB_ORDER> {};
657template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
658class WS2811Controller400Khz :
public ClocklessController<DATA_PIN, C_NS(800), C_NS(800), C_NS(900), RGB_ORDER> {};
661template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
662class TM1803Controller400Khz :
public ClocklessController<DATA_PIN, C_NS(700), C_NS(1100), C_NS(700), RGB_ORDER> {};
664template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
665class TM1829Controller800Khz :
public ClocklessController<DATA_PIN, C_NS(340), C_NS(340), C_NS(550), RGB_ORDER, 0, true, 500> {};
667template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
668class TM1829Controller1600Khz :
public ClocklessController<DATA_PIN, C_NS(100), C_NS(300), C_NS(200), RGB_ORDER, 0, true, 500> {};
670template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
671class LPD1886Controller1250Khz :
public ClocklessController<DATA_PIN, C_NS(200), C_NS(400), C_NS(200), RGB_ORDER, 4> {};
673template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
677template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
678class SK6822Controller :
public ClocklessController<DATA_PIN, C_NS(375), C_NS(1000), C_NS(375), RGB_ORDER> {};
680template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
681class SK6812Controller :
public ClocklessController<DATA_PIN, C_NS(300), C_NS(300), C_NS(600), RGB_ORDER> {};
683template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
684class SM16703Controller :
public ClocklessController<DATA_PIN, C_NS(300), C_NS(600), C_NS(300), RGB_ORDER> {};
686template <u
int8_t DATA_PIN, EOrder RGB_ORDER = RGB>
687class PL9823Controller :
public ClocklessController<DATA_PIN, C_NS(350), C_NS(1010), C_NS(350), RGB_ORDER> {};
central include file for FastLED, defines the CFastLED class/object
virtual void init()
Initialize the LED controller.
virtual void showPixels(PixelController< RGB_ORDER > &pixels)
Send the LED data to the strip.
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 > &pixels)
Send the LED data to the strip.
virtual void init()
Initialize the LED controller.
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.
Definitions for pixel color data structs.
uint8_t getScale1()
non-template alias of getscale<1>()
void stepDithering()
Step the dithering forward.
uint8_t loadAndScale0(int lane, uint8_t scale)
non-template alias of loadAndScale<0>()
void advanceData()
Advance the data pointer forward, adjust position counter.
int size()
Get the length of the LED strip.
uint8_t loadAndScale1(int lane, uint8_t scale)
non-template alias of loadAndScale<1>()
uint8_t getScale0()
non-template alias of getscale<0>()
uint8_t loadAndScale2(int lane, uint8_t scale)
non-template alias of loadAndScale<2>()
uint8_t getScale2()
non-template alias of getscale<2>()
bool has(int n)
Do we have n pixels left to process?