Fix (almost good) for unbuffered ABL calculations.
This commit is contained in:
parent
82e01f7b17
commit
abfb8bbc34
@ -1230,8 +1230,7 @@ void WS2812FX::show(void) {
|
|||||||
unsigned long microsStart = micros();
|
unsigned long microsStart = micros();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint8_t busBrightness = estimateCurrentAndLimitBri();
|
busses.setBrightness(estimateCurrentAndLimitBri());
|
||||||
busses.setBrightness(busBrightness);
|
|
||||||
#ifdef WLED_DEBUG
|
#ifdef WLED_DEBUG
|
||||||
sumCurrent += micros() - microsStart;
|
sumCurrent += micros() - microsStart;
|
||||||
#endif
|
#endif
|
||||||
|
@ -153,7 +153,10 @@ void BusDigital::show() {
|
|||||||
PolyBus::applyPostAdjustments(_busPtr, _iType);
|
PolyBus::applyPostAdjustments(_busPtr, _iType);
|
||||||
}
|
}
|
||||||
PolyBus::show(_busPtr, _iType);
|
PolyBus::show(_busPtr, _iType);
|
||||||
PolyBus::setBrightness(_busPtr, _iType, 255); // restore full brightness at bus level (setting unscaled pixel color)
|
// looks like the following causes periodic miscalculations in ABL when not using double buffering
|
||||||
|
// when we no longer restore full brightness at busl level we only get a single frame with incorrect brightness
|
||||||
|
// when turning WLED off otherwise ABL calculations are OK
|
||||||
|
//PolyBus::setBrightness(_busPtr, _iType, 255); // restore full brightness at bus level (setting unscaled pixel color)
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BusDigital::canShow() {
|
bool BusDigital::canShow() {
|
||||||
@ -228,7 +231,7 @@ uint32_t BusDigital::getPixelColor(uint16_t pix) {
|
|||||||
if (_reversed) pix = _len - pix -1;
|
if (_reversed) pix = _len - pix -1;
|
||||||
else pix += _skip;
|
else pix += _skip;
|
||||||
uint8_t co = _colorOrderMap.getPixelColorOrder(pix+_start, _colorOrder);
|
uint8_t co = _colorOrderMap.getPixelColorOrder(pix+_start, _colorOrder);
|
||||||
uint32_t c = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, (_type==TYPE_WS2812_1CH_X3) ? IC_INDEX_WS2812_1CH_3X(pix) : pix, co), _bri);
|
uint32_t c = restoreColorLossy(PolyBus::getPixelColor(_busPtr, _iType, (_type==TYPE_WS2812_1CH_X3) ? IC_INDEX_WS2812_1CH_3X(pix) : pix, co));
|
||||||
if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs
|
if (_type == TYPE_WS2812_1CH_X3) { // map to correct IC, each controls 3 LEDs
|
||||||
uint8_t r = R(c);
|
uint8_t r = R(c);
|
||||||
uint8_t g = _reversed ? B(c) : G(c); // should G and B be switched if _reversed?
|
uint8_t g = _reversed ? B(c) : G(c); // should G and B be switched if _reversed?
|
||||||
|
@ -224,14 +224,13 @@ class BusDigital : public Bus {
|
|||||||
const ColorOrderMap &_colorOrderMap;
|
const ColorOrderMap &_colorOrderMap;
|
||||||
bool buffering; // 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) {
|
inline uint32_t restoreColorLossy(uint32_t c) {
|
||||||
if (_bri == 255) return c;
|
if (_bri < 255) {
|
||||||
uint8_t* chan = (uint8_t*) &c;
|
uint8_t* chan = (uint8_t*) &c;
|
||||||
|
for (uint_fast8_t i=0; i<4; i++) {
|
||||||
for (uint_fast8_t i=0; i<4; i++)
|
uint_fast16_t val = chan[i];
|
||||||
{
|
chan[i] = ((val << 8) + _bri) / (_bri + 1); //adding _bri slighly improves recovery / stops degradation on re-scale
|
||||||
uint_fast16_t val = chan[i];
|
}
|
||||||
chan[i] = ((val << 8) + _restaurationBri) / (_restaurationBri + 1); //adding _bri slighly improves recovery / stops degradation on re-scale
|
|
||||||
}
|
}
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user