mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:37:33 +00:00
feat(pans): выбор аппаратного DDC для панадаптера
Клик по «NNN kHz · DDCn» в шапке пана — кроме сетки rate теперь есть пункты «→ DDC N»: пан переезжает на другой аппаратный DDC (MovePanDDC), при этом движок, анализатор и слайсы не пересоздаются — перепрошивается только hw-индекс. Пригодилось при отладке: конкретный DDC платы может вести себя хуже соседей, и пан можно просто увести на другой. Диапазон ограничен реальными DDC железа: MaxDDCIndex = 7 (DDC8+ openHPSDR enable-бит принимает, но поток не отдаёт). Ограничение действует и в меню, и в DDCFree, и в самом MovePanDDC. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+18
-2
@@ -47,6 +47,9 @@ uses
|
||||
RadioController, ChannelController;
|
||||
|
||||
const
|
||||
// Меню шапки пана: теги ниже — rate в кГц, от DDC_MENU_TAG — выбор hw-DDC.
|
||||
DDC_MENU_TAG = 1000;
|
||||
|
||||
CLR_BG = TColor($00101010);
|
||||
CLR_PANEL = TColor($00181818);
|
||||
CLR_BORDER = TColor($00303030);
|
||||
@@ -5626,7 +5629,7 @@ procedure TMainForm.OnPanRateClick(Sender: TObject);
|
||||
// (фильтр PanRateAllowed — кратные 48 кГц). Текущий rate отмечен галкой.
|
||||
var
|
||||
P: TPanafallPanel;
|
||||
i, kHz, Cur: Integer;
|
||||
i, kHz, Cur, CurDDC: Integer;
|
||||
begin
|
||||
if not (Sender is TPanafallPanel) then Exit;
|
||||
P := TPanafallPanel(Sender);
|
||||
@@ -5645,6 +5648,11 @@ begin
|
||||
if not FController.PanRateAllowed(Word(kHz)) then Continue;
|
||||
FPanRateMenu.AddItem(Format('%d kHz', [kHz]), kHz, kHz = Cur);
|
||||
end;
|
||||
// Аппаратный DDC пана: свободные индексы платы + текущий (отмечен галкой).
|
||||
CurDDC := FController.PanDDCIndex(P.PanId);
|
||||
for i := FController.PanDDCIndex(0) + 1 to FController.MaxDDCIndex do
|
||||
if (i = CurDDC) or FController.DDCFree(i) then
|
||||
FPanRateMenu.AddItem(Format('→ DDC %d', [i]), DDC_MENU_TAG + i, i = CurDDC);
|
||||
FPanRateMenuPanId := P.PanId;
|
||||
FPanRateMenu.PopupBelow(P.HeaderRateLabel); // дочерний контрол формы
|
||||
end;
|
||||
@@ -5659,6 +5667,12 @@ begin
|
||||
if (PanId < 1) or (PanId >= MAX_PANS) then Exit;
|
||||
P := FPans[PanId];
|
||||
if P = nil then Exit;
|
||||
// Теги DDC_MENU_TAG+ — переезд пана на другой hw DDC (движок не трогаем).
|
||||
if Tag >= DDC_MENU_TAG then
|
||||
begin
|
||||
if FController.MovePanDDC(PanId, Tag - DDC_MENU_TAG) then UpdatePanHeaders;
|
||||
Exit;
|
||||
end;
|
||||
if not FController.SetPanDDCRate(PanId, Word(Tag)) then Exit;
|
||||
// Вьюха/шапка/флаги под новый span (слайсы могли клампнуться к краям).
|
||||
SyncPanViews;
|
||||
@@ -6098,7 +6112,9 @@ begin
|
||||
begin
|
||||
P.SetHeaderText(Format('PAN %d · %.6f MHz ·',
|
||||
[i, FController.PanDDCFreq(i) / 1e6]));
|
||||
P.SetHeaderRate(Format('%d kHz', [FController.PanDDCRateKHz(i)]));
|
||||
// hw-индекс DDC в шапке: по клику там же выбирается rate и DDC пана.
|
||||
P.SetHeaderRate(Format('%d kHz · DDC%d',
|
||||
[FController.PanDDCRateKHz(i), FController.PanDDCIndex(i)]));
|
||||
end;
|
||||
// Бейдж диапазона (3.6): только паны N на «настоящих КВ»; клик = меню.
|
||||
if (i > 0) and PanBandSelectorVisible then
|
||||
|
||||
Reference in New Issue
Block a user