DUP (display duplex) + ATT on TX

- DUP: локальный режим отображения, при TX данные RX1, поверх рисуется
  TX-фильтр. Кнопка на левой панели рядом с CTUN. Аппаратной командой
  не является. Отдельный SetDisplaySourceTX в WDSPEngine, разделение
  TXMode (data) и TXOverlay (filter band) в SpectrumView.
- ATT on TX: 0..31 dB, default 31 (Thetis-style). UI на вкладке Transmit
  в группе Microphone. Передаётся в DUC Specific bytes 57/58/59
  (StepAtten0/1/2). Перепосылается при изменении.
This commit is contained in:
2026-05-06 15:51:33 +03:00
parent 96d7e0c759
commit 88687b4e70
5 changed files with 112 additions and 6 deletions
+8 -2
View File
@@ -89,6 +89,10 @@ type
FTXFreq: Double; // центр TX-сигнала (Hz)
FTXSpanHz: Double; // ширина TX-окна (192000 для Hermes/Saturn)
FTXVfoIndex: Integer; // 0=A, 1=B — какой VFO привязан к TX (для split)
// FTXOverlay — независимый от FTXMode флаг: «нарисовать TX-фильтр поверх
// данных». DUP-режим: FTXMode=False (данные RX), но FTXOverlay=True (TX-полоса
// красным сверху). Без DUP при TX оба флага True. Без TX оба False.
FTXOverlay: Boolean;
// ── Marker ────────────────────────────────────────────────────────────────
FMarkerActive: Boolean;
@@ -167,6 +171,7 @@ type
property TXFreq: Double read FTXFreq write FTXFreq;
property TXSpanHz: Double read FTXSpanHz write FTXSpanHz;
property TXVfoIndex: Integer read FTXVfoIndex write FTXVfoIndex;
property TXOverlay: Boolean read FTXOverlay write FTXOverlay;
// ── Маркер ────────────────────────────────────────────────────────────────
property MarkerActive: Boolean read FMarkerActive write FMarkerActive;
@@ -414,6 +419,7 @@ begin
FTXFreq := 0.0;
FTXSpanHz := 192000.0;
FTXVfoIndex := 0;
FTXOverlay := False;
FSpectrumBufCount := 1024;
FWaterfallBufCount := 1024;
FWfFrameInterval := 2;
@@ -774,7 +780,7 @@ begin
// (для split-режима TX-полоса рисуется без edges чтобы визуально отличалась).
if FActiveVfo = 0 then CalcFilterBandX(FVfoA, W, X1, X2, VfoX)
else CalcFilterBandX(FVfoB, W, X1, X2, VfoX);
if FTXMode then
if FTXOverlay then
begin
if FTXVfoIndex <> FActiveVfo then
begin
@@ -881,7 +887,7 @@ begin
C.Brush.Color := FTheme.SpecVfoCursor; C.Brush.Style := bsSolid; C.Pen.Width := 1;
C.Polygon([Point(VfoX-5,0), Point(VfoX+5,0), Point(VfoX,8)]);
// Split TX: рисуем края + cursor для TX-VFO красным, чтобы было видно где идёт передача
if FTXMode and (FTXVfoIndex <> FActiveVfo) then
if FTXOverlay and (FTXVfoIndex <> FActiveVfo) then
begin
C.Pen.Color := TColor($002030E0); C.Pen.Width := 1; C.Pen.Style := psSolid;
C.MoveTo(TXX1, 0); C.LineTo(TXX1, H);