Исходный код soniks_client.antenna.rotator

"""Управление поворотным устройством через Hamlib.

``Hamlib`` — системный модуль, доступный только внутри контейнера."""

from functools import lru_cache

import Hamlib

from core.configs import logger, settings
from core.exceptions import EquipmentConnectionError


[документация] class RotatorController: """Поворотное устройство через Hamlib. Создаётся только при ``ANTENNA__ROTATOR__ENABLED``; иначе :func:`get_rotator_controller` возвращает ``None``. """ def __init__(self, model: str, baud: int, port: str): self.rot_port = port self.rot_baud = baud self.rot_name = getattr(Hamlib, model) self.rot = Hamlib.Rot(self.rot_name) self.rot.state.rotport.pathname = self.rot_port self.rot.state.rotport.parm.serial.rate = self.rot_baud
[документация] def connect(self) -> None: """Открыть соединение с поворотным устройством. Raises: EquipmentConnectionError: Hamlib вернул код ошибки. """ self.rot.open() status = getattr(self.rot, "error_status", Hamlib.RIG_OK) if status != Hamlib.RIG_OK: logger.error( "Hamlib: открытие соединения с ротатором не удалось, " "код ошибки %s (%s)", status, Hamlib.rigerror(status), ) raise EquipmentConnectionError()
[документация] def disconnect(self) -> None: """Закрыть соединение с поворотным устройством.""" self.rot.close()
@property def position(self) -> list[float]: return self.rot.get_position() @position.setter def position(self, pos: tuple[float, float]) -> None: """Положение антенны как ``[азимут, угол места]`` в градусах.""" self.rot.set_position(*pos)
[документация] @lru_cache(maxsize=1) def get_rotator_controller() -> RotatorController | None: """Вернуть единственный на процесс контроллер ротатора либо ``None``. Раньше контроллер создавался на импорте модуля, поэтому неизвестная модель Hamlib роняла клиент на старте трейсбеком вместо записи в лог. """ if not settings.antenna.rotator.ENABLED: return None rotator = settings.antenna.rotator try: return RotatorController(rotator.MODEL, rotator.BAUD, rotator.PORT) except AttributeError: logger.error( "Hamlib не знает модели ротатора %r, слежение отключено. " "Проверьте ANTENNA__ROTATOR__MODEL", rotator.MODEL, ) return None