#ifndef __INC_FASTSPI_LED2_H #define __INC_FASTSPI_LED2_H // #define NO_CORRECTION 1 // #define NO_DITHERING 1 #define xstr(s) str(s) #define str(s) #s #define FASTLED_VERSION 3000002 #warning FastLED version 3.000.002 (Not really a warning, just telling you here.) #ifndef __PROG_TYPES_COMPAT__ #define __PROG_TYPES_COMPAT__ #endif #ifdef SmartMatrix_h #include #endif #ifdef DmxSimple_h #include #endif #ifdef DmxSerial_h #include #endif #include "controller.h" #include "fastpin.h" #include "fastspi.h" #include "clockless.h" #include "lib8tion.h" #include "hsv2rgb.h" #include "colorutils.h" #include "colorpalettes.h" #include "chipsets.h" #include "./dmx.h" #include "smartmatrix_t3.h" #include "noise.h" #include "power_mgt.h" enum ESPIChipsets { LPD8806, WS2801, WS2803, SM16716, P9813, APA102 }; enum ESM { SMART_MATRIX }; template class NEOPIXEL : public WS2811Controller800Khz {}; template class TM1829 : public TM1829Controller800Khz {}; template class TM1809 : public TM1809Controller800Khz {}; template class TM1804 : public TM1809Controller800Khz {}; template class TM1803 : public TM1803Controller400Khz {}; template class UCS1903 : public UCS1903Controller400Khz {}; template class UCS1903B : public UCS1903BController800Khz {}; template class WS2812 : public WS2811Controller800Khz {}; template class WS2812B : public WS2811Controller800Khz {}; template class WS2811 : public WS2811Controller800Khz {}; template class APA104 : public WS2811Controller800Khz {}; template class WS2811_400 : public WS2811Controller400Khz {}; template class GW6205 : public GW6205Controller800Khz {}; template class GW6205_400 : public GW6205Controller400Khz {}; template class LPD1886 : public LPD1886Controller1250Khz {}; #ifdef DmxSimple_h template class DMXSIMPLE : public DMXSimpleController {}; #endif #ifdef DmxSerial_h template class DMXSERIAL : public DMXSerialController {}; #endif // template class LPD8806 : public LPD8806Controller {}; // template class WS2801 : public WS2801Controller {}; // template class P9813 : public P9813Controller {}; // template class SM16716 : public SM16716Controller {}; enum EBlockChipsets { WS2811_PORTC }; #if defined(LIB8_ATTINY) #define NUM_CONTROLLERS 2 #else #define NUM_CONTROLLERS 8 #endif class CFastLED { // int m_nControllers; uint8_t m_Scale; uint16_t m_nFPS; public: CFastLED(); static CLEDController &addLeds(CLEDController *pLed, struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0); template static CLEDController &addLeds(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 WS2803: { static WS2803Controller 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); } case APA102: { static APA102Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } } } template static CLEDController &addLeds(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 WS2803: { static WS2803Controller 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); } case APA102: { static APA102Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } } } template CLEDController &addLeds(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 WS2803: { static WS2803Controller 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); } case APA102: { static APA102Controller c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } } } #ifdef SPI_DATA template static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { return addLeds(data, nLedsOrOffset, nLedsIfOffset); } template static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { return addLeds(data, nLedsOrOffset, nLedsIfOffset); } template static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { return addLeds(data, nLedsOrOffset, nLedsIfOffset); } #endif template class CHIPSET, uint8_t DATA_PIN> static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { static CHIPSET c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } template class CHIPSET, uint8_t DATA_PIN, EOrder RGB_ORDER> static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { static CHIPSET c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } template class CHIPSET, uint8_t DATA_PIN> static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { static CHIPSET c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } template class CHIPSET> static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { static CHIPSET c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } template class CHIPSET, EOrder RGB_ORDER> static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { static CHIPSET c; return addLeds(&c, data, nLedsOrOffset, nLedsIfOffset); } #ifdef SmartMatrix_h template static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { switch(CHIPSET) { case SMART_MATRIX: { static CSmartMatrixController controller; return addLeds(&controller, data, nLedsOrOffset, nLedsIfOffset); } } } #endif #ifdef HAS_BLOCKLESS template static CLEDController &addLeds(struct CRGB *data, int nLedsOrOffset, int nLedsIfOffset = 0) { switch(CHIPSET) { case WS2811_PORTC: return addLeds(new BlockClocklessController(), data, nLedsOrOffset, nLedsIfOffset); } } #endif void setBrightness(uint8_t scale) { m_Scale = scale; } uint8_t getBrightness() { return m_Scale; } /// Update all our controllers with the current led colors, using the passed in brightness void show(uint8_t 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, uint8_t scale); void showColor(const struct CRGB & color) { showColor(color, m_Scale); } void delay(unsigned long ms); void setTemperature(const struct CRGB & temp); void setCorrection(const struct CRGB & correction); void setDither(uint8_t ditherMode = BINARY_DITHER); // for debugging, will keep track of time between calls to countFPS, and every // nFrames calls, it will update an internal counter for the current FPS. void countFPS(int nFrames=25); // Get the number of frames/second being written out uint16_t getFPS() { return m_nFPS; } // returns the number of controllers (strips) that have been added with addLeds int count(); // returns the Nth controller CLEDController & operator[](int x); // Convenience functions for single-strip setups: // returns the number of LEDs in the first strip int size() { return (*this)[0].size(); } // returns pointer to the CRGB buffer for the first strip CRGB *leds() { return (*this)[0].leds(); } }; extern CFastLED & FastSPI_LED; extern CFastLED & FastSPI_LED2; extern CFastLED & FastLED; extern CFastLED LEDS; #endif