feat: added classes for work motors, added class FormResponse, added logic for motor control in service; docs: updated .env.example for commands motors

This commit is contained in:
Arduinum628
2025-09-16 09:57:02 +03:00
parent 576d3c145f
commit 72af2bc2f9
5 changed files with 225 additions and 39 deletions

View File

@@ -1,79 +1,84 @@
import asyncio
from socket import gethostbyname
from websockets import serve, exceptions
from websockets.legacy.server import WebSocketServerProtocol
from json import loads, JSONDecodeError
from json import loads, dumps, JSONDecodeError
from settings import settings
from gpio_control import LedLineGpio
from gpio_control import RobotControl
from response_data import FormResponse
async def robot_control_gpio(websocket: WebSocketServerProtocol):
async def robot_control_gpio(websocket: WebSocketServerProtocol) -> None:
"""
Асинхронная функция для управлением gpio робота (через websocket)
"""
try:
led_line_gpio = LedLineGpio(line=6)
action = None
robot_control = RobotControl()
commands_status = FormResponse
while True:
try:
command = await asyncio.wait_for(websocket.recv(), timeout=30.0)
data = loads(command)
command_name = data.get('command')
except asyncio.TimeoutError as err:
print('Таймаут ожидания команды от клиента')
continue # продолжение цикла, чтобы не закрывать соединение
except JSONDecodeError:
print("Ошибка при декодировании JSON")
print('Ошибка при декодировании JSON!')
continue
match next(iter(data), None):
match command_name:
case settings.commands_robot.forward:
if data.get(settings.commands_robot.forward):
action = 'Робот едет вперёд'
led_line_gpio.on()
else:
action = 'Команда вперёд стоп'
led_line_gpio.off()
print(action)
await websocket.send(message=action)
robot_control.forward()
case settings.commands_robot.backward:
action = 'Робот едет назад'
print(action)
await websocket.send(message=action)
robot_control.backward()
case settings.commands_robot.left:
action = 'Робот едет налево'
print(action)
await websocket.send(message=action)
robot_control.left()
case settings.commands_robot.right:
action = 'Робот едет направо'
print(action)
await websocket.send(message=action)
robot_control.right()
case settings.commands_robot.stop:
robot_control.stop()
case _:
data.update(commands_status.NOT_FOUND_COMMAND.response)
await websocket.send(message=dumps(data))
if settings.commands_robot.is_command(command=command_name):
data.update(commands_status.OK_COMMAND.response)
await websocket.send(message=dumps(data))
except exceptions.ConnectionClosed:
pass
except (exceptions.ConnectionClosedOK, exceptions.InvalidMessage, exceptions.InvalidState) as err:
message_err = f'{err.__class__.__name__}: {err}'
print(message_err)
await websocket.send(message=message_err)
except Exception as err:
message_err = f'{err.__class__.__name__}: {err}'
print(message_err)
await websocket.send(message=message_err)
data.update(
commands_status.SERVER_ERR.get_response_err(
name_err=err.__class__.__name__,
message_err=err
)
)
await websocket.send(message=dumps(data))
finally:
led_line_gpio.close()
robot_control.close()
async def start():
async def start() -> None:
"""Асинхронная функция запуска вебсокета и бесконечного цикла"""
print('Старт сервиса робота для приёма команд.')
async with serve(handler=robot_control_gpio, host=settings.websocket_host, port=settings.websocket_port):
async with serve(
handler=robot_control_gpio,
host=gethostbyname(settings.websocket_host),
port=settings.websocket_port
):
# бесконечный цикл
await asyncio.Future()
def run_app():
def run_app() -> None:
"""Функция старата приложения"""
try: