From 4410aa2433b190273384bbc3b95bbd64bfeecad3 Mon Sep 17 00:00:00 2001 From: James Smith Date: Thu, 19 Mar 2026 08:35:43 +0000 Subject: [PATCH] Harden ADS-B dashboard bootstrap --- templates/adsb_dashboard.html | 69 ++++++++++++++++++++++++++--------- 1 file changed, 52 insertions(+), 17 deletions(-) diff --git a/templates/adsb_dashboard.html b/templates/adsb_dashboard.html index 3bcf05b..dcc1616 100644 --- a/templates/adsb_dashboard.html +++ b/templates/adsb_dashboard.html @@ -1735,27 +1735,54 @@ ACARS: ${r.statistics.acarsMessages} messages`; if (delayedAircraftDbTimer) { clearTimeout(delayedAircraftDbTimer); delayedAircraftDbTimer = null; } }); + function ensureAdsbMapBootstrapped() { + if (radarMap) return; + try { + initMap(); + } catch (e) { + console.error('ADS-B map bootstrap failed:', e); + } + } + document.addEventListener('DOMContentLoaded', () => { - // Initialize observer location input fields from saved location - const obsLatInput = document.getElementById('obsLat'); - const obsLonInput = document.getElementById('obsLon'); - if (obsLatInput) obsLatInput.value = observerLocation.lat.toFixed(4); - if (obsLonInput) obsLonInput.value = observerLocation.lon.toFixed(4); + // Bring the map up first so a later startup error cannot leave the + // dashboard in a half-rendered "shell only" state. + ensureAdsbMapBootstrapped(); - // Initialize detection sound toggle from localStorage - const detectionToggle = document.getElementById('detectionSoundToggle'); - if (detectionToggle) detectionToggle.checked = detectionSoundEnabled; + try { + // Initialize observer location input fields from saved location + const obsLatInput = document.getElementById('obsLat'); + const obsLonInput = document.getElementById('obsLon'); + if (obsLatInput) obsLatInput.value = observerLocation.lat.toFixed(4); + if (obsLonInput) obsLonInput.value = observerLocation.lon.toFixed(4); - // Load Bias-T setting from localStorage - loadAdsbBiasTSetting(); + // Initialize detection sound toggle from localStorage + const detectionToggle = document.getElementById('detectionSoundToggle'); + if (detectionToggle) detectionToggle.checked = detectionSoundEnabled; + } catch (e) { + console.error('ADS-B UI bootstrap warning:', e); + } + + try { + loadAdsbBiasTSetting(); + } catch (e) { + console.error('ADS-B Bias-T bootstrap warning:', e); + } - initMap(); initDeviceSelectors() .then((devices) => checkAdsbTools(devices)) - .catch(() => checkAdsbTools([])); - updateClock(); - clockInterval = setInterval(updateClock, 1000); - cleanupInterval = setInterval(cleanupOldAircraft, 10000); + .catch((e) => { + console.error('ADS-B device selector bootstrap warning:', e); + checkAdsbTools([]); + }); + + try { + updateClock(); + clockInterval = setInterval(updateClock, 1000); + cleanupInterval = setInterval(cleanupOldAircraft, 10000); + } catch (e) { + console.error('ADS-B timer bootstrap warning:', e); + } // Defer nonessential startup probes so the page can paint and // return navigation remains snappy if the user leaves quickly. @@ -1774,8 +1801,16 @@ ACARS: ${r.statistics.acarsMessages} messages`; autoConnectGps(); }, 2500); - // Sync tracking state if ADS-B already running - syncTrackingStatus(); + syncTrackingStatus().catch((e) => { + console.error('ADS-B tracking status bootstrap warning:', e); + }); + }); + + window.addEventListener('load', () => { + if (!radarMap) { + console.warn('ADS-B map was not initialized during DOMContentLoaded, retrying on window load'); + ensureAdsbMapBootstrapped(); + } }); // Track which device is being used for ADS-B tracking