From 1f1683fe2cf345b22e206506d46530a6091117e2 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 22 Jan 2026 23:43:39 +0300 Subject: [PATCH] add ws --- platformio.ini | 3 +- src/main.cpp | 3 ++ src/web_ui.cpp | 38 +++++++++++++++++++++-- src/ws_server.cpp | 79 +++++++++++++++++++++++++++++++++++++++++++++++ src/ws_server.h | 4 +++ 5 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 src/ws_server.cpp create mode 100644 src/ws_server.h diff --git a/platformio.ini b/platformio.ini index d9d88c8..4b444fe 100644 --- a/platformio.ini +++ b/platformio.ini @@ -16,4 +16,5 @@ monitor_speed = 115200 lib_deps = adafruit/Adafruit GFX Library - adafruit/Adafruit SSD1306 \ No newline at end of file + adafruit/Adafruit SSD1306 + links2004/WebSockets \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 7a04a87..d7970e5 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -4,17 +4,20 @@ #include "web_server.h" #include "controller.h" #include "robot_state.h" +#include "ws_server.h" void setup() { Serial.begin(115200); actuatorsInit(); webServerInit(); + wsInit(); robot.lastCmdMs = millis(); } void loop() { webServerLoop(); + wsLoop(); controllerUpdate(); } diff --git a/src/web_ui.cpp b/src/web_ui.cpp index 1ce7f49..3a194ed 100644 --- a/src/web_ui.cpp +++ b/src/web_ui.cpp @@ -52,10 +52,30 @@ const char INDEX_HTML[] PROGMEM = R"HTML( diff --git a/src/ws_server.cpp b/src/ws_server.cpp new file mode 100644 index 0000000..0da44f7 --- /dev/null +++ b/src/ws_server.cpp @@ -0,0 +1,79 @@ +#include +#include + +#include "ws_server.h" +#include "controller.h" +#include "robot_state.h" + +static WebSocketsServer ws(81); // порт 81 + +static uint32_t lastWsCmdMs = 0; + +void wsEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) { + switch (type) { + + case WStype_CONNECTED: + lastWsCmdMs = millis(); + break; + + case WStype_DISCONNECTED: + controllerStop(); + break; + + case WStype_TEXT: { + String msg = String((char*)payload); + + // простейший протокол + // MOVE:FWD / MOVE:STOP / SPEED:150 + + if (msg.startsWith("MOVE:")) { + String cmd = msg.substring(5); + cmd.toUpperCase(); + + robot.lastCmdMs = millis(); + lastWsCmdMs = millis(); + + if (cmd == "STOP") { + controllerStop(); + } else { + controllerMove(cmd); + } + } + + else if (msg.startsWith("SPEED:")) { + int v = msg.substring(6).toInt(); + controllerSetSpeed(v, v); + } + break; + } + + default: + break; + } +} + +void wsInit() { + ws.begin(); + ws.onEvent(wsEvent); +} + +void wsLoop() { + ws.loop(); + + // если WebSocket умер — стоп + if (robot.mode == MODE_MANUAL && + millis() - lastWsCmdMs > 400) { + controllerStop(); + } +} + +void wsBroadcastStatus() { + String json = "{"; + json += "\"mode\":\"" + String(modeToStr(robot.mode)) + "\","; + json += "\"speedL\":" + String(robot.speedL) + ","; + json += "\"speedR\":" + String(robot.speedR) + ","; + json += "\"uptime\":" + String(millis()); + json += "}"; + + ws.broadcastTXT(json); +} diff --git a/src/ws_server.h b/src/ws_server.h new file mode 100644 index 0000000..d59a3bd --- /dev/null +++ b/src/ws_server.h @@ -0,0 +1,4 @@ +#pragma once +void wsInit(); +void wsLoop(); +void wsBroadcastStatus();