start work tx

This commit is contained in:
2026-03-26 22:50:55 +03:00
parent 7664907b3e
commit ae532a33cd
9 changed files with 1373 additions and 149 deletions
+33 -21
View File
@@ -19,7 +19,7 @@ uses
{$ELSE}
Sockets, BaseUnix,
{$ENDIF}
HPSDRProtocol;
HPSDRProtocol, SyncObjs;
{$IFDEF WINDOWS}
// ---------------------------------------------------------------------------
@@ -129,6 +129,8 @@ type
FPAEnabled: Boolean;
FAlexEnabled: Boolean;
FSendLock: TCriticalSection; // защита concurrent UDP sends
function DoCreateSocket: TSocket;
procedure DoCloseSocket(var S: TSocket);
function DoSendTo(S: TSocket; const Buf; BufLen: Integer;
@@ -423,11 +425,13 @@ begin
FIsTransmitting := False;
FPAEnabled := True;
FAlexEnabled := True;
FSendLock := TCriticalSection.Create;
end;
destructor THPSDRNetwork.Destroy;
begin
Disconnect;
FSendLock.Free;
inherited;
end;
@@ -529,7 +533,12 @@ begin
Addr.sin_family := AF_INET;
Addr.sin_port := htons(DestPort);
Addr.sin_addr := StrToNetAddr(DestIP);
Result := fpSendTo(S, @Buf, BufLen, 0, @Addr, SizeOf(Addr)) = BufLen;
FSendLock.Enter;
try
Result := fpSendTo(S, @Buf, BufLen, 0, @Addr, SizeOf(Addr)) = BufLen;
finally
FSendLock.Leave;
end;
end;
function THPSDRNetwork.DoRecvFrom(S: TSocket; var Buf; BufLen: Integer;
@@ -767,19 +776,11 @@ end;
procedure THPSDRNetwork.HandleMicData(const Buf: array of Byte; Len: Integer);
var
Pkt: TMicDataPacket;
Sync: TMicSync;
M: TThreadMethod;
Pkt: TMicDataPacket;
begin
if not Assigned(FOnMic) then Exit;
Move(Buf[0], Pkt, SizeOf(Pkt));
Sync := TMicSync.Create(FOnMic, Pkt);
try
M := Sync.Execute;
TThread.Synchronize(nil, M);
finally
Sync.Free;
end;
FOnMic(Pkt); // прямой вызов из receive thread — TX обработка не касается UI
end;
// ---------------------------------------------------------------------------
@@ -820,8 +821,14 @@ begin
Result := 0;
// TX relay при передаче
// Bit 27 ($08000000) = T/R relay для всех плат
// Bit 18 ($00040000) = TxRx Status для Orion MkII / Saturn / G2
if Transmitting then
Result := Result or $08000000; // ALEX_TX_RELAY
begin
Result := Result or $08000000; // ALEX_TX_RELAY bit27
if IsOrion2 then
Result := Result or $00040000; // TxRx Status bit18 (ANAN-7/8000, Saturn)
end;
// RX HPF (для ANAN-100/200) или BPF (для ANAN-7000)
if IsOrion2 then
@@ -876,15 +883,15 @@ var
begin
FillChar(Pkt, SizeOf(Pkt), 0);
// ANAN-7000/8000 имеют 2 ADC
if FDevice.BoardType in [4, 5] then // ORION=4, ORION2=5
// ANAN-7000/8000/Saturn имеют 2 ADC
if FDevice.BoardType in [4, 5, 10] then // ORION=4, ORION2=5, SATURN=10
Pkt.NumADCs := 2
else
Pkt.NumADCs := 1;
// Для ANGELIA/ORION/ORION2 DDC начинается с индекса 2 (DDC0/1 — PureSignal)
// Для ANGELIA/ORION/ORION2/SATURN DDC начинается с индекса 2 (DDC0/1 — PureSignal)
// Для HERMES/HL2 — с 0
if FDevice.BoardType in [3, 4, 5] then // ANGELIA=3, ORION=4, ORION2=5
if FDevice.BoardType in [3, 4, 5, 10] then // ANGELIA=3, ORION=4, ORION2=5, SATURN=10
DDCBase := 2
else
DDCBase := 0;
@@ -960,11 +967,16 @@ begin
Inc(FSeqHP);
// Byte 4: Run | PTT
if FRunning then Buf[4] := HP_RUN;
if FRunning then
begin
Buf[4] := HP_RUN;
if FIsTransmitting then Buf[4] := Buf[4] or HP_PTT0;
end;
// DDC base: ORION/ORION2/ANGELIA начинают с DDC2
IsOrion2 := (FDevice.BoardType = 5); // ORION-II = 5
if FDevice.BoardType in [3, 4, 5] then // ANGELIA=3, ORION=4, ORION2=5
// DDC base: ORION/ORION2/ANGELIA/SATURN начинают с DDC2
// IsOrion2: платы с Alex BPF и TxRx Status bit18 (ORION_MK2=5, SATURN=10)
IsOrion2 := FDevice.BoardType in [5, 10]; // ORION_MK2=5, SATURN=10
if FDevice.BoardType in [3, 4, 5, 10] then // ANGELIA=3, ORION=4, ORION_MK2=5, SATURN=10
DDCBase := 2
else
DDCBase := 0;