From 68dc4d11a9189d6e804bac106c6631905d371c90 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Sat, 9 Dec 2023 18:58:45 +0100 Subject: [PATCH] Autowhite cleanup Fix for UCS8904 hasWhite(). --- wled00/bus_manager.cpp | 2 +- wled00/bus_manager.h | 4 ++-- wled00/cfg.cpp | 7 +++---- wled00/set.cpp | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/wled00/bus_manager.cpp b/wled00/bus_manager.cpp index 2f330b75e4..6ff757624b 100644 --- a/wled00/bus_manager.cpp +++ b/wled00/bus_manager.cpp @@ -83,7 +83,7 @@ uint8_t IRAM_ATTR ColorOrderMap::getPixelColorOrder(uint16_t pix, uint8_t defaul uint32_t Bus::autoWhiteCalc(uint32_t c) { uint8_t aWM = _autoWhiteMode; - if (_gAWM < 255) aWM = _gAWM; + if (_gAWM != AW_GLOBAL_DISABLED) aWM = _gAWM; if (aWM == RGBW_MODE_MANUAL_ONLY) return c; uint8_t w = W(c); //ignore auto-white calculation if w>0 and mode DUAL (DUAL behaves as BRIGHTER if w==0) diff --git a/wled00/bus_manager.h b/wled00/bus_manager.h index 220fd93028..2f860ae14f 100644 --- a/wled00/bus_manager.h +++ b/wled00/bus_manager.h @@ -98,7 +98,7 @@ class Bus { { _type = type; _start = start; - _autoWhiteMode = Bus::hasWhite(_type) ? aw : RGBW_MODE_MANUAL_ONLY; + _autoWhiteMode = Bus::hasWhite(type) ? aw : RGBW_MODE_MANUAL_ONLY; }; virtual ~Bus() {} //throw the bus under the bus @@ -129,7 +129,7 @@ class Bus { } virtual bool hasWhite() { return Bus::hasWhite(_type); } static bool hasWhite(uint8_t type) { - if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_SK6812_RGBW || type == TYPE_TM1814) return true; // digital types with white channel + if ((type >= TYPE_WS2812_1CH && type <= TYPE_WS2812_WWA) || type == TYPE_SK6812_RGBW || type == TYPE_TM1814 || type == TYPE_UCS8904) return true; // digital types with white channel if (type > TYPE_ONOFF && type <= TYPE_ANALOG_5CH && type != TYPE_ANALOG_3CH) return true; // analog types with white channel if (type == TYPE_NET_DDP_RGBW) return true; // network types with white channel return false; diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index 07a06945ee..627559054e 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -103,10 +103,9 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { } #endif - uint8_t autoWhiteMode = RGBW_MODE_MANUAL_ONLY; CJSON(strip.ablMilliampsMax, hw_led[F("maxpwr")]); CJSON(strip.milliampsPerLed, hw_led[F("ledma")]); - Bus::setGlobalAWMode(hw_led[F("rgbwm")] | 255); + Bus::setGlobalAWMode(hw_led[F("rgbwm")] | AW_GLOBAL_DISABLED); CJSON(correctWB, hw_led["cct"]); CJSON(cctFromRgb, hw_led[F("cr")]); CJSON(strip.cctBlending, hw_led[F("cb")]); @@ -185,7 +184,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { } uint16_t length = elm["len"] | 1; - uint8_t colorOrder = (int)elm[F("order")]; + uint8_t colorOrder = (int)elm[F("order")]; // contains white channel swap option in upper nibble uint8_t skipFirst = elm[F("skip")]; uint16_t start = elm["start"] | 0; if (length==0 || start + length > MAX_LEDS) continue; // zero length or we reached max. number of LEDs, just stop @@ -194,7 +193,7 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { bool refresh = elm["ref"] | false; uint16_t freqkHz = elm[F("freq")] | 0; // will be in kHz for DotStar and Hz for PWM (not yet implemented fully) ledType |= refresh << 7; // hack bit 7 to indicate strip requires off refresh - uint8_t AWmode = elm[F("rgbwm")] | autoWhiteMode; + uint8_t AWmode = elm[F("rgbwm")] | RGBW_MODE_MANUAL_ONLY; if (fromFS) { BusConfig bc = BusConfig(ledType, pins, start, length, colorOrder, reversed, skipFirst, AWmode, freqkHz); mem += BusManager::memUsage(bc); diff --git a/wled00/set.cpp b/wled00/set.cpp index 9b5c6359cc..55def478f0 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -162,7 +162,7 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) } else { freqHz = 0; } - channelSwap = (type == TYPE_SK6812_RGBW || type == TYPE_TM1814) ? request->arg(wo).toInt() : 0; + channelSwap = Bus::hasWhite(type) ? request->arg(wo).toInt() : 0; type |= request->hasArg(rf) << 7; // off refresh override // actual finalization is done in WLED::loop() (removing old busses and adding new) // this may happen even before this loop is finished so we do "doInitBusses" after the loop