From 09bcf34050148eaae63e8ea3ba91d934d66c0898 Mon Sep 17 00:00:00 2001 From: Blaz Kristan Date: Wed, 2 Feb 2022 20:53:16 +0100 Subject: [PATCH] Non-effect preset should not unload playlist. --- wled00/fcn_declare.h | 2 +- wled00/json.cpp | 5 ++--- wled00/presets.cpp | 11 ++++++++--- wled00/wled.h | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/wled00/fcn_declare.h b/wled00/fcn_declare.h index 709aefc8..0aed1321 100644 --- a/wled00/fcn_declare.h +++ b/wled00/fcn_declare.h @@ -195,7 +195,7 @@ void handlePlaylist(); //presets.cpp void handlePresets(); -bool applyPreset(byte index, byte callMode = CALL_MODE_DIRECT_CHANGE); +bool applyPreset(byte index, byte callMode = CALL_MODE_DIRECT_CHANGE, bool fromJson = false); inline bool applyTemporaryPreset() {return applyPreset(255);}; void savePreset(byte index, bool persist = true, const char* pname = nullptr, JsonObject saveobj = JsonObject()); inline void saveTemporaryPreset() {savePreset(255, false);}; diff --git a/wled00/json.cpp b/wled00/json.cpp index d96796f9..4d2728df 100644 --- a/wled00/json.cpp +++ b/wled00/json.cpp @@ -163,7 +163,7 @@ void deserializeSegment(JsonObject elem, byte it, byte presetId) if (getVal(elem["fx"], &fx, 1, strip.getModeCount())) { //load effect ('r' random, '~' inc/dec, 1-255 exact value) if (!presetId && currentPlaylist>=0) unloadPlaylist(); strip.setMode(id, fx); - if (!presetId && seg.mode != fxPrev) effectChanged = true; //send UDP + if (!presetId && fx != fxPrev) effectChanged = true; //send UDP } byte prevSpd = seg.speed; byte prevInt = seg.intensity; @@ -357,9 +357,8 @@ bool deserializeState(JsonObject root, byte callMode, byte presetId) ps = presetCycCurr; if (getVal(root["ps"], &ps, presetCycMin, presetCycMax)) { //load preset (clears state request!) - if (!presetId) unloadPlaylist(); //stop playlist if preset changed manually if (ps >= presetCycMin && ps <= presetCycMax) presetCycCurr = ps; - applyPreset(ps, callMode); + applyPreset(ps, callMode, true); return stateResponse; } diff --git a/wled00/presets.cpp b/wled00/presets.cpp index 13bac4d2..db797d87 100644 --- a/wled00/presets.cpp +++ b/wled00/presets.cpp @@ -10,11 +10,13 @@ static char *tmpRAMbuffer = nullptr; static volatile byte presetToApply = 0; static volatile byte callModeToApply = 0; +static volatile bool checkPlaylist = false; -bool applyPreset(byte index, byte callMode) +bool applyPreset(byte index, byte callMode, bool fromJson) { presetToApply = index; callModeToApply = callMode; + checkPlaylist = fromJson; return true; } @@ -23,7 +25,7 @@ void handlePresets() if (presetToApply == 0 || fileDoc) return; //JSON buffer allocated (apply preset in next cycle) or no preset waiting JsonObject fdo; - const char *filename = presetToApply < 255 ? "/presets.json" : "/tmp.json"; + const char *filename = presetToApply < 255 ? PSTR("/presets.json") : PSTR("/tmp.json"); // allocate buffer DEBUG_PRINTLN(F("Apply preset JSON buffer requested.")); @@ -48,6 +50,8 @@ void handlePresets() handleSet(nullptr, apireq, false); } else { fdo.remove("ps"); //remove load request for presets to prevent recursive crash + // if we applyPreset from JSON and preset contains "seg" we must unload playlist + if (checkPlaylist && !fdo["seg"].isNull()) unloadPlaylist(); deserializeState(fdo, CALL_MODE_NO_NOTIFY, presetToApply); } @@ -68,6 +72,7 @@ void handlePresets() presetToApply = 0; //clear request for preset callModeToApply = 0; + checkPlaylist = false; } //called from handleSet(PS=) [network callback (fileDoc==nullptr), IR (irrational), deserializeState, UDP] and deserializeState() [network callback (filedoc!=nullptr)] @@ -78,7 +83,7 @@ void savePreset(byte index, bool persist, const char* pname, JsonObject saveobj) JsonObject sObj = saveobj; bool bufferAllocated = false; - const char *filename = persist ? "/presets.json" : "/tmp.json"; + const char *filename = persist ? PSTR("/presets.json") : PSTR("/tmp.json"); if (!fileDoc) { // called from handleSet() HTTP API diff --git a/wled00/wled.h b/wled00/wled.h index 5930afeb..019f33f1 100644 --- a/wled00/wled.h +++ b/wled00/wled.h @@ -8,7 +8,7 @@ */ // version code in format yymmddb (b = daily build) -#define VERSION 2201311 +#define VERSION 2202021 //uncomment this if you have a "my_config.h" file you'd like to use //#define WLED_USE_MY_CONFIG