rx2 support work

This commit is contained in:
2026-05-27 11:29:39 +03:00
parent 047c9b0997
commit c2ca52511c
4 changed files with 1290 additions and 258 deletions
+67 -12
View File
@@ -151,6 +151,8 @@ type
// Текущее состояние для построения HP пакетов
FCurrentRXFreq: Double;
FCurrentTXFreq: Double;
FDDCFreq: array[0..MAX_DDCS - 1] of Double;
FDDCEnabled: array[0..MAX_DDCS - 1] of Boolean;
FCurrentDrive: Byte;
FIsTransmitting: Boolean;
FPTTActive: Boolean; // фактический PTT в HP-пакете (отдельно от Alex T/R)
@@ -216,12 +218,18 @@ type
procedure SendDDCSpecific(const Pkt: TDDCSpecificPacket);
procedure ConfigureDDCs(NumDDCs: Byte; SampleRate: Word; ADCSource: Byte = 0;
DitherEnabled: Boolean = True; RandomEnabled: Boolean = True);
procedure ConfigureDDCReceivers(ReceiverCount: Byte; SampleRate: Word;
RX1ADCSource: Byte = 0; RX2ADCSource: Byte = 0;
DitherEnabled: Boolean = True;
RandomEnabled: Boolean = True;
RX2SampleRate: Word = 0);
procedure SendDUCSpecific(const Pkt: TDUCSpecificPacket);
procedure SendHighPriority(const Pkt: THighPriorityPacket);
procedure SetRunAndFreq(Run: Boolean; DDC0FreqHz, DUCFreqHz: Double;
DriveLevel: Byte = 100);
procedure UpdateState(RXFreqHz, TXFreqHz: Double; DriveLevel: Byte;
Transmitting, PAEnabled, AlexEnabled: Boolean);
procedure SetDDCFrequency(DDCIndex: Integer; FreqHz: Double);
procedure SetStepAtten(dB: Byte);
procedure SetAlexConfig(const A: TAlexSettings);
// Включение/настройка XVTR-режима. Все параметры применяются мгновенно
@@ -608,6 +616,8 @@ begin
FWBSeqValid := False;
FCurrentRXFreq := 7100000;
FCurrentTXFreq := 7100000;
FillChar(FDDCEnabled, SizeOf(FDDCEnabled), 0);
FDDCFreq[0] := FCurrentRXFreq;
FCurrentDrive := 0;
FIsTransmitting := False;
FPAEnabled := True;
@@ -1376,15 +1386,29 @@ end;
procedure THPSDRNetwork.ConfigureDDCs(NumDDCs: Byte; SampleRate: Word;
ADCSource: Byte;
DitherEnabled: Boolean; RandomEnabled: Boolean);
begin
ConfigureDDCReceivers(NumDDCs, SampleRate, ADCSource, ADCSource,
DitherEnabled, RandomEnabled);
end;
procedure THPSDRNetwork.ConfigureDDCReceivers(ReceiverCount: Byte; SampleRate: Word;
RX1ADCSource: Byte; RX2ADCSource: Byte;
DitherEnabled: Boolean; RandomEnabled: Boolean;
RX2SampleRate: Word);
var
Pkt: TDDCSpecificPacket;
i, ddc: Integer;
DDCBase: Integer;
ADCSource: Byte;
DDCRate: Word;
begin
FillChar(Pkt, SizeOf(Pkt), 0);
// ANAN-7000/8000/Saturn имеют 2 ADC
if FDevice.BoardType in [4, 5, 10] then // ORION=4, ORION2=5, SATURN=10
if ReceiverCount < 1 then ReceiverCount := 1;
if ReceiverCount > 2 then ReceiverCount := 2;
// ANAN-100D/200D/7000/8000/Saturn имеют второй ADC/RX front-end.
if FDevice.BoardType in [3, 4, 5, 10] then
Pkt.NumADCs := 2
else
Pkt.NumADCs := 1;
@@ -1402,9 +1426,17 @@ begin
else
DDCBase := 0;
for i := 0 to NumDDCs - 1 do
FillChar(FDDCEnabled, SizeOf(FDDCEnabled), 0);
for i := 0 to ReceiverCount - 1 do
begin
ddc := DDCBase + i;
ADCSource := RX1ADCSource;
if i = 1 then ADCSource := RX2ADCSource;
if ADCSource >= Pkt.NumADCs then ADCSource := 0;
DDCRate := SampleRate;
if (i = 1) and (RX2SampleRate > 0) then DDCRate := RX2SampleRate;
FDDCEnabled[ddc] := True;
// Enable bit для DDC ddc
Pkt.DDCEnable[ddc div 8] := Pkt.DDCEnable[ddc div 8] or Byte(1 shl (ddc mod 8));
// Config: 6 байт на DDC начиная с offset 17 в пакете → в массиве DDCConfig
@@ -1412,8 +1444,8 @@ begin
// DDCConfig[ddc*6 + 1..2] = sample rate / 1000 (ksps)
// DDCConfig[ddc*6 + 5] = bits per sample
Pkt.DDCConfig[ddc * 6] := ADCSource;
Pkt.DDCConfig[ddc * 6 + 1] := (SampleRate shr 8) and $FF;
Pkt.DDCConfig[ddc * 6 + 2] := SampleRate and $FF;
Pkt.DDCConfig[ddc * 6 + 1] := (DDCRate shr 8) and $FF;
Pkt.DDCConfig[ddc * 6 + 2] := DDCRate and $FF;
Pkt.DDCConfig[ddc * 6 + 3] := 0;
Pkt.DDCConfig[ddc * 6 + 4] := 0;
Pkt.DDCConfig[ddc * 6 + 5] := 24; // 24 bits per sample
@@ -1451,6 +1483,8 @@ procedure THPSDRNetwork.UpdateState(RXFreqHz, TXFreqHz: Double;
Transmitting, PAEnabled, AlexEnabled: Boolean);
begin
FCurrentRXFreq := RXFreqHz;
FDDCFreq[0] := RXFreqHz;
FDDCFreq[2] := RXFreqHz;
FCurrentTXFreq := TXFreqHz;
FCurrentDrive := DriveLevel;
FIsTransmitting := Transmitting;
@@ -1458,6 +1492,15 @@ begin
FAlexEnabled := AlexEnabled;
end;
procedure THPSDRNetwork.SetDDCFrequency(DDCIndex: Integer; FreqHz: Double);
begin
if (DDCIndex < Low(FDDCFreq)) or (DDCIndex > High(FDDCFreq)) then Exit;
FDDCFreq[DDCIndex] := FreqHz;
if (DDCIndex = 0) or (DDCIndex = 2) then
FCurrentRXFreq := FreqHz;
if FConnected then SendFullHP;
end;
procedure THPSDRNetwork.SetStepAtten(dB: Byte);
begin
if dB > 31 then dB := 31;
@@ -1473,6 +1516,9 @@ var
Alex1: LongWord;
IsOrion2: Boolean;
DDCBase: Integer; // 0 для HERMES, 2 для ORION/ORION2/ANGELIA
DDCIdx: Integer;
DDCF: Double;
RX2Freq: Double;
begin
if not FConnected then Exit;
@@ -1504,12 +1550,19 @@ begin
else
DDCBase := 0;
// DDC RX frequency (bytes 9 + DDC*4)
Ph := FreqToPhaseWord(FCurrentRXFreq);
Buf[9 + DDCBase*4] := (Ph shr 24) and $FF;
Buf[10 + DDCBase*4] := (Ph shr 16) and $FF;
Buf[11 + DDCBase*4] := (Ph shr 8) and $FF;
Buf[12 + DDCBase*4] := Ph and $FF;
// DDC RX frequencies (bytes 9 + DDC*4)
if FDDCFreq[DDCBase] <= 0 then FDDCFreq[DDCBase] := FCurrentRXFreq;
for DDCIdx := 0 to MAX_DDCS - 1 do
if FDDCEnabled[DDCIdx] or (DDCIdx = DDCBase) then
begin
DDCF := FDDCFreq[DDCIdx];
if DDCF <= 0 then DDCF := FCurrentRXFreq;
Ph := FreqToPhaseWord(DDCF);
Buf[9 + DDCIdx*4] := (Ph shr 24) and $FF;
Buf[10 + DDCIdx*4] := (Ph shr 16) and $FF;
Buf[11 + DDCIdx*4] := (Ph shr 8) and $FF;
Buf[12 + DDCIdx*4] := Ph and $FF;
end;
// DUC TX frequency (bytes 329-332)
Ph := FreqToPhaseWord(FCurrentTXFreq);
@@ -1537,7 +1590,9 @@ begin
// ALEX1 filter bits (bytes 1428-1431) — только Orion2/Saturn
if IsOrion2 then
begin
Alex1 := CalcAlex1(FCurrentRXFreq, FCurrentTXFreq,
RX2Freq := FDDCFreq[DDCBase + 1];
if RX2Freq <= 0 then RX2Freq := FCurrentRXFreq;
Alex1 := CalcAlex1(RX2Freq, FCurrentTXFreq,
FIsTransmitting, FAlexConfig,
FXvtrDisablePA);
Buf[1428] := (Alex1 shr 24) and $FF;