Skip to content

Commit abf71d6

Browse files
committed
Ny funksjon: ISS «hvor er den nå» — live retning/høyde mot romstasjonen (cache v25)
1 parent 76760b6 commit abf71d6

3 files changed

Lines changed: 100 additions & 1 deletion

File tree

index.html

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,22 @@
280280
.ctrl-row{grid-template-columns:1fr 1fr}
281281
.ctrl-row > button{grid-column:span 1}
282282
}
283+
284+
/* ISS / romstasjonen */
285+
.iss-card{background:linear-gradient(180deg,rgba(111,216,224,.07),rgba(111,216,224,.02));border:1px solid rgba(111,216,224,.22);border-radius:12px;padding:13px 16px;margin-bottom:14px}
286+
.iss-head{display:flex;align-items:center;gap:8px;font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--cyan);margin-bottom:8px}
287+
.iss-refresh{margin-left:auto;background:none;border:1px solid var(--line-strong);color:var(--ink-faint);border-radius:7px;padding:3px 9px;cursor:pointer;font-family:'Outfit',sans-serif;font-size:.78rem;letter-spacing:0;text-transform:none}
288+
.iss-refresh:hover{border-color:var(--cyan);color:var(--cyan)}
289+
.iss-body{font-size:.92rem;color:var(--ink);line-height:1.5}
290+
.iss-big{font-family:'Fraunces',serif;font-size:1.04rem}
291+
.iss-dir{color:var(--cyan);font-family:'JetBrains Mono',monospace;border-bottom:1px dashed rgba(111,216,224,.45);cursor:pointer;padding-bottom:1px;white-space:nowrap}
292+
.iss-dir:hover{color:var(--gold)}
293+
.iss-sub{font-size:.82rem;color:var(--ink-soft);margin-top:5px}
294+
.iss-vis{font-size:.84rem;margin-top:6px;font-weight:500}
295+
.iss-vis.yes{color:var(--green)}
296+
.iss-vis.no{color:var(--ink-faint)}
297+
.iss-muted{color:var(--ink-soft)}
298+
.iss-loading{color:var(--ink-faint);font-style:italic}
283299
</style>
284300
</head>
285301
<body>
@@ -346,6 +362,7 @@ <h1>Himmelen <em>i dag</em></h1>
346362
<div id="darkness-timeline"></div>
347363
<div id="weather-box"></div>
348364
<div id="events-box"></div>
365+
<div id="iss-box"></div>
349366
<div id="moon-warn"></div>
350367
<div class="log-count" id="log-count"></div>
351368

@@ -1189,9 +1206,54 @@ <h3>Aldri se på solen gjennom kikkerten</h3>
11891206
}
11901207
});
11911208

1209+
// ---- ISS / romstasjonen (live «hvor er den nå») ----
1210+
var issTimer = null;
1211+
function issShell(inner){
1212+
return '<div class="iss-card"><div class="iss-head"><span>🛰️ Romstasjonen (ISS)</span>'+
1213+
'<button class="iss-refresh" id="iss-refresh">🔄 Oppdater</button></div>'+
1214+
'<div class="iss-body" id="iss-body">'+inner+'</div></div>';
1215+
}
1216+
function issWire(){
1217+
var rb = document.getElementById('iss-refresh');
1218+
if (rb) rb.addEventListener('click', function(){ renderISS(true); });
1219+
var d = document.querySelector('#iss-body .iss-dir');
1220+
if (d) d.addEventListener('click', function(){ openCompassModal(parseFloat(this.getAttribute('data-az')), 'ISS 🛰️'); });
1221+
}
1222+
function renderISS(force){
1223+
var box = document.getElementById('iss-box'); if(!box) return;
1224+
if (issTimer){ clearTimeout(issTimer); issTimer = null; }
1225+
if (force || !box.firstChild){ box.innerHTML = issShell('<span class="iss-loading">Henter ISS-posisjon …</span>'); issWire(); }
1226+
var atLat = lat, atLon = lon;
1227+
fetchISS().then(function(d){
1228+
var la = lookAngle(atLat, atLon, d.lat, d.lon, d.altKm);
1229+
var az = intc(la.az), inner;
1230+
if (la.alt >= 0){
1231+
var now = new Date();
1232+
var sa = altAz(sunPos(now).ra, sunPos(now).dec, now, atLat, atLon).alt;
1233+
var vis, visCls;
1234+
if (!d.sunlit){ vis = '🌑 I jordas skygge nå — over horisonten, men ikke solbelyst (usynlig).'; visCls='no'; }
1235+
else if (sa >= -6){ vis = '☀ For lyst ute ennå — over horisonten, men himmelen er for lys.'; visCls='no'; }
1236+
else { vis = '✨ Synlig nå! Se etter en rask, jevn lysprikk — ingen blink.'; visCls='yes'; }
1237+
inner =
1238+
'<div class="iss-big">Over horisonten — <span class="iss-dir" data-az="'+la.az+'" title="Trykk for kompass">se mot '+compassSimple(la.az)+' · '+az+'°</span></div>'+
1239+
'<div class="iss-sub"><b>'+intc(la.alt)+'°</b> over horisonten · ca. '+intc(la.rangeKm)+' km unna</div>'+
1240+
'<div class="iss-vis '+visCls+'">'+vis+'</div>';
1241+
} else {
1242+
inner = '<div class="iss-big iss-muted">Under horisonten nå ('+intc(la.alt)+'°)</div>'+
1243+
'<div class="iss-sub">Ikke synlig herfra akkurat nå. ISS runder jorda på ~90 min — trykk 🔄 senere.</div>';
1244+
}
1245+
box.innerHTML = issShell(inner); issWire();
1246+
// Live-oppdatering kun under en pågående passering (den flytter seg fort); ellers ikke poll.
1247+
if (la.alt >= 0 && !document.hidden) issTimer = setTimeout(function(){ renderISS(false); }, 5000);
1248+
}).catch(function(){
1249+
box.innerHTML = issShell('<span class="iss-muted">Fikk ikke ISS-data (offline?). Trykk 🔄 for å prøve igjen.</span>'); issWire();
1250+
});
1251+
}
1252+
11921253
initNightMode();
11931254
initInstall();
11941255
render();
1256+
renderISS(true);
11951257
})();
11961258
</script>
11971259
<script>if("serviceWorker" in navigator){window.addEventListener("load",function(){navigator.serviceWorker.register("sw.js").catch(function(){});});}</script>

shared.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,43 @@ function compassSimple(az) {
10281028
var d = ['Nord','Nordøst','Øst','Sørøst','Sør','Sørvest','Vest','Nordvest'];
10291029
return d[Math.round(az/45) % 8];
10301030
}
1031+
1032+
// ================================================================
1033+
// SATELLITT — Den internasjonale romstasjonen (ISS)
1034+
// «Hvor er den nå»: henter ISS' subpunkt live (åpent API, åpen CORS,
1035+
// ingen nøkkel) og regner ut retning + høyde fra observatøren.
1036+
// Ikke passeringsvarsel — krever nett (ingen offline-cache).
1037+
// ================================================================
1038+
function fetchISS() {
1039+
return fetch('https://api.wheretheiss.at/v1/satellites/25544').then(function(r){
1040+
if (!r.ok) throw new Error('ISS-data utilgjengelig');
1041+
return r.json();
1042+
}).then(function(d){
1043+
return { lat:d.latitude, lon:d.longitude, altKm:d.altitude,
1044+
sunlit:(d.visibility === 'daylight'), ts:d.timestamp };
1045+
});
1046+
}
1047+
1048+
// Topo-sentrisk retning (azimut/høyde) fra observatør til et punkt over jorda.
1049+
// Sfærisk jord (R=6371 km); rikelig presist for «se-den-veien». Returnerer
1050+
// {az: grader fra nord med klokka, alt: grader over horisont, rangeKm}.
1051+
function lookAngle(obsLat, obsLon, satLat, satLon, satAltKm) {
1052+
var R = 6371;
1053+
var oLat = deg2rad(obsLat), oLon = deg2rad(obsLon);
1054+
var sLat = deg2rad(satLat), sLon = deg2rad(satLon);
1055+
var co = Math.cos(oLat), so = Math.sin(oLat);
1056+
var ox = R*co*Math.cos(oLon), oy = R*co*Math.sin(oLon), oz = R*so;
1057+
var rs = R + satAltKm, cs = Math.cos(sLat);
1058+
var sx = rs*cs*Math.cos(sLon), sy = rs*cs*Math.sin(sLon), sz = rs*Math.sin(sLat);
1059+
var dx = sx-ox, dy = sy-oy, dz = sz-oz;
1060+
var slon = Math.sin(oLon), clon = Math.cos(oLon);
1061+
var e = -slon*dx + clon*dy;
1062+
var n = -so*clon*dx - so*slon*dy + co*dz;
1063+
var u = co*clon*dx + co*slon*dy + so*dz;
1064+
var range = Math.sqrt(dx*dx + dy*dy + dz*dz);
1065+
var sinAlt = Math.max(-1, Math.min(1, u/range)); // klamre mot flyttalls-overskuddsfeil → ingen NaN
1066+
return { az: norm360(rad2deg(Math.atan2(e, n))), alt: rad2deg(Math.asin(sinAlt)), rangeKm: range };
1067+
}
10311068
function fmtTime(d) {
10321069
var h=d.getHours(), m=d.getMinutes();
10331070
return (h<10?'0':'')+h+':'+(m<10?'0':'')+m;

sw.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Stjernekikkert service worker (PERF-3) — offline-støtte.
22
// Cache-first for app-skall; nett-fallback for alt annet (f.eks. vær-API senere).
3-
var CACHE = 'stjernekikkert-v24';
3+
var CACHE = 'stjernekikkert-v25';
44
var ASSETS = [
55
'index.html',
66
'objekter.html',

0 commit comments

Comments
 (0)