#include #include #include #include #include #include "ledcontroller.h" constexpr auto WIFI_SSID = "McDonalds Free WiFi 2.4GHz"; constexpr auto WIFI_PASSWD = "Passwort_123"; LedController ledController; ESP8266WebServer server(80); bool power = true; bool rotatePattern = true; void setup() { Serial.begin(115200); Serial.setDebugOutput(true); WiFi.begin(WIFI_SSID, WIFI_PASSWD); server.on("/", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html", "" "" "" "" "" "" "" "" "" "LED-Control" "" "" "" "" "" "" "" ); }); server.on("/update", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.send(200, "text/html", "
" "" "" "
"); }); server.on("/update", HTTP_POST, []() { server.sendHeader("Connection", "close"); server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); ESP.restart(); }, []() { HTTPUpload& upload = server.upload(); if (upload.status == UPLOAD_FILE_START) { Serial.setDebugOutput(true); Serial.printf("Update: %s\n", upload.filename.c_str()); uint32_t maxSketchSpace = (ESP.getFreeSketchSpace() - 0x1000) & 0xFFFFF000; if (!Update.begin(maxSketchSpace)) { //start with max available size Update.printError(Serial); } } else if (upload.status == UPLOAD_FILE_WRITE) { if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { Update.printError(Serial); } } else if (upload.status == UPLOAD_FILE_END) { if (Update.end(true)) { //true to set the size to the current progress Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); } else { Update.printError(Serial); } Serial.setDebugOutput(false); } yield(); }); server.on("/status", HTTP_GET, []() { server.sendHeader("Connection", "close"); server.sendHeader("Access-Control-Allow-Origin", "*"); String str = "{"; str += "\"patterns\":["; bool first = true; for (auto pattern : ledController.patterns) { if (first) first = false; else str += ','; str += "{\"name\":\""; str += pattern->name(); str += "\",\"selected\":"; str += (*ledController.iter) == pattern ? "true" : "false"; str += '}'; } str += "],"; str += "\"power\":"; str += power ? "true" : "false"; str += ","; str += "\"autoRotate\":"; str += rotatePattern ? "true" : "false"; str += ","; str += "\"brightness\":"; str += String(int(FastLED.getBrightness())); str += "}"; server.send(200, "text/json", str.c_str()); }); server.on("/nextPattern", HTTP_GET, []() { ledController.nextPattern(); server.send(200, "text/html", "ok"); }); server.on("/setPattern", HTTP_GET, []() { const String *val = nullptr; for (int i = 0; i < server.args(); i++) if (server.argName(i) == "val") val = &server.arg(i); if (!val) { server.send(400, "text/html", "val missing"); return; } const auto index = atoi(val->c_str()); if (index < 0 || index >= ledController.patterns.size()) { server.send(400, "text/html", "out of range"); return; } ledController.iter = ledController.patterns.begin() + index; server.send(200, "text/html", "ok"); }); server.on("/setPower", HTTP_GET, []() { const String *val = nullptr; for (int i = 0; i < server.args(); i++) if (server.argName(i) == "val") val = &server.arg(i); if (!val) { server.send(400, "text/html", "val missing"); return; } if (*val != "true" && *val != "false") { server.send(400, "text/html", "invalid val"); return; } power = *val == "true"; server.send(200, "text/html", "ok"); }); server.on("/setPatternRotate", HTTP_GET, []() { const String *val = nullptr; for (int i = 0; i < server.args(); i++) if (server.argName(i) == "val") val = &server.arg(i); if (!val) { server.send(400, "text/html", "val missing"); return; } if (*val != "true" && *val != "false") { server.send(400, "text/html", "invalid val"); return; } rotatePattern = *val == "true"; server.send(200, "text/html", "ok"); }); server.on("/setBrightness", HTTP_GET, []() { const String *val = nullptr; for (int i = 0; i < server.args(); i++) if (server.argName(i) == "val") val = &server.arg(i); if (!val) { server.send(400, "text/html", "val missing"); return; } const auto brightness = atoi(val->c_str()); if (brightness < 0 || brightness > 255) { server.send(400, "text/html", "out of range"); return; } FastLED.setBrightness(brightness); server.send(200, "text/html", "ok"); }); server.begin(); } void loop() { EVERY_N_MILLISECONDS(20) { if (power) ledController.run(); else ledController.poweroff(); FastLED.show(); } if (power && rotatePattern) { EVERY_N_SECONDS(10) { ledController.nextPattern(); } } server.handleClient(); }