From 1e249a0eec818ea39b3d4ce5b5f8c6053a476a41 Mon Sep 17 00:00:00 2001 From: Smittix Date: Sat, 7 Feb 2026 11:37:14 +0000 Subject: [PATCH] Fix Doppler detecting events clobbering decode progress UI The Doppler tracking thread emits detecting events every 5s from a separate thread, unaware of decode state. The previous to_dict() change included signal_level for ALL detecting events, causing the frontend to replace the decode progress canvas with the signal monitor mid-decode. Fix: use None as default for signal_level so only signal-metrics events (which explicitly set the value) include the field. Also add a frontend guard to ignore detecting events while the UI is in decoding state. Co-Authored-By: Claude Opus 4.6 --- static/js/modes/sstv-general.js | 7 +++++++ static/js/modes/sstv.js | 7 +++++++ utils/sstv/sstv_decoder.py | 10 +++++----- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/static/js/modes/sstv-general.js b/static/js/modes/sstv-general.js index 444ef0a..f023f0a 100644 --- a/static/js/modes/sstv-general.js +++ b/static/js/modes/sstv-general.js @@ -245,7 +245,14 @@ const SSTVGeneral = (function() { renderGallery(); showNotification('SSTV', 'New image decoded!'); updateStatusUI('listening', 'Listening...'); + // Clear decode progress so signal monitor can take over + const liveContent = document.getElementById('sstvGeneralLiveContent'); + if (liveContent) liveContent.innerHTML = ''; } else if (data.status === 'detecting') { + // Ignore detecting events if currently decoding (e.g. Doppler updates) + const dot = document.getElementById('sstvGeneralStripDot'); + if (dot && dot.classList.contains('decoding')) return; + updateStatusUI('listening', data.message || 'Listening...'); if (data.signal_level !== undefined) { renderSignalMonitor(data); diff --git a/static/js/modes/sstv.js b/static/js/modes/sstv.js index 2830f8a..2d02a24 100644 --- a/static/js/modes/sstv.js +++ b/static/js/modes/sstv.js @@ -680,7 +680,14 @@ const SSTV = (function() { renderGallery(); showNotification('SSTV', 'New image decoded!'); updateStatusUI('listening', 'Listening...'); + // Clear decode progress so signal monitor can take over + const liveContent = document.getElementById('sstvLiveContent'); + if (liveContent) liveContent.innerHTML = ''; } else if (data.status === 'detecting') { + // Ignore detecting events if currently decoding (e.g. Doppler updates) + const dot = document.getElementById('sstvStripDot'); + if (dot && dot.classList.contains('decoding')) return; + updateStatusUI('listening', data.message || 'Listening...'); if (data.signal_level !== undefined) { renderSignalMonitor(data); diff --git a/utils/sstv/sstv_decoder.py b/utils/sstv/sstv_decoder.py index 368edac..3035adc 100644 --- a/utils/sstv/sstv_decoder.py +++ b/utils/sstv/sstv_decoder.py @@ -92,8 +92,8 @@ class DecodeProgress: progress_percent: int = 0 message: str | None = None image: SSTVImage | None = None - signal_level: int = 0 # 0-100 RMS audio level - sstv_tone: str | None = None # 'leader', 'sync', 'pixel', None + signal_level: int | None = None # 0-100 RMS audio level, None = not measured + sstv_tone: str | None = None # 'leader', 'sync', 'noise', None def to_dict(self) -> dict: result: dict = { @@ -107,10 +107,10 @@ class DecodeProgress: result['message'] = self.message if self.image: result['image'] = self.image.to_dict() - if self.status == 'detecting': + if self.signal_level is not None: result['signal_level'] = self.signal_level - if self.sstv_tone: - result['sstv_tone'] = self.sstv_tone + if self.sstv_tone: + result['sstv_tone'] = self.sstv_tone return result