diff --git a/routes/listening_post.py b/routes/listening_post.py index c7db857..0575434 100644 --- a/routes/listening_post.py +++ b/routes/listening_post.py @@ -525,6 +525,11 @@ def scanner_loop_power(): # Process segments in ascending frequency order to avoid backtracking in UI segments.sort(key=lambda s: s[0]) + total_bins = sum(len(seg[3]) for seg in segments) + if total_bins <= 0: + time.sleep(0.2) + continue + global_index = 0 for sweep_start, sweep_end, sweep_bin, bin_values in segments: # Noise floor (median) @@ -545,16 +550,19 @@ def scanner_loop_power(): snr = val - noise_floor level = int(max(0, snr) * 100) threshold = int(snr_threshold * 100) + progress = min(1.0, global_index / max(1, total_bins - 1)) try: scanner_queue.put_nowait({ 'type': 'scan_update', 'frequency': scanner_current_freq, 'level': level, 'threshold': threshold, - 'detected': snr >= snr_threshold + 'detected': snr >= snr_threshold, + 'progress': progress }) except queue.Full: pass + global_index += emit_stride # Detect peaks (clusters above threshold) peaks = [] diff --git a/static/js/modes/listening-post.js b/static/js/modes/listening-post.js index 0bf26f2..bc2cb96 100644 --- a/static/js/modes/listening-post.js +++ b/static/js/modes/listening-post.js @@ -15,7 +15,6 @@ let scannerCycles = 0; let scannerStartFreq = 118; let scannerEndFreq = 137; let scannerSignalActive = false; -let lastScanFreq = null; // Audio state let isAudioPlaying = false; @@ -182,7 +181,6 @@ function startScanner() { scannerEndFreq = endFreq; scannerFreqsScanned = 0; scannerCycles = 0; - lastScanFreq = null; // Update sidebar display updateScannerDisplay('STARTING...', 'var(--accent-orange)'); @@ -296,7 +294,6 @@ function stopScanner() { isScannerPaused = false; scannerSignalActive = false; currentSignalLevel = 0; - lastScanFreq = null; // Re-enable listen button (will be in local mode after stop) updateListenButtonState(false); @@ -575,18 +572,6 @@ function handleScannerEvent(data) { function handleFrequencyUpdate(data) { const freqStr = data.frequency.toFixed(3); - // Prevent jitter from out-of-order sweep segments - if (lastScanFreq !== null) { - const range = scannerEndFreq - scannerStartFreq; - if (range > 0 && data.frequency < lastScanFreq) { - const drop = lastScanFreq - data.frequency; - if (drop < range * 0.5) { - return; // ignore backward blip within sweep - } - } - } - lastScanFreq = data.frequency; - const currentFreq = document.getElementById('scannerCurrentFreq'); if (currentFreq) currentFreq.textContent = freqStr + ' MHz'; @@ -594,7 +579,9 @@ function handleFrequencyUpdate(data) { if (mainFreq) mainFreq.textContent = freqStr; // Update progress bar - const progress = ((data.frequency - scannerStartFreq) / (scannerEndFreq - scannerStartFreq)) * 100; + const progress = (data.progress !== undefined) + ? (data.progress * 100) + : ((data.frequency - scannerStartFreq) / (scannerEndFreq - scannerStartFreq)) * 100; const progressBar = document.getElementById('scannerProgressBar'); if (progressBar) progressBar.style.width = Math.max(0, Math.min(100, progress)) + '%';