Removes PsychicHttp dependency

This commit is contained in:
Rune Harlyk
2026-01-22 22:20:13 +01:00
committed by Rune Harlyk
parent 0b8e060063
commit 64199ac1a3
22 changed files with 256 additions and 413 deletions
+83 -93
View File
@@ -1,5 +1,4 @@
#include <Arduino.h>
#include <PsychicHttp.h>
#include <ESPmDNS.h>
#include <WiFi.h>
#include <Wire.h>
@@ -11,7 +10,8 @@
#include <peripherals/servo_controller.h>
#include <peripherals/led_service.h>
#include <peripherals/camera_service.h>
#include <communication/websocket_adapter.h>
#include <communication/native_server.h>
#include <communication/native_websocket.h>
#include <features.h>
#include <motion.h>
#include <wifi_service.h>
@@ -21,11 +21,8 @@
#include <www_mount.hpp>
// Communication
PsychicHttpServer server;
Websocket socket {server, "/api/ws"};
NativeWebsocket socket {nativeServer, "/api/ws"};
// Core
Peripherals peripherals;
ServoController servoController;
MotionService motionService;
@@ -39,99 +36,91 @@ Camera::CameraService cameraService;
MDNSService mdnsService;
#endif
// Service
WiFiService wifiService;
APService apService;
void setupServer() {
server.config.max_uri_handlers = 50 + WWW_ASSETS_COUNT;
server.config.stack_size = 32768; // 32KB
server.maxUploadSize = 1000000; // 1 MB;
server.listen(80);
server.on("/api/system/reset", HTTP_POST,
[&](PsychicRequest *request, JsonVariant &json) { return system_service::handleReset(request); });
server.on("/api/system/restart", HTTP_POST,
[&](PsychicRequest *request, JsonVariant &json) { return system_service::handleRestart(request); });
server.on("/api/system/sleep", HTTP_POST,
[&](PsychicRequest *request, JsonVariant &json) { return system_service::handleSleep(request); });
nativeServer.config(50 + WWW_ASSETS_COUNT, 32768, 1000000);
nativeServer.listen(80);
nativeServer.on("/api/system/reset", HTTP_POST,
[&](httpd_req_t *request, JsonVariant &json) { return system_service::handleReset(request); });
nativeServer.on("/api/system/restart", HTTP_POST,
[&](httpd_req_t *request, JsonVariant &json) { return system_service::handleRestart(request); });
nativeServer.on("/api/system/sleep", HTTP_POST,
[&](httpd_req_t *request, JsonVariant &json) { return system_service::handleSleep(request); });
#if USE_CAMERA
server.on("/api/camera/still", HTTP_GET,
[&](PsychicRequest *request) { return cameraService.cameraStill(request); });
server.on("/api/camera/stream", HTTP_GET,
[&](PsychicRequest *request) { return cameraService.cameraStream(request); });
server.on("/api/camera/settings", HTTP_GET,
[&](PsychicRequest *request) { return cameraService.endpoint.getState(request); });
server.on("/api/camera/settings", HTTP_POST, [&](PsychicRequest *request, JsonVariant &json) {
nativeServer.on("/api/camera/still", HTTP_GET,
[&](httpd_req_t *request) { return cameraService.cameraStill(request); });
nativeServer.on("/api/camera/stream", HTTP_GET,
[&](httpd_req_t *request) { return cameraService.cameraStream(request); });
nativeServer.on("/api/camera/settings", HTTP_GET,
[&](httpd_req_t *request) { return cameraService.endpoint.getState(request); });
nativeServer.on("/api/camera/settings", HTTP_POST, [&](httpd_req_t *request, JsonVariant &json) {
return cameraService.endpoint.handleStateUpdate(request, json);
});
#endif
server.on("/api/servo/config", HTTP_GET,
[&](PsychicRequest *request) { return servoController.endpoint.getState(request); });
server.on("/api/servo/config", HTTP_POST, [&](PsychicRequest *request, JsonVariant &json) {
nativeServer.on("/api/servo/config", HTTP_GET,
[&](httpd_req_t *request) { return servoController.endpoint.getState(request); });
nativeServer.on("/api/servo/config", HTTP_POST, [&](httpd_req_t *request, JsonVariant &json) {
return servoController.endpoint.handleStateUpdate(request, json);
});
// WiFi
server.on("/api/wifi/sta/settings", HTTP_GET,
[&](PsychicRequest *request) { return wifiService.endpoint.getState(request); });
server.on("/api/wifi/sta/settings", HTTP_POST, [&](PsychicRequest *request, JsonVariant &json) {
nativeServer.on("/api/wifi/sta/settings", HTTP_GET,
[&](httpd_req_t *request) { return wifiService.endpoint.getState(request); });
nativeServer.on("/api/wifi/sta/settings", HTTP_POST, [&](httpd_req_t *request, JsonVariant &json) {
return wifiService.endpoint.handleStateUpdate(request, json);
});
server.on("/api/wifi/scan", HTTP_GET, [&](PsychicRequest *request) { return wifiService.handleScan(request); });
server.on("/api/wifi/networks", HTTP_GET,
[&](PsychicRequest *request) { return wifiService.getNetworks(request); });
server.on("/api/wifi/sta/status", HTTP_GET,
[&](PsychicRequest *request) { return wifiService.getNetworkStatus(request); });
nativeServer.on("/api/wifi/scan", HTTP_GET, [&](httpd_req_t *request) { return wifiService.handleScan(request); });
nativeServer.on("/api/wifi/networks", HTTP_GET,
[&](httpd_req_t *request) { return wifiService.getNetworks(request); });
nativeServer.on("/api/wifi/sta/status", HTTP_GET,
[&](httpd_req_t *request) { return wifiService.getNetworkStatus(request); });
// AP
server.on("/api/ap/status", HTTP_GET, [&](PsychicRequest *request) { return apService.getStatus(request); });
server.on("/api/ap/settings", HTTP_GET,
[&](PsychicRequest *request) { return apService.endpoint.getState(request); });
server.on("/api/ap/settings", HTTP_POST, [&](PsychicRequest *request, JsonVariant &json) {
nativeServer.on("/api/ap/status", HTTP_GET, [&](httpd_req_t *request) { return apService.getStatus(request); });
nativeServer.on("/api/ap/settings", HTTP_GET,
[&](httpd_req_t *request) { return apService.endpoint.getState(request); });
nativeServer.on("/api/ap/settings", HTTP_POST, [&](httpd_req_t *request, JsonVariant &json) {
return apService.endpoint.handleStateUpdate(request, json);
});
// Peripherals
server.on("/api/peripherals", HTTP_GET,
[&](PsychicRequest *request) { return peripherals.endpoint.getState(request); });
server.on("/api/peripherals", HTTP_POST, [&](PsychicRequest *request, JsonVariant &json) {
nativeServer.on("/api/peripherals", HTTP_GET,
[&](httpd_req_t *request) { return peripherals.endpoint.getState(request); });
nativeServer.on("/api/peripherals", HTTP_POST, [&](httpd_req_t *request, JsonVariant &json) {
return peripherals.endpoint.handleStateUpdate(request, json);
});
// MDNS
#if FT_ENABLED(USE_MDNS)
server.on("/api/mdns", HTTP_GET, [&](PsychicRequest *request) { return mdnsService.endpoint.getState(request); });
server.on("/api/mdns", HTTP_POST, [&](PsychicRequest *request, JsonVariant &json) {
nativeServer.on("/api/mdns", HTTP_GET,
[&](httpd_req_t *request) { return mdnsService.endpoint.getState(request); });
nativeServer.on("/api/mdns", HTTP_POST, [&](httpd_req_t *request, JsonVariant &json) {
return mdnsService.endpoint.handleStateUpdate(request, json);
});
server.on("/api/mdns/status", HTTP_GET, [&](PsychicRequest *request) { return mdnsService.getStatus(request); });
server.on("/api/mdns/query", HTTP_POST,
[&](PsychicRequest *request, JsonVariant &json) { return mdnsService.queryServices(request, json); });
nativeServer.on("/api/mdns/status", HTTP_GET, [&](httpd_req_t *request) { return mdnsService.getStatus(request); });
nativeServer.on("/api/mdns/query", HTTP_POST,
[&](httpd_req_t *request, JsonVariant &json) { return mdnsService.queryServices(request, json); });
#endif
// Filesystem
server.on("/api/config/*", HTTP_GET, [](PsychicRequest *request) { return FileSystem::getConfigFile(request); });
server.on("/api/files", HTTP_GET, [&](PsychicRequest *request) { return FileSystem::getFiles(request); });
server.on("/api/files", HTTP_POST, FileSystem::uploadHandler);
server.on("/api/files/delete", HTTP_POST,
[&](PsychicRequest *request, JsonVariant &json) { return FileSystem::handleDelete(request, json); });
server.on("/api/files/edit", HTTP_POST,
[&](PsychicRequest *request, JsonVariant &json) { return FileSystem::handleEdit(request, json); });
server.on("/api/files/mkdir", HTTP_POST,
[&](PsychicRequest *request, JsonVariant &json) { return FileSystem::mkdir(request, json); });
nativeServer.on("/api/config/*", HTTP_GET, [](httpd_req_t *request) { return FileSystem::getConfigFile(request); });
nativeServer.on("/api/files", HTTP_GET, [&](httpd_req_t *request) { return FileSystem::getFiles(request); });
nativeServer.on("/api/files/delete", HTTP_POST,
[&](httpd_req_t *request, JsonVariant &json) { return FileSystem::handleDelete(request, json); });
nativeServer.on("/api/files/edit", HTTP_POST,
[&](httpd_req_t *request, JsonVariant &json) { return FileSystem::handleEdit(request, json); });
nativeServer.on("/api/files/mkdir", HTTP_POST,
[&](httpd_req_t *request, JsonVariant &json) { return FileSystem::mkdir(request, json); });
#if EMBED_WEBAPP
mountStaticAssets(server);
mountStaticAssets(nativeServer);
#endif
server.on("/*", HTTP_OPTIONS, [](PsychicRequest *request) { // CORS handling
PsychicResponse response(request);
response.setCode(200);
return response.send();
nativeServer.on("/*", HTTP_OPTIONS, [](httpd_req_t *request) {
httpd_resp_set_status(request, "200 OK");
return httpd_resp_send(request, nullptr, 0);
});
DefaultHeaders::Instance().addHeader("Server", APP_NAME);
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Origin", "*");
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Authorization");
DefaultHeaders::Instance().addHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
DefaultHeaders::Instance().addHeader("Access-Control-Max-Age", "86400");
nativeServer.addDefaultHeader("Server", APP_NAME);
nativeServer.addDefaultHeader("Access-Control-Allow-Origin", "*");
nativeServer.addDefaultHeader("Access-Control-Allow-Headers", "Accept, Content-Type, Authorization");
nativeServer.addDefaultHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
nativeServer.addDefaultHeader("Access-Control-Max-Age", "86400");
}
void setupEventSocket() {
@@ -164,76 +153,77 @@ void setupEventSocket() {
data.active ? servoController.activate() : servoController.deactivate();
});
socket.on<socket_message_FSUploadData>([&](const socket_message_FSUploadData &data, int clientId) {
FileSystemWS::fsHandler.handleUploadData(data);
});
socket.on<socket_message_FSUploadData>(
[&](const socket_message_FSUploadData &data, int clientId) { FileSystemWS::fsHandler.handleUploadData(data); });
using CorrelationHandler =
std::function<void(const socket_message_CorrelationRequest &, socket_message_CorrelationResponse &, int)>;
static std::map<pb_size_t, CorrelationHandler> correlationHandlers = {
{socket_message_CorrelationRequest_features_data_request_tag, // Features data
{socket_message_CorrelationRequest_features_data_request_tag,
[](const auto &req, auto &res, int clientId) {
res.which_response = socket_message_CorrelationResponse_features_data_response_tag;
feature_service::features_request(req.request.features_data_request, res.response.features_data_response);
}},
{socket_message_CorrelationRequest_i2c_scan_data_request_tag, // i2c data
{socket_message_CorrelationRequest_i2c_scan_data_request_tag,
[](const auto &req, auto &res, int clientId) {
res.which_response = socket_message_CorrelationResponse_i2c_scan_data_tag;
peripherals.scanI2C();
peripherals.getI2CScanProto(res.response.i2c_scan_data);
}},
{socket_message_CorrelationRequest_imu_calibrate_execute_tag, // Calibration request
{socket_message_CorrelationRequest_imu_calibrate_execute_tag,
[](const auto &req, auto &res, int clientId) {
res.which_response = socket_message_CorrelationResponse_imu_calibrate_data_tag;
res.response.imu_calibrate_data.success = peripherals.calibrateIMU();
}},
{socket_message_CorrelationRequest_system_information_request_tag, // All system information data
{socket_message_CorrelationRequest_system_information_request_tag,
[](const auto &req, auto &res, int clientId) {
res.which_response = socket_message_CorrelationResponse_system_information_response_tag;
res.response.system_information_response.has_analytics_data = true;
res.response.system_information_response.has_static_system_information = true;
system_service::getAnalytics(res.response.system_information_response.analytics_data);
system_service::getStaticSystemInformation(res.response.system_information_response.static_system_information);
res.which_response = socket_message_CorrelationResponse_system_information_response_tag;
res.response.system_information_response.has_analytics_data = true;
res.response.system_information_response.has_static_system_information = true;
system_service::getAnalytics(res.response.system_information_response.analytics_data);
system_service::getStaticSystemInformation(
res.response.system_information_response.static_system_information);
}},
// Filesystem operations
{socket_message_CorrelationRequest_fs_delete_request_tag, // Delete file/directory
{socket_message_CorrelationRequest_fs_delete_request_tag,
[](const auto &req, auto &res, int clientId) {
res.which_response = socket_message_CorrelationResponse_fs_delete_response_tag;
res.response.fs_delete_response = FileSystemWS::fsHandler.handleDelete(req.request.fs_delete_request);
}},
{socket_message_CorrelationRequest_fs_mkdir_request_tag, // Create directory
{socket_message_CorrelationRequest_fs_mkdir_request_tag,
[](const auto &req, auto &res, int clientId) {
res.which_response = socket_message_CorrelationResponse_fs_mkdir_response_tag;
res.response.fs_mkdir_response = FileSystemWS::fsHandler.handleMkdir(req.request.fs_mkdir_request);
}},
{socket_message_CorrelationRequest_fs_list_request_tag, // List directory
{socket_message_CorrelationRequest_fs_list_request_tag,
[](const auto &req, auto &res, int clientId) {
res.which_response = socket_message_CorrelationResponse_fs_list_response_tag;
res.response.fs_list_response = FileSystemWS::fsHandler.handleList(req.request.fs_list_request);
}},
{socket_message_CorrelationRequest_fs_download_request_tag, // Streaming download (no response, streams data)
{socket_message_CorrelationRequest_fs_download_request_tag,
[](const auto &req, auto &res, int clientId) {
FileSystemWS::fsHandler.handleDownloadRequest(req.request.fs_download_request, clientId);
res.status_code = 0;
}},
{socket_message_CorrelationRequest_fs_upload_start_tag, // Upload start
{socket_message_CorrelationRequest_fs_upload_start_tag,
[](const auto &req, auto &res, int clientId) {
res.which_response = socket_message_CorrelationResponse_fs_upload_start_response_tag;
res.response.fs_upload_start_response = FileSystemWS::fsHandler.handleUploadStart(req.request.fs_upload_start, clientId);
res.response.fs_upload_start_response =
FileSystemWS::fsHandler.handleUploadStart(req.request.fs_upload_start, clientId);
}},
{socket_message_CorrelationRequest_fs_cancel_transfer_tag, // Cancel transfer
{socket_message_CorrelationRequest_fs_cancel_transfer_tag,
[](const auto &req, auto &res, int clientId) {
res.which_response = socket_message_CorrelationResponse_fs_cancel_transfer_response_tag;
res.response.fs_cancel_transfer_response = FileSystemWS::fsHandler.handleCancelTransfer(req.request.fs_cancel_transfer);
res.response.fs_cancel_transfer_response =
FileSystemWS::fsHandler.handleCancelTransfer(req.request.fs_cancel_transfer);
}},
};
@@ -339,4 +329,4 @@ void setup() {
ESP_LOGI("main", "Finished booting");
}
void loop() { vTaskDelete(nullptr); }
void loop() { vTaskDelete(nullptr); }