@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.
- package/README.md +69 -0
- package/dist/dataset.d.ts +93 -0
- package/dist/dataset.d.ts.map +1 -0
- package/dist/dataset.js +253 -0
- package/dist/dataset.js.map +1 -0
- package/dist/device/device.d.ts +185 -0
- package/dist/device/device.d.ts.map +1 -0
- package/dist/device/device.js +421 -0
- package/dist/device/device.js.map +1 -0
- package/dist/device/link.d.ts +62 -0
- package/dist/device/link.d.ts.map +1 -0
- package/dist/device/link.js +130 -0
- package/dist/device/link.js.map +1 -0
- package/dist/discovery.d.ts +109 -0
- package/dist/discovery.d.ts.map +1 -0
- package/dist/discovery.js +281 -0
- package/dist/discovery.js.map +1 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +69 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/protocol/bno086.d.ts +36 -0
- package/dist/protocol/bno086.d.ts.map +1 -0
- package/dist/protocol/bno086.js +38 -0
- package/dist/protocol/bno086.js.map +1 -0
- package/dist/protocol/common.d.ts +103 -0
- package/dist/protocol/common.d.ts.map +1 -0
- package/dist/protocol/common.js +121 -0
- package/dist/protocol/common.js.map +1 -0
- package/dist/protocol/crc.d.ts +17 -0
- package/dist/protocol/crc.d.ts.map +1 -0
- package/dist/protocol/crc.js +55 -0
- package/dist/protocol/crc.js.map +1 -0
- package/dist/protocol/framing.d.ts +65 -0
- package/dist/protocol/framing.d.ts.map +1 -0
- package/dist/protocol/framing.js +152 -0
- package/dist/protocol/framing.js.map +1 -0
- package/dist/protocol/fwdepz.d.ts +21 -0
- package/dist/protocol/fwdepz.d.ts.map +1 -0
- package/dist/protocol/fwdepz.js +46 -0
- package/dist/protocol/fwdepz.js.map +1 -0
- package/dist/protocol/identity.d.ts +14 -0
- package/dist/protocol/identity.d.ts.map +1 -0
- package/dist/protocol/identity.js +28 -0
- package/dist/protocol/identity.js.map +1 -0
- package/dist/protocol/sr04.d.ts +38 -0
- package/dist/protocol/sr04.d.ts.map +1 -0
- package/dist/protocol/sr04.js +58 -0
- package/dist/protocol/sr04.js.map +1 -0
- package/dist/protocol/usb-ids.d.ts +60 -0
- package/dist/protocol/usb-ids.d.ts.map +1 -0
- package/dist/protocol/usb-ids.js +79 -0
- package/dist/protocol/usb-ids.js.map +1 -0
- package/dist/protocol/vl53l8.d.ts +59 -0
- package/dist/protocol/vl53l8.d.ts.map +1 -0
- package/dist/protocol/vl53l8.js +116 -0
- package/dist/protocol/vl53l8.js.map +1 -0
- package/dist/sensors/bno086/bno086.d.ts +197 -0
- package/dist/sensors/bno086/bno086.d.ts.map +1 -0
- package/dist/sensors/bno086/bno086.js +543 -0
- package/dist/sensors/bno086/bno086.js.map +1 -0
- package/dist/sensors/bno086/reports.d.ts +289 -0
- package/dist/sensors/bno086/reports.d.ts.map +1 -0
- package/dist/sensors/bno086/reports.js +397 -0
- package/dist/sensors/bno086/reports.js.map +1 -0
- package/dist/sensors/bno086/sh2.d.ts +307 -0
- package/dist/sensors/bno086/sh2.d.ts.map +1 -0
- package/dist/sensors/bno086/sh2.js +480 -0
- package/dist/sensors/bno086/sh2.js.map +1 -0
- package/dist/sensors/bno086/shtp.d.ts +98 -0
- package/dist/sensors/bno086/shtp.d.ts.map +1 -0
- package/dist/sensors/bno086/shtp.js +205 -0
- package/dist/sensors/bno086/shtp.js.map +1 -0
- package/dist/sensors/sr04.d.ts +65 -0
- package/dist/sensors/sr04.d.ts.map +1 -0
- package/dist/sensors/sr04.js +121 -0
- package/dist/sensors/sr04.js.map +1 -0
- package/dist/sensors/vl53l8/assets/ch.d.ts +16 -0
- package/dist/sensors/vl53l8/assets/ch.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/ch.js +22 -0
- package/dist/sensors/vl53l8/assets/ch.js.map +1 -0
- package/dist/sensors/vl53l8/assets/cx.d.ts +16 -0
- package/dist/sensors/vl53l8/assets/cx.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/cx.js +22 -0
- package/dist/sensors/vl53l8/assets/cx.js.map +1 -0
- package/dist/sensors/vl53l8/assets/decode.d.ts +7 -0
- package/dist/sensors/vl53l8/assets/decode.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/decode.js +35 -0
- package/dist/sensors/vl53l8/assets/decode.js.map +1 -0
- package/dist/sensors/vl53l8/assets/index.d.ts +19 -0
- package/dist/sensors/vl53l8/assets/index.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/index.js +11 -0
- package/dist/sensors/vl53l8/assets/index.js.map +1 -0
- package/dist/sensors/vl53l8/cnh.d.ts +113 -0
- package/dist/sensors/vl53l8/cnh.d.ts.map +1 -0
- package/dist/sensors/vl53l8/cnh.js +299 -0
- package/dist/sensors/vl53l8/cnh.js.map +1 -0
- package/dist/sensors/vl53l8/uld.d.ts +346 -0
- package/dist/sensors/vl53l8/uld.d.ts.map +1 -0
- package/dist/sensors/vl53l8/uld.js +1388 -0
- package/dist/sensors/vl53l8/uld.js.map +1 -0
- package/dist/sensors/vl53l8/vl53l8.d.ts +182 -0
- package/dist/sensors/vl53l8/vl53l8.d.ts.map +1 -0
- package/dist/sensors/vl53l8/vl53l8.js +411 -0
- package/dist/sensors/vl53l8/vl53l8.js.map +1 -0
- package/dist/transport/loopback.d.ts +18 -0
- package/dist/transport/loopback.d.ts.map +1 -0
- package/dist/transport/loopback.js +53 -0
- package/dist/transport/loopback.js.map +1 -0
- package/dist/transport/node.d.ts +51 -0
- package/dist/transport/node.d.ts.map +1 -0
- package/dist/transport/node.js +123 -0
- package/dist/transport/node.js.map +1 -0
- package/dist/transport/replay.d.ts +68 -0
- package/dist/transport/replay.d.ts.map +1 -0
- package/dist/transport/replay.js +196 -0
- package/dist/transport/replay.js.map +1 -0
- package/dist/transport/types.d.ts +23 -0
- package/dist/transport/types.d.ts.map +1 -0
- package/dist/transport/types.js +7 -0
- package/dist/transport/types.js.map +1 -0
- package/dist/transport/webserial.d.ts +69 -0
- package/dist/transport/webserial.d.ts.map +1 -0
- package/dist/transport/webserial.js +196 -0
- package/dist/transport/webserial.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SHTP framing layer for the BNO086 (contracts/05_SENSOR_BNO086.md §3).
|
|
3
|
+
*
|
|
4
|
+
* Pure codec — no I/O. A frame is a 4-byte header plus a cargo fragment:
|
|
5
|
+
*
|
|
6
|
+
* length u16 LE — bits 14:0 cargo length *including* the 4-byte header;
|
|
7
|
+
* bit 15 set marks a continuation fragment
|
|
8
|
+
* channel u8 — see ShtpChannel
|
|
9
|
+
* seq u8 — per-channel, per-direction free-running counter
|
|
10
|
+
*
|
|
11
|
+
* For a cargo that spans several bridge frames, the first fragment's length
|
|
12
|
+
* field carries the TOTAL cargo length (header included) even though the
|
|
13
|
+
* frame itself holds fewer bytes; each continuation fragment carries the
|
|
14
|
+
* remaining length (its own header included) with bit 15 set. The receiver
|
|
15
|
+
* trusts the first fragment's total and the actual frame sizes; continuation
|
|
16
|
+
* length fields are informative only.
|
|
17
|
+
*
|
|
18
|
+
* Mirrors the Python reference `depz_sensor_sdk.bno086.shtp`.
|
|
19
|
+
*/
|
|
20
|
+
export var ShtpChannel;
|
|
21
|
+
(function (ShtpChannel) {
|
|
22
|
+
/** SHTP command channel (advertisements). */
|
|
23
|
+
ShtpChannel[ShtpChannel["Command"] = 0] = "Command";
|
|
24
|
+
/** Device executable: reset/on/sleep; RX 0x01 = reset done. */
|
|
25
|
+
ShtpChannel[ShtpChannel["Executable"] = 1] = "Executable";
|
|
26
|
+
/** SH-2 control: feature/FRS/command reports. */
|
|
27
|
+
ShtpChannel[ShtpChannel["Control"] = 2] = "Control";
|
|
28
|
+
/** Non-wake input reports (0xFB timebase + sensors). */
|
|
29
|
+
ShtpChannel[ShtpChannel["InputNormal"] = 3] = "InputNormal";
|
|
30
|
+
/** Wake input reports (same cargo format as channel 3). */
|
|
31
|
+
ShtpChannel[ShtpChannel["InputWake"] = 4] = "InputWake";
|
|
32
|
+
/** Gyro-integrated rotation vector, dense format. */
|
|
33
|
+
ShtpChannel[ShtpChannel["GyroRv"] = 5] = "GyroRv";
|
|
34
|
+
})(ShtpChannel || (ShtpChannel = {}));
|
|
35
|
+
export const SHTP_HEADER_SIZE = 4;
|
|
36
|
+
export const LENGTH_MASK = 0x7fff;
|
|
37
|
+
export const CONTINUATION_BIT = 0x8000;
|
|
38
|
+
export const NUM_CHANNELS = 6;
|
|
39
|
+
/** Host->sensor frames must fit one MCU transmit slot (ERRATA E2: 2 x 64 B). */
|
|
40
|
+
export const MAX_TX_FRAME = 64;
|
|
41
|
+
export function packShtpHeader(hdr) {
|
|
42
|
+
const word = (hdr.length & LENGTH_MASK) | (hdr.continuation ? CONTINUATION_BIT : 0);
|
|
43
|
+
const out = new Uint8Array(SHTP_HEADER_SIZE);
|
|
44
|
+
const v = new DataView(out.buffer);
|
|
45
|
+
v.setUint16(0, word, true);
|
|
46
|
+
v.setUint8(2, hdr.channel);
|
|
47
|
+
v.setUint8(3, hdr.seq);
|
|
48
|
+
return out;
|
|
49
|
+
}
|
|
50
|
+
export function unpackShtpHeader(data) {
|
|
51
|
+
const v = new DataView(data.buffer, data.byteOffset, data.byteLength);
|
|
52
|
+
const word = v.getUint16(0, true);
|
|
53
|
+
return {
|
|
54
|
+
length: word & LENGTH_MASK,
|
|
55
|
+
channel: v.getUint8(2),
|
|
56
|
+
seq: v.getUint8(3),
|
|
57
|
+
continuation: (word & CONTINUATION_BIT) !== 0,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Single-fragment frame: length = header + payload. */
|
|
61
|
+
export function buildFrame(channel, payload, seq) {
|
|
62
|
+
const hdr = packShtpHeader({
|
|
63
|
+
length: SHTP_HEADER_SIZE + payload.length,
|
|
64
|
+
channel,
|
|
65
|
+
seq: seq & 0xff,
|
|
66
|
+
continuation: false,
|
|
67
|
+
});
|
|
68
|
+
const out = new Uint8Array(hdr.length + payload.length);
|
|
69
|
+
out.set(hdr, 0);
|
|
70
|
+
out.set(payload, hdr.length);
|
|
71
|
+
return out;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Split a cargo into wire frames of at most `maxFrame` bytes.
|
|
75
|
+
*
|
|
76
|
+
* First fragment advertises the TOTAL cargo length; continuations carry the
|
|
77
|
+
* remaining length with the continuation bit set. seq increments per frame.
|
|
78
|
+
*/
|
|
79
|
+
export function fragmentCargo(channel, payload, seqStart, maxFrame = MAX_TX_FRAME) {
|
|
80
|
+
if (maxFrame <= SHTP_HEADER_SIZE) {
|
|
81
|
+
throw new Error("maxFrame must exceed the 4-byte SHTP header");
|
|
82
|
+
}
|
|
83
|
+
const room = maxFrame - SHTP_HEADER_SIZE;
|
|
84
|
+
const frames = [];
|
|
85
|
+
let off = 0;
|
|
86
|
+
let seq = seqStart & 0xff;
|
|
87
|
+
const total = SHTP_HEADER_SIZE + payload.length;
|
|
88
|
+
for (;;) {
|
|
89
|
+
const chunk = payload.subarray(off, off + room);
|
|
90
|
+
const remaining = total - off; // includes one header
|
|
91
|
+
const hdr = packShtpHeader({ length: remaining, channel, seq, continuation: off > 0 });
|
|
92
|
+
const frame = new Uint8Array(hdr.length + chunk.length);
|
|
93
|
+
frame.set(hdr, 0);
|
|
94
|
+
frame.set(chunk, hdr.length);
|
|
95
|
+
frames.push(frame);
|
|
96
|
+
off += chunk.length;
|
|
97
|
+
seq = (seq + 1) & 0xff;
|
|
98
|
+
if (off >= payload.length)
|
|
99
|
+
return frames;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function emptyRx() {
|
|
103
|
+
return { chunks: [], received: 0, expected: 0, seq: 0 };
|
|
104
|
+
}
|
|
105
|
+
function concatChunks(chunks, total) {
|
|
106
|
+
const out = new Uint8Array(total);
|
|
107
|
+
let off = 0;
|
|
108
|
+
for (const c of chunks) {
|
|
109
|
+
out.set(c, off);
|
|
110
|
+
off += c.length;
|
|
111
|
+
}
|
|
112
|
+
return out;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Per-channel TX sequence counters + RX cargo reassembly.
|
|
116
|
+
*
|
|
117
|
+
* Feed every inbound frame (the RPT_DATA payload after cmd/timestamp) to
|
|
118
|
+
* `feed()`; it returns a completed ShtpCargo or null. Build outbound frames
|
|
119
|
+
* with `nextFrame()` which consumes the channel's TX seq. The device layer
|
|
120
|
+
* serializes access.
|
|
121
|
+
*/
|
|
122
|
+
export class ShtpLayer {
|
|
123
|
+
/** Incomplete cargos thrown away. */
|
|
124
|
+
discarded = 0;
|
|
125
|
+
txSeqs = new Array(NUM_CHANNELS).fill(0);
|
|
126
|
+
rx = Array.from({ length: NUM_CHANNELS }, emptyRx);
|
|
127
|
+
// ── TX ─────────────────────────────────────────────────────────────────────
|
|
128
|
+
/**
|
|
129
|
+
* Build a single-fragment frame, consuming the channel's TX seq.
|
|
130
|
+
*
|
|
131
|
+
* Host-side cargos always fit one MCU slot (control payloads are <= 21
|
|
132
|
+
* bytes); larger payloads are a caller bug.
|
|
133
|
+
*/
|
|
134
|
+
nextFrame(channel, payload) {
|
|
135
|
+
if (SHTP_HEADER_SIZE + payload.length > MAX_TX_FRAME) {
|
|
136
|
+
throw new Error(`TX cargo ${payload.length}B exceeds the ${MAX_TX_FRAME}B MCU slot`);
|
|
137
|
+
}
|
|
138
|
+
const seq = this.txSeqs[channel];
|
|
139
|
+
this.txSeqs[channel] = (seq + 1) & 0xff;
|
|
140
|
+
return buildFrame(channel, payload, seq);
|
|
141
|
+
}
|
|
142
|
+
txSeq(channel) {
|
|
143
|
+
return this.txSeqs[channel];
|
|
144
|
+
}
|
|
145
|
+
// ── RX ─────────────────────────────────────────────────────────────────────
|
|
146
|
+
/**
|
|
147
|
+
* Consume one inbound frame; return the cargo when complete.
|
|
148
|
+
*
|
|
149
|
+
* Rules (contract 05 §3): a non-continuation fragment starts a new cargo
|
|
150
|
+
* (discarding any partial one on that channel); a continuation without a
|
|
151
|
+
* cargo in progress is dropped; the cargo completes when the accumulated
|
|
152
|
+
* bytes reach the first fragment's advertised total.
|
|
153
|
+
*/
|
|
154
|
+
feed(frame) {
|
|
155
|
+
if (frame.length < SHTP_HEADER_SIZE)
|
|
156
|
+
return null;
|
|
157
|
+
const hdr = unpackShtpHeader(frame);
|
|
158
|
+
if (hdr.channel >= NUM_CHANNELS || hdr.length < SHTP_HEADER_SIZE) {
|
|
159
|
+
return null; // empty/padding header ("no data" read) or junk
|
|
160
|
+
}
|
|
161
|
+
const chunk = frame.subarray(SHTP_HEADER_SIZE);
|
|
162
|
+
const rx = this.rx[hdr.channel];
|
|
163
|
+
if (!hdr.continuation) {
|
|
164
|
+
if (rx.expected !== 0 && rx.received !== 0)
|
|
165
|
+
this.discarded += 1;
|
|
166
|
+
rx.chunks = [chunk.slice()];
|
|
167
|
+
rx.received = chunk.length;
|
|
168
|
+
rx.expected = hdr.length - SHTP_HEADER_SIZE;
|
|
169
|
+
rx.seq = hdr.seq;
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
if (rx.expected === 0) {
|
|
173
|
+
this.discarded += 1;
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
rx.chunks.push(chunk.slice());
|
|
177
|
+
rx.received += chunk.length;
|
|
178
|
+
}
|
|
179
|
+
if (rx.received < rx.expected)
|
|
180
|
+
return null;
|
|
181
|
+
if (rx.received > rx.expected) {
|
|
182
|
+
// Overrun — junk framing.
|
|
183
|
+
this.discarded += 1;
|
|
184
|
+
rx.chunks = [];
|
|
185
|
+
rx.received = 0;
|
|
186
|
+
rx.expected = 0;
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
const cargo = {
|
|
190
|
+
channel: hdr.channel,
|
|
191
|
+
seq: rx.seq,
|
|
192
|
+
payload: concatChunks(rx.chunks, rx.received),
|
|
193
|
+
};
|
|
194
|
+
rx.chunks = [];
|
|
195
|
+
rx.received = 0;
|
|
196
|
+
rx.expected = 0;
|
|
197
|
+
return cargo;
|
|
198
|
+
}
|
|
199
|
+
/** Forget all TX seq counters and partial cargos (sensor reset). */
|
|
200
|
+
reset() {
|
|
201
|
+
this.txSeqs = new Array(NUM_CHANNELS).fill(0);
|
|
202
|
+
this.rx = Array.from({ length: NUM_CHANNELS }, emptyRx);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=shtp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shtp.js","sourceRoot":"","sources":["../../../src/sensors/bno086/shtp.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SR04 ultrasonic sensor (contracts/03_SENSOR_SR04.md).
|
|
3
|
+
* Mirrors the Python reference `depz_sensor_sdk.sr04.Sr04`.
|
|
4
|
+
*/
|
|
5
|
+
import { DepzDevice, StreamQueue } from "../device/device.js";
|
|
6
|
+
import type { PacketEvent } from "../protocol/framing.js";
|
|
7
|
+
/** One ranging result. `valid` is false for the no-echo timeout sentinel. */
|
|
8
|
+
export interface Sr04Measurement {
|
|
9
|
+
timestampUs: bigint;
|
|
10
|
+
echoTimeUs: number;
|
|
11
|
+
/** "once": host command or SYNC_IN edge; "loop": measurement loop sample. */
|
|
12
|
+
source: "once" | "loop";
|
|
13
|
+
valid: boolean;
|
|
14
|
+
/** Distance at 343 m/s, or null when no echo was received. */
|
|
15
|
+
distanceMm: number | null;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* HC-SR04 ultrasonic ranging device.
|
|
19
|
+
*
|
|
20
|
+
* Measurements stream via callbacks (`onMeasurement`) and/or the pull
|
|
21
|
+
* iterator (`measurements()`); both receive loop samples *and* unsolicited
|
|
22
|
+
* single shots triggered by an AUX SYNC_IN edge (RPT_DATA source cmd 0x36).
|
|
23
|
+
*/
|
|
24
|
+
export declare class Sr04 extends DepzDevice {
|
|
25
|
+
private measureCbs;
|
|
26
|
+
private measureQueues;
|
|
27
|
+
/** Minimum interval between measurement starts (default 50000). */
|
|
28
|
+
getSamplePeriodUs(): Promise<number>;
|
|
29
|
+
/**
|
|
30
|
+
* The effective rate is auto-throttled by the echo window (contract 03
|
|
31
|
+
* §3) — reading back returns the stored value, not the effective one.
|
|
32
|
+
*/
|
|
33
|
+
setSamplePeriodUs(periodUs: number): Promise<void>;
|
|
34
|
+
getEchoDecayUs(): Promise<number>;
|
|
35
|
+
/**
|
|
36
|
+
* Set the settle pause; the device clamps to 4000–65000 µs silently, so
|
|
37
|
+
* this re-reads and returns the value actually in effect.
|
|
38
|
+
*/
|
|
39
|
+
setEchoDecayUs(decayUs: number): Promise<number>;
|
|
40
|
+
/**
|
|
41
|
+
* Single shot. Rejects with BusyError while the loop is running. The
|
|
42
|
+
* reply arrives only when the echo completes (or times out at ~65.5 ms),
|
|
43
|
+
* so the default timeout is generous.
|
|
44
|
+
*/
|
|
45
|
+
measureOnce(timeoutMs?: number): Promise<Sr04Measurement>;
|
|
46
|
+
/** Start the measurement loop (idempotent). */
|
|
47
|
+
start(): Promise<void>;
|
|
48
|
+
/** Stop the measurement loop (idempotent). */
|
|
49
|
+
stop(): Promise<void>;
|
|
50
|
+
/**
|
|
51
|
+
* Subscribe to measurements (read-pump context; don't block). Returns an
|
|
52
|
+
* unsubscribe function.
|
|
53
|
+
*/
|
|
54
|
+
onMeasurement(cb: (m: Sr04Measurement) => void): () => void;
|
|
55
|
+
/**
|
|
56
|
+
* Async iterator over measurements — bounded, drop-oldest (contract 07
|
|
57
|
+
* §3). The returned queue exposes `droppedCount`; it ends when the device
|
|
58
|
+
* closes or the consumer breaks out of iteration.
|
|
59
|
+
*/
|
|
60
|
+
measurements(maxsize?: number): StreamQueue<Sr04Measurement>;
|
|
61
|
+
/** Drop counters of all live measurement queues (diagnostics). */
|
|
62
|
+
get streamDroppedCounts(): number[];
|
|
63
|
+
protected handleReport(pkt: PacketEvent): boolean;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=sr04.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sr04.d.ts","sourceRoot":"","sources":["../../src/sensors/sr04.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAY,WAAW,EAAgB,MAAM,qBAAqB,CAAC;AACtF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAc1D,6EAA6E;AAC7E,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,KAAK,EAAE,OAAO,CAAC;IACf,8DAA8D;IAC9D,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAYD;;;;;;GAMG;AACH,qBAAa,IAAK,SAAQ,UAAU;IAClC,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,aAAa,CAAsC;IAI3D,mEAAmE;IACnE,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC;IAMpC;;;OAGG;IACG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMxD,cAAc,IAAI,OAAO,CAAC,MAAM,CAAC;IAMjC;;;OAGG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAOtD;;;;OAIG;IACH,WAAW,CAAC,SAAS,SAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAUvD,+CAA+C;IACzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,8CAA8C;IACxC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAI3B;;;OAGG;IACH,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,eAAe,KAAK,IAAI,GAAG,MAAM,IAAI;IAO3D;;;;OAIG;IACH,YAAY,CAAC,OAAO,SAAM,GAAG,WAAW,CAAC,eAAe,CAAC;IAUzD,kEAAkE;IAClE,IAAI,mBAAmB,IAAI,MAAM,EAAE,CAElC;cAIkB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO;CAS3D"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SR04 ultrasonic sensor (contracts/03_SENSOR_SR04.md).
|
|
3
|
+
* Mirrors the Python reference `depz_sensor_sdk.sr04.Sr04`.
|
|
4
|
+
*/
|
|
5
|
+
import { DepzDevice, NO_MATCH, StreamQueue } from "../device/device.js";
|
|
6
|
+
import { ECHO_TIMEOUT, Sr04Cmd, Sr04Rpt, distanceMmFromEcho, packEchoDecay, packSamplePeriod, unpackEchoDecay, unpackSamplePeriod, unpackSr04Data, } from "../protocol/sr04.js";
|
|
7
|
+
function measurementFromData(data) {
|
|
8
|
+
return {
|
|
9
|
+
timestampUs: data.timestampUs,
|
|
10
|
+
echoTimeUs: data.echoTimeUs,
|
|
11
|
+
source: data.sourceCmd === Sr04Cmd.StartMeasurementLoop ? "loop" : "once",
|
|
12
|
+
valid: data.echoTimeUs !== ECHO_TIMEOUT,
|
|
13
|
+
distanceMm: distanceMmFromEcho(data.echoTimeUs),
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* HC-SR04 ultrasonic ranging device.
|
|
18
|
+
*
|
|
19
|
+
* Measurements stream via callbacks (`onMeasurement`) and/or the pull
|
|
20
|
+
* iterator (`measurements()`); both receive loop samples *and* unsolicited
|
|
21
|
+
* single shots triggered by an AUX SYNC_IN edge (RPT_DATA source cmd 0x36).
|
|
22
|
+
*/
|
|
23
|
+
export class Sr04 extends DepzDevice {
|
|
24
|
+
measureCbs = [];
|
|
25
|
+
measureQueues = [];
|
|
26
|
+
// ── configuration ──────────────────────────────────────────────────────────
|
|
27
|
+
/** Minimum interval between measurement starts (default 50000). */
|
|
28
|
+
getSamplePeriodUs() {
|
|
29
|
+
return this.request(Sr04Cmd.GetSamplePeriod, undefined, {
|
|
30
|
+
matcher: DepzDevice.expectReport(Sr04Rpt.SamplePeriod, unpackSamplePeriod),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* The effective rate is auto-throttled by the echo window (contract 03
|
|
35
|
+
* §3) — reading back returns the stored value, not the effective one.
|
|
36
|
+
*/
|
|
37
|
+
async setSamplePeriodUs(periodUs) {
|
|
38
|
+
await this.request(Sr04Cmd.SetSamplePeriod, packSamplePeriod(periodUs), {
|
|
39
|
+
okCompletes: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
getEchoDecayUs() {
|
|
43
|
+
return this.request(Sr04Cmd.GetEchoDecay, undefined, {
|
|
44
|
+
matcher: DepzDevice.expectReport(Sr04Rpt.EchoDecay, unpackEchoDecay),
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Set the settle pause; the device clamps to 4000–65000 µs silently, so
|
|
49
|
+
* this re-reads and returns the value actually in effect.
|
|
50
|
+
*/
|
|
51
|
+
async setEchoDecayUs(decayUs) {
|
|
52
|
+
await this.request(Sr04Cmd.SetEchoDecay, packEchoDecay(decayUs), { okCompletes: true });
|
|
53
|
+
return this.getEchoDecayUs();
|
|
54
|
+
}
|
|
55
|
+
// ── measuring ──────────────────────────────────────────────────────────────
|
|
56
|
+
/**
|
|
57
|
+
* Single shot. Rejects with BusyError while the loop is running. The
|
|
58
|
+
* reply arrives only when the echo completes (or times out at ~65.5 ms),
|
|
59
|
+
* so the default timeout is generous.
|
|
60
|
+
*/
|
|
61
|
+
measureOnce(timeoutMs = 1000) {
|
|
62
|
+
const matcher = (pkt) => {
|
|
63
|
+
if (pkt.cmd !== Sr04Rpt.Data || pkt.payload.length !== 11)
|
|
64
|
+
return NO_MATCH;
|
|
65
|
+
const data = unpackSr04Data(pkt.payload);
|
|
66
|
+
if (data.sourceCmd !== Sr04Cmd.MeasureOnce)
|
|
67
|
+
return NO_MATCH;
|
|
68
|
+
return measurementFromData(data);
|
|
69
|
+
};
|
|
70
|
+
return this.request(Sr04Cmd.MeasureOnce, undefined, { matcher, timeoutMs });
|
|
71
|
+
}
|
|
72
|
+
/** Start the measurement loop (idempotent). */
|
|
73
|
+
async start() {
|
|
74
|
+
await this.request(Sr04Cmd.StartMeasurementLoop, undefined, { okCompletes: true });
|
|
75
|
+
}
|
|
76
|
+
/** Stop the measurement loop (idempotent). */
|
|
77
|
+
async stop() {
|
|
78
|
+
await this.request(Sr04Cmd.StopMeasurementLoop, undefined, { okCompletes: true });
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Subscribe to measurements (read-pump context; don't block). Returns an
|
|
82
|
+
* unsubscribe function.
|
|
83
|
+
*/
|
|
84
|
+
onMeasurement(cb) {
|
|
85
|
+
this.measureCbs.push(cb);
|
|
86
|
+
return () => {
|
|
87
|
+
this.measureCbs = this.measureCbs.filter((c) => c !== cb);
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Async iterator over measurements — bounded, drop-oldest (contract 07
|
|
92
|
+
* §3). The returned queue exposes `droppedCount`; it ends when the device
|
|
93
|
+
* closes or the consumer breaks out of iteration.
|
|
94
|
+
*/
|
|
95
|
+
measurements(maxsize = 256) {
|
|
96
|
+
const queue = new StreamQueue(maxsize, () => {
|
|
97
|
+
this.measureQueues = this.measureQueues.filter((q) => q !== queue);
|
|
98
|
+
deregister();
|
|
99
|
+
});
|
|
100
|
+
this.measureQueues.push(queue);
|
|
101
|
+
const deregister = this.registerStream(queue);
|
|
102
|
+
return queue;
|
|
103
|
+
}
|
|
104
|
+
/** Drop counters of all live measurement queues (diagnostics). */
|
|
105
|
+
get streamDroppedCounts() {
|
|
106
|
+
return this.measureQueues.map((q) => q.droppedCount);
|
|
107
|
+
}
|
|
108
|
+
// ── internal ───────────────────────────────────────────────────────────────
|
|
109
|
+
handleReport(pkt) {
|
|
110
|
+
if (pkt.cmd === Sr04Rpt.Data && pkt.payload.length === 11) {
|
|
111
|
+
const m = measurementFromData(unpackSr04Data(pkt.payload));
|
|
112
|
+
for (const cb of [...this.measureCbs])
|
|
113
|
+
cb(m);
|
|
114
|
+
for (const q of [...this.measureQueues])
|
|
115
|
+
q.push(m);
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=sr04.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sr04.js","sourceRoot":"","sources":["../../src/sensors/sr04.ts"],"names":[],"mappings":"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"}
|