@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,543 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* BNO086 9-axis IMU: SHTP + SH-2 host stack over the firmware pass-through
|
|
3
|
+
* bridge (contracts/05_SENSOR_BNO086.md).
|
|
4
|
+
*
|
|
5
|
+
* The MCU only shuttles raw SHTP frames (SEND_SHTP_PACKET / RPT_DATA); the
|
|
6
|
+
* whole sensor-hub protocol runs here. Per ERRATA E2 the bridge ACKs every
|
|
7
|
+
* send with RPT_STATUS immediately and *all* inbound SHTP arrives as
|
|
8
|
+
* RPT_DATA(cmd=0x00) — correlation happens at the SH-2 layer only.
|
|
9
|
+
*
|
|
10
|
+
* Mirrors the Python reference `depz_sensor_sdk.bno086.Bno086`.
|
|
11
|
+
*/
|
|
12
|
+
import { DepzDevice, StreamQueue } from "../../device/device.js";
|
|
13
|
+
import { BusyError, DepzError, DepzTimeoutError } from "../../errors.js";
|
|
14
|
+
import { BUSY_BACKOFF_MS, Bno086Cmd, Bno086Rpt, unpackBno086Data, } from "../../protocol/bno086.js";
|
|
15
|
+
import { SensorId, parseGyroRvCargo, parseInputCargo } from "./reports.js";
|
|
16
|
+
import { ControlReport, ErrorSource, FrsReadSession, FrsWriteSession, ME_CAL_GET, METADATA_RECORDS, Sh2Command, Sh2Error, TareAxis, TareBasis, buildCommandRequest, buildGetFeatureRequest, buildProductIdRequest, buildSetFeature, countsClearParams, countsGetParams, errorRecordFromResponse, errorsParams, meCalibrationParams, periodicDcdParams, persistTareParams, sensorMetadataFromWords, setReorientationParams, tareNowParams, unpackCommandResponse, unpackFeatureResponse, unpackFrsReadResponse, unpackFrsWriteResponse, unpackProductId, } from "./sh2.js";
|
|
17
|
+
import { ShtpChannel, ShtpLayer } from "./shtp.js";
|
|
18
|
+
// Rate verification bounds (contract 05 §7): the hub grants a grid rate; a
|
|
19
|
+
// result outside [0.9, 2.1]× the requested rate is worth a warning, never an
|
|
20
|
+
// error.
|
|
21
|
+
export const RATE_LOW_FACTOR = 0.9;
|
|
22
|
+
export const RATE_HIGH_FACTOR = 2.1;
|
|
23
|
+
const EXECUTABLE_RESET_COMPLETE = 0x01;
|
|
24
|
+
const CONTROL_TIMEOUT_MS = 1000;
|
|
25
|
+
const FRS_TIMEOUT_MS = 2000;
|
|
26
|
+
function sleep(ms) {
|
|
27
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
28
|
+
}
|
|
29
|
+
function normalizeFilter(sensors) {
|
|
30
|
+
if (sensors === null || sensors === undefined)
|
|
31
|
+
return null;
|
|
32
|
+
if (typeof sensors === "number")
|
|
33
|
+
return new Set([sensors]);
|
|
34
|
+
return new Set(sensors);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* BNO086 device: enable SH-2 sensors, stream typed reports.
|
|
38
|
+
*
|
|
39
|
+
* Typical use:
|
|
40
|
+
*
|
|
41
|
+
* const imu = new Bno086(transport);
|
|
42
|
+
* await imu.open();
|
|
43
|
+
* await imu.enable(SensorId.RotationVector, 100);
|
|
44
|
+
* for await (const r of imu.reports()) { ... }
|
|
45
|
+
*
|
|
46
|
+
* Callbacks run on the read-pump context — never await blocking device
|
|
47
|
+
* methods (enable/tare/...) from inside one.
|
|
48
|
+
*/
|
|
49
|
+
export class Bno086 extends DepzDevice {
|
|
50
|
+
/** SEND_SHTP_PACKET attempts before giving up. */
|
|
51
|
+
busyRetries = 5;
|
|
52
|
+
/** >= 200 ms per the bridge spec (contract 05 §2). */
|
|
53
|
+
busyBackoffMs = BUSY_BACKOFF_MS;
|
|
54
|
+
shtp = new ShtpLayer();
|
|
55
|
+
txChain = Promise.resolve();
|
|
56
|
+
reportCbs = [];
|
|
57
|
+
reportQueues = [];
|
|
58
|
+
controlWaiters = new Map();
|
|
59
|
+
cmdSeq = 0;
|
|
60
|
+
resetResolvers = [];
|
|
61
|
+
advertisementChunks = [];
|
|
62
|
+
features = new Map();
|
|
63
|
+
constructor(transport, opts) {
|
|
64
|
+
super(transport, opts);
|
|
65
|
+
if (opts?.busyRetries !== undefined)
|
|
66
|
+
this.busyRetries = opts.busyRetries;
|
|
67
|
+
if (opts?.busyBackoffMs !== undefined)
|
|
68
|
+
this.busyBackoffMs = opts.busyBackoffMs;
|
|
69
|
+
}
|
|
70
|
+
// ── RX path ────────────────────────────────────────────────────────────────
|
|
71
|
+
handleReport(pkt) {
|
|
72
|
+
if (pkt.cmd !== Bno086Rpt.Data || pkt.payload.length < 9)
|
|
73
|
+
return false;
|
|
74
|
+
const data = unpackBno086Data(pkt.payload);
|
|
75
|
+
const cargo = this.shtp.feed(data.shtp);
|
|
76
|
+
if (cargo !== null)
|
|
77
|
+
this.dispatchCargo(cargo, data.timestampUs);
|
|
78
|
+
return true;
|
|
79
|
+
}
|
|
80
|
+
dispatchCargo(cargo, captureUs) {
|
|
81
|
+
switch (cargo.channel) {
|
|
82
|
+
case ShtpChannel.Command:
|
|
83
|
+
this.advertisementChunks.push(cargo.payload);
|
|
84
|
+
return;
|
|
85
|
+
case ShtpChannel.Executable:
|
|
86
|
+
if (cargo.payload[0] === EXECUTABLE_RESET_COMPLETE) {
|
|
87
|
+
for (const resolve of this.resetResolvers.splice(0))
|
|
88
|
+
resolve();
|
|
89
|
+
}
|
|
90
|
+
return;
|
|
91
|
+
case ShtpChannel.Control: {
|
|
92
|
+
if (cargo.payload.length === 0)
|
|
93
|
+
return;
|
|
94
|
+
const rid = cargo.payload[0];
|
|
95
|
+
if (rid === ControlReport.GetFeatureResponse && cargo.payload.length >= 17) {
|
|
96
|
+
const resp = unpackFeatureResponse(cargo.payload);
|
|
97
|
+
this.features.set(resp.sensorId, resp);
|
|
98
|
+
}
|
|
99
|
+
for (const waiter of [...(this.controlWaiters.get(rid) ?? [])]) {
|
|
100
|
+
waiter(cargo.payload.slice());
|
|
101
|
+
}
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
case ShtpChannel.InputNormal:
|
|
105
|
+
case ShtpChannel.InputWake:
|
|
106
|
+
for (const rep of parseInputCargo(cargo.payload, captureUs))
|
|
107
|
+
this.emitReport(rep);
|
|
108
|
+
return;
|
|
109
|
+
case ShtpChannel.GyroRv: {
|
|
110
|
+
const rep = parseGyroRvCargo(cargo.payload, captureUs);
|
|
111
|
+
if (rep !== null)
|
|
112
|
+
this.emitReport(rep);
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
emitReport(rep) {
|
|
118
|
+
for (const { cb, filter } of [...this.reportCbs]) {
|
|
119
|
+
if (filter === null || filter.has(rep.sensorId))
|
|
120
|
+
cb(rep);
|
|
121
|
+
}
|
|
122
|
+
for (const { queue, filter } of [...this.reportQueues]) {
|
|
123
|
+
if (filter === null || filter.has(rep.sensorId))
|
|
124
|
+
queue.push(rep);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ── TX path ────────────────────────────────────────────────────────────────
|
|
128
|
+
/**
|
|
129
|
+
* Frame `payload` and push it through SEND_SHTP_PACKET.
|
|
130
|
+
*
|
|
131
|
+
* ERR_BUSY (both MCU TX slots full) backs off `busyBackoffMs` and
|
|
132
|
+
* retransmits, up to `busyRetries` attempts (contract 05 §2). Sends are
|
|
133
|
+
* serialized (single opcode, single wire).
|
|
134
|
+
*/
|
|
135
|
+
sendShtp(channel, payload) {
|
|
136
|
+
const frame = this.shtp.nextFrame(channel, payload);
|
|
137
|
+
const run = async () => {
|
|
138
|
+
for (let attempt = 0;; attempt++) {
|
|
139
|
+
try {
|
|
140
|
+
await this.request(Bno086Cmd.SendShtpPacket, frame, { okCompletes: true });
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
catch (err) {
|
|
144
|
+
if (!(err instanceof BusyError) || attempt >= this.busyRetries - 1)
|
|
145
|
+
throw err;
|
|
146
|
+
await sleep(this.busyBackoffMs);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
const result = this.txChain.then(run);
|
|
151
|
+
this.txChain = result.catch(() => undefined);
|
|
152
|
+
return result;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Register a control-channel waiter for `rid`, run `send`, and let
|
|
156
|
+
* `handler` decide when the exchange finishes. Correlation is purely
|
|
157
|
+
* SH-2-level (report ID + handler predicate).
|
|
158
|
+
*/
|
|
159
|
+
controlExchange(rid, timeoutMs, handler, send) {
|
|
160
|
+
return new Promise((resolve, reject) => {
|
|
161
|
+
let settled = false;
|
|
162
|
+
const cleanup = () => {
|
|
163
|
+
clearTimeout(timer);
|
|
164
|
+
const list = this.controlWaiters.get(rid);
|
|
165
|
+
if (list !== undefined) {
|
|
166
|
+
this.controlWaiters.set(rid, list.filter((w) => w !== waiter));
|
|
167
|
+
}
|
|
168
|
+
};
|
|
169
|
+
const finish = (value) => {
|
|
170
|
+
if (settled)
|
|
171
|
+
return;
|
|
172
|
+
settled = true;
|
|
173
|
+
cleanup();
|
|
174
|
+
resolve(value);
|
|
175
|
+
};
|
|
176
|
+
const fail = (err) => {
|
|
177
|
+
if (settled)
|
|
178
|
+
return;
|
|
179
|
+
settled = true;
|
|
180
|
+
cleanup();
|
|
181
|
+
reject(err);
|
|
182
|
+
};
|
|
183
|
+
const timer = setTimeout(() => fail(new DepzTimeoutError(rid, timeoutMs)), timeoutMs);
|
|
184
|
+
const waiter = (raw) => handler(raw, finish, fail);
|
|
185
|
+
const list = this.controlWaiters.get(rid) ?? [];
|
|
186
|
+
list.push(waiter);
|
|
187
|
+
this.controlWaiters.set(rid, list);
|
|
188
|
+
send().catch((err) => fail(err instanceof Error ? err : new DepzError(String(err))));
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/** Send a control-channel payload and wait for one matching response. */
|
|
192
|
+
controlRequest(payload, expectRid, parse, pred, timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
193
|
+
return this.controlExchange(expectRid, timeoutMs, (raw, finish, fail) => {
|
|
194
|
+
let obj;
|
|
195
|
+
try {
|
|
196
|
+
obj = parse(raw);
|
|
197
|
+
}
|
|
198
|
+
catch (err) {
|
|
199
|
+
fail(err instanceof Error ? err : new DepzError(String(err)));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (pred === undefined || pred(obj))
|
|
203
|
+
finish(obj);
|
|
204
|
+
}, () => this.sendShtp(ShtpChannel.Control, payload));
|
|
205
|
+
}
|
|
206
|
+
nextCmdSeq() {
|
|
207
|
+
const seq = this.cmdSeq;
|
|
208
|
+
this.cmdSeq = (seq + 1) & 0xff;
|
|
209
|
+
return seq;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* SH-2 Command Request; correlates the response on (command, commandSeq)
|
|
213
|
+
* when the command produces one.
|
|
214
|
+
*/
|
|
215
|
+
async command(command, params, waitResponse, timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
216
|
+
const seq = this.nextCmdSeq();
|
|
217
|
+
const payload = buildCommandRequest(seq, command, params);
|
|
218
|
+
if (!waitResponse) {
|
|
219
|
+
await this.sendShtp(ShtpChannel.Control, payload);
|
|
220
|
+
return null;
|
|
221
|
+
}
|
|
222
|
+
return this.controlRequest(payload, ControlReport.CommandResponse, unpackCommandResponse, (r) => r.command === command && r.commandSeq === seq, timeoutMs);
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Send a Command Request and gather every Command Response correlated on
|
|
226
|
+
* (command, commandSeq) until `collect(resp, acc)` returns true. Used by
|
|
227
|
+
* multi-message commands (Errors, Counts) where the hub streams several
|
|
228
|
+
* 0xF1 responses with an incrementing responseSeq.
|
|
229
|
+
*/
|
|
230
|
+
commandCollect(command, params, collect, timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
231
|
+
const seq = this.nextCmdSeq();
|
|
232
|
+
const payload = buildCommandRequest(seq, command, params);
|
|
233
|
+
const results = [];
|
|
234
|
+
return this.controlExchange(ControlReport.CommandResponse, timeoutMs, (raw, finish, fail) => {
|
|
235
|
+
let resp;
|
|
236
|
+
try {
|
|
237
|
+
resp = unpackCommandResponse(raw);
|
|
238
|
+
}
|
|
239
|
+
catch (err) {
|
|
240
|
+
fail(err instanceof Error ? err : new DepzError(String(err)));
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
if (resp.command !== command || resp.commandSeq !== seq)
|
|
244
|
+
return;
|
|
245
|
+
if (collect(resp, results))
|
|
246
|
+
finish(results);
|
|
247
|
+
}, () => this.sendShtp(ShtpChannel.Control, payload));
|
|
248
|
+
}
|
|
249
|
+
// ── lifecycle ──────────────────────────────────────────────────────────────
|
|
250
|
+
/**
|
|
251
|
+
* Hard-reset the sensor via nRST (0x32) and wait for the executable
|
|
252
|
+
* channel's reset-complete. All SHTP state (seq counters, partial cargos)
|
|
253
|
+
* and cached features restart from zero.
|
|
254
|
+
*/
|
|
255
|
+
async hardwareReset(timeoutMs = 2000) {
|
|
256
|
+
this.shtp.reset();
|
|
257
|
+
this.advertisementChunks = [];
|
|
258
|
+
this.features.clear();
|
|
259
|
+
const done = new Promise((resolve) => this.resetResolvers.push(resolve));
|
|
260
|
+
await this.request(Bno086Cmd.SensorReset, undefined, { okCompletes: true });
|
|
261
|
+
let timer;
|
|
262
|
+
const timedOut = new Promise((_, reject) => {
|
|
263
|
+
timer = setTimeout(() => reject(new DepzTimeoutError(Bno086Cmd.SensorReset, timeoutMs)), timeoutMs);
|
|
264
|
+
});
|
|
265
|
+
try {
|
|
266
|
+
await Promise.race([done, timedOut]);
|
|
267
|
+
}
|
|
268
|
+
finally {
|
|
269
|
+
clearTimeout(timer);
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
/** Pulse WAKE (PS0): wakes the sensor from sleep, no state loss. */
|
|
273
|
+
async wake() {
|
|
274
|
+
await this.request(Bno086Cmd.SensorWakeUp, undefined, { okCompletes: true });
|
|
275
|
+
}
|
|
276
|
+
/** Raw SHTP channel-0 advertisement bytes seen since open/reset. */
|
|
277
|
+
get advertisement() {
|
|
278
|
+
const total = this.advertisementChunks.reduce((n, c) => n + c.length, 0);
|
|
279
|
+
const out = new Uint8Array(total);
|
|
280
|
+
let off = 0;
|
|
281
|
+
for (const c of this.advertisementChunks) {
|
|
282
|
+
out.set(c, off);
|
|
283
|
+
off += c.length;
|
|
284
|
+
}
|
|
285
|
+
return out;
|
|
286
|
+
}
|
|
287
|
+
// ── SH-2: identification & features ──────────────────────────────────────
|
|
288
|
+
/** Product ID Request/Response round trip (first responding subsystem). */
|
|
289
|
+
productId(timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
290
|
+
return this.controlRequest(buildProductIdRequest(), ControlReport.ProductIdResponse, unpackProductId, undefined, timeoutMs);
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Enable `sensor` at the requested rate via Set Feature (0xFD).
|
|
294
|
+
*
|
|
295
|
+
* Give either `hz` or `opts.intervalUs`. The hub rounds to its 1 kHz/2^n
|
|
296
|
+
* grid; with `verify` (default) the granted rate is read back via Get
|
|
297
|
+
* Feature and a result outside 0.9–2.1× the request emits a console
|
|
298
|
+
* warning (contract 05 §7 — warn, never throw). Resolves with the
|
|
299
|
+
* FeatureResponse (null when `verify: false`).
|
|
300
|
+
*/
|
|
301
|
+
async enable(sensor, hz, opts = {}) {
|
|
302
|
+
if ((hz === undefined) === (opts.intervalUs === undefined)) {
|
|
303
|
+
throw new DepzError("give exactly one of hz / intervalUs");
|
|
304
|
+
}
|
|
305
|
+
let intervalUs;
|
|
306
|
+
if (hz !== undefined) {
|
|
307
|
+
if (hz <= 0)
|
|
308
|
+
throw new DepzError("hz must be positive; use disable()");
|
|
309
|
+
intervalUs = Math.max(1, Math.round(1_000_000 / hz));
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
intervalUs = opts.intervalUs;
|
|
313
|
+
}
|
|
314
|
+
await this.sendShtp(ShtpChannel.Control, buildSetFeature(sensor, intervalUs, opts.batchUs ?? 0, opts.sensitivity ?? 0, opts.flags ?? 0, opts.cfgWord ?? 0));
|
|
315
|
+
if (opts.verify === false)
|
|
316
|
+
return null;
|
|
317
|
+
const resp = await this.getFeature(sensor, opts.timeoutMs ?? CONTROL_TIMEOUT_MS);
|
|
318
|
+
const requestedRate = 1_000_000 / intervalUs;
|
|
319
|
+
const actualRate = resp.intervalUs !== 0 ? 1_000_000 / resp.intervalUs : 0;
|
|
320
|
+
if (!(RATE_LOW_FACTOR * requestedRate <= actualRate && actualRate <= RATE_HIGH_FACTOR * requestedRate)) {
|
|
321
|
+
console.warn(`BNO086 sensor 0x${sensor.toString(16).toUpperCase().padStart(2, "0")}: requested ` +
|
|
322
|
+
`${requestedRate.toFixed(1)} Hz, granted ${actualRate.toFixed(1)} Hz (outside ` +
|
|
323
|
+
`${RATE_LOW_FACTOR}–${RATE_HIGH_FACTOR}× band)`);
|
|
324
|
+
}
|
|
325
|
+
return resp;
|
|
326
|
+
}
|
|
327
|
+
/** Disable `sensor` (Set Feature with interval 0). */
|
|
328
|
+
async disable(sensor) {
|
|
329
|
+
await this.sendShtp(ShtpChannel.Control, buildSetFeature(sensor, 0));
|
|
330
|
+
this.features.delete(sensor);
|
|
331
|
+
}
|
|
332
|
+
/** Get Feature Request/Response round trip for `sensor`. */
|
|
333
|
+
getFeature(sensor, timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
334
|
+
return this.controlRequest(buildGetFeatureRequest(sensor), ControlReport.GetFeatureResponse, unpackFeatureResponse, (r) => r.sensorId === sensor, timeoutMs);
|
|
335
|
+
}
|
|
336
|
+
// sugar for the everyday sensors
|
|
337
|
+
enableRotationVector(hz = 100, opts) {
|
|
338
|
+
return this.enable(SensorId.RotationVector, hz, opts);
|
|
339
|
+
}
|
|
340
|
+
enableGameRotationVector(hz = 100, opts) {
|
|
341
|
+
return this.enable(SensorId.GameRotationVector, hz, opts);
|
|
342
|
+
}
|
|
343
|
+
enableAccelerometer(hz = 100, opts) {
|
|
344
|
+
return this.enable(SensorId.Accelerometer, hz, opts);
|
|
345
|
+
}
|
|
346
|
+
enableGyroscope(hz = 100, opts) {
|
|
347
|
+
return this.enable(SensorId.Gyroscope, hz, opts);
|
|
348
|
+
}
|
|
349
|
+
enableMagnetometer(hz = 50, opts) {
|
|
350
|
+
return this.enable(SensorId.Magnetometer, hz, opts);
|
|
351
|
+
}
|
|
352
|
+
enableLinearAcceleration(hz = 100, opts) {
|
|
353
|
+
return this.enable(SensorId.LinearAcceleration, hz, opts);
|
|
354
|
+
}
|
|
355
|
+
enableGravity(hz = 100, opts) {
|
|
356
|
+
return this.enable(SensorId.Gravity, hz, opts);
|
|
357
|
+
}
|
|
358
|
+
enableGyroIntegratedRv(hz = 400, opts) {
|
|
359
|
+
return this.enable(SensorId.GyroIntegratedRv, hz, opts);
|
|
360
|
+
}
|
|
361
|
+
// ── report streaming ───────────────────────────────────────────────────────
|
|
362
|
+
/**
|
|
363
|
+
* Subscribe to typed sensor reports (read-pump context; do not block).
|
|
364
|
+
* `sensors` filters by SensorId. Returns an unsubscribe fn.
|
|
365
|
+
*/
|
|
366
|
+
onReport(cb, sensors) {
|
|
367
|
+
const entry = { cb, filter: normalizeFilter(sensors) };
|
|
368
|
+
this.reportCbs.push(entry);
|
|
369
|
+
return () => {
|
|
370
|
+
this.reportCbs = this.reportCbs.filter((e) => e !== entry);
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Async iterator over typed reports — bounded, drop-oldest (contract 07
|
|
375
|
+
* §3). Subscribes eagerly — reports emitted after this call are never
|
|
376
|
+
* missed.
|
|
377
|
+
*/
|
|
378
|
+
reports(sensors, maxsize = 1024) {
|
|
379
|
+
const queue = new StreamQueue(maxsize, () => {
|
|
380
|
+
this.reportQueues = this.reportQueues.filter((e) => e.queue !== queue);
|
|
381
|
+
deregister();
|
|
382
|
+
});
|
|
383
|
+
this.reportQueues.push({ queue, filter: normalizeFilter(sensors) });
|
|
384
|
+
const deregister = this.registerStream(queue);
|
|
385
|
+
return queue;
|
|
386
|
+
}
|
|
387
|
+
// ── tare / calibration facade ──────────────────────────────────────────────
|
|
388
|
+
/** Tare the selected axes against `basis` (no response per SH-2). */
|
|
389
|
+
async tareNow(axes = TareAxis.All, basis = TareBasis.RotationVector) {
|
|
390
|
+
await this.command(Sh2Command.Tare, tareNowParams(axes, basis), false);
|
|
391
|
+
}
|
|
392
|
+
/** Persist the current tare into FRS (no response per SH-2). */
|
|
393
|
+
async persistTare() {
|
|
394
|
+
await this.command(Sh2Command.Tare, persistTareParams(), false);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Set the runtime reorientation quaternion (Q14 on the wire; all zeros
|
|
398
|
+
* clears). No response per SH-2.
|
|
399
|
+
*/
|
|
400
|
+
async setReorientation(x, y, z, w) {
|
|
401
|
+
await this.command(Sh2Command.Tare, setReorientationParams(x, y, z, w), false);
|
|
402
|
+
}
|
|
403
|
+
/** Configure ME calibration; rejects with Sh2Error on non-zero status. */
|
|
404
|
+
async setCalibration(config = {}, timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
405
|
+
const resp = await this.command(Sh2Command.MeCalibrate, meCalibrationParams(config.accel ?? true, config.gyro ?? true, config.mag ?? true, config.planar ?? false), true, timeoutMs);
|
|
406
|
+
if (resp.status !== 0) {
|
|
407
|
+
throw new Sh2Error(`ME calibration configure failed: status ${resp.status}`);
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
/** Read back which ME calibrations are running. */
|
|
411
|
+
async getCalibration(timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
412
|
+
const resp = await this.command(Sh2Command.MeCalibrate, meCalibrationParams(false, false, false, false, ME_CAL_GET), true, timeoutMs);
|
|
413
|
+
if (resp.status !== 0) {
|
|
414
|
+
throw new Sh2Error(`ME calibration get failed: status ${resp.status}`);
|
|
415
|
+
}
|
|
416
|
+
const r = resp.r;
|
|
417
|
+
return { accel: Boolean(r[1]), gyro: Boolean(r[2]), mag: Boolean(r[3]), planar: Boolean(r[4]) };
|
|
418
|
+
}
|
|
419
|
+
/** Save the dynamic calibration data to flash (DCD Save Now). */
|
|
420
|
+
async saveDcd(timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
421
|
+
const resp = await this.command(Sh2Command.SaveDcd, new Uint8Array(0), true, timeoutMs);
|
|
422
|
+
if (resp.status !== 0) {
|
|
423
|
+
throw new Sh2Error(`DCD save failed: status ${resp.status}`);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
/** Enable/disable the hub's periodic DCD autosave (no response). */
|
|
427
|
+
async configurePeriodicDcd(enable) {
|
|
428
|
+
await this.command(Sh2Command.PeriodicDcdConfig, periodicDcdParams(enable), false);
|
|
429
|
+
}
|
|
430
|
+
// ── FRS ────────────────────────────────────────────────────────────────────
|
|
431
|
+
/** Read a whole FRS record; resolves with its 32-bit words. */
|
|
432
|
+
frsRead(recordId, timeoutMs = FRS_TIMEOUT_MS) {
|
|
433
|
+
const session = new FrsReadSession(recordId);
|
|
434
|
+
return this.controlExchange(ControlReport.FrsReadResponse, timeoutMs, (raw, finish, fail) => {
|
|
435
|
+
try {
|
|
436
|
+
if (session.feed(unpackFrsReadResponse(raw)))
|
|
437
|
+
finish(session.words);
|
|
438
|
+
}
|
|
439
|
+
catch (err) {
|
|
440
|
+
fail(err instanceof Error ? err : new DepzError(String(err)));
|
|
441
|
+
}
|
|
442
|
+
}, () => this.sendShtp(ShtpChannel.Control, session.request()));
|
|
443
|
+
}
|
|
444
|
+
/** Write a whole FRS record (word list); rejects with Sh2Error on failure. */
|
|
445
|
+
frsWrite(recordId, words, timeoutMs = FRS_TIMEOUT_MS) {
|
|
446
|
+
const session = new FrsWriteSession(recordId, [...words]);
|
|
447
|
+
return this.controlExchange(ControlReport.FrsWriteResponse, timeoutMs, (raw, finish, fail) => {
|
|
448
|
+
try {
|
|
449
|
+
const next = session.feed(unpackFrsWriteResponse(raw));
|
|
450
|
+
if (session.done) {
|
|
451
|
+
finish(undefined);
|
|
452
|
+
}
|
|
453
|
+
else if (next !== null) {
|
|
454
|
+
this.sendShtp(ShtpChannel.Control, next).catch(fail);
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
catch (err) {
|
|
458
|
+
fail(err instanceof Error ? err : new DepzError(String(err)));
|
|
459
|
+
}
|
|
460
|
+
}, () => this.sendShtp(ShtpChannel.Control, session.request()));
|
|
461
|
+
}
|
|
462
|
+
/** Read + parse the sensor's FRS metadata record. */
|
|
463
|
+
async getMetadata(sensor, timeoutMs = FRS_TIMEOUT_MS) {
|
|
464
|
+
const record = METADATA_RECORDS[sensor];
|
|
465
|
+
if (record === undefined) {
|
|
466
|
+
throw new Sh2Error(`no metadata FRS record known for sensor 0x${sensor.toString(16).toUpperCase().padStart(2, "0")}`);
|
|
467
|
+
}
|
|
468
|
+
return sensorMetadataFromWords(await this.frsRead(record, timeoutMs));
|
|
469
|
+
}
|
|
470
|
+
// ── diagnostics / housekeeping commands ──────────────────────────────────────
|
|
471
|
+
/** Get Oscillator Type (command 0x0A). r[0] is the type directly. */
|
|
472
|
+
async getOscillatorType(timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
473
|
+
const resp = await this.command(Sh2Command.GetOscillatorType, new Uint8Array(0), true, timeoutMs);
|
|
474
|
+
return resp.r[0];
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Clear the in-RAM dynamic calibration and reset the sensor (command 0x0B).
|
|
478
|
+
* There is no command response — the hub resets, so this waits for the
|
|
479
|
+
* executable reset-complete like hardwareReset().
|
|
480
|
+
*/
|
|
481
|
+
async clearDcdAndReset(timeoutMs = 2000) {
|
|
482
|
+
this.shtp.reset();
|
|
483
|
+
this.advertisementChunks = [];
|
|
484
|
+
this.features.clear();
|
|
485
|
+
const done = new Promise((resolve) => this.resetResolvers.push(resolve));
|
|
486
|
+
await this.command(Sh2Command.ClearDcdAndReset, new Uint8Array(0), false);
|
|
487
|
+
let timer;
|
|
488
|
+
const timedOut = new Promise((_, reject) => {
|
|
489
|
+
timer = setTimeout(() => reject(new DepzTimeoutError(Sh2Command.ClearDcdAndReset, timeoutMs)), timeoutMs);
|
|
490
|
+
});
|
|
491
|
+
try {
|
|
492
|
+
await Promise.race([done, timedOut]);
|
|
493
|
+
}
|
|
494
|
+
finally {
|
|
495
|
+
clearTimeout(timer);
|
|
496
|
+
}
|
|
497
|
+
// The device restarted its counters on reset; realign the SHTP layer (the
|
|
498
|
+
// captured advertisement survives — it lives outside the SHTP layer).
|
|
499
|
+
this.shtp.reset();
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* Read the error queue (command 0x01), filtered to `severity` or greater.
|
|
503
|
+
* Records stream until one with source == 255 (no more).
|
|
504
|
+
*/
|
|
505
|
+
async getErrors(severity = 0, timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
506
|
+
const responses = await this.commandCollect(Sh2Command.Errors, errorsParams(severity), (resp, acc) => {
|
|
507
|
+
if (resp.r[2] === ErrorSource.NoMoreErrors)
|
|
508
|
+
return true; // terminator
|
|
509
|
+
acc.push(resp);
|
|
510
|
+
return false;
|
|
511
|
+
}, timeoutMs);
|
|
512
|
+
return responses.map(errorRecordFromResponse);
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Read a sensor's event counts (command 0x02). The hub answers with two
|
|
516
|
+
* responses (responseSeq 0 then 1).
|
|
517
|
+
*/
|
|
518
|
+
async getCounts(sensor, timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
519
|
+
const responses = await this.commandCollect(Sh2Command.Counter, countsGetParams(sensor), (resp, acc) => {
|
|
520
|
+
acc.push(resp);
|
|
521
|
+
return acc.some((r) => r.responseSeq === 1);
|
|
522
|
+
}, timeoutMs);
|
|
523
|
+
const bySeq = new Map(responses.map((r) => [r.responseSeq, r]));
|
|
524
|
+
const r0 = bySeq.get(0).r;
|
|
525
|
+
const r1 = bySeq.get(1).r;
|
|
526
|
+
const u32 = (r, off) => (r[off] | (r[off + 1] << 8) | (r[off + 2] << 16) | (r[off + 3] << 24)) >>> 0;
|
|
527
|
+
return {
|
|
528
|
+
sensorId: sensor,
|
|
529
|
+
offered: u32(r0, 3),
|
|
530
|
+
accepted: u32(r0, 7),
|
|
531
|
+
on: u32(r1, 3),
|
|
532
|
+
attempted: u32(r1, 7),
|
|
533
|
+
};
|
|
534
|
+
}
|
|
535
|
+
/** Clear a sensor's event counts (command 0x02, subcommand 1). */
|
|
536
|
+
async clearCounts(sensor, timeoutMs = CONTROL_TIMEOUT_MS) {
|
|
537
|
+
const resp = await this.command(Sh2Command.Counter, countsClearParams(sensor), true, timeoutMs);
|
|
538
|
+
if (resp.status !== 0) {
|
|
539
|
+
throw new Sh2Error(`clear counts failed: status ${resp.status}`);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
//# sourceMappingURL=bno086.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bno086.js","sourceRoot":"","sources":["../../../src/sensors/bno086/bno086.ts"],"names":[],"mappings":"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"}
|