#include #include #include #include #include #include "filesystem.h" #include "wifi.h" AsyncWebServer server(80); AsyncWebSocket ws("/ws"); auto httpSetUp = false; void httpReboot(AsyncWebServerRequest *request) { info("Rebooting..."); request->redirect("/"); request->client()->close(); yield(); delay(500); restart(); } void httpSetup() { fsMount(); ws.onEvent([](AsyncWebSocket *socket, AsyncWebSocketClient *client, AwsEventType type, void *arg, unsigned char *message, unsigned length) { const char *t; switch (type) { case WS_EVT_CONNECT: t = "CONNECT"; patrixNode.websocketEvent(socket, client, type, arg, message, length); break; case WS_EVT_DISCONNECT: t = "DISCONNECT"; break; case WS_EVT_PONG: t = "PONG"; break; case WS_EVT_ERROR: t = "ERROR"; break; case WS_EVT_DATA: t = "DATA"; break; default: t = "[???]"; break; } debug("%s: %s (%d bytes)", client->remoteIP().toString().c_str(), t, length); }); server.addHandler(&ws); server.serveStatic("/", LittleFS, "/http/"); server.on("/reboot", HTTP_GET, httpReboot); server.begin(); DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*"); DefaultHeaders::Instance().addHeader("Access-Control-Allow-Methods", "GET, POST, PUT"); DefaultHeaders::Instance().addHeader("Access-Control-Allow-Headers", "Content-Type"); httpSetUp = true; info("Webserver started."); } void httpLoop() { if (!httpSetUp && isWiFiConnected()) { httpSetup(); } if (httpSetUp) { ws.cleanupClients(); } } void websocketSendAll(const String& payload) { if (httpSetUp) { ws.textAll(payload); } }