mirror of
https://github.com/smittix/intercept.git
synced 2026-04-24 14:50:00 -07:00
Fix satellite dashboard refresh flows
This commit is contained in:
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user