chore: refine project documentation

This commit is contained in:
2026-08-25 22:44:36 +03:00
parent 8237f03930
commit 98d90e1e5a
45 changed files with 457 additions and 516 deletions
+10 -13
View File
@@ -1,22 +1,19 @@
#!/usr/bin/env python3
"""Стенд «как MSHV»: повторяет TCI-клиента MSHV по его исходникам и говорит,
почему он не подключается.
"""Стенд совместимости с TCI-клиентом MSHV.
Зачем: MSHV — самый распространённый TCI-клиент для цифры, и ведёт он себя не
так, как наш собственный стенд. Две его особенности определяют всё:
1. ВСЕ входящие строки он фильтрует по номеру приёмника:
if (ls2.at(0)!=tci_trx) continue; // network.cpp
то есть клиенту в режиме RX2 (tci_trx = "1") строка `trx:0,false`
1. Входящие строки фильтруются по номеру приёмника, поэтому клиенту в режиме
RX2 (tci_trx = "1") строка `trx:0,false`
не существует в природе.
2. Инициализация — это ожидание ОДНОГО ответа. Он шлёт `vfo:<rx>,0;` раз в
500 мс, максимум 5 попыток, и ждёт `vfo:<rx>,0,<частота>`. Не дождался —
«Error To Initialize TCI Server» (network.cpp, Network::initAll,
ветка s_ModelID==3||4). Никаких других причин у этой ошибки нет.
сообщает об ошибке инициализации.
Соответствие настроек MSHV: «TCI Client rx1» → приёмник 0, «TCI Client rx2» →
приёмник 1 (hvrigcontrol.cpp: netServPort[3]/[4], network.cpp: tci_trx).
Соответствие настроек: «TCI Client rx1» → приёмник 0, «TCI Client rx2» →
приёмник 1.
Стенд по умолчанию БЕЗОПАСЕН на приём: ни TRX, ни TUNE, ни START/STOP, ни
TX-аудио не отправляются. Передающую часть включает явный --tx.
@@ -38,8 +35,8 @@ from live_rx_test import WS, split_commands, parse_command # noqa: E402
HDR = struct.Struct("<16I")
# Умолчания MSHV из его же диалога настроек (hvrigcontrol.cpp): каналов 2,
# сэмплов 2048, тип float32, частота 48 кГц, буфер TX 24 мс.
# Параметры совместимого клиента: 2 канала, 2048 сэмплов, float32,
# частота 48 кГц и буфер TX 24 мс.
MSHV_CHANNELS = "2"
MSHV_SAMPLES = "2048"
MSHV_TYPE = "float32"
@@ -65,7 +62,7 @@ class Verdict:
class MshvClient:
"""Ровно та логика, что в Network::* у MSHV — включая её ограничения."""
"""Минимальная модель поведения совместимого TCI-клиента."""
def __init__(self, ws, rx, verdict):
self.ws = ws
@@ -148,7 +145,7 @@ class MshvClient:
if len(payload) < HDR.size:
return
head = HDR.unpack(payload[:HDR.size])
# MSHV: if (pStream->receiver != tci_trx) return;
# Блоки других приёмников клиент игнорирует.
if head[0] != int(self.rx):
self.audio_foreign += 1
return