diff --git a/CHANGELOG.md b/CHANGELOG.md index 29f3b024..8f4ad85f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,11 @@ ### Builds after release 0.12.0 +#### Build 2107091 + +- Fixed presets using wrong call mode (e.g. causing buttons to send UDP under direct change type) +- Increased hue buffer + #### Build 2107090 - Busses extend total configured LEDs if required diff --git a/wled00/alexa.cpp b/wled00/alexa.cpp index 83e7c25f..213c9306 100644 --- a/wled00/alexa.cpp +++ b/wled00/alexa.cpp @@ -47,7 +47,7 @@ void onAlexaChange(EspalexaDevice* dev) colorUpdated(NOTIFIER_CALL_MODE_ALEXA); } } else { - applyPreset(macroAlexaOn); + applyPreset(macroAlexaOn, NOTIFIER_CALL_MODE_ALEXA); if (bri == 0) espalexaDevice->setValue(briLast); //stop Alexa from complaining if macroAlexaOn does not actually turn on } } else if (m == EspalexaDeviceProperty::off) @@ -61,7 +61,7 @@ void onAlexaChange(EspalexaDevice* dev) colorUpdated(NOTIFIER_CALL_MODE_ALEXA); } } else { - applyPreset(macroAlexaOff); + applyPreset(macroAlexaOff, NOTIFIER_CALL_MODE_ALEXA); if (bri != 0) espalexaDevice->setValue(0); //stop Alexa from complaining if macroAlexaOff does not actually turn off } } else if (m == EspalexaDeviceProperty::bri) diff --git a/wled00/button.cpp b/wled00/button.cpp index ff0f4ee6..7b044c49 100644 --- a/wled00/button.cpp +++ b/wled00/button.cpp @@ -15,7 +15,7 @@ void shortPressAction(uint8_t b) toggleOnOff(); colorUpdated(NOTIFIER_CALL_MODE_BUTTON); } else { - applyPreset(macroButton[b]); + applyPreset(macroButton[b], NOTIFIER_CALL_MODE_BUTTON); } // publish MQTT message @@ -62,12 +62,12 @@ void handleSwitch(uint8_t b) if (millis() - buttonPressedTime[b] > WLED_DEBOUNCE_THRESHOLD) { //fire edge event only after 50ms without change (debounce) if (!buttonPressedBefore[b]) { // on -> off - if (macroButton[b]) applyPreset(macroButton[b]); + if (macroButton[b]) applyPreset(macroButton[b], NOTIFIER_CALL_MODE_BUTTON); else { //turn on if (!bri) {toggleOnOff(); colorUpdated(NOTIFIER_CALL_MODE_BUTTON);} } } else { // off -> on - if (macroLongPress[b]) applyPreset(macroLongPress[b]); + if (macroLongPress[b]) applyPreset(macroLongPress[b], NOTIFIER_CALL_MODE_BUTTON); else { //turn off if (bri) {toggleOnOff(); colorUpdated(NOTIFIER_CALL_MODE_BUTTON);} } @@ -195,7 +195,7 @@ void handleButton() { if (!buttonLongPressed[b]) { - if (macroLongPress[b]) {applyPreset(macroLongPress[b]);} + if (macroLongPress[b]) {applyPreset(macroLongPress[b], NOTIFIER_CALL_MODE_BUTTON);} else _setRandomColor(false,true); // publish MQTT message @@ -224,7 +224,7 @@ void handleButton() if (macroDoublePress[b]) { if (doublePress) { - applyPreset(macroDoublePress[b]); + applyPreset(macroDoublePress[b], NOTIFIER_CALL_MODE_BUTTON); // publish MQTT message if (buttonPublishMqtt && WLED_MQTT_CONNECTED) { diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index b1d43ebd..4fe07f74 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -120,7 +120,7 @@ void handleIR(); #include "FX.h" void deserializeSegment(JsonObject elem, byte it, byte presetId = 0); -bool deserializeState(JsonObject root, byte presetId = 0); +bool deserializeState(JsonObject root, byte callMode = NOTIFIER_CALL_MODE_DIRECT_CHANGE, byte presetId = 0); void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id, bool forPreset = false, bool segmentBounds = true); void serializeState(JsonObject root, bool forPreset = false, bool includeBri = true, bool segmentBounds = true); void serializeInfo(JsonObject root); @@ -181,7 +181,7 @@ void loadPlaylist(JsonObject playlistObject, byte presetId = 0); void handlePlaylist(); //presets.cpp -bool applyPreset(byte index); +bool applyPreset(byte index, byte callMode = NOTIFIER_CALL_MODE_DIRECT_CHANGE); void savePreset(byte index, bool persist = true, const char* pname = nullptr, JsonObject saveobj = JsonObject()); void deletePreset(byte index); diff --git a/wled00/hue.cpp b/wled00/hue.cpp index bbf08c85..47b252e9 100644 --- a/wled00/hue.cpp +++ b/wled00/hue.cpp @@ -92,7 +92,7 @@ void onHueData(void* arg, AsyncClient* client, void *data, size_t len) if (str == nullptr) return; str += 4; - StaticJsonDocument<512> root; + StaticJsonDocument<1024> root; if (str[0] == '[') //is JSON array { auto error = deserializeJson(root, str); diff --git a/wled00/ir.cpp b/wled00/ir.cpp index a38f7b01..a08321a5 100644 --- a/wled00/ir.cpp +++ b/wled00/ir.cpp @@ -69,9 +69,9 @@ void decBrightness() } // apply preset or fallback to a effect and palette if it doesn't exist -void presetFallback(int8_t presetID, int8_t effectID, int8_t paletteID) +void presetFallback(uint8_t presetID, uint8_t effectID, uint8_t paletteID) { - if (!applyPreset(presetID)) { + if (!applyPreset(presetID, NOTIFIER_CALL_MODE_BUTTON)) { effectCurrent = effectID; effectPalette = paletteID; } @@ -85,7 +85,7 @@ bool decodeIRCustom(uint32_t code) { //just examples, feel free to modify or remove case IRCUSTOM_ONOFF : toggleOnOff(); break; - case IRCUSTOM_MACRO1 : applyPreset(1); break; + case IRCUSTOM_MACRO1 : applyPreset(1, NOTIFIER_CALL_MODE_BUTTON); break; default: return false; } @@ -257,11 +257,11 @@ void decodeIR24(uint32_t code) case IR24_PURPLE : colorFromUint32(COLOR_PURPLE); break; case IR24_MAGENTA : colorFromUint32(COLOR_MAGENTA); break; case IR24_PINK : colorFromUint32(COLOR_PINK); break; - case IR24_WHITE : colorFromUint32(COLOR_WHITE); effectCurrent = 0; break; - case IR24_FLASH : if (!applyPreset(1)) effectCurrent = FX_MODE_COLORTWINKLE; break; - case IR24_STROBE : if (!applyPreset(2)) effectCurrent = FX_MODE_RAINBOW_CYCLE; break; - case IR24_FADE : if (!applyPreset(3)) effectCurrent = FX_MODE_BREATH; break; - case IR24_SMOOTH : if (!applyPreset(4)) effectCurrent = FX_MODE_RAINBOW; break; + case IR24_WHITE : colorFromUint32(COLOR_WHITE); effectCurrent = 0; break; + case IR24_FLASH : presetFallback(1, FX_MODE_COLORTWINKLE, effectPalette); break; + case IR24_STROBE : presetFallback(2, FX_MODE_RAINBOW_CYCLE, effectPalette); break; + case IR24_FADE : presetFallback(3, FX_MODE_BREATH, effectPalette); break; + case IR24_SMOOTH : presetFallback(4, FX_MODE_RAINBOW, effectPalette); break; default: return; } lastValidCode = code; @@ -289,11 +289,11 @@ void decodeIR24OLD(uint32_t code) case IR24_OLD_PURPLE : colorFromUint32(COLOR_PURPLE); break; case IR24_OLD_MAGENTA : colorFromUint32(COLOR_MAGENTA); break; case IR24_OLD_PINK : colorFromUint32(COLOR_PINK); break; - case IR24_OLD_WHITE : colorFromUint32(COLOR_WHITE); effectCurrent = 0; break; - case IR24_OLD_FLASH : if (!applyPreset(1)) { effectCurrent = FX_MODE_COLORTWINKLE; effectPalette = 0; } break; - case IR24_OLD_STROBE : if (!applyPreset(2)) { effectCurrent = FX_MODE_RAINBOW_CYCLE; effectPalette = 0; } break; - case IR24_OLD_FADE : if (!applyPreset(3)) { effectCurrent = FX_MODE_BREATH; effectPalette = 0; } break; - case IR24_OLD_SMOOTH : if (!applyPreset(4)) { effectCurrent = FX_MODE_RAINBOW; effectPalette = 0; } break; + case IR24_OLD_WHITE : colorFromUint32(COLOR_WHITE); effectCurrent = 0; break; + case IR24_OLD_FLASH : presetFallback(1, FX_MODE_COLORTWINKLE, 0); break; + case IR24_OLD_STROBE : presetFallback(2, FX_MODE_RAINBOW_CYCLE, 0); break; + case IR24_OLD_FADE : presetFallback(3, FX_MODE_BREATH, 0); break; + case IR24_OLD_SMOOTH : presetFallback(4, FX_MODE_RAINBOW, 0); break; default: return; } lastValidCode = code; @@ -382,10 +382,10 @@ void decodeIR40(uint32_t code) case IR40_SLOW : changeEffectSpeed(-16); break; case IR40_JUMP7 : changeEffectIntensity( 16); break; case IR40_AUTO : changeEffectIntensity(-16); break; - case IR40_JUMP3 : if (!applyPreset(1)) { effectCurrent = FX_MODE_STATIC; effectPalette = 0; } break; - case IR40_FADE3 : if (!applyPreset(2)) { effectCurrent = FX_MODE_BREATH; effectPalette = 0; } break; - case IR40_FADE7 : if (!applyPreset(3)) { effectCurrent = FX_MODE_FIRE_FLICKER; effectPalette = 0; } break; - case IR40_FLASH : if (!applyPreset(4)) { effectCurrent = FX_MODE_RAINBOW; effectPalette = 0; } break; + case IR40_JUMP3 : presetFallback(1, FX_MODE_STATIC, 0); break; + case IR40_FADE3 : presetFallback(2, FX_MODE_BREATH, 0); break; + case IR40_FADE7 : presetFallback(3, FX_MODE_FIRE_FLICKER, 0); break; + case IR40_FLASH : presetFallback(4, FX_MODE_RAINBOW, 0); break; } lastValidCode = code; } @@ -437,12 +437,12 @@ void decodeIR44(uint32_t code) case IR44_BLUEMINUS : changeEffectIntensity(-16); break; case IR44_QUICK : changeEffectSpeed( 16); break; case IR44_SLOW : changeEffectSpeed(-16); break; - case IR44_DIY1 : if (!applyPreset(1)) { effectCurrent = FX_MODE_STATIC; effectPalette = 0; } break; - case IR44_DIY2 : if (!applyPreset(2)) { effectCurrent = FX_MODE_BREATH; effectPalette = 0; } break; - case IR44_DIY3 : if (!applyPreset(3)) { effectCurrent = FX_MODE_FIRE_FLICKER; effectPalette = 0; } break; - case IR44_DIY4 : if (!applyPreset(4)) { effectCurrent = FX_MODE_RAINBOW; effectPalette = 0; } break; - case IR44_DIY5 : if (!applyPreset(5)) { effectCurrent = FX_MODE_METEOR_SMOOTH; effectPalette = 0; } break; - case IR44_DIY6 : if (!applyPreset(6)) { effectCurrent = FX_MODE_RAIN; effectPalette = 0; } break; + case IR44_DIY1 : presetFallback(1, FX_MODE_STATIC, 0); break; + case IR44_DIY2 : presetFallback(2, FX_MODE_BREATH, 0); break; + case IR44_DIY3 : presetFallback(3, FX_MODE_FIRE_FLICKER, 0); break; + case IR44_DIY4 : presetFallback(4, FX_MODE_RAINBOW, 0); break; + case IR44_DIY5 : presetFallback(5, FX_MODE_METEOR_SMOOTH, 0); break; + case IR44_DIY6 : presetFallback(6, FX_MODE_RAIN, 0); break; case IR44_AUTO : effectCurrent = FX_MODE_STATIC; break; case IR44_FLASH : effectCurrent = FX_MODE_PALETTE; break; case IR44_JUMP3 : bri = 63; break; @@ -473,10 +473,10 @@ void decodeIR21(uint32_t code) case IR21_PURPLE: colorFromUint32(COLOR_PURPLE); break; case IR21_PINK: colorFromUint32(COLOR_PINK); break; case IR21_WHITE: colorFromUint32(COLOR_WHITE); effectCurrent = 0; break; - case IR21_FLASH: if (!applyPreset(1)) { effectCurrent = FX_MODE_COLORTWINKLE; effectPalette = 0; } break; - case IR21_STROBE: if (!applyPreset(2)) { effectCurrent = FX_MODE_RAINBOW_CYCLE; effectPalette = 0; } break; - case IR21_FADE: if (!applyPreset(3)) { effectCurrent = FX_MODE_BREATH; effectPalette = 0; } break; - case IR21_SMOOTH: if (!applyPreset(4)) { effectCurrent = FX_MODE_RAINBOW; effectPalette = 0; } break; + case IR21_FLASH: presetFallback(1, FX_MODE_COLORTWINKLE, 0); break; + case IR21_STROBE: presetFallback(2, FX_MODE_RAINBOW_CYCLE, 0); break; + case IR21_FADE: presetFallback(3, FX_MODE_BREATH, 0); break; + case IR21_SMOOTH: presetFallback(4, FX_MODE_RAINBOW, 0); break; default: return; } lastValidCode = code; @@ -518,9 +518,9 @@ void decodeIR9(uint32_t code) { switch (code) { case IR9_POWER : toggleOnOff(); break; - case IR9_A : if (!applyPreset(1)) effectCurrent = FX_MODE_COLORTWINKLE; break; - case IR9_B : if (!applyPreset(2)) effectCurrent = FX_MODE_RAINBOW_CYCLE; break; - case IR9_C : if (!applyPreset(3)) effectCurrent = FX_MODE_BREATH; break; + case IR9_A : presetFallback(1, FX_MODE_COLORTWINKLE, effectPalette); break; + case IR9_B : presetFallback(2, FX_MODE_RAINBOW_CYCLE, effectPalette); break; + case IR9_C : presetFallback(3, FX_MODE_BREATH, effectPalette); break; case IR9_UP : incBrightness(); break; case IR9_DOWN : decBrightness(); break; //case IR9_UP : changeEffectIntensity(16); break; @@ -612,7 +612,7 @@ void decodeIRJson(uint32_t code) // command is JSON object //allow applyPreset() to reuse JSON buffer, or it would alloc. a second buffer and run out of mem. fileDoc = &irDoc; - deserializeState(jsonCmdObj); + deserializeState(jsonCmdObj, NOTIFIER_CALL_MODE_BUTTON); fileDoc = nullptr; } } diff --git a/wled00/json.cpp b/wled00/json.cpp index 845464e8..78ee3883 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -174,7 +174,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) return; // seg.hasChanged(prev); } -bool deserializeState(JsonObject root, byte presetId) +bool deserializeState(JsonObject root, byte callMode, byte presetId) { strip.applyToAllSelected = false; bool stateResponse = root[F("v")] | false; @@ -294,7 +294,7 @@ bool deserializeState(JsonObject root, byte presetId) ps = root["ps"] | -1; //load preset (clears state request!) if (ps >= 0) { if (!presetId) unloadPlaylist(); //stop playlist if preset changed manually - applyPreset(ps); + applyPreset(ps, callMode); return stateResponse; } @@ -315,7 +315,7 @@ bool deserializeState(JsonObject root, byte presetId) interfaceUpdateCallMode = NOTIFIER_CALL_MODE_WS_SEND; } - colorUpdated(noNotification ? NOTIFIER_CALL_MODE_NO_NOTIFY : NOTIFIER_CALL_MODE_DIRECT_CHANGE); + colorUpdated(noNotification ? NOTIFIER_CALL_MODE_NO_NOTIFY : callMode); return stateResponse; } diff --git a/wled00/mqtt.cpp b/wled00/mqtt.cpp index 8540335b..b6975962 100644 --- a/wled00/mqtt.cpp +++ b/wled00/mqtt.cpp @@ -93,7 +93,9 @@ void onMqttMessage(char* topic, char* payload, AsyncMqttClientMessageProperties if (payload[0] == '{') { //JSON API DynamicJsonDocument doc(JSON_BUFFER_SIZE); deserializeJson(doc, payloadStr); + fileDoc = &doc; deserializeState(doc.as()); + fileDoc = nullptr; } else { //HTTP API String apireq = "win&"; apireq += (char*)payloadStr; diff --git a/wled00/presets.cpp b/wled00/presets.cpp index cdbd82a3..8ffc96b1 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -4,7 +4,7 @@ * Methods to handle saving and loading presets to/from the filesystem */ -bool applyPreset(byte index) +bool applyPreset(byte index, byte callMode) { if (index == 0) return false; if (fileDoc) { @@ -14,7 +14,7 @@ bool applyPreset(byte index) #ifdef WLED_DEBUG_FS serializeJson(*fileDoc, Serial); #endif - deserializeState(fdo, index); + deserializeState(fdo, callMode, index); } else { DEBUGFS_PRINTLN(F("Make read buf")); DynamicJsonDocument fDoc(JSON_BUFFER_SIZE); @@ -24,7 +24,7 @@ bool applyPreset(byte index) #ifdef WLED_DEBUG_FS serializeJson(fDoc, Serial); #endif - deserializeState(fdo, index); + deserializeState(fdo, callMode, index); } if (!errorFlag) { diff --git a/wled00/wled.cpp b/wled00/wled.cpp index e5048d95..827025d9 100644 --- a/wled00/wled.cpp +++ b/wled00/wled.cpp @@ -387,7 +387,7 @@ void WLED::beginStrip() strip.setShowCallback(handleOverlayDraw); if (bootPreset > 0) { - applyPreset(bootPreset); + applyPreset(bootPreset, NOTIFIER_CALL_MODE_INIT); } else if (turnOnAtBoot) { if (briS > 0) bri = briS; else if (bri == 0) bri = 128; diff --git a/wled00/wled.h b/wled00/wled.h index 81a87655..22591540 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2107090 +#define VERSION 2107091 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG