fix(beacon): трасса лупы не рисовалась до первого клика по маяку

Перерисовку спектра лупы гейтил не тот сигнал: возврат GetBeaconZoomSpectrum
(«в кэше лежит непрочитанный кадр») игнорировался — функция звалась как
процедура, — а FZoomDirty ставился только по смене границ окна и по сдвигу
маркеров. Пока никто не панорамирует, границы не меняются, а до клика все три
маркерные частоты нулевые и неподвижные: кадр собирался один раз и застывал.

Клик задаёт наведение декодера, дальше BeaconDecodeFreqHz непрерывно едет за
несущей в ServiceBeaconLock — сравнение с FLastDecHz начинает срабатывать
каждый тик, и спектр «оживает». Водопад работал с самого начала: он всегда шёл
по своему честному флагу свежести, хотя слой тот же самый и анализатор один.

Теперь свежесть кадра — основной триггер (трасса идёт 15/с, как и даёт
анализатор); проверки окна и маркеров оставлены как дополнительные, они дают
отклик на зум/пан не дожидаясь следующего кадра.

Сборка ewsdr (--ws=qt6) — ОК.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-14 11:54:13 +03:00
co-authored by Claude Opus 5
parent 705da75c26
commit ac216fa332
+5 -1
View File
@@ -541,7 +541,11 @@ begin
// картинку ТОЛЬКО на свежем кадре либо когда переехали маркеры/окно.
// «Несвежий» кадр всё равно забираем: он нужен как последний нарисованный,
// пока анализатор наполняет FFT-окно после переарма.
FCtl.GetBeaconZoomSpectrum(FPix, Cnt, Lo, Hi);
// Возврат GetBeaconZoomSpectrum = «в кэше был НЕпрочитанный кадр»; это и есть
// главный триггер перерисовки трассы. Границы окна тут не помощник: пока
// никто не панорамирует, они не меняются, а пиксели — каждый кадр.
if FCtl.GetBeaconZoomSpectrum(FPix, Cnt, Lo, Hi) then
FZoomDirty := True;
if Cnt > 0 then
begin
if (Cnt <> FPixCount) or (Abs(Lo - FViewLo) > 0.01)