gnss-js 1.21.0 → 1.23.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.
@@ -1,3 +1,11 @@
1
+ import {
2
+ BdsAssembler,
3
+ GalInavAssembler,
4
+ GloStringAssembler,
5
+ bdsSubframeParityOk,
6
+ galInavPageCrcOk,
7
+ testGloString
8
+ } from "./chunk-VTX3VCL4.js";
1
9
  import {
2
10
  CnavAssembler,
3
11
  cnavCrcOk,
@@ -180,8 +188,108 @@ function parseUbxCnav(data) {
180
188
  return { ephemerides, badCrc, messages };
181
189
  }
182
190
 
183
- // src/ubx/index.ts
191
+ // src/ubx/rawnav.ts
184
192
  var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
193
+ var SEC_PER_WEEK = 7 * 86400;
194
+ var two = (n) => String(n).padStart(2, "0");
195
+ function parseUbxRawNav(data, opts = {}) {
196
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
197
+ const ephemerides = [];
198
+ const counts = { gal: 0, bds: 0, glo: 0 };
199
+ let badParity = 0;
200
+ const inav = new GalInavAssembler();
201
+ const bds = new BdsAssembler();
202
+ const glo = new GloStringAssembler();
203
+ let refDate = null;
204
+ for (const f of ubxFrames(data)) {
205
+ if (f.msgClass !== 2) continue;
206
+ if (f.msgId === 21 && f.payload.length >= 16) {
207
+ const rcvTow = view.getFloat64(f.payloadStart, true);
208
+ let week = view.getUint16(f.payloadStart + 8, true);
209
+ if (week === 0 && opts.refWeek !== void 0) week = opts.refWeek;
210
+ if (week > 0) {
211
+ refDate = new Date(
212
+ GPS_EPOCH_MS + (week * SEC_PER_WEEK + rcvTow) * 1e3
213
+ );
214
+ }
215
+ continue;
216
+ }
217
+ if (f.msgId !== 19) continue;
218
+ const p = f.payload;
219
+ if (p.length < 8) continue;
220
+ const gnssId = p[0];
221
+ const svId = p[1];
222
+ const sigId = p[2];
223
+ const base = f.payloadStart + 8;
224
+ if (gnssId === 2) {
225
+ if (sigId === 3 || sigId === 8) continue;
226
+ if (p.length < 8 + 32) continue;
227
+ counts.gal++;
228
+ if (svId < 1 || svId > 36) continue;
229
+ const buff = new Uint8Array(32);
230
+ for (let k = 0; k < 8; k++) {
231
+ const w = view.getUint32(base + 4 * k, true);
232
+ buff[4 * k] = w >>> 24;
233
+ buff[4 * k + 1] = w >>> 16 & 255;
234
+ buff[4 * k + 2] = w >>> 8 & 255;
235
+ buff[4 * k + 3] = w & 255;
236
+ }
237
+ const page = new Uint8Array(30);
238
+ for (let k = 0; k < 14; k++) page[k] = buff[k];
239
+ setBitU(page, 112, 2, getBitU(buff, 112, 2));
240
+ for (let k = 0; k < 15; k++) {
241
+ setBitU(page, 114 + 8 * k, 8, getBitU(buff, 128 + 8 * k, 8));
242
+ }
243
+ if (getBitU(page, 0, 1) !== 0 || getBitU(page, 114, 1) !== 1) continue;
244
+ if (getBitU(page, 1, 1) === 1 || getBitU(page, 115, 1) === 1) continue;
245
+ if (!galInavPageCrcOk(page)) {
246
+ badParity++;
247
+ continue;
248
+ }
249
+ const eph = inav.push(svId, page);
250
+ if (eph) ephemerides.push(eph);
251
+ } else if (gnssId === 3) {
252
+ if (sigId === 6 || sigId === 8) continue;
253
+ if (p.length < 8 + 40) continue;
254
+ counts.bds++;
255
+ if (svId < 1 || svId > 63) continue;
256
+ const sf = new Uint8Array(38);
257
+ for (let k = 0; k < 10; k++) {
258
+ const w = view.getUint32(base + 4 * k, true);
259
+ setBitU(sf, 30 * k, 30, w & 1073741823);
260
+ }
261
+ if (!bdsSubframeParityOk(sf)) {
262
+ badParity++;
263
+ continue;
264
+ }
265
+ const eph = bds.push(`C${two(svId)}`, sf);
266
+ if (eph) ephemerides.push(eph);
267
+ } else if (gnssId === 6) {
268
+ if (p.length < 8 + 16) continue;
269
+ counts.glo++;
270
+ if (svId < 1 || svId > 32) continue;
271
+ const str = new Uint8Array(16);
272
+ for (let k = 0; k < 4; k++) {
273
+ const w = view.getUint32(base + 4 * k, true);
274
+ str[4 * k] = w >>> 24;
275
+ str[4 * k + 1] = w >>> 16 & 255;
276
+ str[4 * k + 2] = w >>> 8 & 255;
277
+ str[4 * k + 3] = w & 255;
278
+ }
279
+ if (!testGloString(str)) {
280
+ badParity++;
281
+ continue;
282
+ }
283
+ if (!refDate) continue;
284
+ const eph = glo.push(`R${two(svId)}`, str, refDate, p[3] - 7);
285
+ if (eph) ephemerides.push(eph);
286
+ }
287
+ }
288
+ return { ephemerides, counts, badParity };
289
+ }
290
+
291
+ // src/ubx/index.ts
292
+ var GPS_EPOCH_MS2 = Date.UTC(1980, 0, 6);
185
293
  var MS_PER_WEEK = 7 * 864e5;
186
294
  var SIGNALS = {
187
295
  0: { 0: ["G", "1C"], 3: ["G", "2X"], 4: ["G", "2X"] },
@@ -198,20 +306,20 @@ var SIGNALS = {
198
306
  // GLONASS L1OF, L2OF
199
307
  };
200
308
  function prnFor(gnssId, svId) {
201
- const two = (n) => String(n).padStart(2, "0");
309
+ const two2 = (n) => String(n).padStart(2, "0");
202
310
  switch (gnssId) {
203
311
  case 0:
204
- return svId >= 1 && svId <= 32 ? `G${two(svId)}` : null;
312
+ return svId >= 1 && svId <= 32 ? `G${two2(svId)}` : null;
205
313
  case 1:
206
- return svId >= 120 && svId <= 158 ? `S${two(svId - 100)}` : null;
314
+ return svId >= 120 && svId <= 158 ? `S${two2(svId - 100)}` : null;
207
315
  case 2:
208
- return svId >= 1 && svId <= 36 ? `E${two(svId)}` : null;
316
+ return svId >= 1 && svId <= 36 ? `E${two2(svId)}` : null;
209
317
  case 3:
210
- return svId >= 1 && svId <= 63 ? `C${two(svId)}` : null;
318
+ return svId >= 1 && svId <= 63 ? `C${two2(svId)}` : null;
211
319
  case 5:
212
- return svId >= 1 && svId <= 10 ? `J${two(svId)}` : null;
320
+ return svId >= 1 && svId <= 10 ? `J${two2(svId)}` : null;
213
321
  case 6:
214
- return svId >= 1 && svId <= 32 ? `R${two(svId)}` : null;
322
+ return svId >= 1 && svId <= 32 ? `R${two2(svId)}` : null;
215
323
  default:
216
324
  return null;
217
325
  }
@@ -264,7 +372,7 @@ function parseUbxRawx(data) {
264
372
  if (!codes.includes(sig[1])) codes.push(sig[1]);
265
373
  }
266
374
  epochs.push({
267
- timeMs: GPS_EPOCH_MS + week * MS_PER_WEEK + Math.round(rcvTow * 1e3),
375
+ timeMs: GPS_EPOCH_MS2 + week * MS_PER_WEEK + Math.round(rcvTow * 1e3),
268
376
  leapS: leapValid ? leapS : null,
269
377
  meas
270
378
  });
@@ -278,5 +386,6 @@ export {
278
386
  parseUbxNav,
279
387
  parseUbxIonoUtc,
280
388
  parseUbxCnav,
389
+ parseUbxRawNav,
281
390
  parseUbxRawx
282
391
  };
@@ -192,8 +192,7 @@ var GM_GPS2 = 3986005e8;
192
192
  var GM_GAL2 = 3986004418e5;
193
193
  var GM_BDS2 = 3986004418e5;
194
194
  var GM_GLO = 39860044e7;
195
- var BDS_GEO_MAX_INCLINATION_RAD = 0.1;
196
- var BDS_GEO_MIN_SEMIMAJOR_AXIS_M = 4e7;
195
+ var BDS_GEO_PRNS2 = /* @__PURE__ */ new Set([1, 2, 3, 4, 5, 59, 60, 61, 62, 63]);
197
196
  var AE_GLO = 6378136;
198
197
  var J2_GLO = 108263e-8;
199
198
  var TWO_PI = 2 * Math.PI;
@@ -240,7 +239,7 @@ function keplerPosition(eph, t) {
240
239
  const yp = rk * Math.sin(uk);
241
240
  const xpDot = drkDot * Math.cos(uk) - rk * ukDot * Math.sin(uk);
242
241
  const ypDot = drkDot * Math.sin(uk) + rk * ukDot * Math.cos(uk);
243
- const isBdsGeo = eph.system === "C" && Math.abs(eph.i0) < BDS_GEO_MAX_INCLINATION_RAD && a > BDS_GEO_MIN_SEMIMAJOR_AXIS_M;
242
+ const isBdsGeo = eph.system === "C" && BDS_GEO_PRNS2.has(Number(eph.prn.slice(1)));
244
243
  if (isBdsGeo) {
245
244
  const omegak2 = eph.omega0 + eph.omegaDot * tk - OMEGA_E * eph.toe;
246
245
  const cosO2 = Math.cos(omegak2);