mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
feat(cat): Andromeda/G2 front panel support (serial, LED indicators)
Bidirectional Apache Labs Andromeda/G2 front-panel protocol on top of CAT. Panel logic lives in dedicated units; existing files get only thin hooks. New units: - AndromedaMap.pas — data only: action enums + default button/encoder layout tables and LED (ZZZI) numbers (mirroring the Thetis defaults) - AndromedaPanel.pas — TAndromedaPanel: inbound panel events -> controller actions (marshalled via Invoke), state subscription -> ZZZI push via SendProc Hooks: - CATEngine: parse ZZZD/ZZZU/ZZZE/ZZZP/ZZZS into generic TCATContext callbacks - CATAdapter: creates the panel, routes engine callbacks to it, supplies the SendProc to the Andromeda port, AddStateListener, ZZZS handshake - CATSerial: Andromeda flag in port config + HasAndromeda/SendToAndromeda - RadioController: AddStateListener (multicast, does not steal MainForm's OnStateChanged) - Settings/SettingsForm/MainForm: CATSerialAndromeda[0..3] + persistence + checkbox First version: serial transport, hardcoded default mapping, LED indicators (MOX/Tune/CTUN/VFO A-B/Split/NB/NR/SNB/ANF/Squelch). Doc: doc/ANDROMEDA.md. TODO: default button mapping does not match the physical panel (hardcoded) — to be fixed later; also ZZMF/LCD text, TCP G2V2 transport, configurable mapping. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+34
-1
@@ -20,7 +20,8 @@ interface
|
||||
|
||||
uses
|
||||
Classes, SysUtils,
|
||||
RadioController, CATEngine, CATSerial, CATTcp, Settings, WDSPEngine;
|
||||
RadioController, CATEngine, CATSerial, CATTcp, Settings, WDSPEngine,
|
||||
AndromedaPanel;
|
||||
|
||||
type
|
||||
TCATAdapter = class
|
||||
@@ -29,6 +30,7 @@ type
|
||||
FEngine: TCATEngine;
|
||||
FSerial: TCATSerialManager;
|
||||
FTcp: TCATTcpServer;
|
||||
FPanel: TAndromedaPanel; // передняя панель Andromeda/G2 (если включена)
|
||||
// Параметры команды для маршалинга в поток контроллера (через Invoke).
|
||||
FSyncFreq: Double;
|
||||
FSyncInt: Integer;
|
||||
@@ -93,6 +95,12 @@ type
|
||||
procedure SetAGCTop(V: Integer);
|
||||
procedure SetCTun(V: Boolean);
|
||||
|
||||
// ── Andromeda: форвард callback'ов движка в панель (из потока транспорта) ──
|
||||
procedure PanelVfoStep(V: Integer);
|
||||
procedure PanelEncoder(Enc, Step: Integer);
|
||||
procedure PanelButton(Btn: Integer; State, LongPress: Boolean);
|
||||
procedure PanelVersion(V: Integer);
|
||||
|
||||
// ── Sync-методы (выполняются в потоке контроллера) ──
|
||||
procedure SyncVfoA;
|
||||
procedure SyncVfoB;
|
||||
@@ -194,10 +202,18 @@ begin
|
||||
Ctx.SetAGCTop := @SetAGCTop;
|
||||
Ctx.GetCTun := @GetCTun;
|
||||
Ctx.SetCTun := @SetCTun;
|
||||
Ctx.OnPanelVfoStep := @PanelVfoStep;
|
||||
Ctx.OnPanelEncoder := @PanelEncoder;
|
||||
Ctx.OnPanelButton := @PanelButton;
|
||||
Ctx.OnPanelVersion := @PanelVersion;
|
||||
|
||||
FEngine := TCATEngine.Create(Ctx);
|
||||
FSerial := TCATSerialManager.Create(FEngine);
|
||||
FTcp := TCATTcpServer.Create(FEngine);
|
||||
|
||||
// Передняя панель: отправляет наружу через Andromeda-порт, слушает состояние.
|
||||
FPanel := TAndromedaPanel.Create(FController, @FSerial.SendToAndromeda);
|
||||
FController.AddStateListener(@FPanel.OnControllerState);
|
||||
end;
|
||||
|
||||
destructor TCATAdapter.Destroy;
|
||||
@@ -205,6 +221,7 @@ begin
|
||||
if Assigned(FTcp) then begin FTcp.Stop; FreeAndNil(FTcp); end;
|
||||
if Assigned(FSerial) then begin FSerial.StopAll; FreeAndNil(FSerial); end;
|
||||
FreeAndNil(FEngine);
|
||||
FreeAndNil(FPanel);
|
||||
inherited Destroy;
|
||||
end;
|
||||
|
||||
@@ -225,8 +242,11 @@ begin
|
||||
2: Cfgs[i].Parity := cspEven;
|
||||
else Cfgs[i].Parity := cspNone;
|
||||
end;
|
||||
Cfgs[i].Andromeda := G.CATSerialAndromeda[i];
|
||||
end;
|
||||
FSerial.ApplyConfig(Cfgs);
|
||||
// Если назначен Andromeda-порт — запросить версию панели (рукопожатие ZZZS).
|
||||
if FSerial.HasAndromeda and Assigned(FPanel) then FPanel.RequestVersion;
|
||||
FTcp.Stop;
|
||||
if G.CATTcpEnabled then
|
||||
begin
|
||||
@@ -442,4 +462,17 @@ begin FSyncBool := V; FController.Invoke(@SyncCTun); end;
|
||||
procedure TCATAdapter.SyncCTun;
|
||||
begin FController.SetCTun(FSyncBool); end;
|
||||
|
||||
// ── Andromeda: форвард в панель (сама маршалит действия в поток контроллера) ──
|
||||
procedure TCATAdapter.PanelVfoStep(V: Integer);
|
||||
begin if Assigned(FPanel) then FPanel.HandleVfoStep(V); end;
|
||||
|
||||
procedure TCATAdapter.PanelEncoder(Enc, Step: Integer);
|
||||
begin if Assigned(FPanel) then FPanel.HandleEncoder(Enc, Step); end;
|
||||
|
||||
procedure TCATAdapter.PanelButton(Btn: Integer; State, LongPress: Boolean);
|
||||
begin if Assigned(FPanel) then FPanel.HandleButton(Btn, State, LongPress); end;
|
||||
|
||||
procedure TCATAdapter.PanelVersion(V: Integer);
|
||||
begin if Assigned(FPanel) then FPanel.HandleVersion(V); end;
|
||||
|
||||
end.
|
||||
|
||||
Reference in New Issue
Block a user