Merge pull request #3 from Arduinum/arduinum/mvp_1

feat: added stop command, updated command processing, created .env.ex…
This commit was merged in pull request #3.
This commit is contained in:
Eugene
2025-09-16 09:51:17 +03:00
committed by GitHub
4 changed files with 42 additions and 25 deletions

View File

@@ -1 +1,11 @@
STREAM_URL="url адрес видеопотока" # Урлы
STREAM_URL=адрес видеопотока
WEBSOCKET_URL=адрес вебсокета клиента
WEBSOCKET_URL_ROBOT=адрес вебсокета робота
# Команды для робота
FORWARD=вперёд
BACKWARD=назад
LEFT=влево
RIGHT=вправо
STOP=стоп

View File

@@ -18,6 +18,7 @@ class CommandsRobot(ModelConfig):
backward: str backward: str
left: str left: str
right: str right: str
stop: str
def get_list_commands(self): def get_list_commands(self):
"""Метод вернёт список всех команд""" """Метод вернёт список всех команд"""

View File

@@ -70,26 +70,23 @@ async def websocket_endpoint(websocket: WebSocket) -> None:
while True: while True:
# Получение команды от клиента (с веб-сокета) # Получение команды от клиента (с веб-сокета)
command = await websocket.receive_text() response = await websocket.receive_text()
data = loads(response)
command = data.get('command')
if previous_command != command: if previous_command != command:
previous_command = command previous_command = command
valid_commands = settings.commands_robot.get_list_commands() valid_commands = settings.commands_robot.get_list_commands()
data = loads(command)
name_command = next(iter(data), None)
if name_command in valid_commands: if command in valid_commands:
print(command)
# оптравка команды роботу # оптравка команды роботу
robot_answer = await command_to_robot(command=command) robot_answer = await command_to_robot(command=response)
if robot_answer: if robot_answer:
# отправка ответа робота на вебсокет фронтенда # отправка ответа робота на вебсокет фронтенда
await websocket.send_text(f'Получена команда: {command}, ответ робота: {robot_answer}') await websocket.send_text(f'Получена команда: {command}, ответ робота: {robot_answer}')
print(f'Ответ робота: {robot_answer}')
except WebSocketDisconnect: except WebSocketDisconnect:
print('WebSocket отключен') # Todo: для вывода ошибок будет настроен logger print('WebSocket отключен')
# Todo: для каждой ошибки написать своё сообщение
except (WebSocketException, exceptions.InvalidMessage) as err: except (WebSocketException, exceptions.InvalidMessage) as err:
print(f'{err.__class__.__name__}: {err}') print(f'{err.__class__.__name__}: {err}')
except JSONDecodeError: except JSONDecodeError:

View File

@@ -16,7 +16,7 @@ document.addEventListener("DOMContentLoaded", () => {
// Обработчик события открытия WebSocket-соединения // Обработчик события открытия WebSocket-соединения
ws.onopen = function() { ws.onopen = function() {
console.log("WebSocket подключен"); console.log("WebSocket клиента подключен");
}; };
// Обработчик события получения сообщения по WebSocket // Обработчик события получения сообщения по WebSocket
@@ -26,7 +26,7 @@ document.addEventListener("DOMContentLoaded", () => {
// Обработчик события закрытия WebSocket-соединения // Обработчик события закрытия WebSocket-соединения
ws.onclose = function() { ws.onclose = function() {
console.log("WebSocket закрыт"); console.log("WebSocket клиента закрыт");
}; };
// Обработчик ошибок WebSocket // Обработчик ошибок WebSocket
@@ -59,36 +59,45 @@ document.addEventListener("DOMContentLoaded", () => {
ws.send(command); // Отправляем команду через WebSocket ws.send(command); // Отправляем команду через WebSocket
console.log("Команда:", command); // Логируем отправленную команду console.log("Команда:", command); // Логируем отправленную команду
} else { } else {
console.log("WebSocket не подключён"); // Если WebSocket не открыт console.log("WebSocket клиента не подключён"); // Если WebSocket не открыт
} }
} }
const commandStop = {"command": "stop"};
// Назначение обработчиков событий для кнопки "Вперёд" // Назначение обработчиков событий для кнопки "Вперёд"
const forwardButton = document.getElementById("forward-button"); const forwardButton = document.getElementById("forward-button");
const forwardOn = {"forward": true} forwardButton.addEventListener("mousedown", () => startSendingCommand({"command": "forward"})); // Начало отправки команды
forwardButton.addEventListener("mousedown", () => startSendingCommand(forwardOn)); // Начало отправки команды
const forwardOff = {"forward": false}
forwardButton.addEventListener("mouseup", () => { forwardButton.addEventListener("mouseup", () => {
sendCommand(JSON.stringify(forwardOff)); sendCommand(JSON.stringify(commandStop));
stopSendingCommand(); stopSendingCommand();
}); // отправка команды forwardOff и остановка отправки при отпускании кнопки }); // отправка команды forwardOff и остановка отправки при отпускании кнопки
forwardButton.addEventListener("mouseleave", stopSendingCommand); // Остановка отправки, если курсор уходит с кнопки forwardButton.addEventListener("mouseleave", stopSendingCommand); // Остановка отправки, если курсор уходит с кнопки
// Назначение обработчиков событий для кнопки "Влево" // Назначение обработчиков событий для кнопки "Влево"
const leftButton = document.getElementById("left-button"); const leftButton = document.getElementById("left-button");
leftButton.addEventListener("mousedown", () => startSendingCommand("left")); leftButton.addEventListener("mousedown", () => startSendingCommand({"command": "left"}));
leftButton.addEventListener("mouseup", stopSendingCommand); leftButton.addEventListener("mouseup", () => {
sendCommand(JSON.stringify(commandStop));
stopSendingCommand();
});
leftButton.addEventListener("mouseleave", stopSendingCommand); leftButton.addEventListener("mouseleave", stopSendingCommand);
// Назначение обработчиков событий для кнопки "Вправо" // Назначение обработчиков событий для кнопки "Вправо"
const rightButton = document.getElementById("right-button"); const rightButton = document.getElementById("right-button");
rightButton.addEventListener("mousedown", () => startSendingCommand("right")); rightButton.addEventListener("mousedown", () => startSendingCommand({"command": "right"}));
rightButton.addEventListener("mouseup", stopSendingCommand); rightButton.addEventListener("mouseup", () => {
sendCommand(JSON.stringify(commandStop));
stopSendingCommand();
});
rightButton.addEventListener("mouseleave", stopSendingCommand); rightButton.addEventListener("mouseleave", stopSendingCommand);
// Назначение обработчиков событий для кнопки "Назад" // Назначение обработчиков событий для кнопки "Назад"
const backwardButton = document.getElementById("backward-button"); const backwardButton = document.getElementById("backward-button");
backwardButton.addEventListener("mousedown", () => startSendingCommand("backward")); backwardButton.addEventListener("mousedown", () => startSendingCommand({"command": "backward"}));
backwardButton.addEventListener("mouseup", stopSendingCommand); backwardButton.addEventListener("mouseup", () => {
sendCommand(JSON.stringify(commandStop));
stopSendingCommand();
});
backwardButton.addEventListener("mouseleave", stopSendingCommand); backwardButton.addEventListener("mouseleave", stopSendingCommand);
}); });