diff --git a/wled00/FX.h b/wled00/FX.h index 27329a0a..bfe0f6bc 100644 --- a/wled00/FX.h +++ b/wled00/FX.h @@ -27,10 +27,40 @@ #ifndef WS2812FX_h #define WS2812FX_h +//TEMPORARY DEFINES FOR TESTING - MAKE THESE RUNTIME CONFIGURABLE TOO! +#ifndef LEDPIN +#define LEDPIN 2 +#endif + +#ifndef BTNPIN +#define BTNPIN 0 //button pin. Needs to have pullup (gpio0 recommended) +#endif + +#ifndef TOUCHPIN +//#define TOUCHPIN T0 //touch pin. Behaves the same as button. ESP32 only. +#endif + +#ifndef IRPIN +#define IRPIN 4 //infrared pin (-1 to disable) MagicHome: 4, H801 Wifi: 0 +#endif + +#ifndef RLYPIN +#define RLYPIN 12 //pin for relay, will be set HIGH if LEDs are on (-1 to disable). Also usable for standby leds, triggers,... +#endif + +#ifndef AUXPIN +#define AUXPIN -1 //debug auxiliary output pin (-1 to disable) +#endif + +#ifndef RLYMDE +#define RLYMDE 1 //mode for relay, 0: LOW if LEDs are on 1: HIGH if LEDs are on +#endif +//END OF TEMP DEFINES + #ifdef ESP32_MULTISTRIP #include "../usermods/esp32_multistrip/NpbWrapper.h" #else - #include "NpbWrapper.h" + #include "bus_manager.h" #endif #include "const.h" @@ -584,7 +614,7 @@ class WS2812FX { ablMilliampsMax = 850; currentMilliamps = 0; timebase = 0; - bus = new NeoPixelWrapper(); + busses = new BusManager(); resetSegments(); } @@ -794,7 +824,7 @@ class WS2812FX { mode_dynamic_smooth(void); private: - NeoPixelWrapper *bus; + BusManager *busses; uint32_t crgb_to_col(CRGB fastled); CRGB col_to_crgb(uint32_t); @@ -855,12 +885,6 @@ class WS2812FX { uint32_t _colors_t[3]; uint8_t _bri_t; - #ifdef WLED_USE_ANALOG_LEDS - uint32_t _analogLastShow = 0; - RgbwColor _analogLastColor = 0; - uint8_t _analogLastBri = 0; - #endif - uint8_t _segment_index = 0; uint8_t _segment_index_palette_last = 99; segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 24 bytes per element diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 8c1681a3..0fbd05d4 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -56,14 +56,13 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst) _length = countPixels; _skipFirstMode = skipFirst; - uint8_t ty = 1; - if (supportWhite) ty = 2; _lengthRaw = _length; if (_skipFirstMode) { _lengthRaw += LED_SKIP_AMOUNT; } - bus->Begin((NeoPixelType)ty, _lengthRaw); + uint8_t pins[] = {2}; + busses->add(supportWhite? TYPE_SK6812_RGBW : TYPE_WS2812_RGB, pins, countPixels); _segments[0].start = 0; _segments[0].stop = _length; @@ -167,19 +166,17 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w) } } - RgbwColor col; - col.R = r; col.G = g; col.B = b; col.W = w; - uint16_t skip = _skipFirstMode ? LED_SKIP_AMOUNT : 0; if (SEGLEN) {//from segment //color_blend(getpixel, col, _bri_t); (pseudocode for future blending of segments) if (_bri_t < 255) { - col.R = scale8(col.R, _bri_t); - col.G = scale8(col.G, _bri_t); - col.B = scale8(col.B, _bri_t); - col.W = scale8(col.W, _bri_t); + r = scale8(r, _bri_t); + g = scale8(g, _bri_t); + b = scale8(b, _bri_t); + w = scale8(w, _bri_t); } + uint32_t col = ((w << 24) | (r << 16) | (g << 8) | (b)); /* Set all the pixels in the group, ensuring _skipFirstMode is honored */ bool reversed = reverseMode ^ IS_REVERSE; @@ -193,12 +190,12 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w) if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet]; #endif if (indexSetRev >= SEGMENT.start && indexSetRev < SEGMENT.stop) { - bus->SetPixelColor(indexSet + skip, col); + busses->setPixelColor(indexSet + skip, col); if (IS_MIRROR) { //set the corresponding mirrored pixel if (reverseMode) { - bus->SetPixelColor(REV(SEGMENT.start) - indexSet + skip + REV(SEGMENT.stop) + 1, col); + busses->setPixelColor(REV(SEGMENT.start) - indexSet + skip + REV(SEGMENT.stop) + 1, col); } else { - bus->SetPixelColor(SEGMENT.stop - indexSet + skip + SEGMENT.start - 1, col); + busses->setPixelColor(SEGMENT.stop - indexSet + skip + SEGMENT.start - 1, col); } } } @@ -208,11 +205,12 @@ void WS2812FX::setPixelColor(uint16_t i, byte r, byte g, byte b, byte w) #ifdef WLED_CUSTOM_LED_MAPPING if (i < customMappingSize) i = customMappingTable[i]; #endif - bus->SetPixelColor(i + skip, col); + uint32_t col = ((w << 24) | (r << 16) | (g << 8) | (b)); + busses->setPixelColor(i + skip, col); } if (skip && i == 0) { for (uint16_t j = 0; j < skip; j++) { - bus->SetPixelColor(j, RgbwColor(0, 0, 0, 0)); + busses->setPixelColor(j, BLACK); } } } @@ -263,7 +261,7 @@ void WS2812FX::show(void) { for (uint16_t i = 0; i < _length; i++) //sum up the usage of each LED { - RgbwColor c = bus->GetPixelColorRaw(i); + RgbwColor c = busses->getPixelColor(i); if(useWackyWS2815PowerModel) { @@ -292,24 +290,24 @@ void WS2812FX::show(void) { uint16_t scaleI = scale * 255; uint8_t scaleB = (scaleI > 255) ? 255 : scaleI; uint8_t newBri = scale8(_brightness, scaleB); - bus->SetBrightness(newBri); + busses->setBrightness(newBri); currentMilliamps = (powerSum0 * newBri) / puPerMilliamp; } else { currentMilliamps = powerSum / puPerMilliamp; - bus->SetBrightness(_brightness); + busses->setBrightness(_brightness); } currentMilliamps += MA_FOR_ESP; //add power of ESP back to estimate currentMilliamps += _length; //add standby power back to estimate } else { currentMilliamps = 0; - bus->SetBrightness(_brightness); + busses->setBrightness(_brightness); } // some buses send asynchronously and this method will return before // all of the data has been sent. // See https://github.com/Makuna/NeoPixelBus/wiki/ESP32-NeoMethods#neoesp32rmt-methods - bus->Show(); + busses->show(); _lastShow = millis(); } @@ -318,7 +316,7 @@ void WS2812FX::show(void) { * On some hardware (ESP32), strip updates are done asynchronously. */ bool WS2812FX::isUpdating() { - return !bus->CanShow(); + return !busses->canAllShow(); } /** @@ -428,7 +426,8 @@ void WS2812FX::setBrightness(uint8_t b) { if (shouldStartBus) { shouldStartBus = false; const uint8_t ty = _useRgbw ? 2 : 1; - bus->Begin((NeoPixelType)ty, _lengthRaw); + //TODO add re-init method for any bus type that uses GPIO2 on ESP8266 here + //bus->Begin((NeoPixelType)ty, _lengthRaw); } #endif } @@ -490,7 +489,7 @@ uint32_t WS2812FX::getPixelColor(uint16_t i) if (i >= _lengthRaw) return 0; - return bus->GetPixelColorRgbw(i); + return busses->getPixelColor(i); } WS2812FX::Segment& WS2812FX::getSegment(uint8_t id) { @@ -510,12 +509,13 @@ uint32_t WS2812FX::getLastShow(void) { return _lastShow; } +//TODO these need to be on a per-strip basis uint8_t WS2812FX::getColorOrder(void) { - return bus->GetColorOrder(); + return COL_ORDER_GRB; } void WS2812FX::setColorOrder(uint8_t co) { - bus->SetColorOrder(co); + //bus->SetColorOrder(co); } void WS2812FX::setSegment(uint8_t n, uint16_t i1, uint16_t i2, uint8_t grouping, uint8_t spacing) { @@ -967,44 +967,6 @@ bool WS2812FX::segmentsAreIdentical(Segment* a, Segment* b) return true; } -#ifdef WLED_USE_ANALOG_LEDS -void WS2812FX::setRgbwPwm(void) { - uint32_t nowUp = millis(); // Be aware, millis() rolls over every 49 days - if (nowUp - _analogLastShow < MIN_SHOW_DELAY) return; - - _analogLastShow = nowUp; - - RgbwColor c; - uint32_t col = bus->GetPixelColorRgbw(PWM_INDEX); - c.R = col >> 16; c.G = col >> 8; c.B = col; c.W = col >> 24; - - byte b = getBrightness(); - if (c == _analogLastColor && b == _analogLastBri) return; - - // check color values for Warm / Cold white mix (for RGBW) // EsplanexaDevice.cpp - #ifdef WLED_USE_5CH_LEDS - if (c.R == 255 && c.G == 255 && c.B == 255 && c.W == 255) { - bus->SetRgbwPwm(0, 0, 0, 0, c.W * b / 255); - } else if (c.R == 127 && c.G == 127 && c.B == 127 && c.W == 255) { - bus->SetRgbwPwm(0, 0, 0, c.W * b / 512, c.W * b / 255); - } else if (c.R == 0 && c.G == 0 && c.B == 0 && c.W == 255) { - bus->SetRgbwPwm(0, 0, 0, c.W * b / 255, 0); - } else if (c.R == 130 && c.G == 90 && c.B == 0 && c.W == 255) { - bus->SetRgbwPwm(0, 0, 0, c.W * b / 255, c.W * b / 512); - } else if (c.R == 255 && c.G == 153 && c.B == 0 && c.W == 255) { - bus->SetRgbwPwm(0, 0, 0, c.W * b / 255, 0); - } else { // not only white colors - bus->SetRgbwPwm(c.R * b / 255, c.G * b / 255, c.B * b / 255, c.W * b / 255); - } - #else - bus->SetRgbwPwm(c.R * b / 255, c.G * b / 255, c.B * b / 255, c.W * b / 255); - #endif - _analogLastColor = c; - _analogLastBri = b; -} -#else -void WS2812FX::setRgbwPwm() {} -#endif //gamma 2.8 lookup table used for color correction byte gammaT[] = { diff --git a/wled00/NpbWrapper.h b/wled00/NpbWrapper.h deleted file mode 100644 index 8c1860b2..00000000 --- a/wled00/NpbWrapper.h +++ /dev/null @@ -1,439 +0,0 @@ -//this code is a modified version of https://github.com/Makuna/NeoPixelBus/issues/103 -#ifndef NpbWrapper_h -#define NpbWrapper_h - -//PIN CONFIGURATION -#ifndef LEDPIN -#define LEDPIN 2 //strip pin. Any for ESP32, gpio2 or 3 is recommended for ESP8266 (gpio2/3 are labeled D4/RX on NodeMCU and Wemos) -#endif -//#define USE_APA102 // Uncomment for using APA102 LEDs. -//#define USE_WS2801 // Uncomment for using WS2801 LEDs (make sure you have NeoPixelBus v2.5.6 or newer) -//#define USE_LPD8806 // Uncomment for using LPD8806 -//#define USE_TM1814 // Uncomment for using TM1814 LEDs (make sure you have NeoPixelBus v2.5.7 or newer) -//#define USE_P9813 // Uncomment for using P9813 LEDs (make sure you have NeoPixelBus v2.5.8 or newer) -//#define WLED_USE_ANALOG_LEDS //Uncomment for using "dumb" PWM controlled LEDs (see pins below, default R: gpio5, G: 12, B: 15, W: 13) -//#define WLED_USE_H801 //H801 controller. Please uncomment #define WLED_USE_ANALOG_LEDS as well -//#define WLED_USE_5CH_LEDS //5 Channel H801 for cold and warm white -//#define WLED_USE_BWLT11 -//#define WLED_USE_SHOJO_PCB - -#ifndef BTNPIN -#define BTNPIN 0 //button pin. Needs to have pullup (gpio0 recommended) -#endif - -#ifndef TOUCHPIN -//#define TOUCHPIN T0 //touch pin. Behaves the same as button. ESP32 only. -#endif - -#ifndef IRPIN -#define IRPIN 4 //infrared pin (-1 to disable) MagicHome: 4, H801 Wifi: 0 -#endif - -#ifndef RLYPIN -#define RLYPIN 12 //pin for relay, will be set HIGH if LEDs are on (-1 to disable). Also usable for standby leds, triggers,... -#endif - -#ifndef AUXPIN -#define AUXPIN -1 //debug auxiliary output pin (-1 to disable) -#endif - -#ifndef RLYMDE -#define RLYMDE 1 //mode for relay, 0: LOW if LEDs are on 1: HIGH if LEDs are on -#endif - -//enable color order override for a specific range of the strip -//This can be useful if you want to chain multiple strings with incompatible color order -//#define COLOR_ORDER_OVERRIDE -#define COO_MIN 0 -#define COO_MAX 35 //not inclusive, this would set the override for LEDs 0-26 -#define COO_ORDER COL_ORDER_GRB - -//END CONFIGURATION - -#if defined(USE_APA102) || defined(USE_WS2801) || defined(USE_LPD8806) || defined(USE_P9813) - #ifndef CLKPIN - #define CLKPIN 0 - #endif - #ifndef DATAPIN - #define DATAPIN 2 - #endif - #if BTNPIN == CLKPIN || BTNPIN == DATAPIN - #undef BTNPIN // Deactivate button pin if it conflicts with one of the APA102 pins. - #endif -#endif - -#ifdef WLED_USE_ANALOG_LEDS - //PWM pins - PINs 15,13,12,14 (W2 = 04)are used with H801 Wifi LED Controller - #ifdef WLED_USE_H801 - #define RPIN 15 //R pin for analog LED strip - #define GPIN 13 //G pin for analog LED strip - #define BPIN 12 //B pin for analog LED strip - #define WPIN 14 //W pin for analog LED strip - #define W2PIN 04 //W2 pin for analog LED strip - #undef BTNPIN - #undef IRPIN - #define IRPIN 0 //infrared pin (-1 to disable) MagicHome: 4, H801 Wifi: 0 - #elif defined(WLED_USE_BWLT11) - //PWM pins - to use with BW-LT11 - #define RPIN 12 //R pin for analog LED strip - #define GPIN 4 //G pin for analog LED strip - #define BPIN 14 //B pin for analog LED strip - #define WPIN 5 //W pin for analog LED strip - #elif defined(WLED_USE_SHOJO_PCB) - //PWM pins - to use with Shojo PCB (https://www.bastelbunker.de/esp-rgbww-wifi-led-controller-vbs-edition/) - #define RPIN 14 //R pin for analog LED strip - #define GPIN 4 //G pin for analog LED strip - #define BPIN 5 //B pin for analog LED strip - #define WPIN 15 //W pin for analog LED strip - #define W2PIN 12 //W2 pin for analog LED strip - #elif defined(WLED_USE_PLJAKOBS_PCB) - // PWM pins - to use with esp_rgbww_controller from patrickjahns/pljakobs (https://github.com/pljakobs/esp_rgbww_controller) - #define RPIN 12 //R pin for analog LED strip - #define GPIN 13 //G pin for analog LED strip - #define BPIN 14 //B pin for analog LED strip - #define WPIN 4 //W pin for analog LED strip - #define W2PIN 5 //W2 pin for analog LED strip - #undef IRPIN - #else - //Enable override of Pins by using the platformio_override.ini file - //PWM pins - PINs 5,12,13,15 are used with Magic Home LED Controller - #ifndef RPIN - #define RPIN 5 //R pin for analog LED strip - #endif - #ifndef GPIN - #define GPIN 12 //G pin for analog LED strip - #endif - #ifndef BPIN - #define BPIN 15 //B pin for analog LED strip - #endif - #ifndef WPIN - #define WPIN 13 //W pin for analog LED strip - #endif - #endif - #undef RLYPIN - #define RLYPIN -1 //disable as pin 12 is used by analog LEDs -#endif - -//automatically uses the right driver method for each platform -#ifdef ARDUINO_ARCH_ESP32 - #ifdef USE_APA102 - #define PIXELMETHOD DotStarMethod - #elif defined(USE_WS2801) - #define PIXELMETHOD NeoWs2801Method - #elif defined(USE_LPD8806) - #define PIXELMETHOD Lpd8806Method - #elif defined(USE_TM1814) - #define PIXELMETHOD NeoTm1814Method - #elif defined(USE_P9813) - #define PIXELMETHOD P9813Method - #else - #define PIXELMETHOD NeoEsp32Rmt0Ws2812xMethod - #endif -#else //esp8266 - //autoselect the right method depending on strip pin - #ifdef USE_APA102 - #define PIXELMETHOD DotStarMethod - #elif defined(USE_WS2801) - #define PIXELMETHOD NeoWs2801Method - #elif defined(USE_LPD8806) - #define PIXELMETHOD Lpd8806Method - #elif defined(USE_TM1814) - #define PIXELMETHOD NeoTm1814Method - #elif defined(USE_P9813) - #define PIXELMETHOD P9813Method - #elif LEDPIN == 2 - #define PIXELMETHOD NeoEsp8266Uart1Ws2813Method //if you get an error here, try to change to NeoEsp8266UartWs2813Method or update Neopixelbus - #elif LEDPIN == 3 - #define PIXELMETHOD NeoEsp8266Dma800KbpsMethod - #else - #define PIXELMETHOD NeoEsp8266BitBang800KbpsMethod - #pragma message "Software BitBang will be used because of your selected LED pin. This may cause flicker. Use GPIO 2 or 3 for best results." - #endif -#endif - - -//you can now change the color order in the web settings -#ifdef USE_APA102 - #define PIXELFEATURE3 DotStarBgrFeature - #define PIXELFEATURE4 DotStarLbgrFeature -#elif defined(USE_LPD8806) - #define PIXELFEATURE3 Lpd8806GrbFeature - #define PIXELFEATURE4 Lpd8806GrbFeature -#elif defined(USE_WS2801) - #define PIXELFEATURE3 NeoRbgFeature - #define PIXELFEATURE4 NeoRbgFeature -#elif defined(USE_TM1814) - #define PIXELFEATURE3 NeoWrgbTm1814Feature - #define PIXELFEATURE4 NeoWrgbTm1814Feature -#elif defined(USE_P9813) - #define PIXELFEATURE3 P9813BgrFeature - #define PIXELFEATURE4 NeoGrbwFeature -#else - #define PIXELFEATURE3 NeoGrbFeature - #define PIXELFEATURE4 NeoGrbwFeature -#endif - - -#include -#include "const.h" - -enum NeoPixelType -{ - NeoPixelType_None = 0, - NeoPixelType_Grb = 1, - NeoPixelType_Grbw = 2, - NeoPixelType_End = 3 -}; - -class NeoPixelWrapper -{ -public: - NeoPixelWrapper() : - // initialize each member to null - _pGrb(NULL), - _pGrbw(NULL), - _type(NeoPixelType_None) - { - - } - - ~NeoPixelWrapper() - { - cleanup(); - } - - void Begin(NeoPixelType type, uint16_t countPixels) - { - cleanup(); - _type = type; - - switch (_type) - { - case NeoPixelType_Grb: - #if defined(USE_APA102) || defined(USE_WS2801) || defined(USE_LPD8806) || defined(USE_P9813) - _pGrb = new NeoPixelBrightnessBus(countPixels, CLKPIN, DATAPIN); - #else - _pGrb = new NeoPixelBrightnessBus(countPixels, LEDPIN); - #endif - _pGrb->Begin(); - break; - - case NeoPixelType_Grbw: - #if defined(USE_APA102) || defined(USE_WS2801) || defined(USE_LPD8806) || defined(USE_P9813) - _pGrbw = new NeoPixelBrightnessBus(countPixels, CLKPIN, DATAPIN); - #else - _pGrbw = new NeoPixelBrightnessBus(countPixels, LEDPIN); - #endif - _pGrbw->Begin(); - break; - } - - #ifdef WLED_USE_ANALOG_LEDS - #ifdef ARDUINO_ARCH_ESP32 - ledcSetup(0, 5000, 8); - ledcAttachPin(RPIN, 0); - ledcSetup(1, 5000, 8); - ledcAttachPin(GPIN, 1); - ledcSetup(2, 5000, 8); - ledcAttachPin(BPIN, 2); - if(_type == NeoPixelType_Grbw) - { - ledcSetup(3, 5000, 8); - ledcAttachPin(WPIN, 3); - #ifdef WLED_USE_5CH_LEDS - ledcSetup(4, 5000, 8); - ledcAttachPin(W2PIN, 4); - #endif - } - #else // ESP8266 - //init PWM pins - pinMode(RPIN, OUTPUT); - pinMode(GPIN, OUTPUT); - pinMode(BPIN, OUTPUT); - if(_type == NeoPixelType_Grbw) - { - pinMode(WPIN, OUTPUT); - #ifdef WLED_USE_5CH_LEDS - pinMode(W2PIN, OUTPUT); - #endif - } - analogWriteRange(255); //same range as one RGB channel - analogWriteFreq(880); //PWM frequency proven as good for LEDs - #endif - #endif - } - -#ifdef WLED_USE_ANALOG_LEDS - void SetRgbwPwm(uint8_t r, uint8_t g, uint8_t b, uint8_t w, uint8_t w2=0) - { - #ifdef ARDUINO_ARCH_ESP32 - ledcWrite(0, r); - ledcWrite(1, g); - ledcWrite(2, b); - switch (_type) { - case NeoPixelType_Grb: break; - #ifdef WLED_USE_5CH_LEDS - case NeoPixelType_Grbw: ledcWrite(3, w); ledcWrite(4, w2); break; - #else - case NeoPixelType_Grbw: ledcWrite(3, w); break; - #endif - } - #else // ESP8266 - analogWrite(RPIN, r); - analogWrite(GPIN, g); - analogWrite(BPIN, b); - switch (_type) { - case NeoPixelType_Grb: break; - #ifdef WLED_USE_5CH_LEDS - case NeoPixelType_Grbw: analogWrite(WPIN, w); analogWrite(W2PIN, w2); break; - #else - case NeoPixelType_Grbw: analogWrite(WPIN, w); break; - #endif - } - #endif - } -#endif - - void Show() - { - switch (_type) - { - case NeoPixelType_Grb: _pGrb->Show(); break; - case NeoPixelType_Grbw: _pGrbw->Show(); break; - } - } - - /** - * This will return true if enough time has passed since the last time Show() was called. - * This also means that calling Show() will not cause any undue waiting. If the method for - * the defined bus is hardware that sends asynchronously, then call CanShow() will let - * you know if it has finished sending the data from the last Show(). - */ - bool CanShow() - { - switch (_type) - { - case NeoPixelType_Grb: return _pGrb->CanShow(); - case NeoPixelType_Grbw: return _pGrbw->CanShow(); - default: return true; - } - } - - void SetPixelColor(uint16_t indexPixel, RgbwColor c) - { - RgbwColor col; - - uint8_t co = _colorOrder; - #ifdef COLOR_ORDER_OVERRIDE - if (indexPixel >= COO_MIN && indexPixel < COO_MAX) co = COO_ORDER; - #endif - - //reorder channels to selected order - switch (co) - { - case 0: col.G = c.G; col.R = c.R; col.B = c.B; break; //0 = GRB, default - case 1: col.G = c.R; col.R = c.G; col.B = c.B; break; //1 = RGB, common for WS2811 - case 2: col.G = c.B; col.R = c.R; col.B = c.G; break; //2 = BRG - case 3: col.G = c.R; col.R = c.B; col.B = c.G; break; //3 = RBG - case 4: col.G = c.B; col.R = c.G; col.B = c.R; break; //4 = BGR - default: col.G = c.G; col.R = c.B; col.B = c.R; break; //5 = GBR - } - col.W = c.W; - - switch (_type) { - case NeoPixelType_Grb: { - _pGrb->SetPixelColor(indexPixel, RgbColor(col.R,col.G,col.B)); - } - break; - case NeoPixelType_Grbw: { - #if defined(USE_LPD8806) || defined(USE_WS2801) - _pGrbw->SetPixelColor(indexPixel, RgbColor(col.R,col.G,col.B)); - #else - _pGrbw->SetPixelColor(indexPixel, col); - #endif - } - break; - } - } - - void SetBrightness(byte b) - { - switch (_type) { - case NeoPixelType_Grb: _pGrb->SetBrightness(b); break; - case NeoPixelType_Grbw:_pGrbw->SetBrightness(b); break; - } - } - - void SetColorOrder(byte colorOrder) { - _colorOrder = colorOrder; - } - - uint8_t GetColorOrder() { - return _colorOrder; - } - - RgbwColor GetPixelColorRaw(uint16_t indexPixel) const - { - switch (_type) { - case NeoPixelType_Grb: return _pGrb->GetPixelColor(indexPixel); break; - case NeoPixelType_Grbw: return _pGrbw->GetPixelColor(indexPixel); break; - } - return 0; - } - - // NOTE: Due to feature differences, some support RGBW but the method name - // here needs to be unique, thus GetPixeColorRgbw - uint32_t GetPixelColorRgbw(uint16_t indexPixel) const - { - RgbwColor col(0,0,0,0); - switch (_type) { - case NeoPixelType_Grb: col = _pGrb->GetPixelColor(indexPixel); break; - case NeoPixelType_Grbw: col = _pGrbw->GetPixelColor(indexPixel); break; - } - - uint8_t co = _colorOrder; - #ifdef COLOR_ORDER_OVERRIDE - if (indexPixel >= COO_MIN && indexPixel < COO_MAX) co = COO_ORDER; - #endif - - switch (co) - { - // W G R B - case 0: return ((col.W << 24) | (col.G << 8) | (col.R << 16) | (col.B)); //0 = GRB, default - case 1: return ((col.W << 24) | (col.R << 8) | (col.G << 16) | (col.B)); //1 = RGB, common for WS2811 - case 2: return ((col.W << 24) | (col.B << 8) | (col.R << 16) | (col.G)); //2 = BRG - case 3: return ((col.W << 24) | (col.B << 8) | (col.G << 16) | (col.R)); //3 = RBG - case 4: return ((col.W << 24) | (col.R << 8) | (col.B << 16) | (col.G)); //4 = BGR - case 5: return ((col.W << 24) | (col.G << 8) | (col.B << 16) | (col.R)); //5 = GBR - } - return 0; - } - - uint8_t* GetPixels(void) - { - switch (_type) { - case NeoPixelType_Grb: return _pGrb->Pixels(); break; - case NeoPixelType_Grbw: return _pGrbw->Pixels(); break; - } - return 0; - } - - -private: - NeoPixelType _type; - - // have a member for every possible type - NeoPixelBrightnessBus* _pGrb; - NeoPixelBrightnessBus* _pGrbw; - - byte _colorOrder = 0; - - void cleanup() - { - switch (_type) { - case NeoPixelType_Grb: delete _pGrb ; _pGrb = NULL; break; - case NeoPixelType_Grbw: delete _pGrbw; _pGrbw = NULL; break; - } - } -}; -#endif diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index 4cc16f0c..bae0dd1e 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -5,58 +5,10 @@ * Class for addressing various light types */ +#include "const.h" #include "wled.h" #include "bus_wrapper.h" -class BusManager { - public: - BusManager() { - - }; - - int add(uint8_t busType, uint8_t* pins, uint16_t len = 1) { - if (numBusses >= WLED_MAX_BUSSES) return -1; - if (IS_DIGITAL(busType)) { - busses[numBusses] = new BusDigital(busType, pins, len, numBusses); - } else { - busses[numBusses] = new BusPwm(busType, pins); - } - numBusses++; - return numBusses -1; - } - - void removeAll() { - for (uint8_t i = 0; i < numBusses; i++) delete busses[i]; - numBusses = 0; - } - //void remove(uint8_t id); - - void show() { - for (uint8_t i = 0; i < numBusses; i++) { - busses[i]->show(); - } - } - - void setPixelColor(uint16_t pix, uint32_t c) { - for (uint8_t i = 0; i < numBusses; i++) { - Bus* b = busses[i]; - uint16_t bstart = b->getStart(); - if (pix < bstart) continue; - busses[i]->setPixelColor(pix - bstart, c); - } - } - - void setBrightness(uint8_t b) { - for (uint8_t i = 0; i < numBusses; i++) { - busses[i]->setBrightness(b); - } - } - - private: - uint8_t numBusses = 0; - Bus* busses[WLED_MAX_BUSSES]; -}; - //parent class of BusDigital and BusPwm class Bus { public: @@ -65,6 +17,7 @@ class Bus { }; virtual void show() {} + virtual bool canShow() { return true; } virtual void setPixelColor(uint16_t pix, uint32_t c) {}; @@ -88,6 +41,10 @@ class Bus { return COL_ORDER_RGB; } + virtual uint16_t getLength() { + return 1; + } + virtual void setColorOrder() {} uint8_t getType() { @@ -122,14 +79,27 @@ class BusDigital : public Bus { PolyBus::show(_busPtr, _iType); } - void setPixelColor(uint16_t pix, uint32_t c) { + bool canShow() { + return PolyBus::canShow(_busPtr, _iType); + } + void setPixelColor(uint16_t pix, uint32_t c) { + //TODO color order + } + + uint32_t getPixelColor(uint16_t pix) { + //TODO + return 0; } uint8_t getColorOrder() { return _colorOrder; } + uint16_t getLength() { + return _len; + } + void setColorOrder(uint8_t colorOrder) { if (colorOrder > 5) return; _colorOrder = colorOrder; @@ -242,4 +212,69 @@ class BusPwm : public Bus { } }; +class BusManager { + public: + BusManager() { + + }; + + int add(uint8_t busType, uint8_t* pins, uint16_t len = 1) { + if (numBusses >= WLED_MAX_BUSSES) return -1; + if (IS_DIGITAL(busType)) { + busses[numBusses] = new BusDigital(busType, pins, len, numBusses); + } else { + busses[numBusses] = new BusPwm(busType, pins); + } + numBusses++; + return numBusses -1; + } + + void removeAll() { + for (uint8_t i = 0; i < numBusses; i++) delete busses[i]; + numBusses = 0; + } + //void remove(uint8_t id); + + void show() { + for (uint8_t i = 0; i < numBusses; i++) { + busses[i]->show(); + } + } + + void setPixelColor(uint16_t pix, uint32_t c) { + for (uint8_t i = 0; i < numBusses; i++) { + Bus* b = busses[i]; + uint16_t bstart = b->getStart(); + if (pix < bstart) continue; + busses[i]->setPixelColor(pix - bstart, c); + } + } + + void setBrightness(uint8_t b) { + for (uint8_t i = 0; i < numBusses; i++) { + busses[i]->setBrightness(b); + } + } + + uint32_t getPixelColor(uint16_t pix) { + for (uint8_t i = 0; i < numBusses; i++) { + Bus* b = busses[i]; + uint16_t bstart = b->getStart(); + if (pix < bstart || pix >= bstart + b->getLength()) continue; + return b->getPixelColor(pix - bstart); + } + return 0; + } + + bool canAllShow() { + for (uint8_t i = 0; i < numBusses; i++) { + if (busses[i]->canShow()) return false; + } + return true; + } + + private: + uint8_t numBusses = 0; + Bus* busses[WLED_MAX_BUSSES]; +}; #endif diff --git a/wled00/bus_wrapper.h b/wled00/bus_wrapper.h index 98b3c789..d8809690 100644 --- a/wled00/bus_wrapper.h +++ b/wled00/bus_wrapper.h @@ -2,6 +2,7 @@ #define BusWrapper_h #include "wled.h" +#include "NeoPixelBrightnessBus.h" //Hardware SPI Pins #define P_8266_HS_MOSI 13 @@ -192,7 +193,82 @@ class PolyBus { public: static void show(void* busPtr, uint8_t busType) { - (static_cast*>(busPtr))->Show(); + (static_cast(busPtr))->Show(); + + switch (busType) { + case I_NONE: break; + #ifdef ESP8266 + case I_8266_U0_NEO_3: (static_cast(busPtr))->Show(); break; + case I_8266_U1_NEO_3: (static_cast(busPtr))->Show(); break; + case I_8266_DM_NEO_3: (static_cast(busPtr))->Show(); break; + case I_8266_BB_NEO_3: (static_cast(busPtr))->Show(); break; + case I_8266_U0_NEO_4: (static_cast(busPtr))->Show(); break; + case I_8266_U1_NEO_4: (static_cast(busPtr))->Show(); break; + case I_8266_DM_NEO_4: (static_cast(busPtr))->Show(); break; + case I_8266_BB_NEO_4: (static_cast(busPtr))->Show(); break; + case I_8266_U0_400_3: (static_cast(busPtr))->Show(); break; + case I_8266_U1_400_3: (static_cast(busPtr))->Show(); break; + case I_8266_DM_400_3: (static_cast(busPtr))->Show(); break; + case I_8266_BB_400_3: (static_cast(busPtr))->Show(); break; + case I_8266_U0_TM1_4: (static_cast(busPtr))->Show(); break; + case I_8266_U1_TM1_4: (static_cast(busPtr))->Show(); break; + case I_8266_DM_TM1_4: (static_cast(busPtr))->Show(); break; + case I_8266_BB_TM1_4: (static_cast(busPtr))->Show(); break; + #endif + #ifdef ARDUINO_ARCH_ESP32 + case I_32_R0_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_R1_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_R2_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_R3_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_R4_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_R5_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_R6_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_R7_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_I0_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_I1_NEO_3: (static_cast(busPtr))->Show(); break; + case I_32_R0_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_R1_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_R2_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_R3_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_R4_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_R5_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_R6_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_R7_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_I0_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_I1_NEO_4: (static_cast(busPtr))->Show(); break; + case I_32_R0_400_3: (static_cast(busPtr))->Show(); break; + case I_32_R1_400_3: (static_cast(busPtr))->Show(); break; + case I_32_R2_400_3: (static_cast(busPtr))->Show(); break; + case I_32_R3_400_3: (static_cast(busPtr))->Show(); break; + case I_32_R4_400_3: (static_cast(busPtr))->Show(); break; + case I_32_R5_400_3: (static_cast(busPtr))->Show(); break; + case I_32_R6_400_3: (static_cast(busPtr))->Show(); break; + case I_32_R7_400_3: (static_cast(busPtr))->Show(); break; + case I_32_I0_400_3: (static_cast(busPtr))->Show(); break; + case I_32_I1_400_3: (static_cast(busPtr))->Show(); break; + case I_32_R0_TM1_4: (static_cast(busPtr))->Show(); break; + case I_32_R1_TM1_4: (static_cast(busPtr))->Show(); break; + case I_32_R2_TM1_4: (static_cast(busPtr))->Show(); break; + case I_32_R3_TM1_4: (static_cast(busPtr))->Show(); break; + case I_32_R4_TM1_4: (static_cast(busPtr))->Show(); break; + case I_32_R5_TM1_4: (static_cast(busPtr))->Show(); break; + case I_32_R6_TM1_4: (static_cast(busPtr))->Show(); break; + case I_32_R7_TM1_4: (static_cast(busPtr))->Show(); break; + case I_32_I0_TM1_4: (static_cast(busPtr))->Show(); break; + case I_32_I1_TM1_4: (static_cast(busPtr))->Show(); break; + #endif + case I_HS_DOT_3: (static_cast(busPtr))->Show(); break; + case I_SS_DOT_3: (static_cast(busPtr))->Show(); break; + case I_HS_LPD_3: (static_cast(busPtr))->Show(); break; + case I_SS_LPD_3: (static_cast(busPtr))->Show(); break; + case I_HS_WS1_3: (static_cast(busPtr))->Show(); break; + case I_SS_WS1_3: (static_cast(busPtr))->Show(); break; + case I_HS_P98_3: (static_cast(busPtr))->Show(); break; + case I_SS_P98_3: (static_cast(busPtr))->Show(); break; + } + }; + static bool canShow(void* busPtr, uint8_t busType) { + return (static_cast(busPtr))->CanShow(); }; //gives back the internal type index (I_XX_XXX_X above) for the input static uint8_t getI(uint8_t busType, uint8_t* pins, uint8_t num = 0) {