Refactor VFO-B top panel layout

This commit is contained in:
2026-04-28 16:16:51 +03:00
parent 22832a1163
commit 1502e6ab83
2 changed files with 254 additions and 38 deletions
+24 -2
View File
@@ -15,7 +15,7 @@ unit FreqDisplay;
interface
uses
Classes, SysUtils, Controls, Graphics, LCLType, Math;
Classes, SysUtils, Controls, Graphics, LCLType;
type
TFreqChangeEvent = procedure(Sender: TObject; NewFreq: Int64) of object;
@@ -30,6 +30,8 @@ type
FColorNormal: TColor;
FColorHover: TColor;
FColorDim: TColor;
FMinMhzDigits: Integer;
FDimLeadingZeros: Boolean;
FOnChange: TFreqChangeEvent;
FHoverDigit: Integer; // 0=единицы .. 8=100МГц, -1=нет
@@ -65,6 +67,8 @@ type
property ColorNormal: TColor read FColorNormal write FColorNormal;
property ColorHover: TColor read FColorHover write FColorHover;
property ColorDim: TColor read FColorDim write FColorDim;
property MinMhzDigits: Integer read FMinMhzDigits write FMinMhzDigits;
property DimLeadingZeros: Boolean read FDimLeadingZeros write FDimLeadingZeros;
property OnChange: TFreqChangeEvent read FOnChange write FOnChange;
end;
@@ -81,6 +85,8 @@ begin
FColorNormal := TColor($00E8F0FF);
FColorHover := TColor($0040DDFF);
FColorDim := TColor($00607080);
FMinMhzDigits := 1;
FDimLeadingZeros := False;
FHoverDigit := -1;
FDigitW := 14;
FCharH := 24;
@@ -162,6 +168,9 @@ var
Mhz: Integer;
KHz: Integer;
Ones: Integer;
MhzFmt: string;
MhzText: string;
LeadingMhzZeros: Integer;
TotalW: Integer;
StartX: Integer;
ChW, ChH: Integer;
@@ -194,7 +203,18 @@ begin
Mhz := Hz div 1000000;
KHz := (Hz div 1000) mod 1000;
Ones := Hz mod 1000;
S := Format('%d.%3.3d.%3.3d', [Mhz, KHz, Ones]);
if FMinMhzDigits > 1 then
MhzFmt := '%.' + IntToStr(FMinMhzDigits) + 'd'
else
MhzFmt := '%d';
MhzText := Format(MhzFmt, [Mhz]);
S := MhzText + Format('.%3.3d.%3.3d', [KHz, Ones]);
LeadingMhzZeros := 0;
while FDimLeadingZeros and
(LeadingMhzZeros < Length(MhzText) - 1) and
(MhzText[LeadingMhzZeros + 1] = '0') do
Inc(LeadingMhzZeros);
TotalW := C.TextWidth(S);
StartX := (Width - TotalW) div 2;
@@ -227,6 +247,8 @@ begin
if ch = '.' then
col := FColorDim
else if FDimLeadingZeros and (ci < LeadingMhzZeros) then
col := FColorDim
else if dIdx = FHoverDigit then
col := FColorHover
else
+230 -36
View File
@@ -173,6 +173,7 @@ type
FPABandCal: array[0..BAND_COUNT-1] of Double; // калибровка 38.8..100.0 на диапазон
FRunning: Boolean;
FTransmitting: Boolean;
FSplitTxB: Boolean;
FHWPTTActive: Boolean; // True = hardware PTT нажата
FMuted: Boolean;
FVolume: Integer;
@@ -266,11 +267,15 @@ type
PanelVfoB: TPanel;
LblVfoBLabel: TLabel;
FreqDispB: TFreqDisplay;
BtnTopVfoBSelect: TFlatButton;
BtnTopVfoBTX: TFlatButton;
PanelVfoButtons: TPanel;
BtnVfoSwap: TFlatButton;
BtnVfoACopyB: TFlatButton;
BtnVfoBCopyA: TFlatButton;
PanelTopVfoB: TPanel;
PanelTopVfoSep: TPanel;
PanelBands: TPanel;
BtnBand: array[0..BAND_COUNT-1] of TFlatButton;
@@ -334,6 +339,7 @@ type
procedure PositionSpanOverlayButtons;
procedure UpdateVfoDisplay;
function FormatFreq(Hz: Double): string;
procedure LayoutTopVfoBlock;
procedure ResizeSMeter;
procedure ResizeSpectrumPanels;
@@ -369,6 +375,8 @@ type
procedure ApplyVfoA(NewFreq: Int64);
procedure FreqDispAClick(Sender: TObject);
procedure FreqDispBClick(Sender: TObject);
procedure BtnTopVfoBSelectClick(Sender: TObject);
procedure BtnTopVfoBTXClick(Sender: TObject);
procedure ActivateVfo(Idx: Integer);
function ActiveVfoFreq: Int64;
// Настройки
@@ -943,6 +951,7 @@ begin
for i := 0 to BAND_COUNT - 1 do FPABandCal[i] := 100.0;
FRunning := False;
FTransmitting := False;
FSplitTxB := False;
FMuted := False;
FVolume := 70;
FCenterFreq := FVfoA;
@@ -1176,7 +1185,7 @@ begin
begin
if FRunning then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, 0, False, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, 0, False, True, True);
FNetwork.SetRunAndFreq(False, FCenterFreq, FCenterFreq, 0);
FRunning := False;
FTransmitting := False;
@@ -1196,6 +1205,10 @@ const
BTN_H = 26;
BTN_SM = 24;
LEFT_W = 232;
TOP_VFO_W = 244;
TOP_VFO_FREQ_H = 47;
TOP_VFO_BTN_H = 14;
TOP_VFO_GAP = 6;
var
i, X, Y, W: Integer;
B: TFlatButton;
@@ -1291,44 +1304,82 @@ begin
Inc(Y, 58);
// VFO B
// VFO B (compact top block)
PanelTopVfoB := TPanel.Create(Self);
PanelTopVfoB.Parent := Self;
PanelTopVfoB.SetBounds(0, 0, TOP_VFO_W, 60);
PanelTopVfoB.BevelOuter := bvNone;
PanelTopVfoB.Color := CLR_PANEL;
PanelTopVfoSep := TPanel.Create(Self);
PanelTopVfoSep.Parent := Self;
PanelTopVfoSep.SetBounds(0, 0, 1, 60);
PanelTopVfoSep.BevelOuter := bvNone;
PanelTopVfoSep.Color := CLR_TEXTDIM;
PanelVfoB := TPanel.Create(Self);
PanelVfoB.Parent := PanelLeft;
PanelVfoB.SetBounds(0, Y, LEFT_W, 46);
PanelVfoB.Parent := PanelTopVfoB;
PanelVfoB.SetBounds(0, 0, TOP_VFO_W, TOP_VFO_FREQ_H);
PanelVfoB.BevelOuter := bvNone;
BtnTopVfoBSelect := MakeBtn(PanelVfoB, 'B', 0, 7, 18, 16, BtnTopVfoBSelectClick);
BtnTopVfoBSelect.Font.Name := 'Courier New';
BtnTopVfoBSelect.Font.Size := 6;
BtnTopVfoBSelect.Font.Bold := True;
BtnTopVfoBSelect.ClrNorm := TColor($00303030);
BtnTopVfoBSelect.ClrHot := TColor($00404040);
BtnTopVfoBSelect.ClrActive := TColor($00404040);
BtnTopVfoBSelect.ClrBorder := TColor($00505050);
BtnTopVfoBSelect.ClrText := CLR_TEXTDIM;
BtnTopVfoBSelect.ClrTextAct := CLR_TEXT;
BtnTopVfoBTX := MakeBtn(PanelVfoB, 'TX', 0, 25, 18, 16, BtnTopVfoBTXClick);
BtnTopVfoBTX.Font.Name := 'Courier New';
BtnTopVfoBTX.Font.Size := 6;
BtnTopVfoBTX.Font.Bold := True;
BtnTopVfoBTX.ClrNorm := TColor($00303030);
BtnTopVfoBTX.ClrHot := TColor($00404040);
BtnTopVfoBTX.ClrActive := TColor($00404040);
BtnTopVfoBTX.ClrBorder := TColor($00505050);
BtnTopVfoBTX.ClrText := CLR_TEXTDIM;
BtnTopVfoBTX.ClrTextAct := CLR_TEXT;
LblVfoBLabel := TLabel.Create(Self);
LblVfoBLabel.Parent := PanelVfoB;
LblVfoBLabel.Caption := 'VFO-B';
LblVfoBLabel.Left := 4; LblVfoBLabel.Top := 2;
LblVfoBLabel.Left := 0; LblVfoBLabel.Top := 0;
LblVfoBLabel.Font.Name := 'Courier New'; LblVfoBLabel.Font.Size := 7;
LblVfoBLabel.Font.Color := CLR_TEXTDIM;
LblVfoBLabel.Visible := False;
FreqDispB := TFreqDisplay.Create(Self);
FreqDispB.Parent := PanelVfoB;
FreqDispB.SetBounds(0, 14, LEFT_W, 28);
FreqDispB.FontSize := 14;
FreqDispB.SetBounds(58, -2, TOP_VFO_W - 58, TOP_VFO_FREQ_H);
FreqDispB.FontSize := 22;
FreqDispB.FontName := 'Courier New';
FreqDispB.Frequency := Round(FVfoB);
FreqDispB.ColorNormal := CLR_FREQ_DIM;
FreqDispB.ColorHover := TColor($0040DDFF);
FreqDispB.ColorDim := CLR_TEXTDIM;
FreqDispB.MinMhzDigits := 3;
FreqDispB.DimLeadingZeros := True;
FreqDispB.OnChange := FreqDispBChanged;
FreqDispB.OnClick := FreqDispBClick;
Inc(Y, 50);
// VFO buttons
// VFO buttons (compact top block)
PanelVfoButtons := TPanel.Create(Self);
PanelVfoButtons.Parent := PanelLeft;
PanelVfoButtons.SetBounds(0, Y, LEFT_W, BTN_H + 4);
PanelVfoButtons.Parent := PanelTopVfoB;
PanelVfoButtons.SetBounds(0, TOP_VFO_FREQ_H + TOP_VFO_GAP, TOP_VFO_W, TOP_VFO_BTN_H);
PanelVfoButtons.BevelOuter := bvNone;
BtnVfoSwap := MakeBtn(PanelVfoButtons, 'A<>B', 2, 2, 72, BTN_H, BtnVfoSwapClick);
BtnVfoACopyB := MakeBtn(PanelVfoButtons, 'A>B', 78, 2, 72, BTN_H, BtnVfoACopyBClick);
BtnVfoBCopyA := MakeBtn(PanelVfoButtons, 'B>A', 154, 2, 72, BTN_H, BtnVfoBCopyAClick);
BtnVfoSwap := MakeBtn(PanelVfoButtons, 'A<>B', 0, 0, 52, TOP_VFO_BTN_H, BtnVfoSwapClick);
BtnVfoACopyB := MakeBtn(PanelVfoButtons, 'A>B', 58, 0, 52, TOP_VFO_BTN_H, BtnVfoACopyBClick);
BtnVfoBCopyA := MakeBtn(PanelVfoButtons, 'B>A', 116, 0, 52, TOP_VFO_BTN_H, BtnVfoBCopyAClick);
BtnVfoSwap.Font.Size := 6;
BtnVfoACopyB.Font.Size := 6;
BtnVfoBCopyA.Font.Size := 6;
Inc(Y, BTN_H + 8);
LayoutTopVfoBlock;
// Band selector
PanelBands := TPanel.Create(Self);
@@ -1701,6 +1752,82 @@ begin
ResizeSpectrumPanels;
end;
procedure TMainForm.LayoutTopVfoBlock;
const
MARGIN = 4;
TOP_OFFSET = 2;
TOP_VFO_BTN_H = 14;
TOP_VFO_FREQ_H = 47;
SEP_GAP = 4;
SEP_W = 1;
SEP_TOP_OFFSET = 10;
SEP_BOTTOM_OFFSET = 8;
S_METER_GAP = SEP_GAP + SEP_W + SEP_GAP + 2;
SEP_SHIFT_LEFT = 3;
SETTINGS_GAP = 4;
BTN_GAP = 4;
var
BlockH: Integer;
BtnY: Integer;
BtnRowW: Integer;
BtnX: Integer;
SepDrawLeft: Integer;
SepLeft: Integer;
LeftEdge: Integer;
RightW: Integer;
SMW: Integer;
SMLeft: Integer;
begin
if (PanelToolbar = nil) or (PanelTopVfoB = nil) or (PanelTopVfoSep = nil) then Exit;
SepLeft := PanelToolbar.ClientWidth - MARGIN - SEP_W;
if PanelLeft <> nil then
begin
RightW := ClientWidth - PanelLeft.Width;
if RightW > 200 then
begin
SMW := Round(RightW * 0.40);
SMLeft := ClientWidth - SMW - 3;
SepLeft := Min(SepLeft, SMLeft - SEP_GAP - SEP_W - 2);
end;
end;
LeftEdge := SepLeft - SEP_GAP - PanelTopVfoB.Width;
if BtnSettings <> nil then
LeftEdge := Max(LeftEdge, BtnSettings.Left + BtnSettings.Width + SETTINGS_GAP);
if LeftEdge + PanelTopVfoB.Width > SepLeft - SEP_GAP then
begin
PanelTopVfoB.Visible := False;
PanelTopVfoSep.Visible := False;
Exit;
end;
PanelTopVfoB.Visible := True;
PanelTopVfoSep.Visible := True;
BlockH := PanelToolbar.Height + PanelSpanButtons.Height - (MARGIN * 2);
if BlockH < 56 then BlockH := 56;
PanelTopVfoB.SetBounds(LeftEdge, TOP_OFFSET, PanelTopVfoB.Width, BlockH);
PanelVfoB.SetBounds(0, 0, PanelTopVfoB.Width, TOP_VFO_FREQ_H);
BtnTopVfoBSelect.Left := FreqDispB.Left - BtnTopVfoBSelect.Width;
BtnTopVfoBTX.Left := FreqDispB.Left - BtnTopVfoBTX.Width;
BtnY := PanelTopVfoB.Height - TOP_VFO_BTN_H - 8;
if BtnY < 42 then BtnY := 42;
PanelVfoButtons.SetBounds(4, BtnY, PanelTopVfoB.Width - 8, TOP_VFO_BTN_H);
BtnRowW := BtnVfoSwap.Width + BtnVfoACopyB.Width + BtnVfoBCopyA.Width + BTN_GAP * 2;
BtnX := FreqDispB.Left + (FreqDispB.Width - BtnRowW) div 2 - PanelVfoButtons.Left;
if BtnX < 0 then BtnX := 0;
BtnVfoSwap.Left := BtnX;
BtnVfoACopyB.Left := BtnVfoSwap.Left + BtnVfoSwap.Width + BTN_GAP;
BtnVfoBCopyA.Left := BtnVfoACopyB.Left + BtnVfoACopyB.Width + BTN_GAP;
SepDrawLeft := SepLeft - SEP_SHIFT_LEFT;
PanelTopVfoSep.SetBounds(SepDrawLeft,
TOP_OFFSET + SEP_TOP_OFFSET, SEP_W,
PanelTopVfoB.Height - SEP_TOP_OFFSET - SEP_BOTTOM_OFFSET);
PanelTopVfoB.BringToFront;
PanelTopVfoSep.BringToFront;
end;
procedure TMainForm.ResizeSMeter;
// PanelSMeterRight на главной форме (Parent=Self).
// По Y: от самого верха формы до низа PanelSpanButtons (Toolbar+Span = 66px).
@@ -1718,6 +1845,8 @@ begin
if (PanelSMeterRight = nil) or (PanelToolbar = nil) or
(PanelSpanButtons = nil) or (PanelLeft = nil) then Exit;
LayoutTopVfoBlock;
FW := ClientWidth;
// Ширина зоны спектра (PanelRight)
RightW := FW - PanelLeft.Width;
@@ -1997,6 +2126,9 @@ begin
end;
procedure TMainForm.UpdateVfoDisplay;
const
TOP_VFO_FREQ_H = 47;
TOP_VFO_FONT = 22;
begin
FreqDispA.Frequency := Round(FVfoA);
FreqDispB.Frequency := Round(FVfoB);
@@ -2004,19 +2136,57 @@ begin
begin
// VFO-A активен: яркий зелёный, крупный
FreqDispA.ColorNormal := CLR_FREQ; FreqDispA.FontSize := 20;
FreqDispB.ColorNormal := CLR_FREQ_DIM; FreqDispB.FontSize := 14;
FreqDispB.ColorNormal := CLR_FREQ_DIM; FreqDispB.FontSize := TOP_VFO_FONT;
FreqDispA.Height := 36;
FreqDispB.Height := 28;
FreqDispB.Height := TOP_VFO_FREQ_H;
LblVfoALabel.Font.Color := CLR_FREQ;
LblVfoBLabel.Font.Color := CLR_TEXTDIM;
if BtnTopVfoBSelect <> nil then StyleButton(BtnTopVfoBSelect, False);
end else begin
// VFO-B активен: яркий зелёный, крупный
// VFO-B активен: яркий зелёный; размер зависит от размещения
FreqDispA.ColorNormal := CLR_FREQ_DIM; FreqDispA.FontSize := 14;
FreqDispB.ColorNormal := CLR_FREQ; FreqDispB.FontSize := 20;
FreqDispB.ColorNormal := CLR_FREQ;
if (PanelVfoB <> nil) and (PanelVfoB.Parent = PanelTopVfoB) then
FreqDispB.FontSize := TOP_VFO_FONT
else
FreqDispB.FontSize := 20;
FreqDispA.Height := 28;
FreqDispB.Height := 36;
if (PanelVfoB <> nil) and (PanelVfoB.Parent = PanelTopVfoB) then
FreqDispB.Height := TOP_VFO_FREQ_H
else
FreqDispB.Height := 36;
LblVfoALabel.Font.Color := CLR_TEXTDIM;
LblVfoBLabel.Font.Color := CLR_FREQ;
if BtnTopVfoBSelect <> nil then StyleButton(BtnTopVfoBSelect, True);
end;
if BtnTopVfoBTX <> nil then
begin
if FSplitTxB then
begin
BtnTopVfoBTX.ClrNorm := TColor($00000060);
BtnTopVfoBTX.ClrHot := TColor($00000090);
BtnTopVfoBTX.ClrActive := TColor($00000090);
BtnTopVfoBTX.ClrBorder := TColor($001010B0);
BtnTopVfoBTX.ClrText := TColor($00C8D8FF);
BtnTopVfoBTX.ClrTextAct := TColor($00E8F0FF);
BtnTopVfoBTX.Active := True;
end
else
begin
BtnTopVfoBTX.ClrNorm := TColor($00303030);
BtnTopVfoBTX.ClrHot := TColor($00404040);
BtnTopVfoBTX.ClrActive := TColor($00404040);
BtnTopVfoBTX.ClrBorder := TColor($00505050);
BtnTopVfoBTX.ClrText := CLR_TEXTDIM;
BtnTopVfoBTX.ClrTextAct := CLR_TEXT;
BtnTopVfoBTX.Active := False;
end;
BtnTopVfoBTX.Invalidate;
end;
if (PanelVfoB <> nil) and (PanelVfoB.Parent = PanelTopVfoB) then
begin
FreqDispB.FontSize := TOP_VFO_FONT;
FreqDispB.Height := TOP_VFO_FREQ_H;
end;
FreqDispA.Invalidate;
FreqDispB.Invalidate;
@@ -2591,7 +2761,7 @@ begin
// --- STOP ---
if FRunning then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, 0, False, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, 0, False, True, True);
FNetwork.SetRunAndFreq(False, FCenterFreq, FCenterFreq, 0);
FRunning := False;
FTransmitting := False;
@@ -2862,7 +3032,7 @@ begin
// Сначала отправляем Run=1 — эмулятор/железо создают ddc_specific_thread
// (порт 1025) и rx_thread (порт 1035+) только после получения HP Run=1.
// DDC Specific и DUC Specific отправляем ПОСЛЕ, иначе порты ещё не открыты.
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, False, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, False, True, True);
FNetwork.SetRunAndFreq(True, FCenterFreq, FCenterFreq, FDriveLevel);
FRunning := True;
FRXStartTime := GetTickCount64;
@@ -2969,7 +3139,7 @@ begin
if FWDSPReady then FDSPEngine.SetShift(0.0);
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
end;
@@ -2981,7 +3151,7 @@ begin
if FWDSPReady then FDSPEngine.SetShift(0.0);
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
end;
@@ -3018,6 +3188,28 @@ begin
ActivateVfo(1);
end;
procedure TMainForm.BtnTopVfoBSelectClick(Sender: TObject);
begin
if FActiveVfo <> 1 then
ActivateVfo(1);
end;
procedure TMainForm.BtnTopVfoBTXClick(Sender: TObject);
begin
FSplitTxB := not FSplitTxB;
if FSplitTxB and (FActiveVfo <> 0) then
ActivateVfo(0)
else
UpdateVfoDisplay;
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel,
FTransmitting, True, True);
FNetwork.SendFullHP;
end;
end;
procedure TMainForm.FreqDispAChanged(Sender: TObject; NewFreq: Int64);
begin
if FActiveVfo = 0 then
@@ -3038,7 +3230,7 @@ begin
if FWDSPReady then FDSPEngine.SetShift(0.0);
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
// Обновляем диапазон
@@ -3182,7 +3374,7 @@ begin
// DDC: передаём FCenterFreq (при CTUN OFF = FVfoA, при CTUN ON = фиксирован)
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
@@ -3219,7 +3411,7 @@ begin
FDSPEngine.SetShift(0.0);
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
end
@@ -3266,7 +3458,7 @@ begin
if FWDSPReady then FDSPEngine.SetShift(0.0);
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
BandIdx := FreqToBandIdx(FVfoB);
@@ -3306,7 +3498,7 @@ begin
end;
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
FSpectrumDirty := True;
@@ -3324,7 +3516,7 @@ begin
if FWDSPReady then FDSPEngine.SetShift(0.0);
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
FSpectrumDirty := True;
@@ -3547,7 +3739,7 @@ begin
if FWDSPReady then FDSPEngine.SetShift(0.0);
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
@@ -3579,7 +3771,7 @@ begin
if FWDSPReady then FDSPEngine.SetShift(0.0);
if FNetwork.Connected and FNetwork.Running then
begin
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FNetwork.SendFullHP;
end;
FSpecView.InvalidateRulerCache;
@@ -3606,7 +3798,9 @@ end;
function TMainForm.ActiveTXFreqHz: Double;
begin
if FActiveVfo = 0 then Result := FVfoA else Result := FVfoB;
if FSplitTxB then Result := FVfoB
else if FActiveVfo = 0 then Result := FVfoA
else Result := FVfoB;
end;
procedure TMainForm.ApplyMOX(Active: Boolean);
@@ -4283,7 +4477,7 @@ begin
else FDSPEngine.SetShift(FVfoB - FCenterFreq);
end;
if FNetwork.Connected and FNetwork.Running then
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
FSpecView.InvalidateRulerCache;
FSpectrumDirty := True;
end;
@@ -4373,7 +4567,7 @@ begin
end;
FDriveLevel := CalcDriveByte;
if FNetwork.Connected and FNetwork.Running then
FNetwork.UpdateState(FCenterFreq, FCenterFreq, FDriveLevel, FTransmitting, True, True);
FNetwork.UpdateState(FCenterFreq, ActiveTXFreqHz, FDriveLevel, FTransmitting, True, True);
end;
procedure TMainForm.TrkVolumeChange(Sender: TObject);