Circular include problem
This commit is contained in:
parent
25b77db4cd
commit
ef904e01ec
42
wled00/FX.h
42
wled00/FX.h
@ -27,10 +27,40 @@
|
|||||||
#ifndef WS2812FX_h
|
#ifndef WS2812FX_h
|
||||||
#define 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
|
#ifdef ESP32_MULTISTRIP
|
||||||
#include "../usermods/esp32_multistrip/NpbWrapper.h"
|
#include "../usermods/esp32_multistrip/NpbWrapper.h"
|
||||||
#else
|
#else
|
||||||
#include "NpbWrapper.h"
|
#include "bus_manager.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "const.h"
|
#include "const.h"
|
||||||
@ -584,7 +614,7 @@ class WS2812FX {
|
|||||||
ablMilliampsMax = 850;
|
ablMilliampsMax = 850;
|
||||||
currentMilliamps = 0;
|
currentMilliamps = 0;
|
||||||
timebase = 0;
|
timebase = 0;
|
||||||
bus = new NeoPixelWrapper();
|
busses = new BusManager();
|
||||||
resetSegments();
|
resetSegments();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -794,7 +824,7 @@ class WS2812FX {
|
|||||||
mode_dynamic_smooth(void);
|
mode_dynamic_smooth(void);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
NeoPixelWrapper *bus;
|
BusManager *busses;
|
||||||
|
|
||||||
uint32_t crgb_to_col(CRGB fastled);
|
uint32_t crgb_to_col(CRGB fastled);
|
||||||
CRGB col_to_crgb(uint32_t);
|
CRGB col_to_crgb(uint32_t);
|
||||||
@ -855,12 +885,6 @@ class WS2812FX {
|
|||||||
uint32_t _colors_t[3];
|
uint32_t _colors_t[3];
|
||||||
uint8_t _bri_t;
|
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 = 0;
|
||||||
uint8_t _segment_index_palette_last = 99;
|
uint8_t _segment_index_palette_last = 99;
|
||||||
segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 24 bytes per element
|
segment _segments[MAX_NUM_SEGMENTS] = { // SRAM footprint: 24 bytes per element
|
||||||
|
@ -56,14 +56,13 @@ void WS2812FX::init(bool supportWhite, uint16_t countPixels, bool skipFirst)
|
|||||||
_length = countPixels;
|
_length = countPixels;
|
||||||
_skipFirstMode = skipFirst;
|
_skipFirstMode = skipFirst;
|
||||||
|
|
||||||
uint8_t ty = 1;
|
|
||||||
if (supportWhite) ty = 2;
|
|
||||||
_lengthRaw = _length;
|
_lengthRaw = _length;
|
||||||
if (_skipFirstMode) {
|
if (_skipFirstMode) {
|
||||||
_lengthRaw += LED_SKIP_AMOUNT;
|
_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].start = 0;
|
||||||
_segments[0].stop = _length;
|
_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;
|
uint16_t skip = _skipFirstMode ? LED_SKIP_AMOUNT : 0;
|
||||||
if (SEGLEN) {//from segment
|
if (SEGLEN) {//from segment
|
||||||
|
|
||||||
//color_blend(getpixel, col, _bri_t); (pseudocode for future blending of segments)
|
//color_blend(getpixel, col, _bri_t); (pseudocode for future blending of segments)
|
||||||
if (_bri_t < 255) {
|
if (_bri_t < 255) {
|
||||||
col.R = scale8(col.R, _bri_t);
|
r = scale8(r, _bri_t);
|
||||||
col.G = scale8(col.G, _bri_t);
|
g = scale8(g, _bri_t);
|
||||||
col.B = scale8(col.B, _bri_t);
|
b = scale8(b, _bri_t);
|
||||||
col.W = scale8(col.W, _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 */
|
/* Set all the pixels in the group, ensuring _skipFirstMode is honored */
|
||||||
bool reversed = reverseMode ^ IS_REVERSE;
|
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];
|
if (indexSet < customMappingSize) indexSet = customMappingTable[indexSet];
|
||||||
#endif
|
#endif
|
||||||
if (indexSetRev >= SEGMENT.start && indexSetRev < SEGMENT.stop) {
|
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 (IS_MIRROR) { //set the corresponding mirrored pixel
|
||||||
if (reverseMode) {
|
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 {
|
} 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
|
#ifdef WLED_CUSTOM_LED_MAPPING
|
||||||
if (i < customMappingSize) i = customMappingTable[i];
|
if (i < customMappingSize) i = customMappingTable[i];
|
||||||
#endif
|
#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) {
|
if (skip && i == 0) {
|
||||||
for (uint16_t j = 0; j < skip; j++) {
|
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
|
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)
|
if(useWackyWS2815PowerModel)
|
||||||
{
|
{
|
||||||
@ -292,24 +290,24 @@ void WS2812FX::show(void) {
|
|||||||
uint16_t scaleI = scale * 255;
|
uint16_t scaleI = scale * 255;
|
||||||
uint8_t scaleB = (scaleI > 255) ? 255 : scaleI;
|
uint8_t scaleB = (scaleI > 255) ? 255 : scaleI;
|
||||||
uint8_t newBri = scale8(_brightness, scaleB);
|
uint8_t newBri = scale8(_brightness, scaleB);
|
||||||
bus->SetBrightness(newBri);
|
busses->setBrightness(newBri);
|
||||||
currentMilliamps = (powerSum0 * newBri) / puPerMilliamp;
|
currentMilliamps = (powerSum0 * newBri) / puPerMilliamp;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
currentMilliamps = powerSum / puPerMilliamp;
|
currentMilliamps = powerSum / puPerMilliamp;
|
||||||
bus->SetBrightness(_brightness);
|
busses->setBrightness(_brightness);
|
||||||
}
|
}
|
||||||
currentMilliamps += MA_FOR_ESP; //add power of ESP back to estimate
|
currentMilliamps += MA_FOR_ESP; //add power of ESP back to estimate
|
||||||
currentMilliamps += _length; //add standby power back to estimate
|
currentMilliamps += _length; //add standby power back to estimate
|
||||||
} else {
|
} else {
|
||||||
currentMilliamps = 0;
|
currentMilliamps = 0;
|
||||||
bus->SetBrightness(_brightness);
|
busses->setBrightness(_brightness);
|
||||||
}
|
}
|
||||||
|
|
||||||
// some buses send asynchronously and this method will return before
|
// some buses send asynchronously and this method will return before
|
||||||
// all of the data has been sent.
|
// all of the data has been sent.
|
||||||
// See https://github.com/Makuna/NeoPixelBus/wiki/ESP32-NeoMethods#neoesp32rmt-methods
|
// See https://github.com/Makuna/NeoPixelBus/wiki/ESP32-NeoMethods#neoesp32rmt-methods
|
||||||
bus->Show();
|
busses->show();
|
||||||
_lastShow = millis();
|
_lastShow = millis();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,7 +316,7 @@ void WS2812FX::show(void) {
|
|||||||
* On some hardware (ESP32), strip updates are done asynchronously.
|
* On some hardware (ESP32), strip updates are done asynchronously.
|
||||||
*/
|
*/
|
||||||
bool WS2812FX::isUpdating() {
|
bool WS2812FX::isUpdating() {
|
||||||
return !bus->CanShow();
|
return !busses->canAllShow();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -428,7 +426,8 @@ void WS2812FX::setBrightness(uint8_t b) {
|
|||||||
if (shouldStartBus) {
|
if (shouldStartBus) {
|
||||||
shouldStartBus = false;
|
shouldStartBus = false;
|
||||||
const uint8_t ty = _useRgbw ? 2 : 1;
|
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
|
#endif
|
||||||
}
|
}
|
||||||
@ -490,7 +489,7 @@ uint32_t WS2812FX::getPixelColor(uint16_t i)
|
|||||||
|
|
||||||
if (i >= _lengthRaw) return 0;
|
if (i >= _lengthRaw) return 0;
|
||||||
|
|
||||||
return bus->GetPixelColorRgbw(i);
|
return busses->getPixelColor(i);
|
||||||
}
|
}
|
||||||
|
|
||||||
WS2812FX::Segment& WS2812FX::getSegment(uint8_t id) {
|
WS2812FX::Segment& WS2812FX::getSegment(uint8_t id) {
|
||||||
@ -510,12 +509,13 @@ uint32_t WS2812FX::getLastShow(void) {
|
|||||||
return _lastShow;
|
return _lastShow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//TODO these need to be on a per-strip basis
|
||||||
uint8_t WS2812FX::getColorOrder(void) {
|
uint8_t WS2812FX::getColorOrder(void) {
|
||||||
return bus->GetColorOrder();
|
return COL_ORDER_GRB;
|
||||||
}
|
}
|
||||||
|
|
||||||
void WS2812FX::setColorOrder(uint8_t co) {
|
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) {
|
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;
|
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
|
//gamma 2.8 lookup table used for color correction
|
||||||
byte gammaT[] = {
|
byte gammaT[] = {
|
||||||
|
@ -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 <NeoPixelBrightnessBus.h>
|
|
||||||
#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<PIXELFEATURE3,PIXELMETHOD>(countPixels, CLKPIN, DATAPIN);
|
|
||||||
#else
|
|
||||||
_pGrb = new NeoPixelBrightnessBus<PIXELFEATURE3,PIXELMETHOD>(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<PIXELFEATURE4,PIXELMETHOD>(countPixels, CLKPIN, DATAPIN);
|
|
||||||
#else
|
|
||||||
_pGrbw = new NeoPixelBrightnessBus<PIXELFEATURE4,PIXELMETHOD>(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<PIXELFEATURE3,PIXELMETHOD>* _pGrb;
|
|
||||||
NeoPixelBrightnessBus<PIXELFEATURE4,PIXELMETHOD>* _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
|
|
@ -5,58 +5,10 @@
|
|||||||
* Class for addressing various light types
|
* Class for addressing various light types
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "const.h"
|
||||||
#include "wled.h"
|
#include "wled.h"
|
||||||
#include "bus_wrapper.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
|
//parent class of BusDigital and BusPwm
|
||||||
class Bus {
|
class Bus {
|
||||||
public:
|
public:
|
||||||
@ -65,6 +17,7 @@ class Bus {
|
|||||||
};
|
};
|
||||||
|
|
||||||
virtual void show() {}
|
virtual void show() {}
|
||||||
|
virtual bool canShow() { return true; }
|
||||||
|
|
||||||
virtual void setPixelColor(uint16_t pix, uint32_t c) {};
|
virtual void setPixelColor(uint16_t pix, uint32_t c) {};
|
||||||
|
|
||||||
@ -88,6 +41,10 @@ class Bus {
|
|||||||
return COL_ORDER_RGB;
|
return COL_ORDER_RGB;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual uint16_t getLength() {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
virtual void setColorOrder() {}
|
virtual void setColorOrder() {}
|
||||||
|
|
||||||
uint8_t getType() {
|
uint8_t getType() {
|
||||||
@ -122,14 +79,27 @@ class BusDigital : public Bus {
|
|||||||
PolyBus::show(_busPtr, _iType);
|
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() {
|
uint8_t getColorOrder() {
|
||||||
return _colorOrder;
|
return _colorOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t getLength() {
|
||||||
|
return _len;
|
||||||
|
}
|
||||||
|
|
||||||
void setColorOrder(uint8_t colorOrder) {
|
void setColorOrder(uint8_t colorOrder) {
|
||||||
if (colorOrder > 5) return;
|
if (colorOrder > 5) return;
|
||||||
_colorOrder = colorOrder;
|
_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
|
#endif
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
#define BusWrapper_h
|
#define BusWrapper_h
|
||||||
|
|
||||||
#include "wled.h"
|
#include "wled.h"
|
||||||
|
#include "NeoPixelBrightnessBus.h"
|
||||||
|
|
||||||
//Hardware SPI Pins
|
//Hardware SPI Pins
|
||||||
#define P_8266_HS_MOSI 13
|
#define P_8266_HS_MOSI 13
|
||||||
@ -192,7 +193,82 @@
|
|||||||
class PolyBus {
|
class PolyBus {
|
||||||
public:
|
public:
|
||||||
static void show(void* busPtr, uint8_t busType) {
|
static void show(void* busPtr, uint8_t busType) {
|
||||||
(static_cast<NeoPixelBrightnessBus<NeoGrbFeature, NeoEsp8266Uart1Ws2813Method>*>(busPtr))->Show();
|
(static_cast<B_8266_U1_NEO_3*>(busPtr))->Show();
|
||||||
|
|
||||||
|
switch (busType) {
|
||||||
|
case I_NONE: break;
|
||||||
|
#ifdef ESP8266
|
||||||
|
case I_8266_U0_NEO_3: (static_cast<B_8266_U0_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_U1_NEO_3: (static_cast<B_8266_U1_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_DM_NEO_3: (static_cast<B_8266_DM_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_BB_NEO_3: (static_cast<B_8266_BB_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_U0_NEO_4: (static_cast<B_8266_U0_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_U1_NEO_4: (static_cast<B_8266_U1_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_DM_NEO_4: (static_cast<B_8266_DM_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_BB_NEO_4: (static_cast<B_8266_BB_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_U0_400_3: (static_cast<B_8266_U0_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_U1_400_3: (static_cast<B_8266_U1_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_DM_400_3: (static_cast<B_8266_DM_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_BB_400_3: (static_cast<B_8266_BB_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_U0_TM1_4: (static_cast<B_8266_U0_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_U1_TM1_4: (static_cast<B_8266_U1_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_DM_TM1_4: (static_cast<B_8266_DM_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_8266_BB_TM1_4: (static_cast<B_8266_BB_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
#endif
|
||||||
|
#ifdef ARDUINO_ARCH_ESP32
|
||||||
|
case I_32_R0_NEO_3: (static_cast<B_32_R0_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R1_NEO_3: (static_cast<B_32_R1_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R2_NEO_3: (static_cast<B_32_R2_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R3_NEO_3: (static_cast<B_32_R3_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R4_NEO_3: (static_cast<B_32_R4_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R5_NEO_3: (static_cast<B_32_R5_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R6_NEO_3: (static_cast<B_32_R6_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R7_NEO_3: (static_cast<B_32_R7_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_I0_NEO_3: (static_cast<B_32_I0_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_I1_NEO_3: (static_cast<B_32_I1_NEO_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R0_NEO_4: (static_cast<B_32_R0_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R1_NEO_4: (static_cast<B_32_R1_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R2_NEO_4: (static_cast<B_32_R2_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R3_NEO_4: (static_cast<B_32_R3_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R4_NEO_4: (static_cast<B_32_R4_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R5_NEO_4: (static_cast<B_32_R5_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R6_NEO_4: (static_cast<B_32_R6_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R7_NEO_4: (static_cast<B_32_R7_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_I0_NEO_4: (static_cast<B_32_I0_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_I1_NEO_4: (static_cast<B_32_I1_NEO_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R0_400_3: (static_cast<B_32_R0_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R1_400_3: (static_cast<B_32_R1_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R2_400_3: (static_cast<B_32_R2_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R3_400_3: (static_cast<B_32_R3_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R4_400_3: (static_cast<B_32_R4_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R5_400_3: (static_cast<B_32_R5_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R6_400_3: (static_cast<B_32_R6_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R7_400_3: (static_cast<B_32_R7_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_I0_400_3: (static_cast<B_32_I0_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_I1_400_3: (static_cast<B_32_I1_400_3*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R0_TM1_4: (static_cast<B_32_R0_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R1_TM1_4: (static_cast<B_32_R1_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R2_TM1_4: (static_cast<B_32_R2_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R3_TM1_4: (static_cast<B_32_R3_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R4_TM1_4: (static_cast<B_32_R4_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R5_TM1_4: (static_cast<B_32_R5_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R6_TM1_4: (static_cast<B_32_R6_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_R7_TM1_4: (static_cast<B_32_R7_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_I0_TM1_4: (static_cast<B_32_I0_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
case I_32_I1_TM1_4: (static_cast<B_32_I1_TM1_4*>(busPtr))->Show(); break;
|
||||||
|
#endif
|
||||||
|
case I_HS_DOT_3: (static_cast<B_HS_DOT_3*>(busPtr))->Show(); break;
|
||||||
|
case I_SS_DOT_3: (static_cast<B_SS_DOT_3*>(busPtr))->Show(); break;
|
||||||
|
case I_HS_LPD_3: (static_cast<B_HS_LPD_3*>(busPtr))->Show(); break;
|
||||||
|
case I_SS_LPD_3: (static_cast<B_SS_LPD_3*>(busPtr))->Show(); break;
|
||||||
|
case I_HS_WS1_3: (static_cast<B_HS_WS1_3*>(busPtr))->Show(); break;
|
||||||
|
case I_SS_WS1_3: (static_cast<B_SS_WS1_3*>(busPtr))->Show(); break;
|
||||||
|
case I_HS_P98_3: (static_cast<B_HS_P98_3*>(busPtr))->Show(); break;
|
||||||
|
case I_SS_P98_3: (static_cast<B_SS_P98_3*>(busPtr))->Show(); break;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
static bool canShow(void* busPtr, uint8_t busType) {
|
||||||
|
return (static_cast<B_8266_U1_NEO_3*>(busPtr))->CanShow();
|
||||||
};
|
};
|
||||||
//gives back the internal type index (I_XX_XXX_X above) for the input
|
//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) {
|
static uint8_t getI(uint8_t busType, uint8_t* pins, uint8_t num = 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user