gnss-js 2.10.1 → 2.12.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.
Files changed (55) hide show
  1. package/README.md +16 -1
  2. package/dist/analysis.cjs +24 -25
  3. package/dist/analysis.js +2 -2
  4. package/dist/{clk-DGVBGRzA.d.cts → bias-sinex-OGMw9xEZ.d.cts} +66 -1
  5. package/dist/{clk-DGVBGRzA.d.ts → bias-sinex-OGMw9xEZ.d.ts} +66 -1
  6. package/dist/binex.d.cts +1 -1
  7. package/dist/binex.d.ts +1 -1
  8. package/dist/{chunk-56HM5B6T.js → chunk-2DJ4XENO.js} +177 -9
  9. package/dist/{chunk-GH7MYXON.js → chunk-2KQMCJ5Z.js} +7 -5
  10. package/dist/chunk-E3Y6YKQM.js +65 -0
  11. package/dist/{chunk-3U5AX7PY.js → chunk-FEABDV5P.js} +24 -25
  12. package/dist/{chunk-WQX354KD.js → chunk-H3AKFD25.js} +1 -1
  13. package/dist/{chunk-YUW33VXK.js → chunk-HUXQABJI.js} +2 -0
  14. package/dist/{chunk-74IVYOQV.js → chunk-HWHD5E6V.js} +128 -78
  15. package/dist/{chunk-KUSUN7DP.js → chunk-MFCPYUEI.js} +1 -1
  16. package/dist/{chunk-3KSDL3CO.js → chunk-NIJ6WFQJ.js} +6 -321
  17. package/dist/chunk-NL2ORX75.js +319 -0
  18. package/dist/{chunk-K3GLUWZI.js → chunk-RWFJEVLJ.js} +590 -296
  19. package/dist/{chunk-SEYH4BEN.js → chunk-SZP4TLYR.js} +2 -2
  20. package/dist/chunk-TWGZTRBL.js +323 -0
  21. package/dist/index.cjs +1315 -460
  22. package/dist/index.d.cts +5 -5
  23. package/dist/index.d.ts +5 -5
  24. package/dist/index.js +20 -12
  25. package/dist/{nav-DImXUdbp.d.cts → nav-COp0Vmlw.d.cts} +83 -2
  26. package/dist/{nav-DImXUdbp.d.ts → nav-COp0Vmlw.d.ts} +83 -2
  27. package/dist/{nav-BYmYoh9A.d.cts → nav-CvZXmumD.d.cts} +1 -1
  28. package/dist/{nav-CN8rxL4h.d.ts → nav-D2DFlVpa.d.ts} +1 -1
  29. package/dist/novatel.d.cts +1 -1
  30. package/dist/novatel.d.ts +1 -1
  31. package/dist/novatel.js +3 -3
  32. package/dist/orbit.d.cts +2 -2
  33. package/dist/orbit.d.ts +2 -2
  34. package/dist/osnma.cjs +1336 -0
  35. package/dist/osnma.d.cts +273 -0
  36. package/dist/osnma.d.ts +273 -0
  37. package/dist/osnma.js +1216 -0
  38. package/dist/positioning.cjs +585 -291
  39. package/dist/positioning.d.cts +116 -6
  40. package/dist/positioning.d.ts +116 -6
  41. package/dist/positioning.js +3 -3
  42. package/dist/rinex.cjs +210 -36
  43. package/dist/rinex.d.cts +10 -55
  44. package/dist/rinex.d.ts +10 -55
  45. package/dist/rinex.js +6 -3
  46. package/dist/sbf.cjs +420 -24
  47. package/dist/sbf.d.cts +46 -5
  48. package/dist/sbf.d.ts +46 -5
  49. package/dist/sbf.js +12 -6
  50. package/dist/trimble.d.cts +1 -1
  51. package/dist/trimble.d.ts +1 -1
  52. package/dist/ubx.d.cts +1 -1
  53. package/dist/ubx.d.ts +1 -1
  54. package/dist/ubx.js +5 -4
  55. package/package.json +6 -1
@@ -5,20 +5,14 @@ import {
5
5
  // src/rinex/crx.ts
6
6
  function crxRepair(old, diff) {
7
7
  const chars = old.split("");
8
- for (let i = 0; i < diff.length; i++) {
8
+ const n = Math.min(old.length, diff.length);
9
+ for (let i = 0; i < n; i++) {
9
10
  const dc = diff[i];
10
- if (dc === " ") {
11
- } else if (dc === "&") {
12
- chars[i] = " ";
13
- } else {
14
- chars[i] = dc;
15
- }
16
- }
17
- if (diff.length > chars.length) {
18
- for (let i = chars.length; i < diff.length; i++) {
19
- chars[i] = diff[i] === "&" ? " " : diff[i];
20
- }
11
+ if (dc === " ") continue;
12
+ chars[i] = dc === "&" ? " " : dc;
21
13
  }
14
+ for (let i = old.length; i < diff.length; i++)
15
+ chars[i] = diff[i] === "&" ? " " : diff[i];
22
16
  return chars.join("");
23
17
  }
24
18
  function parseCrxDataLine(line, ntype) {
@@ -266,6 +260,15 @@ function readObsValue(line, index) {
266
260
  const v = parseFloat(raw);
267
261
  return isNaN(v) ? null : v;
268
262
  }
263
+ function normalizePrn(id) {
264
+ let sys = id[0];
265
+ let num = id.substring(1);
266
+ if (sys === " " || /\d/.test(sys)) {
267
+ num = id;
268
+ sys = "G";
269
+ }
270
+ return sys + num.replace(/\s/g, "").padStart(2, "0");
271
+ }
269
272
  function parseEpochLine3(line) {
270
273
  if (line[0] !== ">") return null;
271
274
  const yr = parseInt(line.substring(2, 6));
@@ -415,7 +418,7 @@ async function parseRinexStream(file, onProgress, signal, onSatObs, workerMode)
415
418
  function processSatLineV3(line) {
416
419
  if (!header || line.length < 3) return;
417
420
  const sys = line[0];
418
- const prn = line.substring(0, 3);
421
+ const prn = normalizePrn(line.substring(0, 3));
419
422
  trackSat(sys, prn);
420
423
  const obsLine = line.substring(3);
421
424
  const codes = header.obsTypes[sys] ?? [];
@@ -440,10 +443,8 @@ async function parseRinexStream(file, onProgress, signal, onSatObs, workerMode)
440
443
  let v2ObsAccum = [];
441
444
  function processSatLineV2(line) {
442
445
  if (!header || v2SatIndex >= v2SatIds.length) return;
443
- const satId = v2SatIds[v2SatIndex];
444
- let sys = satId[0];
445
- if (sys === " " || /\d/.test(sys)) sys = "G";
446
- const prn = sys + satId.substring(1).padStart(2, "0");
446
+ const prn = normalizePrn(v2SatIds[v2SatIndex]);
447
+ const sys = prn[0];
447
448
  if (v2CurrentSatLine === 0) {
448
449
  trackSat(sys, prn);
449
450
  if (onSatObs) v2ObsAccum = [];
@@ -534,6 +535,7 @@ async function parseRinexStream(file, onProgress, signal, onSatObs, workerMode)
534
535
  } else {
535
536
  epochLine = crxRepair(crxPrevEpochLine, line);
536
537
  }
538
+ epochLine = epochLine.replace(/ +$/, "");
537
539
  if (isV3) {
538
540
  if (epochLine[0] !== ">") return;
539
541
  const info = parseEpochLine3(epochLine);
@@ -551,10 +553,11 @@ async function parseRinexStream(file, onProgress, signal, onSatObs, workerMode)
551
553
  return;
552
554
  }
553
555
  resetEpochAccum(info);
554
- const satPart = epochLine.substring(41).replace(/\s+$/, "");
555
556
  crxSatList = [];
556
- for (let i = 0; i + 3 <= satPart.length; i += 3) {
557
- crxSatList.push(satPart.substring(i, i + 3));
557
+ for (let k = 0; k < info.numSats; k++) {
558
+ crxSatList.push(
559
+ normalizePrn(epochLine.substring(41 + 3 * k, 44 + 3 * k))
560
+ );
558
561
  }
559
562
  crxSatIndex = 0;
560
563
  crxPrevEpochLine = epochLine;
@@ -575,11 +578,7 @@ async function parseRinexStream(file, onProgress, signal, onSatObs, workerMode)
575
578
  return;
576
579
  }
577
580
  resetEpochAccum(info);
578
- crxSatList = (info.satIds ?? []).map((id) => {
579
- let sys = id[0];
580
- if (sys === " " || /\d/.test(sys)) sys = "G";
581
- return sys + id.substring(1).padStart(2, "0");
582
- });
581
+ crxSatList = (info.satIds ?? []).slice(0, info.numSats).map(normalizePrn);
583
582
  crxSatIndex = 0;
584
583
  crxPrevEpochLine = epochLine;
585
584
  crxPhase = "clock";
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  crc24q
3
- } from "./chunk-YUW33VXK.js";
3
+ } from "./chunk-HUXQABJI.js";
4
4
  import {
5
5
  getBitS,
6
6
  getBitU
@@ -205,5 +205,7 @@ export {
205
205
  CNAV_OMEGA_DOT_REF,
206
206
  crc24q,
207
207
  cnavCrcOk,
208
+ getBitU33,
209
+ getBitS33,
208
210
  CnavAssembler
209
211
  };
@@ -1,28 +1,43 @@
1
+ import {
2
+ scanSbfFrames,
3
+ svidToPrn
4
+ } from "./chunk-E3Y6YKQM.js";
1
5
  import {
2
6
  BdsAssembler,
3
- GalFnavAssembler,
4
- GalInavAssembler,
5
7
  GloStringAssembler,
6
8
  bdsSubframeParityOk,
7
- galFnavPageCrcOk,
8
- galInavPageCrcOk,
9
9
  testGloString
10
- } from "./chunk-3KSDL3CO.js";
10
+ } from "./chunk-NIJ6WFQJ.js";
11
+ import {
12
+ GalFnavAssembler,
13
+ GalInavAssembler,
14
+ galFnavPageCrcOk,
15
+ galInavPageCrcOk
16
+ } from "./chunk-TWGZTRBL.js";
11
17
  import {
12
18
  decodeSbasGeoNav,
13
19
  sbasCrcOk
14
- } from "./chunk-WQX354KD.js";
20
+ } from "./chunk-H3AKFD25.js";
15
21
  import {
16
22
  getGpsLeap
17
23
  } from "./chunk-HVXYFUCB.js";
18
24
  import {
19
25
  geodeticToEcef
20
26
  } from "./chunk-37QNKGTC.js";
27
+ import {
28
+ BdsCnav1Assembler,
29
+ BdsCnav2Assembler,
30
+ BdsCnav3Assembler,
31
+ bdsCnav1Sf2CrcOk,
32
+ bdsCnav1Sf3CrcOk,
33
+ bdsCnav2CrcOk,
34
+ bdsCnav3CrcOk
35
+ } from "./chunk-NL2ORX75.js";
21
36
  import {
22
37
  CnavAssembler,
23
38
  cnavCrcOk,
24
39
  crc24q
25
- } from "./chunk-YUW33VXK.js";
40
+ } from "./chunk-HUXQABJI.js";
26
41
  import {
27
42
  GPS_PI,
28
43
  GpsLnavAssembler,
@@ -31,66 +46,6 @@ import {
31
46
  setBitU
32
47
  } from "./chunk-V2D5KUKH.js";
33
48
 
34
- // src/sbf/frame.ts
35
- var CRC_TABLE = (() => {
36
- const t = new Uint16Array(256);
37
- for (let n = 0; n < 256; n++) {
38
- let c = n << 8;
39
- for (let k = 0; k < 8; k++)
40
- c = c & 32768 ? (c << 1 ^ 4129) & 65535 : c << 1 & 65535;
41
- t[n] = c;
42
- }
43
- return t;
44
- })();
45
- function crc16(data, start, end) {
46
- let crc = 0;
47
- for (let i = start; i < end; i++)
48
- crc = (crc << 8 ^ CRC_TABLE[(crc >> 8 ^ data[i]) & 255]) & 65535;
49
- return crc;
50
- }
51
- function scanSbfFrames(data, view, onBlock) {
52
- let badCrc = 0;
53
- let i = 0;
54
- while (i + 8 <= data.length) {
55
- if (data[i] !== 36 || data[i + 1] !== 64) {
56
- i++;
57
- continue;
58
- }
59
- const len = view.getUint16(i + 6, true);
60
- if (len < 8 || len % 4 !== 0) {
61
- i++;
62
- continue;
63
- }
64
- if (i + len > data.length) break;
65
- if (crc16(data, i + 4, i + len) !== view.getUint16(i + 2, true)) {
66
- badCrc++;
67
- i++;
68
- continue;
69
- }
70
- onBlock(view.getUint16(i + 4, true) & 8191, i, len);
71
- i += len;
72
- }
73
- return badCrc;
74
- }
75
- var two = (n) => String(n).padStart(2, "0");
76
- function svidToPrn(svid) {
77
- if (svid >= 1 && svid <= 37) return svid <= 32 ? `G${two(svid)}` : null;
78
- if (svid <= 61) return svid - 37 <= 27 ? `R${two(svid - 37)}` : null;
79
- if (svid <= 62) return null;
80
- if (svid <= 68) return svid - 38 <= 27 ? `R${two(svid - 38)}` : null;
81
- if (svid <= 70) return null;
82
- if (svid <= 106) return svid - 70 <= 36 ? `E${two(svid - 70)}` : null;
83
- if (svid <= 119) return null;
84
- if (svid <= 140) return `S${two(svid - 100)}`;
85
- if (svid <= 180) return svid - 140 <= 50 ? `C${two(svid - 140)}` : null;
86
- if (svid <= 190) return `J${two(svid - 180)}`;
87
- if (svid <= 197) return svid - 190 <= 14 ? `I${two(svid - 190)}` : null;
88
- if (svid <= 215) return `S${two(svid - 157)}`;
89
- if (svid <= 222) return svid - 208 <= 14 ? `I${two(svid - 208)}` : null;
90
- if (svid <= 245) return svid - 182 <= 50 ? `C${two(svid - 182)}` : null;
91
- return null;
92
- }
93
-
94
49
  // src/sbf/nav.ts
95
50
  var PI = Math.PI;
96
51
  var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
@@ -924,6 +879,80 @@ function parseSbfGloNav(data) {
924
879
  return { ephemerides, badCrc, messages };
925
880
  }
926
881
 
882
+ // src/sbf/rawnav-bds-cnav.ts
883
+ var GPS_BDT_OFFSET = 14;
884
+ var B1C_FRAME_S = 18;
885
+ var TOW_DNU2 = 4294967295;
886
+ function newBdsCnavAssemblers() {
887
+ return {
888
+ b1c: new BdsCnav1Assembler(),
889
+ b2a: new BdsCnav2Assembler(),
890
+ b2b: new BdsCnav3Assembler()
891
+ };
892
+ }
893
+ function navBits(view, wordsAt, start, nBits) {
894
+ const out = new Uint8Array(Math.ceil(nBits / 8));
895
+ for (let i = 0; i < nBits; i++) {
896
+ const p = start + i;
897
+ const w = view.getUint32(wordsAt + 4 * (p >>> 5), true);
898
+ if (w >>> 31 - (p & 31) & 1) out[i >> 3] |= 128 >> (i & 7);
899
+ }
900
+ return out;
901
+ }
902
+ var MIN_LEN = { 4218: 248, 4219: 92, 4242: 144 };
903
+ function feedBdsCnavBlock(view, b, id, len, asm) {
904
+ if (len < (MIN_LEN[id] ?? Infinity)) return {};
905
+ const prnStr = svidToPrn(view.getUint8(b + 14));
906
+ if (!prnStr || prnStr[0] !== "C") return {};
907
+ const prn = Number(prnStr.slice(1));
908
+ const words = b + 20;
909
+ if (id === 4218) {
910
+ const towMs = view.getUint32(b + 8, true);
911
+ if (towMs === TOW_DNU2) return {};
912
+ const sf2 = navBits(view, words, 72, 600);
913
+ const sf3 = navBits(view, words, 1272, 264);
914
+ const sf2Ok = bdsCnav1Sf2CrcOk(sf2);
915
+ const bdt = (towMs / 1e3 - GPS_BDT_OFFSET + 604800) % 604800;
916
+ const tTm = (Math.floor(bdt) - B1C_FRAME_S + 604800) % 604800;
917
+ const eph = asm.b1c.push(
918
+ prn,
919
+ sf2Ok ? sf2 : null,
920
+ bdsCnav1Sf3CrcOk(sf3) ? sf3 : null,
921
+ tTm
922
+ );
923
+ if (!sf2Ok) return { badCrc: true };
924
+ return eph ? { eph } : {};
925
+ }
926
+ if (id === 4219) {
927
+ const msg = navBits(view, words, 0, 288);
928
+ if (!bdsCnav2CrcOk(msg)) return { badCrc: true };
929
+ const eph = asm.b2a.push(msg);
930
+ return eph ? { eph } : {};
931
+ }
932
+ if (id === 4242) {
933
+ const msg = navBits(view, words, 12, 486);
934
+ if (!bdsCnav3CrcOk(msg)) return { badCrc: true };
935
+ const eph = asm.b2b.push(prn, msg);
936
+ return eph ? { eph } : {};
937
+ }
938
+ return {};
939
+ }
940
+ function parseSbfBdsCnav(data) {
941
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
942
+ const asm = newBdsCnavAssemblers();
943
+ const ephemerides = [];
944
+ let badCrc = 0;
945
+ let messages = 0;
946
+ scanSbfFrames(data, view, (id, b, len) => {
947
+ if (id !== 4218 && id !== 4219 && id !== 4242) return;
948
+ messages++;
949
+ const r = feedBdsCnavBlock(view, b, id, len, asm);
950
+ if (r.eph) ephemerides.push(r.eph);
951
+ else if (r.badCrc) badCrc++;
952
+ });
953
+ return { ephemerides, badCrc, messages };
954
+ }
955
+
927
956
  // src/navbits/sbas-l5.ts
928
957
  var SBAS_L5_PREAMBLE_UW = 6056250;
929
958
  function isSbasL1Preamble(msg) {
@@ -1066,6 +1095,7 @@ function decodeSbfNavigation(data, opts = {}) {
1066
1095
  const ephemerides = [];
1067
1096
  const seen = /* @__PURE__ */ new Set();
1068
1097
  const cnav = [];
1098
+ const bdsCnav = [];
1069
1099
  const ionoCorrections = {};
1070
1100
  let leapSeconds = null;
1071
1101
  const counts = {
@@ -1075,6 +1105,7 @@ function decodeSbfNavigation(data, opts = {}) {
1075
1105
  galRaw: 0,
1076
1106
  gloRaw: 0,
1077
1107
  bdsRaw: 0,
1108
+ bdsCnavRaw: 0,
1078
1109
  sbasRaw: 0,
1079
1110
  sbasL5Raw: 0,
1080
1111
  navicRaw: 0,
@@ -1086,6 +1117,7 @@ function decodeSbfNavigation(data, opts = {}) {
1086
1117
  const galAsm = newGalAssemblers();
1087
1118
  const gloAsm = new GloStringAssembler();
1088
1119
  const bdsAsm = new BdsAssembler();
1120
+ const bdsCnavAsm = newBdsCnavAssemblers();
1089
1121
  const lnavAsm = new GpsLnavAssembler();
1090
1122
  const navicAsm = new NavicAssembler();
1091
1123
  const addEph = (e) => {
@@ -1192,6 +1224,17 @@ function decodeSbfNavigation(data, opts = {}) {
1192
1224
  else if (r.badCrc) counts.badFrames++;
1193
1225
  return;
1194
1226
  }
1227
+ case 4218:
1228
+ // BDSRawB1C
1229
+ case 4219:
1230
+ // BDSRawB2a
1231
+ case 4242: {
1232
+ counts.bdsCnavRaw++;
1233
+ const r = feedBdsCnavBlock(view, b, id, len, bdsCnavAsm);
1234
+ if (r.eph) bdsCnav.push(r.eph);
1235
+ else if (r.badCrc) counts.badFrames++;
1236
+ return;
1237
+ }
1195
1238
  case 4020: {
1196
1239
  if (len < 52) return;
1197
1240
  counts.sbasRaw++;
@@ -1248,7 +1291,15 @@ function decodeSbfNavigation(data, opts = {}) {
1248
1291
  prns: [...dfmcPrns].sort(),
1249
1292
  messages: Object.values(dfmcByType).reduce((a, v) => a + v, 0)
1250
1293
  };
1251
- return { ephemerides, cnav, ionoCorrections, leapSeconds, dfmc, counts };
1294
+ return {
1295
+ ephemerides,
1296
+ cnav,
1297
+ bdsCnav,
1298
+ ionoCorrections,
1299
+ leapSeconds,
1300
+ dfmc,
1301
+ counts
1302
+ };
1252
1303
  }
1253
1304
 
1254
1305
  // src/navbits/rs255.ts
@@ -1876,23 +1927,23 @@ var MEAS2_SIG = [
1876
1927
  ["J", "1E"],
1877
1928
  ["J", "5P"]
1878
1929
  ];
1879
- var two2 = (n) => String(n).padStart(2, "0");
1930
+ var two = (n) => String(n).padStart(2, "0");
1880
1931
  function m3Prn(navsys, svid) {
1881
1932
  switch (navsys) {
1882
1933
  case 0:
1883
- return svid < 32 ? `G${two2(svid + 1)}` : null;
1934
+ return svid < 32 ? `G${two(svid + 1)}` : null;
1884
1935
  case 1:
1885
- return svid < 27 ? `R${two2(svid + 1)}` : null;
1936
+ return svid < 27 ? `R${two(svid + 1)}` : null;
1886
1937
  case 2:
1887
- return svid < 36 ? `E${two2(svid + 1)}` : null;
1938
+ return svid < 36 ? `E${two(svid + 1)}` : null;
1888
1939
  case 3:
1889
- return svid < 50 ? `C${two2(svid + 1)}` : null;
1940
+ return svid < 50 ? `C${two(svid + 1)}` : null;
1890
1941
  case 4:
1891
- return svid <= 38 ? `S${two2(svid + 20)}` : null;
1942
+ return svid <= 38 ? `S${two(svid + 20)}` : null;
1892
1943
  case 5:
1893
- return svid < 10 ? `J${two2(svid + 1)}` : null;
1944
+ return svid < 10 ? `J${two(svid + 1)}` : null;
1894
1945
  case 6:
1895
- return svid < 14 ? `I${two2(svid + 1)}` : null;
1946
+ return svid < 14 ? `I${two(svid + 1)}` : null;
1896
1947
  default:
1897
1948
  return null;
1898
1949
  }
@@ -2443,8 +2494,6 @@ function parseSbfMeas(data) {
2443
2494
  }
2444
2495
 
2445
2496
  export {
2446
- crc16,
2447
- scanSbfFrames,
2448
2497
  parseSbfNav,
2449
2498
  parseSbfAlmanac,
2450
2499
  parseSbfIonoUtc,
@@ -2458,6 +2507,7 @@ export {
2458
2507
  parseSbfGalNav,
2459
2508
  parseSbfBdsNav,
2460
2509
  parseSbfGloNav,
2510
+ parseSbfBdsCnav,
2461
2511
  SBAS_L5_PREAMBLE_UW,
2462
2512
  isSbasL1Preamble,
2463
2513
  sbasL5MessageType,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  parseRinexStream
3
- } from "./chunk-3U5AX7PY.js";
3
+ } from "./chunk-FEABDV5P.js";
4
4
  import {
5
5
  ARC_GAP_FACTOR,
6
6
  BAND_LABELS,