mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
Remove XVTR RF checkbox; fix XVTR Enable bit to match Thetis
XVTR RF (xvtr_rf in Thetis) is dead code — GetXVTRRF() is never called. Remove the field, UI column, save/load from TXvtrEntry. UseDDCIn is now always True when in XVTR mode (previous default behaviour, XVTRRF=False). Byte 1400 bit 0 (XVTR Enable / VHF T/R relay output) now follows Thetis: - XVTR mode: set only when DisablePA=True (external T/R relay needed) - HF mode: set when Alex.EnableXvtrHf is checked (Antenna tab) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
+15
-8
@@ -145,9 +145,8 @@ type
|
|||||||
FAlexConfig: TAlexSettings; // per-band antenna + routing config
|
FAlexConfig: TAlexSettings; // per-band antenna + routing config
|
||||||
FStepAtten: Byte; // ADC0 step attenuator 0-31 dB
|
FStepAtten: Byte; // ADC0 step attenuator 0-31 dB
|
||||||
// ---- XVTR (Transverter) state ----
|
// ---- XVTR (Transverter) state ----
|
||||||
// FXvtrEnable — устанавливает bit 0 байта 1400 HP-пакета: включает выход
|
// FXvtrEnable — True когда активен XVTR-диапазон. Используется как
|
||||||
// XVTR на трансивере (управляющий пин/реле). Обычно True, пока активный
|
// XvtrActive в CalcAlex0 и для управления byte 1400 bit 0.
|
||||||
// диапазон — трансвертер.
|
|
||||||
FXvtrEnable: Boolean;
|
FXvtrEnable: Boolean;
|
||||||
// FXvtrRxAntOverride — если 1..3, использовать эту антенну вместо
|
// FXvtrRxAntOverride — если 1..3, использовать эту антенну вместо
|
||||||
// Alex.RxAnt[band] (per-XVTR RX antenna). 0 = не переопределять.
|
// Alex.RxAnt[band] (per-XVTR RX antenna). 0 = не переопределять.
|
||||||
@@ -1417,12 +1416,20 @@ begin
|
|||||||
Buf[1435] := Alex0 and $FF;
|
Buf[1435] := Alex0 and $FF;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// XVTR enable bit (byte 1400 bit 0)
|
// XVTR enable bit (byte 1400 bit 0) — управляет выходом VHF T/R relay платы.
|
||||||
// openHPSDR Ethernet Protocol v4.3: byte 1400 — Transverter/audio enable.
|
// Логика как в Thetis:
|
||||||
// bit 0 = XVTR enable, bit 1 = Audio Codec enable (на платах с поддержкой).
|
// в XVTR-режиме: бит = DisablePA (внешний T/R relay нужен только если PA подавлен)
|
||||||
// Audio codec бит оставляем 0 — мы IQ-mic не используем.
|
// в HF-режиме: бит = Alex.EnableXvtrHf (галочка "Enable XVTR HF" в Antenna tab)
|
||||||
if FXvtrEnable then
|
if FXvtrEnable then
|
||||||
Buf[1400] := Buf[1400] or $01;
|
begin
|
||||||
|
if FXvtrDisablePA then
|
||||||
|
Buf[1400] := Buf[1400] or $01;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
if FAlexConfig.EnableXvtrHf then
|
||||||
|
Buf[1400] := Buf[1400] or $01;
|
||||||
|
end;
|
||||||
|
|
||||||
// Step attenuators ADC0/ADC1 (bytes 1443/1442)
|
// Step attenuators ADC0/ADC1 (bytes 1443/1442)
|
||||||
// 0 dB = 0, max 31 dB
|
// 0 dB = 0, max 31 dB
|
||||||
|
|||||||
+1
-4
@@ -5604,10 +5604,7 @@ begin
|
|||||||
FXvtrSettings.Entries[FCurrentXvtr].Enabled then
|
FXvtrSettings.Entries[FCurrentXvtr].Enabled then
|
||||||
begin
|
begin
|
||||||
En := True;
|
En := True;
|
||||||
// XVTRRF=True означает что трансвертер использует HF тракт — не нужно
|
UseDDCIn := True;
|
||||||
// переключаться на отдельный XVTR DDC IN на Alex. Default False →
|
|
||||||
// подключаем XVTR-IF к выделенному пину XVTR DDC IN.
|
|
||||||
UseDDCIn := not FXvtrSettings.Entries[FCurrentXvtr].XVTRRF;
|
|
||||||
DisablePA := FXvtrSettings.Entries[FCurrentXvtr].DisablePA;
|
DisablePA := FXvtrSettings.Entries[FCurrentXvtr].DisablePA;
|
||||||
RxAnt := FXvtrSettings.Entries[FCurrentXvtr].RXAntenna;
|
RxAnt := FXvtrSettings.Entries[FCurrentXvtr].RXAntenna;
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -118,8 +118,6 @@ type
|
|||||||
RXGain: Double; // dB, компенсация усиления RX тракта
|
RXGain: Double; // dB, компенсация усиления RX тракта
|
||||||
RXOnly: Boolean; // True — запрещает TX на этом трансверторе
|
RXOnly: Boolean; // True — запрещает TX на этом трансверторе
|
||||||
TXPower: Integer; // 0..100 % (drive level специально для XVTR)
|
TXPower: Integer; // 0..100 % (drive level специально для XVTR)
|
||||||
XVTRRF: Boolean; // True — трансвертер использует основной HF RF путь
|
|
||||||
// (а не отдельный XVTR DDC IN на Alex)
|
|
||||||
DisablePA: Boolean; // True — отключить внутренний PA при TX (XVTR имеет свой)
|
DisablePA: Boolean; // True — отключить внутренний PA при TX (XVTR имеет свой)
|
||||||
RXAntenna: Byte; // 0=по-умолчанию(основной band), 1=ANT1, 2=ANT2, 3=ANT3
|
RXAntenna: Byte; // 0=по-умолчанию(основной band), 1=ANT1, 2=ANT2, 3=ANT3
|
||||||
LastFreq: Double; // Hz — последняя tuned visible частота (BandStack)
|
LastFreq: Double; // Hz — последняя tuned visible частота (BandStack)
|
||||||
@@ -1058,7 +1056,6 @@ begin
|
|||||||
X.Entries[i].RXGain := 0.0;
|
X.Entries[i].RXGain := 0.0;
|
||||||
X.Entries[i].RXOnly := False;
|
X.Entries[i].RXOnly := False;
|
||||||
X.Entries[i].TXPower := 100;
|
X.Entries[i].TXPower := 100;
|
||||||
X.Entries[i].XVTRRF := False;
|
|
||||||
X.Entries[i].DisablePA := False;
|
X.Entries[i].DisablePA := False;
|
||||||
X.Entries[i].RXAntenna := 0;
|
X.Entries[i].RXAntenna := 0;
|
||||||
X.Entries[i].LastFreq := 0.0;
|
X.Entries[i].LastFreq := 0.0;
|
||||||
@@ -1104,7 +1101,6 @@ begin
|
|||||||
X.Entries[i].RXGain := JD(EObj, 'rx_gain', X.Entries[i].RXGain);
|
X.Entries[i].RXGain := JD(EObj, 'rx_gain', X.Entries[i].RXGain);
|
||||||
X.Entries[i].RXOnly := JB(EObj, 'rx_only', X.Entries[i].RXOnly);
|
X.Entries[i].RXOnly := JB(EObj, 'rx_only', X.Entries[i].RXOnly);
|
||||||
X.Entries[i].TXPower := EnsureRange(JI(EObj, 'tx_pwr', X.Entries[i].TXPower), 0, 100);
|
X.Entries[i].TXPower := EnsureRange(JI(EObj, 'tx_pwr', X.Entries[i].TXPower), 0, 100);
|
||||||
X.Entries[i].XVTRRF := JB(EObj, 'xvtr_rf', X.Entries[i].XVTRRF);
|
|
||||||
X.Entries[i].DisablePA := JB(EObj, 'dis_pa', X.Entries[i].DisablePA);
|
X.Entries[i].DisablePA := JB(EObj, 'dis_pa', X.Entries[i].DisablePA);
|
||||||
X.Entries[i].RXAntenna := EnsureRange(JI(EObj, 'rx_ant', X.Entries[i].RXAntenna), 0, 3);
|
X.Entries[i].RXAntenna := EnsureRange(JI(EObj, 'rx_ant', X.Entries[i].RXAntenna), 0, 3);
|
||||||
X.Entries[i].LastFreq := JD(EObj, 'last_freq', X.Entries[i].LastFreq);
|
X.Entries[i].LastFreq := JD(EObj, 'last_freq', X.Entries[i].LastFreq);
|
||||||
@@ -1135,7 +1131,6 @@ begin
|
|||||||
JW(EObj, 'rx_gain', X.Entries[i].RXGain);
|
JW(EObj, 'rx_gain', X.Entries[i].RXGain);
|
||||||
JW(EObj, 'rx_only', X.Entries[i].RXOnly);
|
JW(EObj, 'rx_only', X.Entries[i].RXOnly);
|
||||||
JW(EObj, 'tx_pwr', X.Entries[i].TXPower);
|
JW(EObj, 'tx_pwr', X.Entries[i].TXPower);
|
||||||
JW(EObj, 'xvtr_rf', X.Entries[i].XVTRRF);
|
|
||||||
JW(EObj, 'dis_pa', X.Entries[i].DisablePA);
|
JW(EObj, 'dis_pa', X.Entries[i].DisablePA);
|
||||||
JW(EObj, 'rx_ant', Integer(X.Entries[i].RXAntenna));
|
JW(EObj, 'rx_ant', Integer(X.Entries[i].RXAntenna));
|
||||||
JW(EObj, 'last_freq', X.Entries[i].LastFreq);
|
JW(EObj, 'last_freq', X.Entries[i].LastFreq);
|
||||||
|
|||||||
+2
-9
@@ -218,7 +218,6 @@ type
|
|||||||
FXvtrRXGain: array[0..CFG_XVTR_COUNT-1] of TFloatSpinEdit; // dB
|
FXvtrRXGain: array[0..CFG_XVTR_COUNT-1] of TFloatSpinEdit; // dB
|
||||||
FXvtrRXOnly: array[0..CFG_XVTR_COUNT-1] of TCheckBox;
|
FXvtrRXOnly: array[0..CFG_XVTR_COUNT-1] of TCheckBox;
|
||||||
FXvtrPower: array[0..CFG_XVTR_COUNT-1] of TSpinEdit; // 0..100
|
FXvtrPower: array[0..CFG_XVTR_COUNT-1] of TSpinEdit; // 0..100
|
||||||
FXvtrRF: array[0..CFG_XVTR_COUNT-1] of TCheckBox;
|
|
||||||
FXvtrDisPA: array[0..CFG_XVTR_COUNT-1] of TCheckBox;
|
FXvtrDisPA: array[0..CFG_XVTR_COUNT-1] of TCheckBox;
|
||||||
FXvtrRXAnt: array[0..CFG_XVTR_COUNT-1] of TComboBox; // 0=def..3=ANT3
|
FXvtrRXAnt: array[0..CFG_XVTR_COUNT-1] of TComboBox; // 0=def..3=ANT3
|
||||||
FChkXvtrTunPwr: TCheckBox;
|
FChkXvtrTunPwr: TCheckBox;
|
||||||
@@ -2662,9 +2661,8 @@ const
|
|||||||
GAIN_X = 504; GAIN_W = 62; // 1 десятичная, dB
|
GAIN_X = 504; GAIN_W = 62; // 1 десятичная, dB
|
||||||
RXO_X = 574; RXO_W = 56; // chk центрирован
|
RXO_X = 574; RXO_W = 56; // chk центрирован
|
||||||
PWR_X = 638; PWR_W = 58; // целое %
|
PWR_X = 638; PWR_W = 58; // целое %
|
||||||
RF_X = 704; RF_W = 56;
|
PA_X = 704; PA_W = 66;
|
||||||
PA_X = 768; PA_W = 66;
|
ANT_X = 778; ANT_W = 78; // combo default/ANT1/ANT2/ANT3
|
||||||
ANT_X = 842; ANT_W = 78; // combo default/ANT1/ANT2/ANT3
|
|
||||||
GRP_W = ANT_X + ANT_W + 14; // 934
|
GRP_W = ANT_X + ANT_W + 14; // 934
|
||||||
var
|
var
|
||||||
Grp, GrpOpts: TPanel;
|
Grp, GrpOpts: TPanel;
|
||||||
@@ -2795,7 +2793,6 @@ begin
|
|||||||
MakeHdr(Grp, 'RX Gain' + LineEnding + 'dB', GAIN_X, Y, GAIN_W);
|
MakeHdr(Grp, 'RX Gain' + LineEnding + 'dB', GAIN_X, Y, GAIN_W);
|
||||||
MakeHdr(Grp, 'RX' + LineEnding + 'Only', RXO_X, Y, RXO_W);
|
MakeHdr(Grp, 'RX' + LineEnding + 'Only', RXO_X, Y, RXO_W);
|
||||||
MakeHdr(Grp, 'TX Pwr' + LineEnding + '%', PWR_X, Y, PWR_W);
|
MakeHdr(Grp, 'TX Pwr' + LineEnding + '%', PWR_X, Y, PWR_W);
|
||||||
MakeHdr(Grp, 'XVTR' + LineEnding + 'RF', RF_X, Y, RF_W);
|
|
||||||
MakeHdr(Grp, 'Disable' + LineEnding + 'PA', PA_X, Y, PA_W);
|
MakeHdr(Grp, 'Disable' + LineEnding + 'PA', PA_X, Y, PA_W);
|
||||||
MakeHdr(Grp, 'RX' + LineEnding + 'Antenna', ANT_X, Y, ANT_W);
|
MakeHdr(Grp, 'RX' + LineEnding + 'Antenna', ANT_X, Y, ANT_W);
|
||||||
|
|
||||||
@@ -2814,7 +2811,6 @@ begin
|
|||||||
// Чекбокс RX Only центрируем
|
// Чекбокс RX Only центрируем
|
||||||
FXvtrRXOnly[i]:= MakeChk(Grp, RXO_X + (RXO_W - 22) div 2, Y + 2);
|
FXvtrRXOnly[i]:= MakeChk(Grp, RXO_X + (RXO_W - 22) div 2, Y + 2);
|
||||||
FXvtrPower[i] := MakeInt(Grp, PWR_X, Y, PWR_W, 0, 100);
|
FXvtrPower[i] := MakeInt(Grp, PWR_X, Y, PWR_W, 0, 100);
|
||||||
FXvtrRF[i] := MakeChk(Grp, RF_X + (RF_W - 22) div 2, Y + 2);
|
|
||||||
FXvtrDisPA[i] := MakeChk(Grp, PA_X + (PA_W - 22) div 2, Y + 2);
|
FXvtrDisPA[i] := MakeChk(Grp, PA_X + (PA_W - 22) div 2, Y + 2);
|
||||||
FXvtrRXAnt[i] := MakeCmb(Grp, ANT_X, Y, ANT_W);
|
FXvtrRXAnt[i] := MakeCmb(Grp, ANT_X, Y, ANT_W);
|
||||||
FXvtrRXAnt[i].Items.Add('default');
|
FXvtrRXAnt[i].Items.Add('default');
|
||||||
@@ -2876,7 +2872,6 @@ begin
|
|||||||
if FXvtrRXGain[Idx]<> nil then FXvtrRXGain[Idx].Enabled:= En;
|
if FXvtrRXGain[Idx]<> nil then FXvtrRXGain[Idx].Enabled:= En;
|
||||||
if FXvtrRXOnly[Idx]<> nil then FXvtrRXOnly[Idx].Enabled:= En;
|
if FXvtrRXOnly[Idx]<> nil then FXvtrRXOnly[Idx].Enabled:= En;
|
||||||
if FXvtrPower[Idx] <> nil then FXvtrPower[Idx].Enabled := En;
|
if FXvtrPower[Idx] <> nil then FXvtrPower[Idx].Enabled := En;
|
||||||
if FXvtrRF[Idx] <> nil then FXvtrRF[Idx].Enabled := En;
|
|
||||||
if FXvtrDisPA[Idx] <> nil then FXvtrDisPA[Idx].Enabled := En;
|
if FXvtrDisPA[Idx] <> nil then FXvtrDisPA[Idx].Enabled := En;
|
||||||
if FXvtrRXAnt[Idx] <> nil then FXvtrRXAnt[Idx].Enabled := En;
|
if FXvtrRXAnt[Idx] <> nil then FXvtrRXAnt[Idx].Enabled := En;
|
||||||
end;
|
end;
|
||||||
@@ -2895,7 +2890,6 @@ begin
|
|||||||
if FXvtrRXGain[i]<> nil then FXvtrConfig.Entries[i].RXGain := FXvtrRXGain[i].Value;
|
if FXvtrRXGain[i]<> nil then FXvtrConfig.Entries[i].RXGain := FXvtrRXGain[i].Value;
|
||||||
if FXvtrRXOnly[i]<> nil then FXvtrConfig.Entries[i].RXOnly := FXvtrRXOnly[i].Checked;
|
if FXvtrRXOnly[i]<> nil then FXvtrConfig.Entries[i].RXOnly := FXvtrRXOnly[i].Checked;
|
||||||
if FXvtrPower[i] <> nil then FXvtrConfig.Entries[i].TXPower := FXvtrPower[i].Value;
|
if FXvtrPower[i] <> nil then FXvtrConfig.Entries[i].TXPower := FXvtrPower[i].Value;
|
||||||
if FXvtrRF[i] <> nil then FXvtrConfig.Entries[i].XVTRRF := FXvtrRF[i].Checked;
|
|
||||||
if FXvtrDisPA[i] <> nil then FXvtrConfig.Entries[i].DisablePA := FXvtrDisPA[i].Checked;
|
if FXvtrDisPA[i] <> nil then FXvtrConfig.Entries[i].DisablePA := FXvtrDisPA[i].Checked;
|
||||||
if (FXvtrRXAnt[i]<> nil) and (FXvtrRXAnt[i].ItemIndex >= 0) then
|
if (FXvtrRXAnt[i]<> nil) and (FXvtrRXAnt[i].ItemIndex >= 0) then
|
||||||
FXvtrConfig.Entries[i].RXAntenna := Byte(FXvtrRXAnt[i].ItemIndex);
|
FXvtrConfig.Entries[i].RXAntenna := Byte(FXvtrRXAnt[i].ItemIndex);
|
||||||
@@ -2938,7 +2932,6 @@ begin
|
|||||||
if FXvtrRXGain[i]<> nil then FXvtrRXGain[i].Value := X.Entries[i].RXGain;
|
if FXvtrRXGain[i]<> nil then FXvtrRXGain[i].Value := X.Entries[i].RXGain;
|
||||||
if FXvtrRXOnly[i]<> nil then FXvtrRXOnly[i].Checked:= X.Entries[i].RXOnly;
|
if FXvtrRXOnly[i]<> nil then FXvtrRXOnly[i].Checked:= X.Entries[i].RXOnly;
|
||||||
if FXvtrPower[i] <> nil then FXvtrPower[i].Value := X.Entries[i].TXPower;
|
if FXvtrPower[i] <> nil then FXvtrPower[i].Value := X.Entries[i].TXPower;
|
||||||
if FXvtrRF[i] <> nil then FXvtrRF[i].Checked := X.Entries[i].XVTRRF;
|
|
||||||
if FXvtrDisPA[i] <> nil then FXvtrDisPA[i].Checked := X.Entries[i].DisablePA;
|
if FXvtrDisPA[i] <> nil then FXvtrDisPA[i].Checked := X.Entries[i].DisablePA;
|
||||||
if FXvtrRXAnt[i] <> nil then
|
if FXvtrRXAnt[i] <> nil then
|
||||||
FXvtrRXAnt[i].ItemIndex := EnsureRange(X.Entries[i].RXAntenna, 0, 3);
|
FXvtrRXAnt[i].ItemIndex := EnsureRange(X.Entries[i].RXAntenna, 0, 3);
|
||||||
|
|||||||
Reference in New Issue
Block a user