| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * JSON API (De)serialization | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  | void deserializeSegment(JsonObject elem, byte it) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   byte id = elem["id"] | it; | 
					
						
							|  |  |  |   if (id < strip.getMaxSegments()) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     WS2812FX::Segment& seg = strip.getSegment(id); | 
					
						
							| 
									
										
										
										
											2020-01-14 09:57:23 +00:00
										 |  |  |     uint16_t start = elem["start"] | seg.start; | 
					
						
							|  |  |  |     int stop = elem["stop"] | -1; | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-01-14 09:57:23 +00:00
										 |  |  |     if (stop < 0) { | 
					
						
							|  |  |  |       uint16_t len = elem["len"]; | 
					
						
							|  |  |  |       stop = (len > 0) ? start + len : seg.stop; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     uint16_t grp = elem["grp"] | seg.grouping; | 
					
						
							|  |  |  |     uint16_t spc = elem["spc"] | seg.spacing; | 
					
						
							|  |  |  |     strip.setSegment(id, start, stop, grp, spc); | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |      | 
					
						
							|  |  |  |     JsonArray colarr = elem["col"]; | 
					
						
							|  |  |  |     if (!colarr.isNull()) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       for (uint8_t i = 0; i < 3; i++) | 
					
						
							|  |  |  |       { | 
					
						
							|  |  |  |         JsonArray colX = colarr[i]; | 
					
						
							|  |  |  |         if (colX.isNull()) break; | 
					
						
							|  |  |  |         byte sz = colX.size(); | 
					
						
							|  |  |  |         if (sz > 0 && sz < 5) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |           int rgbw[] = {0,0,0,0}; | 
					
						
							|  |  |  |           byte cp = copyArray(colX, rgbw); | 
					
						
							|  |  |  |           seg.colors[i] = ((rgbw[3] << 24) | ((rgbw[0]&0xFF) << 16) | ((rgbw[1]&0xFF) << 8) | ((rgbw[2]&0xFF))); | 
					
						
							|  |  |  |           if (cp == 1 && rgbw[0] == 0) seg.colors[i] = 0; | 
					
						
							| 
									
										
										
										
											2019-12-01 00:42:52 +00:00
										 |  |  |           if (id == strip.getMainSegmentId()) //temporary
 | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |           {  | 
					
						
							|  |  |  |             if (i == 0) {col[0] = rgbw[0]; col[1] = rgbw[1]; col[2] = rgbw[2]; col[3] = rgbw[3];} | 
					
						
							|  |  |  |             if (i == 1) {colSec[0] = rgbw[0]; colSec[1] = rgbw[1]; colSec[2] = rgbw[2]; colSec[3] = rgbw[3];} | 
					
						
							|  |  |  |           } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |      | 
					
						
							|  |  |  |     //if (pal != seg.palette && pal < strip.getPaletteCount()) strip.setPalette(pal);
 | 
					
						
							|  |  |  |     seg.setOption(0, elem["sel"] | seg.getOption(0)); //selected
 | 
					
						
							|  |  |  |     seg.setOption(1, elem["rev"] | seg.getOption(1)); //reverse
 | 
					
						
							|  |  |  |     //int cln = seg_0["cln"];
 | 
					
						
							|  |  |  |     //temporary, strip object gets updated via colorUpdated()
 | 
					
						
							| 
									
										
										
										
											2019-12-01 00:42:52 +00:00
										 |  |  |     if (id == strip.getMainSegmentId()) { | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |       effectCurrent = elem["fx"] | effectCurrent; | 
					
						
							|  |  |  |       effectSpeed = elem["sx"] | effectSpeed; | 
					
						
							| 
									
										
										
										
											2019-12-01 00:42:52 +00:00
										 |  |  |       effectIntensity = elem["ix"] | effectIntensity; | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |       effectPalette = elem["pal"] | effectPalette; | 
					
						
							|  |  |  |     } else { //permanent
 | 
					
						
							|  |  |  |       byte fx = elem["fx"] | seg.mode; | 
					
						
							|  |  |  |       if (fx != seg.mode && fx < strip.getModeCount()) strip.setMode(id, fx); | 
					
						
							|  |  |  |       seg.speed = elem["sx"] | seg.speed; | 
					
						
							|  |  |  |       seg.intensity = elem["ix"] | seg.intensity; | 
					
						
							|  |  |  |       seg.palette = elem["pal"] | seg.palette; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  | bool deserializeState(JsonObject root) | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-12-02 11:41:35 +00:00
										 |  |  |   strip.applyToAllSelected = false; | 
					
						
							| 
									
										
										
										
											2019-06-20 12:40:12 +00:00
										 |  |  |   bool stateResponse = root["v"] | false; | 
					
						
							| 
									
										
										
										
											2020-02-09 15:11:38 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   int ps = root["ps"] | -1; | 
					
						
							|  |  |  |   if (ps >= 0) applyPreset(ps); | 
					
						
							| 
									
										
										
										
											2019-06-20 12:40:12 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2019-03-10 23:20:17 +00:00
										 |  |  |   bri = root["bri"] | bri; | 
					
						
							| 
									
										
										
										
											2019-03-06 20:31:12 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   bool on = root["on"] | (bri > 0); | 
					
						
							|  |  |  |   if (!on != !bri) toggleOnOff(); | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   int tr = root["transition"] | -1; | 
					
						
							|  |  |  |   if (tr >= 0) | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   { | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |     transitionDelay = tr; | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |     transitionDelay *= 100; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   tr = root["tt"] | -1; | 
					
						
							|  |  |  |   if (tr >= 0) | 
					
						
							| 
									
										
										
										
											2019-10-29 01:21:23 +00:00
										 |  |  |   { | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |     transitionDelayTemp = tr; | 
					
						
							| 
									
										
										
										
											2019-10-29 01:21:23 +00:00
										 |  |  |     transitionDelayTemp *= 100; | 
					
						
							|  |  |  |     jsonTransitionOnce = true; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-03-06 20:31:12 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2019-12-17 23:47:24 +00:00
										 |  |  |   int cy = root["pl"] | -2; | 
					
						
							|  |  |  |   if (cy > -2) presetCyclingEnabled = (cy >= 0); | 
					
						
							| 
									
										
										
										
											2019-12-05 00:58:03 +00:00
										 |  |  |   JsonObject ccnf = root["ccnf"]; | 
					
						
							|  |  |  |   presetCycleMin = ccnf["min"] | presetCycleMin; | 
					
						
							|  |  |  |   presetCycleMax = ccnf["max"] | presetCycleMax; | 
					
						
							|  |  |  |   tr = ccnf["time"] | -1; | 
					
						
							|  |  |  |   if (tr >= 2) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     presetCycleTime = tr; | 
					
						
							|  |  |  |     presetCycleTime *= 100; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-03-06 20:31:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |   JsonObject nl = root["nl"]; | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   nightlightActive    = nl["on"]   | nightlightActive; | 
					
						
							|  |  |  |   nightlightDelayMins = nl["dur"]  | nightlightDelayMins; | 
					
						
							|  |  |  |   nightlightFade      = nl["fade"] | nightlightFade; | 
					
						
							|  |  |  |   nightlightTargetBri = nl["tbri"] | nightlightTargetBri; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |   JsonObject udpn = root["udpn"]; | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   notifyDirect         = udpn["send"] | notifyDirect; | 
					
						
							|  |  |  |   receiveNotifications = udpn["recv"] | receiveNotifications; | 
					
						
							|  |  |  |   bool noNotification  = udpn["nn"]; //send no notification just for this request
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-20 12:40:12 +00:00
										 |  |  |   int timein = root["time"] | -1; | 
					
						
							|  |  |  |   if (timein != -1) setTime(timein); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-04 01:01:47 +00:00
										 |  |  |   byte prevMain = strip.getMainSegmentId(); | 
					
						
							|  |  |  |   strip.mainSegment = root["mainseg"] | prevMain; | 
					
						
							|  |  |  |   if (strip.getMainSegmentId() != prevMain) setValuesFromMainSeg(); | 
					
						
							| 
									
										
										
										
											2019-12-01 00:42:52 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   int it = 0; | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |   JsonVariant segVar = root["seg"]; | 
					
						
							|  |  |  |   if (segVar.is<JsonObject>()) | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   { | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |     int id = segVar["id"] | -1; | 
					
						
							| 
									
										
										
										
											2019-12-13 00:23:07 +00:00
										 |  |  |      | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |     if (id < 0) { //set all selected segments
 | 
					
						
							| 
									
										
										
										
											2019-12-13 00:23:07 +00:00
										 |  |  |       bool didSet = false; | 
					
						
							|  |  |  |       byte lowestActive = 99; | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |       for (byte s = 0; s < strip.getMaxSegments(); s++) | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |       { | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |         WS2812FX::Segment sg = strip.getSegment(s); | 
					
						
							| 
									
										
										
										
											2019-12-13 00:23:07 +00:00
										 |  |  |         if (sg.isActive()) | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2019-12-13 00:23:07 +00:00
										 |  |  |           if (lowestActive == 99) lowestActive = s; | 
					
						
							|  |  |  |           if (sg.isSelected()) { | 
					
						
							|  |  |  |             deserializeSegment(segVar, s); | 
					
						
							|  |  |  |             didSet = true; | 
					
						
							|  |  |  |           } | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2019-12-13 00:23:07 +00:00
										 |  |  |       if (!didSet && lowestActive < strip.getMaxSegments()) deserializeSegment(segVar, lowestActive); | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  |     } else { //set only the segment with the specified ID
 | 
					
						
							|  |  |  |       deserializeSegment(segVar, it); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } else { | 
					
						
							|  |  |  |     JsonArray segs = segVar.as<JsonArray>(); | 
					
						
							|  |  |  |     for (JsonObject elem : segs) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       deserializeSegment(elem, it); | 
					
						
							|  |  |  |       it++; | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-11-30 18:17:25 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-22 15:17:32 +00:00
										 |  |  |   colorUpdated(noNotification ? NOTIFIER_CALL_MODE_NO_NOTIFY : NOTIFIER_CALL_MODE_DIRECT_CHANGE); | 
					
						
							| 
									
										
										
										
											2019-06-20 12:40:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-24 23:20:00 +00:00
										 |  |  |   ps = root["psave"] | -1; | 
					
						
							|  |  |  |   if (ps >= 0) savePreset(ps); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-20 12:40:12 +00:00
										 |  |  |   return stateResponse; | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-23 15:35:40 +00:00
										 |  |  | void serializeSegment(JsonObject& root, WS2812FX::Segment& seg, byte id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	root["id"] = id; | 
					
						
							|  |  |  | 	root["start"] = seg.start; | 
					
						
							|  |  |  | 	root["stop"] = seg.stop; | 
					
						
							| 
									
										
										
										
											2020-01-14 09:57:23 +00:00
										 |  |  | 	root["len"] = seg.stop - seg.start; | 
					
						
							|  |  |  |   root["grp"] = seg.grouping; | 
					
						
							|  |  |  |   root["spc"] = seg.spacing; | 
					
						
							| 
									
										
										
										
											2019-07-23 15:35:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	JsonArray colarr = root.createNestedArray("col"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	for (uint8_t i = 0; i < 3; i++) | 
					
						
							|  |  |  | 	{ | 
					
						
							|  |  |  | 		JsonArray colX = colarr.createNestedArray(); | 
					
						
							|  |  |  | 		colX.add((seg.colors[i] >> 16) & 0xFF); | 
					
						
							|  |  |  | 		colX.add((seg.colors[i] >> 8) & 0xFF); | 
					
						
							|  |  |  | 		colX.add((seg.colors[i]) & 0xFF); | 
					
						
							|  |  |  | 		if (useRGBW) | 
					
						
							|  |  |  | 			colX.add((seg.colors[i] >> 24) & 0xFF); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	root["fx"] = seg.mode; | 
					
						
							|  |  |  | 	root["sx"] = seg.speed; | 
					
						
							|  |  |  | 	root["ix"] = seg.intensity; | 
					
						
							|  |  |  | 	root["pal"] = seg.palette; | 
					
						
							|  |  |  | 	root["sel"] = seg.isSelected(); | 
					
						
							|  |  |  | 	root["rev"] = seg.getOption(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  | void serializeState(JsonObject root) | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-11-30 10:17:37 +00:00
										 |  |  |   if (errorFlag) root["error"] = errorFlag; | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   root["on"] = (bri > 0); | 
					
						
							|  |  |  |   root["bri"] = briLast; | 
					
						
							|  |  |  |   root["transition"] = transitionDelay/100; //in 100ms
 | 
					
						
							| 
									
										
										
										
											2019-03-06 20:31:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-01 00:42:52 +00:00
										 |  |  |   root["ps"] = currentPreset; | 
					
						
							|  |  |  |   root["pss"] = savedPresets; | 
					
						
							| 
									
										
										
										
											2019-03-06 20:31:12 +00:00
										 |  |  |   root["pl"] = (presetCyclingEnabled) ? 0: -1; | 
					
						
							| 
									
										
										
										
											2019-12-05 00:58:03 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   //temporary for preser cycle
 | 
					
						
							|  |  |  |   JsonObject ccnf = root.createNestedObject("ccnf"); | 
					
						
							|  |  |  |   ccnf["min"] = presetCycleMin; | 
					
						
							|  |  |  |   ccnf["max"] = presetCycleMax; | 
					
						
							|  |  |  |   ccnf["time"] = presetCycleTime/100; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |   JsonObject nl = root.createNestedObject("nl"); | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   nl["on"] = nightlightActive; | 
					
						
							|  |  |  |   nl["dur"] = nightlightDelayMins; | 
					
						
							|  |  |  |   nl["fade"] = nightlightFade; | 
					
						
							|  |  |  |   nl["tbri"] = nightlightTargetBri; | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |   JsonObject udpn = root.createNestedObject("udpn"); | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   udpn["send"] = notifyDirect; | 
					
						
							|  |  |  |   udpn["recv"] = receiveNotifications; | 
					
						
							| 
									
										
										
										
											2019-12-01 00:42:52 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   root["mainseg"] = strip.getMainSegmentId(); | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |   JsonArray seg = root.createNestedArray("seg"); | 
					
						
							| 
									
										
										
										
											2019-06-20 12:40:12 +00:00
										 |  |  |   for (byte s = 0; s < strip.getMaxSegments(); s++) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     WS2812FX::Segment sg = strip.getSegment(s); | 
					
						
							|  |  |  |     if (sg.isActive()) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |       JsonObject seg0 = seg.createNestedObject(); | 
					
						
							| 
									
										
										
										
											2019-06-20 12:40:12 +00:00
										 |  |  |       serializeSegment(seg0, sg, s); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  | void serializeInfo(JsonObject root) | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   root["ver"] = versionString; | 
					
						
							|  |  |  |   root["vid"] = VERSION; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |   JsonObject leds = root.createNestedObject("leds"); | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   leds["count"] = ledCount; | 
					
						
							|  |  |  |   leds["rgbw"] = useRGBW; | 
					
						
							| 
									
										
										
										
											2020-02-19 23:45:09 +00:00
										 |  |  |   leds["wv"] = useRGBW && (strip.rgbwMode == RGBW_MODE_MANUAL_ONLY || strip.rgbwMode == RGBW_MODE_DUAL); //should a white channel slider be displayed?
 | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |   JsonArray leds_pin = leds.createNestedArray("pin"); | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   leds_pin.add(LEDPIN); | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   leds["pwr"] = strip.currentMilliamps; | 
					
						
							| 
									
										
										
										
											2019-12-30 16:34:15 +00:00
										 |  |  |   leds["maxpwr"] = (strip.currentMilliamps)? strip.ablMilliampsMax : 0; | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   leds["maxseg"] = strip.getMaxSegments(); | 
					
						
							| 
									
										
										
										
											2019-12-01 00:42:52 +00:00
										 |  |  |   leds["seglock"] = false; //will be used in the future to prevent modifications to segment config
 | 
					
						
							| 
									
										
										
										
											2019-12-13 00:23:07 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   root["str"] = syncToggleReceive; | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |    | 
					
						
							|  |  |  |   root["name"] = serverDescription; | 
					
						
							|  |  |  |   root["udpport"] = udpPort; | 
					
						
							| 
									
										
										
										
											2020-02-09 18:10:29 +00:00
										 |  |  |   root["live"] = (bool)realtimeMode; | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   root["fxcount"] = strip.getModeCount(); | 
					
						
							|  |  |  |   root["palcount"] = strip.getPaletteCount(); | 
					
						
							| 
									
										
										
										
											2019-10-29 01:21:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |   JsonObject wifi_info = root.createNestedObject("wifi"); | 
					
						
							|  |  |  |   wifi_info["bssid"] = WiFi.BSSIDstr(); | 
					
						
							| 
									
										
										
										
											2020-01-14 09:57:23 +00:00
										 |  |  |   int qrssi = WiFi.RSSI(); | 
					
						
							|  |  |  |   wifi_info["rssi"] = qrssi; | 
					
						
							|  |  |  |   wifi_info["signal"] = getSignalQuality(qrssi); | 
					
						
							| 
									
										
										
										
											2019-10-29 01:21:23 +00:00
										 |  |  |   wifi_info["channel"] = WiFi.channel(); | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #ifdef ARDUINO_ARCH_ESP32
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   root["arch"] = "esp32"; | 
					
						
							|  |  |  |   root["core"] = ESP.getSdkVersion(); | 
					
						
							|  |  |  |   //root["maxalloc"] = ESP.getMaxAllocHeap();
 | 
					
						
							| 
									
										
										
										
											2019-10-29 01:21:23 +00:00
										 |  |  |   root["lwip"] = 0; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #else
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   root["arch"] = "esp8266"; | 
					
						
							|  |  |  |   root["core"] = ESP.getCoreVersion(); | 
					
						
							|  |  |  |   //root["maxalloc"] = ESP.getMaxFreeBlockSize();
 | 
					
						
							| 
									
										
										
										
											2019-10-29 01:21:23 +00:00
										 |  |  |   root["lwip"] = LWIP_VERSION_MAJOR; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #endif
 | 
					
						
							| 
									
										
										
										
											2019-10-29 01:21:23 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   root["freeheap"] = ESP.getFreeHeap(); | 
					
						
							|  |  |  |   root["uptime"] = millis()/1000; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   byte os = 0; | 
					
						
							|  |  |  |   #ifdef WLED_DEBUG
 | 
					
						
							|  |  |  |   os  = 0x80; | 
					
						
							|  |  |  |   #endif
 | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #ifndef WLED_DISABLE_ALEXA
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   os += 0x40; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #endif
 | 
					
						
							|  |  |  |   #ifndef WLED_DISABLE_BLYNK
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   os += 0x20; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #endif
 | 
					
						
							|  |  |  |   #ifndef WLED_DISABLE_CRONIXIE
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   os += 0x10; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #endif
 | 
					
						
							| 
									
										
										
										
											2019-03-16 01:09:37 +00:00
										 |  |  |   #ifndef WLED_DISABLE_FILESYSTEM
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   os += 0x08; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #endif
 | 
					
						
							|  |  |  |   #ifndef WLED_DISABLE_HUESYNC
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   os += 0x04; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #endif
 | 
					
						
							| 
									
										
										
										
											2019-12-03 13:15:12 +00:00
										 |  |  |   #ifdef WLED_ENABLE_ADALIGHT
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   os += 0x02; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #endif
 | 
					
						
							|  |  |  |   #ifndef WLED_DISABLE_OTA 
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   os += 0x01; | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   #endif
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   root["opt"] = os; | 
					
						
							|  |  |  |    | 
					
						
							|  |  |  |   root["brand"] = "WLED"; | 
					
						
							|  |  |  |   root["product"] = "DIY light"; | 
					
						
							| 
									
										
										
										
											2019-12-13 00:31:48 +00:00
										 |  |  |   root["btype"] = "src"; | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   root["mac"] = escapedMac; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void serveJson(AsyncWebServerRequest* request) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   byte subJson = 0; | 
					
						
							|  |  |  |   const String& url = request->url(); | 
					
						
							|  |  |  |   if      (url.indexOf("state") > 0) subJson = 1; | 
					
						
							|  |  |  |   else if (url.indexOf("info")  > 0) subJson = 2; | 
					
						
							| 
									
										
										
										
											2019-11-18 11:29:36 +00:00
										 |  |  |   else if (url.indexOf("live")  > 0) { | 
					
						
							|  |  |  |     serveLiveLeds(request); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   else if (url.indexOf("eff")   > 0) { | 
					
						
							|  |  |  |     request->send_P(200, "application/json", JSON_mode_names); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else if (url.indexOf("pal")   > 0) { | 
					
						
							|  |  |  |     request->send_P(200, "application/json", JSON_palette_names); | 
					
						
							|  |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   else if (url.length() > 6) { //not just /json
 | 
					
						
							| 
									
										
										
										
											2019-03-06 20:31:12 +00:00
										 |  |  |     request->send(  501, "application/json", "{\"error\":\"Not implemented\"}"); | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |     return; | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |    | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   AsyncJsonResponse* response = new AsyncJsonResponse(); | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |   JsonObject doc = response->getRoot(); | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   switch (subJson) | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     case 1: //state
 | 
					
						
							|  |  |  |       serializeState(doc); break; | 
					
						
							|  |  |  |     case 2: //info
 | 
					
						
							|  |  |  |       serializeInfo(doc); break; | 
					
						
							|  |  |  |     default: //all
 | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |       JsonObject state = doc.createNestedObject("state"); | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |       serializeState(state); | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |       JsonObject info  = doc.createNestedObject("info"); | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |       serializeInfo(info); | 
					
						
							| 
									
										
										
										
											2019-06-21 21:12:58 +00:00
										 |  |  |       doc["effects"]  = serialized((const __FlashStringHelper*)JSON_mode_names); | 
					
						
							|  |  |  |       doc["palettes"] = serialized((const __FlashStringHelper*)JSON_palette_names); | 
					
						
							| 
									
										
										
										
											2019-03-06 00:20:38 +00:00
										 |  |  |   } | 
					
						
							|  |  |  |    | 
					
						
							| 
									
										
										
										
											2019-03-05 09:59:15 +00:00
										 |  |  |   response->setLength(); | 
					
						
							|  |  |  |   request->send(response); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2019-11-18 11:29:36 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | #define MAX_LIVE_LEDS 180
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void serveLiveLeds(AsyncWebServerRequest* request) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2020-01-14 09:57:23 +00:00
										 |  |  |   byte used = ledCount; | 
					
						
							| 
									
										
										
										
											2019-12-01 00:42:52 +00:00
										 |  |  |   byte n = (used -1) /MAX_LIVE_LEDS +1; //only serve every n'th LED if count over MAX_LIVE_LEDS
 | 
					
						
							| 
									
										
										
										
											2019-11-18 11:29:36 +00:00
										 |  |  |   char buffer[2000] = "{\"leds\":["; | 
					
						
							|  |  |  |   olen = 9; | 
					
						
							|  |  |  |   obuf = buffer; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-01 00:42:52 +00:00
										 |  |  |   for (uint16_t i= 0; i < used; i += n) | 
					
						
							| 
									
										
										
										
											2019-11-18 11:29:36 +00:00
										 |  |  |   { | 
					
						
							|  |  |  |     olen += sprintf(buffer + olen, "\"%06X\",", strip.getPixelColor(i)); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   olen -= 1; | 
					
						
							|  |  |  |   oappend("],\"n\":"); | 
					
						
							|  |  |  |   oappendi(n); | 
					
						
							|  |  |  |   oappend("}"); | 
					
						
							|  |  |  |   request->send(200, "application/json", buffer); | 
					
						
							|  |  |  | } |