From 84628bd9fccbabe185daf6a3b0c8659c2fbc7a5e Mon Sep 17 00:00:00 2001 From: mxklb Date: Sat, 19 Nov 2022 14:10:40 +0100 Subject: [PATCH 01/12] Refactored DMX effect mode + new segement controls (#2325) --- wled00/cfg.cpp | 3 ++ wled00/const.h | 4 ++ wled00/data/settings_sync.htm | 5 ++ wled00/e131.cpp | 97 +++++++++++++++++++++++------------ wled00/fcn_declare.h | 1 + wled00/led.cpp | 16 ++++++ wled00/set.cpp | 4 +- wled00/wled.h | 2 + wled00/xml.cpp | 1 + 9 files changed, 100 insertions(+), 33 deletions(-) diff --git a/wled00/cfg.cpp b/wled00/cfg.cpp index d12176ee..481b9651 100644 --- a/wled00/cfg.cpp +++ b/wled00/cfg.cpp @@ -379,6 +379,8 @@ bool deserializeConfig(JsonObject doc, bool fromFS) { CJSON(e131SkipOutOfSequence, if_live_dmx[F("seqskip")]); CJSON(DMXAddress, if_live_dmx[F("addr")]); if (!DMXAddress || DMXAddress > 510) DMXAddress = 1; + CJSON(DMXSegmentSpacing, if_live_dmx[F("dss")]); + if (DMXSegmentSpacing > 150) DMXSegmentSpacing = 0; CJSON(DMXMode, if_live_dmx["mode"]); tdd = if_live[F("timeout")] | -1; @@ -837,6 +839,7 @@ void serializeConfig() { if_live_dmx[F("uni")] = e131Universe; if_live_dmx[F("seqskip")] = e131SkipOutOfSequence; if_live_dmx[F("addr")] = DMXAddress; + if_live_dmx[F("dss")] = DMXSegmentSpacing; if_live_dmx["mode"] = DMXMode; if_live[F("timeout")] = realtimeTimeoutMs / 100; diff --git a/wled00/const.h b/wled00/const.h index f092fe63..6f8f269d 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -147,9 +147,13 @@ #define DMX_MODE_SINGLE_RGB 1 //all LEDs same RGB color (3 channels) #define DMX_MODE_SINGLE_DRGB 2 //all LEDs same RGB color and master dimmer (4 channels) #define DMX_MODE_EFFECT 3 //trigger standalone effects of WLED (11 channels) +#define DMX_MODE_EFFECT_W 7 //trigger standalone effects of WLED (13 channels) #define DMX_MODE_MULTIPLE_RGB 4 //every LED is addressed with its own RGB (ledCount * 3 channels) #define DMX_MODE_MULTIPLE_DRGB 5 //every LED is addressed with its own RGB and share a master dimmer (ledCount * 3 + 1 channels) #define DMX_MODE_MULTIPLE_RGBW 6 //every LED is addressed with its own RGBW (ledCount * 4 channels) +#define DMX_MODE_EFFECT_SEGMENT 8 //trigger standalone effects of WLED (11 channels per segement) +#define DMX_MODE_EFFECT_SEGMENT_W 9 //trigger standalone effects of WLED (13 channels per segement) +#define DMX_MODE_PRESET 10 //apply presets (1 channel) //Light capability byte (unused) 0bRCCCTTTT //bits 0/1/2/3: specifies a type of LED driver. A single "driver" may have different chip models but must have the same protocol/behavior diff --git a/wled00/data/settings_sync.htm b/wled00/data/settings_sync.htm index b7f4f2ef..9fc2e16e 100644 --- a/wled00/data/settings_sync.htm +++ b/wled00/data/settings_sync.htm @@ -148,15 +148,20 @@ Start universe:
Reboot required. Check out LedFx!
Skip out-of-sequence packets:
DMX start address:
+DMX segment spacing:
DMX mode:
E1.31 info
Timeout: ms
diff --git a/wled00/e131.cpp b/wled00/e131.cpp index cce5233a..310a3ea7 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -132,7 +132,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ return; // nothing to do break; - case DMX_MODE_SINGLE_RGB: // RGB only + case DMX_MODE_SINGLE_RGB: // 3 channel: [R,G,B] if (uni != e131Universe) return; if (availDMXLen < 3) return; @@ -145,7 +145,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ setRealtimePixel(i, e131_data[dataOffset+0], e131_data[dataOffset+1], e131_data[dataOffset+2], wChannel); break; - case DMX_MODE_SINGLE_DRGB: // Dimmer + RGB + case DMX_MODE_SINGLE_DRGB: // 4 channel: [Dimmer,R,G,B] if (uni != e131Universe) return; if (availDMXLen < 4) return; @@ -162,38 +162,67 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ setRealtimePixel(i, e131_data[dataOffset+1], e131_data[dataOffset+2], e131_data[dataOffset+3], wChannel); break; - case DMX_MODE_EFFECT: // Length 1: Apply Preset ID, length 11-13: apply effect config - if (uni != e131Universe) return; - if (availDMXLen < 11) { - if (availDMXLen > 1) return; - applyPreset(e131_data[dataOffset+0], CALL_MODE_NOTIFICATION); - return; - } - - if (bri != e131_data[dataOffset+0]) { - bri = e131_data[dataOffset+0]; - } - if (e131_data[dataOffset+1] < strip.getModeCount()) - effectCurrent = e131_data[dataOffset+ 1]; - effectSpeed = e131_data[dataOffset+ 2]; // flickers - effectIntensity = e131_data[dataOffset+ 3]; - effectPalette = e131_data[dataOffset+ 4]; - col[0] = e131_data[dataOffset+ 5]; - col[1] = e131_data[dataOffset+ 6]; - col[2] = e131_data[dataOffset+ 7]; - colSec[0] = e131_data[dataOffset+ 8]; - colSec[1] = e131_data[dataOffset+ 9]; - colSec[2] = e131_data[dataOffset+10]; - if (availDMXLen > 11) - { - col[3] = e131_data[dataOffset+11]; //white - colSec[3] = e131_data[dataOffset+12]; - } - transitionDelayTemp = 0; // act fast - colorUpdated(CALL_MODE_NOTIFICATION); // don't send UDP - return; // don't activate realtime live mode + case DMX_MODE_PRESET: // 1 channel: WLED Preset number [#] + if (uni != e131Universe || availDMXLen < 1) return; + applyPreset(e131_data[dataOffset], CALL_MODE_NOTIFICATION); + return; break; + case DMX_MODE_EFFECT: // 11 channels [bri,effectCurrent,effectSpeed,effectIntensity,effectPalette,R,G,B,R2,G2,B2] + case DMX_MODE_EFFECT_W: // 13 channels, same as above but with extra +2 white channels [..,W,W2] + case DMX_MODE_EFFECT_SEGMENT: // 11 channels per segment; max[#] = floor[512/(11+DMXSegmentSpacing)] = 46,42,39, .. + case DMX_MODE_EFFECT_SEGMENT_W: // 13 Channels per segment; max[#] = floor[512/(13+DMXSegmentSpacing)] = 39,36,34,32, .. + { + if (uni != e131Universe) return; + bool segmentUpdated = false; + bool isSegmentMode = DMXMode == DMX_MODE_EFFECT_SEGMENT || DMXMode == DMX_MODE_EFFECT_SEGMENT_W; + uint8_t dmxEffectChannels = (DMXMode == DMX_MODE_EFFECT || DMXMode == DMX_MODE_EFFECT_SEGMENT) ? 11 : 13; + for (uint8_t seg = 0; seg < strip.getSegmentsNum(); seg++) { + if (isSegmentMode) + dataOffset = DMXAddress + seg * (dmxEffectChannels + DMXSegmentSpacing); + else + dataOffset = DMXAddress; + // Modify address for Art-Net data + if (protocol == P_ARTNET && dataOffset > 0) + dataOffset--; + // Skip out of universe addresses + if (dataOffset > dmxChannels - dmxEffectChannels) + return; + + if (e131_data[dataOffset+1] < strip.getModeCount()) + effectCurrent = e131_data[dataOffset+ 1]; + effectSpeed = e131_data[dataOffset+ 2]; // flickers + effectIntensity = e131_data[dataOffset+ 3]; + effectPalette = e131_data[dataOffset+ 4]; + col[0] = e131_data[dataOffset+ 5]; + col[1] = e131_data[dataOffset+ 6]; + col[2] = e131_data[dataOffset+ 7]; + colSec[0] = e131_data[dataOffset+ 8]; + colSec[1] = e131_data[dataOffset+ 9]; + colSec[2] = e131_data[dataOffset+10]; + if (dmxEffectChannels == 13) { + col[3] = e131_data[dataOffset+11]; // white + colSec[3] = e131_data[dataOffset+12]; + } + if (isSegmentMode) { + opacity = e131_data[dataOffset+ 0]; + segmentUpdated |= applyValuesToSegment(seg); + } else { + if (bri != e131_data[dataOffset+0]) + bri = e131_data[dataOffset+0]; + transitionDelayTemp = 0; // act fast + colorUpdated(CALL_MODE_NOTIFICATION); // don't send UDP + return; // don't activate realtime live mode + } + } + if (segmentUpdated) { + transitionDelayTemp = 0; + stateUpdated(CALL_MODE_NOTIFICATION); + return; + } + break; + } + case DMX_MODE_MULTIPLE_DRGB: case DMX_MODE_MULTIPLE_RGB: case DMX_MODE_MULTIPLE_RGBW: @@ -279,7 +308,11 @@ void handleArtnetPollReply(IPAddress ipAddress) { case DMX_MODE_SINGLE_RGB: case DMX_MODE_SINGLE_DRGB: + case DMX_MODE_PRESET: case DMX_MODE_EFFECT: + case DMX_MODE_EFFECT_W: + case DMX_MODE_EFFECT_SEGMENT: + case DMX_MODE_EFFECT_SEGMENT_W: break; // 1 universe is enough case DMX_MODE_MULTIPLE_DRGB: diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 823c7f98..612e8fcb 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -153,6 +153,7 @@ void toggleOnOff(); void applyBri(); void applyFinalBri(); void applyValuesToSelectedSegs(); +bool applyValuesToSegment(uint8_t i); void colorUpdated(byte callMode); void stateUpdated(byte callMode); void updateInterfaces(uint8_t callMode); diff --git a/wled00/led.cpp b/wled00/led.cpp index 34dd85d9..af05c4be 100644 --- a/wled00/led.cpp +++ b/wled00/led.cpp @@ -46,6 +46,22 @@ void applyValuesToSelectedSegs() } } +// applies global legacy values to segment i (opacity, col, colSec, effectCurrent...) +bool applyValuesToSegment(uint8_t i) +{ + if (i >= strip.getSegmentsNum()) {return false;} + Segment& seg = strip.getSegment(i); + if (opacity != seg.opacity) {seg.setOpacity(opacity); stateChanged = true;} + if (effectSpeed != seg.speed) {seg.speed = effectSpeed; stateChanged = true;} + if (effectIntensity != seg.intensity) {seg.intensity = effectIntensity; stateChanged = true;} + if (effectPalette != seg.palette) {seg.palette = effectPalette; stateChanged = true;} + if (effectCurrent != seg.mode) {strip.setMode(i, effectCurrent); stateChanged = true;} + uint32_t col0 = RGBW32( col[0], col[1], col[2], col[3]); + uint32_t col1 = RGBW32(colSec[0], colSec[1], colSec[2], colSec[3]); + if (col0 != seg.colors[0]) {seg.setColor(0, col0); stateChanged = true;} + if (col1 != seg.colors[1]) {seg.setColor(1, col1); stateChanged = true;} + return stateChanged; +} void resetTimebase() { diff --git a/wled00/set.cpp b/wled00/set.cpp index 8caad36c..ca2290f1 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -266,8 +266,10 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) if (t >= 0 && t <= 63999) e131Universe = t; t = request->arg(F("DA")).toInt(); if (t >= 0 && t <= 510) DMXAddress = t; + t = request->arg(F("XX")).toInt(); + if (t >= 0 && t <= 150) DMXSegmentSpacing = t; t = request->arg(F("DM")).toInt(); - if (t >= DMX_MODE_DISABLED && t <= DMX_MODE_MULTIPLE_RGBW) DMXMode = t; + if (t >= DMX_MODE_DISABLED && t <= DMX_MODE_PRESET) DMXMode = t; t = request->arg(F("ET")).toInt(); if (t > 99 && t <= 65000) realtimeTimeoutMs = t; arlsForceMaxBri = request->hasArg(F("FB")); diff --git a/wled00/wled.h b/wled00/wled.h index f7dd1703..95d3c1ac 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -388,6 +388,7 @@ WLED_GLOBAL uint16_t e131Universe _INIT(1); // settings fo WLED_GLOBAL uint16_t e131Port _INIT(5568); // DMX in port. E1.31 default is 5568, Art-Net is 6454 WLED_GLOBAL byte DMXMode _INIT(DMX_MODE_MULTIPLE_RGB); // DMX mode (s.a.) WLED_GLOBAL uint16_t DMXAddress _INIT(1); // DMX start address of fixture, a.k.a. first Channel [for E1.31 (sACN) protocol] +WLED_GLOBAL uint16_t DMXSegmentSpacing _INIT(0); // Number of void/unused channels between each segments DMX channels WLED_GLOBAL byte e131LastSequenceNumber[E131_MAX_UNIVERSE_COUNT]; // to detect packet loss WLED_GLOBAL bool e131Multicast _INIT(false); // multicast or unicast WLED_GLOBAL bool e131SkipOutOfSequence _INIT(false); // freeze instead of flickering @@ -496,6 +497,7 @@ WLED_GLOBAL byte briOld _INIT(0); // global brightnes w WLED_GLOBAL byte briT _INIT(0); // global brightness during transition WLED_GLOBAL byte briLast _INIT(128); // brightness before turned off. Used for toggle function WLED_GLOBAL byte whiteLast _INIT(128); // white channel before turned off. Used for toggle function +WLED_GLOBAL byte opacity _INIT(128); // global segment opacity (set) // button WLED_GLOBAL bool buttonPublishMqtt _INIT(false); diff --git a/wled00/xml.cpp b/wled00/xml.cpp index 801a5bb1..fdace73f 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -501,6 +501,7 @@ void getSettingsJS(byte subPage, char* dest) sappend('c',SET_F("EM"),e131Multicast); sappend('v',SET_F("EU"),e131Universe); sappend('v',SET_F("DA"),DMXAddress); + sappend('v',SET_F("XX"),DMXSegmentSpacing); sappend('v',SET_F("DM"),DMXMode); sappend('v',SET_F("ET"),realtimeTimeoutMs); sappend('c',SET_F("FB"),arlsForceMaxBri); From 043947fdcb389675365de3fcdcc342c64a86bedb Mon Sep 17 00:00:00 2001 From: mxklb Date: Wed, 23 Nov 2022 00:38:42 +0100 Subject: [PATCH 02/12] Added missing brightness to preset DMX mode --- wled00/e131.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 310a3ea7..3c8fbe4f 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -162,9 +162,13 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ setRealtimePixel(i, e131_data[dataOffset+1], e131_data[dataOffset+2], e131_data[dataOffset+3], wChannel); break; - case DMX_MODE_PRESET: // 1 channel: WLED Preset number [#] - if (uni != e131Universe || availDMXLen < 1) return; - applyPreset(e131_data[dataOffset], CALL_MODE_NOTIFICATION); + case DMX_MODE_PRESET: // 2 channel: [Dimmer,Preset] + if (uni != e131Universe || availDMXLen < 2) return; + applyPreset(e131_data[dataOffset+1], CALL_MODE_NOTIFICATION); + if (bri != e131_data[dataOffset]) { + bri = e131_data[dataOffset]; + strip.setBrightness(bri, true); + } return; break; From 87fa14b2819f0577a5f86f8af89f7a8b1086a59b Mon Sep 17 00:00:00 2001 From: mxklb Date: Wed, 23 Nov 2022 23:19:53 +0100 Subject: [PATCH 03/12] Use up-to-date fashion for segment dmx control --- wled00/e131.cpp | 55 ++++++++++++++++++++++---------------------- wled00/fcn_declare.h | 1 - wled00/led.cpp | 16 ------------- 3 files changed, 28 insertions(+), 44 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 3c8fbe4f..5b8ae81f 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -178,12 +178,12 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ case DMX_MODE_EFFECT_SEGMENT_W: // 13 Channels per segment; max[#] = floor[512/(13+DMXSegmentSpacing)] = 39,36,34,32, .. { if (uni != e131Universe) return; - bool segmentUpdated = false; bool isSegmentMode = DMXMode == DMX_MODE_EFFECT_SEGMENT || DMXMode == DMX_MODE_EFFECT_SEGMENT_W; uint8_t dmxEffectChannels = (DMXMode == DMX_MODE_EFFECT || DMXMode == DMX_MODE_EFFECT_SEGMENT) ? 11 : 13; - for (uint8_t seg = 0; seg < strip.getSegmentsNum(); seg++) { + for (uint8_t id = 0; id < strip.getSegmentsNum(); id++) { + Segment& seg = strip.getSegment(id); if (isSegmentMode) - dataOffset = DMXAddress + seg * (dmxEffectChannels + DMXSegmentSpacing); + dataOffset = DMXAddress + id * (dmxEffectChannels + DMXSegmentSpacing); else dataOffset = DMXAddress; // Modify address for Art-Net data @@ -194,35 +194,36 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ return; if (e131_data[dataOffset+1] < strip.getModeCount()) - effectCurrent = e131_data[dataOffset+ 1]; - effectSpeed = e131_data[dataOffset+ 2]; // flickers - effectIntensity = e131_data[dataOffset+ 3]; - effectPalette = e131_data[dataOffset+ 4]; - col[0] = e131_data[dataOffset+ 5]; - col[1] = e131_data[dataOffset+ 6]; - col[2] = e131_data[dataOffset+ 7]; - colSec[0] = e131_data[dataOffset+ 8]; - colSec[1] = e131_data[dataOffset+ 9]; - colSec[2] = e131_data[dataOffset+10]; + if (e131_data[dataOffset+1] != seg.mode) {strip.setMode(id, e131_data[dataOffset+1]); stateChanged = true;} + if (e131_data[dataOffset+2] != seg.speed) {seg.speed = e131_data[dataOffset+2]; stateChanged = true;} + if (e131_data[dataOffset+3] != seg.intensity) {seg.intensity = e131_data[dataOffset+3]; stateChanged = true;} + if (e131_data[dataOffset+4] != seg.palette) {seg.palette = e131_data[dataOffset+4]; stateChanged = true;} + + uint32_t colors[2]; + byte whites[2] = {0,0}; if (dmxEffectChannels == 13) { - col[3] = e131_data[dataOffset+11]; // white - colSec[3] = e131_data[dataOffset+12]; + whites[0] = e131_data[dataOffset+11]; + whites[1] = e131_data[dataOffset+12]; } + colors[0] = RGBW32(e131_data[dataOffset+5], e131_data[dataOffset+6], e131_data[dataOffset+ 7], whites[0]); + colors[1] = RGBW32(e131_data[dataOffset+8], e131_data[dataOffset+9], e131_data[dataOffset+10], whites[1]); + if (colors[0] != seg.colors[0]) {seg.setColor(0, colors[0]); stateChanged = true;} + if (colors[1] != seg.colors[1]) {seg.setColor(1, colors[1]); stateChanged = true;} + + // Set segment opacity or global brightness if (isSegmentMode) { - opacity = e131_data[dataOffset+ 0]; - segmentUpdated |= applyValuesToSegment(seg); - } else { - if (bri != e131_data[dataOffset+0]) - bri = e131_data[dataOffset+0]; - transitionDelayTemp = 0; // act fast - colorUpdated(CALL_MODE_NOTIFICATION); // don't send UDP - return; // don't activate realtime live mode + if (e131_data[dataOffset] != seg.opacity) {seg.opacity = e131_data[dataOffset]; stateChanged = true;} + } else if ( id == strip.getSegmentsNum()-1 ) { + if (bri != e131_data[dataOffset]) { + bri = e131_data[dataOffset]; + strip.setBrightness(bri, true); + } } } - if (segmentUpdated) { - transitionDelayTemp = 0; - stateUpdated(CALL_MODE_NOTIFICATION); - return; + if (stateChanged) { + transitionDelayTemp = 0; // act fast + stateUpdated(CALL_MODE_NOTIFICATION); // don't send UDP + return; // don't activate realtime live mode } break; } diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 612e8fcb..823c7f98 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -153,7 +153,6 @@ void toggleOnOff(); void applyBri(); void applyFinalBri(); void applyValuesToSelectedSegs(); -bool applyValuesToSegment(uint8_t i); void colorUpdated(byte callMode); void stateUpdated(byte callMode); void updateInterfaces(uint8_t callMode); diff --git a/wled00/led.cpp b/wled00/led.cpp index af05c4be..34dd85d9 100644 --- a/wled00/led.cpp +++ b/wled00/led.cpp @@ -46,22 +46,6 @@ void applyValuesToSelectedSegs() } } -// applies global legacy values to segment i (opacity, col, colSec, effectCurrent...) -bool applyValuesToSegment(uint8_t i) -{ - if (i >= strip.getSegmentsNum()) {return false;} - Segment& seg = strip.getSegment(i); - if (opacity != seg.opacity) {seg.setOpacity(opacity); stateChanged = true;} - if (effectSpeed != seg.speed) {seg.speed = effectSpeed; stateChanged = true;} - if (effectIntensity != seg.intensity) {seg.intensity = effectIntensity; stateChanged = true;} - if (effectPalette != seg.palette) {seg.palette = effectPalette; stateChanged = true;} - if (effectCurrent != seg.mode) {strip.setMode(i, effectCurrent); stateChanged = true;} - uint32_t col0 = RGBW32( col[0], col[1], col[2], col[3]); - uint32_t col1 = RGBW32(colSec[0], colSec[1], colSec[2], colSec[3]); - if (col0 != seg.colors[0]) {seg.setColor(0, col0); stateChanged = true;} - if (col1 != seg.colors[1]) {seg.setColor(1, col1); stateChanged = true;} - return stateChanged; -} void resetTimebase() { From 8c5f9b4501e1418b449f8386a2a71ef5d2c438f0 Mon Sep 17 00:00:00 2001 From: mxklb Date: Sat, 26 Nov 2022 14:41:59 +0100 Subject: [PATCH 04/12] Added missing DMX effect options and 3rd color --- wled00/e131.cpp | 53 +++++++++++++++++++++++++++---------------------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index 5b8ae81f..abf6f861 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -172,14 +172,14 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ return; break; - case DMX_MODE_EFFECT: // 11 channels [bri,effectCurrent,effectSpeed,effectIntensity,effectPalette,R,G,B,R2,G2,B2] - case DMX_MODE_EFFECT_W: // 13 channels, same as above but with extra +2 white channels [..,W,W2] - case DMX_MODE_EFFECT_SEGMENT: // 11 channels per segment; max[#] = floor[512/(11+DMXSegmentSpacing)] = 46,42,39, .. - case DMX_MODE_EFFECT_SEGMENT_W: // 13 Channels per segment; max[#] = floor[512/(13+DMXSegmentSpacing)] = 39,36,34,32, .. + case DMX_MODE_EFFECT: // 15 channels [bri,effectCurrent,effectSpeed,effectIntensity,effectPalette,effectOption,R,G,B,R2,G2,B2,R3,G3,B3] + case DMX_MODE_EFFECT_W: // 18 channels, same as above but with extra +3 white channels [..,W,W2,W3] + case DMX_MODE_EFFECT_SEGMENT: // 15 channels per segment; max[#] = floor[512/(11+DMXSegmentSpacing)] = 46,42,39, .. + case DMX_MODE_EFFECT_SEGMENT_W: // 18 Channels per segment; max[#] = floor[512/(13+DMXSegmentSpacing)] = 39,36,34,32, .. { if (uni != e131Universe) return; bool isSegmentMode = DMXMode == DMX_MODE_EFFECT_SEGMENT || DMXMode == DMX_MODE_EFFECT_SEGMENT_W; - uint8_t dmxEffectChannels = (DMXMode == DMX_MODE_EFFECT || DMXMode == DMX_MODE_EFFECT_SEGMENT) ? 11 : 13; + uint8_t dmxEffectChannels = (DMXMode == DMX_MODE_EFFECT || DMXMode == DMX_MODE_EFFECT_SEGMENT) ? 15 : 18; for (uint8_t id = 0; id < strip.getSegmentsNum(); id++) { Segment& seg = strip.getSegment(id); if (isSegmentMode) @@ -194,25 +194,34 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ return; if (e131_data[dataOffset+1] < strip.getModeCount()) - if (e131_data[dataOffset+1] != seg.mode) {strip.setMode(id, e131_data[dataOffset+1]); stateChanged = true;} - if (e131_data[dataOffset+2] != seg.speed) {seg.speed = e131_data[dataOffset+2]; stateChanged = true;} - if (e131_data[dataOffset+3] != seg.intensity) {seg.intensity = e131_data[dataOffset+3]; stateChanged = true;} - if (e131_data[dataOffset+4] != seg.palette) {seg.palette = e131_data[dataOffset+4]; stateChanged = true;} + if (e131_data[dataOffset+1] != seg.mode) seg.setMode( e131_data[dataOffset+1]); + if (e131_data[dataOffset+2] != seg.speed) seg.speed = e131_data[dataOffset+2]; + if (e131_data[dataOffset+3] != seg.intensity) seg.intensity = e131_data[dataOffset+3]; + if (e131_data[dataOffset+4] != seg.palette) seg.setPalette(e131_data[dataOffset+4]); - uint32_t colors[2]; - byte whites[2] = {0,0}; - if (dmxEffectChannels == 13) { - whites[0] = e131_data[dataOffset+11]; - whites[1] = e131_data[dataOffset+12]; + uint8_t segOption = (uint8_t)floor(e131_data[dataOffset+5]/64.0); + if (segOption == 0 && (seg.mirror || seg.reverse )) {seg.setOption(SEG_OPTION_MIRROR, false); seg.setOption(SEG_OPTION_REVERSED, false);} + if (segOption == 1 && (seg.mirror || !seg.reverse)) {seg.setOption(SEG_OPTION_MIRROR, false); seg.setOption(SEG_OPTION_REVERSED, true);} + if (segOption == 2 && (!seg.mirror || seg.reverse )) {seg.setOption(SEG_OPTION_MIRROR, true); seg.setOption(SEG_OPTION_REVERSED, false);} + if (segOption == 3 && (!seg.mirror || !seg.reverse)) {seg.setOption(SEG_OPTION_MIRROR, true); seg.setOption(SEG_OPTION_REVERSED, true);} + + uint32_t colors[3]; + byte whites[3] = {0,0,0}; + if (dmxEffectChannels == 18) { + whites[0] = e131_data[dataOffset+15]; + whites[1] = e131_data[dataOffset+16]; + whites[2] = e131_data[dataOffset+17]; } - colors[0] = RGBW32(e131_data[dataOffset+5], e131_data[dataOffset+6], e131_data[dataOffset+ 7], whites[0]); - colors[1] = RGBW32(e131_data[dataOffset+8], e131_data[dataOffset+9], e131_data[dataOffset+10], whites[1]); - if (colors[0] != seg.colors[0]) {seg.setColor(0, colors[0]); stateChanged = true;} - if (colors[1] != seg.colors[1]) {seg.setColor(1, colors[1]); stateChanged = true;} + colors[0] = RGBW32(e131_data[dataOffset+ 6], e131_data[dataOffset+ 7], e131_data[dataOffset+ 8], whites[0]); + colors[1] = RGBW32(e131_data[dataOffset+ 9], e131_data[dataOffset+10], e131_data[dataOffset+11], whites[1]); + colors[2] = RGBW32(e131_data[dataOffset+12], e131_data[dataOffset+13], e131_data[dataOffset+14], whites[2]); + if (colors[0] != seg.colors[0]) seg.setColor(0, colors[0]); + if (colors[1] != seg.colors[1]) seg.setColor(1, colors[1]); + if (colors[2] != seg.colors[2]) seg.setColor(2, colors[2]); // Set segment opacity or global brightness if (isSegmentMode) { - if (e131_data[dataOffset] != seg.opacity) {seg.opacity = e131_data[dataOffset]; stateChanged = true;} + if (e131_data[dataOffset] != seg.opacity) seg.setOpacity(e131_data[dataOffset]); } else if ( id == strip.getSegmentsNum()-1 ) { if (bri != e131_data[dataOffset]) { bri = e131_data[dataOffset]; @@ -220,11 +229,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ } } } - if (stateChanged) { - transitionDelayTemp = 0; // act fast - stateUpdated(CALL_MODE_NOTIFICATION); // don't send UDP - return; // don't activate realtime live mode - } + return; break; } From 507e198b7095f709175fa948b23e5b663dae1b12 Mon Sep 17 00:00:00 2001 From: mxklb Date: Sat, 26 Nov 2022 17:22:03 +0100 Subject: [PATCH 05/12] Minor cleanups --- wled00/e131.cpp | 4 ++-- wled00/wled.h | 1 - 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index abf6f861..f54ba99a 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -174,8 +174,8 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ case DMX_MODE_EFFECT: // 15 channels [bri,effectCurrent,effectSpeed,effectIntensity,effectPalette,effectOption,R,G,B,R2,G2,B2,R3,G3,B3] case DMX_MODE_EFFECT_W: // 18 channels, same as above but with extra +3 white channels [..,W,W2,W3] - case DMX_MODE_EFFECT_SEGMENT: // 15 channels per segment; max[#] = floor[512/(11+DMXSegmentSpacing)] = 46,42,39, .. - case DMX_MODE_EFFECT_SEGMENT_W: // 18 Channels per segment; max[#] = floor[512/(13+DMXSegmentSpacing)] = 39,36,34,32, .. + case DMX_MODE_EFFECT_SEGMENT: // 15 channels per segment; max[#] = floor[512/(11+DMXSegmentSpacing)] + case DMX_MODE_EFFECT_SEGMENT_W: // 18 Channels per segment; max[#] = floor[512/(13+DMXSegmentSpacing)] { if (uni != e131Universe) return; bool isSegmentMode = DMXMode == DMX_MODE_EFFECT_SEGMENT || DMXMode == DMX_MODE_EFFECT_SEGMENT_W; diff --git a/wled00/wled.h b/wled00/wled.h index c8625e76..33c8e91e 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -510,7 +510,6 @@ WLED_GLOBAL byte briOld _INIT(0); // global brightnes w WLED_GLOBAL byte briT _INIT(0); // global brightness during transition WLED_GLOBAL byte briLast _INIT(128); // brightness before turned off. Used for toggle function WLED_GLOBAL byte whiteLast _INIT(128); // white channel before turned off. Used for toggle function -WLED_GLOBAL byte opacity _INIT(128); // global segment opacity (set) // button WLED_GLOBAL bool buttonPublishMqtt _INIT(false); From f38747aa28688e849c0336341b2f85ae9200ea00 Mon Sep 17 00:00:00 2001 From: mxklb Date: Fri, 9 Dec 2022 02:10:39 +0100 Subject: [PATCH 06/12] Fixed bug: Last segment in universe skipped --- wled00/e131.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index f54ba99a..bdd1ba1c 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -190,7 +190,7 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ if (protocol == P_ARTNET && dataOffset > 0) dataOffset--; // Skip out of universe addresses - if (dataOffset > dmxChannels - dmxEffectChannels) + if (dataOffset > dmxChannels - dmxEffectChannels + 1) return; if (e131_data[dataOffset+1] < strip.getModeCount()) From c51dbae8b6750b7ca6e66f59f9aca793d6fe2936 Mon Sep 17 00:00:00 2001 From: mxklb Date: Wed, 14 Dec 2022 22:55:42 +0100 Subject: [PATCH 07/12] Removed bad code comments --- wled00/e131.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wled00/e131.cpp b/wled00/e131.cpp index bdd1ba1c..8c69f376 100644 --- a/wled00/e131.cpp +++ b/wled00/e131.cpp @@ -174,8 +174,8 @@ void handleE131Packet(e131_packet_t* p, IPAddress clientIP, byte protocol){ case DMX_MODE_EFFECT: // 15 channels [bri,effectCurrent,effectSpeed,effectIntensity,effectPalette,effectOption,R,G,B,R2,G2,B2,R3,G3,B3] case DMX_MODE_EFFECT_W: // 18 channels, same as above but with extra +3 white channels [..,W,W2,W3] - case DMX_MODE_EFFECT_SEGMENT: // 15 channels per segment; max[#] = floor[512/(11+DMXSegmentSpacing)] - case DMX_MODE_EFFECT_SEGMENT_W: // 18 Channels per segment; max[#] = floor[512/(13+DMXSegmentSpacing)] + case DMX_MODE_EFFECT_SEGMENT: // 15 channels per segment; + case DMX_MODE_EFFECT_SEGMENT_W: // 18 Channels per segment; { if (uni != e131Universe) return; bool isSegmentMode = DMXMode == DMX_MODE_EFFECT_SEGMENT || DMXMode == DMX_MODE_EFFECT_SEGMENT_W; From d78bef72eaddfd287000b63156ddf94de769ba5e Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Thu, 12 Jan 2023 20:35:34 +0100 Subject: [PATCH 08/12] Disable MQTT more. Disable Alexa more. --- .../Animated_Staircase/Animated_Staircase.h | 4 ++++ usermods/BH1750_v2/usermod_bh1750.h | 6 ++++++ usermods/BME280_v2/usermod_bme280.h | 4 ++++ usermods/Battery/usermod_v2_Battery.h | 2 ++ usermods/DHT/usermod_dht.h | 4 ++++ .../usermod.cpp | 4 ++++ .../usermod_bme280.cpp | 4 ++++ .../usermod_PIR_sensor_switch.h | 4 ++++ .../usermod_sn_photoresistor.h | 2 ++ .../Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h | 4 ++++ usermods/Temperature/usermod_temperature.h | 6 ++++++ .../usermod.cpp | 2 ++ .../usermod_bme280.cpp | 2 ++ usermods/boblight/boblight.h | 2 ++ usermods/multi_relay/usermod_multi_relay.h | 4 ++++ .../usermod_v2_SensorsToMqtt.h | 4 ++++ .../usermod_v2_seven_segment_display.h | 4 ++++ .../usermod_seven_segment_reloaded.h | 4 ++++ usermods/sht/usermod_sht.h | 4 ++++ usermods/smartnest/usermod_smartnest.h | 4 ++++ wled00/button.cpp | 8 ++++++++ wled00/fcn_declare.h | 5 ++--- wled00/led.cpp | 2 ++ wled00/mqtt.cpp | 4 ---- wled00/set.cpp | 2 ++ wled00/wled.cpp | 12 ++++++++++++ wled00/wled.h | 19 +++++++++++++------ 27 files changed, 113 insertions(+), 13 deletions(-) diff --git a/usermods/Animated_Staircase/Animated_Staircase.h b/usermods/Animated_Staircase/Animated_Staircase.h index 1ef2c959..151cf1d4 100644 --- a/usermods/Animated_Staircase/Animated_Staircase.h +++ b/usermods/Animated_Staircase/Animated_Staircase.h @@ -92,12 +92,14 @@ class Animated_Staircase : public Usermod { static const char _bottomEchoCm[]; void publishMqtt(bool bottom, const char* state) { +#ifndef WLED_DISABLE_MQTT //Check if MQTT Connected, otherwise it will crash the 8266 if (WLED_MQTT_CONNECTED){ char subuf[64]; sprintf_P(subuf, PSTR("%s/motion/%d"), mqttDeviceTopic, (int)bottom); mqtt->publish(subuf, 0, false, state); } +#endif } void updateSegments() { @@ -345,6 +347,7 @@ class Animated_Staircase : public Usermod { uint16_t getId() { return USERMOD_ID_ANIMATED_STAIRCASE; } +#ifndef WLED_DISABLE_MQTT /** * handling of MQTT message * topic only contains stripped topic (part after /wled/MAC) @@ -382,6 +385,7 @@ class Animated_Staircase : public Usermod { mqtt->subscribe(subuf, 0); } } +#endif void addToJsonState(JsonObject& root) { JsonObject staircase = root[FPSTR(_name)]; diff --git a/usermods/BH1750_v2/usermod_bh1750.h b/usermods/BH1750_v2/usermod_bh1750.h index a69e2751..b65332bc 100644 --- a/usermods/BH1750_v2/usermod_bh1750.h +++ b/usermods/BH1750_v2/usermod_bh1750.h @@ -1,6 +1,10 @@ // force the compiler to show a warning to confirm that this file is included #warning **** Included USERMOD_BH1750 **** +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" @@ -156,6 +160,7 @@ public: { lastLux = lux; lastSend = millis(); +#ifndef WLED_DISABLE_MQTT if (WLED_MQTT_CONNECTED) { if (!mqttInitialized) @@ -170,6 +175,7 @@ public: { DEBUG_PRINTLN(F("Missing MQTT connection. Not publishing data")); } +#endif } } diff --git a/usermods/BME280_v2/usermod_bme280.h b/usermods/BME280_v2/usermod_bme280.h index c27adfc8..e643e62b 100644 --- a/usermods/BME280_v2/usermod_bme280.h +++ b/usermods/BME280_v2/usermod_bme280.h @@ -1,6 +1,10 @@ // force the compiler to show a warning to confirm that this file is included #warning **** Included USERMOD_BME280 version 2.0 **** +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/usermods/Battery/usermod_v2_Battery.h b/usermods/Battery/usermod_v2_Battery.h index ac34a7e4..2dc85424 100644 --- a/usermods/Battery/usermod_v2_Battery.h +++ b/usermods/Battery/usermod_v2_Battery.h @@ -224,6 +224,7 @@ class UsermodBattery : public Usermod if (autoOffEnabled && (autoOffThreshold >= batteryLevel)) turnOff(); +#ifndef WLED_DISABLE_MQTT // SmartHome stuff // still don't know much about MQTT and/or HA if (WLED_MQTT_CONNECTED) { @@ -231,6 +232,7 @@ class UsermodBattery : public Usermod snprintf_P(buf, 63, PSTR("%s/voltage"), mqttDeviceTopic); mqtt->publish(buf, 0, false, String(voltage).c_str()); } +#endif } diff --git a/usermods/DHT/usermod_dht.h b/usermods/DHT/usermod_dht.h index 6253b85f..b6142f43 100644 --- a/usermods/DHT/usermod_dht.h +++ b/usermods/DHT/usermod_dht.h @@ -1,6 +1,10 @@ #pragma once #include "wled.h" +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #include diff --git a/usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp b/usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp index 0a2662aa..1ca16050 100644 --- a/usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp +++ b/usermods/Enclosure_with_OLED_temp_ESP07/usermod.cpp @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #include "wled.h" #include #include // from https://github.com/olikraus/u8g2/ diff --git a/usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp b/usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp index 88d49790..d5fd4a0c 100644 --- a/usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp +++ b/usermods/Enclosure_with_OLED_temp_ESP07/usermod_bme280.cpp @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #include "wled.h" #include #include // from https://github.com/olikraus/u8g2/ diff --git a/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h b/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h index f4d69996..af81170a 100644 --- a/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h +++ b/usermods/PIR_sensor_switch/usermod_PIR_sensor_switch.h @@ -159,6 +159,7 @@ private: void publishMqtt(const char* state) { + #ifndef WLED_DISABLE_MQTT //Check if MQTT Connected, otherwise it will crash the 8266 if (WLED_MQTT_CONNECTED) { char subuf[64]; @@ -166,11 +167,13 @@ private: strcat_P(subuf, PSTR("/motion")); mqtt->publish(subuf, 0, false, state); } + #endif } // Create an MQTT Binary Sensor for Home Assistant Discovery purposes, this includes a pointer to the topic that is published to in the Loop. void publishHomeAssistantAutodiscovery() { + #ifndef WLED_DISABLE_MQTT if (WLED_MQTT_CONNECTED) { StaticJsonDocument<600> doc; char uid[24], json_str[1024], buf[128]; @@ -200,6 +203,7 @@ private: mqtt->publish(buf, 0, true, json_str, payload_size); // do we really need to retain? } + #endif } /** diff --git a/usermods/SN_Photoresistor/usermod_sn_photoresistor.h b/usermods/SN_Photoresistor/usermod_sn_photoresistor.h index 9c3be7cc..60861e4c 100644 --- a/usermods/SN_Photoresistor/usermod_sn_photoresistor.h +++ b/usermods/SN_Photoresistor/usermod_sn_photoresistor.h @@ -109,6 +109,7 @@ public: { lastLDRValue = currentLDRValue; +#ifndef WLED_DISABLE_MQTT if (WLED_MQTT_CONNECTED) { char subuf[45]; @@ -121,6 +122,7 @@ public: DEBUG_PRINTLN("Missing MQTT connection. Not publishing data"); } } +#endif } uint16_t getLastLDRValue() diff --git a/usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h b/usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h index 71c22da1..4a42a7d5 100644 --- a/usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h +++ b/usermods/Si7021_MQTT_HA/usermod_si7021_mqtt_ha.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once // this is remixed from usermod_v2_SensorsToMqtt.h (sensors_to_mqtt usermod) diff --git a/usermods/Temperature/usermod_temperature.h b/usermods/Temperature/usermod_temperature.h index a666639f..8950f928 100644 --- a/usermods/Temperature/usermod_temperature.h +++ b/usermods/Temperature/usermod_temperature.h @@ -134,6 +134,7 @@ class UsermodTemperature : public Usermod { return false; } +#ifndef WLED_DISABLE_MQTT void publishHomeAssistantAutodiscovery() { if (!WLED_MQTT_CONNECTED) return; @@ -155,6 +156,7 @@ class UsermodTemperature : public Usermod { mqtt->publish(buf, 0, true, json_str, payload_size); HApublished = true; } +#endif public: @@ -212,6 +214,7 @@ class UsermodTemperature : public Usermod { } errorCount = 0; +#ifndef WLED_DISABLE_MQTT if (WLED_MQTT_CONNECTED) { char subuf[64]; strcpy(subuf, mqttDeviceTopic); @@ -227,6 +230,7 @@ class UsermodTemperature : public Usermod { // publish something else to indicate status? } } +#endif } } @@ -236,6 +240,7 @@ class UsermodTemperature : public Usermod { */ //void connected() {} +#ifndef WLED_DISABLE_MQTT /** * subscribe to MQTT topic if needed */ @@ -246,6 +251,7 @@ class UsermodTemperature : public Usermod { publishHomeAssistantAutodiscovery(); } } +#endif /* * API calls te enable data exchange between WLED modules diff --git a/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod.cpp b/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod.cpp index c7eb8ee0..78cc32a8 100644 --- a/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod.cpp +++ b/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod.cpp @@ -101,6 +101,7 @@ void userLoop() { if (temptimer - lastMeasure > 60000) { lastMeasure = temptimer; +#ifndef WLED_DISABLE_MQTT //Check if MQTT Connected, otherwise it will crash the 8266 if (mqtt != nullptr) { @@ -116,6 +117,7 @@ void userLoop() { t += "/temperature"; mqtt->publish(t.c_str(), 0, true, String(board_temperature).c_str()); } + #endif } // Check if we time interval for redrawing passes. diff --git a/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod_bme280.cpp b/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod_bme280.cpp index 05d4e77a..c9d9a527 100644 --- a/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod_bme280.cpp +++ b/usermods/Wemos_D1_mini+Wemos32_mini_shield/usermod_bme280.cpp @@ -103,6 +103,7 @@ void userLoop() { { lastMeasure = tempTimer; +#ifndef WLED_DISABLE_MQTT // Check if MQTT Connected, otherwise it will crash the 8266 if (mqtt != nullptr) { @@ -122,6 +123,7 @@ void userLoop() { h += "/humidity"; mqtt->publish(h.c_str(), 0, true, String(board_humidity).c_str()); } + #endif } // Check if we time interval for redrawing passes. diff --git a/usermods/boblight/boblight.h b/usermods/boblight/boblight.h index 263d8743..a1e25775 100644 --- a/usermods/boblight/boblight.h +++ b/usermods/boblight/boblight.h @@ -219,6 +219,7 @@ class BobLightUsermod : public Usermod { void enable(bool en) { enabled = en; } +#ifndef WLED_DISABLE_MQTT /** * handling of MQTT message * topic only contains stripped topic (part after /wled/MAC) @@ -249,6 +250,7 @@ class BobLightUsermod : public Usermod { // mqtt->subscribe(subuf, 0); //} } +#endif void addToJsonInfo(JsonObject& root) { diff --git a/usermods/multi_relay/usermod_multi_relay.h b/usermods/multi_relay/usermod_multi_relay.h index 7381a00d..b8bd4f6e 100644 --- a/usermods/multi_relay/usermod_multi_relay.h +++ b/usermods/multi_relay/usermod_multi_relay.h @@ -66,12 +66,14 @@ class MultiRelay : public Usermod { static const char _HAautodiscovery[]; void publishMqtt(int relay) { +#ifndef WLED_DISABLE_MQTT //Check if MQTT Connected, otherwise it will crash the 8266 if (WLED_MQTT_CONNECTED){ char subuf[64]; sprintf_P(subuf, PSTR("%s/relay/%d"), mqttDeviceTopic, relay); mqtt->publish(subuf, 0, false, _relay[relay].state ? "on" : "off"); } +#endif } /** @@ -232,6 +234,7 @@ class MultiRelay : public Usermod { //Functions called by WLED +#ifndef WLED_DISABLE_MQTT /** * handling of MQTT message * topic only contains stripped topic (part after /wled/MAC) @@ -313,6 +316,7 @@ class MultiRelay : public Usermod { mqtt->publish(buf, 0, true, json_str, payload_size); } } +#endif /** * setup() is called once at boot. WiFi is not yet connected at this point. diff --git a/usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h b/usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h index dd7aedc1..972e2c86 100644 --- a/usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h +++ b/usermods/sensors_to_mqtt/usermod_v2_SensorsToMqtt.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/usermods/seven_segment_display/usermod_v2_seven_segment_display.h b/usermods/seven_segment_display/usermod_v2_seven_segment_display.h index 5c0022e0..e5b726e5 100644 --- a/usermods/seven_segment_display/usermod_v2_seven_segment_display.h +++ b/usermods/seven_segment_display/usermod_v2_seven_segment_display.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h b/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h index b1a271a6..27977405 100644 --- a/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h +++ b/usermods/seven_segment_display_reloaded/usermod_seven_segment_reloaded.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/usermods/sht/usermod_sht.h b/usermods/sht/usermod_sht.h index 721cb7f0..4637d7a3 100644 --- a/usermods/sht/usermod_sht.h +++ b/usermods/sht/usermod_sht.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "SHT85.h" diff --git a/usermods/smartnest/usermod_smartnest.h b/usermods/smartnest/usermod_smartnest.h index 82673578..8d2b04ff 100644 --- a/usermods/smartnest/usermod_smartnest.h +++ b/usermods/smartnest/usermod_smartnest.h @@ -1,3 +1,7 @@ +#ifndef WLED_ENABLE_MQTT +#error "This user mod requires MQTT to be enabled." +#endif + #pragma once #include "wled.h" diff --git a/wled00/button.cpp b/wled00/button.cpp index 1be3e6df..fce21424 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -24,12 +24,14 @@ void shortPressAction(uint8_t b) applyPreset(macroButton[b], CALL_MODE_BUTTON_PRESET); } +#ifndef WLED_DISABLE_MQTT // publish MQTT message if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { char subuf[64]; sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); mqtt->publish(subuf, 0, false, "short"); } +#endif } void longPressAction(uint8_t b) @@ -43,12 +45,14 @@ void longPressAction(uint8_t b) applyPreset(macroLongPress[b], CALL_MODE_BUTTON_PRESET); } +#ifndef WLED_DISABLE_MQTT // publish MQTT message if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { char subuf[64]; sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); mqtt->publish(subuf, 0, false, "long"); } +#endif } void doublePressAction(uint8_t b) @@ -62,12 +66,14 @@ void doublePressAction(uint8_t b) applyPreset(macroDoublePress[b], CALL_MODE_BUTTON_PRESET); } +#ifndef WLED_DISABLE_MQTT // publish MQTT message if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { char subuf[64]; sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); mqtt->publish(subuf, 0, false, "double"); } +#endif } bool isButtonPressed(uint8_t i) @@ -119,6 +125,7 @@ void handleSwitch(uint8_t b) } } +#ifndef WLED_DISABLE_MQTT // publish MQTT message if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { char subuf[64]; @@ -126,6 +133,7 @@ void handleSwitch(uint8_t b) else sprintf_P(subuf, _mqtt_topic_button, mqttDeviceTopic, (int)b); mqtt->publish(subuf, 0, false, !buttonPressedBefore[b] ? "off" : "on"); } +#endif buttonLongPressed[b] = buttonPressedBefore[b]; //save the last "long term" switch state } diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 45989e58..1f7823a7 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -1,18 +1,17 @@ #ifndef WLED_FCN_DECLARE_H #define WLED_FCN_DECLARE_H -#include -#include "src/dependencies/espalexa/EspalexaDevice.h" -#include "src/dependencies/e131/ESPAsyncE131.h" /* * All globally accessible functions are declared here */ //alexa.cpp +#ifndef WLED_DISABLE_ALEXA void onAlexaChange(EspalexaDevice* dev); void alexaInit(); void handleAlexa(); void onAlexaChange(EspalexaDevice* dev); +#endif //blynk.cpp #ifndef WLED_DISABLE_BLYNK diff --git a/wled00/led.cpp b/wled00/led.cpp index e9e108e4..3c878b35 100644 --- a/wled00/led.cpp +++ b/wled00/led.cpp @@ -180,7 +180,9 @@ void handleTransitions() { //handle still pending interface update if (interfaceUpdateCallMode && millis() - lastInterfaceUpdate > INTERFACE_UPDATE_COOLDOWN) updateInterfaces(interfaceUpdateCallMode); +#ifndef WLED_DISABLE_MQTT if (doPublishMqtt) publishMqtt(); +#endif if (transitionActive && transitionDelayTemp > 0) { diff --git a/wled00/mqtt.cpp b/wled00/mqtt.cpp index 1690341b..eca9fccf 100644 --- a/wled00/mqtt.cpp +++ b/wled00/mqtt.cpp @@ -177,8 +177,4 @@ bool initMqtt() mqtt->connect(); return true; } - -#else -bool initMqtt(){return false;} -void publishMqtt(){} #endif diff --git a/wled00/set.cpp b/wled00/set.cpp index 85ed58ac..ad189f24 100644 --- a/wled00/set.cpp +++ b/wled00/set.cpp @@ -681,7 +681,9 @@ void handleSettingsSet(AsyncWebServerRequest *request, byte subPage) lastEditTime = millis(); if (subPage != 2 && !doReboot) doSerializeConfig = true; //serializeConfig(); //do not save if factory reset or LED settings (which are saved after LED re-init) + #ifndef WLED_DISABLE_ALEXA if (subPage == 4) alexaInit(); + #endif } diff --git a/wled00/wled.cpp b/wled00/wled.cpp index b78e9f6f..35894055 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -42,7 +42,9 @@ void WLED::loop() #endif handleTime(); + #ifndef WLED_DISABLE_INFRARED handleIR(); // 2nd call to function needed for ESP32 to return valid results -- should be good for ESP8266, too + #endif handleConnection(); handleSerial(); handleNotifications(); @@ -64,7 +66,9 @@ void WLED::loop() yield(); handleIO(); + #ifndef WLED_DISABLE_INFRARED handleIR(); + #endif #ifndef WLED_DISABLE_ALEXA handleAlexa(); #endif @@ -135,7 +139,9 @@ void WLED::loop() } if (millis() - lastMqttReconnectAttempt > 30000 || lastMqttReconnectAttempt == 0) { // lastMqttReconnectAttempt==0 forces immediate broadcast lastMqttReconnectAttempt = millis(); + #ifndef WLED_DISABLE_MQTT initMqtt(); + #endif yield(); // refresh WLED nodes list refreshNodeList(); @@ -414,8 +420,10 @@ void WLED::setup() // fill in unique mdns default if (strcmp(cmDNS, "x") == 0) sprintf_P(cmDNS, PSTR("wled-%*s"), 6, escapedMac.c_str() + 6); +#ifndef WLED_DISABLE_MQTT if (mqttDeviceTopic[0] == 0) sprintf_P(mqttDeviceTopic, PSTR("wled/%*s"), 6, escapedMac.c_str() + 6); if (mqttClientID[0] == 0) sprintf_P(mqttClientID, PSTR("WLED-%*s"), 6, escapedMac.c_str() + 6); +#endif #ifdef WLED_ENABLE_ADALIGHT if (Serial.available() > 0 && Serial.peek() == 'I') handleImprovPacket(); @@ -674,9 +682,11 @@ void WLED::initInterfaces() } #endif +#ifndef WLED_DISABLE_ALEXA // init Alexa hue emulation if (alexaEnabled) alexaInit(); +#endif #ifndef WLED_DISABLE_OTA if (aOtaEnabled) @@ -715,7 +725,9 @@ void WLED::initInterfaces() e131.begin(e131Multicast, e131Port, e131Universe, E131_MAX_UNIVERSE_COUNT); ddp.begin(false, DDP_DEFAULT_PORT); reconnectHue(); +#ifndef WLED_DISABLE_MQTT initMqtt(); +#endif interfacesInited = true; wasConnected = true; } diff --git a/wled00/wled.h b/wled00/wled.h index 3e6fbe49..ef430a2b 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -121,6 +121,7 @@ #define ESPALEXA_MAXDEVICES 10 // #define ESPALEXA_DEBUG #include "src/dependencies/espalexa/Espalexa.h" + #include "src/dependencies/espalexa/EspalexaDevice.h" #endif #ifndef WLED_DISABLE_BLYNK #include "src/dependencies/blynk/BlynkSimpleEsp.h" @@ -135,7 +136,9 @@ #endif #include "src/dependencies/e131/ESPAsyncE131.h" +#ifdef WLED_ENABLE_MQTT #include "src/dependencies/async-mqtt-client/AsyncMqttClient.h" +#endif #define ARDUINOJSON_DECODE_UNICODE 0 #include "src/dependencies/json/AsyncJson-v6.h" @@ -407,7 +410,12 @@ WLED_GLOBAL bool e131Multicast _INIT(false); // multicast o WLED_GLOBAL bool e131SkipOutOfSequence _INIT(false); // freeze instead of flickering WLED_GLOBAL uint16_t pollReplyCount _INIT(0); // count number of replies for ArtPoll node report +// mqtt +WLED_GLOBAL unsigned long lastMqttReconnectAttempt _INIT(0); // used for other periodic tasks too +#ifndef WLED_DISABLE_MQTT +WLED_GLOBAL AsyncMqttClient *mqtt _INIT(NULL); WLED_GLOBAL bool mqttEnabled _INIT(false); +WLED_GLOBAL char mqttStatusTopic[40] _INIT(""); // this must be global because of async handlers WLED_GLOBAL char mqttDeviceTopic[33] _INIT(""); // main MQTT topic (individual per device, default is wled/mac) WLED_GLOBAL char mqttGroupTopic[33] _INIT("wled/all"); // second MQTT topic (for example to group devices) WLED_GLOBAL char mqttServer[33] _INIT(""); // both domains and IPs should work (no SSL) @@ -415,6 +423,10 @@ WLED_GLOBAL char mqttUser[41] _INIT(""); // optional: username WLED_GLOBAL char mqttPass[65] _INIT(""); // optional: password for MQTT auth WLED_GLOBAL char mqttClientID[41] _INIT(""); // override the client ID WLED_GLOBAL uint16_t mqttPort _INIT(1883); +#define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected()) +#else +#define WLED_MQTT_CONNECTED false +#endif #ifndef WLED_DISABLE_HUESYNC WLED_GLOBAL bool huePollingEnabled _INIT(false); // poll hue bridge for light state @@ -590,11 +602,8 @@ WLED_GLOBAL uint8_t tpmPacketCount _INIT(0); WLED_GLOBAL uint16_t tpmPayloadFrameSize _INIT(0); WLED_GLOBAL bool useMainSegmentOnly _INIT(false); -// mqtt -WLED_GLOBAL unsigned long lastMqttReconnectAttempt _INIT(0); WLED_GLOBAL unsigned long lastInterfaceUpdate _INIT(0); WLED_GLOBAL byte interfaceUpdateCallMode _INIT(CALL_MODE_INIT); -WLED_GLOBAL char mqttStatusTopic[40] _INIT(""); // this must be global because of async handlers // alexa udp WLED_GLOBAL String escapedMac; @@ -655,8 +664,7 @@ WLED_GLOBAL AsyncWebServer server _INIT_N(((80))); #ifdef WLED_ENABLE_WEBSOCKETS WLED_GLOBAL AsyncWebSocket ws _INIT_N((("/ws"))); #endif -WLED_GLOBAL AsyncClient* hueClient _INIT(NULL); -WLED_GLOBAL AsyncMqttClient* mqtt _INIT(NULL); +WLED_GLOBAL AsyncClient *hueClient _INIT(NULL); WLED_GLOBAL AsyncWebHandler *editHandler _INIT(nullptr); // udp interface objects @@ -766,7 +774,6 @@ WLED_GLOBAL volatile uint8_t jsonBufferLock _INIT(0); #define WLED_CONNECTED (WiFi.status() == WL_CONNECTED) #endif #define WLED_WIFI_CONFIGURED (strlen(clientSSID) >= 1 && strcmp(clientSSID, DEFAULT_CLIENT_SSID) != 0) -#define WLED_MQTT_CONNECTED (mqtt != nullptr && mqtt->connected()) #ifndef WLED_AP_SSID_UNIQUE #define WLED_SET_AP_SSID() do { \ From 115c17ab902457e86bf28153ee01a460e7d1496a Mon Sep 17 00:00:00 2001 From: mxklb Date: Mon, 16 Jan 2023 17:30:55 +0100 Subject: [PATCH 09/12] Corrected wrong comments --- wled00/const.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/wled00/const.h b/wled00/const.h index dcc127fa..cb2353f2 100644 --- a/wled00/const.h +++ b/wled00/const.h @@ -169,13 +169,13 @@ #define DMX_MODE_DISABLED 0 //not used #define DMX_MODE_SINGLE_RGB 1 //all LEDs same RGB color (3 channels) #define DMX_MODE_SINGLE_DRGB 2 //all LEDs same RGB color and master dimmer (4 channels) -#define DMX_MODE_EFFECT 3 //trigger standalone effects of WLED (11 channels) -#define DMX_MODE_EFFECT_W 7 //trigger standalone effects of WLED (13 channels) +#define DMX_MODE_EFFECT 3 //trigger standalone effects of WLED (15 channels) +#define DMX_MODE_EFFECT_W 7 //trigger standalone effects of WLED (18 channels) #define DMX_MODE_MULTIPLE_RGB 4 //every LED is addressed with its own RGB (ledCount * 3 channels) #define DMX_MODE_MULTIPLE_DRGB 5 //every LED is addressed with its own RGB and share a master dimmer (ledCount * 3 + 1 channels) #define DMX_MODE_MULTIPLE_RGBW 6 //every LED is addressed with its own RGBW (ledCount * 4 channels) -#define DMX_MODE_EFFECT_SEGMENT 8 //trigger standalone effects of WLED (11 channels per segement) -#define DMX_MODE_EFFECT_SEGMENT_W 9 //trigger standalone effects of WLED (13 channels per segement) +#define DMX_MODE_EFFECT_SEGMENT 8 //trigger standalone effects of WLED (15 channels per segement) +#define DMX_MODE_EFFECT_SEGMENT_W 9 //trigger standalone effects of WLED (18 channels per segement) #define DMX_MODE_PRESET 10 //apply presets (1 channel) //Light capability byte (unused) 0bRCCCTTTT From 4147d6c67e5cd1ed0945df111a2ffa43912905c9 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 16 Jan 2023 18:53:52 +0100 Subject: [PATCH 10/12] FX: GameOfLife - better glider detection - correct behaviour during transition - optimisations --- wled00/FX.cpp | 45 ++++++++++++++++++++++++--------------------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/wled00/FX.cpp b/wled00/FX.cpp index 139c0c3a..cfd5d170 100644 --- a/wled00/FX.cpp +++ b/wled00/FX.cpp @@ -4835,7 +4835,7 @@ static const char _data_FX_MODE_2DFRIZZLES[] PROGMEM = "Frizzles@X frequency,Y f /////////////////////////////////////////// typedef struct ColorCount { CRGB color; - int8_t count; + int8_t count; } colorCount; uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https://natureofcode.com/book/chapter-7-cellular-automata/ and https://github.com/DougHaber/nlife-color @@ -4844,17 +4844,18 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: const uint16_t cols = SEGMENT.virtualWidth(); const uint16_t rows = SEGMENT.virtualHeight(); const uint16_t dataSize = sizeof(CRGB) * SEGMENT.length(); // using width*height prevents reallocation if mirroring is enabled + const uint16_t crcBufferLen = (SEGMENT.width() + SEGMENT.height())*71/100; // roughly sqrt(2)/2 for better repetition detection (Ewowi) - if (!SEGENV.allocateData(dataSize + sizeof(unsigned long))) return mode_static(); //allocation failed + if (!SEGENV.allocateData(dataSize + sizeof(uint16_t)*crcBufferLen)) return mode_static(); //allocation failed CRGB *prevLeds = reinterpret_cast(SEGENV.data); - unsigned long *resetMillis = reinterpret_cast(SEGENV.data + dataSize); // triggers reset + uint16_t *crcBuffer = reinterpret_cast(SEGENV.data + dataSize); CRGB backgroundColor = SEGCOLOR(1); - if (SEGENV.call == 0 || strip.now - *resetMillis > 5000) { - *resetMillis = strip.now; - - random16_set_seed(strip.now); //seed the random generator + if (SEGENV.call == 0 || strip.now - SEGMENT.step > 5000) { + SEGENV.step = strip.now; + SEGENV.aux0 = 0; + random16_set_seed(millis()>>2); //seed the random generator //give the leds random state and colors (based on intensity, colors from palette or all posible colors are chosen) for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) { @@ -4862,17 +4863,18 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: if (state == 0) SEGMENT.setPixelColorXY(x,y, backgroundColor); else - SEGMENT.setPixelColorXY(x,y, SEGMENT.color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 0)); + SEGMENT.setPixelColorXY(x,y, SEGMENT.color_from_palette(random8(), false, PALETTE_SOLID_WRAP, 255)); } for (int y = 0; y < rows; y++) for (int x = 0; x < cols; x++) prevLeds[XY(x,y)] = CRGB::Black; - - - SEGENV.aux1 = 0; - SEGENV.aux0 = 0xFFFF; + memset(crcBuffer, 0, sizeof(uint16_t)*crcBufferLen); + } else if (strip.now - SEGENV.step < FRAMETIME_FIXED * map(SEGMENT.speed,0,255,64,4)) { + // update only when appropriate time passes (in 42 FPS slots) + return FRAMETIME; } //copy previous leds (save previous generation) + //NOTE: using lossy getPixelColor() is a benefit as endlessly repeating patterns will eventually fade out causing a reset for (int x = 0; x < cols; x++) for (int y = 0; y < rows; y++) prevLeds[XY(x,y)] = SEGMENT.getPixelColorXY(x,y); //calculate new leds @@ -4909,8 +4911,8 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: uint32_t bgc = RGBW32(backgroundColor.r, backgroundColor.g, backgroundColor.b, 0); if ((col != bgc) && (neighbors < 2)) SEGMENT.setPixelColorXY(x,y, bgc); // Loneliness else if ((col != bgc) && (neighbors > 3)) SEGMENT.setPixelColorXY(x,y, bgc); // Overpopulation - else if ((col == bgc) && (neighbors == 3)) { // Reproduction - //find dominantcolor and assign to cell + else if ((col == bgc) && (neighbors == 3)) { // Reproduction + //find dominant color and assign to cell colorCount dominantColorCount = {backgroundColor, 0}; for (int i=0; i<9 && colorsCount[i].count != 0; i++) if (colorsCount[i].count > dominantColorCount.count) dominantColorCount = colorsCount[i]; @@ -4920,16 +4922,17 @@ uint16_t mode_2Dgameoflife(void) { // Written by Ewoud Wijma, inspired by https: } //x,y // calculate CRC16 of leds - uint16_t crc = crc16((const unsigned char*)prevLeds, dataSize-1); //ewowi: prevLeds instead of leds work as well, tbd: compare more patterns, see SR! - + uint16_t crc = crc16((const unsigned char*)prevLeds, dataSize); // check if we had same CRC and reset if needed + bool repetition = false; + for (int i=0; i>1)); // update only when appropriate time passes (in 42 FPS slots) + return FRAMETIME; } // mode_2Dgameoflife() static const char _data_FX_MODE_2DGAMEOFLIFE[] PROGMEM = "Game Of Life@!;!,!;!;2"; From ef6a9184baabb67b3dc0082d25f9b550395bfdb7 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 16 Jan 2023 21:55:12 +0100 Subject: [PATCH 11/12] A few more flash bytes saved. --- wled00/wled_server.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/wled00/wled_server.cpp b/wled00/wled_server.cpp index 8051751d..d235b61e 100644 --- a/wled00/wled_server.cpp +++ b/wled00/wled_server.cpp @@ -599,10 +599,14 @@ void serveSettings(AsyncWebServerRequest* request, bool post) case 4: response = request->beginResponse_P(200, "text/html", PAGE_settings_sync, PAGE_settings_sync_length); break; case 5: response = request->beginResponse_P(200, "text/html", PAGE_settings_time, PAGE_settings_time_length); break; case 6: response = request->beginResponse_P(200, "text/html", PAGE_settings_sec, PAGE_settings_sec_length); break; +#ifdef WLED_ENABLE_DMX case 7: response = request->beginResponse_P(200, "text/html", PAGE_settings_dmx, PAGE_settings_dmx_length); break; +#endif case 8: response = request->beginResponse_P(200, "text/html", PAGE_settings_um, PAGE_settings_um_length); break; case 9: response = request->beginResponse_P(200, "text/html", PAGE_update, PAGE_update_length); break; +#ifndef WLED_DISABLE_2D case 10: response = request->beginResponse_P(200, "text/html", PAGE_settings_2D, PAGE_settings_2D_length); break; +#endif case 251: { correctPIN = !strlen(settingsPIN); // lock if a pin is set createEditHandler(correctPIN); From dd08751f3fceb85ce8c887e40d4fc3e6c77e168f Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Mon, 16 Jan 2023 22:09:43 +0100 Subject: [PATCH 12/12] Hide 2D if not compiled. --- wled00/data/settings.htm | 4 +- wled00/html_settings.h | 102 +++++++++++++++++++-------------------- wled00/xml.cpp | 3 ++ 3 files changed, 56 insertions(+), 53 deletions(-) diff --git a/wled00/data/settings.htm b/wled00/data/settings.htm index 3032959d..dc8e3838 100644 --- a/wled00/data/settings.htm +++ b/wled00/data/settings.htm @@ -68,9 +68,9 @@ - + - + diff --git a/wled00/html_settings.h b/wled00/html_settings.h index f21b6330..a05d0803 100644 --- a/wled00/html_settings.h +++ b/wled00/html_settings.h @@ -65,70 +65,70 @@ const uint8_t PAGE_settingsCss[] PROGMEM = { // Autogenerated from wled00/data/settings.htm, do not edit!! -const uint16_t PAGE_settings_length = 985; +const uint16_t PAGE_settings_length = 992; const uint8_t PAGE_settings[] PROGMEM = { 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0xad, 0x56, 0x6d, 0x6f, 0xdb, 0x36, 0x10, 0xfe, 0xee, 0x5f, 0xc1, 0xb0, 0x58, 0x23, 0xa1, 0xb2, 0xec, 0x38, 0xc3, 0xb0, 0xc9, 0x96, - 0x8b, 0x35, 0x2f, 0x9d, 0x87, 0x04, 0x0d, 0x90, 0xa4, 0xdd, 0x80, 0x7d, 0xa1, 0xc9, 0x93, 0xcc, - 0x46, 0x22, 0x05, 0xf2, 0xe4, 0xc4, 0x73, 0xf3, 0xdf, 0x77, 0x94, 0x9d, 0xb7, 0x36, 0xd8, 0x8a, - 0x21, 0x5f, 0x6c, 0xf3, 0x78, 0x7c, 0x78, 0xf7, 0x3c, 0xcf, 0x11, 0x9e, 0xec, 0x1c, 0x7e, 0x38, - 0xb8, 0xf8, 0xf3, 0xec, 0x88, 0x2d, 0xb0, 0xae, 0xa6, 0x93, 0xf0, 0xc9, 0x2a, 0x61, 0xca, 0x9c, + 0x8b, 0x35, 0x2f, 0x9b, 0x87, 0x04, 0x0d, 0x90, 0xa4, 0xdd, 0x80, 0x7d, 0xa1, 0xc9, 0x93, 0xcc, + 0x46, 0x22, 0x05, 0xf2, 0xe4, 0xc4, 0x73, 0xf3, 0xdf, 0x77, 0x94, 0x9d, 0xb7, 0x26, 0x18, 0x86, + 0x22, 0x5f, 0x6c, 0xf3, 0x78, 0x7c, 0x78, 0xcf, 0x73, 0xcf, 0x11, 0x9e, 0xec, 0x1c, 0x7e, 0x3c, + 0xb8, 0xf8, 0xeb, 0xec, 0x88, 0x2d, 0xb0, 0xae, 0xa6, 0x93, 0xf0, 0xc9, 0x2a, 0x61, 0xca, 0x9c, 0x83, 0xe1, 0xb4, 0x06, 0xa1, 0xa6, 0x93, 0x1a, 0x50, 0x30, 0xb9, 0x10, 0xce, 0x03, 0xe6, 0xfc, 0xf2, 0xe2, 0xb8, 0xff, 0x33, 0xdf, 0x46, 0x7b, 0xd2, 0x1a, 0x04, 0x43, 0xe1, 0x6b, 0xad, 0x70, 0x91, 0x2b, 0x58, 0x6a, 0x09, 0xfd, 0x6e, 0x91, 0x68, 0xa3, 0x51, 0x8b, 0xaa, 0xef, 0xa5, 0xa8, 0x20, 0xdf, 0x4b, 0x6a, 0x71, 0xa3, 0xeb, 0xb6, 0xbe, 0x5f, 0xb7, 0x1e, 0x5c, 0xb7, 0x10, 0x73, 0x5a, 0x1b, 0xcb, 0x59, 0xcf, 0x88, 0x1a, 0x72, 0xbe, 0xd4, 0x70, 0xdd, 0x58, 0x87, 0x74, 0x0b, - 0x6a, 0xac, 0x60, 0xfa, 0xe9, 0xe4, 0xe8, 0x90, 0x9d, 0x03, 0xa2, 0x36, 0xa5, 0x9f, 0x0c, 0x36, + 0x6a, 0xac, 0x60, 0xfa, 0xf9, 0xe4, 0xe8, 0x90, 0x9d, 0x03, 0xa2, 0x36, 0xa5, 0x9f, 0x0c, 0x36, 0xc1, 0x89, 0x97, 0x4e, 0x37, 0x38, 0xed, 0x2d, 0x85, 0x63, 0x95, 0x95, 0xba, 0x49, 0x54, 0xae, 0xac, 0x6c, 0x6b, 0x2a, 0x28, 0xa1, 0x40, 0xbe, 0xb3, 0x37, 0x2e, 0x5a, 0x23, 0x51, 0x5b, 0xc3, 0xca, 0x99, 0x8a, 0x30, 0x5e, 0x3b, 0xc0, 0xd6, 0x19, 0xa6, 0xd2, 0x12, 0xf0, 0xa8, 0x82, 0x90, - 0xfa, 0x6e, 0xd5, 0x6d, 0xdd, 0xde, 0xa7, 0x56, 0x56, 0xa8, 0xdf, 0xcf, 0x23, 0x4c, 0x20, 0xdf, + 0xfa, 0x61, 0xd5, 0x6d, 0xdd, 0xde, 0xa7, 0x56, 0x56, 0xa8, 0x3f, 0xce, 0x23, 0x4c, 0x20, 0xdf, 0x19, 0xc6, 0xeb, 0x0a, 0x90, 0xd9, 0x5c, 0xa5, 0xd2, 0x81, 0x40, 0xd8, 0x1e, 0x8a, 0xf8, 0xe6, - 0x76, 0x1e, 0x8f, 0x6d, 0x4a, 0xbc, 0xfc, 0x8a, 0xe8, 0xf4, 0xbc, 0x45, 0xa0, 0x0d, 0x27, 0x79, - 0x82, 0x71, 0xf2, 0x75, 0x1c, 0x57, 0x0d, 0xf0, 0x84, 0x23, 0xdc, 0xe0, 0xe0, 0xb3, 0x58, 0x8a, - 0x3b, 0x80, 0x6f, 0x12, 0x85, 0x5f, 0x19, 0x82, 0x80, 0x38, 0x51, 0xe9, 0xdc, 0xaa, 0x55, 0x2a, - 0x9a, 0x06, 0x8c, 0x3a, 0x58, 0xe8, 0x4a, 0x45, 0x36, 0xe4, 0x0b, 0xa5, 0x8e, 0x96, 0x54, 0xc5, - 0x89, 0xf6, 0xc4, 0x3e, 0xb8, 0x88, 0x87, 0x9a, 0x79, 0x12, 0xc5, 0xf9, 0x74, 0xfd, 0x1e, 0xf0, - 0x63, 0x14, 0xdf, 0x3e, 0x9f, 0x07, 0xce, 0x59, 0x47, 0xe5, 0x51, 0x1e, 0x49, 0xe7, 0x6d, 0x05, - 0x69, 0x65, 0xcb, 0x88, 0x1f, 0x85, 0x38, 0xdb, 0x36, 0x4f, 0x2c, 0xb3, 0x42, 0x57, 0xd0, 0xb5, - 0x41, 0x5a, 0x39, 0x6a, 0xf7, 0x64, 0x1b, 0xb7, 0x05, 0xa3, 0x83, 0x85, 0x2e, 0x5b, 0x27, 0x3a, - 0xb6, 0x36, 0x6d, 0xb0, 0x42, 0xd0, 0x01, 0x95, 0xfe, 0x65, 0x66, 0x46, 0xda, 0xba, 0x21, 0xd2, - 0x80, 0x35, 0xa2, 0x04, 0xa6, 0x04, 0x8a, 0x1d, 0x4e, 0xf5, 0x3c, 0x10, 0x7c, 0x1e, 0xc5, 0x6b, - 0x1e, 0x2e, 0xc8, 0x78, 0x9e, 0x5f, 0x6b, 0xa3, 0xec, 0x35, 0x55, 0x21, 0x3b, 0xbc, 0xb4, 0x71, - 0x16, 0xad, 0xb4, 0xd5, 0xeb, 0xd7, 0x51, 0xa7, 0xe1, 0x30, 0x89, 0x3a, 0x71, 0xf3, 0x90, 0x51, - 0x9d, 0xa3, 0x75, 0x84, 0x1a, 0xe4, 0x9b, 0x21, 0xd4, 0xa1, 0x71, 0x39, 0x6b, 0x78, 0x1c, 0x7f, - 0xf9, 0xb2, 0x4d, 0xa3, 0xf3, 0x75, 0x43, 0x05, 0x1f, 0x13, 0x3e, 0x3b, 0xb5, 0x0a, 0x52, 0x76, - 0x56, 0x81, 0xf0, 0xc0, 0x88, 0x08, 0x70, 0xac, 0xf3, 0xd2, 0xec, 0x8c, 0x4a, 0x4a, 0x9e, 0x20, - 0xfa, 0xa7, 0x88, 0x49, 0x87, 0x16, 0xc7, 0x21, 0xab, 0xb3, 0x43, 0x80, 0x7f, 0xcb, 0x17, 0x88, - 0x4d, 0x36, 0x18, 0xf0, 0x37, 0xdd, 0x76, 0xc6, 0x79, 0xfc, 0x86, 0x0f, 0xfc, 0xd6, 0x99, 0x03, - 0x9f, 0x7e, 0xf6, 0x6f, 0x9b, 0x7c, 0xc8, 0x93, 0x9d, 0xbd, 0xf8, 0xb6, 0x37, 0x19, 0x6c, 0x2d, - 0x3a, 0xf1, 0xb8, 0x22, 0xc7, 0xf6, 0x82, 0x9a, 0xeb, 0x60, 0x80, 0xbe, 0xa8, 0x74, 0x69, 0x32, - 0xd9, 0x95, 0x34, 0x9e, 0x0b, 0x79, 0x55, 0x3a, 0xdb, 0x1a, 0x95, 0xbd, 0x1a, 0x8d, 0x46, 0xe3, - 0x05, 0xe8, 0x72, 0x81, 0xd9, 0xde, 0x70, 0xd8, 0xdc, 0x8c, 0x6b, 0xe1, 0x4a, 0x6d, 0xb2, 0xe1, - 0x6d, 0x18, 0xce, 0x75, 0xbf, 0xbf, 0xc8, 0x7e, 0x59, 0x2e, 0x6e, 0xc9, 0x29, 0x68, 0xcd, 0xfa, - 0xf1, 0xc9, 0xfd, 0xfd, 0xfd, 0x31, 0xf1, 0x66, 0x5d, 0xf6, 0xaa, 0x28, 0x8a, 0x71, 0x41, 0x93, - 0xd9, 0x2f, 0x44, 0xad, 0xab, 0x55, 0xf6, 0x11, 0x9c, 0x12, 0x46, 0x24, 0xbf, 0x41, 0xb5, 0x04, - 0xd4, 0x52, 0x24, 0x5e, 0x18, 0xdf, 0xa7, 0xf9, 0xd3, 0xc5, 0x58, 0x69, 0xdf, 0x54, 0x62, 0x95, - 0xcd, 0xa9, 0xa5, 0xab, 0xf1, 0xdc, 0x3a, 0x05, 0x2e, 0xdb, 0x6b, 0x6e, 0x18, 0xb9, 0x43, 0x2b, + 0x76, 0x1e, 0x8f, 0x6d, 0x4a, 0xba, 0xfc, 0x8a, 0xe8, 0xf4, 0xbc, 0x45, 0xa0, 0x0d, 0x27, 0x79, + 0x82, 0x71, 0xf2, 0x6d, 0x1c, 0x57, 0x0d, 0xf0, 0x84, 0x23, 0xdc, 0xe0, 0xe0, 0x8b, 0x58, 0x8a, + 0x3b, 0x80, 0x67, 0x89, 0xc2, 0xaf, 0x0c, 0x41, 0x40, 0x9c, 0xa8, 0x74, 0x6e, 0xd5, 0x2a, 0x15, + 0x4d, 0x03, 0x46, 0x1d, 0x2c, 0x74, 0xa5, 0x22, 0x1b, 0xf2, 0x85, 0x52, 0x47, 0x4b, 0xaa, 0xe2, + 0x44, 0x7b, 0x52, 0x1f, 0x5c, 0xc4, 0x43, 0xcd, 0x3c, 0x89, 0xe2, 0x7c, 0xba, 0xfe, 0x0d, 0xf0, + 0x53, 0x14, 0xdf, 0xbe, 0x9c, 0x07, 0xce, 0x59, 0x47, 0xe5, 0x51, 0x1e, 0xb5, 0xce, 0xdb, 0x0a, + 0xd2, 0xca, 0x96, 0x11, 0x3f, 0x0a, 0x71, 0xb6, 0x25, 0x4f, 0x2a, 0xb3, 0x42, 0x57, 0xd0, 0xd1, + 0xa0, 0x5e, 0x39, 0xa2, 0x7b, 0xb2, 0x8d, 0xdb, 0x82, 0xd1, 0xc1, 0x42, 0x97, 0xad, 0x13, 0x9d, + 0x5a, 0x1b, 0x1a, 0xac, 0x10, 0x74, 0x40, 0xa5, 0x7f, 0x9b, 0x99, 0x91, 0xb6, 0x6e, 0x48, 0x34, + 0x60, 0x8d, 0x28, 0x81, 0x29, 0x81, 0x62, 0x87, 0x53, 0x3d, 0x0f, 0x02, 0x9f, 0x47, 0xf1, 0x9a, + 0x87, 0x0b, 0x32, 0x9e, 0xe7, 0xd7, 0xda, 0x28, 0x7b, 0x4d, 0x55, 0xc8, 0x0e, 0x2f, 0x6d, 0x9c, + 0x45, 0x2b, 0x6d, 0xf5, 0xf6, 0x6d, 0xd4, 0xf5, 0x70, 0x98, 0x44, 0x5d, 0x73, 0xf3, 0x90, 0x51, + 0x9d, 0xa3, 0x75, 0x84, 0x1a, 0xda, 0x37, 0x43, 0xa8, 0x03, 0x71, 0x39, 0x6b, 0x78, 0x1c, 0x7f, + 0xfd, 0xba, 0x4d, 0xa3, 0xf3, 0x75, 0x43, 0x05, 0x1f, 0x13, 0x3e, 0x3b, 0xb5, 0x0a, 0x52, 0x76, + 0x56, 0x81, 0xf0, 0xc0, 0x48, 0x08, 0x70, 0xac, 0xf3, 0xd2, 0xec, 0x8c, 0x4a, 0x4a, 0x9e, 0x20, + 0xfa, 0xa7, 0x88, 0x49, 0x87, 0x16, 0xc7, 0x21, 0xab, 0xb3, 0x43, 0x80, 0x7f, 0xcf, 0x17, 0x88, + 0x4d, 0x36, 0x18, 0xf0, 0x77, 0xdd, 0x76, 0xc6, 0x79, 0xfc, 0x8e, 0x0f, 0xfc, 0xd6, 0x99, 0x03, + 0x9f, 0x7e, 0xf1, 0xef, 0x9b, 0x7c, 0xc8, 0x93, 0x9d, 0xbd, 0xf8, 0xb6, 0x37, 0x19, 0x6c, 0x2d, + 0x3a, 0xf1, 0xb8, 0x22, 0xc7, 0xf6, 0x42, 0x37, 0xd7, 0xc1, 0x00, 0x7d, 0x51, 0xe9, 0xd2, 0x64, + 0xb2, 0x2b, 0x69, 0x3c, 0x17, 0xf2, 0xaa, 0x74, 0xb6, 0x35, 0x2a, 0x7b, 0x33, 0x1a, 0x8d, 0xc6, + 0x0b, 0xd0, 0xe5, 0x02, 0xb3, 0xbd, 0xe1, 0xb0, 0xb9, 0x19, 0xd7, 0xc2, 0x95, 0xda, 0x64, 0xc3, + 0xdb, 0x30, 0x9c, 0xeb, 0x7e, 0x7f, 0x91, 0xfd, 0xb2, 0x5c, 0xdc, 0x92, 0x53, 0xd0, 0x9a, 0xf5, + 0xe3, 0x93, 0xfb, 0xfb, 0xfb, 0x63, 0xd2, 0xcd, 0xba, 0xec, 0x4d, 0x51, 0x14, 0xe3, 0x82, 0x26, + 0xb3, 0x5f, 0x88, 0x5a, 0x57, 0xab, 0xec, 0x13, 0x38, 0x25, 0x8c, 0x48, 0x7e, 0x87, 0x6a, 0x09, + 0xa8, 0xa5, 0x48, 0xbc, 0x30, 0xbe, 0x4f, 0xf3, 0xa7, 0x8b, 0xb1, 0xd2, 0xbe, 0xa9, 0xc4, 0x2a, + 0x9b, 0x13, 0xa5, 0xab, 0xf1, 0xdc, 0x3a, 0x05, 0x2e, 0xdb, 0x6b, 0x6e, 0x18, 0xb9, 0x43, 0x2b, 0xd6, 0xe1, 0x6e, 0xa2, 0x7d, 0x47, 0x1e, 0x68, 0x7d, 0x46, 0x03, 0x17, 0x51, 0x21, 0xf1, 0xe6, - 0x0e, 0xaf, 0xff, 0x86, 0xec, 0xa7, 0x65, 0xad, 0xcd, 0x5d, 0xe1, 0xf7, 0xfb, 0xdd, 0x3b, 0x90, - 0x11, 0xc9, 0x32, 0xa2, 0x66, 0x7e, 0x60, 0x7d, 0xf6, 0x23, 0xb5, 0x14, 0xdf, 0xf5, 0x34, 0x5a, - 0x2e, 0x98, 0x68, 0xd1, 0xb2, 0xe1, 0x58, 0xb6, 0xce, 0x53, 0xe5, 0x8d, 0xd5, 0x81, 0x91, 0x8e, - 0xba, 0x8e, 0xb2, 0xc9, 0x60, 0xf3, 0x06, 0x05, 0xe6, 0xc8, 0x9e, 0x41, 0x8b, 0x9c, 0x93, 0x7f, - 0xe8, 0x69, 0xd8, 0x50, 0xc0, 0xc2, 0x58, 0xe5, 0xdc, 0xb7, 0xf3, 0x5a, 0x23, 0x67, 0x9a, 0xb6, - 0xe7, 0xf4, 0x90, 0x58, 0x23, 0x2b, 0x2d, 0xaf, 0xf2, 0xdd, 0xaf, 0xec, 0x95, 0xf3, 0x01, 0xdf, - 0x9d, 0xbe, 0x23, 0xda, 0x26, 0x83, 0x0d, 0xc0, 0x94, 0x3d, 0x8f, 0xf4, 0x2f, 0x10, 0xe9, 0x83, - 0xe2, 0xd7, 0xba, 0xd0, 0x04, 0xf8, 0x49, 0x1f, 0xeb, 0xf0, 0x40, 0xb5, 0xcd, 0xb7, 0xb0, 0xbd, - 0xa7, 0xb8, 0xdf, 0x05, 0x4b, 0xa3, 0xe4, 0x09, 0x36, 0x58, 0xf5, 0xcc, 0x41, 0x01, 0x0e, 0x8c, - 0x04, 0xdf, 0xfb, 0xaf, 0x9a, 0xbf, 0x0b, 0x7b, 0x74, 0x48, 0xc8, 0xbd, 0xd1, 0x21, 0x3b, 0x78, - 0x3c, 0xc7, 0x2f, 0x43, 0x47, 0x1b, 0xc8, 0xb8, 0x24, 0x5f, 0xb1, 0x59, 0xd0, 0xb1, 0x10, 0x12, - 0x9e, 0x21, 0x24, 0x88, 0xa4, 0xea, 0x9b, 0x39, 0x1a, 0xce, 0x3a, 0x99, 0x69, 0xb9, 0x35, 0xa1, - 0xb1, 0x06, 0xf8, 0xff, 0xba, 0x9a, 0x00, 0xe9, 0xee, 0xc3, 0xd3, 0x3f, 0xd8, 0x87, 0x16, 0x9b, - 0x16, 0x5f, 0x46, 0x88, 0xee, 0x29, 0xde, 0x9d, 0x9e, 0xd3, 0xd7, 0x43, 0x4b, 0x2f, 0x24, 0x04, - 0xea, 0x1a, 0x82, 0x14, 0x17, 0xf4, 0xcd, 0x5e, 0xb3, 0x53, 0x21, 0x9d, 0xf5, 0x2f, 0xa4, 0x43, - 0xbd, 0xd5, 0xa1, 0xb6, 0xca, 0xbf, 0x10, 0x13, 0xd0, 0x11, 0x01, 0x34, 0xa9, 0x1a, 0x57, 0x54, - 0xef, 0x65, 0x43, 0x4f, 0xfb, 0x63, 0x2e, 0xe8, 0x07, 0x4d, 0x69, 0x18, 0xd9, 0xf0, 0x67, 0xe2, - 0x1f, 0xb2, 0x41, 0x30, 0x32, 0x5c, 0x08, 0x00, 0x00 + 0x0e, 0xaf, 0xff, 0x81, 0xec, 0xa7, 0x65, 0xad, 0xcd, 0x5d, 0xe1, 0xf7, 0xfb, 0xdd, 0x3b, 0x90, + 0x91, 0xc8, 0x32, 0x22, 0x32, 0x3f, 0xb0, 0x3e, 0xfb, 0x91, 0x28, 0xc5, 0x77, 0x9c, 0x46, 0xcb, + 0x05, 0x13, 0x2d, 0x5a, 0x36, 0x1c, 0xcb, 0xd6, 0x79, 0xaa, 0xbc, 0xb1, 0x3a, 0x28, 0xd2, 0x49, + 0xd7, 0x49, 0x36, 0x19, 0x6c, 0xde, 0xa0, 0xa0, 0x1c, 0xd9, 0x33, 0xf4, 0x22, 0xe7, 0xe4, 0x1f, + 0x7a, 0x1a, 0x36, 0x12, 0xb0, 0x30, 0x56, 0x39, 0xf7, 0xed, 0xbc, 0xd6, 0xc8, 0x99, 0xa6, 0xed, + 0x39, 0x3d, 0x24, 0xd6, 0xc8, 0x4a, 0xcb, 0xab, 0x7c, 0xf7, 0x1b, 0x7b, 0xe5, 0x7c, 0xc0, 0x77, + 0xa7, 0x1f, 0x48, 0xb6, 0xc9, 0x60, 0x03, 0x30, 0x65, 0x2f, 0x23, 0xfd, 0x07, 0x44, 0xfa, 0xd0, + 0xf1, 0x6b, 0x5d, 0x68, 0x02, 0xfc, 0xac, 0x8f, 0x75, 0x78, 0xa0, 0xda, 0xe6, 0x39, 0x6c, 0xef, + 0x29, 0xee, 0xff, 0x82, 0xa5, 0x51, 0xf2, 0x04, 0x1b, 0xac, 0x7a, 0xe6, 0xa0, 0x00, 0x07, 0x46, + 0x82, 0xef, 0x3d, 0x07, 0x0f, 0x7c, 0x47, 0x6a, 0x8e, 0x86, 0xb3, 0x4e, 0xb0, 0x9c, 0xdf, 0xb5, + 0xd3, 0x58, 0x03, 0xfc, 0xbb, 0x38, 0x8d, 0x0e, 0xe9, 0xea, 0xd1, 0x21, 0x3b, 0x78, 0x3c, 0xe7, + 0xaf, 0xc3, 0xab, 0x0d, 0x62, 0x5d, 0x92, 0xef, 0xd8, 0x2c, 0xf4, 0xb9, 0x10, 0x12, 0x1e, 0x80, + 0x7b, 0x8f, 0x49, 0xa9, 0xfa, 0xe6, 0x75, 0x59, 0x11, 0x20, 0xdd, 0x7d, 0x78, 0xfa, 0x27, 0xfb, + 0xd8, 0x62, 0xd3, 0xe2, 0xeb, 0x10, 0xea, 0x9e, 0xea, 0xdd, 0xe9, 0x39, 0x7d, 0x3d, 0x50, 0x7a, + 0xa9, 0x51, 0xdf, 0x81, 0x8d, 0xba, 0x06, 0xc2, 0xee, 0x5d, 0xd0, 0x37, 0x7b, 0xcb, 0x4e, 0x85, + 0x74, 0xd6, 0xbf, 0x8e, 0x6d, 0xdb, 0x7a, 0xdb, 0x87, 0xda, 0x2a, 0xff, 0x4a, 0x4a, 0x40, 0x27, + 0x04, 0xd0, 0x24, 0x6b, 0x5c, 0x51, 0xbd, 0x97, 0x0d, 0x3d, 0xfd, 0x8f, 0xb5, 0xa0, 0x1f, 0x34, + 0xc5, 0x61, 0xa4, 0xc3, 0x9f, 0x8d, 0x7f, 0x01, 0x5e, 0x6b, 0x18, 0x1b, 0x7c, 0x08, 0x00, 0x00 }; diff --git a/wled00/xml.cpp b/wled00/xml.cpp index f54dd71a..c250340a 100644 --- a/wled00/xml.cpp +++ b/wled00/xml.cpp @@ -287,6 +287,9 @@ void getSettingsJS(byte subPage, char* dest) if (subPage == 0) { + #ifndef WLED_DISABLE_2D // include only if 2D is compiled in + oappend(PSTR("gId('2dbtn').style.display='';")); + #endif #ifdef WLED_ENABLE_DMX // include only if DMX is enabled oappend(PSTR("gId('dmxbtn').style.display='';")); #endif