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

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

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

from functools import lru_cache

import Hamlib

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


[документация] class RigController: """Приёмное устройство через сетевой ``rigctld`` (Hamlib). Используется для доплеровской коррекции частоты во время прохода. """ def __init__( self, rig_ip: str, rig_port: int, model=Hamlib.RIG_MODEL_NETRIGCTL, ) -> None: Hamlib.rig_set_debug(Hamlib.RIG_DEBUG_WARN) self.rig = Hamlib.Rig(model) self.rig.set_conf("rig_pathname", f"{rig_ip}:{rig_port}") self._vfo: int | None = None
[документация] def connect(self) -> None: """Открыть соединение с ``rigctld``. Raises: EquipmentConnectionError: Hamlib вернул код ошибки. """ self.rig.open() self._check_hamlib_error("открытие соединения с rigctld") # VFO читается один раз на соединение: при RIG_UPDATE_INTERVAL=0.1 # запрос на каждую установку частоты — это лишние 10 сетевых вызовов # в секунду к rigctld. self._vfo = self.rig.get_vfo()
[документация] def disconnect(self) -> None: """Закрыть соединение с ``rigctld``.""" self._vfo = None self.rig.close()
@property def frequency(self) -> float: return self.rig.get_freq() @frequency.setter def frequency(self, frequency) -> None: """Текущая частота приёма, Гц.""" self.rig.set_freq(self.vfo, frequency) @property def vfo(self) -> int: """Текущий VFO приёмника, прочитанный при подключении.""" if self._vfo is None: self._vfo = self.rig.get_vfo() return self._vfo def _check_hamlib_error(self, operation: str) -> None: status = getattr(self.rig, "error_status", Hamlib.RIG_OK) if status != Hamlib.RIG_OK: logger.error( "Hamlib: %s не удалось, код ошибки %s (%s)", operation, status, Hamlib.rigerror(status), ) raise EquipmentConnectionError()
[документация] @lru_cache(maxsize=1) def get_rig_controller() -> RigController: """Вернуть единственный на процесс контроллер приёмника. Раньше контроллер создавался на импорте модуля: ошибка конфигурации Hamlib роняла клиент на старте трейсбеком вместо записи в лог. """ return RigController( settings.antenna.rig.IP, settings.antenna.rig.PORT, )