Fix TX sequencing: PTT after Alex relay, SEQ error on startup

- Separate FPTTActive from FIsTransmitting so PTT bit in HP packet
  can be sent as a second packet after Alex bit27 (T/R relay) is set,
  matching Thetis behaviour: relay switches first, then PTT=1
- On TX stop: PTT=0 first, then Alex switches back to RX
- Add SendPTT(Active) method to THPSDRNetwork
- Reset FSeqHP to 0 in SetRunAndFreq(Run=True) to eliminate HP SEQ
  ERROR caused by intermediate SendFullHP calls before Run=1 packet
- RebuildXvtrButtons: use dynamic BtnH/RowH/MaxBottom instead of
  hardcoded px values so XVTR buttons scale correctly on HiDPI

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-15 22:09:54 +03:00
co-authored by Claude Sonnet 4.6
parent 81714d982e
commit 09d250ae45
2 changed files with 51 additions and 18 deletions
+23 -8
View File
@@ -139,6 +139,7 @@ type
FCurrentTXFreq: Double;
FCurrentDrive: Byte;
FIsTransmitting: Boolean;
FPTTActive: Boolean; // фактический PTT в HP-пакете (отдельно от Alex T/R)
FPAEnabled: Boolean;
FAlexEnabled: Boolean;
FAlexConfig: TAlexSettings; // per-band antenna + routing config
@@ -215,6 +216,9 @@ type
procedure SetXvtrMode(AEnable, AUseRxDDCIn, ADisablePA: Boolean;
ARxAnt: Byte);
procedure SendFullHP;
// Отдельная отправка PTT: переключает реле (bit27) и drive ДО, потом PTT.
// Не меняет FIsTransmitting — вызывать после UpdateState+SendFullHP.
procedure SendPTT(Active: Boolean);
procedure SendDDCAudio(const LeftRight: array of SmallInt);
procedure SendDUCIQ(const IData, QData: array of Integer);
procedure ClearDUCIQQueue;
@@ -946,13 +950,14 @@ begin
FSocket := DoCreateSocket;
if FSocket = SOCK_INVALID then Exit;
FConnected := True;
FSeqGeneral := 0;
FSeqDDCSpec := 0;
FSeqDUCSpec := 0;
FSeqHP := 0;
FSeqAudio := 0;
FSeqDUCIQ := 0;
FConnected := True;
FPTTActive := False;
FSeqGeneral := 0;
FSeqDDCSpec := 0;
FSeqDUCSpec := 0;
FSeqHP := 0;
FSeqAudio := 0;
FSeqDUCIQ := 0;
ResetDUCIQQueue;
StartThreads;
@@ -970,6 +975,7 @@ begin
StopThreads;
DoCloseSocket(FSocket);
FConnected := False;
FPTTActive := False;
FDevice.Valid := False;
FCachedDDCValid := False;
FCachedDUCValid := False;
@@ -1365,7 +1371,7 @@ begin
if FRunning then
begin
Buf[4] := HP_RUN;
if FIsTransmitting then Buf[4] := Buf[4] or HP_PTT0;
if FPTTActive then Buf[4] := Buf[4] or HP_PTT0;
end;
// DDC base: ORION/ORION2/ANGELIA/SATURN начинают с DDC2
@@ -1424,6 +1430,9 @@ end;
procedure THPSDRNetwork.SetRunAndFreq(Run: Boolean; DDC0FreqHz, DUCFreqHz: Double;
DriveLevel: Byte);
begin
// При Run=1 аппаратура сбрасывает счётчик HP-последовательности.
// Синхронизируем свой счётчик чтобы не получить SEQ ERROR на первом пакете.
if Run then FSeqHP := 0;
FRunning := Run;
FCurrentRXFreq := DDC0FreqHz;
FCurrentTXFreq := DUCFreqHz;
@@ -1431,6 +1440,12 @@ begin
SendFullHP;
end;
procedure THPSDRNetwork.SendPTT(Active: Boolean);
begin
FPTTActive := Active;
if FConnected then SendFullHP;
end;
procedure THPSDRNetwork.SendDDCAudio(const LeftRight: array of SmallInt);
var
Pkt: TDDCAudioPacket;