8 Commits

Author SHA1 Message Date
Eugene
1700353907 Merge pull request #7 from Arduinum/arduinum/service-orange-pi-mvp-1
Merge for master
2025-11-17 14:13:55 +03:00
Eugene
bcbfb08369 Merge pull request #6 from Arduinum/article_part6
feat: added command for videostream; fix: fixed error handling into: …
2025-11-17 14:12:30 +03:00
Arduinum628
6e9026e3d9 feat: added command for videostream; fix: fixed error handling into: robot_control_gpio(), start(), run_app(). 2025-11-17 14:06:24 +03:00
Eugene
2e116ac040 Merge pull request #5 from Arduinum/arduinum/service-orange-pi-mvp-1
Arduinum/service orange pi mvp 1
2025-10-22 12:19:12 +03:00
Eugene
e4eaa7a284 Merge pull request #4 from Arduinum/article_part5
feat: added functional for led indicator, class instance for RobotCon…
2025-10-22 12:18:35 +03:00
Eugene
0ca30c29f5 Merge pull request #3 from Arduinum/arduinum/service-orange-pi-mvp-1
feat: added classes for work motors, added class FormResponse, added …
2025-09-16 09:58:00 +03:00
Eugene
0ef91d0272 Merge pull request #2 from Arduinum/arduinum/service-orange-pi-mvp-1
feat: added gpio control for led
2025-08-04 23:01:56 +03:00
Eugene
93c023c467 Merge pull request #1 from Arduinum/arduinum/service-orange-pi-mvp-1
Arduinum/service orange pi mvp 1
2025-07-18 16:53:15 +03:00
3 changed files with 45 additions and 6 deletions

View File

@@ -9,6 +9,11 @@ LEFT=влево
RIGHT=вправо
STOP=стоп
# Команды Linux
VIDEOSTREAM=команда видеострима
ON_VIDEOSTREAM=включить видеострим
ON_STREAM_DEBUG=включить дебаг видеострима
# Настройки для линий GPIO
GPIO_PATH=путь до gpio
LED_LINE=номер линии

View File

@@ -1,10 +1,14 @@
import asyncio
from functools import partial
from gpiod import exception
from subprocess import Popen, DEVNULL
from os import setpgrp, killpg, getpgid
from signal import SIGTERM
from socket import gethostbyname
from websockets import serve, exceptions
from websockets.legacy.server import WebSocketServerProtocol
from json import loads, dumps, JSONDecodeError
from time import sleep
from settings import settings
from gpio_control import RobotControl
@@ -57,7 +61,7 @@ async def robot_control_gpio(
data.update(commands_status.OK_COMMAND.response)
await websocket.send(message=dumps(data))
except (exceptions.ConnectionClosed, exception.RequestReleasedError):
pass
return
except (exceptions.ConnectionClosedOK, exceptions.InvalidMessage, exceptions.InvalidState, OSError) as err:
message_err = f'{err.__class__.__name__}: {err}'
print(message_err)
@@ -86,22 +90,43 @@ async def start() -> None:
):
# бесконечный цикл
await asyncio.Future()
except asyncio.CancelledError:
except (asyncio.CancelledError, OSError, exception.RequestReleasedError) as err:
# пробрасываем ошибку, чтобы asyncio.run() всё корректно закрыл
message_err = f'{err.__class__.__name__}: {err}'
print(message_err)
raise
finally:
if robot_control is not None:
robot_control.blinking_off()
robot_control.close()
# пробрасываем CancelledError, чтобы asyncio.run() всё корректно закрыл
raise
def run_app() -> None:
"""Функция старата приложения"""
command_stream = None
try:
if settings.commands_linux.on_videostream:
command_stream = Popen(
settings.commands_linux.videostream,
shell=True,
preexec_fn=setpgrp,
stderr=None if settings.commands_linux.on_stream_debug else DEVNULL
)
sleep(0.1)
print('Видеострим запущен.')
asyncio.run(start())
except KeyboardInterrupt:
print('Выключение сервиса робота для приёма команд.')
try:
if settings.commands_linux.on_videostream and command_stream:
killpg(getpgid(command_stream.pid), SIGTERM)
except ProcessLookupError:
# Если процесс был уже завершён
pass
finally:
print('Выключение сервиса робота для приёма команд.')
if __name__ == '__main__':

View File

@@ -40,12 +40,21 @@ class GpioLines(ModelConfig):
right_motor_consumer: str
class CommandsLinux(ModelConfig):
"""Класс с командами для линукса"""
videostream: str
on_videostream: bool
on_stream_debug: bool
class Settings(ModelConfig):
"""Класс для данных конфига"""
websocket_host: str
websocket_port: int
commands_robot: CommandsRobot = CommandsRobot()
commands_linux: CommandsLinux = CommandsLinux()
gpio_lines: GpioLines = GpioLines()