From 376a83fc318517c99caec0e7acac20262950041a Mon Sep 17 00:00:00 2001 From: mxklb Date: Thu, 9 Nov 2023 00:04:56 +0100 Subject: [PATCH 1/8] Correct single RGB & DRGB modes to explicitly utilize white --- wled00/e131.cpp | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 68c7ca5a5a..12acc2c9f2 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -142,32 +142,33 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ return; // nothing to do break; - case DMX_MODE_SINGLE_RGB: // 3 channel: [R,G,B] + case DMX_MODE_SINGLE_RGB: // 3-4 channels: [R,G,B] + W (if present) if (uni != e131Universe) return; - if (availDMXLen < 3) return; + const uint16_t dmxChannelCount = strip.hasWhiteChannel() ? 4 : 3; + if (availDMXLen < dmxChannelCount) return; realtimeLock(realtimeTimeoutMs, mde); - if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return; - wChannel = (availDMXLen > 3) ? e131_data[dataOffset+3] : 0; + wChannel = dmxChannelCount == 4 ? e131_data[dataOffset+3] : 0; for (uint16_t i = 0; i < totalLen; i++) setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel); break; - case DMX_MODE_SINGLE_DRGB: // 4 channel: [Dimmer,R,G,B] + case DMX_MODE_SINGLE_DRGB: // 4-5 channels: [Dimmer,R,G,B] + W (if present) if (uni != e131Universe) return; - if (availDMXLen < 4) return; + const uint16_t dmxChannelCount = strip.hasWhiteChannel() ? 5 : 4; + if (availDMXLen < dmxChannelCount) return; realtimeLock(realtimeTimeoutMs, mde); if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return; - wChannel = (availDMXLen > 4) ? e131_data[dataOffset+4] : 0; if (bri != e131_data[dataOffset+0]) { bri = e131_data[dataOffset+0]; strip.setBrightness(bri, true); } + wChannel = dmxChannelCount == 5 ? e131_data[dataOffset+4] : 0; for (uint16_t i = 0; i < totalLen; i++) setRealtimePixel(i, e131_data[dataOffset+1], e131_data[dataOffset+2], e131_data[dataOffset+3], wChannel); break; From 29e6ccdcdb58b9258f98c138105db0d3466b5e93 Mon Sep 17 00:00:00 2001 From: mxklb Date: Thu, 9 Nov 2023 00:24:17 +0100 Subject: [PATCH 2/8] Fix compile error --- wled00/e131.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 12acc2c9f2..2607cc0fd9 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -144,7 +144,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ case DMX_MODE_SINGLE_RGB: // 3-4 channels: [R,G,B] + W (if present) if (uni != e131Universe) return; - const uint16_t dmxChannelCount = strip.hasWhiteChannel() ? 4 : 3; + uint16_t dmxChannelCount = strip.hasWhiteChannel() ? 4 : 3; if (availDMXLen < dmxChannelCount) return; realtimeLock(realtimeTimeoutMs, mde); @@ -157,7 +157,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ case DMX_MODE_SINGLE_DRGB: // 4-5 channels: [Dimmer,R,G,B] + W (if present) if (uni != e131Universe) return; - const uint16_t dmxChannelCount = strip.hasWhiteChannel() ? 5 : 4; + uint16_t dmxChannelCount = strip.hasWhiteChannel() ? 5 : 4; if (availDMXLen < dmxChannelCount) return; realtimeLock(realtimeTimeoutMs, mde); From 84457b73348e8cd97af3effe61281297335bbb04 Mon Sep 17 00:00:00 2001 From: mxklb Date: Thu, 9 Nov 2023 00:49:41 +0100 Subject: [PATCH 3/8] Fix compile error --- platformio.ini | 4 ++-- wled00/e131.cpp | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/platformio.ini b/platformio.ini index fa6bf3bb83..be66be959e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,7 +11,7 @@ # CI binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth # ESP32 variant builds are temporarily excluded from CI due to toolchain issues on the GitHub Actions Linux environment -default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi +;default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi # Release binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB @@ -30,7 +30,7 @@ default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32d ; default_envs = h803wf ; default_envs = d1_mini_debug ; default_envs = d1_mini_ota -; default_envs = esp32dev +default_envs = esp32dev ; default_envs = esp8285_4CH_MagicHome ; default_envs = esp8285_H801 ; default_envs = d1_mini_5CH_Shojo_PCB diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 2607cc0fd9..86ef7c8ba5 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -144,7 +144,8 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ case DMX_MODE_SINGLE_RGB: // 3-4 channels: [R,G,B] + W (if present) if (uni != e131Universe) return; - uint16_t dmxChannelCount = strip.hasWhiteChannel() ? 4 : 3; + uint16_t dmxChannelCount; + dmxChannelCount = strip.hasWhiteChannel() ? 4 : 3; if (availDMXLen < dmxChannelCount) return; realtimeLock(realtimeTimeoutMs, mde); @@ -157,7 +158,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ case DMX_MODE_SINGLE_DRGB: // 4-5 channels: [Dimmer,R,G,B] + W (if present) if (uni != e131Universe) return; - uint16_t dmxChannelCount = strip.hasWhiteChannel() ? 5 : 4; + dmxChannelCount = strip.hasWhiteChannel() ? 5 : 4; if (availDMXLen < dmxChannelCount) return; realtimeLock(realtimeTimeoutMs, mde); From 1602c4434fc6239b394ae0f66e24f4f1d8157064 Mon Sep 17 00:00:00 2001 From: mxklb Date: Thu, 9 Nov 2023 00:52:34 +0100 Subject: [PATCH 4/8] Removed faulty platformio.ini changes --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index be66be959e..fa6bf3bb83 100644 --- a/platformio.ini +++ b/platformio.ini @@ -11,7 +11,7 @@ # CI binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth # ESP32 variant builds are temporarily excluded from CI due to toolchain issues on the GitHub Actions Linux environment -;default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi +default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, esp32dev_audioreactive, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB, esp32s3dev_8MB_PSRAM_opi # Release binaries ; default_envs = nodemcuv2, esp8266_2m, esp01_1m_full, esp32dev, esp32_eth, lolin_s2_mini, esp32c3dev, esp32s3dev_8MB @@ -30,7 +30,7 @@ ; default_envs = h803wf ; default_envs = d1_mini_debug ; default_envs = d1_mini_ota -default_envs = esp32dev +; default_envs = esp32dev ; default_envs = esp8285_4CH_MagicHome ; default_envs = esp8285_H801 ; default_envs = d1_mini_5CH_Shojo_PCB From ababf58deb33908402f38031a1a7d8dc2898c88d Mon Sep 17 00:00:00 2001 From: mxklb Date: Fri, 17 Nov 2023 01:41:23 +0100 Subject: [PATCH 5/8] Added missing main segment check --- wled00/e131.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 86ef7c8ba5..40cd49d2a2 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -120,6 +120,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ // update status info realtimeIP = clientIP; byte wChannel = 0; + uint16_t dmxChannelCount = 0; uint16_t totalLen = strip.getLengthTotal(); uint16_t availDMXLen = 0; uint16_t dataOffset = DMXAddress; @@ -144,13 +145,13 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ case DMX_MODE_SINGLE_RGB: // 3-4 channels: [R,G,B] + W (if present) if (uni != e131Universe) return; - uint16_t dmxChannelCount; - dmxChannelCount = strip.hasWhiteChannel() ? 4 : 3; - if (availDMXLen < dmxChannelCount) return; realtimeLock(realtimeTimeoutMs, mde); if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return; + dmxChannelCount = useMainSegmentOnly ? strip.getMainSegment().hasWhite() : strip.hasWhiteChannel() ? 4 : 3; + if (availDMXLen < dmxChannelCount) return; + wChannel = dmxChannelCount == 4 ? e131_data[dataOffset+3] : 0; for (uint16_t i = 0; i < totalLen; i++) setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel); @@ -158,11 +159,12 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ case DMX_MODE_SINGLE_DRGB: // 4-5 channels: [Dimmer,R,G,B] + W (if present) if (uni != e131Universe) return; - dmxChannelCount = strip.hasWhiteChannel() ? 5 : 4; - if (availDMXLen < dmxChannelCount) return; realtimeLock(realtimeTimeoutMs, mde); if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return; + + dmxChannelCount = useMainSegmentOnly ? strip.getMainSegment().hasWhite() : strip.hasWhiteChannel() ? 5 : 4; + if (availDMXLen < dmxChannelCount) return; if (bri != e131_data[dataOffset+0]) { bri = e131_data[dataOffset+0]; From a740d71c820a9ae9b842e7e908525b77b58f51e4 Mon Sep 17 00:00:00 2001 From: mxklb Date: Fri, 17 Nov 2023 14:18:30 +0100 Subject: [PATCH 6/8] Added parentheses --- wled00/e131.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 40cd49d2a2..15a0e71cde 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -149,11 +149,11 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ realtimeLock(realtimeTimeoutMs, mde); if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return; - dmxChannelCount = useMainSegmentOnly ? strip.getMainSegment().hasWhite() : strip.hasWhiteChannel() ? 4 : 3; + dmxChannelCount = (useMainSegmentOnly ? strip.getMainSegment().hasWhite() : strip.hasWhiteChannel()) ? 4 : 3; if (availDMXLen < dmxChannelCount) return; wChannel = dmxChannelCount == 4 ? e131_data[dataOffset+3] : 0; - for (uint16_t i = 0; i < totalLen; i++) + for (uint16_t i = 0; i < useMainSegmentOnly ? strip.getMainSegment().length() : totalLen; i++) setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel); break; @@ -163,7 +163,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ realtimeLock(realtimeTimeoutMs, mde); if (realtimeOverride && !(realtimeMode && useMainSegmentOnly)) return; - dmxChannelCount = useMainSegmentOnly ? strip.getMainSegment().hasWhite() : strip.hasWhiteChannel() ? 5 : 4; + dmxChannelCount = (useMainSegmentOnly ? strip.getMainSegment().hasWhite() : strip.hasWhiteChannel()) ? 5 : 4; if (availDMXLen < dmxChannelCount) return; if (bri != e131_data[dataOffset+0]) { From bdd667d02df49495b5c4654cf505be975a642f10 Mon Sep 17 00:00:00 2001 From: mxklb Date: Fri, 17 Nov 2023 14:26:11 +0100 Subject: [PATCH 7/8] Removed wrong length --- wled00/e131.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 15a0e71cde..704d7d744c 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -153,7 +153,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ if (availDMXLen < dmxChannelCount) return; wChannel = dmxChannelCount == 4 ? e131_data[dataOffset+3] : 0; - for (uint16_t i = 0; i < useMainSegmentOnly ? strip.getMainSegment().length() : totalLen; i++) + for (uint16_t i = 0; i < totalLen; i++) setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel); break; From 3d9d658a7e551ded1e079e1bc2b0ed3b0a7c67ca Mon Sep 17 00:00:00 2001 From: mxklb Date: Sat, 18 Nov 2023 15:23:34 +0100 Subject: [PATCH 8/8] Less loops if main segment only length < totalLen --- wled00/e131.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 704d7d744c..22ceec1d65 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -153,7 +153,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ if (availDMXLen < dmxChannelCount) return; wChannel = dmxChannelCount == 4 ? e131_data[dataOffset+3] : 0; - for (uint16_t i = 0; i < totalLen; i++) + for (uint16_t i = 0; i < useMainSegmentOnly ? strip.getMainSegment().length() : totalLen; i++) setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel); break; @@ -172,7 +172,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ } wChannel = dmxChannelCount == 5 ? e131_data[dataOffset+4] : 0; - for (uint16_t i = 0; i < totalLen; i++) + for (uint16_t i = 0; i < useMainSegmentOnly ? strip.getMainSegment().length() : totalLen; i++) setRealtimePixel(i, e131_data[dataOffset+1], e131_data[dataOffset+2], e131_data[dataOffset+3], wChannel); break;