mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 18:43:51 +00:00
TUN button — Thetis-style тон через WDSP PostGen
- BtnTUN рядом с MOX. Включает SetTXAPostGenRun(TXA, 1) с тоном (mode=0, mag=1.0, freq из настроек) и активирует MOX. PTT/HW игнорируются во время tune. - Drive в режиме TUN использует FTXSettings.TUNLevel вместо слайдера, per-band калибровка FPABandCal применяется одинаково. - Settings → Transmit → Tune (TUN): TUNLevel 0..100% (def 10), TUNFreq 100..5000 Hz (def 750). Live-обновление во время tune.
This commit is contained in:
+100
-10
@@ -185,6 +185,9 @@ type
|
||||
// DUP: при TX продолжаем показывать RX1-водопад/панораму, а TX-фильтр
|
||||
// и TX-линии рисуем поверх. Аппаратной командой не является.
|
||||
FDisplayDuplex: Boolean;
|
||||
// TUN: режим тоновой подстройки. WDSP TXA PostGen генерирует чистый
|
||||
// тон, Drive подменяется на FTXSettings.TUNLevel (через Cal[band]).
|
||||
FTuning: Boolean;
|
||||
FHWPTTActive: Boolean; // True = hardware PTT нажата
|
||||
FMuted: Boolean;
|
||||
FVolume: Integer;
|
||||
@@ -329,6 +332,7 @@ type
|
||||
LblDrv: TLabel;
|
||||
TrkDrive: TFlatSlider;
|
||||
BtnMOX: TFlatButton;
|
||||
BtnTUN: TFlatButton;
|
||||
PbFwdPower: TPaintBox;
|
||||
PbSWR: TPaintBox;
|
||||
LblFwdPwr: TLabel;
|
||||
@@ -419,6 +423,8 @@ type
|
||||
procedure BtnCTunClick(Sender: TObject);
|
||||
procedure BtnDUPClick(Sender: TObject);
|
||||
procedure ApplyDUP(Active: Boolean);
|
||||
procedure BtnTUNClick(Sender: TObject);
|
||||
procedure ApplyTUN(Active: Boolean);
|
||||
procedure UpdateFilterButtons;
|
||||
procedure PbSpectrumMouseDown(Sender: TObject; Button: TMouseButton;
|
||||
Shift: TShiftState; X, Y: Integer);
|
||||
@@ -995,6 +1001,7 @@ begin
|
||||
FTransmitting := False;
|
||||
FSplitTxB := False;
|
||||
FDisplayDuplex := False;
|
||||
FTuning := False;
|
||||
FMuted := False;
|
||||
FVolume := 70;
|
||||
FCenterFreq := FVfoA;
|
||||
@@ -1637,16 +1644,19 @@ begin
|
||||
TrkDrive.Min := 0; TrkDrive.Max := 100; TrkDrive.Position := 50;
|
||||
TrkDrive.OnChange := TrkDriveChange;
|
||||
|
||||
BtnMOX := MakeBtn(PanelTX, 'MOX', 2, 38, 70, 32, BtnMOXClick);
|
||||
BtnMOX := MakeBtn(PanelTX, 'MOX', 2, 38, 50, 32, BtnMOXClick);
|
||||
BtnMOX.Font.Size := 12; BtnMOX.Font.Bold := True;
|
||||
|
||||
BtnTUN := MakeBtn(PanelTX, 'TUN', 56, 38, 50, 32, BtnTUNClick);
|
||||
BtnTUN.Font.Size := 12; BtnTUN.Font.Bold := True;
|
||||
|
||||
LblFwdPwr := TLabel.Create(Self);
|
||||
LblFwdPwr.Parent := PanelTX; LblFwdPwr.Left := 80; LblFwdPwr.Top := 42;
|
||||
LblFwdPwr.Parent := PanelTX; LblFwdPwr.Left := 112; LblFwdPwr.Top := 42;
|
||||
LblFwdPwr.Caption := '0W'; LblFwdPwr.Font.Color := CLR_METER_ON;
|
||||
LblFwdPwr.Font.Name := 'Courier New'; LblFwdPwr.Font.Size := 8;
|
||||
|
||||
LblSWRVal := TLabel.Create(Self);
|
||||
LblSWRVal.Parent := PanelTX; LblSWRVal.Left := 140; LblSWRVal.Top := 42;
|
||||
LblSWRVal.Parent := PanelTX; LblSWRVal.Left := 156; LblSWRVal.Top := 42;
|
||||
LblSWRVal.Caption := 'SWR:1.0'; LblSWRVal.Font.Color := CLR_TEXTDIM;
|
||||
LblSWRVal.Font.Name := 'Courier New'; LblSWRVal.Font.Size := 8;
|
||||
|
||||
@@ -2237,6 +2247,7 @@ begin
|
||||
StyleButton(BtnWfAGC, BtnWfAGC.Active);
|
||||
StyleButton(BtnWfNF, BtnWfNF.Active);
|
||||
StyleButton(BtnMOX, BtnMOX.Active);
|
||||
StyleButton(BtnTUN, BtnTUN.Active);
|
||||
|
||||
// Span / VFO-copy / HidePanel
|
||||
StyleSpanButton(BtnSpan48k, BtnSpan48k.Active);
|
||||
@@ -2839,8 +2850,9 @@ begin
|
||||
if HWPTT <> FHWPTTActive then
|
||||
begin
|
||||
FHWPTTActive := HWPTT;
|
||||
// Hardware PTT включает/выключает передачу только если BtnMOX не нажата
|
||||
if not BtnMOX.Active then
|
||||
// Hardware PTT игнорируется во время TUN; иначе включает/выключает передачу
|
||||
// только если кнопка MOX не нажата (приоритет за UI).
|
||||
if (not FTuning) and (not BtnMOX.Active) then
|
||||
ApplyMOX(HWPTT);
|
||||
end;
|
||||
end;
|
||||
@@ -3917,6 +3929,50 @@ begin
|
||||
ApplyDUP(not FDisplayDuplex);
|
||||
end;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// TUN — Thetis-style тон: WDSP TXA PostGen + MOX с отдельным уровнем Drive
|
||||
// ---------------------------------------------------------------------------
|
||||
procedure TMainForm.ApplyTUN(Active: Boolean);
|
||||
begin
|
||||
if Active = FTuning then Exit;
|
||||
if Active then
|
||||
begin
|
||||
// Включаем тон ДО запуска TX-аудио, чтобы первые сэмплы уже шли с тоном
|
||||
if FWDSPReady then
|
||||
FDSPEngine.SetTXTone(True, FTXSettings.TUNFreq, 1.0);
|
||||
FTuning := True;
|
||||
StyleButton(BtnTUN, True);
|
||||
// Drive байт пересчитываем (CalcDriveByte увидит FTuning=True)
|
||||
FDriveLevel := CalcDriveByte;
|
||||
if FWDSPReady then
|
||||
FDSPEngine.SetDriveLevel(FTXSettings.TUNLevel / 100.0);
|
||||
// Активируем TX (то же что MOX — PTT, run TXA-канал)
|
||||
if not FTransmitting then ApplyMOX(True);
|
||||
end else
|
||||
begin
|
||||
// Выключаем TX, потом тон, потом восстанавливаем drive
|
||||
if FTransmitting then ApplyMOX(False);
|
||||
if FWDSPReady then
|
||||
FDSPEngine.SetTXTone(False, 0, 0);
|
||||
FTuning := False;
|
||||
StyleButton(BtnTUN, False);
|
||||
FDriveLevel := CalcDriveByte;
|
||||
if FWDSPReady then
|
||||
FDSPEngine.SetDriveLevel(TrkDrive.Position / 100.0);
|
||||
if FNetwork.Connected and FNetwork.Running then
|
||||
begin
|
||||
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel,
|
||||
FTransmitting, True, True);
|
||||
FNetwork.SendFullHP;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
|
||||
procedure TMainForm.BtnTUNClick(Sender: TObject);
|
||||
begin
|
||||
ApplyTUN(not FTuning);
|
||||
end;
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Клик/драг по спектру/водопаду
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -4336,6 +4392,12 @@ end;
|
||||
|
||||
procedure TMainForm.BtnMOXClick(Sender: TObject);
|
||||
begin
|
||||
// Если идёт tune — клик MOX просто выходит из tune (без перехода на голос).
|
||||
if FTuning then
|
||||
begin
|
||||
ApplyTUN(False);
|
||||
Exit;
|
||||
end;
|
||||
ApplyMOX(not FTransmitting);
|
||||
end;
|
||||
|
||||
@@ -5034,13 +5096,21 @@ begin
|
||||
end;
|
||||
|
||||
function TMainForm.CalcDriveByte: Byte;
|
||||
var Cal: Double;
|
||||
var
|
||||
Cal: Double;
|
||||
Pos: Integer;
|
||||
begin
|
||||
if (FCurrentBand >= 0) and (FCurrentBand < BAND_COUNT) and (FPABandCal[FCurrentBand] > 0.0) then
|
||||
Cal := FPABandCal[FCurrentBand]
|
||||
else
|
||||
Cal := 100.0;
|
||||
Result := Round(TrkDrive.Position / 100.0 * Cal / 100.0 * 255.0);
|
||||
// В режиме TUN используем отдельный per-device уровень (см. TTXSettings.TUNLevel),
|
||||
// чтобы tune не зависел от Drive-слайдера. Per-band калибровка — общая для обоих.
|
||||
if FTuning then
|
||||
Pos := EnsureRange(FTXSettings.TUNLevel, 0, 100)
|
||||
else
|
||||
Pos := TrkDrive.Position;
|
||||
Result := Round(Pos / 100.0 * Cal / 100.0 * 255.0);
|
||||
end;
|
||||
|
||||
procedure TMainForm.OnTXIQReady(const Buf: array of Double; Count: Integer);
|
||||
@@ -5089,11 +5159,13 @@ procedure TMainForm.OnTXSettingsChange(const T: TTXSettings);
|
||||
// перешиваем WDSP TX-цепь и (если поменялись mic-биты) перепосылаем DUC Specific.
|
||||
var
|
||||
OldMicByte, NewMicByte: Byte;
|
||||
OldAtt: Integer;
|
||||
OldAtt, OldTUNLevel, OldTUNFreq: Integer;
|
||||
GridChanged: Boolean;
|
||||
begin
|
||||
OldMicByte := BuildMicLineSelectByte;
|
||||
OldAtt := FTXSettings.AttOnTX;
|
||||
OldMicByte := BuildMicLineSelectByte;
|
||||
OldAtt := FTXSettings.AttOnTX;
|
||||
OldTUNLevel := FTXSettings.TUNLevel;
|
||||
OldTUNFreq := FTXSettings.TUNFreq;
|
||||
GridChanged := (FTXSpecRefLevel <> T.TXSpecRefLevel)
|
||||
or (FTXSpecRange <> T.TXSpecRange)
|
||||
or (FTXSpecGridStep <> T.TXSpecGridStep);
|
||||
@@ -5109,6 +5181,24 @@ begin
|
||||
ApplyTXSettingsToDSP;
|
||||
if (OldMicByte <> NewMicByte) or (OldAtt <> FTXSettings.AttOnTX) then
|
||||
SendDUCSpecificFromSettings;
|
||||
// TUN-параметры live: если идёт tune — обновить тон/drive, иначе просто запомнить.
|
||||
if FTuning then
|
||||
begin
|
||||
if (OldTUNFreq <> FTXSettings.TUNFreq) and FWDSPReady then
|
||||
FDSPEngine.SetTXTone(True, FTXSettings.TUNFreq, 1.0);
|
||||
if OldTUNLevel <> FTXSettings.TUNLevel then
|
||||
begin
|
||||
FDriveLevel := CalcDriveByte;
|
||||
if FWDSPReady then
|
||||
FDSPEngine.SetDriveLevel(FTXSettings.TUNLevel / 100.0);
|
||||
if FNetwork.Connected and FNetwork.Running then
|
||||
begin
|
||||
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel,
|
||||
FTransmitting, True, True);
|
||||
FNetwork.SendFullHP;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
// Сохраняем сразу — настройки per-device, попадают в hpsdr_settings.json
|
||||
if FDevConnected then
|
||||
begin
|
||||
|
||||
Reference in New Issue
Block a user