diff --git a/wled00/FX_fcn.cpp b/wled00/FX_fcn.cpp index ce845ce3..74d61cb4 100644 --- a/wled00/FX_fcn.cpp +++ b/wled00/FX_fcn.cpp @@ -1231,7 +1231,7 @@ void WS2812FX::show(void) { #endif uint8_t newBri = estimateCurrentAndLimitBri(); - if (newBri < _brightness) busses.setBrightness(newBri, true); // "repaint" all pixels + busses.setBrightness(newBri); // "repaints" all pixels if brightness changed #ifdef WLED_DEBUG sumCurrent += micros() - microsStart; @@ -1245,7 +1245,7 @@ void WS2812FX::show(void) { // restore bus brightness to its original value // this is done right after show, so this is only OK if LED updates are completed before show() returns // or async show has a separate buffer (ESP32 RMT and I2S are ok) - if (newBri < _brightness) busses.setBrightness(_brightness, true); + if (newBri < _brightness) busses.setBrightness(_brightness); #ifdef WLED_DEBUG sumMicros += micros() - microsStart; @@ -1328,15 +1328,10 @@ void WS2812FX::setBrightness(uint8_t b, bool direct) { seg.freeze = false; } } - if (direct) { - // setting brightness with NeoPixelBusLg has no effect on already painted pixels, - // so we need to force an update to existing buffer - // that would be dangerous if applied immediately (could exceed ABL), but will not output until the next show() - busses.setBrightness(b, true); - } else { - // setting brightness with NeoPixelBusLg has no effect on already painted pixels, - // so we need to redraw whole canvas for the change of brightness to take effect - busses.setBrightness(b); + // setting brightness with NeoPixelBusLg has no effect on already painted pixels, + // so we need to force an update to existing buffer + busses.setBrightness(b); + if (!direct) { unsigned long t = millis(); if (_segments[0].next_time > t + 22 && t - _lastShow > MIN_SHOW_DELAY) trigger(); //apply brightness change immediately if no refresh soon } diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index 34efe7d8..7ea44b15 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -157,7 +157,7 @@ bool BusDigital::canShow() { return PolyBus::canShow(_busPtr, _iType); } -void BusDigital::setBrightness(uint8_t b, bool updateNPBBuffer) { +void BusDigital::setBrightness(uint8_t b) { if (_bri == b) return; //Fix for turning off onboard LED breaking bus #ifdef LED_BUILTIN @@ -168,14 +168,18 @@ void BusDigital::setBrightness(uint8_t b, bool updateNPBBuffer) { uint8_t prevBri = _bri; Bus::setBrightness(b); PolyBus::setBrightness(_busPtr, _iType, b); - if (!_buffering && updateNPBBuffer) { - uint16_t hwLen = _len; - if (_type == TYPE_WS2812_1CH_X3) hwLen = NUM_ICS_WS2812_1CH_3X(_len); // only needs a third of "RGB" LEDs for NeoPixelBus - for (uint_fast16_t i = 0; i < hwLen; i++) { - // use 0 as color order, actual order does not matter here as we just update the channel values as-is - uint32_t c = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, i, 0),prevBri); - PolyBus::setPixelColor(_busPtr, _iType, i, c, 0); - } + + if (_buffering) return; + + // must update/repaint every LED in the NeoPixelBus buffer to the new brightness + // the only case where repainting is unnecessary is when all pixels are set after the brightness change but before the next show + // (which we can't rely on) + uint16_t hwLen = _len; + if (_type == TYPE_WS2812_1CH_X3) hwLen = NUM_ICS_WS2812_1CH_3X(_len); // only needs a third of "RGB" LEDs for NeoPixelBus + for (uint_fast16_t i = 0; i < hwLen; i++) { + // use 0 as color order, actual order does not matter here as we just update the channel values as-is + uint32_t c = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, i, 0),prevBri); + PolyBus::setPixelColor(_busPtr, _iType, i, c, 0); } } @@ -583,9 +587,9 @@ void IRAM_ATTR BusManager::setPixelColor(uint16_t pix, uint32_t c) { } } -void BusManager::setBrightness(uint8_t b, bool updateBuffer) { +void BusManager::setBrightness(uint8_t b) { for (uint8_t i = 0; i < numBusses; i++) { - busses[i]->setBrightness(b, updateBuffer); + busses[i]->setBrightness(b); } } diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index e46ac175..4249c880 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -124,7 +124,7 @@ class Bus { 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, bool updateBuffer = false) { _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; } @@ -202,7 +202,7 @@ class BusDigital : public Bus { void show(); bool canShow(); - void setBrightness(uint8_t b, bool updateBuffer = false); + void setBrightness(uint8_t b); void setStatusPixel(uint32_t c); void setPixelColor(uint16_t pix, uint32_t c); void setColorOrder(uint8_t colorOrder); @@ -317,7 +317,7 @@ class BusManager { bool canAllShow(); void setStatusPixel(uint32_t c); void setPixelColor(uint16_t pix, uint32_t c); - void setBrightness(uint8_t b, bool updateBuffer = false); + void setBrightness(uint8_t b); void setSegmentCCT(int16_t cct, bool allowWBCorrection = false); uint32_t getPixelColor(uint16_t pix);