feat(dmr): show stable status on receiver slices

This commit is contained in:
2026-07-14 21:23:24 +03:00
parent 8b28986fec
commit 7c4b024186
3 changed files with 140 additions and 3 deletions
+41 -1
View File
@@ -34,7 +34,7 @@ uses
Classes, SysUtils, Math, Controls, ExtCtrls, StdCtrls, Graphics, Forms,
LCLIntf, LCLType,
OpenGLContextEx,
AppTheme, WDSPEngine, RadioController, VfoOverlay,
AppTheme, WDSPEngine, RadioController, DMRDecoder, VfoOverlay,
SpectrumView, SpectrumViewOpengl, PanZoomBar, FlatButton;
type
@@ -85,6 +85,7 @@ type
FPendingSliceClose: Integer; // SliceId к удалению после мыши (0=нет)
FMainFlagPinned: Boolean; // True = левая панель хозяина скрыта
FLastSliceMeterMs: QWord; // троттлинг S-метра слайсов (~10 Гц)
FLastSliceDMRMs: QWord; // семантический DMR-статус (~4 Гц)
FOnWireFlag: TWireFlagEvent;
FOnSliceClosed: TSliceClosedEvent;
FOnFlagsInvalidate: TNotifyEvent;
@@ -282,6 +283,7 @@ type
procedure PushAllSliceFlagStates; // все флаги панели (после смены rate и т.п.)
procedure PushMainFlagExtState;
procedure PushMainFlagAudioDevices;
procedure UpdateSliceDMRFlags;
// Тик: S-метр/частота главного флага + позиции + троттленный S-метр слайсов.
procedure TickFlags;
procedure SetFlagsTheme(const T: TAppTheme);
@@ -1375,6 +1377,36 @@ begin
end;
end;
procedure TPanafallPanel.UpdateSliceDMRFlags;
var
I, Slot: Integer;
O: TVfoOverlay;
S: TDMRStatus;
Txt: string;
begin
if FController = nil then Exit;
for I := 0 to High(FSliceFlags) do
begin
O := FSliceFlags[I];
if (O = nil) or (O.DisplayMode <> MODE_DMR) then Continue;
if not FController.GetSliceDMRStatus(O.SliceId, S) or not S.Synced then
begin
O.UpdateDMRStatus('DMR...', False);
Continue;
end;
Txt := 'DMR SYNC';
Slot := -1;
if S.LinkControlValid then Slot := S.LCSlot
else if S.CACHValid then Slot := S.Slot;
if Slot in [0, 1] then Txt := 'DMR TS' + IntToStr(Slot + 1);
if S.SlotTypeValid then Txt := Txt + ' CC' + IntToStr(S.ColorCode);
if S.LinkControlValid and (S.TargetID <> 0) then
Txt := Txt + ' TG' + IntToStr(S.TargetID);
O.UpdateDMRStatus(Txt, True);
end;
end;
// Тик (~частота FSpectrumTimer хозяина): метр/частота главного флага, позиции
// всех флагов, троттленный S-метр слайсов.
procedure TPanafallPanel.TickFlags;
@@ -1400,6 +1432,14 @@ begin
if FSliceFlags[I] <> nil then
FSliceFlags[I].UpdateSMeter(FController.SliceSMeter(FSliceFlags[I].SliceId));
end;
// Статус DMR содержит только устойчивые параметры и обновляется отдельно,
// заметно реже метра. Сам оверлей инвалидируется лишь после debounce и
// только если итоговая надпись действительно изменилась.
if GetTickCount64 - FLastSliceDMRMs >= 250 then
begin
FLastSliceDMRMs := GetTickCount64;
UpdateSliceDMRFlags;
end;
end;
end;