gnss-js 1.57.0 → 1.58.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.
@@ -1270,6 +1270,17 @@ var DEGF = [
1270
1270
  58e-4
1271
1271
  ];
1272
1272
  var degfcorr = (ai) => ai > 0 && ai <= 15 ? DEGF[ai] : 58e-4;
1273
+ function sbasLongTermDeg(d, vel, ageSec) {
1274
+ if (vel) {
1275
+ if (ageSec > 0 && ageSec < d.iltcV1) return 0;
1276
+ return d.cltcLsb + d.cltcV1 * Math.max(0, -ageSec, ageSec - d.iltcV1);
1277
+ }
1278
+ return d.cltcV0 * Math.floor(Math.abs(ageSec) / d.iltcV0);
1279
+ }
1280
+ function sbasIonoDeg(d, ageSec) {
1281
+ const dt = Math.abs(ageSec);
1282
+ return d.cionoStep * Math.floor(dt / d.iiono) + d.cionoRamp * dt;
1283
+ }
1273
1284
  var x1 = [-75, -65, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75, 85];
1274
1285
  var x2 = [-55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
1275
1286
  var x3 = [-75, -65, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75];
@@ -1323,6 +1334,7 @@ var SbasProcessor = class {
1323
1334
  satIdx = /* @__PURE__ */ new Map();
1324
1335
  iodp = -1;
1325
1336
  tlat = 0;
1337
+ degr = null;
1326
1338
  ion = [];
1327
1339
  /** GEO PRN(s) whose messages have been ingested. */
1328
1340
  geoPrns = /* @__PURE__ */ new Set();
@@ -1349,6 +1361,8 @@ var SbasProcessor = class {
1349
1361
  return this.decodeIntegrity(msg) ? type : -1;
1350
1362
  case 7:
1351
1363
  return this.decodeDegradation(msg) ? type : -1;
1364
+ case 10:
1365
+ return this.decodeMt10(msg) ? type : -1;
1352
1366
  case 18:
1353
1367
  return this.decodeIgpMask(msg) ? type : -1;
1354
1368
  case 24:
@@ -1417,6 +1431,30 @@ var SbasProcessor = class {
1417
1431
  }
1418
1432
  return true;
1419
1433
  }
1434
+ /** MT10 degradation factors (DO-229D Table A-9). Fields follow the 8-bit
1435
+ * preamble + 6-bit type (start bit 14), MSB-first, with the listed LSBs.
1436
+ * Iiono / Iltc_v0 of 0 must be read as 1 (Table A-9, Note 3). */
1437
+ decodeMt10(msg) {
1438
+ const u = (p, n) => getBitU(msg, p, n);
1439
+ this.degr = {
1440
+ brrc: u(14, 10) * 2e-3,
1441
+ cltcLsb: u(24, 10) * 2e-3,
1442
+ cltcV1: u(34, 10) * 5e-5,
1443
+ iltcV1: u(44, 9),
1444
+ cltcV0: u(53, 10) * 2e-3,
1445
+ iltcV0: u(63, 9) || 1,
1446
+ cgeoLsb: u(72, 10) * 5e-4,
1447
+ cgeoV: u(82, 10) * 5e-5,
1448
+ igeo: u(92, 9),
1449
+ cer: u(101, 6) * 0.5,
1450
+ cionoStep: u(107, 10) * 1e-3,
1451
+ iiono: u(117, 9) || 1,
1452
+ cionoRamp: u(126, 10) * 5e-6,
1453
+ rssUdre: u(136, 1) === 1,
1454
+ rssIono: u(137, 1) === 1
1455
+ };
1456
+ return true;
1457
+ }
1420
1458
  decodeMixed(msg, week, tow) {
1421
1459
  if (this.iodp !== getBitU(msg, 110, 2)) return false;
1422
1460
  const blk = getBitU(msg, 112, 2);
@@ -1463,7 +1501,8 @@ var SbasProcessor = class {
1463
1501
  dvel: [0, 0, 0],
1464
1502
  daf0: getBitS(msg, p + 41, 10) * P2_31,
1465
1503
  daf1: 0,
1466
- t0s: gpsSeconds(week, tow)
1504
+ t0s: gpsSeconds(week, tow),
1505
+ vel: false
1467
1506
  };
1468
1507
  return true;
1469
1508
  }
@@ -1487,7 +1526,8 @@ var SbasProcessor = class {
1487
1526
  ],
1488
1527
  daf0: getBitS(msg, p + 47, 11) * P2_31,
1489
1528
  daf1: getBitS(msg, p + 82, 8) * P2_39,
1490
- t0s: gpsSeconds(week, tow + t)
1529
+ t0s: gpsSeconds(week, tow + t),
1530
+ vel: true
1491
1531
  };
1492
1532
  return true;
1493
1533
  }
@@ -1608,9 +1648,16 @@ var SbasProcessor = class {
1608
1648
  const tf = now - s.fcorr.t0s + this.tlat;
1609
1649
  if (Math.abs(tf) > MAXSBSAGEF || s.fcorr.udre >= 15) return null;
1610
1650
  const prc = s.fcorr.prc;
1611
- const varM2 = varfcorr(s.fcorr.udre) + degfcorr(s.fcorr.ai) * tf * tf / 2;
1651
+ const sigUdre = Math.sqrt(varfcorr(s.fcorr.udre));
1652
+ const efc = degfcorr(s.fcorr.ai) * tf * tf / 2;
1653
+ const eltc = this.degr && s.lcorr && s.lcorr.t0s !== 0 ? sbasLongTermDeg(this.degr, s.lcorr.vel, now - s.lcorr.t0s) : 0;
1654
+ const varM2 = this.degr?.rssUdre ? sigUdre * sigUdre + efc * efc + eltc * eltc : (sigUdre + efc + eltc) ** 2;
1612
1655
  return { dPos: drs, dClkS: dclk + prc / C_LIGHT, prcM: prc, varM2, iode };
1613
1656
  }
1657
+ /** The last-decoded MT10 degradation factors, or null if none seen. */
1658
+ get degradation() {
1659
+ return this.degr;
1660
+ }
1614
1661
  /**
1615
1662
  * Slant L1 ionospheric delay (m) at the pierce point for a receiver geodetic
1616
1663
  * position (lat/lon rad, height m) and a satellite az/el (rad), interpolated
@@ -1659,14 +1706,18 @@ var SbasProcessor = class {
1659
1706
  } else return null;
1660
1707
  const now = gpsSeconds(week, tow);
1661
1708
  let delay = 0;
1662
- let varM2 = 0;
1709
+ let varVert = 0;
1663
1710
  for (let i = 0; i < 4; i++) {
1664
1711
  const g = pts[i];
1665
1712
  if (!g) continue;
1666
1713
  delay += w[i] * g.delay;
1667
- varM2 += w[i] * varicorr(g.give) * 9e-8 * Math.abs(now - g.t0s);
1714
+ const sigGive = Math.sqrt(varicorr(g.give));
1715
+ const d = this.degr;
1716
+ const eiono = d ? sbasIonoDeg(d, now - g.t0s) : 0;
1717
+ const sig2 = d?.rssIono ? sigGive * sigGive + eiono * eiono : (sigGive + eiono) ** 2;
1718
+ varVert += w[i] * sig2;
1668
1719
  }
1669
- return { delayM: delay * fp, varM2: varM2 * fp * fp };
1720
+ return { delayM: delay * fp, varM2: varVert * fp * fp };
1670
1721
  }
1671
1722
  /** Find the four IGPs bracketing a pierce point (RTKLIB `searchigp`). */
1672
1723
  searchIgp(latP, lonP) {
@@ -3081,10 +3132,10 @@ function sagnac2(pos, travelTimeS) {
3081
3132
  function sbasAirTropoVar(elRad) {
3082
3133
  const elDeg = elRad * 180 / Math.PI;
3083
3134
  const sigMp = 0.13 + 0.53 * Math.exp(-elDeg / 10);
3084
- const sigNoise = 0.15 + 0.43 * Math.exp(-elDeg / 6.9);
3135
+ const NOISE_DIVG_AADA = 0.36;
3085
3136
  const m = 1.001 / Math.sqrt(2001e-6 + Math.sin(elRad) * Math.sin(elRad));
3086
3137
  const sigTropo = 0.12 * m;
3087
- return sigMp * sigMp + sigNoise * sigNoise + sigTropo * sigTropo;
3138
+ return sigMp * sigMp + NOISE_DIVG_AADA * NOISE_DIVG_AADA + sigTropo * sigTropo;
3088
3139
  }
3089
3140
  function invertMatrix(A) {
3090
3141
  const n = A.length;
@@ -3380,6 +3431,8 @@ export {
3380
3431
  solveDgnss,
3381
3432
  RtkFloatEngine,
3382
3433
  postProcessRtk,
3434
+ sbasLongTermDeg,
3435
+ sbasIonoDeg,
3383
3436
  SbasProcessor,
3384
3437
  niellMapping,
3385
3438
  gmst,
package/dist/index.cjs CHANGED
@@ -303,8 +303,10 @@ __export(src_exports, {
303
303
  rhumbLine: () => rhumbLine,
304
304
  rtcm3Constellation: () => rtcm3Constellation,
305
305
  satClockCorrection: () => satClockCorrection,
306
+ sbasIonoDeg: () => sbasIonoDeg,
306
307
  sbasL5MessageName: () => sbasL5MessageName,
307
308
  sbasL5MessageType: () => sbasL5MessageType,
309
+ sbasLongTermDeg: () => sbasLongTermDeg,
308
310
  sbasProtectionLevels: () => sbasProtectionLevels,
309
311
  sbfCrc16: () => crc16,
310
312
  scanSbfFrames: () => scanSbfFrames,
@@ -13478,6 +13480,17 @@ var DEGF = [
13478
13480
  58e-4
13479
13481
  ];
13480
13482
  var degfcorr = (ai) => ai > 0 && ai <= 15 ? DEGF[ai] : 58e-4;
13483
+ function sbasLongTermDeg(d, vel, ageSec) {
13484
+ if (vel) {
13485
+ if (ageSec > 0 && ageSec < d.iltcV1) return 0;
13486
+ return d.cltcLsb + d.cltcV1 * Math.max(0, -ageSec, ageSec - d.iltcV1);
13487
+ }
13488
+ return d.cltcV0 * Math.floor(Math.abs(ageSec) / d.iltcV0);
13489
+ }
13490
+ function sbasIonoDeg(d, ageSec) {
13491
+ const dt = Math.abs(ageSec);
13492
+ return d.cionoStep * Math.floor(dt / d.iiono) + d.cionoRamp * dt;
13493
+ }
13481
13494
  var x1 = [-75, -65, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75, 85];
13482
13495
  var x2 = [-55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
13483
13496
  var x3 = [-75, -65, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75];
@@ -13531,6 +13544,7 @@ var SbasProcessor = class {
13531
13544
  satIdx = /* @__PURE__ */ new Map();
13532
13545
  iodp = -1;
13533
13546
  tlat = 0;
13547
+ degr = null;
13534
13548
  ion = [];
13535
13549
  /** GEO PRN(s) whose messages have been ingested. */
13536
13550
  geoPrns = /* @__PURE__ */ new Set();
@@ -13557,6 +13571,8 @@ var SbasProcessor = class {
13557
13571
  return this.decodeIntegrity(msg) ? type : -1;
13558
13572
  case 7:
13559
13573
  return this.decodeDegradation(msg) ? type : -1;
13574
+ case 10:
13575
+ return this.decodeMt10(msg) ? type : -1;
13560
13576
  case 18:
13561
13577
  return this.decodeIgpMask(msg) ? type : -1;
13562
13578
  case 24:
@@ -13625,6 +13641,30 @@ var SbasProcessor = class {
13625
13641
  }
13626
13642
  return true;
13627
13643
  }
13644
+ /** MT10 degradation factors (DO-229D Table A-9). Fields follow the 8-bit
13645
+ * preamble + 6-bit type (start bit 14), MSB-first, with the listed LSBs.
13646
+ * Iiono / Iltc_v0 of 0 must be read as 1 (Table A-9, Note 3). */
13647
+ decodeMt10(msg) {
13648
+ const u = (p, n) => getBitU(msg, p, n);
13649
+ this.degr = {
13650
+ brrc: u(14, 10) * 2e-3,
13651
+ cltcLsb: u(24, 10) * 2e-3,
13652
+ cltcV1: u(34, 10) * 5e-5,
13653
+ iltcV1: u(44, 9),
13654
+ cltcV0: u(53, 10) * 2e-3,
13655
+ iltcV0: u(63, 9) || 1,
13656
+ cgeoLsb: u(72, 10) * 5e-4,
13657
+ cgeoV: u(82, 10) * 5e-5,
13658
+ igeo: u(92, 9),
13659
+ cer: u(101, 6) * 0.5,
13660
+ cionoStep: u(107, 10) * 1e-3,
13661
+ iiono: u(117, 9) || 1,
13662
+ cionoRamp: u(126, 10) * 5e-6,
13663
+ rssUdre: u(136, 1) === 1,
13664
+ rssIono: u(137, 1) === 1
13665
+ };
13666
+ return true;
13667
+ }
13628
13668
  decodeMixed(msg, week, tow) {
13629
13669
  if (this.iodp !== getBitU(msg, 110, 2)) return false;
13630
13670
  const blk = getBitU(msg, 112, 2);
@@ -13671,7 +13711,8 @@ var SbasProcessor = class {
13671
13711
  dvel: [0, 0, 0],
13672
13712
  daf0: getBitS(msg, p + 41, 10) * P2_31,
13673
13713
  daf1: 0,
13674
- t0s: gpsSeconds(week, tow)
13714
+ t0s: gpsSeconds(week, tow),
13715
+ vel: false
13675
13716
  };
13676
13717
  return true;
13677
13718
  }
@@ -13695,7 +13736,8 @@ var SbasProcessor = class {
13695
13736
  ],
13696
13737
  daf0: getBitS(msg, p + 47, 11) * P2_31,
13697
13738
  daf1: getBitS(msg, p + 82, 8) * P2_39,
13698
- t0s: gpsSeconds(week, tow + t)
13739
+ t0s: gpsSeconds(week, tow + t),
13740
+ vel: true
13699
13741
  };
13700
13742
  return true;
13701
13743
  }
@@ -13816,9 +13858,16 @@ var SbasProcessor = class {
13816
13858
  const tf = now - s.fcorr.t0s + this.tlat;
13817
13859
  if (Math.abs(tf) > MAXSBSAGEF || s.fcorr.udre >= 15) return null;
13818
13860
  const prc = s.fcorr.prc;
13819
- const varM2 = varfcorr(s.fcorr.udre) + degfcorr(s.fcorr.ai) * tf * tf / 2;
13861
+ const sigUdre = Math.sqrt(varfcorr(s.fcorr.udre));
13862
+ const efc = degfcorr(s.fcorr.ai) * tf * tf / 2;
13863
+ const eltc = this.degr && s.lcorr && s.lcorr.t0s !== 0 ? sbasLongTermDeg(this.degr, s.lcorr.vel, now - s.lcorr.t0s) : 0;
13864
+ const varM2 = this.degr?.rssUdre ? sigUdre * sigUdre + efc * efc + eltc * eltc : (sigUdre + efc + eltc) ** 2;
13820
13865
  return { dPos: drs, dClkS: dclk + prc / C_LIGHT, prcM: prc, varM2, iode };
13821
13866
  }
13867
+ /** The last-decoded MT10 degradation factors, or null if none seen. */
13868
+ get degradation() {
13869
+ return this.degr;
13870
+ }
13822
13871
  /**
13823
13872
  * Slant L1 ionospheric delay (m) at the pierce point for a receiver geodetic
13824
13873
  * position (lat/lon rad, height m) and a satellite az/el (rad), interpolated
@@ -13867,14 +13916,18 @@ var SbasProcessor = class {
13867
13916
  } else return null;
13868
13917
  const now = gpsSeconds(week, tow);
13869
13918
  let delay = 0;
13870
- let varM2 = 0;
13919
+ let varVert = 0;
13871
13920
  for (let i = 0; i < 4; i++) {
13872
13921
  const g = pts[i];
13873
13922
  if (!g) continue;
13874
13923
  delay += w[i] * g.delay;
13875
- varM2 += w[i] * varicorr(g.give) * 9e-8 * Math.abs(now - g.t0s);
13924
+ const sigGive = Math.sqrt(varicorr(g.give));
13925
+ const d = this.degr;
13926
+ const eiono = d ? sbasIonoDeg(d, now - g.t0s) : 0;
13927
+ const sig2 = d?.rssIono ? sigGive * sigGive + eiono * eiono : (sigGive + eiono) ** 2;
13928
+ varVert += w[i] * sig2;
13876
13929
  }
13877
- return { delayM: delay * fp, varM2: varM2 * fp * fp };
13930
+ return { delayM: delay * fp, varM2: varVert * fp * fp };
13878
13931
  }
13879
13932
  /** Find the four IGPs bracketing a pierce point (RTKLIB `searchigp`). */
13880
13933
  searchIgp(latP, lonP) {
@@ -15289,10 +15342,10 @@ function sagnac2(pos, travelTimeS) {
15289
15342
  function sbasAirTropoVar(elRad) {
15290
15343
  const elDeg = elRad * 180 / Math.PI;
15291
15344
  const sigMp = 0.13 + 0.53 * Math.exp(-elDeg / 10);
15292
- const sigNoise = 0.15 + 0.43 * Math.exp(-elDeg / 6.9);
15345
+ const NOISE_DIVG_AADA = 0.36;
15293
15346
  const m = 1.001 / Math.sqrt(2001e-6 + Math.sin(elRad) * Math.sin(elRad));
15294
15347
  const sigTropo = 0.12 * m;
15295
- return sigMp * sigMp + sigNoise * sigNoise + sigTropo * sigTropo;
15348
+ return sigMp * sigMp + NOISE_DIVG_AADA * NOISE_DIVG_AADA + sigTropo * sigTropo;
15296
15349
  }
15297
15350
  function invertMatrix(A) {
15298
15351
  const n = A.length;
@@ -18122,8 +18175,10 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
18122
18175
  rhumbLine,
18123
18176
  rtcm3Constellation,
18124
18177
  satClockCorrection,
18178
+ sbasIonoDeg,
18125
18179
  sbasL5MessageName,
18126
18180
  sbasL5MessageType,
18181
+ sbasLongTermDeg,
18127
18182
  sbasProtectionLevels,
18128
18183
  sbfCrc16,
18129
18184
  scanSbfFrames,
package/dist/index.d.cts CHANGED
@@ -18,7 +18,7 @@ export { TrimbleEpoch, TrimbleFrame, TrimbleMeasurement, TrimbleNavResult, Trimb
18
18
  export { BinexEpoch, BinexMeasurement, BinexParseResult, BinexRecord, binexCrc16, binexCrc32, binexCsum8, binexRecords, decodeBinexEph, getBnxi, parseBinex } from './binex.cjs';
19
19
  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';
20
20
  export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.cjs';
21
- export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SbasCorrectionSource, SbasIonoDelay, SbasProcessor, SbasSatCorrection, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.cjs';
21
+ export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, Degradation, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SbasCorrectionSource, SbasIonoDelay, SbasProcessor, SbasSatCorrection, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasIonoDeg, sbasLongTermDeg, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.cjs';
22
22
  export { NtripCaster, NtripConnectionInfo, NtripNetwork, NtripStream, NtripStreamConnection, NtripVersion, Sourcetable, SourcetableEntry, connectToMountpoint, fetchSourcetable, parseSourcetable } from './ntrip.cjs';
23
23
  export { CompleteSatSignal, CompleteSignalStats, CompletenessAccumulator, CompletenessResult, CycleSlipAccumulator, CycleSlipEvent, CycleSlipResult, CycleSlipSignalStats, IonoAccumulator, IonoDcbResult, IonoPoint, IonoRatePoint, IonoRateSeries, IonoResult, IonoSeries, MultipathAccumulator, MultipathPoint, MultipathResult, MultipathSeries, MultipathSignalStat, QualityResult, SatDcbMap, analyzeQuality, applyIonoDcb, computeIonoRate, detrendIonoArcs, parseSinexBiasDcb } from './analysis.cjs';
24
24
  export { AntennaEntry, AntexFile, FrequencyData, frequencyLabel, parseAntex } from './antex.cjs';
package/dist/index.d.ts CHANGED
@@ -18,7 +18,7 @@ export { TrimbleEpoch, TrimbleFrame, TrimbleMeasurement, TrimbleNavResult, Trimb
18
18
  export { BinexEpoch, BinexMeasurement, BinexParseResult, BinexRecord, binexCrc16, binexCrc32, binexCsum8, binexRecords, decodeBinexEph, getBnxi, parseBinex } from './binex.js';
19
19
  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';
20
20
  export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.js';
21
- export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SbasCorrectionSource, SbasIonoDelay, SbasProcessor, SbasSatCorrection, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.js';
21
+ export { AntennaOffset, ArFixedSat, ArOptions, ArResult, ArSat, CorrectionResult, Degradation, DgnssOptions, DgnssSolution, EphemerisSource, FixedPositionResult, IONO_L1_M_PER_TECU, KlobucharCoeffs, LambdaResult, NetworkFcbResult, NetworkFcbSummary, NlArc, NlFcbResult, PppAntennaModel, PppArc, PppCorrectionConfig, PppCorrections, PppEpoch, PppEpochContext, PppEpochResult, PppFixState, PppOptions, PppSatObs, PppSolution, RawObservation, RtkEpochMeasurements, RtkFloatEngine, RtkFloatOptions, RtkFloatSolution, RtkMeasurement, RtkObsEpoch, RtkObsInput, RtkPostProcessOptions, RtkPostProcessResult, RtkTrackPoint, SatGeom, SbasCorrectionSource, SbasIonoDelay, SbasProcessor, SbasSatCorrection, SppOptions, SppSolution, TropoMapping, WlArc, WlFcbOptions, WlFcbResult, WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasIonoDeg, sbasLongTermDeg, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength } from './positioning.js';
22
22
  export { NtripCaster, NtripConnectionInfo, NtripNetwork, NtripStream, NtripStreamConnection, NtripVersion, Sourcetable, SourcetableEntry, connectToMountpoint, fetchSourcetable, parseSourcetable } from './ntrip.js';
23
23
  export { CompleteSatSignal, CompleteSignalStats, CompletenessAccumulator, CompletenessResult, CycleSlipAccumulator, CycleSlipEvent, CycleSlipResult, CycleSlipSignalStats, IonoAccumulator, IonoDcbResult, IonoPoint, IonoRatePoint, IonoRateSeries, IonoResult, IonoSeries, MultipathAccumulator, MultipathPoint, MultipathResult, MultipathSeries, MultipathSignalStat, QualityResult, SatDcbMap, analyzeQuality, applyIonoDcb, computeIonoRate, detrendIonoArcs, parseSinexBiasDcb } from './analysis.js';
24
24
  export { AntennaEntry, AntexFile, FrequencyData, frequencyLabel, parseAntex } from './antex.js';
package/dist/index.js CHANGED
@@ -168,6 +168,8 @@ import {
168
168
  postProcessRtk,
169
169
  resolvePppAmbiguities,
170
170
  satClockCorrection,
171
+ sbasIonoDeg,
172
+ sbasLongTermDeg,
171
173
  sbasProtectionLevels,
172
174
  solidEarthTide,
173
175
  solveDgnss,
@@ -176,7 +178,7 @@ import {
176
178
  sunEcef,
177
179
  toRtkEpoch,
178
180
  wlWavelength
179
- } from "./chunk-BU6YC6VK.js";
181
+ } from "./chunk-SWVIBUHS.js";
180
182
  import "./chunk-WQX354KD.js";
181
183
  import {
182
184
  almanacEpochMs,
@@ -651,8 +653,10 @@ export {
651
653
  rhumbLine,
652
654
  rtcm3Constellation,
653
655
  satClockCorrection,
656
+ sbasIonoDeg,
654
657
  sbasL5MessageName,
655
658
  sbasL5MessageType,
659
+ sbasLongTermDeg,
656
660
  sbasProtectionLevels,
657
661
  crc16 as sbfCrc16,
658
662
  scanSbfFrames,
@@ -43,6 +43,8 @@ __export(positioning_exports, {
43
43
  postProcessRtk: () => postProcessRtk,
44
44
  resolvePppAmbiguities: () => resolvePppAmbiguities,
45
45
  satClockCorrection: () => satClockCorrection,
46
+ sbasIonoDeg: () => sbasIonoDeg,
47
+ sbasLongTermDeg: () => sbasLongTermDeg,
46
48
  sbasProtectionLevels: () => sbasProtectionLevels,
47
49
  solidEarthTide: () => solidEarthTide,
48
50
  solveDgnss: () => solveDgnss,
@@ -1744,6 +1746,17 @@ var DEGF = [
1744
1746
  58e-4
1745
1747
  ];
1746
1748
  var degfcorr = (ai) => ai > 0 && ai <= 15 ? DEGF[ai] : 58e-4;
1749
+ function sbasLongTermDeg(d, vel, ageSec) {
1750
+ if (vel) {
1751
+ if (ageSec > 0 && ageSec < d.iltcV1) return 0;
1752
+ return d.cltcLsb + d.cltcV1 * Math.max(0, -ageSec, ageSec - d.iltcV1);
1753
+ }
1754
+ return d.cltcV0 * Math.floor(Math.abs(ageSec) / d.iltcV0);
1755
+ }
1756
+ function sbasIonoDeg(d, ageSec) {
1757
+ const dt = Math.abs(ageSec);
1758
+ return d.cionoStep * Math.floor(dt / d.iiono) + d.cionoRamp * dt;
1759
+ }
1747
1760
  var x1 = [-75, -65, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75, 85];
1748
1761
  var x2 = [-55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55];
1749
1762
  var x3 = [-75, -65, -55, -50, -45, -40, -35, -30, -25, -20, -15, -10, -5, 0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 65, 75];
@@ -1797,6 +1810,7 @@ var SbasProcessor = class {
1797
1810
  satIdx = /* @__PURE__ */ new Map();
1798
1811
  iodp = -1;
1799
1812
  tlat = 0;
1813
+ degr = null;
1800
1814
  ion = [];
1801
1815
  /** GEO PRN(s) whose messages have been ingested. */
1802
1816
  geoPrns = /* @__PURE__ */ new Set();
@@ -1823,6 +1837,8 @@ var SbasProcessor = class {
1823
1837
  return this.decodeIntegrity(msg) ? type : -1;
1824
1838
  case 7:
1825
1839
  return this.decodeDegradation(msg) ? type : -1;
1840
+ case 10:
1841
+ return this.decodeMt10(msg) ? type : -1;
1826
1842
  case 18:
1827
1843
  return this.decodeIgpMask(msg) ? type : -1;
1828
1844
  case 24:
@@ -1891,6 +1907,30 @@ var SbasProcessor = class {
1891
1907
  }
1892
1908
  return true;
1893
1909
  }
1910
+ /** MT10 degradation factors (DO-229D Table A-9). Fields follow the 8-bit
1911
+ * preamble + 6-bit type (start bit 14), MSB-first, with the listed LSBs.
1912
+ * Iiono / Iltc_v0 of 0 must be read as 1 (Table A-9, Note 3). */
1913
+ decodeMt10(msg) {
1914
+ const u = (p, n) => getBitU(msg, p, n);
1915
+ this.degr = {
1916
+ brrc: u(14, 10) * 2e-3,
1917
+ cltcLsb: u(24, 10) * 2e-3,
1918
+ cltcV1: u(34, 10) * 5e-5,
1919
+ iltcV1: u(44, 9),
1920
+ cltcV0: u(53, 10) * 2e-3,
1921
+ iltcV0: u(63, 9) || 1,
1922
+ cgeoLsb: u(72, 10) * 5e-4,
1923
+ cgeoV: u(82, 10) * 5e-5,
1924
+ igeo: u(92, 9),
1925
+ cer: u(101, 6) * 0.5,
1926
+ cionoStep: u(107, 10) * 1e-3,
1927
+ iiono: u(117, 9) || 1,
1928
+ cionoRamp: u(126, 10) * 5e-6,
1929
+ rssUdre: u(136, 1) === 1,
1930
+ rssIono: u(137, 1) === 1
1931
+ };
1932
+ return true;
1933
+ }
1894
1934
  decodeMixed(msg, week, tow) {
1895
1935
  if (this.iodp !== getBitU(msg, 110, 2)) return false;
1896
1936
  const blk = getBitU(msg, 112, 2);
@@ -1937,7 +1977,8 @@ var SbasProcessor = class {
1937
1977
  dvel: [0, 0, 0],
1938
1978
  daf0: getBitS(msg, p + 41, 10) * P2_31,
1939
1979
  daf1: 0,
1940
- t0s: gpsSeconds(week, tow)
1980
+ t0s: gpsSeconds(week, tow),
1981
+ vel: false
1941
1982
  };
1942
1983
  return true;
1943
1984
  }
@@ -1961,7 +2002,8 @@ var SbasProcessor = class {
1961
2002
  ],
1962
2003
  daf0: getBitS(msg, p + 47, 11) * P2_31,
1963
2004
  daf1: getBitS(msg, p + 82, 8) * P2_39,
1964
- t0s: gpsSeconds(week, tow + t)
2005
+ t0s: gpsSeconds(week, tow + t),
2006
+ vel: true
1965
2007
  };
1966
2008
  return true;
1967
2009
  }
@@ -2082,9 +2124,16 @@ var SbasProcessor = class {
2082
2124
  const tf = now - s.fcorr.t0s + this.tlat;
2083
2125
  if (Math.abs(tf) > MAXSBSAGEF || s.fcorr.udre >= 15) return null;
2084
2126
  const prc = s.fcorr.prc;
2085
- const varM2 = varfcorr(s.fcorr.udre) + degfcorr(s.fcorr.ai) * tf * tf / 2;
2127
+ const sigUdre = Math.sqrt(varfcorr(s.fcorr.udre));
2128
+ const efc = degfcorr(s.fcorr.ai) * tf * tf / 2;
2129
+ const eltc = this.degr && s.lcorr && s.lcorr.t0s !== 0 ? sbasLongTermDeg(this.degr, s.lcorr.vel, now - s.lcorr.t0s) : 0;
2130
+ const varM2 = this.degr?.rssUdre ? sigUdre * sigUdre + efc * efc + eltc * eltc : (sigUdre + efc + eltc) ** 2;
2086
2131
  return { dPos: drs, dClkS: dclk + prc / C_LIGHT, prcM: prc, varM2, iode };
2087
2132
  }
2133
+ /** The last-decoded MT10 degradation factors, or null if none seen. */
2134
+ get degradation() {
2135
+ return this.degr;
2136
+ }
2088
2137
  /**
2089
2138
  * Slant L1 ionospheric delay (m) at the pierce point for a receiver geodetic
2090
2139
  * position (lat/lon rad, height m) and a satellite az/el (rad), interpolated
@@ -2133,14 +2182,18 @@ var SbasProcessor = class {
2133
2182
  } else return null;
2134
2183
  const now = gpsSeconds(week, tow);
2135
2184
  let delay = 0;
2136
- let varM2 = 0;
2185
+ let varVert = 0;
2137
2186
  for (let i = 0; i < 4; i++) {
2138
2187
  const g = pts[i];
2139
2188
  if (!g) continue;
2140
2189
  delay += w[i] * g.delay;
2141
- varM2 += w[i] * varicorr(g.give) * 9e-8 * Math.abs(now - g.t0s);
2190
+ const sigGive = Math.sqrt(varicorr(g.give));
2191
+ const d = this.degr;
2192
+ const eiono = d ? sbasIonoDeg(d, now - g.t0s) : 0;
2193
+ const sig2 = d?.rssIono ? sigGive * sigGive + eiono * eiono : (sigGive + eiono) ** 2;
2194
+ varVert += w[i] * sig2;
2142
2195
  }
2143
- return { delayM: delay * fp, varM2: varM2 * fp * fp };
2196
+ return { delayM: delay * fp, varM2: varVert * fp * fp };
2144
2197
  }
2145
2198
  /** Find the four IGPs bracketing a pierce point (RTKLIB `searchigp`). */
2146
2199
  searchIgp(latP, lonP) {
@@ -3627,10 +3680,10 @@ function sagnac2(pos, travelTimeS) {
3627
3680
  function sbasAirTropoVar(elRad) {
3628
3681
  const elDeg = elRad * 180 / Math.PI;
3629
3682
  const sigMp = 0.13 + 0.53 * Math.exp(-elDeg / 10);
3630
- const sigNoise = 0.15 + 0.43 * Math.exp(-elDeg / 6.9);
3683
+ const NOISE_DIVG_AADA = 0.36;
3631
3684
  const m = 1.001 / Math.sqrt(2001e-6 + Math.sin(elRad) * Math.sin(elRad));
3632
3685
  const sigTropo = 0.12 * m;
3633
- return sigMp * sigMp + sigNoise * sigNoise + sigTropo * sigTropo;
3686
+ return sigMp * sigMp + NOISE_DIVG_AADA * NOISE_DIVG_AADA + sigTropo * sigTropo;
3634
3687
  }
3635
3688
  function invertMatrix(A) {
3636
3689
  const n = A.length;
@@ -3939,6 +3992,8 @@ function solveSpp(pseudoranges, ephemerides, timeMs, opts = {}) {
3939
3992
  postProcessRtk,
3940
3993
  resolvePppAmbiguities,
3941
3994
  satClockCorrection,
3995
+ sbasIonoDeg,
3996
+ sbasLongTermDeg,
3942
3997
  sbasProtectionLevels,
3943
3998
  solidEarthTide,
3944
3999
  solveDgnss,
@@ -550,6 +550,35 @@ declare function lambdaSearch(a: Float64Array, Q: Float64Array, n: number, m?: n
550
550
  */
551
551
  declare function lambdaReduction(Q: Float64Array, n: number): Float64Array | null;
552
552
 
553
+ /**
554
+ * Long-term correction degradation ε_ltc (m) — DO-229D §A.4.5.1.3, eqs A-54
555
+ * (velocity code 1) and A-55 (velocity code 0). `ageSec` = t − t₀ (s).
556
+ */
557
+ declare function sbasLongTermDeg(d: Degradation, vel: boolean, ageSec: number): number;
558
+ /**
559
+ * Ionospheric-correction degradation ε_iono (m) — DO-229D §A.4.5.2, eq A-59.
560
+ * `ageSec` = t − t_iono (s) of the grid point.
561
+ */
562
+ declare function sbasIonoDeg(d: Degradation, ageSec: number): number;
563
+ /** MT10 degradation parameters (DO-229D Table A-9), needed for the residual
564
+ * variances σ²_flt / σ²_ionogrid (§A.4.5, §J.2.2). */
565
+ interface Degradation {
566
+ brrc: number;
567
+ cltcLsb: number;
568
+ cltcV1: number;
569
+ iltcV1: number;
570
+ cltcV0: number;
571
+ iltcV0: number;
572
+ cgeoLsb: number;
573
+ cgeoV: number;
574
+ igeo: number;
575
+ cer: number;
576
+ cionoStep: number;
577
+ iiono: number;
578
+ cionoRamp: number;
579
+ rssUdre: boolean;
580
+ rssIono: boolean;
581
+ }
553
582
  /** A per-satellite SBAS correction, ready to apply in an SPP solve. */
554
583
  interface SbasSatCorrection {
555
584
  /** Long-term ECEF position correction to add to the satellite position (m). */
@@ -575,6 +604,7 @@ declare class SbasProcessor {
575
604
  private satIdx;
576
605
  private iodp;
577
606
  private tlat;
607
+ private degr;
578
608
  private ion;
579
609
  /** GEO PRN(s) whose messages have been ingested. */
580
610
  readonly geoPrns: Set<string>;
@@ -588,6 +618,10 @@ declare class SbasProcessor {
588
618
  private decodeFast;
589
619
  private decodeIntegrity;
590
620
  private decodeDegradation;
621
+ /** MT10 degradation factors (DO-229D Table A-9). Fields follow the 8-bit
622
+ * preamble + 6-bit type (start bit 14), MSB-first, with the listed LSBs.
623
+ * Iiono / Iltc_v0 of 0 must be read as 1 (Table A-9, Note 3). */
624
+ private decodeMt10;
591
625
  private decodeMixed;
592
626
  private decodeLongCorrHalf;
593
627
  private decodeLong0;
@@ -624,6 +658,8 @@ declare class SbasProcessor {
624
658
  * to the satellite ECEF position and `dClkS` to its clock bias.
625
659
  */
626
660
  satCorrection(prn: string, week: number, tow: number): SbasSatCorrection | null;
661
+ /** The last-decoded MT10 degradation factors, or null if none seen. */
662
+ get degradation(): Readonly<Degradation> | null;
627
663
  /**
628
664
  * Slant L1 ionospheric delay (m) at the pierce point for a receiver geodetic
629
665
  * position (lat/lon rad, height m) and a satellite az/el (rad), interpolated
@@ -1334,4 +1370,4 @@ declare function sbasProtectionLevels(sats: readonly {
1334
1370
  */
1335
1371
  declare function solveSpp(pseudoranges: Map<string, number>, ephemerides: Map<string, Ephemeris>, timeMs: number, opts?: SppOptions): SppSolution | null;
1336
1372
 
1337
- export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, type FixedPositionResult, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NetworkFcbResult, type NetworkFcbSummary, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppFixState, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type RtkObsEpoch, type RtkObsInput, type RtkPostProcessOptions, type RtkPostProcessResult, type RtkTrackPoint, type SatGeom, type SbasCorrectionSource, type SbasIonoDelay, SbasProcessor, type SbasSatCorrection, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
1373
+ export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type Degradation, type DgnssOptions, type DgnssSolution, type EphemerisSource, type FixedPositionResult, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NetworkFcbResult, type NetworkFcbSummary, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppFixState, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type RtkObsEpoch, type RtkObsInput, type RtkPostProcessOptions, type RtkPostProcessResult, type RtkTrackPoint, type SatGeom, type SbasCorrectionSource, type SbasIonoDelay, SbasProcessor, type SbasSatCorrection, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasIonoDeg, sbasLongTermDeg, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
@@ -550,6 +550,35 @@ declare function lambdaSearch(a: Float64Array, Q: Float64Array, n: number, m?: n
550
550
  */
551
551
  declare function lambdaReduction(Q: Float64Array, n: number): Float64Array | null;
552
552
 
553
+ /**
554
+ * Long-term correction degradation ε_ltc (m) — DO-229D §A.4.5.1.3, eqs A-54
555
+ * (velocity code 1) and A-55 (velocity code 0). `ageSec` = t − t₀ (s).
556
+ */
557
+ declare function sbasLongTermDeg(d: Degradation, vel: boolean, ageSec: number): number;
558
+ /**
559
+ * Ionospheric-correction degradation ε_iono (m) — DO-229D §A.4.5.2, eq A-59.
560
+ * `ageSec` = t − t_iono (s) of the grid point.
561
+ */
562
+ declare function sbasIonoDeg(d: Degradation, ageSec: number): number;
563
+ /** MT10 degradation parameters (DO-229D Table A-9), needed for the residual
564
+ * variances σ²_flt / σ²_ionogrid (§A.4.5, §J.2.2). */
565
+ interface Degradation {
566
+ brrc: number;
567
+ cltcLsb: number;
568
+ cltcV1: number;
569
+ iltcV1: number;
570
+ cltcV0: number;
571
+ iltcV0: number;
572
+ cgeoLsb: number;
573
+ cgeoV: number;
574
+ igeo: number;
575
+ cer: number;
576
+ cionoStep: number;
577
+ iiono: number;
578
+ cionoRamp: number;
579
+ rssUdre: boolean;
580
+ rssIono: boolean;
581
+ }
553
582
  /** A per-satellite SBAS correction, ready to apply in an SPP solve. */
554
583
  interface SbasSatCorrection {
555
584
  /** Long-term ECEF position correction to add to the satellite position (m). */
@@ -575,6 +604,7 @@ declare class SbasProcessor {
575
604
  private satIdx;
576
605
  private iodp;
577
606
  private tlat;
607
+ private degr;
578
608
  private ion;
579
609
  /** GEO PRN(s) whose messages have been ingested. */
580
610
  readonly geoPrns: Set<string>;
@@ -588,6 +618,10 @@ declare class SbasProcessor {
588
618
  private decodeFast;
589
619
  private decodeIntegrity;
590
620
  private decodeDegradation;
621
+ /** MT10 degradation factors (DO-229D Table A-9). Fields follow the 8-bit
622
+ * preamble + 6-bit type (start bit 14), MSB-first, with the listed LSBs.
623
+ * Iiono / Iltc_v0 of 0 must be read as 1 (Table A-9, Note 3). */
624
+ private decodeMt10;
591
625
  private decodeMixed;
592
626
  private decodeLongCorrHalf;
593
627
  private decodeLong0;
@@ -624,6 +658,8 @@ declare class SbasProcessor {
624
658
  * to the satellite ECEF position and `dClkS` to its clock bias.
625
659
  */
626
660
  satCorrection(prn: string, week: number, tow: number): SbasSatCorrection | null;
661
+ /** The last-decoded MT10 degradation factors, or null if none seen. */
662
+ get degradation(): Readonly<Degradation> | null;
627
663
  /**
628
664
  * Slant L1 ionospheric delay (m) at the pierce point for a receiver geodetic
629
665
  * position (lat/lon rad, height m) and a satellite az/el (rad), interpolated
@@ -1334,4 +1370,4 @@ declare function sbasProtectionLevels(sats: readonly {
1334
1370
  */
1335
1371
  declare function solveSpp(pseudoranges: Map<string, number>, ephemerides: Map<string, Ephemeris>, timeMs: number, opts?: SppOptions): SppSolution | null;
1336
1372
 
1337
- export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type DgnssOptions, type DgnssSolution, type EphemerisSource, type FixedPositionResult, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NetworkFcbResult, type NetworkFcbSummary, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppFixState, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type RtkObsEpoch, type RtkObsInput, type RtkPostProcessOptions, type RtkPostProcessResult, type RtkTrackPoint, type SatGeom, type SbasCorrectionSource, type SbasIonoDelay, SbasProcessor, type SbasSatCorrection, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
1373
+ export { type AntennaOffset, type ArFixedSat, type ArOptions, type ArResult, type ArSat, type CorrectionResult, type Degradation, type DgnssOptions, type DgnssSolution, type EphemerisSource, type FixedPositionResult, IONO_L1_M_PER_TECU, type KlobucharCoeffs, type LambdaResult, type NetworkFcbResult, type NetworkFcbSummary, type NlArc, type NlFcbResult, type PppAntennaModel, type PppArc, type PppCorrectionConfig, type PppCorrections, type PppEpoch, type PppEpochContext, type PppEpochResult, type PppFixState, type PppOptions, type PppSatObs, type PppSolution, type RawObservation, type RtkEpochMeasurements, RtkFloatEngine, type RtkFloatOptions, type RtkFloatSolution, type RtkMeasurement, type RtkObsEpoch, type RtkObsInput, type RtkPostProcessOptions, type RtkPostProcessResult, type RtkTrackPoint, type SatGeom, type SbasCorrectionSource, type SbasIonoDelay, SbasProcessor, type SbasSatCorrection, type SppOptions, type SppSolution, type TropoMapping, type WlArc, type WlFcbOptions, type WlFcbResult, type WlObs, buildPppAntenna, createPppCorrections, estimateNarrowlaneFcb, estimateNetworkFcbs, estimateWidelaneFcb, extractWidelaneArcs, fixPppPosition, gimSlantIonoDelayL1, gimVerticalTec, gmst, ionoFree, klobucharDelay, lambdaReduction, lambdaSearch, moonEcef, niellMapping, nlWavelength, postProcessRtk, resolvePppAmbiguities, satClockCorrection, sbasIonoDeg, sbasLongTermDeg, sbasProtectionLevels, solidEarthTide, solveDgnss, solvePpp, solveSpp, sunEcef, toRtkEpoch, wlWavelength };
@@ -22,6 +22,8 @@ import {
22
22
  postProcessRtk,
23
23
  resolvePppAmbiguities,
24
24
  satClockCorrection,
25
+ sbasIonoDeg,
26
+ sbasLongTermDeg,
25
27
  sbasProtectionLevels,
26
28
  solidEarthTide,
27
29
  solveDgnss,
@@ -30,7 +32,7 @@ import {
30
32
  sunEcef,
31
33
  toRtkEpoch,
32
34
  wlWavelength
33
- } from "./chunk-BU6YC6VK.js";
35
+ } from "./chunk-SWVIBUHS.js";
34
36
  import "./chunk-WQX354KD.js";
35
37
  import "./chunk-MHGNKSSH.js";
36
38
  import "./chunk-MIIM4LDY.js";
@@ -66,6 +68,8 @@ export {
66
68
  postProcessRtk,
67
69
  resolvePppAmbiguities,
68
70
  satClockCorrection,
71
+ sbasIonoDeg,
72
+ sbasLongTermDeg,
69
73
  sbasProtectionLevels,
70
74
  solidEarthTide,
71
75
  solveDgnss,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gnss-js",
3
- "version": "1.57.0",
3
+ "version": "1.58.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,