Radio/src/http.cpp
2025-06-06 12:52:35 +02:00

84 lines
2.4 KiB
C++

#include "http.h"
#include <ArduinoJson.h>
#include "audio.h"
#include "ESPAsyncWebServer.h"
#include "player.h"
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");
void onWebSocketEvent(AsyncWebSocket *server, AsyncWebSocketClient *client, const AwsEventType type, void *arg, const uint8_t *data, const size_t len) {
if (type == WS_EVT_CONNECT) {
Serial.printf("[WEBSOCKET] Connected: %s\n", client->remoteIP().toString().c_str());
client->text(stateBuffer);
} else if (type == WS_EVT_DISCONNECT) {
Serial.printf("[WEBSOCKET] Disconnected: %s\n", client->remoteIP().toString().c_str());
}
}
void httpSetup() {
Serial.println("Starting HTTP server");
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");
server.onNotFound([](AsyncWebServerRequest *request) {
const auto path = request->url();
if (path.endsWith("/") && path.length() > 1) {
request->redirect(path.substring(0, path.length() - 1));
} else {
request->send(404, "text/plain", "Not Found");
}
});
server.on("/state", [](AsyncWebServerRequest *request) {
request->send(200, "application/json", stateBuffer);
});
server.on("/stop", [](AsyncWebServerRequest *request) {
playerState = PLAYER_STOP;
request->send(200);
});
server.on("/play", [](AsyncWebServerRequest *request) {
playerState = PLAYER_PLAY;
request->send(200);
});
server.on("/pause", [](AsyncWebServerRequest *request) {
playerState = PLAYER_PAUSE;
request->send(200);
});
server.on("/mute", [](AsyncWebServerRequest *request) {
audioMute = true;
request->send(200);
});
server.on("/unmute", [](AsyncWebServerRequest *request) {
audioMute = false;
request->send(200);
});
server.on("/up", [](AsyncWebServerRequest *request) {
audioVolume = max(0.0f, min(audioVolume + 0.05f, 1.0f));
request->send(200);
});
server.on("/down", [](AsyncWebServerRequest *request) {
audioVolume = max(0.0f, min(audioVolume - 0.05f, 1.0f));
request->send(200);
});
server.on("/next", [](AsyncWebServerRequest *request) {
playerSkip += 1;
request->send(200);
});
server.on("/back", [](AsyncWebServerRequest *request) {
playerSkip -= 1;
request->send(200);
});
ws.onEvent(onWebSocketEvent);
server.addHandler(&ws);
server.begin();
}
void httpLoop() {
ws.cleanupClients();
}
void websocketSendAll() {
ws.textAll(stateBuffer);
}