gnss-js 1.62.0 → 1.63.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-BRT6XZ7B.js → chunk-QN7Q2ALS.js} +111 -0
- package/dist/index.cjs +169 -57
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +3 -1
- package/dist/rtcm3.cjs +141 -29
- package/dist/rtcm3.d.cts +7 -1
- package/dist/rtcm3.d.ts +7 -1
- package/dist/rtcm3.js +3 -1
- package/package.json +1 -1
|
@@ -563,6 +563,116 @@ function decodeEphemeris(frame) {
|
|
|
563
563
|
}
|
|
564
564
|
}
|
|
565
565
|
|
|
566
|
+
// src/rtcm3/legacy-obs.ts
|
|
567
|
+
var PRUNIT_GPS = 299792.458;
|
|
568
|
+
var PRUNIT_GLO = 599584.916;
|
|
569
|
+
var LAM_GPS_L1 = C_LIGHT / 157542e4;
|
|
570
|
+
var LAM_GPS_L2 = C_LIGHT / 12276e5;
|
|
571
|
+
var PPR_INVALID = -(2 ** 19);
|
|
572
|
+
var PR21_INVALID = -(2 ** 13);
|
|
573
|
+
function legacyLockSec(i) {
|
|
574
|
+
if (i < 24) return i;
|
|
575
|
+
if (i < 48) return 2 * i - 24;
|
|
576
|
+
if (i < 72) return 4 * i - 120;
|
|
577
|
+
if (i < 96) return 8 * i - 408;
|
|
578
|
+
if (i < 120) return 16 * i - 1176;
|
|
579
|
+
if (i < 127) return 32 * i - 3096;
|
|
580
|
+
return 937;
|
|
581
|
+
}
|
|
582
|
+
var two = (n) => n.toString().padStart(2, "0");
|
|
583
|
+
function decodeLegacyObs(frame) {
|
|
584
|
+
const type = frame.messageType;
|
|
585
|
+
const gps = type >= 1001 && type <= 1004;
|
|
586
|
+
const glo = type >= 1009 && type <= 1012;
|
|
587
|
+
if (!gps && !glo) return null;
|
|
588
|
+
const ext = type === 1002 || type === 1004 || type === 1010 || type === 1012;
|
|
589
|
+
const dual = type === 1003 || type === 1004 || type === 1011 || type === 1012;
|
|
590
|
+
const system = gps ? "G" : "R";
|
|
591
|
+
const r = new BitReader(frame.payload);
|
|
592
|
+
r.readU(12);
|
|
593
|
+
r.readU(12);
|
|
594
|
+
let epochMs;
|
|
595
|
+
let nsat;
|
|
596
|
+
if (gps) {
|
|
597
|
+
epochMs = r.readU(30);
|
|
598
|
+
r.readU(1);
|
|
599
|
+
nsat = r.readU(5);
|
|
600
|
+
r.readU(1);
|
|
601
|
+
r.readU(3);
|
|
602
|
+
} else {
|
|
603
|
+
const tk = r.readU(27);
|
|
604
|
+
r.readU(1);
|
|
605
|
+
nsat = r.readU(5);
|
|
606
|
+
r.readU(1);
|
|
607
|
+
r.readU(3);
|
|
608
|
+
const gloDow = new Date(Date.now() + 3 * 36e5).getUTCDay();
|
|
609
|
+
epochMs = (gloDow << 27 | tk) >>> 0;
|
|
610
|
+
}
|
|
611
|
+
const observations = [];
|
|
612
|
+
for (let s = 0; s < nsat; s++) {
|
|
613
|
+
const satId = r.readU(6);
|
|
614
|
+
const code1 = r.readU(1);
|
|
615
|
+
const freqCh = glo ? r.readU(5) : 0;
|
|
616
|
+
const pr1raw = r.readU(gps ? 24 : 25);
|
|
617
|
+
const ppr1 = r.readS(20);
|
|
618
|
+
const lock1 = r.readU(7);
|
|
619
|
+
let amb = 0;
|
|
620
|
+
let cnr1 = 0;
|
|
621
|
+
if (ext) {
|
|
622
|
+
amb = r.readU(gps ? 8 : 7);
|
|
623
|
+
cnr1 = r.readU(8);
|
|
624
|
+
}
|
|
625
|
+
let code2 = 0;
|
|
626
|
+
let pr21 = 0;
|
|
627
|
+
let ppr2 = 0;
|
|
628
|
+
let lock2 = 0;
|
|
629
|
+
let cnr2 = 0;
|
|
630
|
+
if (dual) {
|
|
631
|
+
code2 = r.readU(2);
|
|
632
|
+
pr21 = r.readS(14);
|
|
633
|
+
ppr2 = r.readS(20);
|
|
634
|
+
lock2 = r.readU(7);
|
|
635
|
+
if (ext) cnr2 = r.readU(8);
|
|
636
|
+
}
|
|
637
|
+
if (gps && (satId < 1 || satId > 32)) continue;
|
|
638
|
+
if (glo && (satId < 1 || satId > 24)) continue;
|
|
639
|
+
const prunit = gps ? PRUNIT_GPS : PRUNIT_GLO;
|
|
640
|
+
const pr1 = pr1raw * 0.02 + amb * prunit;
|
|
641
|
+
const k = freqCh - 7;
|
|
642
|
+
const lamL1 = gps ? LAM_GPS_L1 : C_LIGHT / (GLO_F1_BASE + k * GLO_F1_STEP);
|
|
643
|
+
const lamL2 = gps ? LAM_GPS_L2 : C_LIGHT / (GLO_F2_BASE + k * GLO_F2_STEP);
|
|
644
|
+
const signals = [];
|
|
645
|
+
{
|
|
646
|
+
const sig = {
|
|
647
|
+
rinexCode: gps ? code1 ? "1W" : "1C" : code1 ? "1P" : "1C",
|
|
648
|
+
pseudorange: pr1,
|
|
649
|
+
wavelength: lamL1,
|
|
650
|
+
lockTime: legacyLockSec(lock1)
|
|
651
|
+
};
|
|
652
|
+
if (ppr1 !== PPR_INVALID) sig.phase = (pr1 + ppr1 * 5e-4) / lamL1;
|
|
653
|
+
if (ext && cnr1 > 0) sig.cn0 = cnr1 * 0.25;
|
|
654
|
+
signals.push(sig);
|
|
655
|
+
}
|
|
656
|
+
if (dual) {
|
|
657
|
+
const sig = {
|
|
658
|
+
rinexCode: gps ? code2 === 0 ? "2X" : "2W" : code2 === 0 ? "2C" : "2P",
|
|
659
|
+
wavelength: lamL2,
|
|
660
|
+
lockTime: legacyLockSec(lock2)
|
|
661
|
+
};
|
|
662
|
+
if (pr21 !== PR21_INVALID) sig.pseudorange = pr1 + pr21 * 0.02;
|
|
663
|
+
if (ppr2 !== PPR_INVALID) sig.phase = (pr1 + ppr2 * 5e-4) / lamL2;
|
|
664
|
+
if (ext && cnr2 > 0) sig.cn0 = cnr2 * 0.25;
|
|
665
|
+
signals.push(sig);
|
|
666
|
+
}
|
|
667
|
+
observations.push({
|
|
668
|
+
prn: `${system}${two(satId)}`,
|
|
669
|
+
system,
|
|
670
|
+
signals
|
|
671
|
+
});
|
|
672
|
+
}
|
|
673
|
+
return { messageType: type, epochMs, system, observations };
|
|
674
|
+
}
|
|
675
|
+
|
|
566
676
|
// src/rtcm3/msm.ts
|
|
567
677
|
var GPS_L1 = FREQ.G["1"];
|
|
568
678
|
var GPS_L2 = FREQ.G["2"];
|
|
@@ -1447,6 +1557,7 @@ export {
|
|
|
1447
1557
|
Rtcm3Decoder,
|
|
1448
1558
|
readString,
|
|
1449
1559
|
decodeEphemeris,
|
|
1560
|
+
decodeLegacyObs,
|
|
1450
1561
|
decodeMsmFull,
|
|
1451
1562
|
msmEpochToDate,
|
|
1452
1563
|
setGloFreqNumber,
|
package/dist/index.cjs
CHANGED
|
@@ -144,6 +144,7 @@ __export(src_exports, {
|
|
|
144
144
|
dateToEpoch: () => dateToEpoch,
|
|
145
145
|
decodeBinexEph: () => decodeBinexEph,
|
|
146
146
|
decodeEphemeris: () => decodeEphemeris,
|
|
147
|
+
decodeLegacyObs: () => decodeLegacyObs,
|
|
147
148
|
decodeMsmFull: () => decodeMsmFull,
|
|
148
149
|
decodeSbfNavigation: () => decodeSbfNavigation,
|
|
149
150
|
deg2dms: () => deg2dms,
|
|
@@ -5019,6 +5020,116 @@ function decodeEphemeris(frame) {
|
|
|
5019
5020
|
}
|
|
5020
5021
|
}
|
|
5021
5022
|
|
|
5023
|
+
// src/rtcm3/legacy-obs.ts
|
|
5024
|
+
var PRUNIT_GPS = 299792.458;
|
|
5025
|
+
var PRUNIT_GLO = 599584.916;
|
|
5026
|
+
var LAM_GPS_L1 = C_LIGHT / 157542e4;
|
|
5027
|
+
var LAM_GPS_L2 = C_LIGHT / 12276e5;
|
|
5028
|
+
var PPR_INVALID = -(2 ** 19);
|
|
5029
|
+
var PR21_INVALID = -(2 ** 13);
|
|
5030
|
+
function legacyLockSec(i) {
|
|
5031
|
+
if (i < 24) return i;
|
|
5032
|
+
if (i < 48) return 2 * i - 24;
|
|
5033
|
+
if (i < 72) return 4 * i - 120;
|
|
5034
|
+
if (i < 96) return 8 * i - 408;
|
|
5035
|
+
if (i < 120) return 16 * i - 1176;
|
|
5036
|
+
if (i < 127) return 32 * i - 3096;
|
|
5037
|
+
return 937;
|
|
5038
|
+
}
|
|
5039
|
+
var two = (n) => n.toString().padStart(2, "0");
|
|
5040
|
+
function decodeLegacyObs(frame) {
|
|
5041
|
+
const type = frame.messageType;
|
|
5042
|
+
const gps = type >= 1001 && type <= 1004;
|
|
5043
|
+
const glo = type >= 1009 && type <= 1012;
|
|
5044
|
+
if (!gps && !glo) return null;
|
|
5045
|
+
const ext = type === 1002 || type === 1004 || type === 1010 || type === 1012;
|
|
5046
|
+
const dual = type === 1003 || type === 1004 || type === 1011 || type === 1012;
|
|
5047
|
+
const system = gps ? "G" : "R";
|
|
5048
|
+
const r = new BitReader(frame.payload);
|
|
5049
|
+
r.readU(12);
|
|
5050
|
+
r.readU(12);
|
|
5051
|
+
let epochMs;
|
|
5052
|
+
let nsat;
|
|
5053
|
+
if (gps) {
|
|
5054
|
+
epochMs = r.readU(30);
|
|
5055
|
+
r.readU(1);
|
|
5056
|
+
nsat = r.readU(5);
|
|
5057
|
+
r.readU(1);
|
|
5058
|
+
r.readU(3);
|
|
5059
|
+
} else {
|
|
5060
|
+
const tk = r.readU(27);
|
|
5061
|
+
r.readU(1);
|
|
5062
|
+
nsat = r.readU(5);
|
|
5063
|
+
r.readU(1);
|
|
5064
|
+
r.readU(3);
|
|
5065
|
+
const gloDow = new Date(Date.now() + 3 * 36e5).getUTCDay();
|
|
5066
|
+
epochMs = (gloDow << 27 | tk) >>> 0;
|
|
5067
|
+
}
|
|
5068
|
+
const observations = [];
|
|
5069
|
+
for (let s = 0; s < nsat; s++) {
|
|
5070
|
+
const satId = r.readU(6);
|
|
5071
|
+
const code1 = r.readU(1);
|
|
5072
|
+
const freqCh = glo ? r.readU(5) : 0;
|
|
5073
|
+
const pr1raw = r.readU(gps ? 24 : 25);
|
|
5074
|
+
const ppr1 = r.readS(20);
|
|
5075
|
+
const lock1 = r.readU(7);
|
|
5076
|
+
let amb = 0;
|
|
5077
|
+
let cnr1 = 0;
|
|
5078
|
+
if (ext) {
|
|
5079
|
+
amb = r.readU(gps ? 8 : 7);
|
|
5080
|
+
cnr1 = r.readU(8);
|
|
5081
|
+
}
|
|
5082
|
+
let code2 = 0;
|
|
5083
|
+
let pr21 = 0;
|
|
5084
|
+
let ppr2 = 0;
|
|
5085
|
+
let lock2 = 0;
|
|
5086
|
+
let cnr2 = 0;
|
|
5087
|
+
if (dual) {
|
|
5088
|
+
code2 = r.readU(2);
|
|
5089
|
+
pr21 = r.readS(14);
|
|
5090
|
+
ppr2 = r.readS(20);
|
|
5091
|
+
lock2 = r.readU(7);
|
|
5092
|
+
if (ext) cnr2 = r.readU(8);
|
|
5093
|
+
}
|
|
5094
|
+
if (gps && (satId < 1 || satId > 32)) continue;
|
|
5095
|
+
if (glo && (satId < 1 || satId > 24)) continue;
|
|
5096
|
+
const prunit = gps ? PRUNIT_GPS : PRUNIT_GLO;
|
|
5097
|
+
const pr1 = pr1raw * 0.02 + amb * prunit;
|
|
5098
|
+
const k = freqCh - 7;
|
|
5099
|
+
const lamL1 = gps ? LAM_GPS_L1 : C_LIGHT / (GLO_F1_BASE + k * GLO_F1_STEP);
|
|
5100
|
+
const lamL2 = gps ? LAM_GPS_L2 : C_LIGHT / (GLO_F2_BASE + k * GLO_F2_STEP);
|
|
5101
|
+
const signals = [];
|
|
5102
|
+
{
|
|
5103
|
+
const sig = {
|
|
5104
|
+
rinexCode: gps ? code1 ? "1W" : "1C" : code1 ? "1P" : "1C",
|
|
5105
|
+
pseudorange: pr1,
|
|
5106
|
+
wavelength: lamL1,
|
|
5107
|
+
lockTime: legacyLockSec(lock1)
|
|
5108
|
+
};
|
|
5109
|
+
if (ppr1 !== PPR_INVALID) sig.phase = (pr1 + ppr1 * 5e-4) / lamL1;
|
|
5110
|
+
if (ext && cnr1 > 0) sig.cn0 = cnr1 * 0.25;
|
|
5111
|
+
signals.push(sig);
|
|
5112
|
+
}
|
|
5113
|
+
if (dual) {
|
|
5114
|
+
const sig = {
|
|
5115
|
+
rinexCode: gps ? code2 === 0 ? "2X" : "2W" : code2 === 0 ? "2C" : "2P",
|
|
5116
|
+
wavelength: lamL2,
|
|
5117
|
+
lockTime: legacyLockSec(lock2)
|
|
5118
|
+
};
|
|
5119
|
+
if (pr21 !== PR21_INVALID) sig.pseudorange = pr1 + pr21 * 0.02;
|
|
5120
|
+
if (ppr2 !== PPR_INVALID) sig.phase = (pr1 + ppr2 * 5e-4) / lamL2;
|
|
5121
|
+
if (ext && cnr2 > 0) sig.cn0 = cnr2 * 0.25;
|
|
5122
|
+
signals.push(sig);
|
|
5123
|
+
}
|
|
5124
|
+
observations.push({
|
|
5125
|
+
prn: `${system}${two(satId)}`,
|
|
5126
|
+
system,
|
|
5127
|
+
signals
|
|
5128
|
+
});
|
|
5129
|
+
}
|
|
5130
|
+
return { messageType: type, epochMs, system, observations };
|
|
5131
|
+
}
|
|
5132
|
+
|
|
5022
5133
|
// src/rtcm3/msm.ts
|
|
5023
5134
|
var GPS_L1 = FREQ.G["1"];
|
|
5024
5135
|
var GPS_L2 = FREQ.G["2"];
|
|
@@ -6349,7 +6460,7 @@ function weekOfToe(week, tow, toe) {
|
|
|
6349
6460
|
if (toe - tow < -HALF_WEEK3) return week + 1;
|
|
6350
6461
|
return week;
|
|
6351
6462
|
}
|
|
6352
|
-
var
|
|
6463
|
+
var two2 = (n) => String(n).padStart(2, "0");
|
|
6353
6464
|
function decodeGalInavWords(words) {
|
|
6354
6465
|
if (words.length < 96) return null;
|
|
6355
6466
|
const b = words;
|
|
@@ -6437,7 +6548,7 @@ function decodeGalInavWords(words) {
|
|
|
6437
6548
|
const tocDate = gpsDate2(week, tocs);
|
|
6438
6549
|
return {
|
|
6439
6550
|
system: "E",
|
|
6440
|
-
prn: `E${
|
|
6551
|
+
prn: `E${two2(svid)}`,
|
|
6441
6552
|
toc: tocDate.getTime() / 1e3 % SEC_PER_WEEK5,
|
|
6442
6553
|
tocDate,
|
|
6443
6554
|
af0,
|
|
@@ -6545,7 +6656,7 @@ function decodeGalFnavPages(pages) {
|
|
|
6545
6656
|
const tocDate = gpsDate2(week, tocs);
|
|
6546
6657
|
return {
|
|
6547
6658
|
system: "E",
|
|
6548
|
-
prn: `E${
|
|
6659
|
+
prn: `E${two2(svid)}`,
|
|
6549
6660
|
toc: tocDate.getTime() / 1e3 % SEC_PER_WEEK5,
|
|
6550
6661
|
tocDate,
|
|
6551
6662
|
af0,
|
|
@@ -6601,7 +6712,7 @@ var GalInavAssembler = class {
|
|
|
6601
6712
|
sat.words[type * 16 + 15] = getBitU(page, 124, 8);
|
|
6602
6713
|
if (type !== 5) return null;
|
|
6603
6714
|
const eph = decodeGalInavWords(sat.words);
|
|
6604
|
-
if (!eph || eph.prn !== `E${
|
|
6715
|
+
if (!eph || eph.prn !== `E${two2(prn)}`) return null;
|
|
6605
6716
|
const key = dedupKey(eph);
|
|
6606
6717
|
if (key === sat.lastKey) return null;
|
|
6607
6718
|
sat.lastKey = key;
|
|
@@ -6628,7 +6739,7 @@ var GalFnavAssembler = class {
|
|
|
6628
6739
|
sat.words.set(page.subarray(0, 31), (type - 1) * 31);
|
|
6629
6740
|
if (type !== 4) return null;
|
|
6630
6741
|
const eph = decodeGalFnavPages(sat.words);
|
|
6631
|
-
if (!eph || eph.prn !== `E${
|
|
6742
|
+
if (!eph || eph.prn !== `E${two2(prn)}`) return null;
|
|
6632
6743
|
const key = dedupKey(eph);
|
|
6633
6744
|
if (key === sat.lastKey) return null;
|
|
6634
6745
|
sat.lastKey = key;
|
|
@@ -6802,7 +6913,7 @@ var GloStringAssembler = class {
|
|
|
6802
6913
|
// src/navbits/sbas.ts
|
|
6803
6914
|
var GPS_EPOCH_MS7 = Date.UTC(1980, 0, 6);
|
|
6804
6915
|
var MS_PER_WEEK3 = 7 * 86400 * 1e3;
|
|
6805
|
-
var
|
|
6916
|
+
var two3 = (n) => String(n).padStart(2, "0");
|
|
6806
6917
|
var SBAS_MT_GEO_NAV = 9;
|
|
6807
6918
|
function sbasMessageType(msg) {
|
|
6808
6919
|
return getBitU(msg, 8, 6);
|
|
@@ -6821,7 +6932,7 @@ function decodeSbasGeoNav(msg, prn, week, tow) {
|
|
|
6821
6932
|
const ura = getBitU(msg, 35, 4);
|
|
6822
6933
|
return {
|
|
6823
6934
|
system: "S",
|
|
6824
|
-
prn: `S${
|
|
6935
|
+
prn: `S${two3(prn - 100)}`,
|
|
6825
6936
|
tocDate: new Date(GPS_EPOCH_MS7 + week * MS_PER_WEEK3 + t0Sec * 1e3),
|
|
6826
6937
|
tauN: getBitS(msg, 206, 12) * 2 ** -31,
|
|
6827
6938
|
// a_Gf0, clock offset (s)
|
|
@@ -6845,7 +6956,7 @@ function decodeSbasGeoNav(msg, prn, week, tow) {
|
|
|
6845
6956
|
// src/ubx/rawnav.ts
|
|
6846
6957
|
var GPS_EPOCH_MS8 = Date.UTC(1980, 0, 6);
|
|
6847
6958
|
var SEC_PER_WEEK7 = 7 * 86400;
|
|
6848
|
-
var
|
|
6959
|
+
var two4 = (n) => String(n).padStart(2, "0");
|
|
6849
6960
|
function parseUbxRawNav(data, opts = {}) {
|
|
6850
6961
|
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
6851
6962
|
const ephemerides = [];
|
|
@@ -6921,7 +7032,7 @@ function parseUbxRawNav(data, opts = {}) {
|
|
|
6921
7032
|
badParity++;
|
|
6922
7033
|
continue;
|
|
6923
7034
|
}
|
|
6924
|
-
const eph = bds.push(`C${
|
|
7035
|
+
const eph = bds.push(`C${two4(svId)}`, sf);
|
|
6925
7036
|
if (eph) ephemerides.push(eph);
|
|
6926
7037
|
} else if (gnssId === 6) {
|
|
6927
7038
|
if (p.length < 8 + 16) continue;
|
|
@@ -6940,7 +7051,7 @@ function parseUbxRawNav(data, opts = {}) {
|
|
|
6940
7051
|
continue;
|
|
6941
7052
|
}
|
|
6942
7053
|
if (!refDate) continue;
|
|
6943
|
-
const eph = glo.push(`R${
|
|
7054
|
+
const eph = glo.push(`R${two4(svId)}`, str2, refDate, p[3] - 7);
|
|
6944
7055
|
if (eph) ephemerides.push(eph);
|
|
6945
7056
|
} else if (gnssId === 1) {
|
|
6946
7057
|
if (p.length < 8 + 32) continue;
|
|
@@ -7042,20 +7153,20 @@ var SIGNALS = {
|
|
|
7042
7153
|
// GLONASS L1OF, L2OF
|
|
7043
7154
|
};
|
|
7044
7155
|
function prnFor(gnssId, svId) {
|
|
7045
|
-
const
|
|
7156
|
+
const two10 = (n) => String(n).padStart(2, "0");
|
|
7046
7157
|
switch (gnssId) {
|
|
7047
7158
|
case 0:
|
|
7048
|
-
return svId >= 1 && svId <= 32 ? `G${
|
|
7159
|
+
return svId >= 1 && svId <= 32 ? `G${two10(svId)}` : null;
|
|
7049
7160
|
case 1:
|
|
7050
|
-
return svId >= 120 && svId <= 158 ? `S${
|
|
7161
|
+
return svId >= 120 && svId <= 158 ? `S${two10(svId - 100)}` : null;
|
|
7051
7162
|
case 2:
|
|
7052
|
-
return svId >= 1 && svId <= 36 ? `E${
|
|
7163
|
+
return svId >= 1 && svId <= 36 ? `E${two10(svId)}` : null;
|
|
7053
7164
|
case 3:
|
|
7054
|
-
return svId >= 1 && svId <= 63 ? `C${
|
|
7165
|
+
return svId >= 1 && svId <= 63 ? `C${two10(svId)}` : null;
|
|
7055
7166
|
case 5:
|
|
7056
|
-
return svId >= 1 && svId <= 10 ? `J${
|
|
7167
|
+
return svId >= 1 && svId <= 10 ? `J${two10(svId)}` : null;
|
|
7057
7168
|
case 6:
|
|
7058
|
-
return svId >= 1 && svId <= 32 ? `R${
|
|
7169
|
+
return svId >= 1 && svId <= 32 ? `R${two10(svId)}` : null;
|
|
7059
7170
|
default:
|
|
7060
7171
|
return null;
|
|
7061
7172
|
}
|
|
@@ -7158,22 +7269,22 @@ function scanSbfFrames(data, view, onBlock) {
|
|
|
7158
7269
|
}
|
|
7159
7270
|
return badCrc;
|
|
7160
7271
|
}
|
|
7161
|
-
var
|
|
7272
|
+
var two5 = (n) => String(n).padStart(2, "0");
|
|
7162
7273
|
function svidToPrn(svid) {
|
|
7163
|
-
if (svid >= 1 && svid <= 37) return svid <= 32 ? `G${
|
|
7164
|
-
if (svid <= 61) return svid - 37 <= 27 ? `R${
|
|
7274
|
+
if (svid >= 1 && svid <= 37) return svid <= 32 ? `G${two5(svid)}` : null;
|
|
7275
|
+
if (svid <= 61) return svid - 37 <= 27 ? `R${two5(svid - 37)}` : null;
|
|
7165
7276
|
if (svid <= 62) return null;
|
|
7166
|
-
if (svid <= 68) return svid - 38 <= 27 ? `R${
|
|
7277
|
+
if (svid <= 68) return svid - 38 <= 27 ? `R${two5(svid - 38)}` : null;
|
|
7167
7278
|
if (svid <= 70) return null;
|
|
7168
|
-
if (svid <= 106) return svid - 70 <= 36 ? `E${
|
|
7279
|
+
if (svid <= 106) return svid - 70 <= 36 ? `E${two5(svid - 70)}` : null;
|
|
7169
7280
|
if (svid <= 119) return null;
|
|
7170
|
-
if (svid <= 140) return `S${
|
|
7171
|
-
if (svid <= 180) return svid - 140 <= 50 ? `C${
|
|
7172
|
-
if (svid <= 190) return `J${
|
|
7173
|
-
if (svid <= 197) return svid - 190 <= 14 ? `I${
|
|
7174
|
-
if (svid <= 215) return `S${
|
|
7175
|
-
if (svid <= 222) return svid - 208 <= 14 ? `I${
|
|
7176
|
-
if (svid <= 245) return svid - 182 <= 50 ? `C${
|
|
7281
|
+
if (svid <= 140) return `S${two5(svid - 100)}`;
|
|
7282
|
+
if (svid <= 180) return svid - 140 <= 50 ? `C${two5(svid - 140)}` : null;
|
|
7283
|
+
if (svid <= 190) return `J${two5(svid - 180)}`;
|
|
7284
|
+
if (svid <= 197) return svid - 190 <= 14 ? `I${two5(svid - 190)}` : null;
|
|
7285
|
+
if (svid <= 215) return `S${two5(svid - 157)}`;
|
|
7286
|
+
if (svid <= 222) return svid - 208 <= 14 ? `I${two5(svid - 208)}` : null;
|
|
7287
|
+
if (svid <= 245) return svid - 182 <= 50 ? `C${two5(svid - 182)}` : null;
|
|
7177
7288
|
return null;
|
|
7178
7289
|
}
|
|
7179
7290
|
|
|
@@ -8785,23 +8896,23 @@ var MEAS2_SIG = [
|
|
|
8785
8896
|
["J", "1E"],
|
|
8786
8897
|
["J", "5P"]
|
|
8787
8898
|
];
|
|
8788
|
-
var
|
|
8899
|
+
var two6 = (n) => String(n).padStart(2, "0");
|
|
8789
8900
|
function m3Prn(navsys, svid) {
|
|
8790
8901
|
switch (navsys) {
|
|
8791
8902
|
case 0:
|
|
8792
|
-
return svid < 32 ? `G${
|
|
8903
|
+
return svid < 32 ? `G${two6(svid + 1)}` : null;
|
|
8793
8904
|
case 1:
|
|
8794
|
-
return svid < 27 ? `R${
|
|
8905
|
+
return svid < 27 ? `R${two6(svid + 1)}` : null;
|
|
8795
8906
|
case 2:
|
|
8796
|
-
return svid < 36 ? `E${
|
|
8907
|
+
return svid < 36 ? `E${two6(svid + 1)}` : null;
|
|
8797
8908
|
case 3:
|
|
8798
|
-
return svid < 50 ? `C${
|
|
8909
|
+
return svid < 50 ? `C${two6(svid + 1)}` : null;
|
|
8799
8910
|
case 4:
|
|
8800
|
-
return svid <= 38 ? `S${
|
|
8911
|
+
return svid <= 38 ? `S${two6(svid + 20)}` : null;
|
|
8801
8912
|
case 5:
|
|
8802
|
-
return svid < 10 ? `J${
|
|
8913
|
+
return svid < 10 ? `J${two6(svid + 1)}` : null;
|
|
8803
8914
|
case 6:
|
|
8804
|
-
return svid < 14 ? `I${
|
|
8915
|
+
return svid < 14 ? `I${two6(svid + 1)}` : null;
|
|
8805
8916
|
default:
|
|
8806
8917
|
return null;
|
|
8807
8918
|
}
|
|
@@ -10635,7 +10746,7 @@ var MS_PER_WEEK12 = SEC_PER_WEEK11 * 1e3;
|
|
|
10635
10746
|
var SC2RAD = GPS_PI;
|
|
10636
10747
|
var gpsMs4 = (week, sec) => GPS_EPOCH_MS20 + week * MS_PER_WEEK12 + sec * 1e3;
|
|
10637
10748
|
var sowOf5 = (dateMs) => (dateMs / 1e3 % SEC_PER_WEEK11 + SEC_PER_WEEK11) % SEC_PER_WEEK11;
|
|
10638
|
-
var
|
|
10749
|
+
var two7 = (n) => String(n).padStart(2, "0");
|
|
10639
10750
|
var Reader = class {
|
|
10640
10751
|
constructor(view, start, le) {
|
|
10641
10752
|
this.view = view;
|
|
@@ -10730,7 +10841,7 @@ function decodeGpsQzss(view, p, le, sys) {
|
|
|
10730
10841
|
const tocDate = new Date(gpsMs4(week, toes));
|
|
10731
10842
|
return {
|
|
10732
10843
|
system: sys,
|
|
10733
|
-
prn: `${sys}${
|
|
10844
|
+
prn: `${sys}${two7(prn)}`,
|
|
10734
10845
|
toc: sowOf5(tocDate.getTime()),
|
|
10735
10846
|
tocDate,
|
|
10736
10847
|
af0,
|
|
@@ -10763,7 +10874,7 @@ function decodeGalileo(view, p, le) {
|
|
|
10763
10874
|
const tocDate = new Date(gpsMs4(week, toes));
|
|
10764
10875
|
return {
|
|
10765
10876
|
system: "E",
|
|
10766
|
-
prn: `E${
|
|
10877
|
+
prn: `E${two7(prn)}`,
|
|
10767
10878
|
toc: sowOf5(tocDate.getTime()),
|
|
10768
10879
|
tocDate,
|
|
10769
10880
|
af0,
|
|
@@ -10801,7 +10912,7 @@ function decodeBeidou(view, p, le) {
|
|
|
10801
10912
|
const tocDate = new Date(BDT_EPOCH_MS5 + week * MS_PER_WEEK12 + toes * 1e3);
|
|
10802
10913
|
return {
|
|
10803
10914
|
system: "C",
|
|
10804
|
-
prn: `C${
|
|
10915
|
+
prn: `C${two7(prn)}`,
|
|
10805
10916
|
toc: sowOf5(tocDate.getTime()),
|
|
10806
10917
|
tocDate,
|
|
10807
10918
|
af0,
|
|
@@ -10841,7 +10952,7 @@ function decodeGlonass(view, p, le) {
|
|
|
10841
10952
|
);
|
|
10842
10953
|
return {
|
|
10843
10954
|
system: "R",
|
|
10844
|
-
prn: `R${
|
|
10955
|
+
prn: `R${two7(slot)}`,
|
|
10845
10956
|
tocDate,
|
|
10846
10957
|
tauN,
|
|
10847
10958
|
gammaN,
|
|
@@ -10880,7 +10991,7 @@ function decodeSbas(view, p, le) {
|
|
|
10880
10991
|
if (prn < 120 || prn > 158) return null;
|
|
10881
10992
|
return {
|
|
10882
10993
|
system: "S",
|
|
10883
|
-
prn: `S${
|
|
10994
|
+
prn: `S${two7(prn - 100)}`,
|
|
10884
10995
|
tocDate: new Date(gpsMs4(week, toe)),
|
|
10885
10996
|
tauN: af0,
|
|
10886
10997
|
gammaN: af1,
|
|
@@ -11057,22 +11168,22 @@ var OBS_CODES = {
|
|
|
11057
11168
|
]
|
|
11058
11169
|
// QZSS
|
|
11059
11170
|
};
|
|
11060
|
-
var
|
|
11171
|
+
var two8 = (n) => String(n).padStart(2, "0");
|
|
11061
11172
|
function obsPrn(sys, prn) {
|
|
11062
11173
|
switch (sys) {
|
|
11063
11174
|
case 0:
|
|
11064
|
-
return prn >= 1 && prn <= 32 ? `G${
|
|
11175
|
+
return prn >= 1 && prn <= 32 ? `G${two8(prn)}` : null;
|
|
11065
11176
|
case 1:
|
|
11066
|
-
return prn >= 1 && prn <= 27 ? `R${
|
|
11177
|
+
return prn >= 1 && prn <= 27 ? `R${two8(prn)}` : null;
|
|
11067
11178
|
case 2:
|
|
11068
|
-
return prn >= 120 && prn <= 158 ? `S${
|
|
11179
|
+
return prn >= 120 && prn <= 158 ? `S${two8(prn - 100)}` : null;
|
|
11069
11180
|
case 3:
|
|
11070
|
-
return prn >= 1 && prn <= 36 ? `E${
|
|
11181
|
+
return prn >= 1 && prn <= 36 ? `E${two8(prn)}` : null;
|
|
11071
11182
|
case 4:
|
|
11072
|
-
return prn >= 1 && prn <= 63 ? `C${
|
|
11183
|
+
return prn >= 1 && prn <= 63 ? `C${two8(prn)}` : null;
|
|
11073
11184
|
case 5:
|
|
11074
|
-
if (prn >= 193 && prn <= 202) return `J${
|
|
11075
|
-
return prn >= 1 && prn <= 10 ? `J${
|
|
11185
|
+
if (prn >= 193 && prn <= 202) return `J${two8(prn - 192)}`;
|
|
11186
|
+
return prn >= 1 && prn <= 10 ? `J${two8(prn)}` : null;
|
|
11076
11187
|
default:
|
|
11077
11188
|
return null;
|
|
11078
11189
|
}
|
|
@@ -13425,7 +13536,7 @@ var SEC_PER_WEEK12 = 604800;
|
|
|
13425
13536
|
var MAXSBSAGEF = 30;
|
|
13426
13537
|
var MAXSBSAGEL = 360;
|
|
13427
13538
|
var MAXBAND = 10;
|
|
13428
|
-
var
|
|
13539
|
+
var two9 = (n) => String(n).padStart(2, "0");
|
|
13429
13540
|
var VAR_FCORR = [
|
|
13430
13541
|
0.052,
|
|
13431
13542
|
0.0924,
|
|
@@ -13571,10 +13682,10 @@ var igpband2 = [
|
|
|
13571
13682
|
];
|
|
13572
13683
|
var gpsSeconds = (week, tow) => week * SEC_PER_WEEK12 + tow;
|
|
13573
13684
|
function maskPrn(i) {
|
|
13574
|
-
if (i >= 1 && i <= 37) return `G${
|
|
13575
|
-
if (i >= 38 && i <= 61) return `R${
|
|
13576
|
-
if (i >= 120 && i <= 138) return `S${
|
|
13577
|
-
if (i >= 193 && i <= 202) return `J${
|
|
13685
|
+
if (i >= 1 && i <= 37) return `G${two9(i)}`;
|
|
13686
|
+
if (i >= 38 && i <= 61) return `R${two9(i - 37)}`;
|
|
13687
|
+
if (i >= 120 && i <= 138) return `S${two9(i - 100)}`;
|
|
13688
|
+
if (i >= 193 && i <= 202) return `J${two9(i - 192)}`;
|
|
13578
13689
|
return null;
|
|
13579
13690
|
}
|
|
13580
13691
|
function ionppp(latRad, lonRad, azRad, elRad, re, hion) {
|
|
@@ -13613,7 +13724,7 @@ var SbasProcessor = class {
|
|
|
13613
13724
|
if (week === 0) return -1;
|
|
13614
13725
|
const type = sbasMessageType(msg);
|
|
13615
13726
|
if (geoPrn != null && geoPrn >= 120 && geoPrn <= 158)
|
|
13616
|
-
this.geoPrns.add(`S${
|
|
13727
|
+
this.geoPrns.add(`S${two9(geoPrn - 100)}`);
|
|
13617
13728
|
switch (type) {
|
|
13618
13729
|
case 1:
|
|
13619
13730
|
return this.decodeMask(msg) ? type : -1;
|
|
@@ -18162,6 +18273,7 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
|
|
|
18162
18273
|
dateToEpoch,
|
|
18163
18274
|
decodeBinexEph,
|
|
18164
18275
|
decodeEphemeris,
|
|
18276
|
+
decodeLegacyObs,
|
|
18165
18277
|
decodeMsmFull,
|
|
18166
18278
|
decodeSbfNavigation,
|
|
18167
18279
|
deg2dms,
|
package/dist/index.d.cts
CHANGED
|
@@ -10,7 +10,7 @@ export { E as EpochSummary, P as ParseOptions, R as RinexHeader, a as RinexResul
|
|
|
10
10
|
export { C as CnavEphemeris, E as Ephemeris, G as GlonassEphemeris, K as KeplerEphemeris, N as NavHeader, a as NavResult, R as RinexCnavEphemeris, p as parseNavFile } from './nav-DImXUdbp.cjs';
|
|
11
11
|
export { C as ClkFile, I as IonexGrid, S as Sp3File, a as Sp3Sample, c as clkBias, p as parseClk, b as parseIonex, d as parseSp3, s as sp3Position } from './clk-DGVBGRzA.cjs';
|
|
12
12
|
export { B as BitReader, E as EphemerisInfo, R as Rtcm3DebugHandler, a as Rtcm3Decoder, b as Rtcm3Frame, d as decodeEphemeris, r as readString, c as reportDecodeError, s as setRtcm3DebugHandler } from './ephemeris-Ohl6NAfw.cjs';
|
|
13
|
-
export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES, SatCn0, SignalCn0, StationMeta, StreamStats, createStationMeta, createStreamStats, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats } from './rtcm3.cjs';
|
|
13
|
+
export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES, SatCn0, SignalCn0, StationMeta, StreamStats, createStationMeta, createStreamStats, decodeLegacyObs, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats } from './rtcm3.cjs';
|
|
14
14
|
export { UbxCnavResult, UbxFrame, UbxIonoUtcResult, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxPvtResult, UbxRawNavOptions, UbxRawNavResult, UbxRawxEpoch, parseUbxCnav, parseUbxIonoUtc, parseUbxNav, parseUbxPvt, parseUbxRawNav, parseUbxRawx, ubxFrames } from './ubx.cjs';
|
|
15
15
|
export { DfmcCensus, DfmcMessageCb, GeoL5Result, HasMessage, SBAS_L5_MT_NAMES, SBAS_L5_PREAMBLE_UW, SbasMessageCb, SbfBdsNavResult, SbfCnavEphemeris, SbfCnavResult, SbfGalEphemeris, SbfGalNavResult, SbfGeoL5Result, SbfGeoNavResult, SbfGloNavResult, SbfGpsNavResult, SbfHasMessage, SbfHasResult, SbfIonoUtcResult, SbfMeasEpoch, SbfMeasurement, SbfNavCounts, SbfNavigation, SbfParseResult, SbfPvt, SbfPvtResult, SbfReceiverSetup, decodeSbfNavigation, feedGeoBlock, feedGeoL5Block, isSbasL1Preamble, isSbasL5Correction, parseSbfBdsNav, parseSbfCnav, parseSbfGalNav, parseSbfGeoL5, parseSbfGeoNav, parseSbfGloNav, parseSbfGpsNav, parseSbfHas, parseSbfIonoUtc, parseSbfMeas, parseSbfPvt, parseSbfReceiverSetup, sbasL5MessageName, sbasL5MessageType, sbfCrc16, scanSbfFrames } from './sbf.cjs';
|
|
16
16
|
export { NovatelEpoch, NovatelMeasurement, NovatelNavResult, NovatelParseResult, NovatelPvtResult, OEM4_HLEN, Oem4Frame, crc32, oem4Frames, parseNovatelNav, parseNovatelPvt, parseNovatelRange } from './novatel.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ export { E as EpochSummary, P as ParseOptions, R as RinexHeader, a as RinexResul
|
|
|
10
10
|
export { C as CnavEphemeris, E as Ephemeris, G as GlonassEphemeris, K as KeplerEphemeris, N as NavHeader, a as NavResult, R as RinexCnavEphemeris, p as parseNavFile } from './nav-DImXUdbp.js';
|
|
11
11
|
export { C as ClkFile, I as IonexGrid, S as Sp3File, a as Sp3Sample, c as clkBias, p as parseClk, b as parseIonex, d as parseSp3, s as sp3Position } from './clk-DGVBGRzA.js';
|
|
12
12
|
export { B as BitReader, E as EphemerisInfo, R as Rtcm3DebugHandler, a as Rtcm3Decoder, b as Rtcm3Frame, d as decodeEphemeris, r as readString, c as reportDecodeError, s as setRtcm3DebugHandler } from './ephemeris-Ohl6NAfw.js';
|
|
13
|
-
export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES, SatCn0, SignalCn0, StationMeta, StreamStats, createStationMeta, createStreamStats, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats } from './rtcm3.js';
|
|
13
|
+
export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES, SatCn0, SignalCn0, StationMeta, StreamStats, createStationMeta, createStreamStats, decodeLegacyObs, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats } from './rtcm3.js';
|
|
14
14
|
export { UbxCnavResult, UbxFrame, UbxIonoUtcResult, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxPvtResult, UbxRawNavOptions, UbxRawNavResult, UbxRawxEpoch, parseUbxCnav, parseUbxIonoUtc, parseUbxNav, parseUbxPvt, parseUbxRawNav, parseUbxRawx, ubxFrames } from './ubx.js';
|
|
15
15
|
export { DfmcCensus, DfmcMessageCb, GeoL5Result, HasMessage, SBAS_L5_MT_NAMES, SBAS_L5_PREAMBLE_UW, SbasMessageCb, SbfBdsNavResult, SbfCnavEphemeris, SbfCnavResult, SbfGalEphemeris, SbfGalNavResult, SbfGeoL5Result, SbfGeoNavResult, SbfGloNavResult, SbfGpsNavResult, SbfHasMessage, SbfHasResult, SbfIonoUtcResult, SbfMeasEpoch, SbfMeasurement, SbfNavCounts, SbfNavigation, SbfParseResult, SbfPvt, SbfPvtResult, SbfReceiverSetup, decodeSbfNavigation, feedGeoBlock, feedGeoL5Block, isSbasL1Preamble, isSbasL5Correction, parseSbfBdsNav, parseSbfCnav, parseSbfGalNav, parseSbfGeoL5, parseSbfGeoNav, parseSbfGloNav, parseSbfGpsNav, parseSbfHas, parseSbfIonoUtc, parseSbfMeas, parseSbfPvt, parseSbfReceiverSetup, sbasL5MessageName, sbasL5MessageType, sbfCrc16, scanSbfFrames } from './sbf.js';
|
|
16
16
|
export { NovatelEpoch, NovatelMeasurement, NovatelNavResult, NovatelParseResult, NovatelPvtResult, OEM4_HLEN, Oem4Frame, crc32, oem4Frames, parseNovatelNav, parseNovatelPvt, parseNovatelRange } from './novatel.js';
|
package/dist/index.js
CHANGED
|
@@ -275,6 +275,7 @@ import {
|
|
|
275
275
|
createStationMeta,
|
|
276
276
|
createStreamStats,
|
|
277
277
|
decodeEphemeris,
|
|
278
|
+
decodeLegacyObs,
|
|
278
279
|
decodeMsmFull,
|
|
279
280
|
msmEpochToDate,
|
|
280
281
|
readString,
|
|
@@ -285,7 +286,7 @@ import {
|
|
|
285
286
|
setRtcm3DebugHandler,
|
|
286
287
|
updateStationMeta,
|
|
287
288
|
updateStreamStats
|
|
288
|
-
} from "./chunk-
|
|
289
|
+
} from "./chunk-QN7Q2ALS.js";
|
|
289
290
|
import {
|
|
290
291
|
getBdsTime,
|
|
291
292
|
getDateFromBdsTime,
|
|
@@ -494,6 +495,7 @@ export {
|
|
|
494
495
|
dateToEpoch,
|
|
495
496
|
decodeBinexEph,
|
|
496
497
|
decodeEphemeris,
|
|
498
|
+
decodeLegacyObs,
|
|
497
499
|
decodeMsmFull,
|
|
498
500
|
decodeSbfNavigation,
|
|
499
501
|
deg2dms,
|
package/dist/rtcm3.cjs
CHANGED
|
@@ -26,6 +26,7 @@ __export(rtcm3_exports, {
|
|
|
26
26
|
createStationMeta: () => createStationMeta,
|
|
27
27
|
createStreamStats: () => createStreamStats,
|
|
28
28
|
decodeEphemeris: () => decodeEphemeris,
|
|
29
|
+
decodeLegacyObs: () => decodeLegacyObs,
|
|
29
30
|
decodeMsmFull: () => decodeMsmFull,
|
|
30
31
|
msmEpochToDate: () => msmEpochToDate,
|
|
31
32
|
readString: () => readString,
|
|
@@ -587,6 +588,145 @@ function decodeEphemeris(frame) {
|
|
|
587
588
|
}
|
|
588
589
|
}
|
|
589
590
|
|
|
591
|
+
// src/constants/gnss.ts
|
|
592
|
+
var C_LIGHT = 299792458;
|
|
593
|
+
var FREQ = {
|
|
594
|
+
G: { "1": 157542e4, "2": 12276e5, "5": 117645e4 },
|
|
595
|
+
// R bands 4/6 are the CDMA L1OC/L2OC center frequencies
|
|
596
|
+
R: { "3": 1202025e3, "4": 1600995e3, "6": 124806e4 },
|
|
597
|
+
E: {
|
|
598
|
+
"1": 157542e4,
|
|
599
|
+
"5": 117645e4,
|
|
600
|
+
"6": 127875e4,
|
|
601
|
+
"7": 120714e4,
|
|
602
|
+
"8": 1191795e3
|
|
603
|
+
},
|
|
604
|
+
C: {
|
|
605
|
+
"1": 157542e4,
|
|
606
|
+
"2": 1561098e3,
|
|
607
|
+
"5": 117645e4,
|
|
608
|
+
"6": 126852e4,
|
|
609
|
+
"7": 120714e4
|
|
610
|
+
},
|
|
611
|
+
J: { "1": 157542e4, "2": 12276e5, "5": 117645e4, "6": 127875e4 },
|
|
612
|
+
I: { "5": 117645e4, "9": 2492028e3 },
|
|
613
|
+
S: { "1": 157542e4, "5": 117645e4 }
|
|
614
|
+
};
|
|
615
|
+
var GLO_F1_BASE = 1602e6;
|
|
616
|
+
var GLO_F1_STEP = 562500;
|
|
617
|
+
var GLO_F2_BASE = 1246e6;
|
|
618
|
+
var GLO_F2_STEP = 437500;
|
|
619
|
+
|
|
620
|
+
// src/rtcm3/legacy-obs.ts
|
|
621
|
+
var PRUNIT_GPS = 299792.458;
|
|
622
|
+
var PRUNIT_GLO = 599584.916;
|
|
623
|
+
var LAM_GPS_L1 = C_LIGHT / 157542e4;
|
|
624
|
+
var LAM_GPS_L2 = C_LIGHT / 12276e5;
|
|
625
|
+
var PPR_INVALID = -(2 ** 19);
|
|
626
|
+
var PR21_INVALID = -(2 ** 13);
|
|
627
|
+
function legacyLockSec(i) {
|
|
628
|
+
if (i < 24) return i;
|
|
629
|
+
if (i < 48) return 2 * i - 24;
|
|
630
|
+
if (i < 72) return 4 * i - 120;
|
|
631
|
+
if (i < 96) return 8 * i - 408;
|
|
632
|
+
if (i < 120) return 16 * i - 1176;
|
|
633
|
+
if (i < 127) return 32 * i - 3096;
|
|
634
|
+
return 937;
|
|
635
|
+
}
|
|
636
|
+
var two = (n) => n.toString().padStart(2, "0");
|
|
637
|
+
function decodeLegacyObs(frame) {
|
|
638
|
+
const type = frame.messageType;
|
|
639
|
+
const gps = type >= 1001 && type <= 1004;
|
|
640
|
+
const glo = type >= 1009 && type <= 1012;
|
|
641
|
+
if (!gps && !glo) return null;
|
|
642
|
+
const ext = type === 1002 || type === 1004 || type === 1010 || type === 1012;
|
|
643
|
+
const dual = type === 1003 || type === 1004 || type === 1011 || type === 1012;
|
|
644
|
+
const system = gps ? "G" : "R";
|
|
645
|
+
const r = new BitReader(frame.payload);
|
|
646
|
+
r.readU(12);
|
|
647
|
+
r.readU(12);
|
|
648
|
+
let epochMs;
|
|
649
|
+
let nsat;
|
|
650
|
+
if (gps) {
|
|
651
|
+
epochMs = r.readU(30);
|
|
652
|
+
r.readU(1);
|
|
653
|
+
nsat = r.readU(5);
|
|
654
|
+
r.readU(1);
|
|
655
|
+
r.readU(3);
|
|
656
|
+
} else {
|
|
657
|
+
const tk = r.readU(27);
|
|
658
|
+
r.readU(1);
|
|
659
|
+
nsat = r.readU(5);
|
|
660
|
+
r.readU(1);
|
|
661
|
+
r.readU(3);
|
|
662
|
+
const gloDow = new Date(Date.now() + 3 * 36e5).getUTCDay();
|
|
663
|
+
epochMs = (gloDow << 27 | tk) >>> 0;
|
|
664
|
+
}
|
|
665
|
+
const observations = [];
|
|
666
|
+
for (let s = 0; s < nsat; s++) {
|
|
667
|
+
const satId = r.readU(6);
|
|
668
|
+
const code1 = r.readU(1);
|
|
669
|
+
const freqCh = glo ? r.readU(5) : 0;
|
|
670
|
+
const pr1raw = r.readU(gps ? 24 : 25);
|
|
671
|
+
const ppr1 = r.readS(20);
|
|
672
|
+
const lock1 = r.readU(7);
|
|
673
|
+
let amb = 0;
|
|
674
|
+
let cnr1 = 0;
|
|
675
|
+
if (ext) {
|
|
676
|
+
amb = r.readU(gps ? 8 : 7);
|
|
677
|
+
cnr1 = r.readU(8);
|
|
678
|
+
}
|
|
679
|
+
let code2 = 0;
|
|
680
|
+
let pr21 = 0;
|
|
681
|
+
let ppr2 = 0;
|
|
682
|
+
let lock2 = 0;
|
|
683
|
+
let cnr2 = 0;
|
|
684
|
+
if (dual) {
|
|
685
|
+
code2 = r.readU(2);
|
|
686
|
+
pr21 = r.readS(14);
|
|
687
|
+
ppr2 = r.readS(20);
|
|
688
|
+
lock2 = r.readU(7);
|
|
689
|
+
if (ext) cnr2 = r.readU(8);
|
|
690
|
+
}
|
|
691
|
+
if (gps && (satId < 1 || satId > 32)) continue;
|
|
692
|
+
if (glo && (satId < 1 || satId > 24)) continue;
|
|
693
|
+
const prunit = gps ? PRUNIT_GPS : PRUNIT_GLO;
|
|
694
|
+
const pr1 = pr1raw * 0.02 + amb * prunit;
|
|
695
|
+
const k = freqCh - 7;
|
|
696
|
+
const lamL1 = gps ? LAM_GPS_L1 : C_LIGHT / (GLO_F1_BASE + k * GLO_F1_STEP);
|
|
697
|
+
const lamL2 = gps ? LAM_GPS_L2 : C_LIGHT / (GLO_F2_BASE + k * GLO_F2_STEP);
|
|
698
|
+
const signals = [];
|
|
699
|
+
{
|
|
700
|
+
const sig = {
|
|
701
|
+
rinexCode: gps ? code1 ? "1W" : "1C" : code1 ? "1P" : "1C",
|
|
702
|
+
pseudorange: pr1,
|
|
703
|
+
wavelength: lamL1,
|
|
704
|
+
lockTime: legacyLockSec(lock1)
|
|
705
|
+
};
|
|
706
|
+
if (ppr1 !== PPR_INVALID) sig.phase = (pr1 + ppr1 * 5e-4) / lamL1;
|
|
707
|
+
if (ext && cnr1 > 0) sig.cn0 = cnr1 * 0.25;
|
|
708
|
+
signals.push(sig);
|
|
709
|
+
}
|
|
710
|
+
if (dual) {
|
|
711
|
+
const sig = {
|
|
712
|
+
rinexCode: gps ? code2 === 0 ? "2X" : "2W" : code2 === 0 ? "2C" : "2P",
|
|
713
|
+
wavelength: lamL2,
|
|
714
|
+
lockTime: legacyLockSec(lock2)
|
|
715
|
+
};
|
|
716
|
+
if (pr21 !== PR21_INVALID) sig.pseudorange = pr1 + pr21 * 0.02;
|
|
717
|
+
if (ppr2 !== PPR_INVALID) sig.phase = (pr1 + ppr2 * 5e-4) / lamL2;
|
|
718
|
+
if (ext && cnr2 > 0) sig.cn0 = cnr2 * 0.25;
|
|
719
|
+
signals.push(sig);
|
|
720
|
+
}
|
|
721
|
+
observations.push({
|
|
722
|
+
prn: `${system}${two(satId)}`,
|
|
723
|
+
system,
|
|
724
|
+
signals
|
|
725
|
+
});
|
|
726
|
+
}
|
|
727
|
+
return { messageType: type, epochMs, system, observations };
|
|
728
|
+
}
|
|
729
|
+
|
|
590
730
|
// src/constants/time.ts
|
|
591
731
|
var MILLISECONDS_IN_WEEK = 6048e5;
|
|
592
732
|
var MILLISECONDS_IN_SECOND = 1e3;
|
|
@@ -677,35 +817,6 @@ function getGpsLeap(date) {
|
|
|
677
817
|
return leap_seconds - 19;
|
|
678
818
|
}
|
|
679
819
|
|
|
680
|
-
// src/constants/gnss.ts
|
|
681
|
-
var C_LIGHT = 299792458;
|
|
682
|
-
var FREQ = {
|
|
683
|
-
G: { "1": 157542e4, "2": 12276e5, "5": 117645e4 },
|
|
684
|
-
// R bands 4/6 are the CDMA L1OC/L2OC center frequencies
|
|
685
|
-
R: { "3": 1202025e3, "4": 1600995e3, "6": 124806e4 },
|
|
686
|
-
E: {
|
|
687
|
-
"1": 157542e4,
|
|
688
|
-
"5": 117645e4,
|
|
689
|
-
"6": 127875e4,
|
|
690
|
-
"7": 120714e4,
|
|
691
|
-
"8": 1191795e3
|
|
692
|
-
},
|
|
693
|
-
C: {
|
|
694
|
-
"1": 157542e4,
|
|
695
|
-
"2": 1561098e3,
|
|
696
|
-
"5": 117645e4,
|
|
697
|
-
"6": 126852e4,
|
|
698
|
-
"7": 120714e4
|
|
699
|
-
},
|
|
700
|
-
J: { "1": 157542e4, "2": 12276e5, "5": 117645e4, "6": 127875e4 },
|
|
701
|
-
I: { "5": 117645e4, "9": 2492028e3 },
|
|
702
|
-
S: { "1": 157542e4, "5": 117645e4 }
|
|
703
|
-
};
|
|
704
|
-
var GLO_F1_BASE = 1602e6;
|
|
705
|
-
var GLO_F1_STEP = 562500;
|
|
706
|
-
var GLO_F2_BASE = 1246e6;
|
|
707
|
-
var GLO_F2_STEP = 437500;
|
|
708
|
-
|
|
709
820
|
// src/rtcm3/msm.ts
|
|
710
821
|
var GPS_L1 = FREQ.G["1"];
|
|
711
822
|
var GPS_L2 = FREQ.G["2"];
|
|
@@ -1590,6 +1701,7 @@ function updateStreamStats(stats, frames, rawBytes) {
|
|
|
1590
1701
|
createStationMeta,
|
|
1591
1702
|
createStreamStats,
|
|
1592
1703
|
decodeEphemeris,
|
|
1704
|
+
decodeLegacyObs,
|
|
1593
1705
|
decodeMsmFull,
|
|
1594
1706
|
msmEpochToDate,
|
|
1595
1707
|
readString,
|
package/dist/rtcm3.d.cts
CHANGED
|
@@ -82,6 +82,12 @@ declare function setGloFreqNumber(slot: number, k: number): void;
|
|
|
82
82
|
*/
|
|
83
83
|
declare function resetGloFreqCache(): void;
|
|
84
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Decode a legacy RTCM3 observation frame (1001–1004 GPS, 1009–1012 GLONASS)
|
|
87
|
+
* into an {@link MsmEpoch}, or null for any other message type.
|
|
88
|
+
*/
|
|
89
|
+
declare function decodeLegacyObs(frame: Rtcm3Frame): MsmEpoch | null;
|
|
90
|
+
|
|
85
91
|
/**
|
|
86
92
|
* RTCM3 station metadata decoders (messages 1005/1006, 1007/1008, 1029, 1033).
|
|
87
93
|
*/
|
|
@@ -154,4 +160,4 @@ declare function rtcm3Constellation(msgType: number): string | null;
|
|
|
154
160
|
declare function createStreamStats(): StreamStats;
|
|
155
161
|
declare function updateStreamStats(stats: StreamStats, frames: Rtcm3Frame[], rawBytes: number): void;
|
|
156
162
|
|
|
157
|
-
export { EphemerisInfo, type MessageTypeStats, type MsmEpoch, type MsmSatObs, type MsmSignal, RTCM3_MESSAGE_NAMES, Rtcm3Frame, type SatCn0, type SignalCn0, type StationMeta, type StreamStats, createStationMeta, createStreamStats, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats };
|
|
163
|
+
export { EphemerisInfo, type MessageTypeStats, type MsmEpoch, type MsmSatObs, type MsmSignal, RTCM3_MESSAGE_NAMES, Rtcm3Frame, type SatCn0, type SignalCn0, type StationMeta, type StreamStats, createStationMeta, createStreamStats, decodeLegacyObs, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats };
|
package/dist/rtcm3.d.ts
CHANGED
|
@@ -82,6 +82,12 @@ declare function setGloFreqNumber(slot: number, k: number): void;
|
|
|
82
82
|
*/
|
|
83
83
|
declare function resetGloFreqCache(): void;
|
|
84
84
|
|
|
85
|
+
/**
|
|
86
|
+
* Decode a legacy RTCM3 observation frame (1001–1004 GPS, 1009–1012 GLONASS)
|
|
87
|
+
* into an {@link MsmEpoch}, or null for any other message type.
|
|
88
|
+
*/
|
|
89
|
+
declare function decodeLegacyObs(frame: Rtcm3Frame): MsmEpoch | null;
|
|
90
|
+
|
|
85
91
|
/**
|
|
86
92
|
* RTCM3 station metadata decoders (messages 1005/1006, 1007/1008, 1029, 1033).
|
|
87
93
|
*/
|
|
@@ -154,4 +160,4 @@ declare function rtcm3Constellation(msgType: number): string | null;
|
|
|
154
160
|
declare function createStreamStats(): StreamStats;
|
|
155
161
|
declare function updateStreamStats(stats: StreamStats, frames: Rtcm3Frame[], rawBytes: number): void;
|
|
156
162
|
|
|
157
|
-
export { EphemerisInfo, type MessageTypeStats, type MsmEpoch, type MsmSatObs, type MsmSignal, RTCM3_MESSAGE_NAMES, Rtcm3Frame, type SatCn0, type SignalCn0, type StationMeta, type StreamStats, createStationMeta, createStreamStats, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats };
|
|
163
|
+
export { EphemerisInfo, type MessageTypeStats, type MsmEpoch, type MsmSatObs, type MsmSignal, RTCM3_MESSAGE_NAMES, Rtcm3Frame, type SatCn0, type SignalCn0, type StationMeta, type StreamStats, createStationMeta, createStreamStats, decodeLegacyObs, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats };
|
package/dist/rtcm3.js
CHANGED
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
createStationMeta,
|
|
6
6
|
createStreamStats,
|
|
7
7
|
decodeEphemeris,
|
|
8
|
+
decodeLegacyObs,
|
|
8
9
|
decodeMsmFull,
|
|
9
10
|
msmEpochToDate,
|
|
10
11
|
readString,
|
|
@@ -15,7 +16,7 @@ import {
|
|
|
15
16
|
setRtcm3DebugHandler,
|
|
16
17
|
updateStationMeta,
|
|
17
18
|
updateStreamStats
|
|
18
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-QN7Q2ALS.js";
|
|
19
20
|
import "./chunk-HVXYFUCB.js";
|
|
20
21
|
import "./chunk-LEEU5OIO.js";
|
|
21
22
|
import "./chunk-FIEWO4J4.js";
|
|
@@ -26,6 +27,7 @@ export {
|
|
|
26
27
|
createStationMeta,
|
|
27
28
|
createStreamStats,
|
|
28
29
|
decodeEphemeris,
|
|
30
|
+
decodeLegacyObs,
|
|
29
31
|
decodeMsmFull,
|
|
30
32
|
msmEpochToDate,
|
|
31
33
|
readString,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "gnss-js",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.63.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,
|