From 5f34d20287faacb74048fc7c83d1e9857d837e05 Mon Sep 17 00:00:00 2001 From: James Smith Date: Thu, 19 Mar 2026 09:34:33 +0000 Subject: [PATCH] Delay welcome page GPS and voice streams --- static/js/core/voice-alerts.js | 27 +++++++++++-- templates/index.html | 72 ++++++++++++++++++++++++---------- 2 files changed, 75 insertions(+), 24 deletions(-) diff --git a/static/js/core/voice-alerts.js b/static/js/core/voice-alerts.js index bf60f36..13410c2 100644 --- a/static/js/core/voice-alerts.js +++ b/static/js/core/voice-alerts.js @@ -8,6 +8,7 @@ const VoiceAlerts = (function () { let _queue = []; let _speaking = false; let _sources = {}; + let _streamStartTimer = null; const STORAGE_KEY = 'intercept-voice-muted'; const CONFIG_KEY = 'intercept-voice-config'; const RATE_MIN = 0.5; @@ -132,7 +133,12 @@ const VoiceAlerts = (function () { } function _startStreams() { + if (_streamStartTimer) { + clearTimeout(_streamStartTimer); + _streamStartTimer = null; + } if (!_enabled) return; + if (Object.keys(_sources).length > 0) return; // Pager stream if (_config.streams.pager) { @@ -173,17 +179,32 @@ const VoiceAlerts = (function () { } function _stopStreams() { + if (_streamStartTimer) { + clearTimeout(_streamStartTimer); + _streamStartTimer = null; + } Object.values(_sources).forEach(es => { try { es.close(); } catch (_) {} }); _sources = {}; } - function init() { + function init(options) { + const opts = options || {}; _loadConfig(); if (_isSpeechSupported()) { // Prime voices list early so user-triggered test calls are less likely to be silent. speechSynthesis.getVoices(); } - _startStreams(); + if (opts.startStreams !== false) { + _startStreams(); + } + } + + function scheduleStreamStart(delayMs) { + if (_streamStartTimer || Object.keys(_sources).length > 0 || !_enabled) return; + _streamStartTimer = window.setTimeout(() => { + _streamStartTimer = null; + _startStreams(); + }, Number(delayMs) > 0 ? Number(delayMs) : 20000); } function setEnabled(val) { @@ -255,7 +276,7 @@ const VoiceAlerts = (function () { }, 1200); } - return { init, speak, toggleMute, setEnabled, getConfig, setConfig, getAvailableVoices, testVoice, PRIORITY }; + return { init, scheduleStreamStart, speak, toggleMute, setEnabled, getConfig, setConfig, getAvailableVoices, testVoice, PRIORITY }; })(); window.VoiceAlerts = VoiceAlerts; diff --git a/templates/index.html b/templates/index.html index 937be01..e1e30f3 100644 --- a/templates/index.html +++ b/templates/index.html @@ -3892,6 +3892,8 @@ // GPS Dongle state let gpsConnected = false; let gpsEventSource = null; + let gpsAutoConnectTimer = null; + let gpsAutoConnectInFlight = null; let gpsLastPosition = null; // Satellite state @@ -4090,8 +4092,8 @@ if (obsLatInput) obsLatInput.value = observerLocation.lat.toFixed(4); if (obsLonInput) obsLonInput.value = observerLocation.lon.toFixed(4); - // Auto-connect to gpsd if available - autoConnectGps(); + // Defer GPS auto-connect so it doesn't compete with initial dashboard navigation. + scheduleGpsAutoConnect(); // Load pager message filters loadPagerFilters(); @@ -10851,26 +10853,51 @@ // GPS FUNCTIONS (gpsd auto-connect) // ============================================ - async function autoConnectGps() { - // Automatically try to connect to gpsd on page load - try { - const response = await fetch('/gps/auto-connect', { method: 'POST' }); - const data = await response.json(); + function scheduleGpsAutoConnect(delayMs = 20000) { + if (gpsConnected || gpsAutoConnectInFlight || gpsAutoConnectTimer) return; + gpsAutoConnectTimer = setTimeout(() => { + gpsAutoConnectTimer = null; + autoConnectGps(); + }, delayMs); + } - if (data.status === 'connected') { - gpsConnected = true; - startGpsStream(); - showGpsIndicator(true); - console.log('GPS: Auto-connected to gpsd'); - if (data.position) { - updateLocationFromGps(data.position); - } - } else { - console.log('GPS: gpsd not available -', data.message); - } - } catch (e) { - console.log('GPS: Auto-connect failed -', e.message); + async function autoConnectGps() { + if (gpsConnected) return true; + if (gpsAutoConnectTimer) { + clearTimeout(gpsAutoConnectTimer); + gpsAutoConnectTimer = null; } + if (gpsAutoConnectInFlight) { + return gpsAutoConnectInFlight; + } + + gpsAutoConnectInFlight = (async () => { + try { + const response = await fetch('/gps/auto-connect', { method: 'POST' }); + const data = await response.json(); + + if (data.status === 'connected') { + gpsConnected = true; + startGpsStream(); + showGpsIndicator(true); + console.log('GPS: Auto-connected to gpsd'); + if (data.position) { + updateLocationFromGps(data.position); + } + return true; + } + + console.log('GPS: gpsd not available -', data.message); + return false; + } catch (e) { + console.log('GPS: Auto-connect failed -', e.message); + return false; + } finally { + gpsAutoConnectInFlight = null; + } + })(); + + return gpsAutoConnectInFlight; } let gpsReconnectTimeout = null; @@ -16367,7 +16394,10 @@