gnss-js 1.43.0 → 1.44.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.
@@ -3,11 +3,13 @@ import {
3
3
  GalInavAssembler,
4
4
  GloStringAssembler,
5
5
  bdsSubframeParityOk,
6
- decodeSbasGeoNav,
7
6
  galInavPageCrcOk,
8
- sbasCrcOk,
9
7
  testGloString
10
- } from "./chunk-QV3XGDUU.js";
8
+ } from "./chunk-FA2UTLEQ.js";
9
+ import {
10
+ decodeSbasGeoNav,
11
+ sbasCrcOk
12
+ } from "./chunk-ZIGMN3E5.js";
11
13
  import {
12
14
  CnavAssembler,
13
15
  cnavCrcOk
@@ -759,49 +759,6 @@ var GloStringAssembler = class {
759
759
  }
760
760
  };
761
761
 
762
- // src/navbits/sbas.ts
763
- var GPS_EPOCH_MS3 = Date.UTC(1980, 0, 6);
764
- var MS_PER_WEEK2 = 7 * 86400 * 1e3;
765
- var two2 = (n) => String(n).padStart(2, "0");
766
- var SBAS_MT_GEO_NAV = 9;
767
- function sbasMessageType(msg) {
768
- return getBitU(msg, 8, 6);
769
- }
770
- function sbasCrcOk(msg) {
771
- if (msg.length < 32) return false;
772
- return crc24q(msg, 226) === getBitU(msg, 226, 24);
773
- }
774
- function decodeSbasGeoNav(msg, prn, week, tow) {
775
- if (prn < 120 || prn > 158) return null;
776
- if (sbasMessageType(msg) !== SBAS_MT_GEO_NAV) return null;
777
- let t = getBitU(msg, 22, 13) * 16 - tow % 86400;
778
- if (t <= -43200) t += 86400;
779
- else if (t > 43200) t -= 86400;
780
- const t0Sec = tow + t;
781
- const ura = getBitU(msg, 35, 4);
782
- return {
783
- system: "S",
784
- prn: `S${two2(prn - 100)}`,
785
- tocDate: new Date(GPS_EPOCH_MS3 + week * MS_PER_WEEK2 + t0Sec * 1e3),
786
- tauN: getBitS(msg, 206, 12) * 2 ** -31,
787
- // a_Gf0, clock offset (s)
788
- gammaN: getBitS(msg, 218, 8) * 2 ** -39 / 2,
789
- // a_Gf1, clock drift (s/s)
790
- messageFrameTime: (tow % 86400 + 86400) % 86400,
791
- x: getBitS(msg, 39, 30) * 0.08 / 1e3,
792
- y: getBitS(msg, 69, 30) * 0.08 / 1e3,
793
- z: getBitS(msg, 99, 25) * 0.4 / 1e3,
794
- xDot: getBitS(msg, 124, 17) * 625e-6 / 1e3,
795
- yDot: getBitS(msg, 141, 17) * 625e-6 / 1e3,
796
- zDot: getBitS(msg, 158, 18) * 4e-3 / 1e3,
797
- xAcc: getBitS(msg, 176, 10) * 125e-7 / 1e3,
798
- yAcc: getBitS(msg, 186, 10) * 125e-7 / 1e3,
799
- zAcc: getBitS(msg, 196, 10) * 625e-7 / 1e3,
800
- health: ura === 15 ? 1 : 0,
801
- freqNum: 0
802
- };
803
- }
804
-
805
762
  export {
806
763
  bdsSubframeParityOk,
807
764
  BdsAssembler,
@@ -810,7 +767,5 @@ export {
810
767
  GalInavAssembler,
811
768
  GalFnavAssembler,
812
769
  testGloString,
813
- GloStringAssembler,
814
- sbasCrcOk,
815
- decodeSbasGeoNav
770
+ GloStringAssembler
816
771
  };
@@ -4,12 +4,14 @@ import {
4
4
  GalInavAssembler,
5
5
  GloStringAssembler,
6
6
  bdsSubframeParityOk,
7
- decodeSbasGeoNav,
8
7
  galFnavPageCrcOk,
9
8
  galInavPageCrcOk,
10
- sbasCrcOk,
11
9
  testGloString
12
- } from "./chunk-QV3XGDUU.js";
10
+ } from "./chunk-FA2UTLEQ.js";
11
+ import {
12
+ decodeSbasGeoNav,
13
+ sbasCrcOk
14
+ } from "./chunk-ZIGMN3E5.js";
13
15
  import {
14
16
  geodeticToEcef
15
17
  } from "./chunk-37QNKGTC.js";
@@ -1,3 +1,6 @@
1
+ import {
2
+ decodeSbasGeoNav
3
+ } from "./chunk-ZIGMN3E5.js";
1
4
  import {
2
5
  CnavAssembler,
3
6
  cnavCrcOk
@@ -62,6 +65,8 @@ var ID_GALEPHEMERIS = 1122;
62
65
  var ID_QZSSEPHEMERIS = 1336;
63
66
  var ID_GPSEPHEM = 7;
64
67
  var ID_BDSEPHEMERIS = 1696;
68
+ var ID_RAWWAASFRAME = 287;
69
+ var ID_RAWSBASFRAME = 973;
65
70
  var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
66
71
  var BDT_EPOCH_MS = Date.UTC(2006, 0, 1);
67
72
  var SEC_PER_WEEK = 7 * 86400;
@@ -323,6 +328,20 @@ function parseNovatelNav(data) {
323
328
  }
324
329
  lastGlo.set(eph.prn, eph);
325
330
  ephemerides.push(eph);
331
+ } else if ((frame.id === ID_RAWSBASFRAME || frame.id === ID_RAWWAASFRAME) && frame.msgLen >= 41) {
332
+ if (frame.week === 0) continue;
333
+ const p = frame.payload;
334
+ const prn = view.getUint32(p + 4, true);
335
+ const msg = new Uint8Array(32);
336
+ msg.set(data.subarray(p + 12, p + 41));
337
+ const eph = decodeSbasGeoNav(msg, prn, frame.week, frame.towMs / 1e3);
338
+ if (!eph) continue;
339
+ const prev = lastGlo.get(eph.prn);
340
+ if (prev && Math.abs(prev.tocDate.getTime() - eph.tocDate.getTime()) < 1e3 && prev.health === eph.health) {
341
+ continue;
342
+ }
343
+ lastGlo.set(eph.prn, eph);
344
+ ephemerides.push(eph);
326
345
  }
327
346
  }
328
347
  return {
@@ -0,0 +1,55 @@
1
+ import {
2
+ crc24q
3
+ } from "./chunk-YUW33VXK.js";
4
+ import {
5
+ getBitS,
6
+ getBitU
7
+ } from "./chunk-V2D5KUKH.js";
8
+
9
+ // src/navbits/sbas.ts
10
+ var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
11
+ var MS_PER_WEEK = 7 * 86400 * 1e3;
12
+ var two = (n) => String(n).padStart(2, "0");
13
+ var SBAS_MT_GEO_NAV = 9;
14
+ function sbasMessageType(msg) {
15
+ return getBitU(msg, 8, 6);
16
+ }
17
+ function sbasCrcOk(msg) {
18
+ if (msg.length < 32) return false;
19
+ return crc24q(msg, 226) === getBitU(msg, 226, 24);
20
+ }
21
+ function decodeSbasGeoNav(msg, prn, week, tow) {
22
+ if (prn < 120 || prn > 158) return null;
23
+ if (sbasMessageType(msg) !== SBAS_MT_GEO_NAV) return null;
24
+ let t = getBitU(msg, 22, 13) * 16 - tow % 86400;
25
+ if (t <= -43200) t += 86400;
26
+ else if (t > 43200) t -= 86400;
27
+ const t0Sec = tow + t;
28
+ const ura = getBitU(msg, 35, 4);
29
+ return {
30
+ system: "S",
31
+ prn: `S${two(prn - 100)}`,
32
+ tocDate: new Date(GPS_EPOCH_MS + week * MS_PER_WEEK + t0Sec * 1e3),
33
+ tauN: getBitS(msg, 206, 12) * 2 ** -31,
34
+ // a_Gf0, clock offset (s)
35
+ gammaN: getBitS(msg, 218, 8) * 2 ** -39 / 2,
36
+ // a_Gf1, clock drift (s/s)
37
+ messageFrameTime: (tow % 86400 + 86400) % 86400,
38
+ x: getBitS(msg, 39, 30) * 0.08 / 1e3,
39
+ y: getBitS(msg, 69, 30) * 0.08 / 1e3,
40
+ z: getBitS(msg, 99, 25) * 0.4 / 1e3,
41
+ xDot: getBitS(msg, 124, 17) * 625e-6 / 1e3,
42
+ yDot: getBitS(msg, 141, 17) * 625e-6 / 1e3,
43
+ zDot: getBitS(msg, 158, 18) * 4e-3 / 1e3,
44
+ xAcc: getBitS(msg, 176, 10) * 125e-7 / 1e3,
45
+ yAcc: getBitS(msg, 186, 10) * 125e-7 / 1e3,
46
+ zAcc: getBitS(msg, 196, 10) * 625e-7 / 1e3,
47
+ health: ura === 15 ? 1 : 0,
48
+ freqNum: 0
49
+ };
50
+ }
51
+
52
+ export {
53
+ sbasCrcOk,
54
+ decodeSbasGeoNav
55
+ };
package/dist/index.cjs CHANGED
@@ -9169,6 +9169,8 @@ var ID_GALEPHEMERIS = 1122;
9169
9169
  var ID_QZSSEPHEMERIS = 1336;
9170
9170
  var ID_GPSEPHEM = 7;
9171
9171
  var ID_BDSEPHEMERIS = 1696;
9172
+ var ID_RAWWAASFRAME = 287;
9173
+ var ID_RAWSBASFRAME = 973;
9172
9174
  var GPS_EPOCH_MS13 = Date.UTC(1980, 0, 6);
9173
9175
  var BDT_EPOCH_MS3 = Date.UTC(2006, 0, 1);
9174
9176
  var SEC_PER_WEEK9 = 7 * 86400;
@@ -9430,6 +9432,20 @@ function parseNovatelNav(data) {
9430
9432
  }
9431
9433
  lastGlo.set(eph.prn, eph);
9432
9434
  ephemerides.push(eph);
9435
+ } else if ((frame.id === ID_RAWSBASFRAME || frame.id === ID_RAWWAASFRAME) && frame.msgLen >= 41) {
9436
+ if (frame.week === 0) continue;
9437
+ const p = frame.payload;
9438
+ const prn = view.getUint32(p + 4, true);
9439
+ const msg = new Uint8Array(32);
9440
+ msg.set(data.subarray(p + 12, p + 41));
9441
+ const eph = decodeSbasGeoNav(msg, prn, frame.week, frame.towMs / 1e3);
9442
+ if (!eph) continue;
9443
+ const prev = lastGlo.get(eph.prn);
9444
+ if (prev && Math.abs(prev.tocDate.getTime() - eph.tocDate.getTime()) < 1e3 && prev.health === eph.health) {
9445
+ continue;
9446
+ }
9447
+ lastGlo.set(eph.prn, eph);
9448
+ ephemerides.push(eph);
9433
9449
  }
9434
9450
  }
9435
9451
  return {
package/dist/index.js CHANGED
@@ -50,7 +50,7 @@ import {
50
50
  parseUbxRawNav,
51
51
  parseUbxRawx,
52
52
  ubxFrames
53
- } from "./chunk-Z5VLTH33.js";
53
+ } from "./chunk-EQNC24OB.js";
54
54
  import {
55
55
  crc16,
56
56
  decodeSbfNavigation,
@@ -68,15 +68,16 @@ import {
68
68
  parseSbfNav,
69
69
  parseSbfReceiverSetup,
70
70
  scanSbfFrames
71
- } from "./chunk-6EZUM2MB.js";
72
- import "./chunk-QV3XGDUU.js";
71
+ } from "./chunk-MEDAWNWM.js";
72
+ import "./chunk-FA2UTLEQ.js";
73
73
  import {
74
74
  OEM4_HLEN,
75
75
  crc32,
76
76
  oem4Frames,
77
77
  parseNovatelNav,
78
78
  parseNovatelRange
79
- } from "./chunk-5X4AG4MK.js";
79
+ } from "./chunk-ROVSSEGZ.js";
80
+ import "./chunk-ZIGMN3E5.js";
80
81
  import {
81
82
  parseTrimble,
82
83
  parseTrimbleNav,
package/dist/novatel.cjs CHANGED
@@ -398,6 +398,45 @@ var CnavAssembler = class {
398
398
  }
399
399
  };
400
400
 
401
+ // src/navbits/sbas.ts
402
+ var GPS_EPOCH_MS3 = Date.UTC(1980, 0, 6);
403
+ var MS_PER_WEEK = 7 * 86400 * 1e3;
404
+ var two = (n) => String(n).padStart(2, "0");
405
+ var SBAS_MT_GEO_NAV = 9;
406
+ function sbasMessageType(msg) {
407
+ return getBitU(msg, 8, 6);
408
+ }
409
+ function decodeSbasGeoNav(msg, prn, week, tow) {
410
+ if (prn < 120 || prn > 158) return null;
411
+ if (sbasMessageType(msg) !== SBAS_MT_GEO_NAV) return null;
412
+ let t = getBitU(msg, 22, 13) * 16 - tow % 86400;
413
+ if (t <= -43200) t += 86400;
414
+ else if (t > 43200) t -= 86400;
415
+ const t0Sec = tow + t;
416
+ const ura = getBitU(msg, 35, 4);
417
+ return {
418
+ system: "S",
419
+ prn: `S${two(prn - 100)}`,
420
+ tocDate: new Date(GPS_EPOCH_MS3 + week * MS_PER_WEEK + t0Sec * 1e3),
421
+ tauN: getBitS(msg, 206, 12) * 2 ** -31,
422
+ // a_Gf0, clock offset (s)
423
+ gammaN: getBitS(msg, 218, 8) * 2 ** -39 / 2,
424
+ // a_Gf1, clock drift (s/s)
425
+ messageFrameTime: (tow % 86400 + 86400) % 86400,
426
+ x: getBitS(msg, 39, 30) * 0.08 / 1e3,
427
+ y: getBitS(msg, 69, 30) * 0.08 / 1e3,
428
+ z: getBitS(msg, 99, 25) * 0.4 / 1e3,
429
+ xDot: getBitS(msg, 124, 17) * 625e-6 / 1e3,
430
+ yDot: getBitS(msg, 141, 17) * 625e-6 / 1e3,
431
+ zDot: getBitS(msg, 158, 18) * 4e-3 / 1e3,
432
+ xAcc: getBitS(msg, 176, 10) * 125e-7 / 1e3,
433
+ yAcc: getBitS(msg, 186, 10) * 125e-7 / 1e3,
434
+ zAcc: getBitS(msg, 196, 10) * 625e-7 / 1e3,
435
+ health: ura === 15 ? 1 : 0,
436
+ freqNum: 0
437
+ };
438
+ }
439
+
401
440
  // src/constants/time.ts
402
441
  var MILLISECONDS_IN_SECOND = 1e3;
403
442
  var MILLISECONDS_GPS_TAI = 19e3;
@@ -494,18 +533,20 @@ var ID_GALEPHEMERIS = 1122;
494
533
  var ID_QZSSEPHEMERIS = 1336;
495
534
  var ID_GPSEPHEM = 7;
496
535
  var ID_BDSEPHEMERIS = 1696;
497
- var GPS_EPOCH_MS3 = Date.UTC(1980, 0, 6);
536
+ var ID_RAWWAASFRAME = 287;
537
+ var ID_RAWSBASFRAME = 973;
538
+ var GPS_EPOCH_MS4 = Date.UTC(1980, 0, 6);
498
539
  var BDT_EPOCH_MS = Date.UTC(2006, 0, 1);
499
540
  var SEC_PER_WEEK3 = 7 * 86400;
500
541
  var SEC_PER_DAY = 86400;
501
- var MS_PER_WEEK = SEC_PER_WEEK3 * 1e3;
502
- var gpsMs = (week, sec) => GPS_EPOCH_MS3 + week * MS_PER_WEEK + sec * 1e3;
542
+ var MS_PER_WEEK2 = SEC_PER_WEEK3 * 1e3;
543
+ var gpsMs = (week, sec) => GPS_EPOCH_MS4 + week * MS_PER_WEEK2 + sec * 1e3;
503
544
  var sowOf = (dateMs) => dateMs / 1e3 % SEC_PER_WEEK3;
504
545
  function nearWeekMs(refMs, sow) {
505
- const refWeek = Math.floor((refMs - GPS_EPOCH_MS3) / MS_PER_WEEK);
546
+ const refWeek = Math.floor((refMs - GPS_EPOCH_MS4) / MS_PER_WEEK2);
506
547
  let ms = gpsMs(refWeek, sow);
507
- if (ms < refMs - MS_PER_WEEK / 2) ms += MS_PER_WEEK;
508
- else if (ms > refMs + MS_PER_WEEK / 2) ms -= MS_PER_WEEK;
548
+ if (ms < refMs - MS_PER_WEEK2 / 2) ms += MS_PER_WEEK2;
549
+ else if (ms > refMs + MS_PER_WEEK2 / 2) ms -= MS_PER_WEEK2;
509
550
  return ms;
510
551
  }
511
552
  function decodeRawEphem(data, view, p) {
@@ -529,9 +570,9 @@ function decodeGloEphemeris(view, p) {
529
570
  tof += Math.floor(tow / SEC_PER_DAY) * SEC_PER_DAY;
530
571
  if (tof < tow - 43200) tof += SEC_PER_DAY;
531
572
  else if (tof > tow + 43200) tof -= SEC_PER_DAY;
532
- const toeGpsMs = GPS_EPOCH_MS3 + (week * SEC_PER_WEEK3 + tow) * 1e3;
533
- const tofGpsMs = GPS_EPOCH_MS3 + (week * SEC_PER_WEEK3 + tof) * 1e3;
534
- const tofUtcSec = (getUtcDate(new Date(tofGpsMs)).getTime() - GPS_EPOCH_MS3) / 1e3;
573
+ const toeGpsMs = GPS_EPOCH_MS4 + (week * SEC_PER_WEEK3 + tow) * 1e3;
574
+ const tofGpsMs = GPS_EPOCH_MS4 + (week * SEC_PER_WEEK3 + tof) * 1e3;
575
+ const tofUtcSec = (getUtcDate(new Date(tofGpsMs)).getTime() - GPS_EPOCH_MS4) / 1e3;
535
576
  return {
536
577
  system: "R",
537
578
  prn: `R${String(slot).padStart(2, "0")}`,
@@ -596,7 +637,7 @@ function decodeGalEphemeris(view, p, headerMs) {
596
637
  omega: view.getFloat64(p + 60, true),
597
638
  omegaDot: view.getFloat64(p + 140, true),
598
639
  idot: view.getFloat64(p + 124, true),
599
- week: Math.floor((toeMs - GPS_EPOCH_MS3) / MS_PER_WEEK),
640
+ week: Math.floor((toeMs - GPS_EPOCH_MS4) / MS_PER_WEEK2),
600
641
  // RINEX Galileo SVH bit layout (E1B DVS/HS in bits 0-2, E5a in
601
642
  // 3-5, E5b in 6-8) — same packing as RTKLIB.
602
643
  svHealth: svhE5b << 7 | dvsE5b << 6 | svhE5a << 4 | dvsE5a << 3 | svhE1b << 1 | dvsE1b,
@@ -613,7 +654,7 @@ function decodeBdsEphemeris(view, p) {
613
654
  const tgd1 = view.getFloat64(p + 20, true);
614
655
  const tocs = view.getUint32(p + 40, true);
615
656
  const toes = view.getUint32(p + 72, true);
616
- const tocDate = new Date(BDT_EPOCH_MS + week * MS_PER_WEEK + tocs * 1e3);
657
+ const tocDate = new Date(BDT_EPOCH_MS + week * MS_PER_WEEK2 + tocs * 1e3);
617
658
  return {
618
659
  system: "C",
619
660
  prn: `C${String(prn).padStart(2, "0")}`,
@@ -755,6 +796,20 @@ function parseNovatelNav(data) {
755
796
  }
756
797
  lastGlo.set(eph.prn, eph);
757
798
  ephemerides.push(eph);
799
+ } else if ((frame.id === ID_RAWSBASFRAME || frame.id === ID_RAWWAASFRAME) && frame.msgLen >= 41) {
800
+ if (frame.week === 0) continue;
801
+ const p = frame.payload;
802
+ const prn = view.getUint32(p + 4, true);
803
+ const msg = new Uint8Array(32);
804
+ msg.set(data.subarray(p + 12, p + 41));
805
+ const eph = decodeSbasGeoNav(msg, prn, frame.week, frame.towMs / 1e3);
806
+ if (!eph) continue;
807
+ const prev = lastGlo.get(eph.prn);
808
+ if (prev && Math.abs(prev.tocDate.getTime() - eph.tocDate.getTime()) < 1e3 && prev.health === eph.health) {
809
+ continue;
810
+ }
811
+ lastGlo.set(eph.prn, eph);
812
+ ephemerides.push(eph);
758
813
  }
759
814
  }
760
815
  return {
@@ -768,8 +823,8 @@ function parseNovatelNav(data) {
768
823
  }
769
824
 
770
825
  // src/novatel/index.ts
771
- var GPS_EPOCH_MS4 = Date.UTC(1980, 0, 6);
772
- var MS_PER_WEEK2 = 7 * 864e5;
826
+ var GPS_EPOCH_MS5 = Date.UTC(1980, 0, 6);
827
+ var MS_PER_WEEK3 = 7 * 864e5;
773
828
  var HDR = 28;
774
829
  var ID_RANGE = 43;
775
830
  var ID_RANGECMP = 140;
@@ -938,7 +993,7 @@ function parseNovatelRange(data) {
938
993
  if (!codes.includes(code)) codes.push(code);
939
994
  }
940
995
  epochs.push({
941
- timeMs: GPS_EPOCH_MS4 + week * MS_PER_WEEK2 + towMs,
996
+ timeMs: GPS_EPOCH_MS5 + week * MS_PER_WEEK3 + towMs,
942
997
  meas
943
998
  });
944
999
  }
@@ -990,7 +1045,7 @@ function parseNovatelRange(data) {
990
1045
  if (!codes.includes(code)) codes.push(code);
991
1046
  }
992
1047
  epochs.push({
993
- timeMs: GPS_EPOCH_MS4 + week * MS_PER_WEEK2 + towMs,
1048
+ timeMs: GPS_EPOCH_MS5 + week * MS_PER_WEEK3 + towMs,
994
1049
  meas
995
1050
  });
996
1051
  }
@@ -39,16 +39,28 @@ declare function oem4Frames(data: Uint8Array, view: DataView, stats: {
39
39
  * NovAtel navigation-message decoding: RAWEPHEM (message 41, raw GPS
40
40
  * LNAV subframes 1–3), GLOEPHEMERIS (message 723, decoded GLONASS
41
41
  * L1 C/A ephemeris), GALEPHEMERIS (1122), BDSEPHEMERIS (1696),
42
- * QZSSEPHEMERIS (1336) and IONUTC (8, GPS Klobuchar + UTC parameters).
42
+ * QZSSEPHEMERIS (1336), RAWSBASFRAME (973) / RAWWAASFRAME (287, its
43
+ * OEMV-era twin — raw SBAS L1 GEO messages) and IONUTC (8, GPS
44
+ * Klobuchar + UTC parameters).
43
45
  *
44
46
  * Ported from RTKLIB demo5 (rtklibexplorer fork, src/rcv/novatel.c:
45
47
  * decode_rawephemb / decode_gloephemerisb / decode_galephemerisb /
46
- * decode_bdsephemerisb / decode_ionutcb, Copyright (c) 2007-2020
47
- * T. Takasu, BSD-2-Clause) and cross-checked against the OEM7
48
- * Commands and Logs Reference Manual. QZSSEPHEMERIS has no RTKLIB
49
- * decoder (RTKLIB only handles the raw-subframe QZSSRAWEPHEM 1331);
50
- * its layout is taken from the OEM7 manual §3.150 and is therefore
51
- * synthetic-tested only, like SBF's QZSNav.
48
+ * decode_bdsephemerisb / decode_rawsbasframeb / decode_ionutcb,
49
+ * Copyright (c) 2007-2020 T. Takasu, BSD-2-Clause) and cross-checked
50
+ * against the OEM7 Commands and Logs Reference Manual. QZSSEPHEMERIS
51
+ * has no RTKLIB decoder (RTKLIB only handles the raw-subframe
52
+ * QZSSRAWEPHEM 1331); its layout is taken from the OEM7 manual §3.150
53
+ * and is therefore synthetic-tested only, like SBF's QZSNav.
54
+ *
55
+ * RAWSBASFRAME/RAWWAASFRAME carry the 250-bit SBAS L1 message as a
56
+ * 29-byte field (OEM7 manual §3.169: after the header, frame-decoder
57
+ * u4, PRN u4, a u4, then 29 bytes of message). Message type 9 (GEO
58
+ * navigation) is decoded by the shared `decodeSbasGeoNav`, the same
59
+ * decoder the u-blox and SBF paths use; other message types (fast/long
60
+ * corrections, etc.) are skipped. Because only 29 bytes (232 bits) are
61
+ * carried — enough for every MT9 field but 18 bits short of the 24-bit
62
+ * SBAS CRC — the SBAS CRC is not re-checked; the OEM4 CRC-32 over the
63
+ * whole log already guarantees the transported bytes.
52
64
  *
53
65
  * Output records mirror what `parseNavFile` produces for the
54
66
  * equivalent RINEX 3 navigation file: Keplerian `tocDate` is a
package/dist/novatel.d.ts CHANGED
@@ -39,16 +39,28 @@ declare function oem4Frames(data: Uint8Array, view: DataView, stats: {
39
39
  * NovAtel navigation-message decoding: RAWEPHEM (message 41, raw GPS
40
40
  * LNAV subframes 1–3), GLOEPHEMERIS (message 723, decoded GLONASS
41
41
  * L1 C/A ephemeris), GALEPHEMERIS (1122), BDSEPHEMERIS (1696),
42
- * QZSSEPHEMERIS (1336) and IONUTC (8, GPS Klobuchar + UTC parameters).
42
+ * QZSSEPHEMERIS (1336), RAWSBASFRAME (973) / RAWWAASFRAME (287, its
43
+ * OEMV-era twin — raw SBAS L1 GEO messages) and IONUTC (8, GPS
44
+ * Klobuchar + UTC parameters).
43
45
  *
44
46
  * Ported from RTKLIB demo5 (rtklibexplorer fork, src/rcv/novatel.c:
45
47
  * decode_rawephemb / decode_gloephemerisb / decode_galephemerisb /
46
- * decode_bdsephemerisb / decode_ionutcb, Copyright (c) 2007-2020
47
- * T. Takasu, BSD-2-Clause) and cross-checked against the OEM7
48
- * Commands and Logs Reference Manual. QZSSEPHEMERIS has no RTKLIB
49
- * decoder (RTKLIB only handles the raw-subframe QZSSRAWEPHEM 1331);
50
- * its layout is taken from the OEM7 manual §3.150 and is therefore
51
- * synthetic-tested only, like SBF's QZSNav.
48
+ * decode_bdsephemerisb / decode_rawsbasframeb / decode_ionutcb,
49
+ * Copyright (c) 2007-2020 T. Takasu, BSD-2-Clause) and cross-checked
50
+ * against the OEM7 Commands and Logs Reference Manual. QZSSEPHEMERIS
51
+ * has no RTKLIB decoder (RTKLIB only handles the raw-subframe
52
+ * QZSSRAWEPHEM 1331); its layout is taken from the OEM7 manual §3.150
53
+ * and is therefore synthetic-tested only, like SBF's QZSNav.
54
+ *
55
+ * RAWSBASFRAME/RAWWAASFRAME carry the 250-bit SBAS L1 message as a
56
+ * 29-byte field (OEM7 manual §3.169: after the header, frame-decoder
57
+ * u4, PRN u4, a u4, then 29 bytes of message). Message type 9 (GEO
58
+ * navigation) is decoded by the shared `decodeSbasGeoNav`, the same
59
+ * decoder the u-blox and SBF paths use; other message types (fast/long
60
+ * corrections, etc.) are skipped. Because only 29 bytes (232 bits) are
61
+ * carried — enough for every MT9 field but 18 bits short of the 24-bit
62
+ * SBAS CRC — the SBAS CRC is not re-checked; the OEM4 CRC-32 over the
63
+ * whole log already guarantees the transported bytes.
52
64
  *
53
65
  * Output records mirror what `parseNavFile` produces for the
54
66
  * equivalent RINEX 3 navigation file: Keplerian `tocDate` is a
package/dist/novatel.js CHANGED
@@ -4,7 +4,8 @@ import {
4
4
  oem4Frames,
5
5
  parseNovatelNav,
6
6
  parseNovatelRange
7
- } from "./chunk-5X4AG4MK.js";
7
+ } from "./chunk-ROVSSEGZ.js";
8
+ import "./chunk-ZIGMN3E5.js";
8
9
  import "./chunk-YUW33VXK.js";
9
10
  import "./chunk-V2D5KUKH.js";
10
11
  import "./chunk-HVXYFUCB.js";
package/dist/sbf.js CHANGED
@@ -15,8 +15,9 @@ import {
15
15
  parseSbfNav,
16
16
  parseSbfReceiverSetup,
17
17
  scanSbfFrames
18
- } from "./chunk-6EZUM2MB.js";
19
- import "./chunk-QV3XGDUU.js";
18
+ } from "./chunk-MEDAWNWM.js";
19
+ import "./chunk-FA2UTLEQ.js";
20
+ import "./chunk-ZIGMN3E5.js";
20
21
  import "./chunk-37QNKGTC.js";
21
22
  import "./chunk-6FAL6P4G.js";
22
23
  import "./chunk-YUW33VXK.js";
package/dist/ubx.js CHANGED
@@ -5,8 +5,9 @@ import {
5
5
  parseUbxRawNav,
6
6
  parseUbxRawx,
7
7
  ubxFrames
8
- } from "./chunk-Z5VLTH33.js";
9
- import "./chunk-QV3XGDUU.js";
8
+ } from "./chunk-EQNC24OB.js";
9
+ import "./chunk-FA2UTLEQ.js";
10
+ import "./chunk-ZIGMN3E5.js";
10
11
  import "./chunk-YUW33VXK.js";
11
12
  import "./chunk-V2D5KUKH.js";
12
13
  import "./chunk-HVXYFUCB.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gnss-js",
3
- "version": "1.43.0",
3
+ "version": "1.44.0",
4
4
  "description": "Comprehensive GNSS library for JavaScript — time scales, coordinates, RINEX parsing, RTCM3 decoding, orbit computation, and signal analysis",
5
5
  "type": "module",
6
6
  "sideEffects": false,