@@ -1161,21 +1161,6 @@ void serializePins(JsonObject root)
11611161 }
11621162}
11631163
1164- // deserializes mode data string into JsonArray
1165- void serializeModeData (JsonArray fxdata)
1166- {
1167- char lineBuffer[256 ];
1168- for (size_t i = 0 ; i < strip.getModeCount (); i++) {
1169- strncpy_P (lineBuffer, strip.getModeData (i), sizeof (lineBuffer)/sizeof (char )-1 );
1170- lineBuffer[sizeof (lineBuffer)/sizeof (char )-1 ] = ' \0 ' ; // terminate string
1171- if (lineBuffer[0 ] != 0 ) {
1172- char * dataPtr = strchr (lineBuffer,' @' );
1173- if (dataPtr) fxdata.add (dataPtr+1 );
1174- else fxdata.add (" " );
1175- }
1176- }
1177- }
1178-
11791164// deserializes mode names string into JsonArray
11801165// also removes effect data extensions (@...) from deserialised names
11811166void serializeModeNames (JsonArray arr)
@@ -1249,6 +1234,44 @@ void serveJson(AsyncWebServerRequest* request)
12491234 return ;
12501235 }
12511236
1237+ if (subJson == json_target::fxdata) {
1238+ size_t fx_index = 0 ;
1239+ request->sendChunked (FPSTR (CONTENT_TYPE_JSON),
1240+ [fx_index](uint8_t * data, size_t len, size_t ) mutable {
1241+ size_t bytes_written = 0 ;
1242+ char lineBuffer[256 ];
1243+ while (fx_index < strip.getModeCount () && (len > 5 )) {
1244+ strncpy_P (lineBuffer, strip.getModeData (fx_index), sizeof (lineBuffer)/sizeof (char )-1 ); // Copy to stack buffer
1245+ if (lineBuffer[0 ] != 0 ) {
1246+ lineBuffer[sizeof (lineBuffer)/sizeof (char )-1 ] = ' \0 ' ; // terminate string
1247+ char * dataPtr = strchr (lineBuffer,' @' ); // Find '@', if there is one
1248+ size_t mode_bytes;
1249+ if (dataPtr) {
1250+ mode_bytes = snprintf_P ((char *) data, len, PSTR (" ,\" %s\" " ), dataPtr + 1 );
1251+ if (mode_bytes > len) break ; // didn't fit
1252+ } else {
1253+ strncpy_P ((char *)data, PSTR (" ,\"\" " ), len);
1254+ mode_bytes = 3 ;
1255+ }
1256+ if (fx_index == 0 ) *data = ' [' ;
1257+ data += mode_bytes;
1258+ len -= mode_bytes;
1259+ bytes_written += mode_bytes;
1260+ }
1261+ ++fx_index;
1262+ }
1263+
1264+ if ((fx_index == strip.getModeCount ()) && (len >= 1 )) {
1265+ *data = ' ]' ;
1266+ ++bytes_written;
1267+ ++fx_index; // we're really done
1268+ }
1269+
1270+ return bytes_written;
1271+ });
1272+ return ;
1273+ }
1274+
12521275 if (!requestJSONBufferLock (JSON_LOCK_SERVEJSON)) {
12531276 request->deferResponse ();
12541277 return ;
@@ -1272,7 +1295,7 @@ void serveJson(AsyncWebServerRequest* request)
12721295 case json_target::effects:
12731296 serializeModeNames (lDoc); break ;
12741297 case json_target::fxdata:
1275- serializeModeData (lDoc); break ;
1298+ break ; // handled earlier, should never get here
12761299 case json_target::networks:
12771300 serializeNetworks (lDoc); break ;
12781301 case json_target::config:
0 commit comments