66 * JSON API (De)serialization
77 */
88
9- void deserializeSegment (JsonObject elem, byte it)
9+ void deserializeSegment (JsonObject elem, byte it, byte presetId )
1010{
1111 byte id = elem[" id" ] | it;
1212 if (id < strip.getMaxSegments ())
@@ -95,13 +95,18 @@ void deserializeSegment(JsonObject elem, byte it)
9595
9696 // temporary, strip object gets updated via colorUpdated()
9797 if (id == strip.getMainSegmentId ()) {
98+ byte effectPrev = effectCurrent;
9899 effectCurrent = elem[F (" fx" )] | effectCurrent;
100+ if (!presetId && effectCurrent != effectPrev) unloadPlaylist (); // stop playlist if active and FX changed manually
99101 effectSpeed = elem[F (" sx" )] | effectSpeed;
100102 effectIntensity = elem[F (" ix" )] | effectIntensity;
101103 effectPalette = elem[" pal" ] | effectPalette;
102104 } else { // permanent
103105 byte fx = elem[F (" fx" )] | seg.mode ;
104- if (fx != seg.mode && fx < strip.getModeCount ()) strip.setMode (id, fx);
106+ if (fx != seg.mode && fx < strip.getModeCount ()) {
107+ strip.setMode (id, fx);
108+ if (!presetId) unloadPlaylist (); // stop playlist if active and FX changed manually
109+ }
105110 seg.speed = elem[F (" sx" )] | seg.speed ;
106111 seg.intensity = elem[F (" ix" )] | seg.intensity ;
107112 seg.palette = elem[" pal" ] | seg.palette ;
@@ -156,7 +161,7 @@ void deserializeSegment(JsonObject elem, byte it)
156161 }
157162}
158163
159- bool deserializeState (JsonObject root)
164+ bool deserializeState (JsonObject root, byte presetId )
160165{
161166 strip.applyToAllSelected = false ;
162167 bool stateResponse = root[F (" v" )] | false ;
@@ -168,12 +173,15 @@ bool deserializeState(JsonObject root)
168173
169174 if (root[" on" ].is <const char *>() && root[" on" ].as <const char *>()[0 ] == ' t' ) toggleOnOff ();
170175
171- int tr = root[F (" transition" )] | -1 ;
172- if (tr >= 0 )
173- {
174- transitionDelay = tr;
175- transitionDelay *= 100 ;
176- transitionDelayTemp = transitionDelay;
176+ int tr = -1 ;
177+ if (!presetId || currentPlaylist < 0 ) { // do not apply transition time from preset if playlist active, as it would override playlist transition times
178+ tr = root[F (" transition" )] | -1 ;
179+ if (tr >= 0 )
180+ {
181+ transitionDelay = tr;
182+ transitionDelay *= 100 ;
183+ transitionDelayTemp = transitionDelay;
184+ }
177185 }
178186
179187 tr = root[F (" tt" )] | -1 ;
@@ -245,20 +253,20 @@ bool deserializeState(JsonObject root)
245253 {
246254 if (lowestActive == 99 ) lowestActive = s;
247255 if (sg.isSelected ()) {
248- deserializeSegment (segVar, s);
256+ deserializeSegment (segVar, s, presetId );
249257 didSet = true ;
250258 }
251259 }
252260 }
253- if (!didSet && lowestActive < strip.getMaxSegments ()) deserializeSegment (segVar, lowestActive);
261+ if (!didSet && lowestActive < strip.getMaxSegments ()) deserializeSegment (segVar, lowestActive, presetId );
254262 } else { // set only the segment with the specified ID
255- deserializeSegment (segVar, it);
263+ deserializeSegment (segVar, it, presetId );
256264 }
257265 } else {
258266 JsonArray segs = segVar.as <JsonArray>();
259267 for (JsonObject elem : segs)
260268 {
261- deserializeSegment (elem, it);
269+ deserializeSegment (elem, it, presetId );
262270 it++;
263271 }
264272 }
@@ -280,7 +288,11 @@ bool deserializeState(JsonObject root)
280288 deletePreset (ps);
281289 }
282290 ps = root[" ps" ] | -1 ; // load preset (clears state request!)
283- if (ps >= 0 ) {applyPreset (ps); return stateResponse;}
291+ if (ps >= 0 ) {
292+ if (!presetId) unloadPlaylist (); // stop playlist if preset changed manually
293+ applyPreset (ps);
294+ return stateResponse;
295+ }
284296
285297 // HTTP API commands
286298 const char * httpwin = root[" win" ];
@@ -293,7 +305,7 @@ bool deserializeState(JsonObject root)
293305
294306 JsonObject playlist = root[F (" playlist" )];
295307 if (!playlist.isNull ()) {
296- loadPlaylist (playlist);
308+ loadPlaylist (playlist, presetId );
297309 noNotification = true ; // do not notify both for this request and the first playlist entry
298310 }
299311
@@ -309,7 +321,7 @@ void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id, bool fo
309321 root[F (" start" )] = seg.start ;
310322 root[" stop" ] = seg.stop ;
311323 }
312- if (!forPreset) root[F (" len" )] = seg.stop - seg.start ;
324+ if (!forPreset) root[F (" len" )] = seg.stop - seg.start ;
313325 root[F (" grp" )] = seg.grouping ;
314326 root[F (" spc" )] = seg.spacing ;
315327 root[" on" ] = seg.getOption (SEG_OPTION_ON);
0 commit comments