diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index 3c009592..91ac9980 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1084,10 +1084,7 @@ void WS2812FX::service() { if(nowUp > seg.next_time || _triggered || (doShow && seg.mode == FX_MODE_STATIC)) { if (seg.grouping == 0) seg.grouping = 1; // sanity check -// if (!doShow) { -// busses.setBrightness(_brightness); // bus luminance must be set before FX using setPixelColor() - doShow = true; -// } + doShow = true; uint16_t delay = FRAMETIME; if (!seg.freeze) { //only run effect function if not frozen diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index 24c2ea40..05197cd1 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -97,32 +97,33 @@ uint8_t *Bus::allocData(size_t size) { } -BusDigital::BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com) : Bus(bc.type, bc.start, bc.autoWhite), _colorOrderMap(com) { +BusDigital::BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com) +: Bus(bc.type, bc.start, bc.autoWhite, bc.count, bc.reversed, (bc.refreshReq || bc.type == TYPE_TM1814)) +, _skip(bc.skipAmount) //sacrificial pixels +, _colorOrder(bc.colorOrder) +, _colorOrderMap(com) +{ if (!IS_DIGITAL(bc.type) || !bc.count) return; if (!pinManager.allocatePin(bc.pins[0], true, PinOwner::BusDigital)) return; _frequencykHz = 0U; _pins[0] = bc.pins[0]; if (IS_2PIN(bc.type)) { if (!pinManager.allocatePin(bc.pins[1], true, PinOwner::BusDigital)) { - cleanup(); return; + cleanup(); + return; } _pins[1] = bc.pins[1]; _frequencykHz = bc.frequency ? bc.frequency : 2000U; // 2MHz clock if undefined } - reversed = bc.reversed; - _needsRefresh = bc.refreshReq || bc.type == TYPE_TM1814; - _skip = bc.skipAmount; //sacrificial pixels - _len = bc.count; - _colorOrder = bc.colorOrder; _iType = PolyBus::getI(bc.type, _pins, nr); if (_iType == I_NONE) return; - if (bc.doubleBuffer && !allocData(_len * (Bus::hasWhite(_type) + 3*Bus::hasRGB(_type)))) return; //warning: hardcoded channel count + if (bc.doubleBuffer && !allocData(bc.count * (Bus::hasWhite(_type) + 3*Bus::hasRGB(_type)))) return; //warning: hardcoded channel count buffering = bc.doubleBuffer; - uint16_t lenToCreate = _len; - if (bc.type == TYPE_WS2812_1CH_X3) lenToCreate = NUM_ICS_WS2812_1CH_3X(_len); // only needs a third of "RGB" LEDs for NeoPixelBus + uint16_t lenToCreate = bc.count; + if (bc.type == TYPE_WS2812_1CH_X3) lenToCreate = NUM_ICS_WS2812_1CH_3X(bc.count); // only needs a third of "RGB" LEDs for NeoPixelBus _busPtr = PolyBus::create(_iType, _pins, lenToCreate + _skip, nr, _frequencykHz); _valid = (_busPtr != nullptr); - DEBUG_PRINTF("%successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u)\n", _valid?"S":"Uns", nr, _len, bc.type, _pins[0],_pins[1],_iType); + DEBUG_PRINTF("%successfully inited strip %u (len %u) with type %u and pins %u,%u (itype %u)\n", _valid?"S":"Uns", nr, bc.count, bc.type, _pins[0], _pins[1], _iType); } void BusDigital::show() { @@ -149,8 +150,8 @@ void BusDigital::show() { c = RGBW32(_data[offset],_data[offset+1],_data[offset+2],(Bus::hasWhite(_type)?_data[offset+3]:0)); } uint16_t pix = i; - if (reversed) pix = _len - pix -1; - else pix += _skip; + if (_reversed) pix = _len - pix -1; + else pix += _skip; PolyBus::setPixelColor(_busPtr, _iType, pix, c, co); } } else { @@ -206,8 +207,8 @@ void IRAM_ATTR BusDigital::setPixelColor(uint16_t pix, uint32_t c) { } if (Bus::hasWhite(_type)) _data[offset] = W(c); } else { - if (reversed) pix = _len - pix -1; - else pix += _skip; + if (_reversed) pix = _len - pix -1; + else pix += _skip; uint8_t co = _colorOrderMap.getPixelColorOrder(pix+_start, _colorOrder); if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs uint16_t pOld = pix; @@ -236,8 +237,8 @@ uint32_t BusDigital::getPixelColor(uint16_t pix) { } return c; } else { - if (reversed) pix = _len - pix -1; - else pix += _skip; + if (_reversed) pix = _len - pix -1; + else pix += _skip; uint8_t co = _colorOrderMap.getPixelColorOrder(pix+_start, _colorOrder); if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs uint16_t pOld = pix; @@ -283,8 +284,9 @@ void BusDigital::cleanup() { } -BusPwm::BusPwm(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { - _valid = false; +BusPwm::BusPwm(BusConfig &bc) +: Bus(bc.type, bc.start, bc.autoWhite, 1, bc.reversed) +{ if (!IS_PWM(bc.type)) return; uint8_t numPins = NUM_PWM_PINS(bc.type); _frequency = bc.frequency ? bc.frequency : WLED_PWM_FREQ; @@ -312,7 +314,6 @@ BusPwm::BusPwm(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { ledcAttachPin(_pins[i], _ledcStart + i); #endif } - reversed = bc.reversed; _data = _pwmdata; // avoid malloc() and use stack _valid = true; } @@ -381,7 +382,7 @@ void BusPwm::show() { uint8_t numPins = NUM_PWM_PINS(_type); for (uint8_t i = 0; i < numPins; i++) { uint8_t scaled = (_data[i] * _bri) / 255; - if (reversed) scaled = 255 - scaled; + if (_reversed) scaled = 255 - scaled; #ifdef ESP8266 analogWrite(_pins[i], scaled); #else @@ -416,8 +417,10 @@ void BusPwm::deallocatePins() { } -BusOnOff::BusOnOff(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { - _valid = false; +BusOnOff::BusOnOff(BusConfig &bc) +: Bus(bc.type, bc.start, bc.autoWhite, 1, bc.reversed) +, _onoffdata(0) +{ if (bc.type != TYPE_ONOFF) return; uint8_t currentPin = bc.pins[0]; @@ -426,7 +429,6 @@ BusOnOff::BusOnOff(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { } _pin = currentPin; //store only after allocatePin() succeeds pinMode(_pin, OUTPUT); - reversed = bc.reversed; _data = &_onoffdata; // avoid malloc() and use stack _valid = true; } @@ -448,7 +450,7 @@ uint32_t BusOnOff::getPixelColor(uint16_t pix) { void BusOnOff::show() { if (!_valid) return; - digitalWrite(_pin, reversed ? !(bool)_data[0] : (bool)_data[0]); + digitalWrite(_pin, _reversed ? !(bool)_data[0] : (bool)_data[0]); } uint8_t BusOnOff::getPins(uint8_t* pinArray) { @@ -458,8 +460,10 @@ uint8_t BusOnOff::getPins(uint8_t* pinArray) { } -BusNetwork::BusNetwork(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { - _valid = false; +BusNetwork::BusNetwork(BusConfig &bc) +: Bus(bc.type, bc.start, bc.autoWhite, bc.count) +, _broadcastLock(false) +{ switch (bc.type) { case TYPE_NET_ARTNET_RGB: _rgbw = false; @@ -475,9 +479,7 @@ BusNetwork::BusNetwork(BusConfig &bc) : Bus(bc.type, bc.start, bc.autoWhite) { break; } _UDPchannels = _rgbw ? 4 : 3; - _len = bc.count; _client = IPAddress(bc.pins[0],bc.pins[1],bc.pins[2],bc.pins[3]); - _broadcastLock = false; _valid = (allocData(_len * _UDPchannels) != nullptr); } diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index 7f138cc0..8ca1bcc2 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -35,15 +35,24 @@ struct BusConfig { uint8_t pins[5] = {LEDPIN, 255, 255, 255, 255}; uint16_t frequency; bool doubleBuffer; - BusConfig(uint8_t busType, uint8_t* ppins, uint16_t pstart, uint16_t len = 1, uint8_t pcolorOrder = COL_ORDER_GRB, bool rev = false, uint8_t skip = 0, byte aw=RGBW_MODE_MANUAL_ONLY, uint16_t clock_kHz=0U, bool dblBfr=false) { + + BusConfig(uint8_t busType, uint8_t* ppins, uint16_t pstart, uint16_t len = 1, uint8_t pcolorOrder = COL_ORDER_GRB, bool rev = false, uint8_t skip = 0, byte aw=RGBW_MODE_MANUAL_ONLY, uint16_t clock_kHz=0U, bool dblBfr=false) + : count(len) + , start(pstart) + , colorOrder(pcolorOrder) + , reversed(rev) + , skipAmount(skip) + , autoWhite(aw) + , frequency(clock_kHz) + , doubleBuffer(dblBfr) + { refreshReq = (bool) GET_BIT(busType,7); type = busType & 0x7F; // bit 7 may be/is hacked to include refresh info (1=refresh in off state, 0=no refresh) - count = len; start = pstart; colorOrder = pcolorOrder; reversed = rev; skipAmount = skip; autoWhite = aw; frequency = clock_kHz; doubleBuffer = dblBfr; - uint8_t nPins = 1; + size_t nPins = 1; if (type >= TYPE_NET_DDP_RGB && type < 96) nPins = 4; //virtual network bus. 4 "pins" store IP address else if (type > 47) nPins = 2; else if (type > 40 && type < 46) nPins = NUM_PWM_PINS(type); - for (uint8_t i = 0; i < nPins; i++) pins[i] = ppins[i]; + for (size_t i = 0; i < nPins; i++) pins[i] = ppins[i]; } //validates start and length and extends total if needed @@ -70,9 +79,7 @@ struct ColorOrderMapEntry { struct ColorOrderMap { void add(uint16_t start, uint16_t len, uint8_t colorOrder); - uint8_t count() const { - return _count; - } + uint8_t count() const { return _count; } void reset() { _count = 0; @@ -97,38 +104,41 @@ struct ColorOrderMap { //parent class of BusDigital, BusPwm, and BusNetwork class Bus { public: - Bus(uint8_t type, uint16_t start, uint8_t aw) - : _bri(255) - , _len(1) - , _data(nullptr) // keep data access consistent across all types of buses + Bus(uint8_t type, uint16_t start, uint8_t aw, uint16_t len = 1, bool reversed = false, bool refresh = false) + : _type(type) + , _bri(255) + , _start(start) + , _len(len) + , _reversed(reversed) , _valid(false) - , _needsRefresh(false) + , _needsRefresh(refresh) + , _data(nullptr) // keep data access consistent across all types of buses { - _type = type; - _start = start; _autoWhiteMode = Bus::hasWhite(_type) ? aw : RGBW_MODE_MANUAL_ONLY; }; virtual ~Bus() {} //throw the bus under the bus virtual void show() = 0; - virtual bool canShow() { return true; } - virtual void setStatusPixel(uint32_t c) {} + virtual bool canShow() { return true; } + virtual void setStatusPixel(uint32_t c) {} virtual void setPixelColor(uint16_t pix, uint32_t c) = 0; virtual uint32_t getPixelColor(uint16_t pix) { return 0; } - virtual void setBrightness(uint8_t b) { _bri = b; }; + virtual void setBrightness(uint8_t b) { _bri = b; }; virtual void cleanup() = 0; - virtual uint8_t getPins(uint8_t* pinArray) { return 0; } - virtual uint16_t getLength() { return _len; } - virtual void setColorOrder() {} - virtual uint8_t getColorOrder() { return COL_ORDER_RGB; } - virtual uint8_t skippedLeds() { return 0; } - virtual uint16_t getFrequency() { return 0U; } - inline uint16_t getStart() { return _start; } - inline void setStart(uint16_t start) { _start = start; } - inline uint8_t getType() { return _type; } - inline bool isOk() { return _valid; } - inline bool isOffRefreshRequired() { return _needsRefresh; } + virtual uint8_t getPins(uint8_t* pinArray) { return 0; } + virtual uint16_t getLength() { return _len; } + virtual void setColorOrder() {} + virtual uint8_t getColorOrder() { return COL_ORDER_RGB; } + virtual uint8_t skippedLeds() { return 0; } + virtual uint16_t getFrequency() { return 0U; } + inline void setReversed(bool reversed) { _reversed = reversed; } + inline uint16_t getStart() { return _start; } + inline void setStart(uint16_t start) { _start = start; } + inline uint8_t getType() { return _type; } + inline bool isOk() { return _valid; } + inline bool isReversed() { return _reversed; } + inline bool isOffRefreshRequired() { return _needsRefresh; } bool containsPixel(uint16_t pix) { return pix >= _start && pix < _start+_len; } virtual bool hasRGB(void) { return Bus::hasRGB(_type); } @@ -165,17 +175,16 @@ class Bus { inline static void setGlobalAWMode(uint8_t m) { if (m < 5) _gAWM = m; else _gAWM = AW_GLOBAL_DISABLED; } inline static uint8_t getGlobalAWMode() { return _gAWM; } - bool reversed = false; - protected: uint8_t _type; uint8_t _bri; uint16_t _start; uint16_t _len; - uint8_t *_data; + bool _reversed; bool _valid; bool _needsRefresh; uint8_t _autoWhiteMode; + uint8_t *_data; static uint8_t _gAWM; static int16_t _cct; static uint8_t _cctBlend; @@ -189,54 +198,31 @@ class Bus { class BusDigital : public Bus { public: BusDigital(BusConfig &bc, uint8_t nr, const ColorOrderMap &com); + ~BusDigital() { cleanup(); } - inline void show(); - + void show(); bool canShow(); - void setBrightness(uint8_t b); - void setStatusPixel(uint32_t c); - void setPixelColor(uint16_t pix, uint32_t c); - - uint32_t getPixelColor(uint16_t pix); - - uint8_t getColorOrder() { - return _colorOrder; - } - - uint16_t getLength() { - return _len - _skip; - } - - uint8_t getPins(uint8_t* pinArray); - void setColorOrder(uint8_t colorOrder); - - uint8_t skippedLeds() { - return _skip; - } - - uint16_t getFrequency() { return _frequencykHz; } - + uint32_t getPixelColor(uint16_t pix); + uint8_t getColorOrder() { return _colorOrder; } + uint8_t getPins(uint8_t* pinArray); + uint8_t skippedLeds() { return _skip; } + uint16_t getFrequency() { return _frequencykHz; } void reinit(); - void cleanup(); - ~BusDigital() { - cleanup(); - } - private: - uint8_t _colorOrder = COL_ORDER_GRB; - uint8_t _pins[2] = {255, 255}; - uint8_t _iType = 0; //I_NONE; - uint8_t _skip = 0; - uint16_t _frequencykHz = 0U; - void * _busPtr = nullptr; + uint8_t _skip; + uint8_t _colorOrder; + uint8_t _pins[2]; + uint8_t _iType; + uint16_t _frequencykHz; + void * _busPtr; const ColorOrderMap &_colorOrderMap; - bool buffering = false; // temporary until we figure out why comparison "_data != nullptr" causes severe FPS drop + bool buffering; // temporary until we figure out why comparison "_data != nullptr" causes severe FPS drop inline uint32_t restoreColorLossy(uint32_t c, uint_fast8_t _restaurationBri) { if (_bri == 255) return c; @@ -255,33 +241,22 @@ class BusDigital : public Bus { class BusPwm : public Bus { public: BusPwm(BusConfig &bc); + ~BusPwm() { cleanup(); } void setPixelColor(uint16_t pix, uint32_t c); - - //does no index check - uint32_t getPixelColor(uint16_t pix); - - void show(); - - uint8_t getPins(uint8_t* pinArray); - + uint32_t getPixelColor(uint16_t pix); //does no index check + uint8_t getPins(uint8_t* pinArray); uint16_t getFrequency() { return _frequency; } - - void cleanup() { - deallocatePins(); - } - - ~BusPwm() { - cleanup(); - } + void show(); + void cleanup() { deallocatePins(); } private: - uint8_t _pins[5] = {255, 255, 255, 255, 255}; - uint8_t _pwmdata[5] = {0}; + uint8_t _pins[5]; + uint8_t _pwmdata[5]; #ifdef ARDUINO_ARCH_ESP32 - uint8_t _ledcStart = 255; + uint8_t _ledcStart; #endif - uint16_t _frequency = 0U; + uint16_t _frequency; void deallocatePins(); }; @@ -290,59 +265,34 @@ class BusPwm : public Bus { class BusOnOff : public Bus { public: BusOnOff(BusConfig &bc); + ~BusOnOff() { cleanup(); } void setPixelColor(uint16_t pix, uint32_t c); - uint32_t getPixelColor(uint16_t pix); - + uint8_t getPins(uint8_t* pinArray); void show(); - - uint8_t getPins(uint8_t* pinArray); - - void cleanup() { - pinManager.deallocatePin(_pin, PinOwner::BusOnOff); - } - - ~BusOnOff() { - cleanup(); - } + void cleanup() { pinManager.deallocatePin(_pin, PinOwner::BusOnOff); } private: - uint8_t _pin = 255; - uint8_t _onoffdata = 0; + uint8_t _pin; + uint8_t _onoffdata; }; class BusNetwork : public Bus { public: BusNetwork(BusConfig &bc); + ~BusNetwork() { cleanup(); } - bool hasRGB() { return true; } + bool hasRGB() { return true; } bool hasWhite() { return _rgbw; } - + bool canShow() { return !_broadcastLock; } // this should be a return value from UDP routine if it is still sending data out void setPixelColor(uint16_t pix, uint32_t c); - uint32_t getPixelColor(uint16_t pix); - + uint8_t getPins(uint8_t* pinArray); void show(); - - bool canShow() { - // this should be a return value from UDP routine if it is still sending data out - return !_broadcastLock; - } - - uint8_t getPins(uint8_t* pinArray); - - uint16_t getLength() { - return _len; - } - void cleanup(); - ~BusNetwork() { - cleanup(); - } - private: IPAddress _client; uint8_t _UDPtype; @@ -354,7 +304,7 @@ class BusNetwork : public Bus { class BusManager { public: - BusManager() {}; + BusManager() : numBusses(0) {}; //utility to get the approx. memory usage of a given BusConfig static uint32_t memUsage(BusConfig &bc); @@ -365,38 +315,24 @@ class BusManager { void removeAll(); void show(); - - void setStatusPixel(uint32_t c); - - void setPixelColor(uint16_t pix, uint32_t c); - - void setBrightness(uint8_t b); - - void setSegmentCCT(int16_t cct, bool allowWBCorrection = false); - - uint32_t getPixelColor(uint16_t pix); - bool canAllShow(); + void setStatusPixel(uint32_t c); + void setPixelColor(uint16_t pix, uint32_t c); + void setBrightness(uint8_t b); + void setSegmentCCT(int16_t cct, bool allowWBCorrection = false); + uint32_t getPixelColor(uint16_t pix); Bus* getBus(uint8_t busNr); //semi-duplicate of strip.getLengthTotal() (though that just returns strip._length, calculated in finalizeInit()) uint16_t getTotalLength(); + inline uint8_t getNumBusses() const { return numBusses; } - inline void updateColorOrderMap(const ColorOrderMap &com) { - memcpy(&colorOrderMap, &com, sizeof(ColorOrderMap)); - } - - inline const ColorOrderMap& getColorOrderMap() const { - return colorOrderMap; - } - - inline uint8_t getNumBusses() { - return numBusses; - } + inline void updateColorOrderMap(const ColorOrderMap &com) { memcpy(&colorOrderMap, &com, sizeof(ColorOrderMap)); } + inline const ColorOrderMap& getColorOrderMap() const { return colorOrderMap; } private: - uint8_t numBusses = 0; + uint8_t numBusses; Bus* busses[WLED_MAX_BUSSES+WLED_MIN_VIRTUAL_BUSSES]; ColorOrderMap colorOrderMap; diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 6730fe5f..2f2ebc02 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -178,7 +178,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { doInitBusses = busesChanged; // finalization done in beginStrip() } - if (hw_led["rev"]) busses.getBus(0)->reversed = true; //set 0.11 global reversed setting for first bus + if (hw_led["rev"]) busses.getBus(0)->setReversed(true); //set 0.11 global reversed setting for first bus // read color order map configuration JsonArray hw_com = hw[F("com")]; @@ -746,7 +746,7 @@ void serializeConfig() { uint8_t nPins = bus->getPins(pins); for (uint8_t i = 0; i < nPins; i++) ins_pin.add(pins[i]); ins[F("order")] = bus->getColorOrder(); - ins["rev"] = bus->reversed; + ins["rev"] = bus->isReversed(); ins[F("skip")] = bus->skippedLeds(); ins["type"] = bus->getType() & 0x7F; ins["ref"] = bus->isOffRefreshRequired(); diff --git a/wled00/json.cpp b/wled00/json.cpp index 06444cc3..a18fcbdb 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -1089,9 +1089,13 @@ bool serveLiveLeds(AsyncWebServerRequest* request, uint32_t wsClient) for (size_t i= 0; i < used; i += n) { uint32_t c = strip.getPixelColor(i); - uint8_t r = qadd8(W(c), R(c)); //add white channel to RGB channels as a simple RGBW -> RGB map - uint8_t g = qadd8(W(c), G(c)); - uint8_t b = qadd8(W(c), B(c)); + uint8_t r = useGlobalLedBuffer ? scale8(R(c), strip.getBrightness()) : R(c); + uint8_t g = useGlobalLedBuffer ? scale8(G(c), strip.getBrightness()) : G(c); + uint8_t b = useGlobalLedBuffer ? scale8(B(c), strip.getBrightness()) : B(c); + uint8_t w = useGlobalLedBuffer ? scale8(W(c), strip.getBrightness()) : W(c); + r = qadd8(w, r); //R, add white channel to RGB channels as a simple RGBW -> RGB map + g = qadd8(w, g); //G + b = qadd8(w, b); //B olen += sprintf(obuf + olen, "\"%06X\",", RGBW32(r,g,b,0)); } olen -= 1; diff --git a/wled00/led.cpp b/wled00/led.cpp index 4c5af70d..7901995f 100644 --- a/wled00/led.cpp +++ b/wled00/led.cpp @@ -194,7 +194,7 @@ void handleTransitions() applyFinalBri(); return; } - if (tper - tperLast < 0.004) return; + if (tper - tperLast < 0.004f) return; tperLast = tper; briT = briOld + ((bri - briOld) * tper); @@ -204,7 +204,7 @@ void handleTransitions() // legacy method, applies values from col, effectCurrent, ... to selected segments -void colorUpdated(byte callMode){ +void colorUpdated(byte callMode) { applyValuesToSelectedSegs(); stateUpdated(callMode); } diff --git a/wled00/wled.cpp b/wled00/wled.cpp index 83a79358..7da92937 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -35,6 +35,10 @@ void WLED::reset() void WLED::loop() { #ifdef WLED_DEBUG + static unsigned long lastRun = 0; + size_t loopDelay = (millis() - lastRun); + if (lastRun == 0) loopDelay=0; // startup - don't have valid data from last run. + if (loopDelay > 2) DEBUG_PRINTF("Loop delayed more than %dms.\n", loopDelay); static unsigned long maxUsermodMillis = 0; static size_t avgUsermodMillis = 0; static unsigned long maxStripMillis = 0; @@ -146,7 +150,7 @@ void WLED::loop() //LED settings have been saved, re-init busses //This code block causes severe FPS drop on ESP32 with the original "if (busConfigs[0] != nullptr)" conditional. Investigate! - if (busConfigs[0] != nullptr) { + if (doInitBusses) { doInitBusses = false; DEBUG_PRINTLN(F("Re-init busses.")); bool aligned = strip.checkSegmentAlignment(); //see if old segments match old bus(ses) @@ -217,6 +221,7 @@ void WLED::loop() debugTime = millis(); } loops++; + lastRun = millis(); #endif // WLED_DEBUG toki.resetTick(); diff --git a/wled00/wled.h b/wled00/wled.h index 28b11a06..1ef50ad9 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2307050 +#define VERSION 2307060 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG diff --git a/wled00/ws.cpp b/wled00/ws.cpp index 2a4d0b96..e295fe8e 100644 --- a/wled00/ws.cpp +++ b/wled00/ws.cpp @@ -178,11 +178,11 @@ bool sendLiveLedsWs(uint32_t wsClient) buffer[1] = 2; //version buffer[2] = Segment::maxWidth; buffer[3] = Segment::maxHeight; - if (Segment::maxWidth * Segment::maxHeight > MAX_LIVE_LEDS_WS*4) { + if (used > MAX_LIVE_LEDS_WS*4) { buffer[2] = Segment::maxWidth/4; buffer[3] = Segment::maxHeight/4; skipLines = 3; - } else if (Segment::maxWidth * Segment::maxHeight > MAX_LIVE_LEDS_WS) { + } else if (used > MAX_LIVE_LEDS_WS) { buffer[2] = Segment::maxWidth/2; buffer[3] = Segment::maxHeight/2; skipLines = 1; @@ -198,9 +198,13 @@ bool sendLiveLedsWs(uint32_t wsClient) } #endif uint32_t c = strip.getPixelColor(i); - buffer[pos++] = qadd8(W(c), R(c)); //R, add white channel to RGB channels as a simple RGBW -> RGB map - buffer[pos++] = qadd8(W(c), G(c)); //G - buffer[pos++] = qadd8(W(c), B(c)); //B + uint8_t r = useGlobalLedBuffer ? scale8(R(c), strip.getBrightness()) : R(c); + uint8_t g = useGlobalLedBuffer ? scale8(G(c), strip.getBrightness()) : G(c); + uint8_t b = useGlobalLedBuffer ? scale8(B(c), strip.getBrightness()) : B(c); + uint8_t w = useGlobalLedBuffer ? scale8(W(c), strip.getBrightness()) : W(c); + buffer[pos++] = qadd8(w, r); //R, add white channel to RGB channels as a simple RGBW -> RGB map + buffer[pos++] = qadd8(w, g); //G + buffer[pos++] = qadd8(w, b); //B } wsc->binary(wsBuf); diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 12fc9717..fff58143 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -431,7 +431,7 @@ void getSettingsJS(byte subPage, char* dest) sappend('v',lt,bus->getType()); sappend('v',co,bus->getColorOrder() & 0x0F); sappend('v',ls,bus->getStart()); - sappend('c',cv,bus->reversed); + sappend('c',cv,bus->isReversed()); sappend('v',sl,bus->skippedLeds()); sappend('c',rf,bus->isOffRefreshRequired()); sappend('v',aw,bus->getAutoWhiteMode());