Stabilize scanner progress tracking

This commit is contained in:
Smittix
2026-02-04 12:42:30 +00:00
parent 993a7d2626
commit fec38adc78
2 changed files with 35 additions and 18 deletions

View File

@@ -425,19 +425,6 @@ def scanner_loop_power():
'-d', str(device),
]
# Emit an initial progress update for UI
try:
scanner_current_freq = start_mhz
scanner_queue.put_nowait({
'type': 'scan_update',
'frequency': scanner_current_freq,
'level': 0,
'threshold': int(float(scanner_config.get('snr_threshold', 12)) * 100),
'detected': False
})
except queue.Full:
pass
try:
proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.DEVNULL)
scanner_power_process = proc

View File

@@ -15,6 +15,9 @@ let scannerCycles = 0;
let scannerStartFreq = 118;
let scannerEndFreq = 137;
let scannerSignalActive = false;
let lastScanProgress = null;
let scannerTotalSteps = 0;
let scannerMethod = null;
// Audio state
let isAudioPlaying = false;
@@ -181,6 +184,8 @@ function startScanner() {
scannerEndFreq = endFreq;
scannerFreqsScanned = 0;
scannerCycles = 0;
lastScanProgress = null;
scannerTotalSteps = Math.max(1, Math.round(((endFreq - startFreq) * 1000) / step));
// Update sidebar display
updateScannerDisplay('STARTING...', 'var(--accent-orange)');
@@ -232,6 +237,7 @@ function startScanner() {
isScannerRunning = true;
isScannerPaused = false;
scannerSignalActive = false;
scannerMethod = (scanResult.config && scanResult.config.scan_method) ? scanResult.config.scan_method : 'power';
// Update controls (with null checks)
const startBtn = document.getElementById('scannerStartBtn');
@@ -294,6 +300,11 @@ function stopScanner() {
isScannerPaused = false;
scannerSignalActive = false;
currentSignalLevel = 0;
lastScanProgress = null;
scannerTotalSteps = 0;
scannerMethod = null;
scannerCycles = 0;
scannerFreqsScanned = 0;
// Re-enable listen button (will be in local mode after stop)
updateListenButtonState(false);
@@ -559,6 +570,12 @@ function handleScannerEvent(data) {
case 'log':
if (data.entry && data.entry.type === 'scan_cycle') {
scannerCycles++;
lastScanProgress = null;
if (scannerTotalSteps > 0) {
scannerFreqsScanned = scannerCycles * scannerTotalSteps;
const freqsEl = document.getElementById('mainFreqsScanned');
if (freqsEl) freqsEl.textContent = scannerFreqsScanned;
}
const cyclesEl = document.getElementById('mainScanCycles');
if (cyclesEl) cyclesEl.textContent = scannerCycles;
}
@@ -570,10 +587,25 @@ function handleScannerEvent(data) {
}
function handleFrequencyUpdate(data) {
if (scannerMethod === 'power' && data.progress === undefined) {
return;
}
const progressValue = (data.progress !== undefined)
? data.progress
: ((data.frequency - scannerStartFreq) / (scannerEndFreq - scannerStartFreq));
const displayFreq = scannerStartFreq + (progressValue * (scannerEndFreq - scannerStartFreq));
const clampedProgress = Math.max(0, Math.min(1, progressValue));
if (lastScanProgress !== null && clampedProgress < lastScanProgress) {
const isCycleReset = lastScanProgress > 0.85 && clampedProgress < 0.15;
if (!isCycleReset) {
return;
}
}
lastScanProgress = clampedProgress;
const nextScanned = (scannerCycles * scannerTotalSteps) + Math.round(clampedProgress * scannerTotalSteps);
scannerFreqsScanned = Math.max(scannerFreqsScanned, nextScanned);
const freqsEl = document.getElementById('mainFreqsScanned');
if (freqsEl) freqsEl.textContent = scannerFreqsScanned;
const displayFreq = scannerStartFreq + (clampedProgress * (scannerEndFreq - scannerStartFreq));
const freqStr = displayFreq.toFixed(3);
const currentFreq = document.getElementById('scannerCurrentFreq');
@@ -583,16 +615,14 @@ function handleFrequencyUpdate(data) {
if (mainFreq) mainFreq.textContent = freqStr;
// Update progress bar
const progress = Math.max(0, Math.min(100, progressValue * 100));
const progress = Math.max(0, Math.min(100, clampedProgress * 100));
const progressBar = document.getElementById('scannerProgressBar');
if (progressBar) progressBar.style.width = Math.max(0, Math.min(100, progress)) + '%';
const mainProgressBar = document.getElementById('mainProgressBar');
if (mainProgressBar) mainProgressBar.style.width = Math.max(0, Math.min(100, progress)) + '%';
scannerFreqsScanned++;
const freqsEl = document.getElementById('mainFreqsScanned');
if (freqsEl) freqsEl.textContent = scannerFreqsScanned;
// freqs scanned updated via progress above
// Update level meter if present
if (data.level !== undefined) {