From 7318343accd30c8314a71f528aece26eb2efdda5 Mon Sep 17 00:00:00 2001 From: Arduinum628 Date: Tue, 16 Sep 2025 09:50:07 +0300 Subject: [PATCH] feat: added stop command, updated command processing, created .env.example --- .env.example | 12 ++++++++++- src/web_robot_control/settings.py | 1 + src/web_robot_control/views.py | 19 +++++++---------- static/command.js | 35 +++++++++++++++++++------------ 4 files changed, 42 insertions(+), 25 deletions(-) diff --git a/.env.example b/.env.example index 79d778a..a8c5792 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,11 @@ -STREAM_URL="url адрес видеопотока" \ No newline at end of file +# Урлы +STREAM_URL=адрес видеопотока +WEBSOCKET_URL=адрес вебсокета клиента +WEBSOCKET_URL_ROBOT=адрес вебсокета робота + +# Команды для робота +FORWARD=вперёд +BACKWARD=назад +LEFT=влево +RIGHT=вправо +STOP=стоп \ No newline at end of file diff --git a/src/web_robot_control/settings.py b/src/web_robot_control/settings.py index 4032f99..3d79add 100644 --- a/src/web_robot_control/settings.py +++ b/src/web_robot_control/settings.py @@ -18,6 +18,7 @@ class CommandsRobot(ModelConfig): backward: str left: str right: str + stop: str def get_list_commands(self): """Метод вернёт список всех команд""" diff --git a/src/web_robot_control/views.py b/src/web_robot_control/views.py index 8aeb472..c04f2e8 100644 --- a/src/web_robot_control/views.py +++ b/src/web_robot_control/views.py @@ -70,26 +70,23 @@ async def websocket_endpoint(websocket: WebSocket) -> None: while True: # Получение команды от клиента (с веб-сокета) - command = await websocket.receive_text() - + response = await websocket.receive_text() + data = loads(response) + command = data.get('command') + if previous_command != command: previous_command = command valid_commands = settings.commands_robot.get_list_commands() - data = loads(command) - name_command = next(iter(data), None) - - if name_command in valid_commands: - print(command) + + if command in valid_commands: # оптравка команды роботу - robot_answer = await command_to_robot(command=command) + robot_answer = await command_to_robot(command=response) if robot_answer: # отправка ответа робота на вебсокет фронтенда await websocket.send_text(f'Получена команда: {command}, ответ робота: {robot_answer}') - print(f'Ответ робота: {robot_answer}') except WebSocketDisconnect: - print('WebSocket отключен') # Todo: для вывода ошибок будет настроен logger - # Todo: для каждой ошибки написать своё сообщение + print('WebSocket отключен') except (WebSocketException, exceptions.InvalidMessage) as err: print(f'{err.__class__.__name__}: {err}') except JSONDecodeError: diff --git a/static/command.js b/static/command.js index 1f04e29..3a4f908 100644 --- a/static/command.js +++ b/static/command.js @@ -16,7 +16,7 @@ document.addEventListener("DOMContentLoaded", () => { // Обработчик события открытия WebSocket-соединения ws.onopen = function() { - console.log("WebSocket подключен"); + console.log("WebSocket клиента подключен"); }; // Обработчик события получения сообщения по WebSocket @@ -26,7 +26,7 @@ document.addEventListener("DOMContentLoaded", () => { // Обработчик события закрытия WebSocket-соединения ws.onclose = function() { - console.log("WebSocket закрыт"); + console.log("WebSocket клиента закрыт"); }; // Обработчик ошибок WebSocket @@ -59,36 +59,45 @@ document.addEventListener("DOMContentLoaded", () => { ws.send(command); // Отправляем команду через WebSocket console.log("Команда:", command); // Логируем отправленную команду } else { - console.log("WebSocket не подключён"); // Если WebSocket не открыт + console.log("WebSocket клиента не подключён"); // Если WebSocket не открыт } } + const commandStop = {"command": "stop"}; + // Назначение обработчиков событий для кнопки "Вперёд" const forwardButton = document.getElementById("forward-button"); - const forwardOn = {"forward": true} - forwardButton.addEventListener("mousedown", () => startSendingCommand(forwardOn)); // Начало отправки команды - const forwardOff = {"forward": false} + forwardButton.addEventListener("mousedown", () => startSendingCommand({"command": "forward"})); // Начало отправки команды forwardButton.addEventListener("mouseup", () => { - sendCommand(JSON.stringify(forwardOff)); + sendCommand(JSON.stringify(commandStop)); stopSendingCommand(); }); // отправка команды forwardOff и остановка отправки при отпускании кнопки forwardButton.addEventListener("mouseleave", stopSendingCommand); // Остановка отправки, если курсор уходит с кнопки // Назначение обработчиков событий для кнопки "Влево" const leftButton = document.getElementById("left-button"); - leftButton.addEventListener("mousedown", () => startSendingCommand("left")); - leftButton.addEventListener("mouseup", stopSendingCommand); + leftButton.addEventListener("mousedown", () => startSendingCommand({"command": "left"})); + leftButton.addEventListener("mouseup", () => { + sendCommand(JSON.stringify(commandStop)); + stopSendingCommand(); + }); leftButton.addEventListener("mouseleave", stopSendingCommand); // Назначение обработчиков событий для кнопки "Вправо" const rightButton = document.getElementById("right-button"); - rightButton.addEventListener("mousedown", () => startSendingCommand("right")); - rightButton.addEventListener("mouseup", stopSendingCommand); + rightButton.addEventListener("mousedown", () => startSendingCommand({"command": "right"})); + rightButton.addEventListener("mouseup", () => { + sendCommand(JSON.stringify(commandStop)); + stopSendingCommand(); + }); rightButton.addEventListener("mouseleave", stopSendingCommand); // Назначение обработчиков событий для кнопки "Назад" const backwardButton = document.getElementById("backward-button"); - backwardButton.addEventListener("mousedown", () => startSendingCommand("backward")); - backwardButton.addEventListener("mouseup", stopSendingCommand); + backwardButton.addEventListener("mousedown", () => startSendingCommand({"command": "backward"})); + backwardButton.addEventListener("mouseup", () => { + sendCommand(JSON.stringify(commandStop)); + stopSendingCommand(); + }); backwardButton.addEventListener("mouseleave", stopSendingCommand); }); \ No newline at end of file