mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
feat(cat): CAT-порт на каждый слайс + Auto TX (эталон SmartSDR CAT)
Внешняя программа управляет отдельным слайсом как отдельным трансивером
через свой TCP-порт. COM-порты и 19090 остаются за главным приёмником
(слайс A) и не тронуты.
Протокол не дублируется: TCATEngine — чистый парсер поверх записи
callback'ов TCATContext, TCATTcpServer — транспорт поверх движка, поэтому
слайс-CAT = тот же движок с другим контекстом. Новый TCATSliceEndpoint
(движок + TCP-сервер на слот), массивом владеет TCATAdapter. Привязка к
СЛОТУ (буква B..G), не к Id: порт живёт, даже когда слайса нет (PS0).
Auto TX = «Auto Switch TX Slice» из SmartSDR CAT. Вся логика в одной точке
— TRadioController.RequestSliceTx, исполняется в потоке контроллера:
• пока кто-то уже в эфире (любой источник) — заявка игнорируется,
перехвата передачи нет никогда;
• без Auto TX слайс передаёт, только если уже выбран TX-источником;
• RX; снимает только СВОЮ передачу;
• TX-источник после отпускания остаётся на слайсе (как в SmartSDR).
На флаге слайса бейдж TX → AutoTX.
Частота слайса — TuneSliceInBand: свобода в пределах ВКЛЮЧЁННОГО диапазона
(трансвертер → его FreqBegin/FreqEnd, иначе band-план), другой диапазон —
отказ. Вне захваченной полосы окно DDC переезжает: доп. пан — центром на
цель (rfPanFreq → UI перекладывает флаги/шапку/зум-бар), пан 0 — центр
посередине между целью и главным VFO и только если оба влезают (общее
железное окно, главный приёмник не оглушаем).
Настройки: вкладка Slices (enable/порт 19091../Auto TX на слайс), персист
в секции cat + device-blob.
Попутно:
• ZZFL/ZZFH больше не заглушки — новые callback'и кромок фильтра
(у главного nil → прежний дефолт режима), хелпер SignedPad;
• FilterIdxFor, AGCModeToUI, BoardUtils.BandEdges;
• DSP-состояние слайса (NR/NB/SNB/ANF) зеркалится в TCtrlSlice — флаг
слайса рисовал нули и AGC главного;
• FUIReady в TMainForm.OnControllerState: адаптеры, создаваемые по ходу
FormCreate, больше не могут уронить старт рендером до постройки
виджетов (на этом падал Auto TX из настроек).
Проверено вживую: все порты 19091..19096 слушают, PS;/ZZFA;/MD;/ID;/SM0;/
ZZTX; отвечают; старт со всеми включёнными слайсами чист под gdb.
Документ — doc/CAT_SLICES.md.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -24,6 +24,8 @@ function FreqToBandIdx(Hz: Double; Pluto: Boolean = False): Integer;
|
||||
function BandName(Idx: Integer; Pluto: Boolean = False): string;
|
||||
// Частота по умолчанию при входе в диапазон (если нет сохранённой/в диапазоне).
|
||||
function BandDefaultFreq(Idx: Integer; Pluto: Boolean = False): Double;
|
||||
// Границы диапазона по плану. False = слот пуст/индекс вне плана (Lo=Hi=0).
|
||||
function BandEdges(Idx: Integer; Pluto: Boolean; out LoHz, HiHz: Double): Boolean;
|
||||
// Полный band-план активного бэкенда (имена + дефолтные частоты).
|
||||
function BuildBandPlan(Pluto: Boolean): TBandPlanArray;
|
||||
|
||||
@@ -91,6 +93,16 @@ begin
|
||||
else Result := 'AD936x SDR';
|
||||
end;
|
||||
|
||||
function BandEdges(Idx: Integer; Pluto: Boolean; out LoHz, HiHz: Double): Boolean;
|
||||
begin
|
||||
LoHz := 0; HiHz := 0;
|
||||
Result := (Idx >= 0) and (Idx < BAND_COUNT);
|
||||
if not Result then Exit;
|
||||
if Pluto then begin LoHz := VU_LO[Idx]; HiHz := VU_HI[Idx]; end
|
||||
else begin LoHz := HF_LO[Idx]; HiHz := HF_HI[Idx]; end;
|
||||
Result := HiHz > LoHz; // пустой 12-й слот HF-плана
|
||||
end;
|
||||
|
||||
function FreqToBandIdx(Hz: Double; Pluto: Boolean): Integer;
|
||||
var
|
||||
i: Integer;
|
||||
|
||||
Reference in New Issue
Block a user