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
+13 -13
View File
@@ -498,7 +498,7 @@ procedure TDUCIQSenderThread.Execute;
const
DUC_IQ_PAIRS_PER_PACKET = 240;
DUC_SAMPLE_RATE = 192000; // IQ pairs per second
// Пейсинг DUC-FIFO радио — модель dl1ycf pihpsdr (new_protocol_txiq_thread).
// Пейсинг DUC-FIFO синхронизирован с аппаратным тактированием радио.
// Продюсер (TTXDSPThread) mic-клочит очередь: mic-пакеты радио идут на кварце
// радио, а mic-ADC и DUC-DAC на одном кристалле → темп прихода mic = темп
// расхода DAC. Значит очередь пополняется ровно радиоклоком, и sender должен
@@ -611,7 +611,7 @@ begin
DrainVirtualFIFO;
// Очередь пуста. НЕ инжектируем нулевые пакеты — 1.25мс тишины прямо
// в поток сэмплов = разрыв данных = всплеск на водопаде/в эфире. Как
// dl1ycf pihpsdr (txiq_thread: пустая очередь → просто sem_wait): ждём
// При пустой очереди ждём сигнала о появлении данных.
// следующий WDSP-блок продюсера. Короткий разрыв покрывает подушка
// pre-roll в FPGA-FIFO радио; mic-клок продюсера держит очередь полной.
// На передаче ждём коротко (быстро подхватить пришедший блок), на приёме
@@ -668,7 +668,7 @@ begin
Sleep(50);
if Terminated then Break;
if not FNet.FConnected then Continue;
// Отправляем полный HP с частотами и ALEX — как piHPSDR
// Отправляем полный HP-пакет с частотами и состоянием ALEX.
FNet.SendFullHP;
// Повторно отправляем DDC/DUC Specific первые 5 сек после Run=1 (каждые 500 мс).
// ddc_specific_thread / duc_specific_thread на эмуляторе/железе стартуют
@@ -1351,14 +1351,14 @@ begin
end;
// ---------------------------------------------------------------------------
// ALEX фильтры — логика из piHPSDR new_protocol.c
// Формирование регистра фильтров ALEX.
// Возвращает 32-bit ALEX0 register value
// RXFreqHz — частота приёма ADC0
// TXFreqHz — частота передачи (или = RXFreqHz при RX)
// Transmitting — режим передачи
// IsOrion2 — ANAN-7000/8000 (другие BPF)
// ---------------------------------------------------------------------------
// Преобразует частоту в индекс диапазона 0=160m..10=6m (Thetis-compatible).
// Преобразует частоту в протокольный индекс диапазона 0=160m..10=6m.
function FreqToBandIndex(FreqHz: Double): Integer;
begin
if FreqHz >= 39850000 then Result := 10 // 6m
@@ -1386,7 +1386,7 @@ end;
// XVTR без усиления.
// XvtrActive — True когда активен XVTR-диапазон; разрешает биты 8+11
// (стандарт) или 8+14 (Orion2) из Alex.RxOnly[IF_band]=3.
// WidebandBypass — True когда открыт raw ADC wideband. Как Thetis, раскрываем
// WidebandBypass — True, когда открыт raw ADC wideband. В этом режиме раскрываем
// RX front-end через HF bypass, иначе видна только полоса
// текущего HPF/BPF, а не весь ADC span.
function CalcAlex0(RXFreqHz, TXFreqHz: Double;
@@ -1411,7 +1411,7 @@ begin
if not XvtrDisablePA then
begin
Result := Result or $08000000; // bit 27: T/R relay
// Bit 18 = PureSignal (ALEX_PS_BIT в pihpsdr): на TX подключает
// Bit 18 = PureSignal: на TX подключает
// внутренний мост обратной связи PA к RX-тракту ADC0.
if PureSignalTX then
Result := Result or $00040000;
@@ -1604,8 +1604,8 @@ end;
// Строит ЛОГИЧЕСКУЮ маску OC-пинов: бит i = пин i+1 (i = 0..OC_PIN_COUNT-1) —
// в тех же координатах, в которых маски лежат в настройках и рисуются в UI.
// Сдвиг в проводное представление байта 1401 делает вызывающий (SendFullHP).
// Портировано из Thetis (Penny.UpdateExtCtrl/adjustForTXAction), урезано:
// без PA-override и split-pins VFO A/B (см. project_oc_control память).
// Реализация учитывает только возможности EWSDR: без PA-override и
// раздельных пинов VFO A/B.
// RX: маска банда/слота как есть. TX: маска банда/слота, каждый включённый
// пин дополнительно гейтится своим TX pin action (MOX/TUNE/TWOTONE и их
// комбинации) — тот же tx-флаг остаётся True на всём протяжении TUN/2TON
@@ -1735,7 +1735,7 @@ begin
if FPanDDCEnabled[ddc] then
AddDDC(ddc, FPanDDCRateKHz[ddc], FPanDDCADC[ddc]);
// PureSignal feedback (как pihpsdr new_protocol_receive_specific): на время
// PureSignal feedback: на время
// PTT DDC0 ← ADC0 (RX-feedback с моста PA), DDC1 ← «ADC 2» = TX DAC loopback,
// оба 192 кС/с 24 бита, DDC1 синхронизирован с DDC0 (byte 1363 bit1) —
// его сэмплы приходят interleaved внутри потока DDC0 (порт 1035).
@@ -1866,7 +1866,7 @@ end;
procedure THPSDRNetwork.SetCWXKey(Down: Boolean);
// Каждый фронт — немедленный HP-пакет: тайминги посылки держит PC, задержка
// доставки = один UDP-пакет (так же делает Thetis, cwx.cs setkey).
// доставки определяется отправкой одного UDP-пакета.
begin
if FCWXKey = Down then Exit;
FCWXKey := Down;
@@ -1945,7 +1945,7 @@ begin
Buf[12 + ddc*4] := Ph and $FF;
end;
// PureSignal: feedback-DDC0/DDC1 следят за TX-частотой (pihpsdr, bytes 9..16).
// PureSignal: feedback-DDC0/DDC1 следят за TX-частотой из байтов 9..16.
// DDCBase=2 ⇒ с частотным словом главного DDC (bytes 17..20) не пересекаемся.
if FPSTXActive then
begin
@@ -2000,7 +2000,7 @@ begin
end;
// XVTR enable bit (byte 1400 bit 0) — управляет выходом VHF T/R relay платы.
// Логика как в Thetis:
// Правила установки бита:
// в XVTR-режиме: бит = DisablePA (внешний T/R relay нужен только если PA подавлен)
// в HF-режиме: бит = Alex.EnableXvtrHf (галочка "Enable XVTR HF" в Antenna tab)
if FXvtrEnable then