Fix CAT settings: load before connect, default TCP port 19090

- Settings.pas: add root-level SaveCATSettings/LoadCATSettings so CAT
  config is stored independently of device MAC.
- MainForm.pas FormCreate: initialize CAT defaults, load from saved
  'cat' JSON section, and apply immediately after InitCATEngine — so
  SettingsForm shows correct values before the transceiver connects.
- MainForm.pas OnCATSettingsChange: always save to root 'cat' section
  (not only when device is connected) so changes persist immediately.
- Default TCP CAT port changed from 4992 to 19090 everywhere.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-27 21:58:49 +03:00
co-authored by Claude Sonnet 4.6
parent 1a264b684e
commit bcd045a1be
3 changed files with 64 additions and 8 deletions
+17 -3
View File
@@ -1018,7 +1018,21 @@ begin
FWebServer.OnDrive := WebOnDrive; FWebServer.OnDrive := WebOnDrive;
FWebServer.Start; FWebServer.Start;
FillChar(FCATLastGlobal, SizeOf(FCATLastGlobal), 0); FillChar(FCATLastGlobal, SizeOf(FCATLastGlobal), 0);
FCATLastGlobal.CATTcpPort := 19090;
for i := 0 to 3 do
begin
FCATLastGlobal.CATSerialBaud[i] := 9600;
FCATLastGlobal.CATSerialDataBits[i] := 8;
FCATLastGlobal.CATSerialStopBits[i] := 1;
{$IFDEF MSWINDOWS}
FCATLastGlobal.CATSerialPort[i] := 'COM' + IntToStr(i + 1);
{$ELSE}
FCATLastGlobal.CATSerialPort[i] := '/dev/ttyS' + IntToStr(i);
{$ENDIF}
end;
FSettings.LoadCATSettings(FCATLastGlobal);
InitCATEngine; InitCATEngine;
CATApplySettings(FCATLastGlobal);
FSMeterPeak := -130; FSMeterPeak := -130;
FSMeterMin := -130; FSMeterMin := -130;
FSMeterAvg := -130; FSMeterAvg := -130;
@@ -4756,10 +4770,10 @@ begin
FCATLastGlobal.CATTcpEnabled := TcpEnabled; FCATLastGlobal.CATTcpEnabled := TcpEnabled;
FCATLastGlobal.CATTcpPort := TcpPort; FCATLastGlobal.CATTcpPort := TcpPort;
CATApplySettings(FCATLastGlobal); CATApplySettings(FCATLastGlobal);
if FDevConnected then begin FSettings.SaveCATSettings(FCATLastGlobal);
if FDevConnected then
FSettings.SaveGlobal(FDevMAC, MakeGlobalSettings); FSettings.SaveGlobal(FDevMAC, MakeGlobalSettings);
FSettings.Save; FSettings.Save;
end;
end; end;
// --- Getters (called from CAT thread — read only, no sync needed) ----------- // --- Getters (called from CAT thread — read only, no sync needed) -----------
+45 -3
View File
@@ -85,7 +85,7 @@ type
CATSerialParity: array[0..3] of Integer; // 0=None, 1=Odd, 2=Even CATSerialParity: array[0..3] of Integer; // 0=None, 1=Odd, 2=Even
// TCP CAT сервер (один, многоклиентский) // TCP CAT сервер (один, многоклиентский)
CATTcpEnabled: Boolean; CATTcpEnabled: Boolean;
CATTcpPort: Integer; // порт, по умолчанию 4992 CATTcpPort: Integer; // порт, по умолчанию 19090
end; end;
TSettingsManager = class TSettingsManager = class
@@ -125,6 +125,9 @@ type
procedure LoadWindowBounds(out L, T, W, H: Integer); procedure LoadWindowBounds(out L, T, W, H: Integer);
procedure SaveStartupPreview(VfoA, VfoB: Double; SampleRate: Integer); procedure SaveStartupPreview(VfoA, VfoB: Double; SampleRate: Integer);
function LoadStartupPreview(out VfoA, VfoB: Double; out SampleRate: Integer): Boolean; function LoadStartupPreview(out VfoA, VfoB: Double; out SampleRate: Integer): Boolean;
// CAT settings — не привязаны к MAC, хранятся в корне JSON (доступны до подключения)
procedure SaveCATSettings(const G: TGlobalSettings);
procedure LoadCATSettings(var G: TGlobalSettings);
end; end;
implementation implementation
@@ -216,7 +219,7 @@ begin
G.CATSerialParity[i] := 0; // None G.CATSerialParity[i] := 0; // None
end; end;
G.CATTcpEnabled := False; G.CATTcpEnabled := False;
G.CATTcpPort := 4992; G.CATTcpPort := 19090;
end; end;
constructor TSettingsManager.Create(const FilePath: string); constructor TSettingsManager.Create(const FilePath: string);
@@ -428,7 +431,7 @@ begin
G.CATSerialParity[i] := JI(GObj,'cat_serial_parity_'+IntToStr(i), 0); G.CATSerialParity[i] := JI(GObj,'cat_serial_parity_'+IntToStr(i), 0);
end; end;
G.CATTcpEnabled := JB(GObj,'cat_tcp_enabled', False); G.CATTcpEnabled := JB(GObj,'cat_tcp_enabled', False);
G.CATTcpPort := JI(GObj,'cat_tcp_port', 4992); G.CATTcpPort := JI(GObj,'cat_tcp_port', 19090);
for i := 0 to CFG_BAND_COUNT-1 do for i := 0 to CFG_BAND_COUNT-1 do
begin begin
@@ -579,4 +582,43 @@ begin
SampleRate := JI(O, 'sample_rate', 192000); SampleRate := JI(O, 'sample_rate', 192000);
end; end;
procedure TSettingsManager.SaveCATSettings(const G: TGlobalSettings);
var O: TJSONObject; i: Integer;
begin
O := EnsureObj(FRoot, 'cat');
JW(O, 'tcp_en', G.CATTcpEnabled);
JW(O, 'tcp_port', G.CATTcpPort);
for i := 0 to 3 do
begin
JW(O, 'ser_en_' +IntToStr(i), G.CATSerialEnabled[i]);
JWS(O, 'ser_port_' +IntToStr(i), G.CATSerialPort[i]);
JW(O, 'ser_baud_' +IntToStr(i), G.CATSerialBaud[i]);
JW(O, 'ser_dbits_' +IntToStr(i), G.CATSerialDataBits[i]);
JW(O, 'ser_sbits_' +IntToStr(i), G.CATSerialStopBits[i]);
JW(O, 'ser_parity_'+IntToStr(i), G.CATSerialParity[i]);
end;
end;
procedure TSettingsManager.LoadCATSettings(var G: TGlobalSettings);
var O: TJSONObject; i: Integer;
begin
if FRoot.Find('cat') = nil then Exit;
O := EnsureObj(FRoot, 'cat');
G.CATTcpEnabled := JB(O, 'tcp_en', False);
G.CATTcpPort := JI(O, 'tcp_port', 19090);
for i := 0 to 3 do
begin
G.CATSerialEnabled[i] := JB(O, 'ser_en_' +IntToStr(i), False);
{$IFDEF MSWINDOWS}
G.CATSerialPort[i] := JS(O, 'ser_port_' +IntToStr(i), 'COM'+IntToStr(i+1));
{$ELSE}
G.CATSerialPort[i] := JS(O, 'ser_port_' +IntToStr(i), '/dev/ttyS'+IntToStr(i));
{$ENDIF}
G.CATSerialBaud[i] := JI(O, 'ser_baud_' +IntToStr(i), 9600);
G.CATSerialDataBits[i] := JI(O, 'ser_dbits_' +IntToStr(i), 8);
G.CATSerialStopBits[i] := JI(O, 'ser_sbits_' +IntToStr(i), 1);
G.CATSerialParity[i] := JI(O, 'ser_parity_'+IntToStr(i), 0);
end;
end;
end. end.
+2 -2
View File
@@ -1445,7 +1445,7 @@ begin
FCATTcpEn := TCheckBox.Create(Self); FCATTcpEn := TCheckBox.Create(Self);
FCATTcpEn.Parent := Grp; FCATTcpEn.Parent := Grp;
FCATTcpEn.Caption := 'Enable TCP server (default port 4992)'; FCATTcpEn.Caption := 'Enable TCP server (default port 19090)';
FCATTcpEn.SetBounds(PAD, R1, 300, 22); FCATTcpEn.SetBounds(PAD, R1, 300, 22);
FCATTcpEn.Font.Color := CLR_TEXT; FCATTcpEn.Font.Color := CLR_TEXT;
FCATTcpEn.Font.Name := UI_FONT; FCATTcpEn.Font.Size := 9; FCATTcpEn.Font.Name := UI_FONT; FCATTcpEn.Font.Size := 9;
@@ -1458,7 +1458,7 @@ begin
Spin.Color := CLR_INPUT; Spin.Font.Color := CLR_INPUT_TEXT; Spin.Color := CLR_INPUT; Spin.Font.Color := CLR_INPUT_TEXT;
Spin.Font.Name := UI_FONT; Spin.Font.Size := 9; Spin.Font.Name := UI_FONT; Spin.Font.Size := 9;
Spin.MinValue := 1; Spin.MaxValue := 65535; Spin.MinValue := 1; Spin.MaxValue := 65535;
Spin.Value := 4992; Spin.Value := 19090;
Spin.OnChange := OnCATTcpChange; Spin.OnChange := OnCATTcpChange;
FCATTcpPort := Spin; FCATTcpPort := Spin;
end; end;