gnss-js 1.18.0 → 1.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/{chunk-2IM5VXNI.js → chunk-7RKLWE6R.js} +23 -2
  2. package/dist/{chunk-QXZZNXE3.js → chunk-B5LU4746.js} +1 -1
  3. package/dist/{chunk-FEGLXNWA.js → chunk-DLXTTHRK.js} +2 -4
  4. package/dist/{chunk-OMVL3X7V.js → chunk-JNFV5BYB.js} +186 -8
  5. package/dist/{chunk-HXF7XVW7.js → chunk-NOQAAUGY.js} +297 -11
  6. package/dist/{chunk-CG7SF45F.js → chunk-VJEPOC76.js} +908 -14
  7. package/dist/{chunk-Y5IWUPJQ.js → chunk-WZDFZ76K.js} +151 -8
  8. package/dist/index.cjs +3283 -1908
  9. package/dist/index.d.cts +5 -5
  10. package/dist/index.d.ts +5 -5
  11. package/dist/index.js +25 -8
  12. package/dist/nav-BYmYoh9A.d.cts +137 -0
  13. package/dist/nav-CN8rxL4h.d.ts +137 -0
  14. package/dist/nav-DImXUdbp.d.cts +223 -0
  15. package/dist/nav-DImXUdbp.d.ts +223 -0
  16. package/dist/novatel.cjs +230 -15
  17. package/dist/novatel.d.cts +8 -1
  18. package/dist/novatel.d.ts +8 -1
  19. package/dist/novatel.js +2 -2
  20. package/dist/orbit.cjs +190 -8
  21. package/dist/orbit.d.cts +91 -2
  22. package/dist/orbit.d.ts +91 -2
  23. package/dist/orbit.js +9 -1
  24. package/dist/positioning.d.cts +2 -1
  25. package/dist/positioning.d.ts +2 -1
  26. package/dist/positioning.js +2 -2
  27. package/dist/rinex.cjs +304 -11
  28. package/dist/rinex.d.cts +45 -3
  29. package/dist/rinex.d.ts +45 -3
  30. package/dist/rinex.js +6 -1
  31. package/dist/sbf.cjs +908 -11
  32. package/dist/sbf.d.cts +114 -137
  33. package/dist/sbf.d.ts +114 -137
  34. package/dist/sbf.js +8 -3
  35. package/dist/ubx.d.cts +1 -2
  36. package/dist/ubx.d.ts +1 -2
  37. package/dist/ubx.js +2 -3
  38. package/package.json +1 -1
  39. package/dist/chunk-IQ5OIMQD.js +0 -148
  40. package/dist/cnav-CRns0ECn.d.cts +0 -96
  41. package/dist/cnav-CRns0ECn.d.ts +0 -96
  42. package/dist/nav-BAI1a9vK.d.cts +0 -108
  43. package/dist/nav-BAI1a9vK.d.ts +0 -108
@@ -1,6 +1,8 @@
1
1
  import {
2
+ CnavAssembler,
3
+ cnavCrcOk,
2
4
  decodeGpsLnavFrame
3
- } from "./chunk-IQ5OIMQD.js";
5
+ } from "./chunk-WZDFZ76K.js";
4
6
  import {
5
7
  getUtcDate
6
8
  } from "./chunk-HVXYFUCB.js";
@@ -51,6 +53,7 @@ function* oem4Frames(data, view, stats) {
51
53
 
52
54
  // src/novatel/nav.ts
53
55
  var ID_IONUTC = 8;
56
+ var ID_RAWCNAVFRAME = 1066;
54
57
  var ID_RAWEPHEM = 41;
55
58
  var ID_GLOEPHEMERIS = 723;
56
59
  var ID_GALEPHEMERIS = 1122;
@@ -257,6 +260,9 @@ function parseNovatelNav(data) {
257
260
  const ephemerides = [];
258
261
  const ionoCorrections = {};
259
262
  let leapSeconds = null;
263
+ const cnav = [];
264
+ const cnavAssembler = new CnavAssembler();
265
+ let cnavBadCrc = 0;
260
266
  const lastKep = /* @__PURE__ */ new Map();
261
267
  const lastGlo = /* @__PURE__ */ new Map();
262
268
  const pushKepler = (key, eph) => {
@@ -287,6 +293,14 @@ function parseNovatelNav(data) {
287
293
  } else if (frame.id === ID_QZSSEPHEMERIS && frame.msgLen >= 204) {
288
294
  const eph = decodeGpsQzssEphemeris(view, frame.payload, "J");
289
295
  if (eph) pushKepler(eph.prn, eph);
296
+ } else if (frame.id === ID_RAWCNAVFRAME && frame.msgLen >= 50) {
297
+ const msg = data.subarray(frame.payload + 12, frame.payload + 50);
298
+ if (!cnavCrcOk(msg)) {
299
+ cnavBadCrc++;
300
+ } else {
301
+ const eph = cnavAssembler.push(msg);
302
+ if (eph) cnav.push(eph);
303
+ }
290
304
  } else if (frame.id === ID_IONUTC && frame.msgLen >= 108) {
291
305
  const p = frame.payload;
292
306
  const alpha = [];
@@ -309,7 +323,14 @@ function parseNovatelNav(data) {
309
323
  ephemerides.push(eph);
310
324
  }
311
325
  }
312
- return { ephemerides, ionoCorrections, leapSeconds, badCrc: stats.badCrc };
326
+ return {
327
+ ephemerides,
328
+ ionoCorrections,
329
+ leapSeconds,
330
+ cnav,
331
+ cnavBadCrc,
332
+ badCrc: stats.badCrc
333
+ };
313
334
  }
314
335
 
315
336
  // src/novatel/index.ts
@@ -2,7 +2,7 @@ import {
2
2
  computeDop,
3
3
  computeSatPosition,
4
4
  ecefToAzEl
5
- } from "./chunk-OMVL3X7V.js";
5
+ } from "./chunk-JNFV5BYB.js";
6
6
  import {
7
7
  ecefToGeodetic
8
8
  } from "./chunk-37QNKGTC.js";
@@ -1,13 +1,11 @@
1
1
  import {
2
2
  CnavAssembler,
3
- cnavCrcOk
4
- } from "./chunk-Y5IWUPJQ.js";
5
- import {
3
+ cnavCrcOk,
6
4
  decodeGpsLnavFrame,
7
5
  getBitS,
8
6
  getBitU,
9
7
  setBitU
10
- } from "./chunk-IQ5OIMQD.js";
8
+ } from "./chunk-WZDFZ76K.js";
11
9
 
12
10
  // src/ubx/frame.ts
13
11
  function* ubxFrames(data, stats = { badChecksums: 0 }) {
@@ -13,10 +13,184 @@ import {
13
13
  OMEGA_E
14
14
  } from "./chunk-FIEWO4J4.js";
15
15
 
16
- // src/orbit/index.ts
16
+ // src/orbit/almanac.ts
17
17
  var GM_GPS = 3986005e8;
18
18
  var GM_GAL = 3986004418e5;
19
19
  var GM_BDS = 3986004418e5;
20
+ var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
21
+ var BDT_EPOCH_MS = Date.UTC(2006, 0, 1);
22
+ var WEEK_MS = 6048e5;
23
+ var BDT_MINUS_GPST_MS = 14e3;
24
+ var BDS_GEO_PRNS = /* @__PURE__ */ new Set([1, 2, 3, 4, 5, 59, 60, 61, 62, 63]);
25
+ function almanacEpochMs(alm) {
26
+ if (alm.system === "C") {
27
+ return BDT_EPOCH_MS + alm.weekAlm * WEEK_MS + alm.toaSec * 1e3 + BDT_MINUS_GPST_MS;
28
+ }
29
+ return GPS_EPOCH_MS + alm.weekAlm * WEEK_MS + alm.toaSec * 1e3;
30
+ }
31
+ function almanacSatPosition(alm, timeMs) {
32
+ const GM = alm.system === "E" ? GM_GAL : alm.system === "C" ? GM_BDS : GM_GPS;
33
+ const a = alm.sqrtA * alm.sqrtA;
34
+ const n0 = Math.sqrt(GM / (a * a * a));
35
+ const tk = (timeMs - almanacEpochMs(alm)) / 1e3;
36
+ const Mk = alm.m0 + n0 * tk;
37
+ let Ek = Mk;
38
+ for (let i = 0; i < 12; i++) {
39
+ const dE = (Mk - (Ek - alm.e * Math.sin(Ek))) / (1 - alm.e * Math.cos(Ek));
40
+ Ek += dE;
41
+ if (Math.abs(dE) < 1e-12) break;
42
+ }
43
+ const sinE = Math.sin(Ek);
44
+ const cosE = Math.cos(Ek);
45
+ const vk = Math.atan2(Math.sqrt(1 - alm.e * alm.e) * sinE, cosE - alm.e);
46
+ const uk = vk + alm.omega;
47
+ const rk = a * (1 - alm.e * cosE);
48
+ const ik = alm.i0OrDeltaI;
49
+ const xp = rk * Math.cos(uk);
50
+ const yp = rk * Math.sin(uk);
51
+ const clockBias = alm.af0 + alm.af1 * tk;
52
+ const isGeo = alm.system === "C" && BDS_GEO_PRNS.has(Number(alm.prn.slice(1)));
53
+ if (isGeo) {
54
+ const omegak2 = alm.omega0 + alm.omegaDot * tk - OMEGA_E * alm.toaSec;
55
+ const cosO2 = Math.cos(omegak2);
56
+ const sinO2 = Math.sin(omegak2);
57
+ const cosI2 = Math.cos(ik);
58
+ const sinI2 = Math.sin(ik);
59
+ const xg = xp * cosO2 - yp * cosI2 * sinO2;
60
+ const yg = xp * sinO2 + yp * cosI2 * cosO2;
61
+ const zg = yp * sinI2;
62
+ const phi = OMEGA_E * tk;
63
+ const cosPhi = Math.cos(phi);
64
+ const sinPhi = Math.sin(phi);
65
+ const COS5 = Math.cos(-5 * Math.PI / 180);
66
+ const SIN5 = Math.sin(-5 * Math.PI / 180);
67
+ return {
68
+ prn: alm.prn,
69
+ x: xg * cosPhi + yg * sinPhi * COS5 + zg * sinPhi * SIN5,
70
+ y: -xg * sinPhi + yg * cosPhi * COS5 + zg * cosPhi * SIN5,
71
+ z: -yg * SIN5 + zg * COS5,
72
+ clockBias
73
+ };
74
+ }
75
+ const omegak = alm.omega0 + (alm.omegaDot - OMEGA_E) * tk - OMEGA_E * alm.toaSec;
76
+ const cosO = Math.cos(omegak);
77
+ const sinO = Math.sin(omegak);
78
+ const cosI = Math.cos(ik);
79
+ const sinI = Math.sin(ik);
80
+ return {
81
+ prn: alm.prn,
82
+ x: xp * cosO - yp * cosI * sinO,
83
+ y: xp * sinO + yp * cosI * cosO,
84
+ z: yp * sinI,
85
+ clockBias
86
+ };
87
+ }
88
+
89
+ // src/orbit/almanac-glo.ts
90
+ var C20 = -108263e-8;
91
+ var J = -1.5 * C20;
92
+ var AE = 6378.136;
93
+ var MU = 398600.44;
94
+ var OMEGA_Z = 7292115e-11;
95
+ var I_MEAN = 63 * Math.PI / 180;
96
+ var T_MEAN = 43200;
97
+ var GLO_1996_UTC_MS = Date.UTC(1996, 0, 1) - 108e5;
98
+ var DAY_MS = 864e5;
99
+ var FOUR_YEARS_DAYS = 1461;
100
+ function glonassAlmanacEpochMs(alm) {
101
+ const utcMs = GLO_1996_UTC_MS + ((alm.n4 - 1) * FOUR_YEARS_DAYS + (alm.nDay - 1)) * DAY_MS + alm.tLambda * 1e3;
102
+ return utcMs + getGpsLeap(new Date(utcMs)) * 1e3;
103
+ }
104
+ function c20Deltas(lam, tau, B, h, l, n, sinI, cosI) {
105
+ const sin2i = sinI * sinI;
106
+ const cos2i = cosI * cosI;
107
+ const s1 = Math.sin(lam);
108
+ const c1 = Math.cos(lam);
109
+ const s2 = Math.sin(2 * lam);
110
+ const c2 = Math.cos(2 * lam);
111
+ const s3 = Math.sin(3 * lam);
112
+ const c3 = Math.cos(3 * lam);
113
+ const s4 = Math.sin(4 * lam);
114
+ const c4 = Math.cos(4 * lam);
115
+ const daOverA = 2 * B * (1 - 1.5 * sin2i) * (l * c1 + h * s1) + B * sin2i * (0.5 * h * s1 - 0.5 * l * c1 + c2 + 3.5 * l * c3 + 3.5 * h * s3);
116
+ const dh = B * (1 - 1.5 * sin2i) * (l * n * tau + s1 + 1.5 * l * s2 - 1.5 * h * c2) - 0.25 * B * sin2i * (s1 - 7 / 3 * s3 + 5 * l * s2 - 8.5 * l * s4 + 8.5 * h * c4 + h * c2) + B * cos2i * (l * n * tau - 0.5 * l * s2);
117
+ const dl = B * (1 - 1.5 * sin2i) * (-h * n * tau + c1 + 1.5 * l * c2 + 1.5 * h * s2) - 0.25 * B * sin2i * (-c1 - 7 / 3 * c3 - 5 * h * s2 - 8.5 * l * c4 - 8.5 * h * s4 + l * c2) + B * cos2i * (-h * n * tau + 0.5 * h * s2);
118
+ const nodeBracket = n * tau + 3.5 * l * s1 - 2.5 * h * c1 - 0.5 * s2 - 7 / 6 * l * s3 + 7 / 6 * h * c3;
119
+ const dOmega = -B * cosI * nodeBracket;
120
+ const di = 0.5 * B * sinI * cosI * (-l * c1 + h * s1 + c2 + 7 / 3 * l * c3 + 7 / 3 * h * s3);
121
+ const dLambda = 2 * B * (1 - 1.5 * sin2i) * (n * tau + 1.75 * l * s1 - 1.75 * h * c1) + 3 * B * sin2i * (-(7 / 24) * h * c1 - 7 / 24 * l * s1 - 49 / 72 * h * c3 + 49 / 72 * l * s3 + 0.25 * s2) + B * cos2i * nodeBracket;
122
+ return { daOverA, dh, dl, dOmega, di, dLambda };
123
+ }
124
+ function glonassAlmanacPosition(alm, timeMs) {
125
+ const i = I_MEAN + alm.deltaI;
126
+ const sinI = Math.sin(i);
127
+ const cosI = Math.cos(i);
128
+ const sin2i = sinI * sinI;
129
+ const e = alm.epsilon;
130
+ const oneMinusE2 = 1 - e * e;
131
+ const Tdr = T_MEAN + alm.deltaT;
132
+ const n = 2 * Math.PI / Tdr;
133
+ const cosW = Math.cos(alm.omega);
134
+ let a = Math.cbrt((Tdr / (2 * Math.PI)) ** 2 * MU);
135
+ for (let k = 0; k < 10; k++) {
136
+ const p = a * oneMinusE2;
137
+ const tOsc = Tdr / (1 + 1.5 * C20 * (AE / p) ** 2 * ((2 - 2.5 * sin2i) * (Math.pow(oneMinusE2, 1.5) / (1 + e * cosW) ** 2) + (1 + e * cosW) ** 3 / oneMinusE2));
138
+ const aNext = Math.cbrt((tOsc / (2 * Math.PI)) ** 2 * MU);
139
+ const converged = Math.abs(aNext - a) < 1e-3;
140
+ a = aNext;
141
+ if (converged) break;
142
+ }
143
+ const tStar = (timeMs - glonassAlmanacEpochMs(alm)) / 1e3;
144
+ const W = Math.floor(tStar / Tdr);
145
+ const nodeShift = Tdr * W + alm.deltaTDot * W * W;
146
+ const omegaDot = 1.5 * C20 * n * (AE / a) ** 2 * cosI * oneMinusE2 ** -2;
147
+ const lambdaK = alm.lambda + (omegaDot - OMEGA_Z) * nodeShift;
148
+ const tau = tStar - nodeShift;
149
+ const h = e * Math.sin(alm.omega);
150
+ const l = e * cosW;
151
+ const E0 = 2 * Math.atan(Math.sqrt((1 - e) / (1 + e)) * Math.tan(-alm.omega / 2));
152
+ const M = E0 - e * Math.sin(E0);
153
+ const B = J * (AE / a) ** 2;
154
+ const d1 = c20Deltas(M + alm.omega, 0, B, h, l, n, sinI, cosI);
155
+ const d2 = c20Deltas(M + alm.omega + n * tau, tau, B, h, l, n, sinI, cosI);
156
+ const hi = h + (d2.dh - d1.dh);
157
+ const li = l + (d2.dl - d1.dl);
158
+ const epsI = Math.hypot(hi, li);
159
+ const omegaI = epsI === 0 ? 0 : Math.atan2(hi, li);
160
+ const aI = a + a * (d2.daOverA - d1.daOverA);
161
+ const iI = i + (d2.di - d1.di);
162
+ const omegaG = lambdaK + (d2.dOmega - d1.dOmega) - OMEGA_Z * tau;
163
+ const lambdaStar = M + alm.omega + n * tau + (d2.dLambda - d1.dLambda);
164
+ const Mi = lambdaStar - omegaI;
165
+ let E = Mi;
166
+ for (let k = 0; k < 30; k++) {
167
+ const next = Mi + epsI * Math.sin(E);
168
+ const converged = Math.abs(next - E) < 1e-12;
169
+ E = next;
170
+ if (converged) break;
171
+ }
172
+ const v = 2 * Math.atan(Math.sqrt((1 + epsI) / (1 - epsI)) * Math.tan(E / 2));
173
+ const u = v + omegaI;
174
+ const rKm = aI * (1 - epsI * Math.cos(E));
175
+ const cosU = Math.cos(u);
176
+ const sinU = Math.sin(u);
177
+ const cosO = Math.cos(omegaG);
178
+ const sinO = Math.sin(omegaG);
179
+ const cosIi = Math.cos(iI);
180
+ const sinIi = Math.sin(iI);
181
+ return {
182
+ prn: alm.prn,
183
+ x: 1e3 * rKm * (cosU * cosO - sinU * sinO * cosIi),
184
+ y: 1e3 * rKm * (cosU * sinO + sinU * cosO * cosIi),
185
+ z: 1e3 * rKm * sinU * sinIi,
186
+ clockBias: -alm.tau
187
+ };
188
+ }
189
+
190
+ // src/orbit/index.ts
191
+ var GM_GPS2 = 3986005e8;
192
+ var GM_GAL2 = 3986004418e5;
193
+ var GM_BDS2 = 3986004418e5;
20
194
  var GM_GLO = 39860044e7;
21
195
  var BDS_GEO_MAX_INCLINATION_RAD = 0.1;
22
196
  var BDS_GEO_MIN_SEMIMAJOR_AXIS_M = 4e7;
@@ -24,9 +198,9 @@ var AE_GLO = 6378136;
24
198
  var J2_GLO = 108263e-8;
25
199
  var TWO_PI = 2 * Math.PI;
26
200
  function gmForSystem(sys) {
27
- if (sys === "E") return GM_GAL;
28
- if (sys === "C") return GM_BDS;
29
- return GM_GPS;
201
+ if (sys === "E") return GM_GAL2;
202
+ if (sys === "C") return GM_BDS2;
203
+ return GM_GPS2;
30
204
  }
31
205
  var geoVelocityPass = false;
32
206
  function keplerPosition(eph, t) {
@@ -362,10 +536,10 @@ function selectBest(ephs, timeMs) {
362
536
  }
363
537
  return best;
364
538
  }
365
- var GPS_EPOCH_MS = START_GPS_TIME.getTime();
539
+ var GPS_EPOCH_MS2 = START_GPS_TIME.getTime();
366
540
  var MS_PER_WEEK = 7 * 864e5;
367
541
  var BDS_EPOCH_MS = START_BDS_TIME.getTime();
368
- var GAL_EPOCH_MS = GPS_EPOCH_MS + 1024 * MS_PER_WEEK;
542
+ var GAL_EPOCH_MS = GPS_EPOCH_MS2 + 1024 * MS_PER_WEEK;
369
543
  function ephInfoToEphemeris(info) {
370
544
  const sys = info.prn.charAt(0);
371
545
  if (sys === "R") {
@@ -416,8 +590,8 @@ function ephInfoToEphemeris(info) {
416
590
  } else if (sys === "E") {
417
591
  epochMs = GAL_EPOCH_MS;
418
592
  } else {
419
- epochMs = GPS_EPOCH_MS;
420
- const weeksNow = (info.lastReceived - GPS_EPOCH_MS) / MS_PER_WEEK;
593
+ epochMs = GPS_EPOCH_MS2;
594
+ const weeksNow = (info.lastReceived - GPS_EPOCH_MS2) / MS_PER_WEEK;
421
595
  week += 1024 * Math.round((weeksNow - week) / 1024);
422
596
  }
423
597
  const tocDate = new Date(epochMs + week * MS_PER_WEEK + tocSec * 1e3);
@@ -598,6 +772,10 @@ function computeVisibilityFromPositions(all, elevationMaskDeg = 10) {
598
772
  }
599
773
 
600
774
  export {
775
+ almanacEpochMs,
776
+ almanacSatPosition,
777
+ glonassAlmanacEpochMs,
778
+ glonassAlmanacPosition,
601
779
  keplerPosition,
602
780
  glonassPosition,
603
781
  rangeRate,