"""Настройки потокового графа и таблицы соответствия режимов демодуляции.
Каждое поле ``FlowgraphSettings`` доезжает до командной строки
``flowgraph_dispatcher`` как аргумент; поля со значением ``None``
не передаются.
``SCRIPTS`` и ``MODES`` — предметные данные, а не настройки: они описывают
внешний контракт с ``gr-satnogs`` и не переопределяются из окружения.
Полями модели они были по недосмотру, из-за чего ``FLOWGRAPH__MODES``
с JSON-значением молча перезаписывал таблицу целиком."""
from pydantic import BaseModel
SCRIPTS: dict[str, str] = {
"AFSK1K2": "satnogs_afsk1200_ax25.py",
"AMSAT_DUV": "satnogs_amsat_fox_duv_decoder.py",
"APT": "satnogs_noaa_apt_decoder.py",
"ARGOS_BPSK_PMT_A3": "satnogs_argos_bpsk_ldr.py",
"BPSK": "satnogs_bpsk.py",
"CW": "satnogs_cw_decoder.py",
"FM": "satnogs_fm.py",
"FSK": "satnogs_fsk.py",
"GFSK_RKTR": "satnogs_reaktor_hello_world_fsk9600_decoder.py",
"GFSK/BPSK": "satnogs_qubik_telem.py",
"SSTV": "satnogs_fm.py",
"SSTV_PD120": "satnogs_sstv_pd120_demod.py",
"GFSK_GEOSCAN": "satnogs_geoscan_gfsk_decoder.py",
"GMSK USP": "satnogs_usp_fsk_decoder.py"
}
# ``script_filename`` не справочный. Флоуграф по нему не выбирается —
# это делает диспетчер по ``--mode``, — но имя уходит шестым аргументом в
# ``satnogs-pre``/``satnogs-post``, а оттуда в ``scripts/find_samp_rate.py``,
# который по подстрокам в имени определяет частоту дискретизации IQ: и для
# UDP-потока в gr-satellites, и для имени IQ-дампа. Неверное имя = неверная
# частота у обоих, молча.
MODES: dict[str, dict[str, str]] = {
"AFSK": {
"script_filename": SCRIPTS["AFSK1K2"],
},
"APT": {
"script_filename": SCRIPTS["APT"],
},
"BPSK": {
"script_filename": SCRIPTS["BPSK"],
},
"BPSK PMT-A3": {
"script_filename": SCRIPTS["ARGOS_BPSK_PMT_A3"],
},
"CW": {
"script_filename": SCRIPTS["CW"],
},
"DOKA": {
"script_filename": SCRIPTS["FSK"],
},
"DUV": {
"script_filename": SCRIPTS["AMSAT_DUV"],
},
"FM": {
"script_filename": SCRIPTS["FM"],
},
"FSK": {
"script_filename": SCRIPTS["FSK"],
},
"FSK AX.100 Mode 5": {
"script_filename": SCRIPTS["FSK"],
},
"FSK AX.100 Mode 6": {
"script_filename": SCRIPTS["FSK"],
},
"GFSK": {
"script_filename": SCRIPTS["FSK"],
},
"GFSK Rktr": {
"script_filename": SCRIPTS["GFSK_RKTR"],
},
"GFSK/BPSK": {
"script_filename": SCRIPTS["GFSK/BPSK"],
},
"GMSK": {
"script_filename": SCRIPTS["FSK"],
},
"MSK": {
"script_filename": SCRIPTS["FSK"],
},
"MSK AX.100 Mode 5": {
"script_filename": SCRIPTS["FSK"],
},
"MSK AX.100 Mode 6": {
"script_filename": SCRIPTS["FSK"],
},
"SSTV": {
"script_filename": SCRIPTS["FM"],
},
"SSTV_PD120": {
"script_filename": SCRIPTS["SSTV_PD120"],
},
"GFSK_GEOSCAN": {
"script_filename": SCRIPTS["GFSK_GEOSCAN"],
},
"GMSK USP": {
"script_filename": SCRIPTS["GMSK USP"],
},
}
[документация]
class FlowgraphSettings(BaseModel):
"""Параметры потокового графа.
Каждое поле становится аргументом ``--kebab-case=значение``; поля со
значением ``None`` в командную строку не попадают. Таблицы режимов
живут рядом, в константах модуля: ``SCRIPTS`` и ``MODES``.
"""
RX_SAMP_RATE: str | None = None
RX_BANDWIDTH: int | None = None
DOPPLER_CORR_PER_SEC: int | None = None
LO_OFFSET: int | None = None
LO_TRANSVERTER: int | None = None
PPM_ERROR: float = 0
GAIN_MODE: str = "Overall"
RF_GAIN: float | None = None
ANTENNA: str = "RX"
DEV_ARGS: str | None = None
STREAM_ARGS: str | None = None
TUNE_ARGS: str | None = None
OTHER_SETTINGS: str | None = None
DC_REMOVAL: bool | None = None
BB_FREQ: int | None = None
ENABLE_IQ_DUMP: bool = False
IQ_DUMP_FILENAME: str | None = None
UDP_DUMP_HOST: str = "127.0.0.1"
UDP_DUMP_PORT: int = 57356
FLOWGRAPH_DISPATCHER: str = "flowgraph_dispatcher"
DEFAULT_MODE: str = "FM"