gnss-js 1.20.0 → 1.21.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/index.cjs CHANGED
@@ -231,6 +231,7 @@ __export(src_exports, {
231
231
  parseSbfCnav: () => parseSbfCnav,
232
232
  parseSbfGalNav: () => parseSbfGalNav,
233
233
  parseSbfGloNav: () => parseSbfGloNav,
234
+ parseSbfHas: () => parseSbfHas,
234
235
  parseSbfIonoUtc: () => parseSbfIonoUtc,
235
236
  parseSbfMeas: () => parseSbfMeas,
236
237
  parseSbfNav: () => parseSbfNav,
@@ -6820,6 +6821,529 @@ function parseSbfGloNav(data) {
6820
6821
  return { ephemerides, badCrc, messages };
6821
6822
  }
6822
6823
 
6824
+ // src/navbits/rs255.ts
6825
+ var RS255_N = 255;
6826
+ var RS255_K = 32;
6827
+ var EXP = new Uint8Array(510);
6828
+ var LOG = new Int16Array(256).fill(-1);
6829
+ {
6830
+ let x = 1;
6831
+ for (let i = 0; i < 255; i++) {
6832
+ EXP[i] = x;
6833
+ LOG[x] = i;
6834
+ x <<= 1;
6835
+ if (x & 256) x ^= 285;
6836
+ }
6837
+ for (let i = 255; i < 510; i++) EXP[i] = EXP[i - 255];
6838
+ }
6839
+ var gfMul = (a, b) => a === 0 || b === 0 ? 0 : EXP[LOG[a] + LOG[b]];
6840
+ var gfInv = (a) => EXP[255 - LOG[a]];
6841
+ var GEN_POLY = (() => {
6842
+ let g = new Uint8Array([1]);
6843
+ for (let i = 1; i <= 223; i++) {
6844
+ const root = EXP[i];
6845
+ const next = new Uint8Array(g.length + 1);
6846
+ for (let j = 0; j < g.length; j++) {
6847
+ next[j] ^= g[j];
6848
+ next[j + 1] ^= gfMul(g[j], root);
6849
+ }
6850
+ g = next;
6851
+ }
6852
+ return g;
6853
+ })();
6854
+ function rs255Encode(info) {
6855
+ if (info.length > RS255_K)
6856
+ throw new RangeError(`rs255Encode: info length ${info.length} > 32`);
6857
+ const cw = new Uint8Array(RS255_N);
6858
+ cw.set(info, 0);
6859
+ const work = new Uint8Array(RS255_N);
6860
+ work.set(info, 0);
6861
+ for (let i = 0; i < RS255_K; i++) {
6862
+ const coef = work[i];
6863
+ if (coef === 0) continue;
6864
+ for (let j = 1; j < GEN_POLY.length; j++)
6865
+ work[i + j] ^= gfMul(GEN_POLY[j], coef);
6866
+ }
6867
+ cw.set(work.subarray(RS255_K), RS255_K);
6868
+ return cw;
6869
+ }
6870
+ var genMatrix = null;
6871
+ function generatorMatrix() {
6872
+ if (genMatrix) return genMatrix;
6873
+ const rows = [];
6874
+ for (let r = 0; r < RS255_N; r++) rows.push(new Uint8Array(RS255_K));
6875
+ for (let c = 0; c < RS255_K; c++) {
6876
+ const e = new Uint8Array(RS255_K);
6877
+ e[c] = 1;
6878
+ const cw = rs255Encode(e);
6879
+ for (let r = 0; r < RS255_N; r++) rows[r][c] = cw[r];
6880
+ }
6881
+ genMatrix = rows;
6882
+ return rows;
6883
+ }
6884
+ function rs255DecodeErasures(pages, k) {
6885
+ if (k < 1 || k > RS255_K) return null;
6886
+ const seen = /* @__PURE__ */ new Set();
6887
+ const use = [];
6888
+ for (const p of pages) {
6889
+ if (p.pageId < 1 || p.pageId > RS255_N || seen.has(p.pageId)) continue;
6890
+ seen.add(p.pageId);
6891
+ use.push(p);
6892
+ if (use.length === k) break;
6893
+ }
6894
+ if (use.length < k) return null;
6895
+ const width = use[0].octets.length;
6896
+ if (use.some((p) => p.octets.length !== width)) return null;
6897
+ const G = generatorMatrix();
6898
+ const a = use.map((p) => G[p.pageId - 1].slice(0, k));
6899
+ const inv = use.map((_, r) => {
6900
+ const row = new Uint8Array(k);
6901
+ row[r] = 1;
6902
+ return row;
6903
+ });
6904
+ for (let c = 0; c < k; c++) {
6905
+ let pivot = -1;
6906
+ for (let r = c; r < k; r++)
6907
+ if (a[r][c] !== 0) {
6908
+ pivot = r;
6909
+ break;
6910
+ }
6911
+ if (pivot < 0) return null;
6912
+ [a[c], a[pivot]] = [a[pivot], a[c]];
6913
+ [inv[c], inv[pivot]] = [inv[pivot], inv[c]];
6914
+ const s = gfInv(a[c][c]);
6915
+ for (let j = 0; j < k; j++) {
6916
+ a[c][j] = gfMul(a[c][j], s);
6917
+ inv[c][j] = gfMul(inv[c][j], s);
6918
+ }
6919
+ for (let r = 0; r < k; r++) {
6920
+ if (r === c || a[r][c] === 0) continue;
6921
+ const f = a[r][c];
6922
+ for (let j = 0; j < k; j++) {
6923
+ a[r][j] ^= gfMul(a[c][j], f);
6924
+ inv[r][j] ^= gfMul(inv[c][j], f);
6925
+ }
6926
+ }
6927
+ }
6928
+ const out = new Uint8Array(k * width);
6929
+ for (let r = 0; r < k; r++)
6930
+ for (let c = 0; c < width; c++) {
6931
+ let v = 0;
6932
+ for (let j = 0; j < k; j++) v ^= gfMul(inv[r][j], use[j].octets[c]);
6933
+ out[r * width + c] = v;
6934
+ }
6935
+ return out;
6936
+ }
6937
+
6938
+ // src/navbits/has.ts
6939
+ var HAS_DUMMY_HEADER = 11484099;
6940
+ var HAS_VALIDITY_SECONDS = [
6941
+ 5,
6942
+ 10,
6943
+ 15,
6944
+ 20,
6945
+ 30,
6946
+ 60,
6947
+ 90,
6948
+ 120,
6949
+ 180,
6950
+ 240,
6951
+ 300,
6952
+ 600,
6953
+ 900,
6954
+ 1800,
6955
+ 3600,
6956
+ null
6957
+ ];
6958
+ var HAS_GPS_SIGNALS = [
6959
+ "L1 C/A",
6960
+ "Reserved",
6961
+ "Reserved",
6962
+ "L1C(D)",
6963
+ "L1C(P)",
6964
+ "L1C(D+P)",
6965
+ "L2 CM",
6966
+ "L2 CL",
6967
+ "L2 CM+CL",
6968
+ "L2 P",
6969
+ "Reserved",
6970
+ "L5 I",
6971
+ "L5 Q",
6972
+ "L5 I+Q",
6973
+ "Reserved",
6974
+ "Reserved"
6975
+ ];
6976
+ var HAS_GALILEO_SIGNALS = [
6977
+ "E1-B",
6978
+ "E1-C",
6979
+ "E1-B+E1-C",
6980
+ "E5a-I",
6981
+ "E5a-Q",
6982
+ "E5a-I+E5a-Q",
6983
+ "E5b-I",
6984
+ "E5b-Q",
6985
+ "E5b-I+E5b-Q",
6986
+ "E5-I",
6987
+ "E5-Q",
6988
+ "E5-I+E5-Q",
6989
+ "E6-B",
6990
+ "E6-C",
6991
+ "E6-B+E6-C",
6992
+ "Reserved"
6993
+ ];
6994
+ var SYSTEM_OF_GNSS_ID = { 0: "G", 2: "E" };
6995
+ var IOD_BITS = { G: 8, E: 10 };
6996
+ function hasPageCrcOk(page) {
6997
+ if (page.length < 61) return false;
6998
+ return crc24q(page, 462) === getBitU(page, 462, 24);
6999
+ }
7000
+ function parseHasPage(page) {
7001
+ if (getBitU(page, 14, 24) === HAS_DUMMY_HEADER) return null;
7002
+ const body = new Uint8Array(53);
7003
+ for (let i = 0; i < 53; i++) body[i] = getBitU(page, 38 + 8 * i, 8);
7004
+ return {
7005
+ status: getBitU(page, 14, 2),
7006
+ messageType: getBitU(page, 18, 2),
7007
+ messageId: getBitU(page, 20, 5),
7008
+ messageSize: getBitU(page, 25, 5) + 1,
7009
+ pageId: getBitU(page, 30, 8),
7010
+ body
7011
+ };
7012
+ }
7013
+ var Cursor = class {
7014
+ constructor(buf, bits) {
7015
+ this.buf = buf;
7016
+ this.bits = bits;
7017
+ }
7018
+ pos = 0;
7019
+ u(len) {
7020
+ if (this.pos + len > this.bits) throw new RangeError("truncated");
7021
+ const v = getBitU(this.buf, this.pos, len);
7022
+ this.pos += len;
7023
+ return v;
7024
+ }
7025
+ s(len) {
7026
+ if (this.pos + len > this.bits) throw new RangeError("truncated");
7027
+ const v = getBitS(this.buf, this.pos, len);
7028
+ this.pos += len;
7029
+ return v;
7030
+ }
7031
+ };
7032
+ var prnOf = (system, idx) => `${system}${String(idx + 1).padStart(2, "0")}`;
7033
+ function parseMaskBlock(c, maskId) {
7034
+ const nSys = c.u(4);
7035
+ const systems = [];
7036
+ for (let s = 0; s < nSys; s++) {
7037
+ const gnssId = c.u(4);
7038
+ const system = SYSTEM_OF_GNSS_ID[gnssId];
7039
+ if (system === void 0) throw new RangeError(`unknown GNSS ID ${gnssId}`);
7040
+ const prns = [];
7041
+ for (let b = 0; b < 40; b++) if (c.u(1)) prns.push(prnOf(system, b));
7042
+ const signalIndices = [];
7043
+ for (let b = 0; b < 16; b++) if (c.u(1)) signalIndices.push(b);
7044
+ const signalNames = system === "G" ? HAS_GPS_SIGNALS : HAS_GALILEO_SIGNALS;
7045
+ let cellMask = null;
7046
+ if (c.u(1)) {
7047
+ cellMask = prns.map(() => signalIndices.map(() => c.u(1) === 1));
7048
+ }
7049
+ systems.push({
7050
+ gnssId,
7051
+ system,
7052
+ prns,
7053
+ signalIndices,
7054
+ signals: signalIndices.map((i) => signalNames[i]),
7055
+ cellMask,
7056
+ navMessage: c.u(3)
7057
+ });
7058
+ }
7059
+ c.u(6);
7060
+ return { maskId, systems };
7061
+ }
7062
+ function parseOrbitBlock(c, masks) {
7063
+ const validityIndex = c.u(4);
7064
+ const corrections = [];
7065
+ for (const sys of masks.systems) {
7066
+ for (const prn of sys.prns) {
7067
+ const gnssIod = c.u(IOD_BITS[sys.system]);
7068
+ const rad = c.s(13);
7069
+ const inT = c.s(12);
7070
+ const cross = c.s(12);
7071
+ corrections.push({
7072
+ system: sys.system,
7073
+ prn,
7074
+ gnssIod,
7075
+ deltaRadial: rad === -4096 ? null : rad * 25e-4,
7076
+ deltaInTrack: inT === -2048 ? null : inT * 8e-3,
7077
+ deltaCrossTrack: cross === -2048 ? null : cross * 8e-3
7078
+ });
7079
+ }
7080
+ }
7081
+ return {
7082
+ validityIndex,
7083
+ validitySeconds: HAS_VALIDITY_SECONDS[validityIndex],
7084
+ corrections
7085
+ };
7086
+ }
7087
+ function clockValue(c, system, prn, multiplier) {
7088
+ const raw = c.s(13);
7089
+ return {
7090
+ system,
7091
+ prn,
7092
+ deltaClock: raw === -4096 || raw === 4095 ? null : raw * 25e-4 * multiplier,
7093
+ notUsable: raw === 4095
7094
+ };
7095
+ }
7096
+ function parseClockFullBlock(c, masks) {
7097
+ const validityIndex = c.u(4);
7098
+ const multipliers = masks.systems.map((sys) => ({
7099
+ system: sys.system,
7100
+ multiplier: c.u(2) + 1
7101
+ }));
7102
+ const corrections = [];
7103
+ for (let s = 0; s < masks.systems.length; s++) {
7104
+ const sys = masks.systems[s];
7105
+ for (const prn of sys.prns)
7106
+ corrections.push(
7107
+ clockValue(c, sys.system, prn, multipliers[s].multiplier)
7108
+ );
7109
+ }
7110
+ return {
7111
+ validityIndex,
7112
+ validitySeconds: HAS_VALIDITY_SECONDS[validityIndex],
7113
+ multipliers,
7114
+ corrections
7115
+ };
7116
+ }
7117
+ function parseClockSubsetBlock(c, masks) {
7118
+ const validityIndex = c.u(4);
7119
+ const nSys = c.u(4);
7120
+ const multipliers = [];
7121
+ const corrections = [];
7122
+ for (let s = 0; s < nSys; s++) {
7123
+ const gnssId = c.u(4);
7124
+ const sys = masks.systems.find((m) => m.gnssId === gnssId);
7125
+ if (!sys) throw new RangeError(`subset GNSS ID ${gnssId} not in mask`);
7126
+ const multiplier = c.u(2) + 1;
7127
+ multipliers.push({ system: sys.system, multiplier });
7128
+ const selected = [];
7129
+ for (const prn of sys.prns) if (c.u(1)) selected.push(prn);
7130
+ for (const prn of selected)
7131
+ corrections.push(clockValue(c, sys.system, prn, multiplier));
7132
+ }
7133
+ return {
7134
+ validityIndex,
7135
+ validitySeconds: HAS_VALIDITY_SECONDS[validityIndex],
7136
+ multipliers,
7137
+ corrections
7138
+ };
7139
+ }
7140
+ function parseBiasBlock(c, masks, kind) {
7141
+ const validityIndex = c.u(4);
7142
+ const biases = [];
7143
+ for (const sys of masks.systems) {
7144
+ for (let s = 0; s < sys.prns.length; s++) {
7145
+ for (let g = 0; g < sys.signalIndices.length; g++) {
7146
+ if (sys.cellMask && !sys.cellMask[s][g]) continue;
7147
+ const raw = c.s(11);
7148
+ const entry = {
7149
+ system: sys.system,
7150
+ prn: sys.prns[s],
7151
+ signalIndex: sys.signalIndices[g],
7152
+ signal: sys.signals[g],
7153
+ bias: raw === -1024 ? null : raw * (kind === "code" ? 0.02 : 0.01)
7154
+ };
7155
+ if (kind === "phase") entry.discontinuity = c.u(2);
7156
+ biases.push(entry);
7157
+ }
7158
+ }
7159
+ }
7160
+ return {
7161
+ validityIndex,
7162
+ validitySeconds: HAS_VALIDITY_SECONDS[validityIndex],
7163
+ biases
7164
+ };
7165
+ }
7166
+ function parseHasMt1(payload, header, cachedMasks) {
7167
+ const c = new Cursor(payload, payload.length * 8);
7168
+ const toh = c.u(12);
7169
+ const flags = {
7170
+ mask: c.u(1) === 1,
7171
+ orbit: c.u(1) === 1,
7172
+ clockFullSet: c.u(1) === 1,
7173
+ clockSubset: c.u(1) === 1,
7174
+ codeBias: c.u(1) === 1,
7175
+ phaseBias: c.u(1) === 1
7176
+ };
7177
+ c.u(4);
7178
+ const maskId = c.u(5);
7179
+ const iodSetId = c.u(5);
7180
+ const msg = {
7181
+ ...header,
7182
+ toh,
7183
+ maskId,
7184
+ iodSetId,
7185
+ flags,
7186
+ maskFromCache: false,
7187
+ parseError: null
7188
+ };
7189
+ try {
7190
+ let masks;
7191
+ if (flags.mask) {
7192
+ masks = parseMaskBlock(c, maskId);
7193
+ } else if (cachedMasks) {
7194
+ masks = cachedMasks;
7195
+ msg.maskFromCache = true;
7196
+ } else {
7197
+ msg.parseError = "mask-unavailable";
7198
+ return msg;
7199
+ }
7200
+ msg.masks = masks;
7201
+ if (flags.orbit) msg.orbit = parseOrbitBlock(c, masks);
7202
+ if (flags.clockFullSet) msg.clockFullSet = parseClockFullBlock(c, masks);
7203
+ if (flags.clockSubset) msg.clockSubset = parseClockSubsetBlock(c, masks);
7204
+ if (flags.codeBias) msg.codeBias = parseBiasBlock(c, masks, "code");
7205
+ if (flags.phaseBias) msg.phaseBias = parseBiasBlock(c, masks, "phase");
7206
+ } catch (e) {
7207
+ msg.parseError = e instanceof Error ? e.message : String(e);
7208
+ }
7209
+ return msg;
7210
+ }
7211
+ var HasAssembler = class {
7212
+ slots = /* @__PURE__ */ new Map();
7213
+ lastMessageId = -1;
7214
+ maskCache = /* @__PURE__ */ new Map();
7215
+ /** Pages a message may span before its slot is restarted (s). */
7216
+ timeoutSec;
7217
+ stats = {
7218
+ pages: 0,
7219
+ dummyPages: 0,
7220
+ skippedPages: 0,
7221
+ duplicatePages: 0,
7222
+ resets: 0,
7223
+ messages: 0,
7224
+ parseErrors: 0
7225
+ };
7226
+ constructor(opts = {}) {
7227
+ this.timeoutSec = opts.timeoutSec ?? 30;
7228
+ }
7229
+ /**
7230
+ * Push one 492-bit C/NAV page (≥ 61 bytes; check the CRC first with
7231
+ * `hasPageCrcOk`). `tow` — a receiver time of week in seconds, any
7232
+ * origin as long as it is common to all pages — enables the slot
7233
+ * timeout and is stamped on completed messages.
7234
+ */
7235
+ push(page, tow) {
7236
+ const p = parseHasPage(page);
7237
+ if (!p) {
7238
+ this.stats.dummyPages++;
7239
+ return null;
7240
+ }
7241
+ this.stats.pages++;
7242
+ if (p.messageType !== 1 || p.status > 1 || p.pageId === 0) {
7243
+ this.stats.skippedPages++;
7244
+ return null;
7245
+ }
7246
+ if (p.messageId === this.lastMessageId) return null;
7247
+ let slot = this.slots.get(p.messageId);
7248
+ const timedOut = slot?.firstTow !== void 0 && tow !== void 0 && tow - slot.firstTow > this.timeoutSec;
7249
+ if (slot && (slot.messageSize !== p.messageSize || timedOut)) {
7250
+ this.stats.resets++;
7251
+ slot = void 0;
7252
+ }
7253
+ if (!slot) {
7254
+ slot = {
7255
+ messageSize: p.messageSize,
7256
+ status: p.status,
7257
+ pages: [],
7258
+ bodies: /* @__PURE__ */ new Map(),
7259
+ firstTow: tow
7260
+ };
7261
+ this.slots.set(p.messageId, slot);
7262
+ }
7263
+ const bodyKey = Array.from(
7264
+ p.body,
7265
+ (b) => b.toString(16).padStart(2, "0")
7266
+ ).join("");
7267
+ const existing = slot.bodies.get(p.pageId);
7268
+ if (existing !== void 0) {
7269
+ if (existing === bodyKey) {
7270
+ this.stats.duplicatePages++;
7271
+ return null;
7272
+ }
7273
+ this.stats.resets++;
7274
+ slot.pages = [];
7275
+ slot.bodies.clear();
7276
+ slot.firstTow = tow;
7277
+ }
7278
+ slot.bodies.set(p.pageId, bodyKey);
7279
+ slot.pages.push({ pageId: p.pageId, octets: p.body });
7280
+ if (slot.pages.length < slot.messageSize) return null;
7281
+ const payload = rs255DecodeErasures(slot.pages, slot.messageSize);
7282
+ if (!payload) return null;
7283
+ this.slots.delete(p.messageId);
7284
+ this.lastMessageId = p.messageId;
7285
+ const msg = parseHasMt1(
7286
+ payload,
7287
+ {
7288
+ status: slot.status,
7289
+ messageId: p.messageId,
7290
+ messageSize: slot.messageSize
7291
+ },
7292
+ void 0
7293
+ );
7294
+ const resolved = msg.parseError === "mask-unavailable" && this.maskCache.has(msg.maskId) ? parseHasMt1(
7295
+ payload,
7296
+ {
7297
+ status: slot.status,
7298
+ messageId: p.messageId,
7299
+ messageSize: slot.messageSize
7300
+ },
7301
+ this.maskCache.get(msg.maskId)
7302
+ ) : msg;
7303
+ if (resolved.flags.mask && resolved.masks)
7304
+ this.maskCache.set(resolved.maskId, resolved.masks);
7305
+ if (tow !== void 0) resolved.tow = tow;
7306
+ this.stats.messages++;
7307
+ if (resolved.parseError !== null) this.stats.parseErrors++;
7308
+ return resolved;
7309
+ }
7310
+ };
7311
+
7312
+ // src/sbf/rawnav-has.ts
7313
+ function parseSbfHas(data) {
7314
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
7315
+ const assembler = new HasAssembler();
7316
+ const messages = [];
7317
+ let pagesSeen = 0;
7318
+ let pagesBadCrc = 0;
7319
+ scanSbfFrames(data, view, (id, b, len) => {
7320
+ if (id !== 4024 || len < 84) return;
7321
+ pagesSeen++;
7322
+ const page = new Uint8Array(64);
7323
+ for (let k = 0; k < 16; k++) {
7324
+ const w = view.getUint32(b + 20 + 4 * k, true);
7325
+ page[4 * k] = w >>> 24;
7326
+ page[4 * k + 1] = w >>> 16 & 255;
7327
+ page[4 * k + 2] = w >>> 8 & 255;
7328
+ page[4 * k + 3] = w & 255;
7329
+ }
7330
+ if (!hasPageCrcOk(page)) {
7331
+ pagesBadCrc++;
7332
+ return;
7333
+ }
7334
+ const tow = view.getUint32(b + 8, true) / 1e3;
7335
+ const msg = assembler.push(page, tow);
7336
+ if (msg) messages.push({ ...msg, tow, wnc: view.getUint16(b + 12, true) });
7337
+ });
7338
+ return {
7339
+ messages,
7340
+ pagesSeen,
7341
+ pagesBadCrc,
7342
+ pagesDummy: assembler.stats.dummyPages,
7343
+ pagesHas: assembler.stats.pages
7344
+ };
7345
+ }
7346
+
6823
7347
  // src/sbf/index.ts
6824
7348
  var CLIGHT = 299792458;
6825
7349
  var GPS_EPOCH_MS9 = Date.UTC(1980, 0, 6);
@@ -11736,6 +12260,7 @@ function computePsdDb(centerMHz, halfSpanChips, numPoints, psdFn, f0 = 1023e3, f
11736
12260
  parseSbfCnav,
11737
12261
  parseSbfGalNav,
11738
12262
  parseSbfGloNav,
12263
+ parseSbfHas,
11739
12264
  parseSbfIonoUtc,
11740
12265
  parseSbfMeas,
11741
12266
  parseSbfNav,
package/dist/index.d.cts CHANGED
@@ -10,7 +10,7 @@ export { C as CnavEphemeris, E as Ephemeris, G as GlonassEphemeris, K as KeplerE
10
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
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 { UbxCnavResult, UbxFrame, UbxIonoUtcResult, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxRawxEpoch, parseUbxCnav, parseUbxIonoUtc, parseUbxNav, parseUbxRawx, ubxFrames } from './ubx.cjs';
13
- export { SbfBdsNavResult, SbfCnavEphemeris, SbfCnavResult, SbfGalEphemeris, SbfGalNavResult, SbfGloNavResult, SbfIonoUtcResult, SbfMeasEpoch, SbfMeasurement, SbfParseResult, parseSbfBdsNav, parseSbfCnav, parseSbfGalNav, parseSbfGloNav, parseSbfIonoUtc, parseSbfMeas, sbfCrc16, scanSbfFrames } from './sbf.cjs';
13
+ 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';
14
14
  export { NovatelEpoch, NovatelMeasurement, NovatelNavResult, NovatelParseResult, OEM4_HLEN, Oem4Frame, crc32, oem4Frames, parseNovatelNav, parseNovatelRange } from './novatel.cjs';
15
15
  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';
16
16
  export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.cjs';
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export { C as CnavEphemeris, E as Ephemeris, G as GlonassEphemeris, K as KeplerE
10
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
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 { UbxCnavResult, UbxFrame, UbxIonoUtcResult, UbxMeasurement, UbxNavOptions, UbxNavResult, UbxParseResult, UbxRawxEpoch, parseUbxCnav, parseUbxIonoUtc, parseUbxNav, parseUbxRawx, ubxFrames } from './ubx.js';
13
- export { SbfBdsNavResult, SbfCnavEphemeris, SbfCnavResult, SbfGalEphemeris, SbfGalNavResult, SbfGloNavResult, SbfIonoUtcResult, SbfMeasEpoch, SbfMeasurement, SbfParseResult, parseSbfBdsNav, parseSbfCnav, parseSbfGalNav, parseSbfGloNav, parseSbfIonoUtc, parseSbfMeas, sbfCrc16, scanSbfFrames } from './sbf.js';
13
+ 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';
14
14
  export { NovatelEpoch, NovatelMeasurement, NovatelNavResult, NovatelParseResult, OEM4_HLEN, Oem4Frame, crc32, oem4Frames, parseNovatelNav, parseNovatelRange } from './novatel.js';
15
15
  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';
16
16
  export { Helmert14, REFERENCE_FRAMES, ReferenceFrame, applyHelmert, dateToEpoch, transformFrame } from './frames.js';
package/dist/index.js CHANGED
@@ -47,11 +47,12 @@ import {
47
47
  parseSbfCnav,
48
48
  parseSbfGalNav,
49
49
  parseSbfGloNav,
50
+ parseSbfHas,
50
51
  parseSbfIonoUtc,
51
52
  parseSbfMeas,
52
53
  parseSbfNav,
53
54
  scanSbfFrames
54
- } from "./chunk-VJEPOC76.js";
55
+ } from "./chunk-K3V3NHWL.js";
55
56
  import {
56
57
  OEM4_HLEN,
57
58
  crc32,
@@ -509,6 +510,7 @@ export {
509
510
  parseSbfCnav,
510
511
  parseSbfGalNav,
511
512
  parseSbfGloNav,
513
+ parseSbfHas,
512
514
  parseSbfIonoUtc,
513
515
  parseSbfMeas,
514
516
  parseSbfNav,