11#include " wled.h"
2+ #include " handler_queue.h"
23
34#ifndef WLED_DISABLE_OTA
45 #ifdef ESP8266
@@ -299,7 +300,7 @@ void initServer()
299300 });
300301
301302 server.on (F (" /settings" ), HTTP_POST, [](AsyncWebServerRequest *request){
302- serveSettings (request, true );
303+ HandlerQueue::callOnMainTask ([=]{ serveSettings (request, true ); });
303304 });
304305
305306 const static char _json[] PROGMEM = " /json" ;
@@ -308,10 +309,7 @@ void initServer()
308309 });
309310
310311 AsyncCallbackJsonWebHandler* handler = new AsyncCallbackJsonWebHandler (FPSTR (_json), [](AsyncWebServerRequest *request) {
311- bool verboseResponse = false ;
312- bool isConfig = false ;
313-
314- if (!requestJSONBufferLock (14 )) {
312+ if (!requestJSONBufferLock (14 , false )) {
315313 request->deferResponse ();
316314 return ;
317315 }
@@ -325,37 +323,42 @@ void initServer()
325323 }
326324 if (root.containsKey (" pin" )) checkSettingsPIN (root[" pin" ].as <const char *>());
327325
328- const String& url = request->url ();
329- isConfig = url.indexOf (F (" cfg" )) > -1 ;
330- if (!isConfig) {
331- /*
332- #ifdef WLED_DEBUG
333- DEBUG_PRINTLN(F("Serialized HTTP"));
334- serializeJson(root,Serial);
335- DEBUG_PRINTLN();
336- #endif
337- */
338- verboseResponse = deserializeState (root);
339- } else {
340- if (!correctPIN && strlen (settingsPIN)>0 ) {
341- releaseJSONBufferLock ();
342- serveJsonError (request, 401 , ERR_DENIED);
343- return ;
344- }
345- verboseResponse = deserializeConfig (root); // use verboseResponse to determine whether cfg change should be saved immediately
346- }
347- releaseJSONBufferLock ();
326+ HandlerQueue::callOnMainTask ([=](){
327+ bool verboseResponse = false ;
328+ bool isConfig = false ;
348329
349- if (verboseResponse) {
330+ const String& url = request->url ();
331+ isConfig = url.indexOf (F (" cfg" )) > -1 ;
350332 if (!isConfig) {
351- lastInterfaceUpdate = millis (); // prevent WS update until cooldown
352- interfaceUpdateCallMode = CALL_MODE_WS_SEND; // schedule WS update
353- serveJson (request); return ; // if JSON contains "v"
333+ /*
334+ #ifdef WLED_DEBUG
335+ DEBUG_PRINTLN(F("Serialized HTTP"));
336+ serializeJson(root,Serial);
337+ DEBUG_PRINTLN();
338+ #endif
339+ */
340+ verboseResponse = deserializeState (root);
354341 } else {
355- configNeedsWrite = true ; // Save new settings to FS
342+ if (!correctPIN && strlen (settingsPIN)>0 ) {
343+ releaseJSONBufferLock ();
344+ serveJsonError (request, 401 , ERR_DENIED);
345+ return ;
346+ }
347+ verboseResponse = deserializeConfig (root); // use verboseResponse to determine whether cfg change should be saved immediately
356348 }
357- }
358- request->send (200 , CONTENT_TYPE_JSON, F (" {\" success\" :true}" ));
349+ releaseJSONBufferLock ();
350+
351+ if (verboseResponse) {
352+ if (!isConfig) {
353+ lastInterfaceUpdate = millis (); // prevent WS update until cooldown
354+ interfaceUpdateCallMode = CALL_MODE_WS_SEND; // schedule WS update
355+ serveJson (request); return ; // if JSON contains "v"
356+ } else {
357+ configNeedsWrite = true ; // Save new settings to FS
358+ }
359+ }
360+ request->send (200 , CONTENT_TYPE_JSON, F (" {\" success\" :true}" ));
361+ });
359362 }, JSON_BUFFER_SIZE);
360363 server.addHandler (handler);
361364
@@ -509,7 +512,10 @@ void initServer()
509512 return ;
510513 }
511514
512- if (handleSet (request, request->url ())) return ;
515+ if (request->url ().indexOf (" win" ) >= 0 ) {
516+ HandlerQueue::callOnMainTask ([=]() { handleSet (request, request->url ()); });
517+ return ;
518+ }
513519 #ifndef WLED_DISABLE_ALEXA
514520 if (espalexa.handleAlexaApiCall (request)) return ;
515521 #endif
0 commit comments