#ifndef __INC_FASTSPI_LED2_H #define __INC_FASTSPI_LED2_H #include "controller.h" #include "fastpin.h" #include "fastspi.h" #include "clockless.h" #include "lib8tion.h" #include "hsv2rgb.h" #include "chipsets.h" #include "dmx.h" enum ESPIChipsets { LPD8806, WS2801, SM16716, P9813 }; enum EClocklessChipsets { DMX, TM1809, TM1804, TM1803, WS2811, WS2812, WS2812B, UCS1903, UCS1903B, WS2811_400, NEOPIXEL, GW6205, GW6205_400, TM1829 }; enum EBlockChipsets { WS2811_PORTC }; #if defined(LIB8_ATTINY) #define NUM_CONTROLLERS 2 #else #define NUM_CONTROLLERS 8 #endif class CFastLED { struct CControllerInfo { CLEDController *pLedController; const struct CRGB *pLedData; int nLeds; int nOffset; }; CControllerInfo m_Controllers[NUM_CONTROLLERS]; int m_nControllers; CRGB m_Scale; public: CFastLED(); CLEDController &addLeds(CLEDController *pLed, const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0); template CLEDController &addLeds(const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { switch(CHIPSET) { case LPD8806: { static LPD8806Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } case WS2801: { static WS2801Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } case SM16716: { static SM16716Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } } } template CLEDController &addLeds(const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { switch(CHIPSET) { case LPD8806: { static LPD8806Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } case WS2801: { static WS2801Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } case SM16716: { static SM16716Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } case P9813: { static P9813Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } } } template CLEDController &addLeds(const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { switch(CHIPSET) { case LPD8806: { static LPD8806Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } case WS2801: { static WS2801Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } case SM16716: { static SM16716Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } case P9813: { static P9813Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } } } #ifdef SPI_DATA template CLEDController &addLeds(const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { return addLeds(data, nLedsOrOffset, nLedsIfOffset); } template CLEDController &addLeds(const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { return addLeds(data, nLedsOrOffset, nLedsIfOffset); } template CLEDController &addLeds(const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { return addLeds(data, nLedsOrOffset, nLedsIfOffset); } #endif template CLEDController &addLeds(const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { switch(CHIPSET) { #ifdef FASTSPI_USE_DMX_SIMPLE case DMX: { static DMXController controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } #endif case TM1829: { static TM1829Controller800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case TM1804: case TM1809: { static TM1809Controller800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case TM1803: { static TM1803Controller400Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case UCS1903: { static UCS1903Controller400Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case UCS1903B: { static UCS1903BController800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case WS2812: case WS2812B: case WS2811: { static WS2811Controller800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case NEOPIXEL: { static WS2811Controller800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case WS2811_400: { static WS2811Controller400Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case GW6205: { static GW6205Controller800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case GW6205_400: { static GW6205Controller400Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } } } template CLEDController &addLeds(const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { switch(CHIPSET) { #ifdef FASTSPI_USE_DMX_SIMPLE case DMX: {static DMXController controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } #endif case TM1829: { static TM1829Controller800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case TM1804: case TM1809: { static TM1809Controller800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case TM1803: { static TM1803Controller400Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case UCS1903: { static UCS1903Controller400Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case UCS1903B: { static UCS1903BController800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case WS2812: case WS2812B: case NEOPIXEL: case WS2811: { static WS2811Controller800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case WS2811_400: { static WS2811Controller400Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case GW6205: { static GW6205Controller800Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } case GW6205_400: { static GW6205Controller400Khz controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } } } #ifdef HAS_BLOCKLESS template CLEDController &addLeds(const struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { switch(CHIPSET) { case WS2811_PORTC: return addLeds(new BlockClocklessController(), data, nLedsOrOffset, nLedsIfOffset); } } #endif void setBrightness(CRGB scale) { m_Scale = scale; } void setBrightness(uint8_t scale) { m_Scale = CRGB(scale,scale,scale); } uint8_t getBrightness() { return m_Scale.raw[0]; } /// Update all our controllers with the current led colors, using the passed in brightness void show(CRGB scale); /// Update all our controllers with the current led colors void show() { show(m_Scale); } void clear(boolean writeData = false); void clearData(); void showColor(const struct CRGB & color, CRGB scale); void showColor(const struct CRGB & color) { showColor(color, m_Scale); } void delay(unsigned long ms); }; extern CFastLED & FastSPI_LED; extern CFastLED & FastSPI_LED2; extern CFastLED & FastLED; extern CFastLED LEDS; #endif