@depz/sensor-sdk 0.1.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.
Files changed (130) hide show
  1. package/README.md +69 -0
  2. package/dist/dataset.d.ts +93 -0
  3. package/dist/dataset.d.ts.map +1 -0
  4. package/dist/dataset.js +253 -0
  5. package/dist/dataset.js.map +1 -0
  6. package/dist/device/device.d.ts +185 -0
  7. package/dist/device/device.d.ts.map +1 -0
  8. package/dist/device/device.js +421 -0
  9. package/dist/device/device.js.map +1 -0
  10. package/dist/device/link.d.ts +62 -0
  11. package/dist/device/link.d.ts.map +1 -0
  12. package/dist/device/link.js +130 -0
  13. package/dist/device/link.js.map +1 -0
  14. package/dist/discovery.d.ts +109 -0
  15. package/dist/discovery.d.ts.map +1 -0
  16. package/dist/discovery.js +281 -0
  17. package/dist/discovery.js.map +1 -0
  18. package/dist/errors.d.ts +39 -0
  19. package/dist/errors.d.ts.map +1 -0
  20. package/dist/errors.js +69 -0
  21. package/dist/errors.js.map +1 -0
  22. package/dist/index.d.ts +42 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +31 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/protocol/bno086.d.ts +36 -0
  27. package/dist/protocol/bno086.d.ts.map +1 -0
  28. package/dist/protocol/bno086.js +38 -0
  29. package/dist/protocol/bno086.js.map +1 -0
  30. package/dist/protocol/common.d.ts +103 -0
  31. package/dist/protocol/common.d.ts.map +1 -0
  32. package/dist/protocol/common.js +121 -0
  33. package/dist/protocol/common.js.map +1 -0
  34. package/dist/protocol/crc.d.ts +17 -0
  35. package/dist/protocol/crc.d.ts.map +1 -0
  36. package/dist/protocol/crc.js +55 -0
  37. package/dist/protocol/crc.js.map +1 -0
  38. package/dist/protocol/framing.d.ts +65 -0
  39. package/dist/protocol/framing.d.ts.map +1 -0
  40. package/dist/protocol/framing.js +152 -0
  41. package/dist/protocol/framing.js.map +1 -0
  42. package/dist/protocol/fwdepz.d.ts +21 -0
  43. package/dist/protocol/fwdepz.d.ts.map +1 -0
  44. package/dist/protocol/fwdepz.js +46 -0
  45. package/dist/protocol/fwdepz.js.map +1 -0
  46. package/dist/protocol/identity.d.ts +14 -0
  47. package/dist/protocol/identity.d.ts.map +1 -0
  48. package/dist/protocol/identity.js +28 -0
  49. package/dist/protocol/identity.js.map +1 -0
  50. package/dist/protocol/sr04.d.ts +38 -0
  51. package/dist/protocol/sr04.d.ts.map +1 -0
  52. package/dist/protocol/sr04.js +58 -0
  53. package/dist/protocol/sr04.js.map +1 -0
  54. package/dist/protocol/usb-ids.d.ts +60 -0
  55. package/dist/protocol/usb-ids.d.ts.map +1 -0
  56. package/dist/protocol/usb-ids.js +79 -0
  57. package/dist/protocol/usb-ids.js.map +1 -0
  58. package/dist/protocol/vl53l8.d.ts +59 -0
  59. package/dist/protocol/vl53l8.d.ts.map +1 -0
  60. package/dist/protocol/vl53l8.js +116 -0
  61. package/dist/protocol/vl53l8.js.map +1 -0
  62. package/dist/sensors/bno086/bno086.d.ts +197 -0
  63. package/dist/sensors/bno086/bno086.d.ts.map +1 -0
  64. package/dist/sensors/bno086/bno086.js +543 -0
  65. package/dist/sensors/bno086/bno086.js.map +1 -0
  66. package/dist/sensors/bno086/reports.d.ts +289 -0
  67. package/dist/sensors/bno086/reports.d.ts.map +1 -0
  68. package/dist/sensors/bno086/reports.js +397 -0
  69. package/dist/sensors/bno086/reports.js.map +1 -0
  70. package/dist/sensors/bno086/sh2.d.ts +307 -0
  71. package/dist/sensors/bno086/sh2.d.ts.map +1 -0
  72. package/dist/sensors/bno086/sh2.js +480 -0
  73. package/dist/sensors/bno086/sh2.js.map +1 -0
  74. package/dist/sensors/bno086/shtp.d.ts +98 -0
  75. package/dist/sensors/bno086/shtp.d.ts.map +1 -0
  76. package/dist/sensors/bno086/shtp.js +205 -0
  77. package/dist/sensors/bno086/shtp.js.map +1 -0
  78. package/dist/sensors/sr04.d.ts +65 -0
  79. package/dist/sensors/sr04.d.ts.map +1 -0
  80. package/dist/sensors/sr04.js +121 -0
  81. package/dist/sensors/sr04.js.map +1 -0
  82. package/dist/sensors/vl53l8/assets/ch.d.ts +16 -0
  83. package/dist/sensors/vl53l8/assets/ch.d.ts.map +1 -0
  84. package/dist/sensors/vl53l8/assets/ch.js +22 -0
  85. package/dist/sensors/vl53l8/assets/ch.js.map +1 -0
  86. package/dist/sensors/vl53l8/assets/cx.d.ts +16 -0
  87. package/dist/sensors/vl53l8/assets/cx.d.ts.map +1 -0
  88. package/dist/sensors/vl53l8/assets/cx.js +22 -0
  89. package/dist/sensors/vl53l8/assets/cx.js.map +1 -0
  90. package/dist/sensors/vl53l8/assets/decode.d.ts +7 -0
  91. package/dist/sensors/vl53l8/assets/decode.d.ts.map +1 -0
  92. package/dist/sensors/vl53l8/assets/decode.js +35 -0
  93. package/dist/sensors/vl53l8/assets/decode.js.map +1 -0
  94. package/dist/sensors/vl53l8/assets/index.d.ts +19 -0
  95. package/dist/sensors/vl53l8/assets/index.d.ts.map +1 -0
  96. package/dist/sensors/vl53l8/assets/index.js +11 -0
  97. package/dist/sensors/vl53l8/assets/index.js.map +1 -0
  98. package/dist/sensors/vl53l8/cnh.d.ts +113 -0
  99. package/dist/sensors/vl53l8/cnh.d.ts.map +1 -0
  100. package/dist/sensors/vl53l8/cnh.js +299 -0
  101. package/dist/sensors/vl53l8/cnh.js.map +1 -0
  102. package/dist/sensors/vl53l8/uld.d.ts +346 -0
  103. package/dist/sensors/vl53l8/uld.d.ts.map +1 -0
  104. package/dist/sensors/vl53l8/uld.js +1388 -0
  105. package/dist/sensors/vl53l8/uld.js.map +1 -0
  106. package/dist/sensors/vl53l8/vl53l8.d.ts +182 -0
  107. package/dist/sensors/vl53l8/vl53l8.d.ts.map +1 -0
  108. package/dist/sensors/vl53l8/vl53l8.js +411 -0
  109. package/dist/sensors/vl53l8/vl53l8.js.map +1 -0
  110. package/dist/transport/loopback.d.ts +18 -0
  111. package/dist/transport/loopback.d.ts.map +1 -0
  112. package/dist/transport/loopback.js +53 -0
  113. package/dist/transport/loopback.js.map +1 -0
  114. package/dist/transport/node.d.ts +51 -0
  115. package/dist/transport/node.d.ts.map +1 -0
  116. package/dist/transport/node.js +123 -0
  117. package/dist/transport/node.js.map +1 -0
  118. package/dist/transport/replay.d.ts +68 -0
  119. package/dist/transport/replay.d.ts.map +1 -0
  120. package/dist/transport/replay.js +196 -0
  121. package/dist/transport/replay.js.map +1 -0
  122. package/dist/transport/types.d.ts +23 -0
  123. package/dist/transport/types.d.ts.map +1 -0
  124. package/dist/transport/types.js +7 -0
  125. package/dist/transport/types.js.map +1 -0
  126. package/dist/transport/webserial.d.ts +69 -0
  127. package/dist/transport/webserial.d.ts.map +1 -0
  128. package/dist/transport/webserial.js +196 -0
  129. package/dist/transport/webserial.js.map +1 -0
  130. package/package.json +77 -0
@@ -0,0 +1,411 @@
1
+ /**
2
+ * VL53L8CX/CH ToF sensor: host-side ULD over the firmware register bridge.
3
+ *
4
+ * The MCU is a thin SPI bridge (contracts/04): the full ST ULD driver runs
5
+ * here on the host (`uld.ts`). Frame streaming is INT-driven push from the
6
+ * device, reassembled from ≤1528-byte chunks.
7
+ *
8
+ * Mirrors the Python reference `depz_sensor_sdk.vl53l8.Vl53l8`.
9
+ */
10
+ import { DepzDevice, StreamQueue } from "../../device/device.js";
11
+ import { DepzError, DepzTimeoutError } from "../../errors.js";
12
+ import { CHUNK_SIZE, FrameReassembler, Vl53l8Cmd, Vl53l8Rpt, packReadReg, packStartStream, packWriteReg, unpackFrameChunk, unpackRegData, } from "../../protocol/vl53l8.js";
13
+ import { loadAssets } from "./assets/index.js";
14
+ import { MI_CFG_DEV_IDX } from "./cnh.js";
15
+ import { RESOLUTION_4X4, RESOLUTION_8X8, VL53L8CX, Vl53l8cxError, readDeviceRevisionId, } from "./uld.js";
16
+ /** Below this the sensor never streams (contract 04). */
17
+ export const MIN_RANGING_FREQUENCY_HZ = 2;
18
+ /** Zone array reshaped to (4,4) or (8,8) — mirror of Vl53l8Frame.grid(). */
19
+ export function zoneGrid(arr, resolution) {
20
+ const side = resolution === RESOLUTION_4X4 ? 4 : 8;
21
+ const rows = [];
22
+ for (let r = 0; r < side; r++) {
23
+ const row = [];
24
+ for (let c = 0; c < side; c++)
25
+ row.push(arr[r * side + c] ?? 0);
26
+ rows.push(row);
27
+ }
28
+ return rows;
29
+ }
30
+ /**
31
+ * VL53L8CX ToF device: `init()` downloads the ~84 KB sensor firmware (takes a
32
+ * few seconds over CDC), then configure and `startRanging()`.
33
+ *
34
+ * This is the base class for both silicon variants. The VL53L8CH superset
35
+ * (compact-network-histogram output) lives in `Vl53l8Ch`, which inherits every
36
+ * method here. All configuration methods require `init()` first and must not
37
+ * be called while ranging (the ULD talks to the current register bank; the
38
+ * stream owns it — contract 04).
39
+ */
40
+ export class Vl53l8Cx extends DepzDevice {
41
+ /** Sensor-firmware blob variant this class loads. */
42
+ variantId = "cx";
43
+ uldDriver = null;
44
+ reassembler = new FrameReassembler();
45
+ frameCbs = [];
46
+ frameQueues = [];
47
+ rangingFlag = false;
48
+ cnhConfig = null;
49
+ writeProgressCb = null;
50
+ resolution = RESOLUTION_4X4; // ULD default after init
51
+ sleepImpl;
52
+ /** ULD `platform` object mapped onto the firmware register bridge. */
53
+ platform = {
54
+ rdMulti: async (addr, size) => {
55
+ const out = new Uint8Array(size);
56
+ let off = 0;
57
+ while (size > 0) {
58
+ const n = Math.min(size, CHUNK_SIZE);
59
+ const rep = await this.request(Vl53l8Cmd.ReadReg, packReadReg(addr, n), {
60
+ matcher: DepzDevice.expectReport(Vl53l8Rpt.RegData, unpackRegData),
61
+ timeoutMs: 2000,
62
+ });
63
+ if (rep.data.length !== n) {
64
+ throw new DepzError(`READ_REG 0x${addr.toString(16).toUpperCase().padStart(4, "0")}: ` +
65
+ `expected ${n}, got ${rep.data.length}`);
66
+ }
67
+ out.set(rep.data, off);
68
+ off += n;
69
+ addr += n;
70
+ size -= n;
71
+ }
72
+ return out;
73
+ },
74
+ wrMulti: async (addr, data) => {
75
+ let done = 0;
76
+ while (done < data.length) {
77
+ const chunk = data.subarray(done, done + CHUNK_SIZE);
78
+ await this.request(Vl53l8Cmd.WriteReg, packWriteReg(addr, chunk), {
79
+ okCompletes: true,
80
+ timeoutMs: 2000,
81
+ });
82
+ addr += chunk.length;
83
+ done += chunk.length;
84
+ if (this.writeProgressCb !== null && data.length > CHUNK_SIZE) {
85
+ this.writeProgressCb(done, data.length);
86
+ }
87
+ }
88
+ },
89
+ sleepMs: (ms) => this.sleepImpl(ms),
90
+ };
91
+ constructor(transport, opts) {
92
+ super(transport, opts);
93
+ this.sleepImpl = opts?.sleepImpl ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
94
+ }
95
+ // ── lifecycle ──────────────────────────────────────────────────────────────
96
+ /** The underlying ULD driver (escape hatch for advanced DCI access). */
97
+ get uld() {
98
+ if (this.uldDriver === null)
99
+ throw new DepzError("call init() first");
100
+ return this.uldDriver;
101
+ }
102
+ /** 'cx' | 'ch' (valid after init()). */
103
+ get variant() {
104
+ return this.uld.variant;
105
+ }
106
+ async isAlive() {
107
+ try {
108
+ await readDeviceRevisionId(this.platform);
109
+ return true;
110
+ }
111
+ catch (err) {
112
+ if (err instanceof Vl53l8cxError || err instanceof DepzError)
113
+ return false;
114
+ throw err;
115
+ }
116
+ }
117
+ /**
118
+ * Initialize the sensor: firmware blob download + default config.
119
+ *
120
+ * The blob variant is fixed by the class (`Vl53l8Cx` → 'cx', `Vl53l8Ch` →
121
+ * 'ch'); `variant` is accepted only for backward compatibility and must
122
+ * match the class variant when given. Assets are loaded lazily (dynamic
123
+ * import) so the blobs stay out of bundles that never init the ToF.
124
+ */
125
+ async init(variant, opts) {
126
+ if (variant !== undefined && variant !== this.variantId) {
127
+ throw new DepzError(`${this.constructor.name} loads the '${this.variantId}' firmware blob; ` +
128
+ "use Vl53l8Ch for 'ch'");
129
+ }
130
+ const assets = await loadAssets(this.variantId);
131
+ this.writeProgressCb = opts?.writeProgress ?? null;
132
+ try {
133
+ const driver = new VL53L8CX(this.platform, assets, this.variantId);
134
+ await driver.init(opts?.progress);
135
+ this.uldDriver = driver;
136
+ }
137
+ finally {
138
+ this.writeProgressCb = null;
139
+ }
140
+ }
141
+ // ── configuration (init() first; not while ranging) ─────────────────────────
142
+ async getResolution() {
143
+ this.resolution = await this.uld.getResolution();
144
+ return this.resolution;
145
+ }
146
+ async setResolution(zones) {
147
+ if (zones !== RESOLUTION_4X4 && zones !== RESOLUTION_8X8) {
148
+ throw new DepzError("resolution is 16 (4x4) or 64 (8x8) zones");
149
+ }
150
+ this.requireNotRanging();
151
+ await this.uld.setResolution(zones);
152
+ this.resolution = zones;
153
+ }
154
+ getRangingFrequencyHz() {
155
+ return this.uld.getRangingFrequencyHz();
156
+ }
157
+ async setRangingFrequencyHz(hz) {
158
+ if (hz < MIN_RANGING_FREQUENCY_HZ) {
159
+ throw new DepzError(`ranging frequency must be >= ${MIN_RANGING_FREQUENCY_HZ} Hz: below that ` +
160
+ "the sensor never enters its ranging loop and streams nothing (contract 04)");
161
+ }
162
+ this.requireNotRanging();
163
+ await this.uld.setRangingFrequencyHz(hz);
164
+ }
165
+ getRangingMode() {
166
+ return this.uld.getRangingMode();
167
+ }
168
+ async setRangingMode(mode) {
169
+ this.requireNotRanging();
170
+ await this.uld.setRangingMode(mode);
171
+ }
172
+ getIntegrationTimeMs() {
173
+ return this.uld.getIntegrationTimeMs();
174
+ }
175
+ async setIntegrationTimeMs(ms) {
176
+ this.requireNotRanging();
177
+ await this.uld.setIntegrationTimeMs(ms);
178
+ }
179
+ getSharpenerPercent() {
180
+ return this.uld.getSharpenerPercent();
181
+ }
182
+ async setSharpenerPercent(pct) {
183
+ this.requireNotRanging();
184
+ await this.uld.setSharpenerPercent(pct);
185
+ }
186
+ getTargetOrder() {
187
+ return this.uld.getTargetOrder();
188
+ }
189
+ async setTargetOrder(order) {
190
+ this.requireNotRanging();
191
+ await this.uld.setTargetOrder(order);
192
+ }
193
+ // ── advanced features (UM3109; init() first, not while ranging) ─────────────
194
+ /** POWER_MODE_SLEEP/WAKEUP/DEEP_SLEEP (uld constants). */
195
+ getPowerMode() {
196
+ return this.uld.getPowerMode();
197
+ }
198
+ /**
199
+ * Enter sleep / wake / deep-sleep. Not while ranging. Waking from
200
+ * DEEP_SLEEP re-downloads the firmware blob (init()).
201
+ */
202
+ async setPowerMode(mode) {
203
+ this.requireNotRanging();
204
+ await this.uld.setPowerMode(mode);
205
+ }
206
+ getXtalkMargin() {
207
+ return this.uld.getXtalkMargin();
208
+ }
209
+ async setXtalkMargin(marginKcps) {
210
+ this.requireNotRanging();
211
+ await this.uld.setXtalkMargin(marginKcps);
212
+ }
213
+ /**
214
+ * Run on-device crosstalk calibration against a flat target at
215
+ * `distanceMm` with the given `reflectancePercent` (1..99) averaging
216
+ * `nbSamples` (1..16). The result is captured into the xtalk buffer; read
217
+ * it back with getCaldataXtalk(). Blocks several seconds.
218
+ */
219
+ async calibrateXtalk(reflectancePercent, nbSamples, distanceMm) {
220
+ this.requireNotRanging();
221
+ await this.uld.calibrateXtalk(reflectancePercent, nbSamples, distanceMm);
222
+ }
223
+ /** Read back the 776-byte xtalk calibration blob (save/restore). */
224
+ async getCaldataXtalk() {
225
+ this.requireNotRanging();
226
+ return this.uld.getCaldataXtalk();
227
+ }
228
+ /** Restore a previously saved 776-byte xtalk calibration blob. */
229
+ async setCaldataXtalk(blob) {
230
+ this.requireNotRanging();
231
+ await this.uld.setCaldataXtalk(blob);
232
+ }
233
+ getDetectionThresholdsEnable() {
234
+ return this.uld.getDetectionThresholdsEnable();
235
+ }
236
+ async setDetectionThresholdsEnable(enabled) {
237
+ this.requireNotRanging();
238
+ await this.uld.setDetectionThresholdsEnable(enabled);
239
+ }
240
+ getDetectionThresholds() {
241
+ return this.uld.getDetectionThresholds();
242
+ }
243
+ /**
244
+ * Program the 64 detection thresholds (interrupt-on-threshold). Each entry
245
+ * carries lowThresh, highThresh, measurement, type, zoneNum, operation (see
246
+ * uld THRESH_* constants).
247
+ */
248
+ async setDetectionThresholds(thresholds) {
249
+ this.requireNotRanging();
250
+ await this.uld.setDetectionThresholds(thresholds);
251
+ }
252
+ async setDetectionThresholdsAutoStop(autoStop) {
253
+ this.requireNotRanging();
254
+ await this.uld.setDetectionThresholdsAutoStop(autoStop);
255
+ }
256
+ /**
257
+ * Enable the motion indicator over [distanceMinMm, distanceMaxMm] and
258
+ * surface motion output in each frame's `.motion`. Returns the underlying
259
+ * uld MotionConfig for advanced tuning.
260
+ */
261
+ async configureMotionIndicator(distanceMinMm = 400, distanceMaxMm = 1500) {
262
+ this.requireNotRanging();
263
+ const resolution = await this.getResolution();
264
+ const cfg = await this.uld.motionIndicatorInit(resolution);
265
+ await this.uld.motionIndicatorSetDistanceMotion(cfg, distanceMinMm, distanceMaxMm);
266
+ return cfg;
267
+ }
268
+ // ── ranging ──────────────────────────────────────────────────────────────────
269
+ /** Configure the output list, start the sensor and the MCU stream. */
270
+ async startRanging() {
271
+ this.requireNotRanging();
272
+ const cnhSize = this.cnhConfig !== null ? this.cnhConfig.requiredMemory() : null;
273
+ await this.getResolution(); // refresh the cache used for frame shaping
274
+ await this.uld.startRanging(cnhSize);
275
+ const frameSize = this.uld.dataReadSize;
276
+ this.reassembler = new FrameReassembler();
277
+ await this.request(Vl53l8Cmd.StartStream, packStartStream(frameSize), {
278
+ okCompletes: true,
279
+ });
280
+ this.rangingFlag = true;
281
+ }
282
+ async stopRanging() {
283
+ if (!this.rangingFlag)
284
+ return;
285
+ await this.request(Vl53l8Cmd.StopStream, undefined, { okCompletes: true });
286
+ this.rangingFlag = false;
287
+ await this.uld.stopRanging();
288
+ }
289
+ get ranging() {
290
+ return this.rangingFlag;
291
+ }
292
+ /** Subscribe to parsed frames (read-pump context; don't block). */
293
+ onFrame(cb) {
294
+ this.frameCbs.push(cb);
295
+ return () => {
296
+ this.frameCbs = this.frameCbs.filter((c) => c !== cb);
297
+ };
298
+ }
299
+ /**
300
+ * Async iterator over parsed frames — bounded, drop-oldest (contract 07
301
+ * §3). Subscribes eagerly at call time — call before or after
302
+ * startRanging(); it ends when the device closes or the consumer breaks
303
+ * out of iteration.
304
+ */
305
+ frames(maxsize = 8) {
306
+ const queue = new StreamQueue(maxsize, () => {
307
+ this.frameQueues = this.frameQueues.filter((q) => q !== queue);
308
+ deregister();
309
+ });
310
+ this.frameQueues.push(queue);
311
+ const deregister = this.registerStream(queue);
312
+ return queue;
313
+ }
314
+ /** Convenience: wait for the next frame. */
315
+ async getFrame(timeoutMs = 2000) {
316
+ const queue = new StreamQueue(1);
317
+ this.frameQueues.push(queue);
318
+ // Register for teardown so a disconnect closes the queue promptly (the
319
+ // wait resolves `done` at once) instead of stalling until the timeout.
320
+ const deregister = this.registerStream(queue);
321
+ let timer;
322
+ try {
323
+ const result = await Promise.race([
324
+ queue.next(),
325
+ new Promise((_, reject) => {
326
+ timer = setTimeout(() => reject(new DepzTimeoutError(Vl53l8Rpt.Vl53Frame, timeoutMs)), timeoutMs);
327
+ }),
328
+ ]);
329
+ if (result.done === true)
330
+ throw new DepzError("device closed");
331
+ return result.value;
332
+ }
333
+ finally {
334
+ if (timer !== undefined)
335
+ clearTimeout(timer);
336
+ this.frameQueues = this.frameQueues.filter((q) => q !== queue);
337
+ deregister();
338
+ }
339
+ }
340
+ // ── internal ─────────────────────────────────────────────────────────────────
341
+ requireNotRanging() {
342
+ if (this.rangingFlag) {
343
+ throw new DepzError("stopRanging() first — the stream owns the register bank");
344
+ }
345
+ }
346
+ handleReport(pkt) {
347
+ if (pkt.cmd !== Vl53l8Rpt.Vl53Frame || pkt.payload.length < 12) {
348
+ return false;
349
+ }
350
+ const done = this.reassembler.feed(unpackFrameChunk(pkt.payload));
351
+ if (done === null)
352
+ return true;
353
+ if (this.uldDriver === null)
354
+ return true;
355
+ let parsed;
356
+ try {
357
+ parsed = this.uldDriver.parseFrame(done.frame);
358
+ }
359
+ catch {
360
+ this.reassembler.discarded += 1;
361
+ return true;
362
+ }
363
+ const frame = this.toFrame(done.timestampUs, parsed);
364
+ for (const cb of [...this.frameCbs])
365
+ cb(frame);
366
+ for (const q of [...this.frameQueues])
367
+ q.push(frame);
368
+ return true;
369
+ }
370
+ toFrame(timestampUs, parsed) {
371
+ return {
372
+ timestampUs,
373
+ resolution: this.resolution,
374
+ distanceMm: Int32Array.from(parsed.distanceMm),
375
+ targetStatus: Uint8Array.from(parsed.targetStatus),
376
+ nbTargetDetected: Uint8Array.from(parsed.nbTargetDetected),
377
+ signalPerSpad: Float64Array.from(parsed.signalPerSpad),
378
+ ambientPerSpad: Float64Array.from(parsed.ambientPerSpad),
379
+ nbSpadsEnabled: Int32Array.from(parsed.nbSpadsEnabled),
380
+ rangeSigmaMm: Float64Array.from(parsed.rangeSigmaMm),
381
+ reflectance: Uint8Array.from(parsed.reflectance),
382
+ siliconTempDegc: parsed.siliconTempDegc,
383
+ cnhRaw: parsed.cnhRaw,
384
+ motion: parsed.motion,
385
+ };
386
+ }
387
+ }
388
+ /**
389
+ * VL53L8CH device: the VL53L8CX superset. Inherits every CX method and adds
390
+ * Compact-Network-Histogram (CNH) output. `init()` downloads the CH firmware
391
+ * blob (VL53LMZ ULD 2.0.16). CNH is the reason to run CH firmware: each frame
392
+ * can additionally carry a per-aggregate distance histogram.
393
+ */
394
+ export class Vl53l8Ch extends Vl53l8Cx {
395
+ variantId = "ch";
396
+ /**
397
+ * Arm the CNH histogram block for the next startRanging(). CH only — this
398
+ * method does not exist on Vl53l8Cx.
399
+ */
400
+ async configureCnh(config) {
401
+ this.requireNotRanging();
402
+ await this.uld.dciWriteData(MI_CFG_DEV_IDX, config.pack());
403
+ this.cnhConfig = config;
404
+ }
405
+ }
406
+ /**
407
+ * Backward-compatible alias: the old flat `Vl53l8` name maps to the CX base
408
+ * class (the historic default). New code should pick Vl53l8Cx / Vl53l8Ch.
409
+ */
410
+ export const Vl53l8 = Vl53l8Cx;
411
+ //# sourceMappingURL=vl53l8.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vl53l8.js","sourceRoot":"","sources":["../../../src/sensors/vl53l8/vl53l8.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /** In-memory transport pair for tests. */
2
+ import type { SerialTransport, SerialTransportInfo } from "./types.js";
3
+ export declare class LoopbackTransport implements SerialTransport {
4
+ readonly info: SerialTransportInfo;
5
+ peer: LoopbackTransport | null;
6
+ private queue;
7
+ private waiter;
8
+ private closed;
9
+ private disconnectCbs;
10
+ static pair(): [LoopbackTransport, LoopbackTransport];
11
+ open(): Promise<void>;
12
+ write(data: Uint8Array): Promise<void>;
13
+ private deliver;
14
+ readable(): AsyncIterableIterator<Uint8Array>;
15
+ close(): Promise<void>;
16
+ onDisconnect(cb: () => void): () => void;
17
+ }
18
+ //# sourceMappingURL=loopback.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopback.d.ts","sourceRoot":"","sources":["../../src/transport/loopback.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAE1C,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEvE,qBAAa,iBAAkB,YAAW,eAAe;IACvD,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAwB;IAC1D,IAAI,EAAE,iBAAiB,GAAG,IAAI,CAAQ;IAEtC,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,aAAa,CAAyB;IAE9C,MAAM,CAAC,IAAI,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAQ/C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAErB,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK5C,OAAO,CAAC,OAAO;IAKR,QAAQ,IAAI,qBAAqB,CAAC,UAAU,CAAC;IAW9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,YAAY,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;CAMzC"}
@@ -0,0 +1,53 @@
1
+ /** In-memory transport pair for tests. */
2
+ export class LoopbackTransport {
3
+ info = { path: "loopback" };
4
+ peer = null;
5
+ queue = [];
6
+ waiter = null;
7
+ closed = false;
8
+ disconnectCbs = [];
9
+ static pair() {
10
+ const a = new LoopbackTransport();
11
+ const b = new LoopbackTransport();
12
+ a.peer = b;
13
+ b.peer = a;
14
+ return [a, b];
15
+ }
16
+ async open() { }
17
+ async write(data) {
18
+ if (this.closed)
19
+ throw new Error("loopback transport closed");
20
+ this.peer?.deliver(data.slice());
21
+ }
22
+ deliver(data) {
23
+ this.queue.push(data);
24
+ this.waiter?.();
25
+ }
26
+ async *readable() {
27
+ for (;;) {
28
+ while (this.queue.length === 0) {
29
+ if (this.closed)
30
+ return;
31
+ await new Promise((resolve) => (this.waiter = resolve));
32
+ this.waiter = null;
33
+ }
34
+ yield this.queue.shift();
35
+ }
36
+ }
37
+ async close() {
38
+ for (const side of [this, this.peer]) {
39
+ if (side && !side.closed) {
40
+ side.closed = true;
41
+ side.waiter?.();
42
+ side.disconnectCbs.forEach((cb) => cb());
43
+ }
44
+ }
45
+ }
46
+ onDisconnect(cb) {
47
+ this.disconnectCbs.push(cb);
48
+ return () => {
49
+ this.disconnectCbs = this.disconnectCbs.filter((c) => c !== cb);
50
+ };
51
+ }
52
+ }
53
+ //# sourceMappingURL=loopback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loopback.js","sourceRoot":"","sources":["../../src/transport/loopback.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAI1C,MAAM,OAAO,iBAAiB;IACnB,IAAI,GAAwB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;IAC1D,IAAI,GAA6B,IAAI,CAAC;IAE9B,KAAK,GAAiB,EAAE,CAAC;IACzB,MAAM,GAAwB,IAAI,CAAC;IACnC,MAAM,GAAG,KAAK,CAAC;IACf,aAAa,GAAsB,EAAE,CAAC;IAE9C,MAAM,CAAC,IAAI;QACT,MAAM,CAAC,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAClC,MAAM,CAAC,GAAG,IAAI,iBAAiB,EAAE,CAAC;QAClC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACX,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;QACX,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,IAAI,KAAmB,CAAC;IAE9B,KAAK,CAAC,KAAK,CAAC,IAAgB;QAC1B,IAAI,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC9D,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACnC,CAAC;IAEO,OAAO,CAAC,IAAgB;QAC9B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,CAAC,QAAQ;QACb,SAAS,CAAC;YACR,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC/B,IAAI,IAAI,CAAC,MAAM;oBAAE,OAAO;gBACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;gBAC9D,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACrB,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK;QACT,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACzB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;gBACnB,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;gBAChB,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;IAED,YAAY,CAAC,EAAc;QACzB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Node.js transport over the optional `serialport` peer dependency.
3
+ * Import via `@depz/sensor-sdk/node` only — never from the root export, so
4
+ * browser bundles stay serialport-free.
5
+ */
6
+ import { type DeviceInfo, type ListOptions, type OpenDeviceOptions, type OpenTarget } from "../discovery.js";
7
+ import type { DepzDevice } from "../device/device.js";
8
+ import type { SerialTransport, SerialTransportInfo } from "./types.js";
9
+ /** Enumerate system serial ports (Node only). */
10
+ export declare function listSerialPorts(): Promise<Array<{
11
+ path: string;
12
+ serialNumber?: string;
13
+ vendorId?: string;
14
+ productId?: string;
15
+ }>>;
16
+ export declare class NodeSerialTransport implements SerialTransport {
17
+ private path;
18
+ readonly info: SerialTransportInfo;
19
+ private port;
20
+ private queue;
21
+ private waiter;
22
+ private ended;
23
+ private disconnectCbs;
24
+ constructor(path: string, serialNumber?: string);
25
+ open(opts?: {
26
+ baudRate?: number;
27
+ }): Promise<void>;
28
+ private end;
29
+ write(data: Uint8Array): Promise<void>;
30
+ readable(): AsyncIterableIterator<Uint8Array>;
31
+ close(): Promise<void>;
32
+ onDisconnect(cb: () => void): () => void;
33
+ }
34
+ /**
35
+ * Enumerate DEPZ devices on the system's serial ports (Node only).
36
+ *
37
+ * With `matchUsb` (default) only ports carrying a known DEPZ (vid,pid) are
38
+ * probed — fast, and it never pokes unrelated ports. Set `matchUsb: false`
39
+ * for a legacy probe-everything scan.
40
+ */
41
+ export declare function listDepzDevices(opts?: ListOptions): Promise<DeviceInfo[]>;
42
+ /**
43
+ * Open the right sensor class for `target` over `serialport` (Node only).
44
+ *
45
+ * `target` is a port path (string), a candidate index (number, sorted by USB
46
+ * iSerial), a `DeviceInfo` from `listDepzDevices()`, or omitted for the
47
+ * lowest-serial candidate. Throws `NoDepzDeviceError` when nothing matches —
48
+ * it never grabs an arbitrary system port. See {@link openDeviceFrom}.
49
+ */
50
+ export declare function openDevice(target?: OpenTarget, opts?: OpenDeviceOptions): Promise<DepzDevice>;
51
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/transport/node.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAGL,KAAK,UAAU,EAEf,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAkCvE,iDAAiD;AACjD,wBAAsB,eAAe,IAAI,OAAO,CAC9C,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CACtF,CAGA;AAED,qBAAa,mBAAoB,YAAW,eAAe;IAQ7C,OAAO,CAAC,IAAI;IAPxB,QAAQ,CAAC,IAAI,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,IAAI,CAA+B;IAC3C,OAAO,CAAC,KAAK,CAAoB;IACjC,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,aAAa,CAAyB;gBAE1B,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM;IAIjD,IAAI,CAAC,IAAI,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAmBvD,OAAO,CAAC,GAAG;IASL,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAQrC,QAAQ,IAAI,qBAAqB,CAAC,UAAU,CAAC;IAW9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,YAAY,CAAC,EAAE,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI;CAMzC;AAqBD;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,IAAI,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAGnF;AAED;;;;;;;GAOG;AACH,wBAAsB,UAAU,CAC9B,MAAM,CAAC,EAAE,UAAU,EACnB,IAAI,GAAE,iBAAsB,GAC3B,OAAO,CAAC,UAAU,CAAC,CAGrB"}