/* * Server page definitions */ void initServer() { //CORS compatiblity DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); //settings page server.on("/settings", HTTP_GET, [](AsyncWebServerRequest *request){ serveSettings(request); }); server.on("/favicon.ico", HTTP_GET, [](AsyncWebServerRequest *request){ if(!handleFileRead("/favicon.ico")) { request->send_P(200, "image/x-icon", favicon, 156); } }); server.on("/sliders", HTTP_GET, [](AsyncWebServerRequest *request){ serveIndex(request); }); server.on("/welcome", HTTP_GET, [](AsyncWebServerRequest *request){ serveSettings(request); }); server.on("/reset", HTTP_GET, [](AsyncWebServerRequest *request){ serveMessage(request, 200,"Rebooting now...","Please wait ~15 seconds...",132); doReboot = true; }); server.on("/settings/wifi", HTTP_POST, [](AsyncWebServerRequest *request){ if (!(wifiLock && otaLock)) handleSettingsSet(request, 1); serveMessage(request, 200,"WiFi settings saved.","Rebooting now...",255); doReboot = true; }); server.on("/settings/leds", HTTP_POST, [](AsyncWebServerRequest *request){ handleSettingsSet(request, 2); serveMessage(request, 200,"LED settings saved.","Redirecting...",1); }); server.on("/settings/ui", HTTP_POST, [](AsyncWebServerRequest *request){ handleSettingsSet(request, 3); serveMessage(request, 200,"UI settings saved.","Reloading to apply theme...",122); }); server.on("/settings/sync", HTTP_POST, [](AsyncWebServerRequest *request){ handleSettingsSet(request, 4); if (hueAttempt) { serveMessage(request, 200,"Hue setup result",hueError,253); } else { serveMessage(request, 200,"Sync settings saved.","Redirecting...",1); } hueAttempt = false; }); server.on("/settings/time", HTTP_POST, [](AsyncWebServerRequest *request){ handleSettingsSet(request, 5); serveMessage(request, 200,"Time settings saved.","Redirecting...",1); }); server.on("/settings/sec", HTTP_POST, [](AsyncWebServerRequest *request){ handleSettingsSet(request, 6); serveMessage(request, 200,"Security settings saved.","Rebooting now, please wait ~15 seconds...",132); doReboot = true; }); server.on("/json/effects", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "application/json", JSON_mode_names); }); server.on("/json/palettes", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "application/json", JSON_palette_names); }); server.on("/json", HTTP_ANY, [](AsyncWebServerRequest *request){ request->send(500, "application/json", "{\"error\":\"Not implemented\"}"); }); server.on("/version", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, "text/plain", (String)VERSION); }); server.on("/uptime", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, "text/plain", (String)millis()); }); server.on("/freeheap", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, "text/plain", (String)ESP.getFreeHeap()); }); server.on("/power", HTTP_GET, [](AsyncWebServerRequest *request){ String val = ""; if (strip.currentMilliamps == 0) { val = "Power calculation disabled"; } else { val += (String)strip.currentMilliamps; val += "mA currently"; } serveMessage(request, 200, val, "This is just an estimate (does not account for factors like wire resistance). It is NOT a measurement!", 254); }); server.on("/u", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", PAGE_usermod); }); server.on("/teapot", HTTP_GET, [](AsyncWebServerRequest *request){ serveMessage(request, 418, "418. I'm a teapot.", "(Tangible Embedded Advanced Project Of Twinkling)", 254); }); server.on("/build", HTTP_GET, [](AsyncWebServerRequest *request){ getBuildInfo(); request->send(200, "text/plain", obuf); }); //if OTA is allowed if (!otaLock){ server.on("/edit", HTTP_GET, [](AsyncWebServerRequest *request){ request->send(200, "text/html", PAGE_edit); }); #ifdef USEFS server.on("/edit", HTTP_PUT, handleFileCreate); server.on("/edit", HTTP_DELETE, handleFileDelete); server.on("/edit", HTTP_POST, [](){ server->send(200, "text/plain", ""); }, handleFileUpload); server.on("/list", HTTP_GET, handleFileList); #endif //init ota page #ifndef WLED_DISABLE_OTA server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){ serveMessage(request, 200, "WLED Software Update", "Your installed version: " + String(versionString) + "
Download the latest binary: " "" "
" "
", 254); }); server.on("/update", HTTP_POST, [](AsyncWebServerRequest *request){ if (Update.hasError()) { serveMessage(request, 500, "Failed updating firmware!", "Please check your file and retry!", 254); return; } serveMessage(request, 200, "Successfully updated firmware!", "Please wait while the module reboots...", 132); doReboot = true; },[](AsyncWebServerRequest *request, String filename, size_t index, uint8_t *data, size_t len, bool final){ if(!index){ DEBUG_PRINTLN("OTA Update Start"); #ifndef ARDUINO_ARCH_ESP32 Update.runAsync(true); #endif Update.begin((ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000); } if(!Update.hasError()) Update.write(data, len); if(final){ if(Update.end(true)){ DEBUG_PRINTLN("Update Success"); } else { DEBUG_PRINTLN("Update Failed"); } } }); #else server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){ serveMessage(request, 500, "Not implemented", "OTA updates are unsupported in this build.", 254); }); #endif } else { server.on("/edit", HTTP_GET, [](AsyncWebServerRequest *request){ serveMessage(request, 500, "Access Denied", txd, 254); }); server.on("/update", HTTP_GET, [](AsyncWebServerRequest *request){ serveMessage(request, 500, "Access Denied", txd, 254); }); server.on("/list", HTTP_GET, [](AsyncWebServerRequest *request){ serveMessage(request, 500, "Access Denied", txd, 254); }); } server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ serveIndexOrWelcome(request); }); //called when the url is not defined here, ajax-in; get-settings server.onNotFound([](AsyncWebServerRequest *request){ DEBUG_PRINTLN("Not-Found HTTP call:"); DEBUG_PRINTLN("URI: " + server->uri()); DEBUG_PRINTLN("Body: " + server->arg(0)); //make API CORS compatible if (request->method() == HTTP_OPTIONS) { request->send(200); return; } if(!handleSet(request, request->url())){ #ifndef WLED_DISABLE_ALEXA if(!espalexa.handleAlexaApiCall(request)) #endif request->send(404, "text/plain", "Not Found"); } }); } void serveIndexOrWelcome(AsyncWebServerRequest *request) { if (!showWelcomePage){ serveIndex(request); } else { serveSettings(request); } } void serveRealtimeError(AsyncWebServerRequest *request, bool settings) { String mesg = "The "; mesg += (settings)?"settings":"WLED"; mesg += " UI is not available while receiving real-time data ("; if (realtimeIP[0] == 0) { mesg += "E1.31"; } else { mesg += "UDP from "; mesg += realtimeIP[0]; for (int i = 1; i < 4; i++) { mesg += "."; mesg += realtimeIP[i]; } } mesg += ")."; request->send(200, "text/plain", mesg); } void getCSSColors() { char cs[6][9]; getThemeColors(cs); oappend("