mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
fix(spectrum): сохранение/восстановление зума для трансверторов (XVTR)
Зум был per-band только для HF (TBandSettings). XVTR-слоты хранятся отдельно (TXvtrEntry) и зум туда не попадал — при входе в трансвертер не восстанавливался. - TXvtrEntry: LastZoomFactor/LastPanSlider + Default/Load/Save (JSON). - SaveCurrentBand (XVTR-ветка): пишет зум/пан в слот. - ActivateXvtr: восстанавливает зум слота + SetZoomPan (re-arm анализатора). Покрывает все входы (кнопка, старт по LastXvtr, CAT/web). - ApplyZoom: кэширует в активный слот — XVTR при активном трансверторе, иначе HF-band. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+19
-1
@@ -1512,6 +1512,8 @@ begin
|
|||||||
FXvtrSettings.Entries[i].LastAGCTop := FAGCTop;
|
FXvtrSettings.Entries[i].LastAGCTop := FAGCTop;
|
||||||
FXvtrSettings.Entries[i].LastCTCSSAutoActive := FFMCTCSSAutoActive;
|
FXvtrSettings.Entries[i].LastCTCSSAutoActive := FFMCTCSSAutoActive;
|
||||||
FXvtrSettings.Entries[i].LastFMRptAutoActive := FFMRptAutoActive;
|
FXvtrSettings.Entries[i].LastFMRptAutoActive := FFMRptAutoActive;
|
||||||
|
FXvtrSettings.Entries[i].LastZoomFactor := FZoomFactor;
|
||||||
|
FXvtrSettings.Entries[i].LastPanSlider := FPanSlider;
|
||||||
end;
|
end;
|
||||||
FSettings.SaveXvtr(FDevMAC, FXvtrSettings);
|
FSettings.SaveXvtr(FDevMAC, FXvtrSettings);
|
||||||
Exit;
|
Exit;
|
||||||
@@ -2289,6 +2291,12 @@ begin
|
|||||||
B.VfoB := FVfoB;
|
B.VfoB := FVfoB;
|
||||||
ApplyBandDSP(B);
|
ApplyBandDSP(B);
|
||||||
|
|
||||||
|
// Zoom/pan слота: восстанавливаем и переармируем анализатор.
|
||||||
|
FZoomFactor := EnsureRange(E.LastZoomFactor, 0.0, 1.0);
|
||||||
|
FPanSlider := EnsureRange(E.LastPanSlider, 0.0, 1.0);
|
||||||
|
if Assigned(FDSPEngine) then FDSPEngine.SetZoomPan(FZoomFactor, FPanSlider);
|
||||||
|
Changed(rfZoom);
|
||||||
|
|
||||||
// VFO: B — своя сохранённая частота слота (клэмп в диапазон); A = visible.
|
// VFO: B — своя сохранённая частота слота (клэмп в диапазон); A = visible.
|
||||||
FVfoB := EnsureRange(E.LastFreqB, E.FreqBegin, E.FreqEnd);
|
FVfoB := EnsureRange(E.LastFreqB, E.FreqBegin, E.FreqEnd);
|
||||||
FVfoA := Vis;
|
FVfoA := Vis;
|
||||||
@@ -2403,7 +2411,17 @@ begin
|
|||||||
FPanSlider := EnsureRange(APan, 0.0, 1.0);
|
FPanSlider := EnsureRange(APan, 0.0, 1.0);
|
||||||
if Assigned(FDSPEngine) then
|
if Assigned(FDSPEngine) then
|
||||||
FDSPEngine.SetZoomPan(FZoomFactor, FPanSlider);
|
FDSPEngine.SetZoomPan(FZoomFactor, FPanSlider);
|
||||||
if (FCurrentBand >= 0) and (FCurrentBand < CFG_BAND_COUNT) then
|
// Кэшируем в активный слот (XVTR-слот при активном трансверторе, иначе HF-band);
|
||||||
|
// персист на диск — в SaveCurrentBand при смене/выходе.
|
||||||
|
if FCurrentXvtr >= 0 then
|
||||||
|
begin
|
||||||
|
if FCurrentXvtr < CFG_XVTR_COUNT then
|
||||||
|
begin
|
||||||
|
FXvtrSettings.Entries[FCurrentXvtr].LastZoomFactor := FZoomFactor;
|
||||||
|
FXvtrSettings.Entries[FCurrentXvtr].LastPanSlider := FPanSlider;
|
||||||
|
end;
|
||||||
|
end
|
||||||
|
else if (FCurrentBand >= 0) and (FCurrentBand < CFG_BAND_COUNT) then
|
||||||
begin
|
begin
|
||||||
FBandCache[FCurrentBand].ZoomFactor := FZoomFactor;
|
FBandCache[FCurrentBand].ZoomFactor := FZoomFactor;
|
||||||
FBandCache[FCurrentBand].PanSlider := FPanSlider;
|
FBandCache[FCurrentBand].PanSlider := FPanSlider;
|
||||||
|
|||||||
@@ -190,6 +190,8 @@ type
|
|||||||
LastFMRptOffsetHz: Double;
|
LastFMRptOffsetHz: Double;
|
||||||
LastCTCSSAutoActive: Boolean; // CTCSS был включён каналом (авто)
|
LastCTCSSAutoActive: Boolean; // CTCSS был включён каналом (авто)
|
||||||
LastFMRptAutoActive: Boolean; // RPT был включён каналом (авто)
|
LastFMRptAutoActive: Boolean; // RPT был включён каналом (авто)
|
||||||
|
LastZoomFactor: Double; // зум спектра/водопада 0.0..1.0 (0.0 = без зума)
|
||||||
|
LastPanSlider: Double; // положение окна зума 0..1 (0.5 = центр)
|
||||||
end;
|
end;
|
||||||
|
|
||||||
TXvtrSettings = record
|
TXvtrSettings = record
|
||||||
@@ -1279,6 +1281,8 @@ begin
|
|||||||
X.Entries[i].LastFMRptOffsetHz := 0.0;
|
X.Entries[i].LastFMRptOffsetHz := 0.0;
|
||||||
X.Entries[i].LastCTCSSAutoActive := False;
|
X.Entries[i].LastCTCSSAutoActive := False;
|
||||||
X.Entries[i].LastFMRptAutoActive := False;
|
X.Entries[i].LastFMRptAutoActive := False;
|
||||||
|
X.Entries[i].LastZoomFactor := 0.0;
|
||||||
|
X.Entries[i].LastPanSlider := 0.5;
|
||||||
end;
|
end;
|
||||||
// Шаблоны (пользователь должен сам Enable, чтобы трансверторы появились)
|
// Шаблоны (пользователь должен сам Enable, чтобы трансверторы появились)
|
||||||
X.Entries[0].ButtonText := '2m';
|
X.Entries[0].ButtonText := '2m';
|
||||||
@@ -1356,6 +1360,8 @@ begin
|
|||||||
X.Entries[i].LastFMRptOffsetHz := JD(EObj, 'last_fmrpt_offset', X.Entries[i].LastFMRptOffsetHz);
|
X.Entries[i].LastFMRptOffsetHz := JD(EObj, 'last_fmrpt_offset', X.Entries[i].LastFMRptOffsetHz);
|
||||||
X.Entries[i].LastCTCSSAutoActive := JB(EObj, 'last_ctcss_auto', X.Entries[i].LastCTCSSAutoActive);
|
X.Entries[i].LastCTCSSAutoActive := JB(EObj, 'last_ctcss_auto', X.Entries[i].LastCTCSSAutoActive);
|
||||||
X.Entries[i].LastFMRptAutoActive := JB(EObj, 'last_fmrpt_auto', X.Entries[i].LastFMRptAutoActive);
|
X.Entries[i].LastFMRptAutoActive := JB(EObj, 'last_fmrpt_auto', X.Entries[i].LastFMRptAutoActive);
|
||||||
|
X.Entries[i].LastZoomFactor := EnsureRange(JD(EObj, 'last_zoom_factor', X.Entries[i].LastZoomFactor), 0.0, 1.0);
|
||||||
|
X.Entries[i].LastPanSlider := EnsureRange(JD(EObj, 'last_pan_slider', X.Entries[i].LastPanSlider), 0.0, 1.0);
|
||||||
// Валидация: Last freqs должны быть в [FreqBegin..FreqEnd]
|
// Валидация: Last freqs должны быть в [FreqBegin..FreqEnd]
|
||||||
if (X.Entries[i].LastFreq < X.Entries[i].FreqBegin) or
|
if (X.Entries[i].LastFreq < X.Entries[i].FreqBegin) or
|
||||||
(X.Entries[i].LastFreq > X.Entries[i].FreqEnd) then
|
(X.Entries[i].LastFreq > X.Entries[i].FreqEnd) then
|
||||||
@@ -1452,6 +1458,8 @@ begin
|
|||||||
JW(EObj, 'last_fmrpt_offset', X.Entries[i].LastFMRptOffsetHz);
|
JW(EObj, 'last_fmrpt_offset', X.Entries[i].LastFMRptOffsetHz);
|
||||||
JW(EObj, 'last_ctcss_auto', X.Entries[i].LastCTCSSAutoActive);
|
JW(EObj, 'last_ctcss_auto', X.Entries[i].LastCTCSSAutoActive);
|
||||||
JW(EObj, 'last_fmrpt_auto', X.Entries[i].LastFMRptAutoActive);
|
JW(EObj, 'last_fmrpt_auto', X.Entries[i].LastFMRptAutoActive);
|
||||||
|
JW(EObj, 'last_zoom_factor', X.Entries[i].LastZoomFactor);
|
||||||
|
JW(EObj, 'last_pan_slider', X.Entries[i].LastPanSlider);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user