gnss-js 1.24.0 → 1.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,147 +1,12 @@
1
- // src/navbits/index.ts
2
- var GPS_PI = 3.1415926535898;
3
- var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
4
- var SEC_PER_WEEK = 7 * 86400;
5
- function getBitU(buff, pos, len) {
6
- let bits = 0;
7
- for (let i = pos; i < pos + len; i++) {
8
- bits = bits * 2 + (buff[i >> 3] >> 7 - (i & 7) & 1);
9
- }
10
- return bits;
11
- }
12
- function getBitS(buff, pos, len) {
13
- const bits = getBitU(buff, pos, len);
14
- if (len <= 0 || bits < 2 ** (len - 1)) return bits;
15
- return bits - 2 ** len;
16
- }
17
- function setBitU(buff, pos, len, data) {
18
- let mask = 2 ** (len - 1);
19
- for (let i = pos; i < pos + len; i++, mask /= 2) {
20
- if (data >= mask) {
21
- buff[i >> 3] |= 1 << 7 - (i & 7);
22
- data -= mask;
23
- } else {
24
- buff[i >> 3] &= ~(1 << 7 - (i & 7));
25
- }
26
- }
27
- }
28
- function decodeGpsLnavFrame(subframes, opts = {}) {
29
- if (subframes.length < 90) return null;
30
- const b = subframes;
31
- let i = 24;
32
- const tow1 = getBitU(b, i, 17) * 6;
33
- i += 17 + 2;
34
- const id1 = getBitU(b, i, 3);
35
- i += 3 + 2;
36
- const week10 = getBitU(b, i, 10);
37
- i += 10;
38
- i += 2;
39
- i += 4;
40
- const svHealth = getBitU(b, i, 6);
41
- i += 6;
42
- const iodc0 = getBitU(b, i, 2);
43
- i += 2;
44
- i += 1 + 87;
45
- const tgdRaw = getBitS(b, i, 8);
46
- i += 8;
47
- const iodc1 = getBitU(b, i, 8);
48
- i += 8;
49
- const tocSec = getBitU(b, i, 16) * 16;
50
- i += 16;
51
- const af2 = getBitS(b, i, 8) * 2 ** -55;
52
- i += 8;
53
- const af1 = getBitS(b, i, 16) * 2 ** -43;
54
- i += 16;
55
- const af0 = getBitS(b, i, 22) * 2 ** -31;
56
- i = 240 + 24;
57
- i += 17 + 2;
58
- const id2 = getBitU(b, i, 3);
59
- i += 3 + 2;
60
- const iode = getBitU(b, i, 8);
61
- i += 8;
62
- const crs = getBitS(b, i, 16) * 2 ** -5;
63
- i += 16;
64
- const deltaN = getBitS(b, i, 16) * 2 ** -43 * GPS_PI;
65
- i += 16;
66
- const m0 = getBitS(b, i, 32) * 2 ** -31 * GPS_PI;
67
- i += 32;
68
- const cuc = getBitS(b, i, 16) * 2 ** -29;
69
- i += 16;
70
- const e = getBitU(b, i, 32) * 2 ** -33;
71
- i += 32;
72
- const cus = getBitS(b, i, 16) * 2 ** -29;
73
- i += 16;
74
- const sqrtA = getBitU(b, i, 32) * 2 ** -19;
75
- i += 32;
76
- const toes = getBitU(b, i, 16) * 16;
77
- i = 480 + 24;
78
- i += 17 + 2;
79
- const id3 = getBitU(b, i, 3);
80
- i += 3 + 2;
81
- const cic = getBitS(b, i, 16) * 2 ** -29;
82
- i += 16;
83
- const omega0 = getBitS(b, i, 32) * 2 ** -31 * GPS_PI;
84
- i += 32;
85
- const cis = getBitS(b, i, 16) * 2 ** -29;
86
- i += 16;
87
- const i0 = getBitS(b, i, 32) * 2 ** -31 * GPS_PI;
88
- i += 32;
89
- const crc = getBitS(b, i, 16) * 2 ** -5;
90
- i += 16;
91
- const omega = getBitS(b, i, 32) * 2 ** -31 * GPS_PI;
92
- i += 32;
93
- const omegaDot = getBitS(b, i, 24) * 2 ** -43 * GPS_PI;
94
- i += 24;
95
- const iode3 = getBitU(b, i, 8);
96
- i += 8;
97
- const idot = getBitS(b, i, 14) * 2 ** -43 * GPS_PI;
98
- const iodc = iodc0 * 256 + iodc1;
99
- if (id1 !== 1 || id2 !== 2 || id3 !== 3) return null;
100
- if (iode3 !== iode || iode !== (iodc & 255)) return null;
101
- const ref = opts.refWeek ?? Math.floor((Date.now() - GPS_EPOCH_MS) / 1e3 / SEC_PER_WEEK);
102
- let week = week10 + 1024 * Math.round((ref - week10) / 1024);
103
- if (toes < tow1 - 302400) week++;
104
- else if (toes > tow1 + 302400) week--;
105
- const prn = opts.prn ?? "G00";
106
- const tocDate = new Date(
107
- GPS_EPOCH_MS + (week * SEC_PER_WEEK + tocSec) * 1e3
108
- );
109
- return {
110
- system: prn[0] === "J" ? "J" : "G",
111
- prn,
112
- tocDate,
113
- // Same seconds-of-week convention as parseNavFile (rinex/nav.ts).
114
- toc: tocDate.getTime() / 1e3 % SEC_PER_WEEK,
115
- af0,
116
- af1,
117
- af2,
118
- iode,
119
- crs,
120
- deltaN,
121
- m0,
122
- cuc,
123
- e,
124
- cus,
125
- sqrtA,
126
- toe: toes,
127
- cic,
128
- omega0,
129
- cis,
130
- i0,
131
- crc,
132
- omega,
133
- omegaDot,
134
- idot,
135
- week,
136
- svHealth,
137
- tgd: tgdRaw === -128 ? 0 : tgdRaw * 2 ** -31
138
- // IS-GPS-200: -128 reserved
139
- };
140
- }
1
+ import {
2
+ GPS_PI,
3
+ getBitS,
4
+ getBitU
5
+ } from "./chunk-IQ5OIMQD.js";
141
6
 
142
7
  // src/navbits/cnav.ts
143
- var GPS_EPOCH_MS2 = Date.UTC(1980, 0, 6);
144
- var SEC_PER_WEEK2 = 7 * 86400;
8
+ var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
9
+ var SEC_PER_WEEK = 7 * 86400;
145
10
  var HALF_WEEK = 302400;
146
11
  var CNAV_PREAMBLE = 139;
147
12
  var CNAV_A_REF = 26559710;
@@ -245,7 +110,7 @@ function resolveWeek(week, towSec, sec) {
245
110
  return week;
246
111
  }
247
112
  function gpsDate(week, sec) {
248
- return new Date(GPS_EPOCH_MS2 + (week * SEC_PER_WEEK2 + sec) * 1e3);
113
+ return new Date(GPS_EPOCH_MS + (week * SEC_PER_WEEK + sec) * 1e3);
249
114
  }
250
115
  var CnavAssembler = class {
251
116
  sats = /* @__PURE__ */ new Map();
@@ -336,11 +201,6 @@ var CnavAssembler = class {
336
201
  };
337
202
 
338
203
  export {
339
- GPS_PI,
340
- getBitU,
341
- getBitS,
342
- setBitU,
343
- decodeGpsLnavFrame,
344
204
  CNAV_A_REF,
345
205
  CNAV_OMEGA_DOT_REF,
346
206
  crc24q,
@@ -7,14 +7,16 @@ import {
7
7
  galFnavPageCrcOk,
8
8
  galInavPageCrcOk,
9
9
  testGloString
10
- } from "./chunk-VTX3VCL4.js";
10
+ } from "./chunk-5AUK42AL.js";
11
11
  import {
12
12
  CnavAssembler,
13
13
  cnavCrcOk,
14
- crc24q,
14
+ crc24q
15
+ } from "./chunk-726LQBGM.js";
16
+ import {
15
17
  getBitS,
16
18
  getBitU
17
- } from "./chunk-WZDFZ76K.js";
19
+ } from "./chunk-IQ5OIMQD.js";
18
20
  import {
19
21
  getGpsLeap
20
22
  } from "./chunk-HVXYFUCB.js";
@@ -0,0 +1,424 @@
1
+ // src/trimble/frame.ts
2
+ var STX = 2;
3
+ var ETX = 3;
4
+ var RAWDATA = 87;
5
+ var RETSVDATA = 85;
6
+ function* trimbleFrames(data, stats) {
7
+ let i = 0;
8
+ while (i + 6 <= data.length) {
9
+ if (data[i] !== STX) {
10
+ i++;
11
+ continue;
12
+ }
13
+ const len = data[i + 3];
14
+ const total = 4 + len + 2;
15
+ if (i + total > data.length) {
16
+ i++;
17
+ continue;
18
+ }
19
+ if (data[i + total - 1] !== ETX) {
20
+ i++;
21
+ continue;
22
+ }
23
+ let cs = 0;
24
+ for (let k = 1; k <= 3 + len; k++) cs = cs + data[i + k] & 255;
25
+ if (cs !== data[i + 4 + len]) {
26
+ stats.badChecksum++;
27
+ i++;
28
+ continue;
29
+ }
30
+ yield {
31
+ start: i,
32
+ status: data[i + 1],
33
+ type: data[i + 2],
34
+ len,
35
+ payload: i + 4
36
+ };
37
+ i += total;
38
+ }
39
+ }
40
+
41
+ // src/trimble/nav.ts
42
+ var GPS_EPOCH_MS = Date.UTC(1980, 0, 6);
43
+ var SEC_PER_WEEK = 7 * 86400;
44
+ var MS_PER_WEEK = SEC_PER_WEEK * 1e3;
45
+ var GPS_PI = 3.1415926535898;
46
+ var gpsMs = (week, sec) => GPS_EPOCH_MS + week * MS_PER_WEEK + sec * 1e3;
47
+ var sowOf = (dateMs) => dateMs / 1e3 % SEC_PER_WEEK;
48
+ var SUB_GPS_EPHEMERIS = 1;
49
+ var SUB_ION_UTC = 3;
50
+ function decodeGpsEphemeris(data, view, base) {
51
+ const prn = data[base + 5];
52
+ if (prn < 1 || prn > 32) return null;
53
+ const week = view.getUint16(base + 6, false);
54
+ const iode = data[base + 11];
55
+ const toc = view.getInt32(base + 16, false);
56
+ const toe = view.getUint32(base + 20, false);
57
+ const tgd = view.getFloat64(base + 24, false);
58
+ const af2 = view.getFloat64(base + 32, false);
59
+ const af1 = view.getFloat64(base + 40, false);
60
+ const af0 = view.getFloat64(base + 48, false);
61
+ const crs = view.getFloat64(base + 56, false);
62
+ const deltaN = view.getFloat64(base + 64, false) * GPS_PI;
63
+ const m0 = view.getFloat64(base + 72, false) * GPS_PI;
64
+ const cuc = view.getFloat64(base + 80, false) * GPS_PI;
65
+ const e = view.getFloat64(base + 88, false);
66
+ const cus = view.getFloat64(base + 96, false) * GPS_PI;
67
+ const sqrtA = view.getFloat64(base + 104, false);
68
+ const cic = view.getFloat64(base + 112, false) * GPS_PI;
69
+ const omega0 = view.getFloat64(base + 120, false) * GPS_PI;
70
+ const cis = view.getFloat64(base + 128, false) * GPS_PI;
71
+ const i0 = view.getFloat64(base + 136, false) * GPS_PI;
72
+ const crc = view.getFloat64(base + 144, false);
73
+ const omega = view.getFloat64(base + 152, false) * GPS_PI;
74
+ const omegaDot = view.getFloat64(base + 160, false) * GPS_PI;
75
+ const idot = view.getFloat64(base + 168, false) * GPS_PI;
76
+ const flags = view.getUint32(base + 176, false);
77
+ return {
78
+ system: "G",
79
+ prn: `G${String(prn).padStart(2, "0")}`,
80
+ toc: sowOf(gpsMs(week, toc)),
81
+ tocDate: new Date(gpsMs(week, toc)),
82
+ af0,
83
+ af1,
84
+ af2,
85
+ iode,
86
+ crs,
87
+ deltaN,
88
+ m0,
89
+ cuc,
90
+ e,
91
+ cus,
92
+ sqrtA,
93
+ toe,
94
+ cic,
95
+ omega0,
96
+ cis,
97
+ i0,
98
+ crc,
99
+ omega,
100
+ omegaDot,
101
+ idot,
102
+ week,
103
+ svHealth: flags >>> 4 & 127,
104
+ tgd
105
+ };
106
+ }
107
+ function parseTrimbleNav(data) {
108
+ const view = new DataView(data.buffer, data.byteOffset, data.byteLength);
109
+ const stats = { badChecksum: 0 };
110
+ const ephemerides = [];
111
+ const ionoCorrections = {};
112
+ const retsvCounts = {};
113
+ let leapSeconds = null;
114
+ const lastIode = /* @__PURE__ */ new Map();
115
+ for (const f of trimbleFrames(data, stats)) {
116
+ if (f.type !== RETSVDATA) continue;
117
+ const sub = data[f.payload];
118
+ retsvCounts[sub] = (retsvCounts[sub] ?? 0) + 1;
119
+ if (sub === SUB_GPS_EPHEMERIS && f.len >= 178) {
120
+ const eph = decodeGpsEphemeris(data, view, f.start);
121
+ if (!eph) continue;
122
+ if (lastIode.get(eph.prn) === eph.iode) continue;
123
+ lastIode.set(eph.prn, eph.iode);
124
+ ephemerides.push(eph);
125
+ } else if (sub === SUB_ION_UTC && f.len >= 125) {
126
+ const p = f.start;
127
+ const alpha = [];
128
+ const beta = [];
129
+ for (let i = 0; i < 4; i++) {
130
+ alpha.push(view.getFloat64(p + 6 + i * 8, false));
131
+ beta.push(view.getFloat64(p + 38 + i * 8, false));
132
+ }
133
+ ionoCorrections["GPSA"] = alpha;
134
+ ionoCorrections["GPSB"] = beta;
135
+ leapSeconds = Math.trunc(view.getFloat64(p + 94, false));
136
+ }
137
+ }
138
+ return {
139
+ ephemerides,
140
+ ionoCorrections,
141
+ leapSeconds,
142
+ retsvCounts,
143
+ badChecksum: stats.badChecksum
144
+ };
145
+ }
146
+
147
+ // src/trimble/index.ts
148
+ var GPS_EPOCH_MS2 = Date.UTC(1980, 0, 6);
149
+ var MS_PER_WEEK2 = 7 * 864e5;
150
+ var REC_TYPE_27 = 6;
151
+ var SYS = {
152
+ 0: "G",
153
+ // GPS
154
+ 1: "S",
155
+ // SBAS
156
+ 2: "R",
157
+ // GLONASS
158
+ 3: "E",
159
+ // Galileo
160
+ 4: "J",
161
+ // QZSS
162
+ 5: "C",
163
+ // BeiDou (pre-ICD numbering)
164
+ 7: "C",
165
+ // BeiDou (ICD numbering)
166
+ 9: "I",
167
+ // NavIC / IRNSS
168
+ 10: "C"
169
+ // BeiDou
170
+ };
171
+ var CODES = {
172
+ "G0-0": "1C",
173
+ "G0-20": "1L",
174
+ "G1-2": "2W",
175
+ "G1-5": "2L",
176
+ "G2-6": "5I",
177
+ "G2-7": "5Q",
178
+ "G2-8": "5X",
179
+ "R0-0": "1C",
180
+ "R0-1": "1P",
181
+ "R1-0": "2C",
182
+ "R1-1": "2P",
183
+ "E0-23": "1C",
184
+ "E2-11": "5Q",
185
+ "E3-11": "7Q",
186
+ "E4-14": "8Q",
187
+ "E5-36": "6C",
188
+ "C0-20": "1P",
189
+ "C2-8": "5P",
190
+ "C3-6": "7D",
191
+ "C6-26": "2I",
192
+ "C7-29": "6I",
193
+ "S0-0": "1C",
194
+ "S2-6": "5I",
195
+ "J0-0": "1C"
196
+ };
197
+ var BAND_DIGIT = {
198
+ 0: "1",
199
+ // L1 / E1 / B1C (1575.42)
200
+ 1: "2",
201
+ // L2 / G2 (1227.6)
202
+ 2: "5",
203
+ // L5 / E5a (1176.45)
204
+ 3: "7",
205
+ // E5b / B2b (1207.14)
206
+ 4: "8",
207
+ // E5 AltBOC (1191.795)
208
+ 5: "6",
209
+ // E6 (1278.75)
210
+ 6: "2",
211
+ // B1I (1561.098)
212
+ 7: "6",
213
+ // B3I (1268.52)
214
+ 8: "1",
215
+ // BeiDou E1 (1589.742)
216
+ 9: "3",
217
+ // GLONASS G3 CDMA (1202.025)
218
+ 11: "9"
219
+ // NavIC S-band (2492.028)
220
+ };
221
+ function rinexCode(sys, band, track) {
222
+ const key = `${sys}${band}-${track}`;
223
+ return CODES[key] ?? `${BAND_DIGIT[band] ?? "?"}X`;
224
+ }
225
+ function rinexPrn(sys, svid) {
226
+ let n = svid;
227
+ if (sys === "S")
228
+ n = svid - 100;
229
+ else if (sys === "J" && svid >= 193) n = svid - 192;
230
+ return `${sys}${String(n).padStart(2, "0")}`;
231
+ }
232
+ var readS16 = (dv, o) => dv.getInt16(o, false);
233
+ function readS24(d, o) {
234
+ const v = d[o] << 16 | d[o + 1] << 8 | d[o + 2];
235
+ return v & 8388608 ? v - 16777216 : v;
236
+ }
237
+ function readS48(d, dv, o) {
238
+ const hi = d[o] << 8 | d[o + 1];
239
+ const lo = dv.getUint32(o + 2, false);
240
+ const v = hi * 4294967296 + lo;
241
+ return hi & 32768 ? v - 281474976710656 : v;
242
+ }
243
+ function parseTrimble(data) {
244
+ const stats = { badChecksum: 0 };
245
+ const epochs = [];
246
+ const obsCodes = {};
247
+ const recordCounts = {};
248
+ const retsvCounts = {};
249
+ let pages = [];
250
+ let msgReply = -1;
251
+ let lastPage = 0;
252
+ let msgPages = 0;
253
+ let epoch = null;
254
+ const finalize = () => {
255
+ if (epoch) decodeEpoch(epoch, epochs, obsCodes);
256
+ epoch = null;
257
+ };
258
+ const onMessage = (content, reply) => {
259
+ if (epoch && reply === epoch.reply) {
260
+ epoch.chunks.push(content);
261
+ return;
262
+ }
263
+ finalize();
264
+ if (content.length < 12) return;
265
+ const dv = new DataView(
266
+ content.buffer,
267
+ content.byteOffset,
268
+ content.byteLength
269
+ );
270
+ const headerLen = content[0];
271
+ const week = dv.getUint16(1, false);
272
+ const towMs = dv.getUint32(3, false);
273
+ const nsv = content[10];
274
+ const eflags = content[11];
275
+ if (week < 1024 || week > 4096 || headerLen < 12 || nsv === 0) return;
276
+ let svStart = headerLen;
277
+ if (eflags & 32 && svStart < content.length) svStart += content[svStart];
278
+ epoch = {
279
+ reply,
280
+ week,
281
+ towMs,
282
+ nsv,
283
+ chunks: [content.subarray(svStart)]
284
+ };
285
+ };
286
+ const completeMessage = () => {
287
+ const total = pages.reduce((a, c) => a + c.length, 0);
288
+ const content = new Uint8Array(total);
289
+ let o = 0;
290
+ for (const c of pages) {
291
+ content.set(c, o);
292
+ o += c.length;
293
+ }
294
+ const reply = msgReply;
295
+ pages = [];
296
+ onMessage(content, reply);
297
+ };
298
+ for (const f of trimbleFrames(data, stats)) {
299
+ if (f.type !== RAWDATA) {
300
+ if (f.type === 85) {
301
+ const sub = data[f.payload];
302
+ retsvCounts[sub] = (retsvCounts[sub] ?? 0) + 1;
303
+ }
304
+ continue;
305
+ }
306
+ const recType = data[f.payload];
307
+ recordCounts[recType] = (recordCounts[recType] ?? 0) + 1;
308
+ if (recType !== REC_TYPE_27) continue;
309
+ const pageByte = data[f.payload + 1];
310
+ const page = pageByte >> 4;
311
+ const pagesTotal = pageByte & 15;
312
+ const reply = data[f.payload + 2];
313
+ const content = data.subarray(f.payload + 4, f.payload + f.len);
314
+ if (page === 1) {
315
+ pages = [content];
316
+ msgReply = reply;
317
+ msgPages = pagesTotal;
318
+ lastPage = 1;
319
+ } else if (reply === msgReply && page === lastPage + 1) {
320
+ pages.push(content);
321
+ lastPage = page;
322
+ } else {
323
+ pages = [];
324
+ continue;
325
+ }
326
+ if (lastPage === msgPages) completeMessage();
327
+ }
328
+ finalize();
329
+ return {
330
+ epochs,
331
+ obsCodes,
332
+ recordCounts,
333
+ retsvCounts,
334
+ badChecksum: stats.badChecksum
335
+ };
336
+ }
337
+ function decodeEpoch(epoch, epochs, obsCodes) {
338
+ const total = epoch.chunks.reduce((a, c) => a + c.length, 0);
339
+ const M = new Uint8Array(total);
340
+ let o = 0;
341
+ for (const c of epoch.chunks) {
342
+ M.set(c, o);
343
+ o += c.length;
344
+ }
345
+ const dv = new DataView(M.buffer, M.byteOffset, M.byteLength);
346
+ const timeMs = GPS_EPOCH_MS2 + epoch.week * MS_PER_WEEK2 + epoch.towMs;
347
+ const meas = [];
348
+ let q = 0;
349
+ for (let sv = 0; sv < epoch.nsv && q + 8 <= M.length; sv++) {
350
+ const svLen = M[q];
351
+ if (svLen < 8 || q + svLen > M.length) break;
352
+ const svid = M[q + 1];
353
+ const sys = SYS[M[q + 2] & 63];
354
+ const chan = M[q + 3] << 24 >> 24;
355
+ const nblk = M[q + 4];
356
+ const prn = sys ? rinexPrn(sys, svid) : null;
357
+ const gloChannel = sys === "R" ? chan : null;
358
+ let r = q + svLen;
359
+ let pr0 = 0;
360
+ for (let b = 0; b < nblk; b++) {
361
+ if (r + 5 > M.length) break;
362
+ const mLen = M[r];
363
+ if (mLen < 5 || r + mLen > M.length) break;
364
+ const band = M[r + 1];
365
+ const track = M[r + 2];
366
+ const cn0 = dv.getUint16(r + 3, false) / 10;
367
+ let p = r + 5;
368
+ let pr;
369
+ if (b === 0) {
370
+ const scale = sys === "S" || sys === "J" ? 64 : 128;
371
+ pr = dv.getUint32(p, false) / scale;
372
+ p += 4;
373
+ pr0 = pr;
374
+ } else {
375
+ pr = pr0 + readS16(dv, p) / 256;
376
+ p += 2;
377
+ }
378
+ const cp = -readS48(M, dv, p) / 32768;
379
+ p += 6;
380
+ const cycleSlipCount = M[p];
381
+ p += 1;
382
+ const mf = M[p];
383
+ p += 1;
384
+ let mf2 = 0;
385
+ if (mf & 128) {
386
+ mf2 = M[p];
387
+ p += 1;
388
+ let f = mf2;
389
+ while (f & 128) {
390
+ f = M[p];
391
+ p += 1;
392
+ }
393
+ }
394
+ if (mf2 & 1) p += 1;
395
+ let doppler = null;
396
+ if (mf & 4) doppler = readS24(M, p) / 256;
397
+ if (prn && sys) {
398
+ const code = rinexCode(sys, band, track);
399
+ meas.push({
400
+ prn,
401
+ code,
402
+ pr: mf & 2 ? pr : null,
403
+ cp: mf & 1 ? cp : null,
404
+ doppler: mf & 1 ? doppler : null,
405
+ cn0,
406
+ cycleSlipCount,
407
+ cycleSlip: (mf & 8) !== 0,
408
+ gloChannel
409
+ });
410
+ const list = obsCodes[sys] ??= [];
411
+ if (!list.includes(code)) list.push(code);
412
+ }
413
+ r += mLen;
414
+ }
415
+ q = r;
416
+ }
417
+ epochs.push({ timeMs, meas });
418
+ }
419
+
420
+ export {
421
+ trimbleFrames,
422
+ parseTrimbleNav,
423
+ parseTrimble
424
+ };
@@ -1,8 +1,10 @@
1
1
  import {
2
2
  CnavAssembler,
3
- cnavCrcOk,
3
+ cnavCrcOk
4
+ } from "./chunk-726LQBGM.js";
5
+ import {
4
6
  decodeGpsLnavFrame
5
- } from "./chunk-WZDFZ76K.js";
7
+ } from "./chunk-IQ5OIMQD.js";
6
8
  import {
7
9
  getUtcDate
8
10
  } from "./chunk-HVXYFUCB.js";
@@ -5,15 +5,17 @@ import {
5
5
  bdsSubframeParityOk,
6
6
  galInavPageCrcOk,
7
7
  testGloString
8
- } from "./chunk-VTX3VCL4.js";
8
+ } from "./chunk-5AUK42AL.js";
9
9
  import {
10
10
  CnavAssembler,
11
- cnavCrcOk,
11
+ cnavCrcOk
12
+ } from "./chunk-726LQBGM.js";
13
+ import {
12
14
  decodeGpsLnavFrame,
13
15
  getBitS,
14
16
  getBitU,
15
17
  setBitU
16
- } from "./chunk-WZDFZ76K.js";
18
+ } from "./chunk-IQ5OIMQD.js";
17
19
 
18
20
  // src/ubx/frame.ts
19
21
  function* ubxFrames(data, stats = { badChecksums: 0 }) {