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.
- package/dist/{chunk-Z5VLTH33.js → chunk-EQNC24OB.js} +5 -3
- package/dist/{chunk-QV3XGDUU.js → chunk-FA2UTLEQ.js} +1 -46
- package/dist/{chunk-6EZUM2MB.js → chunk-MEDAWNWM.js} +5 -3
- package/dist/{chunk-5X4AG4MK.js → chunk-ROVSSEGZ.js} +19 -0
- package/dist/chunk-ZIGMN3E5.js +55 -0
- package/dist/index.cjs +16 -0
- package/dist/index.js +5 -4
- package/dist/novatel.cjs +70 -15
- package/dist/novatel.d.cts +19 -7
- package/dist/novatel.d.ts +19 -7
- package/dist/novatel.js +2 -1
- package/dist/sbf.js +3 -2
- package/dist/ubx.js +3 -2
- package/package.json +1 -1
|
@@ -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-
|
|
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-
|
|
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-
|
|
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-
|
|
72
|
-
import "./chunk-
|
|
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-
|
|
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
|
|
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
|
|
502
|
-
var gpsMs = (week, sec) =>
|
|
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 -
|
|
546
|
+
const refWeek = Math.floor((refMs - GPS_EPOCH_MS4) / MS_PER_WEEK2);
|
|
506
547
|
let ms = gpsMs(refWeek, sow);
|
|
507
|
-
if (ms < refMs -
|
|
508
|
-
else if (ms > refMs +
|
|
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 =
|
|
533
|
-
const tofGpsMs =
|
|
534
|
-
const tofUtcSec = (getUtcDate(new Date(tofGpsMs)).getTime() -
|
|
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 -
|
|
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 *
|
|
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
|
|
772
|
-
var
|
|
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:
|
|
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:
|
|
1048
|
+
timeMs: GPS_EPOCH_MS5 + week * MS_PER_WEEK3 + towMs,
|
|
994
1049
|
meas
|
|
995
1050
|
});
|
|
996
1051
|
}
|
package/dist/novatel.d.cts
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)
|
|
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,
|
|
47
|
-
* T. Takasu, BSD-2-Clause) and cross-checked
|
|
48
|
-
* Commands and Logs Reference Manual. QZSSEPHEMERIS
|
|
49
|
-
* decoder (RTKLIB only handles the raw-subframe
|
|
50
|
-
* its layout is taken from the OEM7 manual §3.150
|
|
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)
|
|
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,
|
|
47
|
-
* T. Takasu, BSD-2-Clause) and cross-checked
|
|
48
|
-
* Commands and Logs Reference Manual. QZSSEPHEMERIS
|
|
49
|
-
* decoder (RTKLIB only handles the raw-subframe
|
|
50
|
-
* its layout is taken from the OEM7 manual §3.150
|
|
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
package/dist/sbf.js
CHANGED
|
@@ -15,8 +15,9 @@ import {
|
|
|
15
15
|
parseSbfNav,
|
|
16
16
|
parseSbfReceiverSetup,
|
|
17
17
|
scanSbfFrames
|
|
18
|
-
} from "./chunk-
|
|
19
|
-
import "./chunk-
|
|
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-
|
|
9
|
-
import "./chunk-
|
|
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.
|
|
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,
|