Add ADS-B history persistence and reporting UI

This commit is contained in:
James Ward
2026-01-24 15:14:48 -08:00
committed by Smittix
parent 0cccf3c9dd
commit 8b4b440b22
9 changed files with 2461 additions and 137 deletions
+62 -16
View File
@@ -74,9 +74,12 @@
<button type="button" class="strip-btn" onclick="lookupSelectedFlight()" title="Lookup selected aircraft on FlightAware" id="flightLookupBtn" disabled>
🔗 Lookup
</button>
<button type="button" class="strip-btn primary" onclick="generateReport()" title="Generate Session Report">
📊 Report
</button>
<button type="button" class="strip-btn primary" onclick="generateReport()" title="Generate Session Report">
📊 Report
</button>
<a class="strip-btn" href="/adsb/history" title="Open History Reporting">
📚 History
</a>
<div class="strip-divider"></div>
<div class="strip-status">
<div class="status-dot inactive" id="trackingDot"></div>
@@ -1959,11 +1962,14 @@ ACARS: ${r.statistics.acarsMessages} messages`;
setInterval(cleanupOldAircraft, 10000);
checkAdsbTools();
checkAircraftDatabase();
checkDvbDriverConflict();
// Auto-connect to gpsd if available
autoConnectGps();
});
checkDvbDriverConflict();
// Auto-connect to gpsd if available
autoConnectGps();
// Sync tracking state if ADS-B already running
syncTrackingStatus();
});
// Track which device is being used for ADS-B tracking
let adsbActiveDevice = null;
@@ -2362,8 +2368,8 @@ sudo make install</code>
return { host, port };
}
async function toggleTracking() {
const btn = document.getElementById('startBtn');
async function toggleTracking() {
const btn = document.getElementById('startBtn');
if (!isTracking) {
// Check for remote dump1090 config
@@ -2428,12 +2434,52 @@ sudo make install</code>
document.getElementById('trackingDot').classList.add('inactive');
document.getElementById('trackingStatus').textContent = 'STANDBY';
// Re-enable ADS-B device selector
document.getElementById('adsbDeviceSelect').disabled = false;
}
}
function startEventStream() {
if (eventSource) eventSource.close();
document.getElementById('adsbDeviceSelect').disabled = false;
}
}
async function syncTrackingStatus() {
try {
const response = await fetch('/adsb/session');
if (!response.ok) {
return;
}
const data = await response.json();
if (!data.tracking_active) {
return;
}
isTracking = true;
startEventStream();
drawRangeRings();
const startBtn = document.getElementById('startBtn');
startBtn.textContent = 'STOP';
startBtn.classList.add('active');
document.getElementById('trackingDot').classList.remove('inactive');
document.getElementById('trackingStatus').textContent = 'TRACKING';
document.getElementById('adsbDeviceSelect').disabled = true;
const session = data.session || {};
const startTime = session.started_at ? Date.parse(session.started_at) : null;
if (startTime) {
stats.sessionStart = startTime;
}
startSessionTimer();
const sessionDevice = session.device_index;
if (sessionDevice !== null && sessionDevice !== undefined) {
adsbActiveDevice = sessionDevice;
const adsbSelect = document.getElementById('adsbDeviceSelect');
if (adsbSelect) {
adsbSelect.value = sessionDevice;
}
}
} catch (err) {
console.warn('Failed to sync ADS-B tracking status', err);
}
}
function startEventStream() {
if (eventSource) eventSource.close();
console.log('Starting ADS-B event stream...');
eventSource = new EventSource('/adsb/stream');