gnss-js 1.16.0 → 1.17.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-R33A2VA7.js → chunk-7QR2KPDU.js} +188 -12
- package/dist/{chunk-6CX6EXRK.js → chunk-IG5CDNDS.js} +58 -23
- package/dist/{chunk-4LVD4DYL.js → chunk-REYOYF7O.js} +1 -0
- package/dist/{chunk-YPOVPXNK.js → chunk-ZNCQNHNI.js} +34 -0
- package/dist/index.cjs +283 -37
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +8 -4
- package/dist/novatel.cjs +187 -11
- package/dist/novatel.d.cts +36 -13
- package/dist/novatel.d.ts +36 -13
- package/dist/novatel.js +2 -2
- package/dist/sbf.cjs +35 -0
- package/dist/sbf.d.cts +41 -1
- package/dist/sbf.d.ts +41 -1
- package/dist/sbf.js +3 -1
- package/dist/ubx.cjs +57 -22
- package/dist/ubx.d.cts +42 -2
- package/dist/ubx.d.ts +42 -2
- package/dist/ubx.js +4 -2
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -222,11 +222,13 @@ __export(src_exports, {
|
|
|
222
222
|
parseNovatelRange: () => parseNovatelRange,
|
|
223
223
|
parseRinexStream: () => parseRinexStream,
|
|
224
224
|
parseSbfAlmanac: () => parseSbfAlmanac,
|
|
225
|
+
parseSbfIonoUtc: () => parseSbfIonoUtc,
|
|
225
226
|
parseSbfMeas: () => parseSbfMeas,
|
|
226
227
|
parseSbfNav: () => parseSbfNav,
|
|
227
228
|
parseSinexBiasDcb: () => parseSinexBiasDcb,
|
|
228
229
|
parseSourcetable: () => parseSourcetable,
|
|
229
230
|
parseSp3: () => parseSp3,
|
|
231
|
+
parseUbxIonoUtc: () => parseUbxIonoUtc,
|
|
230
232
|
parseUbxNav: () => parseUbxNav,
|
|
231
233
|
parseUbxRawx: () => parseUbxRawx,
|
|
232
234
|
phiAltBOC: () => phiAltBOC,
|
|
@@ -4777,6 +4779,30 @@ function decodeGpsLnavFrame(subframes, opts = {}) {
|
|
|
4777
4779
|
|
|
4778
4780
|
// src/ubx/nav.ts
|
|
4779
4781
|
var PREAMB_CNAV = 139;
|
|
4782
|
+
function readLnavSubframe(view, f) {
|
|
4783
|
+
const p = f.payload;
|
|
4784
|
+
if (p.length < 8) return null;
|
|
4785
|
+
const gnssId = p[0];
|
|
4786
|
+
const svId = p[1];
|
|
4787
|
+
let prn;
|
|
4788
|
+
if (gnssId === 0 && svId >= 1 && svId <= 32) {
|
|
4789
|
+
prn = `G${String(svId).padStart(2, "0")}`;
|
|
4790
|
+
} else if (gnssId === 5 && svId >= 1 && svId <= 10) {
|
|
4791
|
+
if (p.length === 44) return null;
|
|
4792
|
+
prn = `J${String(svId).padStart(2, "0")}`;
|
|
4793
|
+
} else {
|
|
4794
|
+
return null;
|
|
4795
|
+
}
|
|
4796
|
+
if (p.length < 8 + 40) return null;
|
|
4797
|
+
const base = f.payloadStart + 8;
|
|
4798
|
+
if (view.getUint32(base, true) >>> 24 === PREAMB_CNAV) return null;
|
|
4799
|
+
const buff = new Uint8Array(30);
|
|
4800
|
+
for (let k = 0; k < 10; k++) {
|
|
4801
|
+
const dwrd = view.getUint32(base + 4 * k, true);
|
|
4802
|
+
setBitU(buff, 24 * k, 24, dwrd >>> 6 & 16777215);
|
|
4803
|
+
}
|
|
4804
|
+
return { prn, gnssId, svId, buff, id: getBitU(buff, 43, 3) };
|
|
4805
|
+
}
|
|
4780
4806
|
function parseUbxNav(data, opts = {}) {
|
|
4781
4807
|
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
4782
4808
|
const ephemerides = [];
|
|
@@ -4798,28 +4824,9 @@ function parseUbxNav(data, opts = {}) {
|
|
|
4798
4824
|
const last = /* @__PURE__ */ new Map();
|
|
4799
4825
|
for (const f of ubxFrames(data)) {
|
|
4800
4826
|
if (f.msgClass !== 2 || f.msgId !== 19) continue;
|
|
4801
|
-
const
|
|
4802
|
-
if (
|
|
4803
|
-
const gnssId =
|
|
4804
|
-
const svId = p[1];
|
|
4805
|
-
let prn;
|
|
4806
|
-
if (gnssId === 0 && svId >= 1 && svId <= 32) {
|
|
4807
|
-
prn = `G${String(svId).padStart(2, "0")}`;
|
|
4808
|
-
} else if (gnssId === 5 && svId >= 1 && svId <= 10) {
|
|
4809
|
-
if (p.length === 44) continue;
|
|
4810
|
-
prn = `J${String(svId).padStart(2, "0")}`;
|
|
4811
|
-
} else {
|
|
4812
|
-
continue;
|
|
4813
|
-
}
|
|
4814
|
-
if (p.length < 8 + 40) continue;
|
|
4815
|
-
const base = f.payloadStart + 8;
|
|
4816
|
-
if (view.getUint32(base, true) >>> 24 === PREAMB_CNAV) continue;
|
|
4817
|
-
const buff = new Uint8Array(30);
|
|
4818
|
-
for (let k = 0; k < 10; k++) {
|
|
4819
|
-
const dwrd = view.getUint32(base + 4 * k, true);
|
|
4820
|
-
setBitU(buff, 24 * k, 24, dwrd >>> 6 & 16777215);
|
|
4821
|
-
}
|
|
4822
|
-
const id = getBitU(buff, 43, 3);
|
|
4827
|
+
const lnav = readLnavSubframe(view, f);
|
|
4828
|
+
if (!lnav) continue;
|
|
4829
|
+
const { prn, gnssId, svId, buff, id } = lnav;
|
|
4823
4830
|
if (id < 1 || id > 5) {
|
|
4824
4831
|
badParity++;
|
|
4825
4832
|
continue;
|
|
@@ -4849,6 +4856,34 @@ function parseUbxNav(data, opts = {}) {
|
|
|
4849
4856
|
return { ephemerides, badParity };
|
|
4850
4857
|
}
|
|
4851
4858
|
|
|
4859
|
+
// src/ubx/iono.ts
|
|
4860
|
+
function parseUbxIonoUtc(data) {
|
|
4861
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
4862
|
+
const ionoCorrections = {};
|
|
4863
|
+
let leapSeconds = null;
|
|
4864
|
+
for (const f of ubxFrames(data)) {
|
|
4865
|
+
if (f.msgClass !== 2 || f.msgId !== 19) continue;
|
|
4866
|
+
const sf = readLnavSubframe(view, f);
|
|
4867
|
+
if (!sf || sf.gnssId !== 0 || sf.id !== 4) continue;
|
|
4868
|
+
const b = sf.buff;
|
|
4869
|
+
if (getBitU(b, 48, 2) !== 1 || getBitU(b, 50, 6) !== 56) continue;
|
|
4870
|
+
ionoCorrections["GPSA"] = [
|
|
4871
|
+
getBitS(b, 56, 8) * 2 ** -30,
|
|
4872
|
+
getBitS(b, 64, 8) * 2 ** -27,
|
|
4873
|
+
getBitS(b, 72, 8) * 2 ** -24,
|
|
4874
|
+
getBitS(b, 80, 8) * 2 ** -24
|
|
4875
|
+
];
|
|
4876
|
+
ionoCorrections["GPSB"] = [
|
|
4877
|
+
getBitS(b, 88, 8) * 2 ** 11,
|
|
4878
|
+
getBitS(b, 96, 8) * 2 ** 14,
|
|
4879
|
+
getBitS(b, 104, 8) * 2 ** 16,
|
|
4880
|
+
getBitS(b, 112, 8) * 2 ** 16
|
|
4881
|
+
];
|
|
4882
|
+
leapSeconds = getBitS(b, 192, 8);
|
|
4883
|
+
}
|
|
4884
|
+
return { ionoCorrections, leapSeconds };
|
|
4885
|
+
}
|
|
4886
|
+
|
|
4852
4887
|
// src/ubx/index.ts
|
|
4853
4888
|
var GPS_EPOCH_MS2 = Date.UTC(1980, 0, 6);
|
|
4854
4889
|
var MS_PER_WEEK2 = 7 * 864e5;
|
|
@@ -5311,6 +5346,39 @@ function parseSbfAlmanac(data) {
|
|
|
5311
5346
|
return { almanacs, badCrc };
|
|
5312
5347
|
}
|
|
5313
5348
|
|
|
5349
|
+
// src/sbf/iono.ts
|
|
5350
|
+
var F4_DNU2 = -2e10;
|
|
5351
|
+
function parseSbfIonoUtc(data) {
|
|
5352
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
5353
|
+
const ionoCorrections = {};
|
|
5354
|
+
let leapSeconds = null;
|
|
5355
|
+
const f4s = (b, n) => {
|
|
5356
|
+
const out = [];
|
|
5357
|
+
for (let k = 0; k < n; k++) {
|
|
5358
|
+
const v = view.getFloat32(b + 4 * k, true);
|
|
5359
|
+
if (v === F4_DNU2) return null;
|
|
5360
|
+
out.push(v);
|
|
5361
|
+
}
|
|
5362
|
+
return out;
|
|
5363
|
+
};
|
|
5364
|
+
scanSbfFrames(data, view, (id, b, len) => {
|
|
5365
|
+
if ((id === 5893 || id === 4120) && len >= 48) {
|
|
5366
|
+
const alpha = f4s(b + 16, 4);
|
|
5367
|
+
const beta = f4s(b + 32, 4);
|
|
5368
|
+
if (!alpha || !beta) return;
|
|
5369
|
+
const sys = id === 5893 ? "GPS" : "BDS";
|
|
5370
|
+
ionoCorrections[`${sys}A`] = alpha;
|
|
5371
|
+
ionoCorrections[`${sys}B`] = beta;
|
|
5372
|
+
} else if (id === 4030 && len >= 28) {
|
|
5373
|
+
const ai = f4s(b + 16, 3);
|
|
5374
|
+
if (ai) ionoCorrections["GAL"] = ai;
|
|
5375
|
+
} else if (id === 5894 && len >= 37) {
|
|
5376
|
+
leapSeconds = view.getInt8(b + 33);
|
|
5377
|
+
}
|
|
5378
|
+
});
|
|
5379
|
+
return { ionoCorrections, leapSeconds };
|
|
5380
|
+
}
|
|
5381
|
+
|
|
5314
5382
|
// src/sbf/index.ts
|
|
5315
5383
|
var CLIGHT = 299792458;
|
|
5316
5384
|
var GPS_EPOCH_MS4 = Date.UTC(1980, 0, 6);
|
|
@@ -6024,11 +6092,26 @@ function* oem4Frames(data, view, stats) {
|
|
|
6024
6092
|
}
|
|
6025
6093
|
|
|
6026
6094
|
// src/novatel/nav.ts
|
|
6095
|
+
var ID_IONUTC = 8;
|
|
6027
6096
|
var ID_RAWEPHEM = 41;
|
|
6028
6097
|
var ID_GLOEPHEMERIS = 723;
|
|
6098
|
+
var ID_GALEPHEMERIS = 1122;
|
|
6099
|
+
var ID_QZSSEPHEMERIS = 1336;
|
|
6100
|
+
var ID_BDSEPHEMERIS = 1696;
|
|
6029
6101
|
var GPS_EPOCH_MS5 = Date.UTC(1980, 0, 6);
|
|
6102
|
+
var BDT_EPOCH_MS2 = Date.UTC(2006, 0, 1);
|
|
6030
6103
|
var SEC_PER_WEEK3 = 7 * 86400;
|
|
6031
6104
|
var SEC_PER_DAY = 86400;
|
|
6105
|
+
var MS_PER_WEEK5 = SEC_PER_WEEK3 * 1e3;
|
|
6106
|
+
var gpsMs2 = (week, sec) => GPS_EPOCH_MS5 + week * MS_PER_WEEK5 + sec * 1e3;
|
|
6107
|
+
var sowOf2 = (dateMs) => dateMs / 1e3 % SEC_PER_WEEK3;
|
|
6108
|
+
function nearWeekMs(refMs, sow) {
|
|
6109
|
+
const refWeek = Math.floor((refMs - GPS_EPOCH_MS5) / MS_PER_WEEK5);
|
|
6110
|
+
let ms = gpsMs2(refWeek, sow);
|
|
6111
|
+
if (ms < refMs - MS_PER_WEEK5 / 2) ms += MS_PER_WEEK5;
|
|
6112
|
+
else if (ms > refMs + MS_PER_WEEK5 / 2) ms -= MS_PER_WEEK5;
|
|
6113
|
+
return ms;
|
|
6114
|
+
}
|
|
6032
6115
|
function decodeRawEphem(data, view, p) {
|
|
6033
6116
|
const prn = view.getUint32(p, true);
|
|
6034
6117
|
if (prn < 1 || prn > 32) return null;
|
|
@@ -6074,23 +6157,184 @@ function decodeGloEphemeris(view, p) {
|
|
|
6074
6157
|
freqNum
|
|
6075
6158
|
};
|
|
6076
6159
|
}
|
|
6160
|
+
function decodeGalEphemeris(view, p, headerMs) {
|
|
6161
|
+
const prn = view.getUint32(p, true);
|
|
6162
|
+
if (prn < 1 || prn > 36) return null;
|
|
6163
|
+
const fnav = (view.getUint32(p + 4, true) & 1) !== 0;
|
|
6164
|
+
const svhE1b = view.getUint8(p + 12) & 3;
|
|
6165
|
+
const svhE5a = view.getUint8(p + 13) & 3;
|
|
6166
|
+
const svhE5b = view.getUint8(p + 14) & 3;
|
|
6167
|
+
const dvsE1b = view.getUint8(p + 15) & 1;
|
|
6168
|
+
const dvsE5a = view.getUint8(p + 16) & 1;
|
|
6169
|
+
const dvsE5b = view.getUint8(p + 17) & 1;
|
|
6170
|
+
const iodNav = view.getUint32(p + 20, true);
|
|
6171
|
+
const toes = view.getUint32(p + 24, true);
|
|
6172
|
+
const c = fnav ? p + 148 : p + 176;
|
|
6173
|
+
const tocs = view.getUint32(c, true);
|
|
6174
|
+
const toeMs = nearWeekMs(headerMs, toes);
|
|
6175
|
+
const tocDate = new Date(nearWeekMs(headerMs, tocs));
|
|
6176
|
+
return {
|
|
6177
|
+
fnav,
|
|
6178
|
+
eph: {
|
|
6179
|
+
system: "E",
|
|
6180
|
+
prn: `E${String(prn).padStart(2, "0")}`,
|
|
6181
|
+
toc: sowOf2(tocDate.getTime()),
|
|
6182
|
+
tocDate,
|
|
6183
|
+
af0: view.getFloat64(c + 4, true),
|
|
6184
|
+
af1: view.getFloat64(c + 12, true),
|
|
6185
|
+
af2: view.getFloat64(c + 20, true),
|
|
6186
|
+
iode: iodNav,
|
|
6187
|
+
crs: view.getFloat64(p + 92, true),
|
|
6188
|
+
deltaN: view.getFloat64(p + 36, true),
|
|
6189
|
+
m0: view.getFloat64(p + 44, true),
|
|
6190
|
+
cuc: view.getFloat64(p + 68, true),
|
|
6191
|
+
e: view.getFloat64(p + 52, true),
|
|
6192
|
+
cus: view.getFloat64(p + 76, true),
|
|
6193
|
+
sqrtA: view.getFloat64(p + 28, true),
|
|
6194
|
+
toe: toes,
|
|
6195
|
+
cic: view.getFloat64(p + 100, true),
|
|
6196
|
+
omega0: view.getFloat64(p + 132, true),
|
|
6197
|
+
cis: view.getFloat64(p + 108, true),
|
|
6198
|
+
i0: view.getFloat64(p + 116, true),
|
|
6199
|
+
crc: view.getFloat64(p + 84, true),
|
|
6200
|
+
omega: view.getFloat64(p + 60, true),
|
|
6201
|
+
omegaDot: view.getFloat64(p + 140, true),
|
|
6202
|
+
idot: view.getFloat64(p + 124, true),
|
|
6203
|
+
week: Math.floor((toeMs - GPS_EPOCH_MS5) / MS_PER_WEEK5),
|
|
6204
|
+
// RINEX Galileo SVH bit layout (E1B DVS/HS in bits 0-2, E5a in
|
|
6205
|
+
// 3-5, E5b in 6-8) — same packing as RTKLIB.
|
|
6206
|
+
svHealth: svhE5b << 7 | dvsE5b << 6 | svhE5a << 4 | dvsE5a << 3 | svhE1b << 1 | dvsE1b,
|
|
6207
|
+
tgd: view.getFloat64(p + 204, true)
|
|
6208
|
+
// BGD E5a/E1 (RINEX slot)
|
|
6209
|
+
}
|
|
6210
|
+
};
|
|
6211
|
+
}
|
|
6212
|
+
function decodeBdsEphemeris2(view, p) {
|
|
6213
|
+
const prn = view.getUint32(p, true);
|
|
6214
|
+
if (prn < 1 || prn > 63) return null;
|
|
6215
|
+
const week = view.getUint32(p + 4, true);
|
|
6216
|
+
const health = view.getUint32(p + 16, true) & 1;
|
|
6217
|
+
const tgd1 = view.getFloat64(p + 20, true);
|
|
6218
|
+
const tocs = view.getUint32(p + 40, true);
|
|
6219
|
+
const toes = view.getUint32(p + 72, true);
|
|
6220
|
+
const tocDate = new Date(BDT_EPOCH_MS2 + week * MS_PER_WEEK5 + tocs * 1e3);
|
|
6221
|
+
return {
|
|
6222
|
+
system: "C",
|
|
6223
|
+
prn: `C${String(prn).padStart(2, "0")}`,
|
|
6224
|
+
toc: sowOf2(tocDate.getTime()),
|
|
6225
|
+
tocDate,
|
|
6226
|
+
af0: view.getFloat64(p + 44, true),
|
|
6227
|
+
af1: view.getFloat64(p + 52, true),
|
|
6228
|
+
af2: view.getFloat64(p + 60, true),
|
|
6229
|
+
iode: view.getUint32(p + 68, true),
|
|
6230
|
+
// AODE
|
|
6231
|
+
crs: view.getFloat64(p + 172, true),
|
|
6232
|
+
deltaN: view.getFloat64(p + 100, true),
|
|
6233
|
+
m0: view.getFloat64(p + 108, true),
|
|
6234
|
+
cuc: view.getFloat64(p + 148, true),
|
|
6235
|
+
e: view.getFloat64(p + 84, true),
|
|
6236
|
+
cus: view.getFloat64(p + 156, true),
|
|
6237
|
+
sqrtA: view.getFloat64(p + 76, true),
|
|
6238
|
+
toe: toes,
|
|
6239
|
+
cic: view.getFloat64(p + 180, true),
|
|
6240
|
+
omega0: view.getFloat64(p + 116, true),
|
|
6241
|
+
cis: view.getFloat64(p + 188, true),
|
|
6242
|
+
i0: view.getFloat64(p + 132, true),
|
|
6243
|
+
crc: view.getFloat64(p + 164, true),
|
|
6244
|
+
omega: view.getFloat64(p + 92, true),
|
|
6245
|
+
omegaDot: view.getFloat64(p + 124, true),
|
|
6246
|
+
idot: view.getFloat64(p + 140, true),
|
|
6247
|
+
week,
|
|
6248
|
+
// RINEX BDS week field is the BDT week
|
|
6249
|
+
svHealth: health,
|
|
6250
|
+
tgd: tgd1
|
|
6251
|
+
// TGD1 (B1) — RINEX slot
|
|
6252
|
+
};
|
|
6253
|
+
}
|
|
6254
|
+
function decodeQzssEphemeris2(view, p) {
|
|
6255
|
+
const prn = view.getUint32(p, true);
|
|
6256
|
+
if (prn < 193 || prn > 202) return null;
|
|
6257
|
+
const health = view.getUint32(p + 12, true) & 63;
|
|
6258
|
+
const iode1 = view.getUint32(p + 16, true);
|
|
6259
|
+
const week = view.getUint32(p + 24, true);
|
|
6260
|
+
const toes = view.getFloat64(p + 32, true);
|
|
6261
|
+
const toeMs = gpsMs2(week, toes);
|
|
6262
|
+
const tocs = view.getFloat64(p + 164, true);
|
|
6263
|
+
const tocDate = new Date(nearWeekMs(toeMs, tocs));
|
|
6264
|
+
return {
|
|
6265
|
+
system: "J",
|
|
6266
|
+
prn: `J${String(prn - 192).padStart(2, "0")}`,
|
|
6267
|
+
toc: sowOf2(tocDate.getTime()),
|
|
6268
|
+
tocDate,
|
|
6269
|
+
af0: view.getFloat64(p + 180, true),
|
|
6270
|
+
af1: view.getFloat64(p + 188, true),
|
|
6271
|
+
af2: view.getFloat64(p + 196, true),
|
|
6272
|
+
iode: iode1,
|
|
6273
|
+
crs: view.getFloat64(p + 104, true),
|
|
6274
|
+
deltaN: view.getFloat64(p + 48, true),
|
|
6275
|
+
m0: view.getFloat64(p + 56, true),
|
|
6276
|
+
cuc: view.getFloat64(p + 80, true),
|
|
6277
|
+
e: view.getFloat64(p + 64, true),
|
|
6278
|
+
cus: view.getFloat64(p + 88, true),
|
|
6279
|
+
sqrtA: Math.sqrt(view.getFloat64(p + 40, true)),
|
|
6280
|
+
toe: toes,
|
|
6281
|
+
cic: view.getFloat64(p + 112, true),
|
|
6282
|
+
omega0: view.getFloat64(p + 144, true),
|
|
6283
|
+
cis: view.getFloat64(p + 120, true),
|
|
6284
|
+
i0: view.getFloat64(p + 128, true),
|
|
6285
|
+
crc: view.getFloat64(p + 96, true),
|
|
6286
|
+
omega: view.getFloat64(p + 72, true),
|
|
6287
|
+
omegaDot: view.getFloat64(p + 152, true),
|
|
6288
|
+
idot: view.getFloat64(p + 136, true),
|
|
6289
|
+
week,
|
|
6290
|
+
svHealth: health,
|
|
6291
|
+
tgd: view.getFloat64(p + 172, true)
|
|
6292
|
+
};
|
|
6293
|
+
}
|
|
6077
6294
|
function parseNovatelNav(data) {
|
|
6078
6295
|
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
6079
6296
|
const stats = { badCrc: 0 };
|
|
6080
6297
|
const ephemerides = [];
|
|
6081
|
-
const
|
|
6298
|
+
const ionoCorrections = {};
|
|
6299
|
+
let leapSeconds = null;
|
|
6300
|
+
const lastKep = /* @__PURE__ */ new Map();
|
|
6082
6301
|
const lastGlo = /* @__PURE__ */ new Map();
|
|
6302
|
+
const pushKepler = (key, eph) => {
|
|
6303
|
+
const prev = lastKep.get(key);
|
|
6304
|
+
if (prev && prev.iode === eph.iode && prev.toe === eph.toe && prev.tocDate.getTime() === eph.tocDate.getTime()) {
|
|
6305
|
+
return;
|
|
6306
|
+
}
|
|
6307
|
+
lastKep.set(key, eph);
|
|
6308
|
+
ephemerides.push(eph);
|
|
6309
|
+
};
|
|
6083
6310
|
for (const frame of oem4Frames(data, view, stats)) {
|
|
6084
6311
|
if (!frame.binary) continue;
|
|
6085
6312
|
if (frame.id === ID_RAWEPHEM && frame.msgLen >= 102) {
|
|
6086
6313
|
const eph = decodeRawEphem(data, view, frame.payload);
|
|
6087
|
-
if (
|
|
6088
|
-
|
|
6089
|
-
if (
|
|
6090
|
-
|
|
6314
|
+
if (eph) pushKepler(eph.prn, eph);
|
|
6315
|
+
} else if (frame.id === ID_GALEPHEMERIS && frame.msgLen >= 220) {
|
|
6316
|
+
if (frame.week === 0) continue;
|
|
6317
|
+
const headerMs = gpsMs2(frame.week, frame.towMs / 1e3);
|
|
6318
|
+
const dec = decodeGalEphemeris(view, frame.payload, headerMs);
|
|
6319
|
+
if (dec)
|
|
6320
|
+
pushKepler(`${dec.eph.prn}:${dec.fnav ? "fnav" : "inav"}`, dec.eph);
|
|
6321
|
+
} else if (frame.id === ID_BDSEPHEMERIS && frame.msgLen >= 196) {
|
|
6322
|
+
const eph = decodeBdsEphemeris2(view, frame.payload);
|
|
6323
|
+
if (eph) pushKepler(eph.prn, eph);
|
|
6324
|
+
} else if (frame.id === ID_QZSSEPHEMERIS && frame.msgLen >= 204) {
|
|
6325
|
+
const eph = decodeQzssEphemeris2(view, frame.payload);
|
|
6326
|
+
if (eph) pushKepler(eph.prn, eph);
|
|
6327
|
+
} else if (frame.id === ID_IONUTC && frame.msgLen >= 108) {
|
|
6328
|
+
const p = frame.payload;
|
|
6329
|
+
const alpha = [];
|
|
6330
|
+
const beta = [];
|
|
6331
|
+
for (let i = 0; i < 4; i++) {
|
|
6332
|
+
alpha.push(view.getFloat64(p + i * 8, true));
|
|
6333
|
+
beta.push(view.getFloat64(p + 32 + i * 8, true));
|
|
6091
6334
|
}
|
|
6092
|
-
|
|
6093
|
-
|
|
6335
|
+
ionoCorrections["GPSA"] = alpha;
|
|
6336
|
+
ionoCorrections["GPSB"] = beta;
|
|
6337
|
+
leapSeconds = view.getInt32(p + 96, true);
|
|
6094
6338
|
} else if (frame.id === ID_GLOEPHEMERIS && frame.msgLen >= 144) {
|
|
6095
6339
|
const eph = decodeGloEphemeris(view, frame.payload);
|
|
6096
6340
|
if (!eph) continue;
|
|
@@ -6102,12 +6346,12 @@ function parseNovatelNav(data) {
|
|
|
6102
6346
|
ephemerides.push(eph);
|
|
6103
6347
|
}
|
|
6104
6348
|
}
|
|
6105
|
-
return { ephemerides, badCrc: stats.badCrc };
|
|
6349
|
+
return { ephemerides, ionoCorrections, leapSeconds, badCrc: stats.badCrc };
|
|
6106
6350
|
}
|
|
6107
6351
|
|
|
6108
6352
|
// src/novatel/index.ts
|
|
6109
6353
|
var GPS_EPOCH_MS6 = Date.UTC(1980, 0, 6);
|
|
6110
|
-
var
|
|
6354
|
+
var MS_PER_WEEK6 = 7 * 864e5;
|
|
6111
6355
|
var HDR = 28;
|
|
6112
6356
|
var ID_RANGE = 43;
|
|
6113
6357
|
var ID_RANGECMP = 140;
|
|
@@ -6276,7 +6520,7 @@ function parseNovatelRange(data) {
|
|
|
6276
6520
|
if (!codes.includes(code)) codes.push(code);
|
|
6277
6521
|
}
|
|
6278
6522
|
epochs.push({
|
|
6279
|
-
timeMs: GPS_EPOCH_MS6 + week *
|
|
6523
|
+
timeMs: GPS_EPOCH_MS6 + week * MS_PER_WEEK6 + towMs,
|
|
6280
6524
|
meas
|
|
6281
6525
|
});
|
|
6282
6526
|
}
|
|
@@ -6328,7 +6572,7 @@ function parseNovatelRange(data) {
|
|
|
6328
6572
|
if (!codes.includes(code)) codes.push(code);
|
|
6329
6573
|
}
|
|
6330
6574
|
epochs.push({
|
|
6331
|
-
timeMs: GPS_EPOCH_MS6 + week *
|
|
6575
|
+
timeMs: GPS_EPOCH_MS6 + week * MS_PER_WEEK6 + towMs,
|
|
6332
6576
|
meas
|
|
6333
6577
|
});
|
|
6334
6578
|
}
|
|
@@ -6688,9 +6932,9 @@ function selectBest(ephs, timeMs) {
|
|
|
6688
6932
|
return best;
|
|
6689
6933
|
}
|
|
6690
6934
|
var GPS_EPOCH_MS7 = START_GPS_TIME.getTime();
|
|
6691
|
-
var
|
|
6935
|
+
var MS_PER_WEEK7 = 7 * 864e5;
|
|
6692
6936
|
var BDS_EPOCH_MS = START_BDS_TIME.getTime();
|
|
6693
|
-
var GAL_EPOCH_MS = GPS_EPOCH_MS7 + 1024 *
|
|
6937
|
+
var GAL_EPOCH_MS = GPS_EPOCH_MS7 + 1024 * MS_PER_WEEK7;
|
|
6694
6938
|
function ephInfoToEphemeris(info) {
|
|
6695
6939
|
const sys = info.prn.charAt(0);
|
|
6696
6940
|
if (sys === "R") {
|
|
@@ -6742,10 +6986,10 @@ function ephInfoToEphemeris(info) {
|
|
|
6742
6986
|
epochMs = GAL_EPOCH_MS;
|
|
6743
6987
|
} else {
|
|
6744
6988
|
epochMs = GPS_EPOCH_MS7;
|
|
6745
|
-
const weeksNow = (info.lastReceived - GPS_EPOCH_MS7) /
|
|
6989
|
+
const weeksNow = (info.lastReceived - GPS_EPOCH_MS7) / MS_PER_WEEK7;
|
|
6746
6990
|
week += 1024 * Math.round((weeksNow - week) / 1024);
|
|
6747
6991
|
}
|
|
6748
|
-
const tocDate = new Date(epochMs + week *
|
|
6992
|
+
const tocDate = new Date(epochMs + week * MS_PER_WEEK7 + tocSec * 1e3);
|
|
6749
6993
|
return {
|
|
6750
6994
|
system: sys,
|
|
6751
6995
|
prn: info.prn,
|
|
@@ -9844,11 +10088,13 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
|
|
|
9844
10088
|
parseNovatelRange,
|
|
9845
10089
|
parseRinexStream,
|
|
9846
10090
|
parseSbfAlmanac,
|
|
10091
|
+
parseSbfIonoUtc,
|
|
9847
10092
|
parseSbfMeas,
|
|
9848
10093
|
parseSbfNav,
|
|
9849
10094
|
parseSinexBiasDcb,
|
|
9850
10095
|
parseSourcetable,
|
|
9851
10096
|
parseSp3,
|
|
10097
|
+
parseUbxIonoUtc,
|
|
9852
10098
|
parseUbxNav,
|
|
9853
10099
|
parseUbxRawx,
|
|
9854
10100
|
phiAltBOC,
|
package/dist/index.d.cts
CHANGED
|
@@ -9,8 +9,8 @@ export { E as EpochSummary, P as ParseOptions, R as RinexHeader, a as RinexResul
|
|
|
9
9
|
export { E as Ephemeris, G as GlonassEphemeris, K as KeplerEphemeris, N as NavHeader, a as NavResult, p as parseNavFile } from './nav-BAI1a9vK.cjs';
|
|
10
10
|
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';
|
|
11
11
|
export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES, SatCn0, SignalCn0, StationMeta, StreamStats, createStationMeta, createStreamStats, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats } from './rtcm3.cjs';
|
|
12
|
-
export { UbxFrame, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxRawxEpoch, parseUbxNav, parseUbxRawx, ubxFrames } from './ubx.cjs';
|
|
13
|
-
export { SbfAlmanac, SbfAlmanacResult, SbfGlonassAlmanac, SbfKeplerAlmanac, SbfMeasEpoch, SbfMeasurement, SbfNavResult, SbfParseResult, parseSbfAlmanac, parseSbfMeas, parseSbfNav, sbfCrc16, scanSbfFrames } from './sbf.cjs';
|
|
12
|
+
export { UbxFrame, UbxIonoUtcResult, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxRawxEpoch, parseUbxIonoUtc, parseUbxNav, parseUbxRawx, ubxFrames } from './ubx.cjs';
|
|
13
|
+
export { SbfAlmanac, SbfAlmanacResult, SbfGlonassAlmanac, SbfIonoUtcResult, SbfKeplerAlmanac, SbfMeasEpoch, SbfMeasurement, SbfNavResult, SbfParseResult, parseSbfAlmanac, parseSbfIonoUtc, parseSbfMeas, parseSbfNav, sbfCrc16, scanSbfFrames } from './sbf.cjs';
|
|
14
14
|
export { NovatelEpoch, NovatelMeasurement, NovatelNavResult, NovatelParseResult, OEM4_HLEN, Oem4Frame, crc32, oem4Frames, parseNovatelNav, parseNovatelRange } from './novatel.cjs';
|
|
15
15
|
export { AllPositionsData, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, VisibilityPass, VisibilityResult, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, computeVisibility, computeVisibilityFromPositions, dopplerHz, ecefToAzEl, ephInfoToEphemeris, glonassPosition, keplerPosition, maskRadForAzimuth, navTimesFromEph, rangeRate, selectEphemeris } from './orbit.cjs';
|
|
16
16
|
export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -9,8 +9,8 @@ export { E as EpochSummary, P as ParseOptions, R as RinexHeader, a as RinexResul
|
|
|
9
9
|
export { E as Ephemeris, G as GlonassEphemeris, K as KeplerEphemeris, N as NavHeader, a as NavResult, p as parseNavFile } from './nav-BAI1a9vK.js';
|
|
10
10
|
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';
|
|
11
11
|
export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES, SatCn0, SignalCn0, StationMeta, StreamStats, createStationMeta, createStreamStats, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, setGloFreqNumber, updateStationMeta, updateStreamStats } from './rtcm3.js';
|
|
12
|
-
export { UbxFrame, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxRawxEpoch, parseUbxNav, parseUbxRawx, ubxFrames } from './ubx.js';
|
|
13
|
-
export { SbfAlmanac, SbfAlmanacResult, SbfGlonassAlmanac, SbfKeplerAlmanac, SbfMeasEpoch, SbfMeasurement, SbfNavResult, SbfParseResult, parseSbfAlmanac, parseSbfMeas, parseSbfNav, sbfCrc16, scanSbfFrames } from './sbf.js';
|
|
12
|
+
export { UbxFrame, UbxIonoUtcResult, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxRawxEpoch, parseUbxIonoUtc, parseUbxNav, parseUbxRawx, ubxFrames } from './ubx.js';
|
|
13
|
+
export { SbfAlmanac, SbfAlmanacResult, SbfGlonassAlmanac, SbfIonoUtcResult, SbfKeplerAlmanac, SbfMeasEpoch, SbfMeasurement, SbfNavResult, SbfParseResult, parseSbfAlmanac, parseSbfIonoUtc, parseSbfMeas, parseSbfNav, sbfCrc16, scanSbfFrames } from './sbf.js';
|
|
14
14
|
export { NovatelEpoch, NovatelMeasurement, NovatelNavResult, NovatelParseResult, OEM4_HLEN, Oem4Frame, crc32, oem4Frames, parseNovatelNav, parseNovatelRange } from './novatel.js';
|
|
15
15
|
export { AllPositionsData, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, VisibilityPass, VisibilityResult, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, computeVisibility, computeVisibilityFromPositions, dopplerHz, ecefToAzEl, ephInfoToEphemeris, glonassPosition, keplerPosition, maskRadForAzimuth, navTimesFromEph, rangeRate, selectEphemeris } from './orbit.js';
|
|
16
16
|
export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.js';
|
package/dist/index.js
CHANGED
|
@@ -34,25 +34,27 @@ import {
|
|
|
34
34
|
phiBPSK
|
|
35
35
|
} from "./chunk-2K3FCJBX.js";
|
|
36
36
|
import {
|
|
37
|
+
parseUbxIonoUtc,
|
|
37
38
|
parseUbxNav,
|
|
38
39
|
parseUbxRawx,
|
|
39
40
|
ubxFrames
|
|
40
|
-
} from "./chunk-
|
|
41
|
+
} from "./chunk-IG5CDNDS.js";
|
|
41
42
|
import {
|
|
42
43
|
crc16,
|
|
43
44
|
parseSbfAlmanac,
|
|
45
|
+
parseSbfIonoUtc,
|
|
44
46
|
parseSbfMeas,
|
|
45
47
|
parseSbfNav,
|
|
46
48
|
scanSbfFrames
|
|
47
|
-
} from "./chunk-
|
|
49
|
+
} from "./chunk-ZNCQNHNI.js";
|
|
48
50
|
import {
|
|
49
51
|
OEM4_HLEN,
|
|
50
52
|
crc32,
|
|
51
53
|
oem4Frames,
|
|
52
54
|
parseNovatelNav,
|
|
53
55
|
parseNovatelRange
|
|
54
|
-
} from "./chunk-
|
|
55
|
-
import "./chunk-
|
|
56
|
+
} from "./chunk-7QR2KPDU.js";
|
|
57
|
+
import "./chunk-REYOYF7O.js";
|
|
56
58
|
import {
|
|
57
59
|
connectToMountpoint,
|
|
58
60
|
fetchSourcetable,
|
|
@@ -487,11 +489,13 @@ export {
|
|
|
487
489
|
parseNovatelRange,
|
|
488
490
|
parseRinexStream,
|
|
489
491
|
parseSbfAlmanac,
|
|
492
|
+
parseSbfIonoUtc,
|
|
490
493
|
parseSbfMeas,
|
|
491
494
|
parseSbfNav,
|
|
492
495
|
parseSinexBiasDcb,
|
|
493
496
|
parseSourcetable,
|
|
494
497
|
parseSp3,
|
|
498
|
+
parseUbxIonoUtc,
|
|
495
499
|
parseUbxNav,
|
|
496
500
|
parseUbxRawx,
|
|
497
501
|
phiAltBOC,
|