feat(cat): wire split/FM/CTUN/AGC-T CAT commands to controller

Реализованы команды, ранее бывшие заглушками — функционал уже был в
TRadioController, но не пробрасывался в CAT:

- Split TX: ZZSP/FT/FR + split-байт в IF (новый RadioController.SetSplit)
- FM Squelch: SQ (0–255), ZZSQ (0–100%), ZZSO (on/off)
- FM CTCSS: CT/ZZTA (on), CN (1-based)/ZZTB (0-based тон)
- FM-репитер: OF (offset), OS (направление, с трансляцией Kenwood↔RPT_*)
- FM step: ZZST (00–03)
- CTUN: ZZCN; AGC-T/RF gain: ZZAR
- ANF: ZZNT (раньше ошибочно алиас NB)
- Шаги VFO: ZZAU/ZZBP (исправлен баг — были алиасы ZZFA/ZZAP), ZZSU

TCATContext расширен callback'ами (split, squelch, CTCSS, repeater, step,
AGC-T, CTUN); CATAdapter — геттеры/сеттеры/sync с маршалингом через Invoke.
Добавлен doc/CAT_STATUS.md — полный статус CAT и план работ.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-26 10:35:35 +03:00
co-authored by Claude Opus 4.8
parent 7938e800f3
commit 4a92624e9b
4 changed files with 614 additions and 63 deletions
+121
View File
@@ -52,6 +52,16 @@ type
function GetRunning: Boolean;
function GetSMeter: Double;
function GetBand: Integer;
function GetSplit: Boolean;
function GetSquelchOn: Boolean;
function GetSquelchLevel: Integer;
function GetCTCSSOn: Boolean;
function GetCTCSSTone: Integer;
function GetFMRptDir: Integer;
function GetFMRptOffset: Double;
function GetFMStep: Integer;
function GetAGCTop: Integer;
function GetCTun: Boolean;
// ── Сеттеры/команды (из CAT-потока → Invoke в поток контроллера) ──
procedure SetVfoA(V: Double);
@@ -72,6 +82,16 @@ type
procedure DoTuneUp;
procedure DoTuneDown;
procedure DoBandByIndex(Idx: Integer);
procedure SetSplit(V: Boolean);
procedure SetSquelchOn(V: Boolean);
procedure SetSquelchLevel(V: Integer);
procedure SetCTCSSOn(V: Boolean);
procedure SetCTCSSTone(V: Integer);
procedure SetFMRptDir(V: Integer);
procedure SetFMRptOffset(V: Double);
procedure SetFMStep(V: Integer);
procedure SetAGCTop(V: Integer);
procedure SetCTun(V: Boolean);
// ── Sync-методы (выполняются в потоке контроллера) ──
procedure SyncVfoA;
@@ -92,6 +112,16 @@ type
procedure SyncTuneUp;
procedure SyncTuneDown;
procedure SyncBandByIndex;
procedure SyncSplit;
procedure SyncSquelchOn;
procedure SyncSquelchLevel;
procedure SyncCTCSSOn;
procedure SyncCTCSSTone;
procedure SyncFMRptDir;
procedure SyncFMRptOffset;
procedure SyncFMStep;
procedure SyncAGCTop;
procedure SyncCTun;
public
constructor Create(AController: TRadioController);
destructor Destroy; override;
@@ -144,6 +174,26 @@ begin
Ctx.DoTuneUp := @DoTuneUp;
Ctx.DoTuneDown := @DoTuneDown;
Ctx.DoBandByIndex := @DoBandByIndex;
Ctx.GetSplit := @GetSplit;
Ctx.SetSplit := @SetSplit;
Ctx.GetSquelchOn := @GetSquelchOn;
Ctx.SetSquelchOn := @SetSquelchOn;
Ctx.GetSquelchLevel := @GetSquelchLevel;
Ctx.SetSquelchLevel := @SetSquelchLevel;
Ctx.GetCTCSSOn := @GetCTCSSOn;
Ctx.SetCTCSSOn := @SetCTCSSOn;
Ctx.GetCTCSSTone := @GetCTCSSTone;
Ctx.SetCTCSSTone := @SetCTCSSTone;
Ctx.GetFMRptDir := @GetFMRptDir;
Ctx.SetFMRptDir := @SetFMRptDir;
Ctx.GetFMRptOffset := @GetFMRptOffset;
Ctx.SetFMRptOffset := @SetFMRptOffset;
Ctx.GetFMStep := @GetFMStep;
Ctx.SetFMStep := @SetFMStep;
Ctx.GetAGCTop := @GetAGCTop;
Ctx.SetAGCTop := @SetAGCTop;
Ctx.GetCTun := @GetCTun;
Ctx.SetCTun := @SetCTun;
FEngine := TCATEngine.Create(Ctx);
FSerial := TCATSerialManager.Create(FEngine);
@@ -203,6 +253,16 @@ function TCATAdapter.GetTX: Boolean; begin Result := FController.FTransm
function TCATAdapter.GetRunning: Boolean; begin Result := FController.FRunning; end;
function TCATAdapter.GetSMeter: Double; begin Result := FController.FLastSMeter; end;
function TCATAdapter.GetBand: Integer; begin Result := FController.FCurrentBand; end;
function TCATAdapter.GetSplit: Boolean; begin Result := FController.FSplitTxB; end;
function TCATAdapter.GetSquelchOn: Boolean; begin Result := FController.FFMSQOn; end;
function TCATAdapter.GetSquelchLevel: Integer; begin Result := FController.FFMSQLevel; end;
function TCATAdapter.GetCTCSSOn: Boolean; begin Result := FController.FFMCTCSSOn; end;
function TCATAdapter.GetCTCSSTone: Integer; begin Result := FController.FFMCTCSSToneIdx; end;
function TCATAdapter.GetFMRptDir: Integer; begin Result := FController.FFMRptDir; end;
function TCATAdapter.GetFMRptOffset: Double; begin Result := FController.FFMRptOffsetHz; end;
function TCATAdapter.GetFMStep: Integer; begin Result := FController.FFMStepIdx; end;
function TCATAdapter.GetAGCTop: Integer; begin Result := FController.FAGCTop; end;
function TCATAdapter.GetCTun: Boolean; begin Result := FController.FCTun; end;
// ── Сеттеры (маршалинг) ──────────────────────────────────────────────────────
procedure TCATAdapter.SetVfoA(V: Double);
@@ -321,4 +381,65 @@ begin FSyncInt := Idx; FController.Invoke(@SyncBandByIndex); end;
procedure TCATAdapter.SyncBandByIndex;
begin FController.SetBand(FSyncInt); end;
// ── Split / FM (squelch, CTCSS, repeater, step) ───────────────────────────────
procedure TCATAdapter.SetSplit(V: Boolean);
begin FSyncBool := V; FController.Invoke(@SyncSplit); end;
procedure TCATAdapter.SyncSplit;
begin FController.SetSplit(FSyncBool); end;
procedure TCATAdapter.SetSquelchOn(V: Boolean);
begin FSyncBool := V; FController.Invoke(@SyncSquelchOn); end;
procedure TCATAdapter.SyncSquelchOn;
begin FController.SetFMSquelch(FSyncBool); end;
procedure TCATAdapter.SetSquelchLevel(V: Integer);
begin FSyncInt := V; FController.Invoke(@SyncSquelchLevel); end;
procedure TCATAdapter.SyncSquelchLevel;
begin FController.SetFMSquelchLevel(FSyncInt); end;
procedure TCATAdapter.SetCTCSSOn(V: Boolean);
begin FSyncBool := V; FController.Invoke(@SyncCTCSSOn); end;
procedure TCATAdapter.SyncCTCSSOn;
begin FController.SetFMCTCSS(FSyncBool); end;
procedure TCATAdapter.SetCTCSSTone(V: Integer);
begin FSyncInt := V; FController.Invoke(@SyncCTCSSTone); end;
procedure TCATAdapter.SyncCTCSSTone;
begin FController.SetFMCTCSSTone(FSyncInt); end;
procedure TCATAdapter.SetFMRptDir(V: Integer);
begin FSyncInt := V; FController.Invoke(@SyncFMRptDir); end;
procedure TCATAdapter.SyncFMRptDir;
begin FController.SetFMRpt(FSyncInt); end;
procedure TCATAdapter.SetFMRptOffset(V: Double);
begin FSyncFreq := V; FController.Invoke(@SyncFMRptOffset); end;
procedure TCATAdapter.SyncFMRptOffset;
begin FController.SetFMRptOffset(FSyncFreq); end;
procedure TCATAdapter.SetFMStep(V: Integer);
begin FSyncInt := V; FController.Invoke(@SyncFMStep); end;
procedure TCATAdapter.SyncFMStep;
begin FController.SetFMStep(FSyncInt); end;
procedure TCATAdapter.SetAGCTop(V: Integer);
begin FSyncInt := V; FController.Invoke(@SyncAGCTop); end;
procedure TCATAdapter.SyncAGCTop;
begin FController.SetAGCTop(FSyncInt); end;
procedure TCATAdapter.SetCTun(V: Boolean);
begin FSyncBool := V; FController.Invoke(@SyncCTun); end;
procedure TCATAdapter.SyncCTun;
begin FController.SetCTun(FSyncBool); end;
end.