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:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user