feat(dmr): add receive frontend and AMBE adapter

This commit is contained in:
2026-07-14 18:38:39 +03:00
parent f33a1fbd0a
commit 53a3681618
20 changed files with 998 additions and 30 deletions
+46 -3
View File
@@ -40,7 +40,7 @@ uses
WinFirewall,
BoardUtils, WisdomBuilder, UISync,
FlatEdit, FMRepeater,
ChannelStore, ChannelsForm, BeaconScopeForm,
ChannelStore, ChannelsForm, BeaconScopeForm, DMRDecoder,
PowerInhibit,
DeviceStore,
RadioBackend, PlutoBackend,
@@ -67,7 +67,7 @@ const
WDSP_WISDOM_FILE = 'wdspWisdom00';
BAND_COUNT = 12; // макс. слотов среди планов (Pluto VHF/UHF = 12, HF = 11)
MODE_COUNT = 11;
MODE_COUNT = 12;
// Полосы/дефолты фильтров (FILT_COUNT, FILT_*_BW, FILT_*_DEF, FILT_FM_*)
// перенесены в Settings.pas — нужны TRadioController. Здесь остаются только
// UI-подписи кнопок (NAMES).
@@ -105,7 +105,7 @@ const
'160m','80m','60m','40m','30m','20m','17m','15m','12m','10m','6m','');
MODE_NAMES: array[0..MODE_COUNT-1] of string = (
'LSB','USB','DSB','CWL','CWU','FM','AM','SAM','DIGU','DIGL','WFM');
'LSB','USB','DSB','CWL','CWU','FM','AM','SAM','DIGU','DIGL','WFM','DMR');
MODE_ROWS = 3; // 4 колонки; последний ряд неполный
SMETER_WIDTH_RATIO = 0.32;
@@ -419,6 +419,7 @@ type
procedure UpdateStatusField7; // поле 7: PLL (HPSDR) или beacon (Pluto)
procedure UpdateStatusField3; // поле 3: Supply (HPSDR) или Temp/RSSI (Pluto)
function BeaconStatusText: string; // компактный статус QO-100 beacon lock
function DMRStatusText: string; // sync/type/polarity DMR front-end
procedure DoUpdateDDCSeq(DDCIdx: Integer; Seq: LongWord);
// Event handlers
@@ -3583,10 +3584,28 @@ begin
end;
end;
function TMainForm.DMRStatusText: string;
var
S: TDMRStatus;
Inv: string;
begin
if not FController.GetDMRStatus(S) then Exit('DMR unavailable');
if not S.Enabled then Exit('DMR off');
if not S.Synced then Exit(Format('DMR sync... %.3f', [S.SignalRMS]));
if S.Inverted then Inv := ' INV' else Inv := '';
Result := Format('DMR %s%s #%d',
[TDMRDecoder.SyncKindName(S.SyncKind), Inv, S.SyncCount]);
end;
procedure TMainForm.UpdateStatusField7;
// Поле 7 статус-бара. openHPSDR — PLL-lock (как прежде). Pluto в трансвертере —
// статус QO-100 beacon lock (у Pluto нет PLL-телеметрии); Pluto без XVTR — пусто.
begin
if FController.FMode = MODE_DMR then
begin
SetStatusText(7, DMRStatusText);
Exit;
end;
if FController.IsPluto then
begin
if FController.FCurrentXvtr >= 0 then SetStatusText(7, BeaconStatusText)
@@ -4203,6 +4222,24 @@ begin
Exit;
end;
if FController.FMode = MODE_DMR then
begin
CloseCTCSSPopup;
FController.FFilter := 0;
FController.FFilterBW := FILT_DMR_BW;
FController.FFMDeviation := DMR_FM_DEV;
BtnFilter[0].Caption := '12.5k';
BtnFilter[0].Left := LeftPanelButtonLeft(PanelFilter.Width, 1, 0);
BtnFilter[0].Width := LeftPanelButtonWidth(PanelFilter.Width, 1, 0);
BtnFilter[0].Top := 16;
BtnFilter[0].Visible := True;
StyleButton(BtnFilter[0], True);
for i := 1 to FILT_COUNT - 1 do BtnFilter[i].Visible := False;
PanelFilter.Height := BtnFilter[0].Top + BtnFilter[0].Height + 4;
RelayoutBelowBands;
Exit;
end;
for i := 0 to FILT_COUNT - 1 do
begin
BtnFilter[i].Left := LeftPanelButtonLeft(PanelFilter.Width, 5, i mod 5);
@@ -5323,6 +5360,12 @@ begin
Break;
end;
end;
MODE_DMR:
begin
FController.FFilter := 0;
FController.FFilterBW := FILT_DMR_BW;
FController.FFMDeviation := DMR_FM_DEV;
end;
end;
if FController.FWDSPReady then
begin