Merge pull request #2 from Arduinum/arduinum/mvp_1
feat: added start.py, previous command functional
This commit was merged in pull request #2.
This commit is contained in:
@@ -4,8 +4,7 @@
|
|||||||
|
|
||||||
## Запуск приложения
|
## Запуск приложения
|
||||||
|
|
||||||
**Запуск для локальной разработки**: `poetry run uvicorn web_robot_control.main:app --host server_ip
|
**Запуск для локальной разработки**: `poetry run start_app`
|
||||||
--port port_number`
|
|
||||||
|
|
||||||
**Todo:** создать Python-функцию для запуска веб-приложения и добавить её в скрипты Poetry
|
**Todo:** создать Python-функцию для запуска веб-приложения и добавить её в скрипты Poetry
|
||||||
|
|
||||||
|
|||||||
@@ -19,3 +19,6 @@ packages = [{include = "web_robot_control", from = "src"}]
|
|||||||
[build-system]
|
[build-system]
|
||||||
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
||||||
build-backend = "poetry.core.masonry.api"
|
build-backend = "poetry.core.masonry.api"
|
||||||
|
|
||||||
|
[tool.poetry.scripts]
|
||||||
|
start_app = "web_robot_control.start:start_app"
|
||||||
12
src/web_robot_control/start.py
Normal file
12
src/web_robot_control/start.py
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
import uvicorn
|
||||||
|
|
||||||
|
|
||||||
|
def start_app():
|
||||||
|
"""Функция запуска приложения"""
|
||||||
|
|
||||||
|
uvicorn.run(
|
||||||
|
'web_robot_control.main:app',
|
||||||
|
host='127.0.0.1',
|
||||||
|
port=8000,
|
||||||
|
reload=True
|
||||||
|
)
|
||||||
@@ -5,6 +5,7 @@ from fastapi.templating import Jinja2Templates
|
|||||||
from websockets import exceptions, connect
|
from websockets import exceptions, connect
|
||||||
import asyncio
|
import asyncio
|
||||||
import socket
|
import socket
|
||||||
|
from json import loads, JSONDecodeError
|
||||||
|
|
||||||
from web_robot_control.settings import settings
|
from web_robot_control.settings import settings
|
||||||
|
|
||||||
@@ -59,16 +60,26 @@ async def command_to_robot(command: str) -> str:
|
|||||||
|
|
||||||
@router.websocket('/ws')
|
@router.websocket('/ws')
|
||||||
async def websocket_endpoint(websocket: WebSocket) -> None:
|
async def websocket_endpoint(websocket: WebSocket) -> None:
|
||||||
|
"""Эндпоинт для обработки команд фронтенда"""
|
||||||
|
|
||||||
# Установка содединения по веб-сокету
|
# Установка содединения по веб-сокету
|
||||||
await websocket.accept()
|
await websocket.accept()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
previous_command = None
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
# Получение команды от клиента (с веб-сокета)
|
# Получение команды от клиента (с веб-сокета)
|
||||||
command = await websocket.receive_text()
|
command = await websocket.receive_text()
|
||||||
valid_commands = settings.commands_robot.get_list_commands()
|
|
||||||
|
|
||||||
if command in valid_commands:
|
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)
|
||||||
# оптравка команды роботу
|
# оптравка команды роботу
|
||||||
robot_answer = await command_to_robot(command=command)
|
robot_answer = await command_to_robot(command=command)
|
||||||
|
|
||||||
@@ -81,3 +92,5 @@ async def websocket_endpoint(websocket: WebSocket) -> None:
|
|||||||
# Todo: для каждой ошибки написать своё сообщение
|
# 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:
|
||||||
|
print('Ошибка при декодировании JSON')
|
||||||
|
|||||||
@@ -39,12 +39,12 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
// Функция для начала отправки команды с заданным интервалом
|
// Функция для начала отправки команды с заданным интервалом
|
||||||
function startSendingCommand(command) {
|
function startSendingCommand(command) {
|
||||||
// Отправляем команду сразу
|
// Отправляем команду сразу
|
||||||
sendCommand(command);
|
sendCommand(JSON.stringify(command));
|
||||||
|
|
||||||
// Запускаем интервал для повторной отправки команды
|
// Запускаем интервал для повторной отправки команды
|
||||||
commandInterval = setInterval(() => {
|
commandInterval = setInterval(() => {
|
||||||
sendCommand(command); // Повторяем отправку команды
|
sendCommand(JSON.stringify(command)); // Повторяем отправку команды
|
||||||
}, 10); // Интервал отправки — каждые 10 мс
|
}, 10); // Интервал отправки — каждые 100 мс
|
||||||
}
|
}
|
||||||
|
|
||||||
// Функция для остановки отправки команд
|
// Функция для остановки отправки команд
|
||||||
@@ -65,8 +65,13 @@ document.addEventListener("DOMContentLoaded", () => {
|
|||||||
|
|
||||||
// Назначение обработчиков событий для кнопки "Вперёд"
|
// Назначение обработчиков событий для кнопки "Вперёд"
|
||||||
const forwardButton = document.getElementById("forward-button");
|
const forwardButton = document.getElementById("forward-button");
|
||||||
forwardButton.addEventListener("mousedown", () => startSendingCommand("forward")); // Начало отправки команды
|
const forwardOn = {"forward": true}
|
||||||
forwardButton.addEventListener("mouseup", stopSendingCommand); // Остановка отправки при отпускании кнопки
|
forwardButton.addEventListener("mousedown", () => startSendingCommand(forwardOn)); // Начало отправки команды
|
||||||
|
const forwardOff = {"forward": false}
|
||||||
|
forwardButton.addEventListener("mouseup", () => {
|
||||||
|
sendCommand(JSON.stringify(forwardOff));
|
||||||
|
stopSendingCommand();
|
||||||
|
}); // отправка команды forwardOff и остановка отправки при отпускании кнопки
|
||||||
forwardButton.addEventListener("mouseleave", stopSendingCommand); // Остановка отправки, если курсор уходит с кнопки
|
forwardButton.addEventListener("mouseleave", stopSendingCommand); // Остановка отправки, если курсор уходит с кнопки
|
||||||
|
|
||||||
// Назначение обработчиков событий для кнопки "Влево"
|
// Назначение обработчиков событий для кнопки "Влево"
|
||||||
|
|||||||
Reference in New Issue
Block a user