Skip to content

Commit 0277425

Browse files
committed
Skip json buffer for fxdata
Eliminates size limit on ESP8266.
1 parent 7d90a3b commit 0277425

1 file changed

Lines changed: 39 additions & 16 deletions

File tree

wled00/json.cpp

Lines changed: 39 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -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
11811166
void 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

Comments
 (0)