mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
rx2 support work
This commit is contained in:
+67
-12
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user