diff --git a/templates/satellite_dashboard.html b/templates/satellite_dashboard.html
index 6cfd552..ab531f9 100644
--- a/templates/satellite_dashboard.html
+++ b/templates/satellite_dashboard.html
@@ -200,6 +200,7 @@
@@ -790,7 +791,7 @@
const RECEIVER_STORAGE_KEY = 'satellite.dashboard.receiver';
const DASHBOARD_FETCH_TIMEOUT_MS = 30000;
const PASS_FETCH_TIMEOUT_MS = 90000;
- const SAT_DRAWER_FETCH_TIMEOUT_MS = 8000;
+ const SAT_DRAWER_FETCH_TIMEOUT_MS = 15000;
const BUILTIN_TX_FALLBACK = {
25544: [
{ description: 'APRS digipeater', downlink_low: 145.825, downlink_high: 145.825, uplink_low: null, uplink_high: null, mode: 'FM AX.25', baud: 1200, status: 'active', type: 'beacon', service: 'Packet' },
@@ -809,6 +810,7 @@
let satellites = {
25544: { name: 'ISS (ZARYA)', color: '#00ffff' },
+ 40069: { name: 'METEOR-M2', color: '#9370DB' },
57166: { name: 'METEOR-M2-3', color: '#ff00ff' },
59051: { name: 'METEOR-M2-4', color: '#00ff88' }
};
@@ -1023,6 +1025,7 @@
const prevSelected = selectedSatellite;
const newSats = {
25544: { name: 'ISS (ZARYA)', color: satellites[25544]?.color || satColors[0] },
+ 40069: { name: 'METEOR-M2', color: satellites[40069]?.color || satColors[1] },
57166: { name: 'METEOR-M2-3', color: satellites[57166]?.color || satColors[2] },
59051: { name: 'METEOR-M2-4', color: satellites[59051]?.color || satColors[4] },
};
@@ -1856,25 +1859,48 @@
const data = await response.json();
if (requestId !== _passRequestId) return;
if (data.status === 'success') {
- passes = data.passes;
+ passes = Array.isArray(data.passes) ? data.passes : [];
cacheCurrentPasses(selectedSatellite, passes);
- renderPassList();
- updateStats();
- updateMissionDrawerInfo();
+
+ try {
+ renderPassList();
+ updateStats();
+ updateMissionDrawerInfo();
+ } catch (renderErr) {
+ console.error('Satellite pass list render error:', renderErr);
+ }
+
if (passes.length > 0) {
- selectPass(0);
+ try {
+ selectPass(0);
+ } catch (renderErr) {
+ console.error('Satellite pass selection render error:', renderErr);
+ selectedPass = 0;
+ renderMapTrackOverlays();
+ updateMapTrackSummary();
+ updateTelemetry(passes[0]);
+ }
} else {
- renderMapTrackOverlays();
- updateMapTrackSummary();
- if (latestLivePosition?.azimuth != null && latestLivePosition?.elevation != null) {
- drawPolarPlotWithPosition(
- latestLivePosition.azimuth,
- latestLivePosition.elevation,
- satellites[selectedSatellite]?.color || '#00d4ff'
- );
+ try {
+ renderMapTrackOverlays();
+ updateMapTrackSummary();
+ if (latestLivePosition?.azimuth != null && latestLivePosition?.elevation != null) {
+ drawPolarPlotWithPosition(
+ latestLivePosition.azimuth,
+ latestLivePosition.elevation,
+ satellites[selectedSatellite]?.color || '#00d4ff'
+ );
+ }
+ } catch (renderErr) {
+ console.error('Satellite empty-pass render error:', renderErr);
}
}
- updateObserverMarker(lat, lon);
+
+ try {
+ updateObserverMarker(lat, lon);
+ } catch (markerErr) {
+ console.error('Satellite observer marker error:', markerErr);
+ }
document.getElementById('trackingStatus').textContent = 'TRACKING';
document.getElementById('trackingDot').style.background = 'var(--accent-green)';
@@ -2182,23 +2208,29 @@
}
function updateTelemetry(pass) {
+ if (latestLivePosition) {
+ applyTelemetryPosition(latestLivePosition);
+ return;
+ }
if (!pass || !pass.currentPos) {
- document.getElementById('telLat').textContent = '---.----';
- document.getElementById('telLon').textContent = '---.----';
- document.getElementById('telAlt').textContent = '--- km';
- document.getElementById('telEl').textContent = '--.-';
- document.getElementById('telAz').textContent = '---.-';
- document.getElementById('telDist').textContent = '---- km';
+ clearTelemetry();
return;
}
const pos = pass.currentPos;
- document.getElementById('telLat').textContent = (pos.lat || 0).toFixed(4) + '°';
- document.getElementById('telLon').textContent = (pos.lon || 0).toFixed(4) + '°';
- document.getElementById('telAlt').textContent = (pos.alt || 0).toFixed(0) + ' km';
- document.getElementById('telEl').textContent = (pos.el || 0).toFixed(1) + '°';
- document.getElementById('telAz').textContent = (pos.az || 0).toFixed(1) + '°';
- document.getElementById('telDist').textContent = (pos.dist || 0).toFixed(0) + ' km';
+ const telLat = document.getElementById('telLat');
+ const telLon = document.getElementById('telLon');
+ const telAlt = document.getElementById('telAlt');
+ const telEl = document.getElementById('telEl');
+ const telAz = document.getElementById('telAz');
+ const telDist = document.getElementById('telDist');
+
+ if (telLat) telLat.textContent = Number.isFinite(pos.lat) ? pos.lat.toFixed(4) + '°' : '---.----';
+ if (telLon) telLon.textContent = Number.isFinite(pos.lon) ? pos.lon.toFixed(4) + '°' : '---.----';
+ if (telAlt) telAlt.textContent = Number.isFinite(pos.alt) ? pos.alt.toFixed(0) + ' km' : '--- km';
+ if (telEl) telEl.textContent = Number.isFinite(pos.el) ? pos.el.toFixed(1) + '°' : '--.-';
+ if (telAz) telAz.textContent = Number.isFinite(pos.az) ? pos.az.toFixed(1) + '°' : '---.-';
+ if (telDist) telDist.textContent = Number.isFinite(pos.dist) ? pos.dist.toFixed(0) + ' km' : '---- km';
}
function updateCountdown() {