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:
@@ -47,6 +47,7 @@ type
|
||||
DataBits: Integer; // 7 or 8
|
||||
StopBits: Integer; // 1 or 2
|
||||
Parity: TCATSerialParity;
|
||||
Andromeda: Boolean; // порт — передняя панель Andromeda/G2 (push ZZZI наружу)
|
||||
end;
|
||||
|
||||
{$IFDEF CAT_SERIAL_STUB}
|
||||
@@ -95,12 +96,16 @@ type
|
||||
private
|
||||
FPorts: array[0..CAT_SERIAL_MAX_PORTS-1] of TCATSerialPort;
|
||||
FEngine: TCATEngine;
|
||||
FAndromedaPort: TCATSerialPort; // первый активный порт с Andromeda=true (или nil)
|
||||
public
|
||||
constructor Create(AEngine: TCATEngine);
|
||||
destructor Destroy; override;
|
||||
procedure ApplyConfig(const Configs: array of TCATSerialConfig);
|
||||
procedure StopAll;
|
||||
function ActiveCount: Integer;
|
||||
// Передняя панель: есть ли активный Andromeda-порт и отправка строки в него.
|
||||
function HasAndromeda: Boolean;
|
||||
procedure SendToAndromeda(const S: string); // сигнатура совместима с TAndromedaSend
|
||||
end;
|
||||
|
||||
implementation
|
||||
@@ -267,6 +272,7 @@ var i: Integer;
|
||||
begin
|
||||
inherited Create;
|
||||
FEngine := AEngine;
|
||||
FAndromedaPort := nil;
|
||||
for i := 0 to CAT_SERIAL_MAX_PORTS-1 do
|
||||
FPorts[i] := nil;
|
||||
end;
|
||||
@@ -288,12 +294,25 @@ begin
|
||||
for i := 0 to cnt-1 do begin
|
||||
FPorts[i] := TCATSerialPort.Create(FEngine, Configs[i]);
|
||||
if Configs[i].Enabled then FPorts[i].Start;
|
||||
if Configs[i].Enabled and Configs[i].Andromeda and (FAndromedaPort = nil) then
|
||||
FAndromedaPort := FPorts[i];
|
||||
end;
|
||||
end;
|
||||
|
||||
function TCATSerialManager.HasAndromeda: Boolean;
|
||||
begin
|
||||
Result := Assigned(FAndromedaPort);
|
||||
end;
|
||||
|
||||
procedure TCATSerialManager.SendToAndromeda(const S: string);
|
||||
begin
|
||||
if Assigned(FAndromedaPort) then FAndromedaPort.SendStr(S);
|
||||
end;
|
||||
|
||||
procedure TCATSerialManager.StopAll;
|
||||
var i: Integer;
|
||||
begin
|
||||
FAndromedaPort := nil; // указывает в FPorts[] — обнулить ДО освобождения
|
||||
for i := 0 to CAT_SERIAL_MAX_PORTS-1 do begin
|
||||
if Assigned(FPorts[i]) then begin
|
||||
FPorts[i].Stop;
|
||||
|
||||
Reference in New Issue
Block a user