mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 17:27:32 +00:00
start work tx
This commit is contained in:
+33
-21
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user