81 lines
1.8 KiB
C++
81 lines
1.8 KiB
C++
#include <ESPAsyncWebServer.h>
|
|
#include <LittleFS.h>
|
|
#include <patrix/core/log.h>
|
|
#include <patrix/core/system.h>
|
|
#include <patrix/node/PatrixNode.h>
|
|
|
|
#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);
|
|
}
|
|
}
|