gnss-js 1.54.0 → 1.56.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/analysis.cjs CHANGED
@@ -557,21 +557,23 @@ var CycleSlipAccumulator = class {
557
557
  dualChecked.add(b2);
558
558
  }
559
559
  }
560
- for (const [band, lm] of phaseM) {
561
- if (dualChecked.has(band)) continue;
562
- const prevLm = prev.phase.get(band);
563
- if (prevLm === void 0) continue;
564
- const cm = codeM.get(band);
565
- const prevCm = prev.code.get(band);
566
- if (cm === void 0 || prevCm === void 0) continue;
567
- const dPhase = lm - prevLm;
568
- const dCode = cm - prevCm;
569
- const jumpM = Math.abs(dPhase - dCode);
570
- const lbl = BAND_LABELS[sys]?.[band] ?? band;
571
- const sigKey = `${sys}:${lbl}`;
572
- this.countEpoch(sigKey);
573
- if (jumpM > SF_THRESHOLD_M) {
574
- this.recordSlip(sigKey, time, prn, lbl, jumpM, /* @__PURE__ */ new Set([band]));
560
+ if (sys !== "S") {
561
+ for (const [band, lm] of phaseM) {
562
+ if (dualChecked.has(band)) continue;
563
+ const prevLm = prev.phase.get(band);
564
+ if (prevLm === void 0) continue;
565
+ const cm = codeM.get(band);
566
+ const prevCm = prev.code.get(band);
567
+ if (cm === void 0 || prevCm === void 0) continue;
568
+ const dPhase = lm - prevLm;
569
+ const dCode = cm - prevCm;
570
+ const jumpM = Math.abs(dPhase - dCode);
571
+ const lbl = BAND_LABELS[sys]?.[band] ?? band;
572
+ const sigKey = `${sys}:${lbl}`;
573
+ this.countEpoch(sigKey);
574
+ if (jumpM > SF_THRESHOLD_M) {
575
+ this.recordSlip(sigKey, time, prn, lbl, jumpM, /* @__PURE__ */ new Set([band]));
576
+ }
575
577
  }
576
578
  }
577
579
  }
package/dist/analysis.js CHANGED
@@ -8,7 +8,7 @@ import {
8
8
  computeIonoRate,
9
9
  detrendIonoArcs,
10
10
  parseSinexBiasDcb
11
- } from "./chunk-Z5UZUNCB.js";
11
+ } from "./chunk-KUSUN7DP.js";
12
12
  import "./chunk-3U5AX7PY.js";
13
13
  import "./chunk-FIEWO4J4.js";
14
14
  export {
@@ -1551,6 +1551,36 @@ var SbasProcessor = class {
1551
1551
  }
1552
1552
  return n;
1553
1553
  }
1554
+ /**
1555
+ * Correction-coverage census at a GPS week/time — a diagnostic funnel over
1556
+ * the current state, explaining how many masked satellites are actually
1557
+ * correctable. Each stage subsumes the requirement of the previous one for a
1558
+ * full range/clock correction: a satellite is `corrected` only when it has
1559
+ * both a fresh fast correction and (for non-SBAS satellites) a fresh
1560
+ * long-term correction (exactly {@link satCorrection}'s gate). `ionoGrid` is
1561
+ * the total number of valid grid points — the additional requirement for the
1562
+ * *iono*-corrected subset a solver forms per pierce point.
1563
+ *
1564
+ * Use it to tell "no corrections applied" (mask empty / products stale) apart
1565
+ * from "corrections applied but the pierce points aren't grid-covered yet".
1566
+ */
1567
+ coverage(week, tow) {
1568
+ const now = gpsSeconds(week, tow);
1569
+ let masked = 0;
1570
+ let fast = 0;
1571
+ let long = 0;
1572
+ let corrected = 0;
1573
+ for (const s of this.sats) {
1574
+ if (!s.prn) continue;
1575
+ masked++;
1576
+ if (s.fcorr && s.fcorr.t0s !== 0 && s.fcorr.udre < 15 && Math.abs(now - s.fcorr.t0s + this.tlat) <= MAXSBSAGEF)
1577
+ fast++;
1578
+ if (s.prn[0] === "S" || s.lcorr && s.lcorr.t0s !== 0 && Math.abs(now - s.lcorr.t0s) <= MAXSBSAGEL)
1579
+ long++;
1580
+ if (this.satCorrection(s.prn, week, tow)) corrected++;
1581
+ }
1582
+ return { masked, fast, long, corrected, ionoGrid: this.ionoGridPoints() };
1583
+ }
1554
1584
  /**
1555
1585
  * Satellite range/clock correction for a PRN at a GPS week/tow, or null if
1556
1586
  * no valid (unexpired) long-term + fast correction is available. Add `dPos`
@@ -352,21 +352,23 @@ var CycleSlipAccumulator = class {
352
352
  dualChecked.add(b2);
353
353
  }
354
354
  }
355
- for (const [band, lm] of phaseM) {
356
- if (dualChecked.has(band)) continue;
357
- const prevLm = prev.phase.get(band);
358
- if (prevLm === void 0) continue;
359
- const cm = codeM.get(band);
360
- const prevCm = prev.code.get(band);
361
- if (cm === void 0 || prevCm === void 0) continue;
362
- const dPhase = lm - prevLm;
363
- const dCode = cm - prevCm;
364
- const jumpM = Math.abs(dPhase - dCode);
365
- const lbl = BAND_LABELS[sys]?.[band] ?? band;
366
- const sigKey = `${sys}:${lbl}`;
367
- this.countEpoch(sigKey);
368
- if (jumpM > SF_THRESHOLD_M) {
369
- this.recordSlip(sigKey, time, prn, lbl, jumpM, /* @__PURE__ */ new Set([band]));
355
+ if (sys !== "S") {
356
+ for (const [band, lm] of phaseM) {
357
+ if (dualChecked.has(band)) continue;
358
+ const prevLm = prev.phase.get(band);
359
+ if (prevLm === void 0) continue;
360
+ const cm = codeM.get(band);
361
+ const prevCm = prev.code.get(band);
362
+ if (cm === void 0 || prevCm === void 0) continue;
363
+ const dPhase = lm - prevLm;
364
+ const dCode = cm - prevCm;
365
+ const jumpM = Math.abs(dPhase - dCode);
366
+ const lbl = BAND_LABELS[sys]?.[band] ?? band;
367
+ const sigKey = `${sys}:${lbl}`;
368
+ this.countEpoch(sigKey);
369
+ if (jumpM > SF_THRESHOLD_M) {
370
+ this.recordSlip(sigKey, time, prn, lbl, jumpM, /* @__PURE__ */ new Set([band]));
371
+ }
370
372
  }
371
373
  }
372
374
  }
package/dist/index.cjs CHANGED
@@ -13637,6 +13637,36 @@ var SbasProcessor = class {
13637
13637
  }
13638
13638
  return n;
13639
13639
  }
13640
+ /**
13641
+ * Correction-coverage census at a GPS week/time — a diagnostic funnel over
13642
+ * the current state, explaining how many masked satellites are actually
13643
+ * correctable. Each stage subsumes the requirement of the previous one for a
13644
+ * full range/clock correction: a satellite is `corrected` only when it has
13645
+ * both a fresh fast correction and (for non-SBAS satellites) a fresh
13646
+ * long-term correction (exactly {@link satCorrection}'s gate). `ionoGrid` is
13647
+ * the total number of valid grid points — the additional requirement for the
13648
+ * *iono*-corrected subset a solver forms per pierce point.
13649
+ *
13650
+ * Use it to tell "no corrections applied" (mask empty / products stale) apart
13651
+ * from "corrections applied but the pierce points aren't grid-covered yet".
13652
+ */
13653
+ coverage(week, tow) {
13654
+ const now = gpsSeconds(week, tow);
13655
+ let masked = 0;
13656
+ let fast = 0;
13657
+ let long = 0;
13658
+ let corrected = 0;
13659
+ for (const s of this.sats) {
13660
+ if (!s.prn) continue;
13661
+ masked++;
13662
+ if (s.fcorr && s.fcorr.t0s !== 0 && s.fcorr.udre < 15 && Math.abs(now - s.fcorr.t0s + this.tlat) <= MAXSBSAGEF)
13663
+ fast++;
13664
+ if (s.prn[0] === "S" || s.lcorr && s.lcorr.t0s !== 0 && Math.abs(now - s.lcorr.t0s) <= MAXSBSAGEL)
13665
+ long++;
13666
+ if (this.satCorrection(s.prn, week, tow)) corrected++;
13667
+ }
13668
+ return { masked, fast, long, corrected, ionoGrid: this.ionoGridPoints() };
13669
+ }
13640
13670
  /**
13641
13671
  * Satellite range/clock correction for a PRN at a GPS week/tow, or null if
13642
13672
  * no valid (unexpired) long-term + fast correction is available. Add `dPos`
@@ -15913,21 +15943,23 @@ var CycleSlipAccumulator = class {
15913
15943
  dualChecked.add(b2);
15914
15944
  }
15915
15945
  }
15916
- for (const [band, lm] of phaseM) {
15917
- if (dualChecked.has(band)) continue;
15918
- const prevLm = prev.phase.get(band);
15919
- if (prevLm === void 0) continue;
15920
- const cm = codeM.get(band);
15921
- const prevCm = prev.code.get(band);
15922
- if (cm === void 0 || prevCm === void 0) continue;
15923
- const dPhase = lm - prevLm;
15924
- const dCode = cm - prevCm;
15925
- const jumpM = Math.abs(dPhase - dCode);
15926
- const lbl = BAND_LABELS[sys]?.[band] ?? band;
15927
- const sigKey = `${sys}:${lbl}`;
15928
- this.countEpoch(sigKey);
15929
- if (jumpM > SF_THRESHOLD_M) {
15930
- this.recordSlip(sigKey, time, prn, lbl, jumpM, /* @__PURE__ */ new Set([band]));
15946
+ if (sys !== "S") {
15947
+ for (const [band, lm] of phaseM) {
15948
+ if (dualChecked.has(band)) continue;
15949
+ const prevLm = prev.phase.get(band);
15950
+ if (prevLm === void 0) continue;
15951
+ const cm = codeM.get(band);
15952
+ const prevCm = prev.code.get(band);
15953
+ if (cm === void 0 || prevCm === void 0) continue;
15954
+ const dPhase = lm - prevLm;
15955
+ const dCode = cm - prevCm;
15956
+ const jumpM = Math.abs(dPhase - dCode);
15957
+ const lbl = BAND_LABELS[sys]?.[band] ?? band;
15958
+ const sigKey = `${sys}:${lbl}`;
15959
+ this.countEpoch(sigKey);
15960
+ if (jumpM > SF_THRESHOLD_M) {
15961
+ this.recordSlip(sigKey, time, prn, lbl, jumpM, /* @__PURE__ */ new Set([band]));
15962
+ }
15931
15963
  }
15932
15964
  }
15933
15965
  }
package/dist/index.js CHANGED
@@ -109,7 +109,7 @@ import {
109
109
  computeIonoRate,
110
110
  detrendIonoArcs,
111
111
  parseSinexBiasDcb
112
- } from "./chunk-Z5UZUNCB.js";
112
+ } from "./chunk-KUSUN7DP.js";
113
113
  import {
114
114
  Scale,
115
115
  getDateFromDayOfWeek,
@@ -168,7 +168,7 @@ import {
168
168
  sunEcef,
169
169
  toRtkEpoch,
170
170
  wlWavelength
171
- } from "./chunk-U32IU7RO.js";
171
+ } from "./chunk-BU6YC6VK.js";
172
172
  import "./chunk-WQX354KD.js";
173
173
  import {
174
174
  almanacEpochMs,
@@ -2025,6 +2025,36 @@ var SbasProcessor = class {
2025
2025
  }
2026
2026
  return n;
2027
2027
  }
2028
+ /**
2029
+ * Correction-coverage census at a GPS week/time — a diagnostic funnel over
2030
+ * the current state, explaining how many masked satellites are actually
2031
+ * correctable. Each stage subsumes the requirement of the previous one for a
2032
+ * full range/clock correction: a satellite is `corrected` only when it has
2033
+ * both a fresh fast correction and (for non-SBAS satellites) a fresh
2034
+ * long-term correction (exactly {@link satCorrection}'s gate). `ionoGrid` is
2035
+ * the total number of valid grid points — the additional requirement for the
2036
+ * *iono*-corrected subset a solver forms per pierce point.
2037
+ *
2038
+ * Use it to tell "no corrections applied" (mask empty / products stale) apart
2039
+ * from "corrections applied but the pierce points aren't grid-covered yet".
2040
+ */
2041
+ coverage(week, tow) {
2042
+ const now = gpsSeconds(week, tow);
2043
+ let masked = 0;
2044
+ let fast = 0;
2045
+ let long = 0;
2046
+ let corrected = 0;
2047
+ for (const s of this.sats) {
2048
+ if (!s.prn) continue;
2049
+ masked++;
2050
+ if (s.fcorr && s.fcorr.t0s !== 0 && s.fcorr.udre < 15 && Math.abs(now - s.fcorr.t0s + this.tlat) <= MAXSBSAGEF)
2051
+ fast++;
2052
+ if (s.prn[0] === "S" || s.lcorr && s.lcorr.t0s !== 0 && Math.abs(now - s.lcorr.t0s) <= MAXSBSAGEL)
2053
+ long++;
2054
+ if (this.satCorrection(s.prn, week, tow)) corrected++;
2055
+ }
2056
+ return { masked, fast, long, corrected, ionoGrid: this.ionoGridPoints() };
2057
+ }
2028
2058
  /**
2029
2059
  * Satellite range/clock correction for a PRN at a GPS week/tow, or null if
2030
2060
  * no valid (unexpired) long-term + fast correction is available. Add `dPos`
@@ -598,6 +598,26 @@ declare class SbasProcessor {
598
598
  activeSats(): string[];
599
599
  /** Number of ionospheric grid points with a valid delay across all bands. */
600
600
  ionoGridPoints(): number;
601
+ /**
602
+ * Correction-coverage census at a GPS week/time — a diagnostic funnel over
603
+ * the current state, explaining how many masked satellites are actually
604
+ * correctable. Each stage subsumes the requirement of the previous one for a
605
+ * full range/clock correction: a satellite is `corrected` only when it has
606
+ * both a fresh fast correction and (for non-SBAS satellites) a fresh
607
+ * long-term correction (exactly {@link satCorrection}'s gate). `ionoGrid` is
608
+ * the total number of valid grid points — the additional requirement for the
609
+ * *iono*-corrected subset a solver forms per pierce point.
610
+ *
611
+ * Use it to tell "no corrections applied" (mask empty / products stale) apart
612
+ * from "corrections applied but the pierce points aren't grid-covered yet".
613
+ */
614
+ coverage(week: number, tow: number): {
615
+ masked: number;
616
+ fast: number;
617
+ long: number;
618
+ corrected: number;
619
+ ionoGrid: number;
620
+ };
601
621
  /**
602
622
  * Satellite range/clock correction for a PRN at a GPS week/tow, or null if
603
623
  * no valid (unexpired) long-term + fast correction is available. Add `dPos`
@@ -598,6 +598,26 @@ declare class SbasProcessor {
598
598
  activeSats(): string[];
599
599
  /** Number of ionospheric grid points with a valid delay across all bands. */
600
600
  ionoGridPoints(): number;
601
+ /**
602
+ * Correction-coverage census at a GPS week/time — a diagnostic funnel over
603
+ * the current state, explaining how many masked satellites are actually
604
+ * correctable. Each stage subsumes the requirement of the previous one for a
605
+ * full range/clock correction: a satellite is `corrected` only when it has
606
+ * both a fresh fast correction and (for non-SBAS satellites) a fresh
607
+ * long-term correction (exactly {@link satCorrection}'s gate). `ionoGrid` is
608
+ * the total number of valid grid points — the additional requirement for the
609
+ * *iono*-corrected subset a solver forms per pierce point.
610
+ *
611
+ * Use it to tell "no corrections applied" (mask empty / products stale) apart
612
+ * from "corrections applied but the pierce points aren't grid-covered yet".
613
+ */
614
+ coverage(week: number, tow: number): {
615
+ masked: number;
616
+ fast: number;
617
+ long: number;
618
+ corrected: number;
619
+ ionoGrid: number;
620
+ };
601
621
  /**
602
622
  * Satellite range/clock correction for a PRN at a GPS week/tow, or null if
603
623
  * no valid (unexpired) long-term + fast correction is available. Add `dPos`
@@ -30,7 +30,7 @@ import {
30
30
  sunEcef,
31
31
  toRtkEpoch,
32
32
  wlWavelength
33
- } from "./chunk-U32IU7RO.js";
33
+ } from "./chunk-BU6YC6VK.js";
34
34
  import "./chunk-WQX354KD.js";
35
35
  import "./chunk-MHGNKSSH.js";
36
36
  import "./chunk-MIIM4LDY.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gnss-js",
3
- "version": "1.54.0",
3
+ "version": "1.56.0",
4
4
  "description": "Comprehensive GNSS library for JavaScript — time scales, coordinates, RINEX parsing, RTCM3 decoding, orbit computation, and signal analysis",
5
5
  "type": "module",
6
6
  "sideEffects": false,