gnss-js 1.0.1 → 1.2.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/README.md +54 -0
- package/dist/analysis.cjs +3 -3
- package/dist/analysis.js +3 -3
- package/dist/{chunk-HKN3PUGN.js → chunk-5SPJH4MG.js} +35 -26
- package/dist/{chunk-WP2JFDLA.js → chunk-7EEWQ5DU.js} +93 -118
- package/dist/{chunk-SO3POWWR.js → chunk-G3N4S3DM.js} +2 -2
- package/dist/{chunk-7NOFXKET.js → chunk-HVXYFUCB.js} +72 -257
- package/dist/chunk-L5OUUNLT.js +198 -0
- package/dist/{chunk-HBLU2EJ4.js → chunk-OZCYOM5D.js} +1 -1
- package/dist/{chunk-4YN353Q7.js → chunk-VANVV4F7.js} +21 -7
- package/dist/{chunk-LWNTWBHB.js → chunk-W5WKEV7U.js} +3 -2
- package/dist/constants.cjs +3 -2
- package/dist/constants.js +7 -7
- package/dist/{ephemeris-C10stHhM.d.cts → ephemeris-Ohl6NAfw.d.cts} +11 -1
- package/dist/{ephemeris-C10stHhM.d.ts → ephemeris-Ohl6NAfw.d.ts} +11 -1
- package/dist/frames.cjs +250 -0
- package/dist/frames.d.cts +56 -0
- package/dist/frames.d.ts +56 -0
- package/dist/frames.js +222 -0
- package/dist/index.cjs +133 -152
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +96 -88
- package/dist/orbit.cjs +103 -7
- package/dist/orbit.d.cts +1 -1
- package/dist/orbit.d.ts +1 -1
- package/dist/orbit.js +3 -1
- package/dist/positioning.cjs +565 -0
- package/dist/positioning.d.cts +68 -0
- package/dist/positioning.d.ts +68 -0
- package/dist/positioning.js +206 -0
- package/dist/rinex.js +2 -2
- package/dist/rtcm3.cjs +116 -117
- package/dist/rtcm3.d.cts +9 -3
- package/dist/rtcm3.d.ts +9 -3
- package/dist/rtcm3.js +9 -2
- package/dist/signals.cjs +55 -26
- package/dist/signals.d.cts +26 -26
- package/dist/signals.d.ts +26 -26
- package/dist/signals.js +2 -1
- package/dist/time.js +20 -18
- package/package.json +11 -2
package/dist/index.cjs
CHANGED
|
@@ -206,10 +206,13 @@ __export(src_exports, {
|
|
|
206
206
|
phiBPSK: () => phiBPSK,
|
|
207
207
|
rad2deg: () => rad2deg,
|
|
208
208
|
readString: () => readString,
|
|
209
|
+
reportDecodeError: () => reportDecodeError,
|
|
209
210
|
resetGloFreqCache: () => resetGloFreqCache,
|
|
210
211
|
rhumbLine: () => rhumbLine,
|
|
211
212
|
rtcm3Constellation: () => rtcm3Constellation,
|
|
212
213
|
selectEphemeris: () => selectEphemeris,
|
|
214
|
+
setGloFreqNumber: () => setGloFreqNumber,
|
|
215
|
+
setRtcm3DebugHandler: () => setRtcm3DebugHandler,
|
|
213
216
|
systemCmp: () => systemCmp,
|
|
214
217
|
systemName: () => systemName,
|
|
215
218
|
updateStationMeta: () => updateStationMeta,
|
|
@@ -298,7 +301,8 @@ var SYS_SHORT = {
|
|
|
298
301
|
var C_LIGHT = 299792458;
|
|
299
302
|
var FREQ = {
|
|
300
303
|
G: { "1": 157542e4, "2": 12276e5, "5": 117645e4 },
|
|
301
|
-
R
|
|
304
|
+
// R bands 4/6 are the CDMA L1OC/L2OC center frequencies
|
|
305
|
+
R: { "3": 1202025e3, "4": 1600995e3, "6": 124806e4 },
|
|
302
306
|
E: {
|
|
303
307
|
"1": 157542e4,
|
|
304
308
|
"5": 117645e4,
|
|
@@ -392,11 +396,11 @@ function buildGloChannelMap(slots) {
|
|
|
392
396
|
return map;
|
|
393
397
|
}
|
|
394
398
|
function gloFreq(gloChannels, prn, band) {
|
|
399
|
+
if (band === "3" || band === "4" || band === "6") return FREQ.R[band];
|
|
395
400
|
const k = gloChannels[prn];
|
|
396
401
|
if (k === void 0) return void 0;
|
|
397
402
|
if (band === "1") return GLO_F1_BASE + k * GLO_F1_STEP;
|
|
398
403
|
if (band === "2") return GLO_F2_BASE + k * GLO_F2_STEP;
|
|
399
|
-
if (band === "3") return GLO_F3;
|
|
400
404
|
return void 0;
|
|
401
405
|
}
|
|
402
406
|
function getFreq(gloChannels, prn, band) {
|
|
@@ -2556,6 +2560,13 @@ function writeRinexNav(nav) {
|
|
|
2556
2560
|
}
|
|
2557
2561
|
|
|
2558
2562
|
// src/rtcm3/decoder.ts
|
|
2563
|
+
var debugHandler = null;
|
|
2564
|
+
function setRtcm3DebugHandler(fn) {
|
|
2565
|
+
debugHandler = fn;
|
|
2566
|
+
}
|
|
2567
|
+
function reportDecodeError(context, error) {
|
|
2568
|
+
if (debugHandler) debugHandler(context, error);
|
|
2569
|
+
}
|
|
2559
2570
|
var BitReader = class {
|
|
2560
2571
|
data;
|
|
2561
2572
|
bitPos = 0;
|
|
@@ -3090,31 +3101,32 @@ function decodeEphemeris(frame) {
|
|
|
3090
3101
|
default:
|
|
3091
3102
|
return null;
|
|
3092
3103
|
}
|
|
3093
|
-
} catch {
|
|
3104
|
+
} catch (err) {
|
|
3105
|
+
reportDecodeError("ephemeris", err);
|
|
3094
3106
|
return null;
|
|
3095
3107
|
}
|
|
3096
3108
|
}
|
|
3097
3109
|
|
|
3098
3110
|
// src/rtcm3/msm.ts
|
|
3099
|
-
var GPS_L1 =
|
|
3100
|
-
var GPS_L2 =
|
|
3101
|
-
var GPS_L5 =
|
|
3102
|
-
var GLO_L1a =
|
|
3103
|
-
var GLO_L2a =
|
|
3104
|
-
var GLO_L3 =
|
|
3105
|
-
var GAL_E1 =
|
|
3106
|
-
var GAL_E5a =
|
|
3107
|
-
var GAL_E5b =
|
|
3108
|
-
var GAL_E5 =
|
|
3109
|
-
var GAL_E6 =
|
|
3110
|
-
var BDS_B1 =
|
|
3111
|
-
var BDS_B3 =
|
|
3112
|
-
var BDS_B2 =
|
|
3113
|
-
var BDS_B1C =
|
|
3114
|
-
var BDS_B2a =
|
|
3115
|
-
var BDS_B2b =
|
|
3116
|
-
var QZSS_L6 =
|
|
3117
|
-
var NAVIC_S =
|
|
3111
|
+
var GPS_L1 = FREQ.G["1"];
|
|
3112
|
+
var GPS_L2 = FREQ.G["2"];
|
|
3113
|
+
var GPS_L5 = FREQ.G["5"];
|
|
3114
|
+
var GLO_L1a = FREQ.R["4"];
|
|
3115
|
+
var GLO_L2a = FREQ.R["6"];
|
|
3116
|
+
var GLO_L3 = FREQ.R["3"];
|
|
3117
|
+
var GAL_E1 = FREQ.E["1"];
|
|
3118
|
+
var GAL_E5a = FREQ.E["5"];
|
|
3119
|
+
var GAL_E5b = FREQ.E["7"];
|
|
3120
|
+
var GAL_E5 = FREQ.E["8"];
|
|
3121
|
+
var GAL_E6 = FREQ.E["6"];
|
|
3122
|
+
var BDS_B1 = FREQ.C["2"];
|
|
3123
|
+
var BDS_B3 = FREQ.C["6"];
|
|
3124
|
+
var BDS_B2 = FREQ.C["7"];
|
|
3125
|
+
var BDS_B1C = FREQ.C["1"];
|
|
3126
|
+
var BDS_B2a = FREQ.C["5"];
|
|
3127
|
+
var BDS_B2b = FREQ.C["7"];
|
|
3128
|
+
var QZSS_L6 = FREQ.J["6"];
|
|
3129
|
+
var NAVIC_S = FREQ.I["9"];
|
|
3118
3130
|
var EMPTY = { code: "", freq: 0 };
|
|
3119
3131
|
function sd(code, freq) {
|
|
3120
3132
|
return { code, freq };
|
|
@@ -3366,40 +3378,6 @@ function signalTable(sys) {
|
|
|
3366
3378
|
return GPS_SIGNALS;
|
|
3367
3379
|
}
|
|
3368
3380
|
}
|
|
3369
|
-
var BitReader2 = class {
|
|
3370
|
-
data;
|
|
3371
|
-
pos;
|
|
3372
|
-
constructor(data, startBit = 0) {
|
|
3373
|
-
this.data = data;
|
|
3374
|
-
this.pos = startBit;
|
|
3375
|
-
}
|
|
3376
|
-
/** Read unsigned value of numBits bits (max 53) */
|
|
3377
|
-
u(numBits) {
|
|
3378
|
-
let val = 0;
|
|
3379
|
-
for (let i = 0; i < numBits; i++) {
|
|
3380
|
-
const byteIdx = this.pos + i >>> 3;
|
|
3381
|
-
const bitIdx = 7 - (this.pos + i & 7);
|
|
3382
|
-
const bit = byteIdx < this.data.length ? this.data[byteIdx] >>> bitIdx & 1 : 0;
|
|
3383
|
-
val = val * 2 + bit;
|
|
3384
|
-
}
|
|
3385
|
-
this.pos += numBits;
|
|
3386
|
-
return val;
|
|
3387
|
-
}
|
|
3388
|
-
/** Read signed value (two's complement) */
|
|
3389
|
-
s(numBits) {
|
|
3390
|
-
const raw = this.u(numBits);
|
|
3391
|
-
const half = 2 ** (numBits - 1);
|
|
3392
|
-
return raw >= half ? raw - 2 ** numBits : raw;
|
|
3393
|
-
}
|
|
3394
|
-
/** Skip bits */
|
|
3395
|
-
skip(n) {
|
|
3396
|
-
this.pos += n;
|
|
3397
|
-
}
|
|
3398
|
-
/** Current bit position */
|
|
3399
|
-
get position() {
|
|
3400
|
-
return this.pos;
|
|
3401
|
-
}
|
|
3402
|
-
};
|
|
3403
3381
|
var gloFreqNum = new Int8Array(64).fill(-128);
|
|
3404
3382
|
function gloWavelength(satIdx, freqMarker) {
|
|
3405
3383
|
const k = gloFreqNum[satIdx];
|
|
@@ -3434,28 +3412,9 @@ function lockTimeSec(msmType, lti) {
|
|
|
3434
3412
|
if (variant <= 5) {
|
|
3435
3413
|
return LTI_TABLE_4BIT[lti] ?? 0;
|
|
3436
3414
|
}
|
|
3437
|
-
if (lti < 64) return lti;
|
|
3438
|
-
|
|
3439
|
-
|
|
3440
|
-
if (lti < 160) return (lti - 128) * 8 + 256;
|
|
3441
|
-
if (lti < 192) return (lti - 160) * 16 + 512;
|
|
3442
|
-
if (lti < 224) return (lti - 192) * 32 + 1024;
|
|
3443
|
-
if (lti < 256) return (lti - 224) * 64 + 2048;
|
|
3444
|
-
if (lti < 288) return (lti - 256) * 128 + 4096;
|
|
3445
|
-
if (lti < 320) return (lti - 288) * 256 + 8192;
|
|
3446
|
-
if (lti < 352) return (lti - 320) * 512 + 16384;
|
|
3447
|
-
if (lti < 384) return (lti - 352) * 1024 + 32768;
|
|
3448
|
-
if (lti < 416) return (lti - 384) * 2048 + 65536;
|
|
3449
|
-
if (lti < 448) return (lti - 416) * 4096 + 131072;
|
|
3450
|
-
if (lti < 480) return (lti - 448) * 8192 + 262144;
|
|
3451
|
-
if (lti < 512) return (lti - 480) * 16384 + 524288;
|
|
3452
|
-
if (lti < 544) return (lti - 512) * 32768 + 1048576;
|
|
3453
|
-
if (lti < 576) return (lti - 544) * 65536 + 2097152;
|
|
3454
|
-
if (lti < 608) return (lti - 576) * 131072 + 4194304;
|
|
3455
|
-
if (lti < 640) return (lti - 608) * 262144 + 8388608;
|
|
3456
|
-
if (lti < 672) return (lti - 640) * 524288 + 16777216;
|
|
3457
|
-
if (lti < 704) return (lti - 672) * 1048576 + 33554432;
|
|
3458
|
-
return (lti - 704) * 2097152 + 67108864;
|
|
3415
|
+
if (lti < 64) return lti / 1e3;
|
|
3416
|
+
const n = Math.min(20, Math.floor((lti - 64) / 32));
|
|
3417
|
+
return ((lti - 64 - 32 * n) * 2 ** (n + 1) + 2 ** (n + 6)) / 1e3;
|
|
3459
3418
|
}
|
|
3460
3419
|
function msmSystem(type) {
|
|
3461
3420
|
if (type >= 1071 && type <= 1077) return "G";
|
|
@@ -3481,10 +3440,10 @@ function decodeMsmFull(frame) {
|
|
|
3481
3440
|
const payload = frame.payload;
|
|
3482
3441
|
if (!payload || payload.length < 10) return null;
|
|
3483
3442
|
try {
|
|
3484
|
-
const bits = new
|
|
3443
|
+
const bits = new BitReader(payload);
|
|
3485
3444
|
bits.skip(12);
|
|
3486
3445
|
bits.skip(12);
|
|
3487
|
-
const epochMs = bits.
|
|
3446
|
+
const epochMs = bits.readU(30);
|
|
3488
3447
|
bits.skip(1);
|
|
3489
3448
|
bits.skip(3);
|
|
3490
3449
|
bits.skip(7);
|
|
@@ -3492,8 +3451,8 @@ function decodeMsmFull(frame) {
|
|
|
3492
3451
|
bits.skip(2);
|
|
3493
3452
|
bits.skip(1);
|
|
3494
3453
|
bits.skip(3);
|
|
3495
|
-
const satMaskHi = bits.
|
|
3496
|
-
const satMaskLo = bits.
|
|
3454
|
+
const satMaskHi = bits.readU(32) >>> 0;
|
|
3455
|
+
const satMaskLo = bits.readU(32) >>> 0;
|
|
3497
3456
|
const satIndices = [];
|
|
3498
3457
|
for (let i = 0; i < 32; i++) {
|
|
3499
3458
|
if (satMaskHi & 1 << 31 - i) satIndices.push(i + 1);
|
|
@@ -3503,7 +3462,7 @@ function decodeMsmFull(frame) {
|
|
|
3503
3462
|
}
|
|
3504
3463
|
const numSat = satIndices.length;
|
|
3505
3464
|
if (numSat === 0) return null;
|
|
3506
|
-
const sigMask = bits.
|
|
3465
|
+
const sigMask = bits.readU(32) >>> 0;
|
|
3507
3466
|
const sigIndices = [];
|
|
3508
3467
|
for (let i = 0; i < 32; i++) {
|
|
3509
3468
|
if (sigMask & 1 << 31 - i) sigIndices.push(i);
|
|
@@ -3513,7 +3472,7 @@ function decodeMsmFull(frame) {
|
|
|
3513
3472
|
const numCells = numSat * numSig;
|
|
3514
3473
|
const cellMask = [];
|
|
3515
3474
|
for (let i = 0; i < numCells; i++) {
|
|
3516
|
-
cellMask.push(bits.
|
|
3475
|
+
cellMask.push(bits.readU(1) === 1);
|
|
3517
3476
|
}
|
|
3518
3477
|
let activeCells = 0;
|
|
3519
3478
|
for (const c of cellMask) if (c) activeCells++;
|
|
@@ -3523,13 +3482,13 @@ function decodeMsmFull(frame) {
|
|
|
3523
3482
|
const extsat = new Int8Array(numSat);
|
|
3524
3483
|
const rdop = new Float64Array(numSat);
|
|
3525
3484
|
if (variant === 4 || variant === 6) {
|
|
3526
|
-
for (let j = 0; j < numSat; j++) rrint[j] = bits.
|
|
3527
|
-
for (let j = 0; j < numSat; j++) rrmod[j] = bits.
|
|
3485
|
+
for (let j = 0; j < numSat; j++) rrint[j] = bits.readU(8);
|
|
3486
|
+
for (let j = 0; j < numSat; j++) rrmod[j] = bits.readU(10) / 1024;
|
|
3528
3487
|
} else {
|
|
3529
|
-
for (let j = 0; j < numSat; j++) rrint[j] = bits.
|
|
3530
|
-
for (let j = 0; j < numSat; j++) extsat[j] = bits.
|
|
3531
|
-
for (let j = 0; j < numSat; j++) rrmod[j] = bits.
|
|
3532
|
-
for (let j = 0; j < numSat; j++) rdop[j] = bits.
|
|
3488
|
+
for (let j = 0; j < numSat; j++) rrint[j] = bits.readU(8);
|
|
3489
|
+
for (let j = 0; j < numSat; j++) extsat[j] = bits.readU(4);
|
|
3490
|
+
for (let j = 0; j < numSat; j++) rrmod[j] = bits.readU(10) / 1024;
|
|
3491
|
+
for (let j = 0; j < numSat; j++) rdop[j] = bits.readS(14) * 1;
|
|
3533
3492
|
}
|
|
3534
3493
|
if (sys === "R") {
|
|
3535
3494
|
for (let j = 0; j < numSat; j++) {
|
|
@@ -3549,31 +3508,31 @@ function decodeMsmFull(frame) {
|
|
|
3549
3508
|
cp.fill(-1e30);
|
|
3550
3509
|
dop.fill(-1e30);
|
|
3551
3510
|
if (variant === 4) {
|
|
3552
|
-
for (let i = 0; i < activeCells; i++) psr[i] = bits.
|
|
3553
|
-
for (let i = 0; i < activeCells; i++) cp[i] = bits.
|
|
3554
|
-
for (let i = 0; i < activeCells; i++) ll[i] = bits.
|
|
3555
|
-
for (let i = 0; i < activeCells; i++) hc[i] = bits.
|
|
3556
|
-
for (let i = 0; i < activeCells; i++) cnr[i] = bits.
|
|
3511
|
+
for (let i = 0; i < activeCells; i++) psr[i] = bits.readS(15) / 2 ** 24;
|
|
3512
|
+
for (let i = 0; i < activeCells; i++) cp[i] = bits.readS(22) / 2 ** 29;
|
|
3513
|
+
for (let i = 0; i < activeCells; i++) ll[i] = bits.readU(4);
|
|
3514
|
+
for (let i = 0; i < activeCells; i++) hc[i] = bits.readU(1);
|
|
3515
|
+
for (let i = 0; i < activeCells; i++) cnr[i] = bits.readU(6);
|
|
3557
3516
|
} else if (variant === 5) {
|
|
3558
|
-
for (let i = 0; i < activeCells; i++) psr[i] = bits.
|
|
3559
|
-
for (let i = 0; i < activeCells; i++) cp[i] = bits.
|
|
3560
|
-
for (let i = 0; i < activeCells; i++) ll[i] = bits.
|
|
3561
|
-
for (let i = 0; i < activeCells; i++) hc[i] = bits.
|
|
3562
|
-
for (let i = 0; i < activeCells; i++) cnr[i] = bits.
|
|
3563
|
-
for (let i = 0; i < activeCells; i++) dop[i] = bits.
|
|
3517
|
+
for (let i = 0; i < activeCells; i++) psr[i] = bits.readS(15) / 2 ** 24;
|
|
3518
|
+
for (let i = 0; i < activeCells; i++) cp[i] = bits.readS(22) / 2 ** 29;
|
|
3519
|
+
for (let i = 0; i < activeCells; i++) ll[i] = bits.readU(4);
|
|
3520
|
+
for (let i = 0; i < activeCells; i++) hc[i] = bits.readU(1);
|
|
3521
|
+
for (let i = 0; i < activeCells; i++) cnr[i] = bits.readU(6);
|
|
3522
|
+
for (let i = 0; i < activeCells; i++) dop[i] = bits.readS(15) * 1e-4;
|
|
3564
3523
|
} else if (variant === 6) {
|
|
3565
|
-
for (let i = 0; i < activeCells; i++) psr[i] = bits.
|
|
3566
|
-
for (let i = 0; i < activeCells; i++) cp[i] = bits.
|
|
3567
|
-
for (let i = 0; i < activeCells; i++) ll[i] = bits.
|
|
3568
|
-
for (let i = 0; i < activeCells; i++) hc[i] = bits.
|
|
3569
|
-
for (let i = 0; i < activeCells; i++) cnr[i] = bits.
|
|
3524
|
+
for (let i = 0; i < activeCells; i++) psr[i] = bits.readS(20) / 2 ** 29;
|
|
3525
|
+
for (let i = 0; i < activeCells; i++) cp[i] = bits.readS(24) / 2 ** 31;
|
|
3526
|
+
for (let i = 0; i < activeCells; i++) ll[i] = bits.readU(10);
|
|
3527
|
+
for (let i = 0; i < activeCells; i++) hc[i] = bits.readU(1);
|
|
3528
|
+
for (let i = 0; i < activeCells; i++) cnr[i] = bits.readU(10) / 16;
|
|
3570
3529
|
} else {
|
|
3571
|
-
for (let i = 0; i < activeCells; i++) psr[i] = bits.
|
|
3572
|
-
for (let i = 0; i < activeCells; i++) cp[i] = bits.
|
|
3573
|
-
for (let i = 0; i < activeCells; i++) ll[i] = bits.
|
|
3574
|
-
for (let i = 0; i < activeCells; i++) hc[i] = bits.
|
|
3575
|
-
for (let i = 0; i < activeCells; i++) cnr[i] = bits.
|
|
3576
|
-
for (let i = 0; i < activeCells; i++) dop[i] = bits.
|
|
3530
|
+
for (let i = 0; i < activeCells; i++) psr[i] = bits.readS(20) / 2 ** 29;
|
|
3531
|
+
for (let i = 0; i < activeCells; i++) cp[i] = bits.readS(24) / 2 ** 31;
|
|
3532
|
+
for (let i = 0; i < activeCells; i++) ll[i] = bits.readU(10);
|
|
3533
|
+
for (let i = 0; i < activeCells; i++) hc[i] = bits.readU(1);
|
|
3534
|
+
for (let i = 0; i < activeCells; i++) cnr[i] = bits.readU(10) / 16;
|
|
3535
|
+
for (let i = 0; i < activeCells; i++) dop[i] = bits.readS(15) * 1e-4;
|
|
3577
3536
|
}
|
|
3578
3537
|
const sigTable = signalTable(sys);
|
|
3579
3538
|
const observations = [];
|
|
@@ -3607,11 +3566,11 @@ function decodeMsmFull(frame) {
|
|
|
3607
3566
|
wavelength
|
|
3608
3567
|
};
|
|
3609
3568
|
const psrVal = psr[cellIdx];
|
|
3610
|
-
if (psrVal > -
|
|
3569
|
+
if (psrVal > -(2 ** -10)) {
|
|
3611
3570
|
signal.pseudorange = psrVal * C_LIGHT / 1e3 + roughRange_m;
|
|
3612
3571
|
}
|
|
3613
3572
|
const cpVal = cp[cellIdx];
|
|
3614
|
-
if (cpVal > -
|
|
3573
|
+
if (cpVal > -(2 ** -8) && wavelength > 0) {
|
|
3615
3574
|
signal.phase = cpVal * C_LIGHT / 1e3 / wavelength + roughRange_m / wavelength;
|
|
3616
3575
|
}
|
|
3617
3576
|
if (variant === 5 || variant === 7) {
|
|
@@ -3639,12 +3598,13 @@ function decodeMsmFull(frame) {
|
|
|
3639
3598
|
system: sys,
|
|
3640
3599
|
observations
|
|
3641
3600
|
};
|
|
3642
|
-
} catch {
|
|
3601
|
+
} catch (err) {
|
|
3602
|
+
reportDecodeError("msm", err);
|
|
3643
3603
|
return null;
|
|
3644
3604
|
}
|
|
3645
3605
|
}
|
|
3646
|
-
var GPS_EPOCH =
|
|
3647
|
-
var MS_PER_WEEK =
|
|
3606
|
+
var GPS_EPOCH = START_GPS_TIME.getTime();
|
|
3607
|
+
var MS_PER_WEEK = MILLISECONDS_IN_WEEK;
|
|
3648
3608
|
function msmEpochToDate(sys, epochMs, refTime = /* @__PURE__ */ new Date()) {
|
|
3649
3609
|
const refMs = refTime.getTime();
|
|
3650
3610
|
if (sys === "R") {
|
|
@@ -3659,11 +3619,12 @@ function msmEpochToDate(sys, epochMs, refTime = /* @__PURE__ */ new Date()) {
|
|
|
3659
3619
|
return new Date(t2);
|
|
3660
3620
|
}
|
|
3661
3621
|
if (sys === "C") {
|
|
3662
|
-
const BDS_EPOCH =
|
|
3622
|
+
const BDS_EPOCH = START_BDS_TIME.getTime();
|
|
3663
3623
|
const weeksSinceEpoch2 = Math.floor((refMs - BDS_EPOCH) / MS_PER_WEEK);
|
|
3664
3624
|
let t2 = BDS_EPOCH + weeksSinceEpoch2 * MS_PER_WEEK + epochMs;
|
|
3665
3625
|
if (t2 - refMs > MS_PER_WEEK / 2) t2 -= MS_PER_WEEK;
|
|
3666
3626
|
else if (refMs - t2 > MS_PER_WEEK / 2) t2 += MS_PER_WEEK;
|
|
3627
|
+
t2 -= 18e3;
|
|
3667
3628
|
return new Date(t2);
|
|
3668
3629
|
}
|
|
3669
3630
|
const weeksSinceEpoch = Math.floor((refMs - GPS_EPOCH) / MS_PER_WEEK);
|
|
@@ -3673,6 +3634,11 @@ function msmEpochToDate(sys, epochMs, refTime = /* @__PURE__ */ new Date()) {
|
|
|
3673
3634
|
t -= 18e3;
|
|
3674
3635
|
return new Date(t);
|
|
3675
3636
|
}
|
|
3637
|
+
function setGloFreqNumber(slot, k) {
|
|
3638
|
+
if (slot >= 1 && slot <= 64 && k >= -7 && k <= 13) {
|
|
3639
|
+
gloFreqNum[slot - 1] = k;
|
|
3640
|
+
}
|
|
3641
|
+
}
|
|
3676
3642
|
function resetGloFreqCache() {
|
|
3677
3643
|
gloFreqNum.fill(-128);
|
|
3678
3644
|
}
|
|
@@ -3806,7 +3772,8 @@ function updateStationMeta(meta, frame) {
|
|
|
3806
3772
|
default:
|
|
3807
3773
|
return false;
|
|
3808
3774
|
}
|
|
3809
|
-
} catch {
|
|
3775
|
+
} catch (err) {
|
|
3776
|
+
reportDecodeError("station", err);
|
|
3810
3777
|
return false;
|
|
3811
3778
|
}
|
|
3812
3779
|
}
|
|
@@ -3994,6 +3961,9 @@ function updateStreamStats(stats, frames, rawBytes) {
|
|
|
3994
3961
|
const eph = decodeEphemeris(frame);
|
|
3995
3962
|
if (eph) {
|
|
3996
3963
|
stats.ephemerides.set(eph.prn, eph);
|
|
3964
|
+
if (eph.freqChannel !== void 0 && eph.prn.startsWith("R")) {
|
|
3965
|
+
setGloFreqNumber(parseInt(eph.prn.slice(1), 10), eph.freqChannel);
|
|
3966
|
+
}
|
|
3997
3967
|
}
|
|
3998
3968
|
updateStationMeta(stats.stationMeta, frame);
|
|
3999
3969
|
}
|
|
@@ -4013,6 +3983,8 @@ var GM_GAL = 3986004418e5;
|
|
|
4013
3983
|
var GM_BDS = 3986004418e5;
|
|
4014
3984
|
var GM_GLO = 39860044e7;
|
|
4015
3985
|
var OMEGA_E = 72921151467e-15;
|
|
3986
|
+
var BDS_GEO_MAX_INCLINATION_RAD = 0.1;
|
|
3987
|
+
var BDS_GEO_MIN_SEMIMAJOR_AXIS_M = 4e7;
|
|
4016
3988
|
var AE_GLO = 6378136;
|
|
4017
3989
|
var J2_GLO = 108263e-8;
|
|
4018
3990
|
var TWO_PI = 2 * Math.PI;
|
|
@@ -4050,7 +4022,7 @@ function keplerPosition(eph, t) {
|
|
|
4050
4022
|
const ik = eph.i0 + dik + eph.idot * tk;
|
|
4051
4023
|
const xp = rk * Math.cos(uk);
|
|
4052
4024
|
const yp = rk * Math.sin(uk);
|
|
4053
|
-
const isBdsGeo = eph.system === "C" && Math.abs(eph.i0) <
|
|
4025
|
+
const isBdsGeo = eph.system === "C" && Math.abs(eph.i0) < BDS_GEO_MAX_INCLINATION_RAD && a > BDS_GEO_MIN_SEMIMAJOR_AXIS_M;
|
|
4054
4026
|
if (isBdsGeo) {
|
|
4055
4027
|
const omegak2 = eph.omega0 + eph.omegaDot * tk - OMEGA_E * eph.toe;
|
|
4056
4028
|
const cosO2 = Math.cos(omegak2);
|
|
@@ -4229,11 +4201,13 @@ function selectEphemeris(ephemerides, prn, timeMs) {
|
|
|
4229
4201
|
}
|
|
4230
4202
|
function computeSatPosition(eph, timeMs) {
|
|
4231
4203
|
if (eph.system === "R" || eph.system === "S") {
|
|
4232
|
-
|
|
4204
|
+
const leapMs = getGpsLeap(new Date(timeMs)) * 1e3;
|
|
4205
|
+
return glonassPosition(eph, (timeMs - leapMs) / 1e3);
|
|
4233
4206
|
}
|
|
4234
|
-
const GPS_EPOCH2 =
|
|
4207
|
+
const GPS_EPOCH2 = START_GPS_TIME.getTime();
|
|
4235
4208
|
const gpsSeconds = (timeMs - GPS_EPOCH2) / 1e3;
|
|
4236
|
-
|
|
4209
|
+
let tow = gpsSeconds % (7 * 86400);
|
|
4210
|
+
if (eph.system === "C") tow = (tow - 14 + 604800) % 604800;
|
|
4237
4211
|
return keplerPosition(eph, tow);
|
|
4238
4212
|
}
|
|
4239
4213
|
function navTimesFromEph(ephs) {
|
|
@@ -4315,8 +4289,8 @@ function selectBest(ephs, timeMs) {
|
|
|
4315
4289
|
}
|
|
4316
4290
|
return best;
|
|
4317
4291
|
}
|
|
4318
|
-
var GPS_EPOCH_MS =
|
|
4319
|
-
var BDS_EPOCH_MS =
|
|
4292
|
+
var GPS_EPOCH_MS = START_GPS_TIME.getTime();
|
|
4293
|
+
var BDS_EPOCH_MS = START_BDS_TIME.getTime();
|
|
4320
4294
|
var GAL_EPOCH_MS = GPS_EPOCH_MS;
|
|
4321
4295
|
function ephInfoToEphemeris(info) {
|
|
4322
4296
|
const sys = info.prn.charAt(0);
|
|
@@ -4357,6 +4331,9 @@ function ephInfoToEphemeris(info) {
|
|
|
4357
4331
|
}
|
|
4358
4332
|
if (info.sqrtA === void 0 || info.eccentricity === void 0 || info.inclination === void 0 || info.omega0 === void 0 || info.argPerigee === void 0 || info.meanAnomaly === void 0 || info.toe === void 0 || info.week === void 0)
|
|
4359
4333
|
return null;
|
|
4334
|
+
if (info.eccentricity < 0 || info.eccentricity >= 1 || info.sqrtA < 3e3 || info.sqrtA > 9e3 || info.toe < 0 || info.toe > 604800) {
|
|
4335
|
+
return null;
|
|
4336
|
+
}
|
|
4360
4337
|
let epochMs;
|
|
4361
4338
|
const tocSec = info.toc ?? info.toe;
|
|
4362
4339
|
if (sys === "C") {
|
|
@@ -4398,7 +4375,7 @@ function ephInfoToEphemeris(info) {
|
|
|
4398
4375
|
};
|
|
4399
4376
|
}
|
|
4400
4377
|
function computeLiveSkyPositions(ephemerides, rxPos, cn0Map) {
|
|
4401
|
-
const now = Date.now();
|
|
4378
|
+
const now = Date.now() + getGpsLeap(/* @__PURE__ */ new Date()) * 1e3;
|
|
4402
4379
|
const result = [];
|
|
4403
4380
|
const [rxX, rxY, rxZ] = rxPos;
|
|
4404
4381
|
const [rxLat, rxLon] = ecefToGeodetic(rxX, rxY, rxZ);
|
|
@@ -5487,32 +5464,33 @@ function parseNmeaFile(content) {
|
|
|
5487
5464
|
}
|
|
5488
5465
|
|
|
5489
5466
|
// src/signals/definitions.ts
|
|
5490
|
-
var
|
|
5491
|
-
var
|
|
5492
|
-
var
|
|
5493
|
-
var
|
|
5494
|
-
var
|
|
5495
|
-
var
|
|
5496
|
-
var
|
|
5497
|
-
var
|
|
5498
|
-
var
|
|
5499
|
-
var
|
|
5500
|
-
var
|
|
5501
|
-
var
|
|
5502
|
-
var
|
|
5503
|
-
var
|
|
5504
|
-
var
|
|
5505
|
-
var
|
|
5506
|
-
var
|
|
5507
|
-
var
|
|
5508
|
-
var
|
|
5509
|
-
var
|
|
5510
|
-
var
|
|
5511
|
-
var
|
|
5512
|
-
var
|
|
5513
|
-
var
|
|
5514
|
-
var
|
|
5515
|
-
var
|
|
5467
|
+
var MHz = 1e6;
|
|
5468
|
+
var FREQ_GPS_L1 = FREQ.G["1"] / MHz;
|
|
5469
|
+
var FREQ_GPS_L2 = FREQ.G["2"] / MHz;
|
|
5470
|
+
var FREQ_GPS_L5 = FREQ.G["5"] / MHz;
|
|
5471
|
+
var FREQ_GLO_L1 = GLO_F1_BASE / MHz;
|
|
5472
|
+
var FREQ_GLO_L2 = GLO_F2_BASE / MHz;
|
|
5473
|
+
var DELTA_GLO_L1 = GLO_F1_STEP / MHz;
|
|
5474
|
+
var DELTA_GLO_L2 = GLO_F2_STEP / MHz;
|
|
5475
|
+
var FREQ_GLO_L1OC = FREQ.R["4"] / MHz;
|
|
5476
|
+
var FREQ_GLO_L2OC = FREQ.R["6"] / MHz;
|
|
5477
|
+
var FREQ_GLO_L3OC = FREQ.R["3"] / MHz;
|
|
5478
|
+
var FREQ_GAL_E1 = FREQ.E["1"] / MHz;
|
|
5479
|
+
var FREQ_GAL_E5 = FREQ.E["8"] / MHz;
|
|
5480
|
+
var FREQ_GAL_E5a = FREQ.E["5"] / MHz;
|
|
5481
|
+
var FREQ_GAL_E5b = FREQ.E["7"] / MHz;
|
|
5482
|
+
var FREQ_GAL_E6 = FREQ.E["6"] / MHz;
|
|
5483
|
+
var FREQ_BDS_B1I = FREQ.C["2"] / MHz;
|
|
5484
|
+
var FREQ_BDS_B2I = FREQ.C["7"] / MHz;
|
|
5485
|
+
var FREQ_BDS_B3I = FREQ.C["6"] / MHz;
|
|
5486
|
+
var FREQ_BDS_B1A = FREQ.C["1"] / MHz;
|
|
5487
|
+
var FREQ_BDS_B1C = FREQ.C["1"] / MHz;
|
|
5488
|
+
var FREQ_BDS_B3A = FREQ.C["6"] / MHz;
|
|
5489
|
+
var FREQ_QZS_L1 = FREQ.J["1"] / MHz;
|
|
5490
|
+
var FREQ_QZS_L2 = FREQ.J["2"] / MHz;
|
|
5491
|
+
var FREQ_QZS_L5 = FREQ.J["5"] / MHz;
|
|
5492
|
+
var FREQ_QZS_L6 = FREQ.J["6"] / MHz;
|
|
5493
|
+
var FREQ_NAVIC_L5 = FREQ.I["5"] / MHz;
|
|
5516
5494
|
var GPS_COLOR = "#4ade80";
|
|
5517
5495
|
var GPS_M_COLOR = "#ef4444";
|
|
5518
5496
|
var GPS_P_COLOR = "#dbc51f";
|
|
@@ -6438,10 +6416,13 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
|
|
|
6438
6416
|
phiBPSK,
|
|
6439
6417
|
rad2deg,
|
|
6440
6418
|
readString,
|
|
6419
|
+
reportDecodeError,
|
|
6441
6420
|
resetGloFreqCache,
|
|
6442
6421
|
rhumbLine,
|
|
6443
6422
|
rtcm3Constellation,
|
|
6444
6423
|
selectEphemeris,
|
|
6424
|
+
setGloFreqNumber,
|
|
6425
|
+
setRtcm3DebugHandler,
|
|
6445
6426
|
systemCmp,
|
|
6446
6427
|
systemName,
|
|
6447
6428
|
updateStationMeta,
|
package/dist/index.d.cts
CHANGED
|
@@ -7,8 +7,8 @@ export { c as clampUnit, e as ecefToGeodetic, g as geodeticToEcef, a as getAer,
|
|
|
7
7
|
export { CrxField, DiffState, EMPTY_WARNINGS, RinexWarning, RinexWarnings, WarningAccumulator, WarningSeverity, crxDecompress, crxRepair, fmtF, hdrLine, padL, padR, parseCrxDataLine, writeRinexNav } from './rinex.cjs';
|
|
8
8
|
export { E as EpochSummary, P as ParseOptions, R as RinexHeader, a as RinexResult, b as RinexStats, S as SYSTEM_ORDER, c as SatObsCallback, p as parseRinexStream, s as systemCmp, d as systemName } from './parser-JPjjFgeP.cjs';
|
|
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
|
-
export { B as BitReader, E as EphemerisInfo, R as
|
|
11
|
-
export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES, SatCn0, SignalCn0, StationMeta, StreamStats, createStationMeta, createStreamStats, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, updateStationMeta, updateStreamStats } from './rtcm3.cjs';
|
|
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
|
+
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
12
|
export { AllPositionsData, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, ecefToAzEl, glonassPosition, keplerPosition, navTimesFromEph, selectEphemeris } from './orbit.cjs';
|
|
13
13
|
export { NtripCaster, NtripConnectionInfo, NtripNetwork, NtripStream, NtripStreamConnection, NtripVersion, Sourcetable, SourcetableEntry, connectToMountpoint, fetchSourcetable, parseSourcetable } from './ntrip.cjs';
|
|
14
14
|
export { CompleteSatSignal, CompleteSignalStats, CompletenessAccumulator, CompletenessResult, CycleSlipAccumulator, CycleSlipEvent, CycleSlipResult, CycleSlipSignalStats, MultipathAccumulator, MultipathPoint, MultipathResult, MultipathSeries, MultipathSignalStat, QualityResult, analyzeQuality } from './analysis.cjs';
|
package/dist/index.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ export { c as clampUnit, e as ecefToGeodetic, g as geodeticToEcef, a as getAer,
|
|
|
7
7
|
export { CrxField, DiffState, EMPTY_WARNINGS, RinexWarning, RinexWarnings, WarningAccumulator, WarningSeverity, crxDecompress, crxRepair, fmtF, hdrLine, padL, padR, parseCrxDataLine, writeRinexNav } from './rinex.js';
|
|
8
8
|
export { E as EpochSummary, P as ParseOptions, R as RinexHeader, a as RinexResult, b as RinexStats, S as SYSTEM_ORDER, c as SatObsCallback, p as parseRinexStream, s as systemCmp, d as systemName } from './parser-JPjjFgeP.js';
|
|
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
|
-
export { B as BitReader, E as EphemerisInfo, R as
|
|
11
|
-
export { MessageTypeStats, MsmEpoch, MsmSatObs, MsmSignal, RTCM3_MESSAGE_NAMES, SatCn0, SignalCn0, StationMeta, StreamStats, createStationMeta, createStreamStats, decodeMsmFull, msmEpochToDate, resetGloFreqCache, rtcm3Constellation, updateStationMeta, updateStreamStats } from './rtcm3.js';
|
|
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
|
+
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
12
|
export { AllPositionsData, DopValues, EpochSkyData, SatAzEl, SatPoint, SatPosition, computeAllPositions, computeDop, computeLiveSkyPositions, computeSatPosition, ecefToAzEl, glonassPosition, keplerPosition, navTimesFromEph, selectEphemeris } from './orbit.js';
|
|
13
13
|
export { NtripCaster, NtripConnectionInfo, NtripNetwork, NtripStream, NtripStreamConnection, NtripVersion, Sourcetable, SourcetableEntry, connectToMountpoint, fetchSourcetable, parseSourcetable } from './ntrip.js';
|
|
14
14
|
export { CompleteSatSignal, CompleteSignalStats, CompletenessAccumulator, CompletenessResult, CycleSlipAccumulator, CycleSlipEvent, CycleSlipResult, CycleSlipSignalStats, MultipathAccumulator, MultipathPoint, MultipathResult, MultipathSeries, MultipathSignalStat, QualityResult, analyzeQuality } from './analysis.js';
|