Fix satellite dashboard refresh flows

This commit is contained in:
James Smith
2026-03-18 22:53:36 +00:00
parent 6fd5098b89
commit 62ee2252a3
4 changed files with 257 additions and 127 deletions

View File

@@ -200,19 +200,6 @@
</div>
</div>
<!-- Decoded Packets -->
<div class="panel packets-panel">
<div class="panel-header">
<span>DECODED PACKETS <span id="packetCount" style="color:var(--accent-cyan);"></span></span>
<div class="panel-indicator"></div>
</div>
<div class="panel-content" id="packetList">
<div style="text-align:center;color:var(--text-secondary);padding:15px;font-size:11px;">
No packets received yet.<br>Run a ground-station observation with telemetry tasks enabled to populate this panel.
</div>
</div>
</div>
<!-- Ground Station -->
<div class="panel gs-panel" id="gsPanel">
<div class="panel-header">
@@ -352,6 +339,19 @@
</div>
</div>
</div>
<!-- Decoded Packets -->
<div class="panel packets-panel">
<div class="panel-header">
<span>DECODED PACKETS <span id="packetCount" style="color:var(--accent-cyan);"></span></span>
<div class="panel-indicator"></div>
</div>
<div class="panel-content" id="packetList">
<div style="text-align:center;color:var(--text-secondary);padding:15px;font-size:11px;">
No packets received yet.<br>Run a ground-station observation with telemetry tasks enabled to populate this panel.
</div>
</div>
</div>
</div>
<!-- Controls Bar -->
@@ -601,6 +601,7 @@
let agents = [];
let _txRequestId = 0;
let _telemetryPollTimer = null;
let _passRequestId = 0;
let satellites = {
25544: { name: 'ISS (ZARYA)', color: '#00ffff' },
@@ -620,33 +621,49 @@
fetch('/satellite/tracked?enabled=true')
.then(r => r.json())
.then(data => {
if (data.status === 'success' && data.satellites && data.satellites.length > 0) {
const prevSelected = selectedSatellite;
const newSats = {};
const select = document.getElementById('satSelect');
select.innerHTML = '';
const prevSelected = selectedSatellite;
const newSats = {
25544: { name: 'ISS (ZARYA)', color: satellites[25544]?.color || satColors[0] },
57166: { name: 'METEOR-M2-3', color: satellites[57166]?.color || satColors[2] },
59051: { name: 'METEOR-M2-4', color: satellites[59051]?.color || satColors[4] },
};
const select = document.getElementById('satSelect');
if (!select) return;
if (data.status === 'success' && Array.isArray(data.satellites)) {
data.satellites.forEach((sat, i) => {
const norad = parseInt(sat.norad_id);
if (!Number.isFinite(norad)) return;
newSats[norad] = {
name: sat.name,
color: satellites[norad]?.color || satColors[i % satColors.length]
};
const opt = document.createElement('option');
opt.value = norad;
opt.textContent = sat.name;
select.appendChild(opt);
});
satellites = newSats;
// Restore previous selection if still available, else default to ISS
if (newSats[prevSelected]) {
select.value = prevSelected;
} else if (newSats[25544]) {
select.value = '25544';
}
selectedSatellite = parseInt(select.value);
}
satellites = newSats;
select.innerHTML = '';
Object.entries(newSats).forEach(([norad, sat]) => {
const opt = document.createElement('option');
opt.value = norad;
opt.textContent = sat.name;
select.appendChild(opt);
});
if (newSats[prevSelected]) {
select.value = String(prevSelected);
} else if (newSats[25544]) {
select.value = '25544';
}
selectedSatellite = parseInt(select.value);
clearTelemetry();
loadTransmitters(selectedSatellite);
calculatePasses();
fetchCurrentTelemetry();
if (window.gsLoadOutputs) window.gsLoadOutputs();
if (window.gsOnSatelliteChange) window.gsOnSatelliteChange();
})
.catch(() => {});
.catch(() => {})
.finally(() => {
if (btn) btn.classList.remove('spinning');
});
}
function onSatelliteChange() {
@@ -670,7 +687,7 @@
loadTransmitters(selectedSatellite);
calculatePasses();
fetchCurrentTelemetry();
gsLoadOutputs();
if (window.gsLoadOutputs) window.gsLoadOutputs();
if (window.gsOnSatelliteChange) gsOnSatelliteChange();
}
@@ -1073,9 +1090,18 @@
}
async function calculatePasses() {
const requestId = ++_passRequestId;
const lat = parseFloat(document.getElementById('obsLat').value);
const lon = parseFloat(document.getElementById('obsLon').value);
const satName = satellites[selectedSatellite]?.name || 'Unknown';
const container = document.getElementById('passList');
const button = document.querySelector('.controls-bar .btn.primary');
if (container) {
container.innerHTML = '<div style="text-align:center;color:var(--text-secondary);padding:20px;">Calculating passes...</div>';
}
if (button) {
button.disabled = true;
button.textContent = 'WORKING...';
}
try {
const response = await fetch('/satellite/predict', {
@@ -1091,25 +1117,38 @@
});
const data = await response.json();
if (requestId !== _passRequestId) return;
if (data.status === 'success') {
passes = data.passes;
renderPassList();
updateStats();
if (passes.length > 0) {
selectPass(0);
} else {
clearTelemetry();
}
updateObserverMarker(lat, lon);
document.getElementById('trackingStatus').textContent = 'TRACKING';
document.getElementById('trackingDot').style.background = 'var(--accent-green)';
} else {
passes = [];
renderPassList();
document.getElementById('trackingStatus').textContent = 'ERROR';
document.getElementById('trackingDot').style.background = 'var(--accent-red)';
}
} catch (err) {
if (requestId !== _passRequestId) return;
console.error('Pass calculation error:', err);
passes = [];
renderPassList();
document.getElementById('trackingStatus').textContent = 'OFFLINE';
document.getElementById('trackingDot').style.background = 'var(--accent-red)';
} finally {
if (requestId === _passRequestId && button) {
button.disabled = false;
button.textContent = 'CALCULATE';
}
}
}
@@ -2046,6 +2085,7 @@
})
.catch(() => {});
}
window.gsLoadOutputs = gsLoadOutputs;
function gsLoadDecodeJobs(norad) {
const panel = document.getElementById('gsOutputsPanel');