PatrixNode/src/patrix/core/http.cpp

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);
}
}