mirror of
https://git.vladimir.cc/vladimir/ewsdr.git
synced 2026-08-25 20:27:33 +00:00
feat(dmr): show stable status on receiver slices
This commit is contained in:
+41
-1
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user