gnss-js 1.25.0 → 1.26.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/binex.cjs +799 -0
- package/dist/binex.d.cts +189 -0
- package/dist/binex.d.ts +189 -0
- package/dist/binex.js +19 -0
- package/dist/{chunk-VTX3VCL4.js → chunk-5AUK42AL.js} +4 -2
- package/dist/{chunk-WZDFZ76K.js → chunk-726LQBGM.js} +8 -148
- package/dist/{chunk-PZNVFCKJ.js → chunk-AFEDNWXI.js} +5 -3
- package/dist/chunk-CKRNXZHT.js +424 -0
- package/dist/{chunk-7RKLWE6R.js → chunk-F4CM6Q4F.js} +4 -2
- package/dist/{chunk-MCAVU3XL.js → chunk-FEOMYZEU.js} +5 -3
- package/dist/chunk-IQ5OIMQD.js +148 -0
- package/dist/chunk-OK4GGNOO.js +756 -0
- package/dist/{chunk-NOQAAUGY.js → chunk-WDUN4BWL.js} +4 -2
- package/dist/index.cjs +1197 -17
- package/dist/index.d.cts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +41 -16
- package/dist/novatel.js +3 -2
- package/dist/rinex.js +3 -2
- package/dist/sbf.js +4 -3
- package/dist/trimble.cjs +452 -0
- package/dist/trimble.d.cts +147 -0
- package/dist/trimble.d.ts +147 -0
- package/dist/trimble.js +10 -0
- package/dist/ubx.js +4 -3
- package/package.json +11 -1
package/dist/index.d.cts
CHANGED
|
@@ -13,6 +13,8 @@ export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES,
|
|
|
13
13
|
export { UbxCnavResult, UbxFrame, UbxIonoUtcResult, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxRawNavOptions, UbxRawNavResult, UbxRawxEpoch, parseUbxCnav, parseUbxIonoUtc, parseUbxNav, parseUbxRawNav, parseUbxRawx, ubxFrames } from './ubx.cjs';
|
|
14
14
|
export { HasMessage, SbfBdsNavResult, SbfCnavEphemeris, SbfCnavResult, SbfGalEphemeris, SbfGalNavResult, SbfGloNavResult, SbfHasMessage, SbfHasResult, SbfIonoUtcResult, SbfMeasEpoch, SbfMeasurement, SbfParseResult, parseSbfBdsNav, parseSbfCnav, parseSbfGalNav, parseSbfGloNav, parseSbfHas, parseSbfIonoUtc, parseSbfMeas, sbfCrc16, scanSbfFrames } from './sbf.cjs';
|
|
15
15
|
export { NovatelEpoch, NovatelMeasurement, NovatelNavResult, NovatelParseResult, OEM4_HLEN, Oem4Frame, crc32, oem4Frames, parseNovatelNav, parseNovatelRange } from './novatel.cjs';
|
|
16
|
+
export { TrimbleEpoch, TrimbleFrame, TrimbleMeasurement, TrimbleNavResult, TrimbleParseResult, parseTrimble, parseTrimbleNav, trimbleFrames } from './trimble.cjs';
|
|
17
|
+
export { BinexEpoch, BinexMeasurement, BinexParseResult, BinexRecord, binexCrc16, binexCrc32, binexCsum8, binexRecords, decodeBinexEph, getBnxi, parseBinex } from './binex.cjs';
|
|
16
18
|
export { AllPositionsData, AlmanacPosition, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, VisibilityPass, VisibilityResult, almanacEpochMs, almanacSatPosition, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, computeVisibility, computeVisibilityFromPositions, dopplerHz, ecefToAzEl, ephInfoToEphemeris, glonassAlmanacEpochMs, glonassAlmanacPosition, glonassPosition, keplerPosition, maskRadForAzimuth, navTimesFromEph, rangeRate, selectEphemeris } from './orbit.cjs';
|
|
17
19
|
export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.cjs';
|
|
18
20
|
export { DgnssOptions, DgnssSolution, EphemerisSource, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, SppOptions, SppSolution, gimSlantIonoDelayL1, gimVerticalTec, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, satClockCorrection, solveDgnss, solveSpp, toRtkEpoch } from './positioning.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES,
|
|
|
13
13
|
export { UbxCnavResult, UbxFrame, UbxIonoUtcResult, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxRawNavOptions, UbxRawNavResult, UbxRawxEpoch, parseUbxCnav, parseUbxIonoUtc, parseUbxNav, parseUbxRawNav, parseUbxRawx, ubxFrames } from './ubx.js';
|
|
14
14
|
export { HasMessage, SbfBdsNavResult, SbfCnavEphemeris, SbfCnavResult, SbfGalEphemeris, SbfGalNavResult, SbfGloNavResult, SbfHasMessage, SbfHasResult, SbfIonoUtcResult, SbfMeasEpoch, SbfMeasurement, SbfParseResult, parseSbfBdsNav, parseSbfCnav, parseSbfGalNav, parseSbfGloNav, parseSbfHas, parseSbfIonoUtc, parseSbfMeas, sbfCrc16, scanSbfFrames } from './sbf.js';
|
|
15
15
|
export { NovatelEpoch, NovatelMeasurement, NovatelNavResult, NovatelParseResult, OEM4_HLEN, Oem4Frame, crc32, oem4Frames, parseNovatelNav, parseNovatelRange } from './novatel.js';
|
|
16
|
+
export { TrimbleEpoch, TrimbleFrame, TrimbleMeasurement, TrimbleNavResult, TrimbleParseResult, parseTrimble, parseTrimbleNav, trimbleFrames } from './trimble.js';
|
|
17
|
+
export { BinexEpoch, BinexMeasurement, BinexParseResult, BinexRecord, binexCrc16, binexCrc32, binexCsum8, binexRecords, decodeBinexEph, getBnxi, parseBinex } from './binex.js';
|
|
16
18
|
export { AllPositionsData, AlmanacPosition, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, VisibilityPass, VisibilityResult, almanacEpochMs, almanacSatPosition, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, computeVisibility, computeVisibilityFromPositions, dopplerHz, ecefToAzEl, ephInfoToEphemeris, glonassAlmanacEpochMs, glonassAlmanacPosition, glonassPosition, keplerPosition, maskRadForAzimuth, navTimesFromEph, rangeRate, selectEphemeris } from './orbit.js';
|
|
17
19
|
export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.js';
|
|
18
20
|
export { DgnssOptions, DgnssSolution, EphemerisSource, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, SppOptions, SppSolution, gimSlantIonoDelayL1, gimVerticalTec, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, satClockCorrection, solveDgnss, solveSpp, toRtkEpoch } from './positioning.js';
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
frequencyLabel,
|
|
3
|
+
parseAntex
|
|
4
|
+
} from "./chunk-5CMSYIYM.js";
|
|
5
|
+
import {
|
|
6
|
+
computeStats,
|
|
7
|
+
nmeaCoordToDecimal,
|
|
8
|
+
parseNmeaFile,
|
|
9
|
+
verifyChecksum
|
|
10
|
+
} from "./chunk-YDMYO3YK.js";
|
|
1
11
|
import {
|
|
2
12
|
BAND_PRESETS,
|
|
3
13
|
CONSTELLATIONS,
|
|
@@ -40,7 +50,7 @@ import {
|
|
|
40
50
|
parseUbxRawNav,
|
|
41
51
|
parseUbxRawx,
|
|
42
52
|
ubxFrames
|
|
43
|
-
} from "./chunk-
|
|
53
|
+
} from "./chunk-FEOMYZEU.js";
|
|
44
54
|
import {
|
|
45
55
|
crc16,
|
|
46
56
|
parseSbfAlmanac,
|
|
@@ -53,15 +63,29 @@ import {
|
|
|
53
63
|
parseSbfMeas,
|
|
54
64
|
parseSbfNav,
|
|
55
65
|
scanSbfFrames
|
|
56
|
-
} from "./chunk-
|
|
57
|
-
import "./chunk-
|
|
66
|
+
} from "./chunk-AFEDNWXI.js";
|
|
67
|
+
import "./chunk-5AUK42AL.js";
|
|
58
68
|
import {
|
|
59
69
|
OEM4_HLEN,
|
|
60
70
|
crc32,
|
|
61
71
|
oem4Frames,
|
|
62
72
|
parseNovatelNav,
|
|
63
73
|
parseNovatelRange
|
|
64
|
-
} from "./chunk-
|
|
74
|
+
} from "./chunk-F4CM6Q4F.js";
|
|
75
|
+
import {
|
|
76
|
+
parseTrimble,
|
|
77
|
+
parseTrimbleNav,
|
|
78
|
+
trimbleFrames
|
|
79
|
+
} from "./chunk-CKRNXZHT.js";
|
|
80
|
+
import {
|
|
81
|
+
binexCrc16,
|
|
82
|
+
binexCrc32,
|
|
83
|
+
binexCsum8,
|
|
84
|
+
binexRecords,
|
|
85
|
+
decodeBinexEph,
|
|
86
|
+
getBnxi,
|
|
87
|
+
parseBinex
|
|
88
|
+
} from "./chunk-OK4GGNOO.js";
|
|
65
89
|
import {
|
|
66
90
|
connectToMountpoint,
|
|
67
91
|
fetchSourcetable,
|
|
@@ -78,16 +102,6 @@ import {
|
|
|
78
102
|
detrendIonoArcs,
|
|
79
103
|
parseSinexBiasDcb
|
|
80
104
|
} from "./chunk-Z5UZUNCB.js";
|
|
81
|
-
import {
|
|
82
|
-
frequencyLabel,
|
|
83
|
-
parseAntex
|
|
84
|
-
} from "./chunk-5CMSYIYM.js";
|
|
85
|
-
import {
|
|
86
|
-
computeStats,
|
|
87
|
-
nmeaCoordToDecimal,
|
|
88
|
-
parseNmeaFile,
|
|
89
|
-
verifyChecksum
|
|
90
|
-
} from "./chunk-YDMYO3YK.js";
|
|
91
105
|
import {
|
|
92
106
|
Scale,
|
|
93
107
|
getDateFromDayOfWeek,
|
|
@@ -196,8 +210,9 @@ import {
|
|
|
196
210
|
writeRinexNav,
|
|
197
211
|
writeRinexNav4,
|
|
198
212
|
writeRinexObsBlob
|
|
199
|
-
} from "./chunk-
|
|
200
|
-
import "./chunk-
|
|
213
|
+
} from "./chunk-WDUN4BWL.js";
|
|
214
|
+
import "./chunk-726LQBGM.js";
|
|
215
|
+
import "./chunk-IQ5OIMQD.js";
|
|
201
216
|
import {
|
|
202
217
|
SYSTEM_ORDER,
|
|
203
218
|
crxDecompress,
|
|
@@ -400,6 +415,10 @@ export {
|
|
|
400
415
|
analyzeQuality,
|
|
401
416
|
applyHelmert,
|
|
402
417
|
applyIonoDcb,
|
|
418
|
+
binexCrc16,
|
|
419
|
+
binexCrc32,
|
|
420
|
+
binexCsum8,
|
|
421
|
+
binexRecords,
|
|
403
422
|
buildGloChannelMap,
|
|
404
423
|
buildObsIndices,
|
|
405
424
|
clampUnit,
|
|
@@ -420,6 +439,7 @@ export {
|
|
|
420
439
|
crxDecompress,
|
|
421
440
|
crxRepair,
|
|
422
441
|
dateToEpoch,
|
|
442
|
+
decodeBinexEph,
|
|
423
443
|
decodeEphemeris,
|
|
424
444
|
decodeMsmFull,
|
|
425
445
|
deg2dms,
|
|
@@ -441,6 +461,7 @@ export {
|
|
|
441
461
|
geodeticToUtm,
|
|
442
462
|
getAer,
|
|
443
463
|
getBdsTime,
|
|
464
|
+
getBnxi,
|
|
444
465
|
getDateFromBdsTime,
|
|
445
466
|
getDateFromDayOfWeek,
|
|
446
467
|
getDateFromDayOfYear,
|
|
@@ -514,6 +535,7 @@ export {
|
|
|
514
535
|
padL,
|
|
515
536
|
padR,
|
|
516
537
|
parseAntex,
|
|
538
|
+
parseBinex,
|
|
517
539
|
parseCrxDataLine,
|
|
518
540
|
parseIonex,
|
|
519
541
|
parseNavFile,
|
|
@@ -533,6 +555,8 @@ export {
|
|
|
533
555
|
parseSinexBiasDcb,
|
|
534
556
|
parseSourcetable,
|
|
535
557
|
parseSp3,
|
|
558
|
+
parseTrimble,
|
|
559
|
+
parseTrimbleNav,
|
|
536
560
|
parseUbxCnav,
|
|
537
561
|
parseUbxIonoUtc,
|
|
538
562
|
parseUbxNav,
|
|
@@ -563,6 +587,7 @@ export {
|
|
|
563
587
|
systemName,
|
|
564
588
|
toRtkEpoch,
|
|
565
589
|
transformFrame,
|
|
590
|
+
trimbleFrames,
|
|
566
591
|
ubxFrames,
|
|
567
592
|
updateStationMeta,
|
|
568
593
|
updateStreamStats,
|
package/dist/novatel.js
CHANGED
|
@@ -4,8 +4,9 @@ import {
|
|
|
4
4
|
oem4Frames,
|
|
5
5
|
parseNovatelNav,
|
|
6
6
|
parseNovatelRange
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
7
|
+
} from "./chunk-F4CM6Q4F.js";
|
|
8
|
+
import "./chunk-726LQBGM.js";
|
|
9
|
+
import "./chunk-IQ5OIMQD.js";
|
|
9
10
|
import "./chunk-HVXYFUCB.js";
|
|
10
11
|
import "./chunk-LEEU5OIO.js";
|
|
11
12
|
export {
|
package/dist/rinex.js
CHANGED
|
@@ -18,8 +18,9 @@ import {
|
|
|
18
18
|
writeRinexNav,
|
|
19
19
|
writeRinexNav4,
|
|
20
20
|
writeRinexObsBlob
|
|
21
|
-
} from "./chunk-
|
|
22
|
-
import "./chunk-
|
|
21
|
+
} from "./chunk-WDUN4BWL.js";
|
|
22
|
+
import "./chunk-726LQBGM.js";
|
|
23
|
+
import "./chunk-IQ5OIMQD.js";
|
|
23
24
|
import {
|
|
24
25
|
SYSTEM_ORDER,
|
|
25
26
|
crxDecompress,
|
package/dist/sbf.js
CHANGED
|
@@ -10,9 +10,10 @@ import {
|
|
|
10
10
|
parseSbfMeas,
|
|
11
11
|
parseSbfNav,
|
|
12
12
|
scanSbfFrames
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import "./chunk-
|
|
15
|
-
import "./chunk-
|
|
13
|
+
} from "./chunk-AFEDNWXI.js";
|
|
14
|
+
import "./chunk-5AUK42AL.js";
|
|
15
|
+
import "./chunk-726LQBGM.js";
|
|
16
|
+
import "./chunk-IQ5OIMQD.js";
|
|
16
17
|
import "./chunk-HVXYFUCB.js";
|
|
17
18
|
import "./chunk-LEEU5OIO.js";
|
|
18
19
|
export {
|
package/dist/trimble.cjs
ADDED
|
@@ -0,0 +1,452 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/trimble/index.ts
|
|
21
|
+
var trimble_exports = {};
|
|
22
|
+
__export(trimble_exports, {
|
|
23
|
+
parseTrimble: () => parseTrimble,
|
|
24
|
+
parseTrimbleNav: () => parseTrimbleNav,
|
|
25
|
+
trimbleFrames: () => trimbleFrames
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(trimble_exports);
|
|
28
|
+
|
|
29
|
+
// src/trimble/frame.ts
|
|
30
|
+
var STX = 2;
|
|
31
|
+
var ETX = 3;
|
|
32
|
+
var RAWDATA = 87;
|
|
33
|
+
var RETSVDATA = 85;
|
|
34
|
+
function* trimbleFrames(data, stats) {
|
|
35
|
+
let i = 0;
|
|
36
|
+
while (i + 6 <= data.length) {
|
|
37
|
+
if (data[i] !== STX) {
|
|
38
|
+
i++;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
const len = data[i + 3];
|
|
42
|
+
const total = 4 + len + 2;
|
|
43
|
+
if (i + total > data.length) {
|
|
44
|
+
i++;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (data[i + total - 1] !== ETX) {
|
|
48
|
+
i++;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
let cs = 0;
|
|
52
|
+
for (let k = 1; k <= 3 + len; k++) cs = cs + data[i + k] & 255;
|
|
53
|
+
if (cs !== data[i + 4 + len]) {
|
|
54
|
+
stats.badChecksum++;
|
|
55
|
+
i++;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
yield {
|
|
59
|
+
start: i,
|
|
60
|
+
status: data[i + 1],
|
|
61
|
+
type: data[i + 2],
|
|
62
|
+
len,
|
|
63
|
+
payload: i + 4
|
|
64
|
+
};
|
|
65
|
+
i += total;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// src/trimble/nav.ts
|
|
70
|
+
var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
|
|
71
|
+
var SEC_PER_WEEK = 7 * 86400;
|
|
72
|
+
var MS_PER_WEEK = SEC_PER_WEEK * 1e3;
|
|
73
|
+
var GPS_PI = 3.1415926535898;
|
|
74
|
+
var gpsMs = (week, sec) => GPS_EPOCH_MS + week * MS_PER_WEEK + sec * 1e3;
|
|
75
|
+
var sowOf = (dateMs) => dateMs / 1e3 % SEC_PER_WEEK;
|
|
76
|
+
var SUB_GPS_EPHEMERIS = 1;
|
|
77
|
+
var SUB_ION_UTC = 3;
|
|
78
|
+
function decodeGpsEphemeris(data, view, base) {
|
|
79
|
+
const prn = data[base + 5];
|
|
80
|
+
if (prn < 1 || prn > 32) return null;
|
|
81
|
+
const week = view.getUint16(base + 6, false);
|
|
82
|
+
const iode = data[base + 11];
|
|
83
|
+
const toc = view.getInt32(base + 16, false);
|
|
84
|
+
const toe = view.getUint32(base + 20, false);
|
|
85
|
+
const tgd = view.getFloat64(base + 24, false);
|
|
86
|
+
const af2 = view.getFloat64(base + 32, false);
|
|
87
|
+
const af1 = view.getFloat64(base + 40, false);
|
|
88
|
+
const af0 = view.getFloat64(base + 48, false);
|
|
89
|
+
const crs = view.getFloat64(base + 56, false);
|
|
90
|
+
const deltaN = view.getFloat64(base + 64, false) * GPS_PI;
|
|
91
|
+
const m0 = view.getFloat64(base + 72, false) * GPS_PI;
|
|
92
|
+
const cuc = view.getFloat64(base + 80, false) * GPS_PI;
|
|
93
|
+
const e = view.getFloat64(base + 88, false);
|
|
94
|
+
const cus = view.getFloat64(base + 96, false) * GPS_PI;
|
|
95
|
+
const sqrtA = view.getFloat64(base + 104, false);
|
|
96
|
+
const cic = view.getFloat64(base + 112, false) * GPS_PI;
|
|
97
|
+
const omega0 = view.getFloat64(base + 120, false) * GPS_PI;
|
|
98
|
+
const cis = view.getFloat64(base + 128, false) * GPS_PI;
|
|
99
|
+
const i0 = view.getFloat64(base + 136, false) * GPS_PI;
|
|
100
|
+
const crc = view.getFloat64(base + 144, false);
|
|
101
|
+
const omega = view.getFloat64(base + 152, false) * GPS_PI;
|
|
102
|
+
const omegaDot = view.getFloat64(base + 160, false) * GPS_PI;
|
|
103
|
+
const idot = view.getFloat64(base + 168, false) * GPS_PI;
|
|
104
|
+
const flags = view.getUint32(base + 176, false);
|
|
105
|
+
return {
|
|
106
|
+
system: "G",
|
|
107
|
+
prn: `G${String(prn).padStart(2, "0")}`,
|
|
108
|
+
toc: sowOf(gpsMs(week, toc)),
|
|
109
|
+
tocDate: new Date(gpsMs(week, toc)),
|
|
110
|
+
af0,
|
|
111
|
+
af1,
|
|
112
|
+
af2,
|
|
113
|
+
iode,
|
|
114
|
+
crs,
|
|
115
|
+
deltaN,
|
|
116
|
+
m0,
|
|
117
|
+
cuc,
|
|
118
|
+
e,
|
|
119
|
+
cus,
|
|
120
|
+
sqrtA,
|
|
121
|
+
toe,
|
|
122
|
+
cic,
|
|
123
|
+
omega0,
|
|
124
|
+
cis,
|
|
125
|
+
i0,
|
|
126
|
+
crc,
|
|
127
|
+
omega,
|
|
128
|
+
omegaDot,
|
|
129
|
+
idot,
|
|
130
|
+
week,
|
|
131
|
+
svHealth: flags >>> 4 & 127,
|
|
132
|
+
tgd
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function parseTrimbleNav(data) {
|
|
136
|
+
const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
137
|
+
const stats = { badChecksum: 0 };
|
|
138
|
+
const ephemerides = [];
|
|
139
|
+
const ionoCorrections = {};
|
|
140
|
+
const retsvCounts = {};
|
|
141
|
+
let leapSeconds = null;
|
|
142
|
+
const lastIode = /* @__PURE__ */ new Map();
|
|
143
|
+
for (const f of trimbleFrames(data, stats)) {
|
|
144
|
+
if (f.type !== RETSVDATA) continue;
|
|
145
|
+
const sub = data[f.payload];
|
|
146
|
+
retsvCounts[sub] = (retsvCounts[sub] ?? 0) + 1;
|
|
147
|
+
if (sub === SUB_GPS_EPHEMERIS && f.len >= 178) {
|
|
148
|
+
const eph = decodeGpsEphemeris(data, view, f.start);
|
|
149
|
+
if (!eph) continue;
|
|
150
|
+
if (lastIode.get(eph.prn) === eph.iode) continue;
|
|
151
|
+
lastIode.set(eph.prn, eph.iode);
|
|
152
|
+
ephemerides.push(eph);
|
|
153
|
+
} else if (sub === SUB_ION_UTC && f.len >= 125) {
|
|
154
|
+
const p = f.start;
|
|
155
|
+
const alpha = [];
|
|
156
|
+
const beta = [];
|
|
157
|
+
for (let i = 0; i < 4; i++) {
|
|
158
|
+
alpha.push(view.getFloat64(p + 6 + i * 8, false));
|
|
159
|
+
beta.push(view.getFloat64(p + 38 + i * 8, false));
|
|
160
|
+
}
|
|
161
|
+
ionoCorrections["GPSA"] = alpha;
|
|
162
|
+
ionoCorrections["GPSB"] = beta;
|
|
163
|
+
leapSeconds = Math.trunc(view.getFloat64(p + 94, false));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
ephemerides,
|
|
168
|
+
ionoCorrections,
|
|
169
|
+
leapSeconds,
|
|
170
|
+
retsvCounts,
|
|
171
|
+
badChecksum: stats.badChecksum
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// src/trimble/index.ts
|
|
176
|
+
var GPS_EPOCH_MS2 = Date.UTC(1980, 0, 6);
|
|
177
|
+
var MS_PER_WEEK2 = 7 * 864e5;
|
|
178
|
+
var REC_TYPE_27 = 6;
|
|
179
|
+
var SYS = {
|
|
180
|
+
0: "G",
|
|
181
|
+
// GPS
|
|
182
|
+
1: "S",
|
|
183
|
+
// SBAS
|
|
184
|
+
2: "R",
|
|
185
|
+
// GLONASS
|
|
186
|
+
3: "E",
|
|
187
|
+
// Galileo
|
|
188
|
+
4: "J",
|
|
189
|
+
// QZSS
|
|
190
|
+
5: "C",
|
|
191
|
+
// BeiDou (pre-ICD numbering)
|
|
192
|
+
7: "C",
|
|
193
|
+
// BeiDou (ICD numbering)
|
|
194
|
+
9: "I",
|
|
195
|
+
// NavIC / IRNSS
|
|
196
|
+
10: "C"
|
|
197
|
+
// BeiDou
|
|
198
|
+
};
|
|
199
|
+
var CODES = {
|
|
200
|
+
"G0-0": "1C",
|
|
201
|
+
"G0-20": "1L",
|
|
202
|
+
"G1-2": "2W",
|
|
203
|
+
"G1-5": "2L",
|
|
204
|
+
"G2-6": "5I",
|
|
205
|
+
"G2-7": "5Q",
|
|
206
|
+
"G2-8": "5X",
|
|
207
|
+
"R0-0": "1C",
|
|
208
|
+
"R0-1": "1P",
|
|
209
|
+
"R1-0": "2C",
|
|
210
|
+
"R1-1": "2P",
|
|
211
|
+
"E0-23": "1C",
|
|
212
|
+
"E2-11": "5Q",
|
|
213
|
+
"E3-11": "7Q",
|
|
214
|
+
"E4-14": "8Q",
|
|
215
|
+
"E5-36": "6C",
|
|
216
|
+
"C0-20": "1P",
|
|
217
|
+
"C2-8": "5P",
|
|
218
|
+
"C3-6": "7D",
|
|
219
|
+
"C6-26": "2I",
|
|
220
|
+
"C7-29": "6I",
|
|
221
|
+
"S0-0": "1C",
|
|
222
|
+
"S2-6": "5I",
|
|
223
|
+
"J0-0": "1C"
|
|
224
|
+
};
|
|
225
|
+
var BAND_DIGIT = {
|
|
226
|
+
0: "1",
|
|
227
|
+
// L1 / E1 / B1C (1575.42)
|
|
228
|
+
1: "2",
|
|
229
|
+
// L2 / G2 (1227.6)
|
|
230
|
+
2: "5",
|
|
231
|
+
// L5 / E5a (1176.45)
|
|
232
|
+
3: "7",
|
|
233
|
+
// E5b / B2b (1207.14)
|
|
234
|
+
4: "8",
|
|
235
|
+
// E5 AltBOC (1191.795)
|
|
236
|
+
5: "6",
|
|
237
|
+
// E6 (1278.75)
|
|
238
|
+
6: "2",
|
|
239
|
+
// B1I (1561.098)
|
|
240
|
+
7: "6",
|
|
241
|
+
// B3I (1268.52)
|
|
242
|
+
8: "1",
|
|
243
|
+
// BeiDou E1 (1589.742)
|
|
244
|
+
9: "3",
|
|
245
|
+
// GLONASS G3 CDMA (1202.025)
|
|
246
|
+
11: "9"
|
|
247
|
+
// NavIC S-band (2492.028)
|
|
248
|
+
};
|
|
249
|
+
function rinexCode(sys, band, track) {
|
|
250
|
+
const key = `${sys}${band}-${track}`;
|
|
251
|
+
return CODES[key] ?? `${BAND_DIGIT[band] ?? "?"}X`;
|
|
252
|
+
}
|
|
253
|
+
function rinexPrn(sys, svid) {
|
|
254
|
+
let n = svid;
|
|
255
|
+
if (sys === "S")
|
|
256
|
+
n = svid - 100;
|
|
257
|
+
else if (sys === "J" && svid >= 193) n = svid - 192;
|
|
258
|
+
return `${sys}${String(n).padStart(2, "0")}`;
|
|
259
|
+
}
|
|
260
|
+
var readS16 = (dv, o) => dv.getInt16(o, false);
|
|
261
|
+
function readS24(d, o) {
|
|
262
|
+
const v = d[o] << 16 | d[o + 1] << 8 | d[o + 2];
|
|
263
|
+
return v & 8388608 ? v - 16777216 : v;
|
|
264
|
+
}
|
|
265
|
+
function readS48(d, dv, o) {
|
|
266
|
+
const hi = d[o] << 8 | d[o + 1];
|
|
267
|
+
const lo = dv.getUint32(o + 2, false);
|
|
268
|
+
const v = hi * 4294967296 + lo;
|
|
269
|
+
return hi & 32768 ? v - 281474976710656 : v;
|
|
270
|
+
}
|
|
271
|
+
function parseTrimble(data) {
|
|
272
|
+
const stats = { badChecksum: 0 };
|
|
273
|
+
const epochs = [];
|
|
274
|
+
const obsCodes = {};
|
|
275
|
+
const recordCounts = {};
|
|
276
|
+
const retsvCounts = {};
|
|
277
|
+
let pages = [];
|
|
278
|
+
let msgReply = -1;
|
|
279
|
+
let lastPage = 0;
|
|
280
|
+
let msgPages = 0;
|
|
281
|
+
let epoch = null;
|
|
282
|
+
const finalize = () => {
|
|
283
|
+
if (epoch) decodeEpoch(epoch, epochs, obsCodes);
|
|
284
|
+
epoch = null;
|
|
285
|
+
};
|
|
286
|
+
const onMessage = (content, reply) => {
|
|
287
|
+
if (epoch && reply === epoch.reply) {
|
|
288
|
+
epoch.chunks.push(content);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
finalize();
|
|
292
|
+
if (content.length < 12) return;
|
|
293
|
+
const dv = new DataView(
|
|
294
|
+
content.buffer,
|
|
295
|
+
content.byteOffset,
|
|
296
|
+
content.byteLength
|
|
297
|
+
);
|
|
298
|
+
const headerLen = content[0];
|
|
299
|
+
const week = dv.getUint16(1, false);
|
|
300
|
+
const towMs = dv.getUint32(3, false);
|
|
301
|
+
const nsv = content[10];
|
|
302
|
+
const eflags = content[11];
|
|
303
|
+
if (week < 1024 || week > 4096 || headerLen < 12 || nsv === 0) return;
|
|
304
|
+
let svStart = headerLen;
|
|
305
|
+
if (eflags & 32 && svStart < content.length) svStart += content[svStart];
|
|
306
|
+
epoch = {
|
|
307
|
+
reply,
|
|
308
|
+
week,
|
|
309
|
+
towMs,
|
|
310
|
+
nsv,
|
|
311
|
+
chunks: [content.subarray(svStart)]
|
|
312
|
+
};
|
|
313
|
+
};
|
|
314
|
+
const completeMessage = () => {
|
|
315
|
+
const total = pages.reduce((a, c) => a + c.length, 0);
|
|
316
|
+
const content = new Uint8Array(total);
|
|
317
|
+
let o = 0;
|
|
318
|
+
for (const c of pages) {
|
|
319
|
+
content.set(c, o);
|
|
320
|
+
o += c.length;
|
|
321
|
+
}
|
|
322
|
+
const reply = msgReply;
|
|
323
|
+
pages = [];
|
|
324
|
+
onMessage(content, reply);
|
|
325
|
+
};
|
|
326
|
+
for (const f of trimbleFrames(data, stats)) {
|
|
327
|
+
if (f.type !== RAWDATA) {
|
|
328
|
+
if (f.type === 85) {
|
|
329
|
+
const sub = data[f.payload];
|
|
330
|
+
retsvCounts[sub] = (retsvCounts[sub] ?? 0) + 1;
|
|
331
|
+
}
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
const recType = data[f.payload];
|
|
335
|
+
recordCounts[recType] = (recordCounts[recType] ?? 0) + 1;
|
|
336
|
+
if (recType !== REC_TYPE_27) continue;
|
|
337
|
+
const pageByte = data[f.payload + 1];
|
|
338
|
+
const page = pageByte >> 4;
|
|
339
|
+
const pagesTotal = pageByte & 15;
|
|
340
|
+
const reply = data[f.payload + 2];
|
|
341
|
+
const content = data.subarray(f.payload + 4, f.payload + f.len);
|
|
342
|
+
if (page === 1) {
|
|
343
|
+
pages = [content];
|
|
344
|
+
msgReply = reply;
|
|
345
|
+
msgPages = pagesTotal;
|
|
346
|
+
lastPage = 1;
|
|
347
|
+
} else if (reply === msgReply && page === lastPage + 1) {
|
|
348
|
+
pages.push(content);
|
|
349
|
+
lastPage = page;
|
|
350
|
+
} else {
|
|
351
|
+
pages = [];
|
|
352
|
+
continue;
|
|
353
|
+
}
|
|
354
|
+
if (lastPage === msgPages) completeMessage();
|
|
355
|
+
}
|
|
356
|
+
finalize();
|
|
357
|
+
return {
|
|
358
|
+
epochs,
|
|
359
|
+
obsCodes,
|
|
360
|
+
recordCounts,
|
|
361
|
+
retsvCounts,
|
|
362
|
+
badChecksum: stats.badChecksum
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
function decodeEpoch(epoch, epochs, obsCodes) {
|
|
366
|
+
const total = epoch.chunks.reduce((a, c) => a + c.length, 0);
|
|
367
|
+
const M = new Uint8Array(total);
|
|
368
|
+
let o = 0;
|
|
369
|
+
for (const c of epoch.chunks) {
|
|
370
|
+
M.set(c, o);
|
|
371
|
+
o += c.length;
|
|
372
|
+
}
|
|
373
|
+
const dv = new DataView(M.buffer, M.byteOffset, M.byteLength);
|
|
374
|
+
const timeMs = GPS_EPOCH_MS2 + epoch.week * MS_PER_WEEK2 + epoch.towMs;
|
|
375
|
+
const meas = [];
|
|
376
|
+
let q = 0;
|
|
377
|
+
for (let sv = 0; sv < epoch.nsv && q + 8 <= M.length; sv++) {
|
|
378
|
+
const svLen = M[q];
|
|
379
|
+
if (svLen < 8 || q + svLen > M.length) break;
|
|
380
|
+
const svid = M[q + 1];
|
|
381
|
+
const sys = SYS[M[q + 2] & 63];
|
|
382
|
+
const chan = M[q + 3] << 24 >> 24;
|
|
383
|
+
const nblk = M[q + 4];
|
|
384
|
+
const prn = sys ? rinexPrn(sys, svid) : null;
|
|
385
|
+
const gloChannel = sys === "R" ? chan : null;
|
|
386
|
+
let r = q + svLen;
|
|
387
|
+
let pr0 = 0;
|
|
388
|
+
for (let b = 0; b < nblk; b++) {
|
|
389
|
+
if (r + 5 > M.length) break;
|
|
390
|
+
const mLen = M[r];
|
|
391
|
+
if (mLen < 5 || r + mLen > M.length) break;
|
|
392
|
+
const band = M[r + 1];
|
|
393
|
+
const track = M[r + 2];
|
|
394
|
+
const cn0 = dv.getUint16(r + 3, false) / 10;
|
|
395
|
+
let p = r + 5;
|
|
396
|
+
let pr;
|
|
397
|
+
if (b === 0) {
|
|
398
|
+
const scale = sys === "S" || sys === "J" ? 64 : 128;
|
|
399
|
+
pr = dv.getUint32(p, false) / scale;
|
|
400
|
+
p += 4;
|
|
401
|
+
pr0 = pr;
|
|
402
|
+
} else {
|
|
403
|
+
pr = pr0 + readS16(dv, p) / 256;
|
|
404
|
+
p += 2;
|
|
405
|
+
}
|
|
406
|
+
const cp = -readS48(M, dv, p) / 32768;
|
|
407
|
+
p += 6;
|
|
408
|
+
const cycleSlipCount = M[p];
|
|
409
|
+
p += 1;
|
|
410
|
+
const mf = M[p];
|
|
411
|
+
p += 1;
|
|
412
|
+
let mf2 = 0;
|
|
413
|
+
if (mf & 128) {
|
|
414
|
+
mf2 = M[p];
|
|
415
|
+
p += 1;
|
|
416
|
+
let f = mf2;
|
|
417
|
+
while (f & 128) {
|
|
418
|
+
f = M[p];
|
|
419
|
+
p += 1;
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
if (mf2 & 1) p += 1;
|
|
423
|
+
let doppler = null;
|
|
424
|
+
if (mf & 4) doppler = readS24(M, p) / 256;
|
|
425
|
+
if (prn && sys) {
|
|
426
|
+
const code = rinexCode(sys, band, track);
|
|
427
|
+
meas.push({
|
|
428
|
+
prn,
|
|
429
|
+
code,
|
|
430
|
+
pr: mf & 2 ? pr : null,
|
|
431
|
+
cp: mf & 1 ? cp : null,
|
|
432
|
+
doppler: mf & 1 ? doppler : null,
|
|
433
|
+
cn0,
|
|
434
|
+
cycleSlipCount,
|
|
435
|
+
cycleSlip: (mf & 8) !== 0,
|
|
436
|
+
gloChannel
|
|
437
|
+
});
|
|
438
|
+
const list = obsCodes[sys] ??= [];
|
|
439
|
+
if (!list.includes(code)) list.push(code);
|
|
440
|
+
}
|
|
441
|
+
r += mLen;
|
|
442
|
+
}
|
|
443
|
+
q = r;
|
|
444
|
+
}
|
|
445
|
+
epochs.push({ timeMs, meas });
|
|
446
|
+
}
|
|
447
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
448
|
+
0 && (module.exports = {
|
|
449
|
+
parseTrimble,
|
|
450
|
+
parseTrimbleNav,
|
|
451
|
+
trimbleFrames
|
|
452
|
+
});
|