@depz/sensor-sdk 0.2.2 → 0.4.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 (151) hide show
  1. package/README.md +13 -5
  2. package/dist/dataset.d.ts.map +1 -1
  3. package/dist/dataset.js +66 -2
  4. package/dist/dataset.js.map +1 -1
  5. package/dist/discovery.d.ts.map +1 -1
  6. package/dist/discovery.js +25 -2
  7. package/dist/discovery.js.map +1 -1
  8. package/dist/index.d.ts +21 -1
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +16 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/protocol/bno055.d.ts +101 -0
  13. package/dist/protocol/bno055.d.ts.map +1 -0
  14. package/dist/protocol/bno055.js +105 -0
  15. package/dist/protocol/bno055.js.map +1 -0
  16. package/dist/protocol/identity.d.ts +1 -1
  17. package/dist/protocol/identity.d.ts.map +1 -1
  18. package/dist/protocol/identity.js +6 -0
  19. package/dist/protocol/identity.js.map +1 -1
  20. package/dist/protocol/vl53l7.d.ts +77 -0
  21. package/dist/protocol/vl53l7.d.ts.map +1 -0
  22. package/dist/protocol/vl53l7.js +99 -0
  23. package/dist/protocol/vl53l7.js.map +1 -0
  24. package/dist/protocol/vl53lx.d.ts +72 -0
  25. package/dist/protocol/vl53lx.d.ts.map +1 -0
  26. package/dist/protocol/vl53lx.js +87 -0
  27. package/dist/protocol/vl53lx.js.map +1 -0
  28. package/dist/sensors/bno055/bno055.d.ts +207 -0
  29. package/dist/sensors/bno055/bno055.d.ts.map +1 -0
  30. package/dist/sensors/bno055/bno055.js +547 -0
  31. package/dist/sensors/bno055/bno055.js.map +1 -0
  32. package/dist/sensors/bno055/regs.d.ts +271 -0
  33. package/dist/sensors/bno055/regs.d.ts.map +1 -0
  34. package/dist/sensors/bno055/regs.js +366 -0
  35. package/dist/sensors/bno055/regs.js.map +1 -0
  36. package/dist/sensors/bno086/bno086.d.ts +13 -0
  37. package/dist/sensors/bno086/bno086.d.ts.map +1 -1
  38. package/dist/sensors/bno086/bno086.js +26 -1
  39. package/dist/sensors/bno086/bno086.js.map +1 -1
  40. package/dist/sensors/bno086/sh2.d.ts.map +1 -1
  41. package/dist/sensors/bno086/sh2.js +5 -2
  42. package/dist/sensors/bno086/sh2.js.map +1 -1
  43. package/dist/sensors/vl53l7/vl53l7.d.ts +97 -0
  44. package/dist/sensors/vl53l7/vl53l7.d.ts.map +1 -0
  45. package/dist/sensors/vl53l7/vl53l7.js +138 -0
  46. package/dist/sensors/vl53l7/vl53l7.js.map +1 -0
  47. package/dist/sensors/vl53l8/assets/index.d.ts +5 -1
  48. package/dist/sensors/vl53l8/assets/index.d.ts.map +1 -1
  49. package/dist/sensors/vl53l8/assets/index.js +7 -1
  50. package/dist/sensors/vl53l8/assets/index.js.map +1 -1
  51. package/dist/sensors/vl53l8/assets/l7ch.d.ts +12 -0
  52. package/dist/sensors/vl53l8/assets/l7ch.d.ts.map +1 -0
  53. package/dist/sensors/vl53l8/assets/l7ch.js +18 -0
  54. package/dist/sensors/vl53l8/assets/l7ch.js.map +1 -0
  55. package/dist/sensors/vl53l8/assets/l7cx.d.ts +14 -0
  56. package/dist/sensors/vl53l8/assets/l7cx.d.ts.map +1 -0
  57. package/dist/sensors/vl53l8/assets/l7cx.js +20 -0
  58. package/dist/sensors/vl53l8/assets/l7cx.js.map +1 -0
  59. package/dist/sensors/vl53l8/cnh.d.ts +4 -3
  60. package/dist/sensors/vl53l8/cnh.d.ts.map +1 -1
  61. package/dist/sensors/vl53l8/cnh.js +4 -3
  62. package/dist/sensors/vl53l8/cnh.js.map +1 -1
  63. package/dist/sensors/vl53l8/uld.d.ts +50 -9
  64. package/dist/sensors/vl53l8/uld.d.ts.map +1 -1
  65. package/dist/sensors/vl53l8/uld.js +241 -35
  66. package/dist/sensors/vl53l8/uld.js.map +1 -1
  67. package/dist/sensors/vl53l8/vl53l8.d.ts +8 -3
  68. package/dist/sensors/vl53l8/vl53l8.d.ts.map +1 -1
  69. package/dist/sensors/vl53l8/vl53l8.js +12 -7
  70. package/dist/sensors/vl53l8/vl53l8.js.map +1 -1
  71. package/dist/sensors/vl53lx/decode.d.ts +70 -0
  72. package/dist/sensors/vl53lx/decode.d.ts.map +1 -0
  73. package/dist/sensors/vl53lx/decode.js +108 -0
  74. package/dist/sensors/vl53lx/decode.js.map +1 -0
  75. package/dist/sensors/vl53lx/uld/arith.d.ts +23 -0
  76. package/dist/sensors/vl53lx/uld/arith.d.ts.map +1 -0
  77. package/dist/sensors/vl53lx/uld/arith.js +42 -0
  78. package/dist/sensors/vl53lx/uld/arith.js.map +1 -0
  79. package/dist/sensors/vl53lx/uld/bare/core.d.ts +359 -0
  80. package/dist/sensors/vl53lx/uld/bare/core.d.ts.map +1 -0
  81. package/dist/sensors/vl53lx/uld/bare/core.js +1112 -0
  82. package/dist/sensors/vl53lx/uld/bare/core.js.map +1 -0
  83. package/dist/sensors/vl53lx/uld/bare/driver.d.ts +100 -0
  84. package/dist/sensors/vl53lx/uld/bare/driver.d.ts.map +1 -0
  85. package/dist/sensors/vl53lx/uld/bare/driver.js +226 -0
  86. package/dist/sensors/vl53lx/uld/bare/driver.js.map +1 -0
  87. package/dist/sensors/vl53lx/uld/bare/hist.d.ts +180 -0
  88. package/dist/sensors/vl53lx/uld/bare/hist.d.ts.map +1 -0
  89. package/dist/sensors/vl53lx/uld/bare/hist.js +949 -0
  90. package/dist/sensors/vl53lx/uld/bare/hist.js.map +1 -0
  91. package/dist/sensors/vl53lx/uld/bare/image.d.ts +53 -0
  92. package/dist/sensors/vl53lx/uld/bare/image.d.ts.map +1 -0
  93. package/dist/sensors/vl53lx/uld/bare/image.js +108 -0
  94. package/dist/sensors/vl53lx/uld/bare/image.js.map +1 -0
  95. package/dist/sensors/vl53lx/uld/bare/imath.d.ts +39 -0
  96. package/dist/sensors/vl53lx/uld/bare/imath.d.ts.map +1 -0
  97. package/dist/sensors/vl53lx/uld/bare/imath.js +99 -0
  98. package/dist/sensors/vl53lx/uld/bare/imath.js.map +1 -0
  99. package/dist/sensors/vl53lx/uld/bare/index.d.ts +22 -0
  100. package/dist/sensors/vl53lx/uld/bare/index.d.ts.map +1 -0
  101. package/dist/sensors/vl53lx/uld/bare/index.js +22 -0
  102. package/dist/sensors/vl53lx/uld/bare/index.js.map +1 -0
  103. package/dist/sensors/vl53lx/uld/bare/nvm.d.ts +85 -0
  104. package/dist/sensors/vl53lx/uld/bare/nvm.d.ts.map +1 -0
  105. package/dist/sensors/vl53lx/uld/bare/nvm.js +148 -0
  106. package/dist/sensors/vl53lx/uld/bare/nvm.js.map +1 -0
  107. package/dist/sensors/vl53lx/uld/bare/regs.d.ts +54 -0
  108. package/dist/sensors/vl53lx/uld/bare/regs.d.ts.map +1 -0
  109. package/dist/sensors/vl53lx/uld/bare/regs.js +496 -0
  110. package/dist/sensors/vl53lx/uld/bare/regs.js.map +1 -0
  111. package/dist/sensors/vl53lx/uld/bare/tuning.d.ts +15 -0
  112. package/dist/sensors/vl53lx/uld/bare/tuning.d.ts.map +1 -0
  113. package/dist/sensors/vl53lx/uld/bare/tuning.js +303 -0
  114. package/dist/sensors/vl53lx/uld/bare/tuning.js.map +1 -0
  115. package/dist/sensors/vl53lx/uld/base.d.ts +134 -0
  116. package/dist/sensors/vl53lx/uld/base.d.ts.map +1 -0
  117. package/dist/sensors/vl53lx/uld/base.js +171 -0
  118. package/dist/sensors/vl53lx/uld/base.js.map +1 -0
  119. package/dist/sensors/vl53lx/uld/l0x.d.ts +334 -0
  120. package/dist/sensors/vl53lx/uld/l0x.d.ts.map +1 -0
  121. package/dist/sensors/vl53lx/uld/l0x.js +1532 -0
  122. package/dist/sensors/vl53lx/uld/l0x.js.map +1 -0
  123. package/dist/sensors/vl53lx/uld/l1.d.ts +69 -0
  124. package/dist/sensors/vl53lx/uld/l1.d.ts.map +1 -0
  125. package/dist/sensors/vl53lx/uld/l1.js +262 -0
  126. package/dist/sensors/vl53lx/uld/l1.js.map +1 -0
  127. package/dist/sensors/vl53lx/uld/l3.d.ts +25 -0
  128. package/dist/sensors/vl53lx/uld/l3.d.ts.map +1 -0
  129. package/dist/sensors/vl53lx/uld/l3.js +51 -0
  130. package/dist/sensors/vl53lx/uld/l3.js.map +1 -0
  131. package/dist/sensors/vl53lx/uld/l4.d.ts +20 -0
  132. package/dist/sensors/vl53lx/uld/l4.d.ts.map +1 -0
  133. package/dist/sensors/vl53lx/uld/l4.js +95 -0
  134. package/dist/sensors/vl53lx/uld/l4.js.map +1 -0
  135. package/dist/sensors/vl53lx/uld/link.d.ts +42 -0
  136. package/dist/sensors/vl53lx/uld/link.d.ts.map +1 -0
  137. package/dist/sensors/vl53lx/uld/link.js +28 -0
  138. package/dist/sensors/vl53lx/uld/link.js.map +1 -0
  139. package/dist/sensors/vl53lx/uld/registry.d.ts +68 -0
  140. package/dist/sensors/vl53lx/uld/registry.d.ts.map +1 -0
  141. package/dist/sensors/vl53lx/uld/registry.js +139 -0
  142. package/dist/sensors/vl53lx/uld/registry.js.map +1 -0
  143. package/dist/sensors/vl53lx/uld/vl53l1-die.d.ts +190 -0
  144. package/dist/sensors/vl53lx/uld/vl53l1-die.d.ts.map +1 -0
  145. package/dist/sensors/vl53lx/uld/vl53l1-die.js +457 -0
  146. package/dist/sensors/vl53lx/uld/vl53l1-die.js.map +1 -0
  147. package/dist/sensors/vl53lx/vl53lx.d.ts +332 -0
  148. package/dist/sensors/vl53lx/vl53lx.d.ts.map +1 -0
  149. package/dist/sensors/vl53lx/vl53lx.js +694 -0
  150. package/dist/sensors/vl53lx/vl53lx.js.map +1 -0
  151. package/package.json +9 -2
@@ -0,0 +1,547 @@
1
+ /**
2
+ * BNO055 9-axis IMU over the firmware register bridge
3
+ * (contracts/13_SENSOR_BNO055.md).
4
+ *
5
+ * The MCU is a thin I2C bridge: it reads and writes BNO055 registers on
6
+ * request and streams one configured register block on a timer. Everything
7
+ * else — operating mode, units, axis remap, calibration, decoding — is host
8
+ * logic expressed as register access. The BNO055 fuses on chip; there is no
9
+ * host-side fusion driver.
10
+ *
11
+ * Mirrors the Python reference `depz_sensor_sdk.bno055.Bno055`.
12
+ */
13
+ import { DepzDevice, StreamQueue } from "../../device/device.js";
14
+ import { DepzError, DepzTimeoutError } from "../../errors.js";
15
+ import { BNO055_RESET_TIMEOUT_MS, BNO055_TRIGGER_TIMER, BNO055_XFER_MAX, Bno055Cmd, Bno055Rpt, bno055IdsOk, packBno055ReadReg, packBno055StartStream, packBno055WriteReg, unpackBno055Info, unpackBno055RegData, unpackBno055Stream, } from "../../protocol/bno055.js";
16
+ import { BNO055_BOOT_SETTLE_TIMEOUT_MS, BNO055_STUCK_SELF_TEST_POLLS, BNO055_CALIB_PROFILE_LEN, BNO055_DEFAULT_UNITS, BNO055_FULL_BLOCK, BNO055_FUSION_ACCEL_LSB, BNO055_FUSION_START_TIMEOUT_MS, BNO055_MAG_LSB, BNO055_MODE_SWITCH_FROM_CONFIG_MS, BNO055_MODE_SWITCH_TO_CONFIG_MS, BNO055_QUAT_BLOCK, BNO055_QUAT_LSB, BNO055_REG1_ACC_CONFIG, BNO055_REG1_GYR_CONFIG_0, BNO055_REG1_INT_EN, BNO055_REG1_INT_MSK, BNO055_REG1_INT_SETTINGS_FIRST, BNO055_REG1_INT_SETTINGS_LAST, BNO055_REG1_MAG_CONFIG, BNO055_REG1_UNIQUE_ID, BNO055_REG_AXIS_MAP_CONFIG, BNO055_REG_CALIB_PROFILE, BNO055_REG_CALIB_STAT, BNO055_REG_INT_STA, BNO055_REG_OPR_MODE, BNO055_REG_PAGE_ID, BNO055_REG_PWR_MODE, BNO055_REG_QUA_DATA, BNO055_REG_SIC_MATRIX, BNO055_REG_ST_RESULT, BNO055_REG_SYS_CLK_STATUS, BNO055_REG_SYS_STATUS, BNO055_REG_SYS_TRIGGER, BNO055_REG_TEMP_SOURCE, BNO055_REG_UNIT_SEL, BNO055_SELF_TEST_MS, BNO055_SIC_IDENTITY, BNO055_SYS_STATUS_BOOTING, BNO055_SYS_TRIGGER_CLK_SEL, BNO055_SYS_TRIGGER_RST_INT, BNO055_SYS_TRIGGER_SELF_TEST, BNO055_UNIQUE_ID_LEN, Bno055OprMode, bno055IsFusion, bno055Lsb, bno055Placement, decodeBno055Block, makeBno055SystemStatus, packBno055AccelConfig, packBno055AxisRemap, packBno055CalibrationProfile, packBno055GyroConfig, packBno055MagConfig, packBno055SicMatrix, packBno055Units, unpackBno055AccelConfig, unpackBno055AxisRemap, unpackBno055CalibStatus, unpackBno055CalibrationProfile, unpackBno055GyroConfig, unpackBno055MagConfig, unpackBno055SicMatrix, unpackBno055Units, } from "./regs.js";
17
+ /** Decode one register window into a scaled sample. */
18
+ export function decodeBno055Sample(timestampUs, addr, data, units) {
19
+ const r = decodeBno055Block(addr, data);
20
+ const lsb = bno055Lsb(units);
21
+ const scale = (v, k) => v === null ? null : v.map((x) => x / k);
22
+ return {
23
+ timestampUs,
24
+ addr,
25
+ raw: data.slice(),
26
+ units,
27
+ accel: scale(r.accel, lsb.accel),
28
+ mag: scale(r.mag, BNO055_MAG_LSB),
29
+ gyro: scale(r.gyro, lsb.gyro),
30
+ euler: scale(r.euler, lsb.euler),
31
+ quaternion: scale(r.quaternion, BNO055_QUAT_LSB),
32
+ linearAccel: scale(r.linearAccel, BNO055_FUSION_ACCEL_LSB),
33
+ gravity: scale(r.gravity, BNO055_FUSION_ACCEL_LSB),
34
+ temperature: r.temperature === null ? null : r.temperature / lsb.temp,
35
+ calibration: r.calibStat === null ? null : unpackBno055CalibStatus(r.calibStat),
36
+ };
37
+ }
38
+ /**
39
+ * BNO055 absolute-orientation IMU.
40
+ *
41
+ * Typical use: `configure()` (CONFIG → units → axis remap → optional
42
+ * calibration profile → NDOF), then `startStream(10)` and read `samples()` /
43
+ * `onSample`, or poll `readSample()`. Streaming is timer-driven: the
44
+ * data-ready interrupt does not exist on the sensor firmware these boards
45
+ * carry (03.11).
46
+ *
47
+ * Multi-step register sequences (page switches, CONFIG round trips) are
48
+ * serialised internally, so concurrent calls cannot interleave mid-sequence.
49
+ * Page 1 is refused while a stream runs.
50
+ */
51
+ export class Bno055 extends DepzDevice {
52
+ sleepImpl;
53
+ chain = Promise.resolve();
54
+ unitsCache = null;
55
+ streamingFlag = false;
56
+ streamUnits = BNO055_DEFAULT_UNITS;
57
+ sampleCbs = [];
58
+ sampleQueues = [];
59
+ streamParseErrorCount = 0;
60
+ configured = null;
61
+ constructor(transport, opts) {
62
+ super(transport, opts);
63
+ this.sleepImpl = opts?.sleepImpl ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
64
+ }
65
+ // ── identity & bridge diagnostics ──────────────────────────────────────────
66
+ /** RPT_BNO_INFO: chip ids, sensor firmware revision and bridge counters. */
67
+ bridgeInfo() {
68
+ return this.request(Bno055Cmd.GetInfo, undefined, {
69
+ matcher: DepzDevice.expectReport(Bno055Rpt.Info, unpackBno055Info),
70
+ });
71
+ }
72
+ /** True when the bridge passed the chip-ID handshake and the ids match. */
73
+ async isAlive() {
74
+ try {
75
+ const info = await this.bridgeInfo();
76
+ return info.initialized === 1 && bno055IdsOk(info);
77
+ }
78
+ catch (err) {
79
+ if (err instanceof DepzError)
80
+ return false;
81
+ throw err;
82
+ }
83
+ }
84
+ /**
85
+ * Hardware reset via nRESET, then wait out the sensor's own boot tail
86
+ * (contract 13 §5). Stops any stream; the sensor comes back in CONFIG with
87
+ * power-on units — call configure() or restoreConfiguration().
88
+ */
89
+ resetSensor() {
90
+ return this.locked(async () => {
91
+ await this.request(Bno055Cmd.Reset, undefined, {
92
+ okCompletes: true,
93
+ timeoutMs: BNO055_RESET_TIMEOUT_MS,
94
+ });
95
+ this.streamingFlag = false;
96
+ this.unitsCache = null;
97
+ await this.waitBooted();
98
+ });
99
+ }
100
+ // ── raw register access ────────────────────────────────────────────────────
101
+ /** Read `length` bytes at `addr` on `page` (page 1 refused while streaming). */
102
+ readRegisters(addr, length, page = 0) {
103
+ return this.locked(() => this.onPage(page, async () => (await this.rd(addr, length)).data));
104
+ }
105
+ /** Write `data` at `addr` on `page`. Most config registers need CONFIG mode. */
106
+ writeRegisters(addr, data, page = 0) {
107
+ return this.locked(() => this.onPage(page, () => this.wr(addr, data)));
108
+ }
109
+ async readRegister(addr, page = 0) {
110
+ return (await this.readRegisters(addr, 1, page))[0];
111
+ }
112
+ writeRegister(addr, value, page = 0) {
113
+ return this.writeRegisters(addr, Uint8Array.of(value & 0xff), page);
114
+ }
115
+ // ── operating mode, power, units, axes ────────────────────────────────────
116
+ async getOperationMode() {
117
+ return ((await this.readRegister(BNO055_REG_OPR_MODE)) & 0x0f);
118
+ }
119
+ /**
120
+ * Switch OPR_MODE and wait out the switching time; into a fusion mode also
121
+ * wait (≤ 1 s) for the fusion outputs, zero for ~70 ms after CONFIG. The
122
+ * sensor ignores a direct write from one operating mode to another
123
+ * (measured: NDOF → AMG stays NDOF), so such a switch goes through CONFIG.
124
+ */
125
+ setOperationMode(mode) {
126
+ return this.locked(async () => {
127
+ if (mode !== Bno055OprMode.Config) {
128
+ const current = ((await this.rd(BNO055_REG_OPR_MODE, 1)).data[0] & 0x0f);
129
+ if (current === mode)
130
+ return;
131
+ if (current !== Bno055OprMode.Config)
132
+ await this.switchMode(Bno055OprMode.Config);
133
+ }
134
+ await this.switchMode(mode);
135
+ });
136
+ }
137
+ async getPowerMode() {
138
+ return ((await this.readRegister(BNO055_REG_PWR_MODE)) & 0x03);
139
+ }
140
+ setPowerMode(mode) {
141
+ return this.locked(() => this.inConfig(() => this.wr(BNO055_REG_PWR_MODE, Uint8Array.of(mode))));
142
+ }
143
+ async getUnits() {
144
+ const u = unpackBno055Units(await this.readRegister(BNO055_REG_UNIT_SEL));
145
+ this.unitsCache = u;
146
+ return u;
147
+ }
148
+ setUnits(units) {
149
+ return this.locked(() => this.inConfig(async () => {
150
+ await this.wr(BNO055_REG_UNIT_SEL, Uint8Array.of(packBno055Units(units)));
151
+ this.unitsCache = units;
152
+ }));
153
+ }
154
+ async getAxisRemap() {
155
+ const b = await this.readRegisters(BNO055_REG_AXIS_MAP_CONFIG, 2);
156
+ return unpackBno055AxisRemap(b[0], b[1]);
157
+ }
158
+ /** An AxisRemap, or a datasheet placement "P0".."P7" (P1 = default). */
159
+ setAxisRemap(remap) {
160
+ const r = typeof remap === "string" ? bno055Placement(remap) : remap;
161
+ const bytes = Uint8Array.from(packBno055AxisRemap(r));
162
+ return this.locked(() => this.inConfig(() => this.wr(BNO055_REG_AXIS_MAP_CONFIG, bytes)));
163
+ }
164
+ async getTemperatureSource() {
165
+ return ((await this.readRegister(BNO055_REG_TEMP_SOURCE)) & 0x03);
166
+ }
167
+ setTemperatureSource(source) {
168
+ return this.locked(() => this.inConfig(() => this.wr(BNO055_REG_TEMP_SOURCE, Uint8Array.of(source))));
169
+ }
170
+ /**
171
+ * The usual session setup: CONFIG → units → axis remap → calibration
172
+ * profile → mode (default NDOF). In a fusion mode it resolves once the
173
+ * fusion outputs are live. Remembered for restoreConfiguration().
174
+ */
175
+ configure(opts = {}) {
176
+ const mode = opts.mode ?? Bno055OprMode.Ndof;
177
+ const units = opts.units ?? BNO055_DEFAULT_UNITS;
178
+ const axis = typeof opts.axisRemap === "string" ? bno055Placement(opts.axisRemap) : opts.axisRemap;
179
+ return this.locked(async () => {
180
+ await this.waitBooted();
181
+ await this.switchMode(Bno055OprMode.Config);
182
+ await this.wr(BNO055_REG_UNIT_SEL, Uint8Array.of(packBno055Units(units)));
183
+ this.unitsCache = units;
184
+ if (axis !== undefined) {
185
+ await this.wr(BNO055_REG_AXIS_MAP_CONFIG, Uint8Array.from(packBno055AxisRemap(axis)));
186
+ }
187
+ if (opts.calibration !== undefined) {
188
+ await this.wr(BNO055_REG_CALIB_PROFILE, packBno055CalibrationProfile(opts.calibration));
189
+ }
190
+ await this.switchMode(mode);
191
+ if (bno055IsFusion(mode))
192
+ await this.waitFusionStarted(true);
193
+ this.configured = { mode, units, axisRemap: axis, calibration: opts.calibration };
194
+ });
195
+ }
196
+ /**
197
+ * Re-apply the last configure() — after resetSensor(), or when
198
+ * bridgeInfo().sensorResets rose (the bridge's bus recovery pulses nRESET).
199
+ */
200
+ restoreConfiguration() {
201
+ if (this.configured === null) {
202
+ return Promise.reject(new DepzError("configure() has not been called"));
203
+ }
204
+ return this.configure(this.configured);
205
+ }
206
+ // ── status, self-test, calibration ────────────────────────────────────────
207
+ /** ST_RESULT, SYS_CLK_STATUS, SYS_STATUS, SYS_ERR (INT_STA skipped). */
208
+ systemStatus() {
209
+ return this.locked(() => this.readSystemStatus());
210
+ }
211
+ /**
212
+ * Built-in self-test (datasheet §3.9.2): CONFIG, SYS_TRIGGER SELF_TEST,
213
+ * ~400 ms, then read the verdict. The mode is restored. Not while streaming.
214
+ */
215
+ selfTest() {
216
+ this.requireNotStreaming();
217
+ return this.locked(async () => {
218
+ const previous = ((await this.rd(BNO055_REG_OPR_MODE, 1)).data[0] & 0x0f);
219
+ if (previous !== Bno055OprMode.Config)
220
+ await this.switchMode(Bno055OprMode.Config);
221
+ try {
222
+ const clk = (await this.rd(BNO055_REG_SYS_TRIGGER, 1)).data[0] & BNO055_SYS_TRIGGER_CLK_SEL;
223
+ await this.wr(BNO055_REG_SYS_TRIGGER, Uint8Array.of(clk | BNO055_SYS_TRIGGER_SELF_TEST));
224
+ await this.sleepImpl(BNO055_SELF_TEST_MS);
225
+ const status = await this.readSystemStatus();
226
+ // Staying in CONFIG would leave SYS_STATUS at 4 for good.
227
+ if (previous === Bno055OprMode.Config)
228
+ await this.clearSelfTestStatus();
229
+ return status;
230
+ }
231
+ finally {
232
+ if (previous !== Bno055OprMode.Config)
233
+ await this.switchMode(previous);
234
+ }
235
+ });
236
+ }
237
+ async calibrationStatus() {
238
+ return unpackBno055CalibStatus(await this.readRegister(BNO055_REG_CALIB_STAT));
239
+ }
240
+ /** Offsets and radii (0x55..0x6A) — CONFIG only; the driver switches there and back. */
241
+ readCalibrationProfile() {
242
+ return this.locked(() => this.inConfig(async () => unpackBno055CalibrationProfile((await this.rd(BNO055_REG_CALIB_PROFILE, BNO055_CALIB_PROFILE_LEN)).data)));
243
+ }
244
+ /**
245
+ * Restore a stored profile: CONFIG, all 22 bytes, back to the previous
246
+ * mode. A starting point — fusion refines it as soon as it resumes.
247
+ */
248
+ writeCalibrationProfile(profile) {
249
+ return this.locked(() => this.inConfig(() => this.wr(BNO055_REG_CALIB_PROFILE, packBno055CalibrationProfile(profile))));
250
+ }
251
+ async getSicMatrix() {
252
+ return unpackBno055SicMatrix(await this.readRegisters(BNO055_REG_SIC_MATRIX, 18));
253
+ }
254
+ setSicMatrix(matrix = BNO055_SIC_IDENTITY) {
255
+ return this.locked(() => this.inConfig(() => this.wr(BNO055_REG_SIC_MATRIX, packBno055SicMatrix(matrix))));
256
+ }
257
+ // ── page 1: raw sensor configuration (non-fusion modes) ────────────────────
258
+ async getAccelConfig() {
259
+ return unpackBno055AccelConfig(await this.readRegister(BNO055_REG1_ACC_CONFIG, 1));
260
+ }
261
+ setAccelConfig(c) {
262
+ return this.writePage1Config(BNO055_REG1_ACC_CONFIG, Uint8Array.of(packBno055AccelConfig(c)));
263
+ }
264
+ async getGyroConfig() {
265
+ return unpackBno055GyroConfig(await this.readRegisters(BNO055_REG1_GYR_CONFIG_0, 2, 1));
266
+ }
267
+ setGyroConfig(c) {
268
+ return this.writePage1Config(BNO055_REG1_GYR_CONFIG_0, packBno055GyroConfig(c));
269
+ }
270
+ async getMagConfig() {
271
+ return unpackBno055MagConfig(await this.readRegister(BNO055_REG1_MAG_CONFIG, 1));
272
+ }
273
+ setMagConfig(c) {
274
+ return this.writePage1Config(BNO055_REG1_MAG_CONFIG, Uint8Array.of(packBno055MagConfig(c)));
275
+ }
276
+ /** The chip's 16-byte unique id (page 1, 0x50..0x5F). */
277
+ uniqueId() {
278
+ return this.readRegisters(BNO055_REG1_UNIQUE_ID, BNO055_UNIQUE_ID_LEN, 1);
279
+ }
280
+ // ── interrupts (motion only on SW rev 03.11) ───────────────────────────────
281
+ getInterruptEnable() {
282
+ return this.readRegister(BNO055_REG1_INT_EN, 1);
283
+ }
284
+ setInterruptEnable(mask) {
285
+ return this.writeRegister(BNO055_REG1_INT_EN, mask, 1);
286
+ }
287
+ getInterruptMask() {
288
+ return this.readRegister(BNO055_REG1_INT_MSK, 1);
289
+ }
290
+ setInterruptMask(mask) {
291
+ return this.writeRegister(BNO055_REG1_INT_MSK, mask, 1);
292
+ }
293
+ /** One raw motion-interrupt setting (page 1, 0x11..0x1F). Not while streaming. */
294
+ setInterruptSetting(register, value) {
295
+ if (register < BNO055_REG1_INT_SETTINGS_FIRST || register > BNO055_REG1_INT_SETTINGS_LAST) {
296
+ return Promise.reject(new RangeError(`0x${register.toString(16)} is not a page-1 interrupt setting`));
297
+ }
298
+ return this.writePage1Config(register, Uint8Array.of(value & 0xff));
299
+ }
300
+ /** INT_STA — which interrupts fired. Clears on read. */
301
+ readInterruptStatus() {
302
+ return this.readRegister(BNO055_REG_INT_STA);
303
+ }
304
+ /** SYS_TRIGGER RST_INT: reset the interrupt status bits and the INT pin. */
305
+ clearInterrupt() {
306
+ return this.locked(async () => {
307
+ const clk = (await this.rd(BNO055_REG_SYS_TRIGGER, 1)).data[0] & BNO055_SYS_TRIGGER_CLK_SEL;
308
+ await this.wr(BNO055_REG_SYS_TRIGGER, Uint8Array.of(clk | BNO055_SYS_TRIGGER_RST_INT));
309
+ });
310
+ }
311
+ // ── data ───────────────────────────────────────────────────────────────────
312
+ /** Poll one register block (default the full 46-byte block) and decode it. */
313
+ readSample(block = BNO055_FULL_BLOCK) {
314
+ return this.locked(async () => {
315
+ const units = await this.currentUnits();
316
+ const r = await this.rd(block[0], block[1]);
317
+ return decodeBno055Sample(r.timestampUs, block[0], r.data, units);
318
+ });
319
+ }
320
+ /** (w, x, y, z) — the cheapest orientation read. */
321
+ async readQuaternion() {
322
+ return (await this.readSample(BNO055_QUAT_BLOCK)).quaternion;
323
+ }
324
+ /**
325
+ * Arm the bridge: read `block` every `periodMs` and push it. Fusion runs at
326
+ * 100 Hz, so 10 ms is the useful floor. `trigger = BNO055_TRIGGER_INT`
327
+ * reads on the INT edge with `periodMs` as a watchdog. Replaces a stream.
328
+ */
329
+ startStream(periodMs = 10, block = BNO055_FULL_BLOCK, trigger = BNO055_TRIGGER_TIMER) {
330
+ const [addr, length] = block;
331
+ if (length < 1 || length > BNO055_XFER_MAX || addr + length > 0x100) {
332
+ return Promise.reject(new RangeError(`block 0x${addr.toString(16)}+${length} outside 1..128 / page`));
333
+ }
334
+ return this.locked(async () => {
335
+ // Units first: the read pump may decode the first sample before the
336
+ // command's own reply is processed.
337
+ this.streamUnits = await this.currentUnits();
338
+ await this.request(Bno055Cmd.StartStream, packBno055StartStream(trigger, addr, length, periodMs), {
339
+ okCompletes: true,
340
+ });
341
+ this.streamingFlag = true;
342
+ });
343
+ }
344
+ async stopStream() {
345
+ if (!this.streamingFlag)
346
+ return;
347
+ try {
348
+ await this.request(Bno055Cmd.StopStream, undefined, { okCompletes: true });
349
+ }
350
+ finally {
351
+ this.streamingFlag = false;
352
+ }
353
+ }
354
+ get streaming() {
355
+ return this.streamingFlag;
356
+ }
357
+ /** Subscribe to streamed samples (read-pump context; don't block). */
358
+ onSample(cb) {
359
+ this.sampleCbs.push(cb);
360
+ return () => {
361
+ this.sampleCbs = this.sampleCbs.filter((c) => c !== cb);
362
+ };
363
+ }
364
+ /** Async iterator over streamed samples — bounded, drop-oldest. */
365
+ samples(maxsize = 256) {
366
+ const queue = new StreamQueue(maxsize, () => {
367
+ this.sampleQueues = this.sampleQueues.filter((q) => q !== queue);
368
+ deregister();
369
+ });
370
+ this.sampleQueues.push(queue);
371
+ const deregister = this.registerStream(queue);
372
+ return queue;
373
+ }
374
+ /** Wait for the next streamed sample. */
375
+ async getSample(timeoutMs = 1000) {
376
+ const queue = new StreamQueue(1);
377
+ this.sampleQueues.push(queue);
378
+ const deregister = this.registerStream(queue);
379
+ let timer;
380
+ try {
381
+ const result = await Promise.race([
382
+ queue.next(),
383
+ new Promise((_, reject) => {
384
+ timer = setTimeout(() => reject(new DepzTimeoutError(Bno055Rpt.Stream, timeoutMs)), timeoutMs);
385
+ }),
386
+ ]);
387
+ if (result.done === true)
388
+ throw new DepzError("device closed");
389
+ return result.value;
390
+ }
391
+ finally {
392
+ if (timer !== undefined)
393
+ clearTimeout(timer);
394
+ this.sampleQueues = this.sampleQueues.filter((q) => q !== queue);
395
+ deregister();
396
+ }
397
+ }
398
+ /** Stream reports dropped because they did not decode (short block). */
399
+ get streamParseErrors() {
400
+ return this.streamParseErrorCount;
401
+ }
402
+ get streamDroppedCounts() {
403
+ return this.sampleQueues.map((q) => q.droppedCount);
404
+ }
405
+ // ── internal ───────────────────────────────────────────────────────────────
406
+ /** Run `fn` after every previously queued sequence (non-reentrant). */
407
+ locked(fn) {
408
+ const run = this.chain.then(fn, fn);
409
+ this.chain = run.catch(() => undefined);
410
+ return run;
411
+ }
412
+ async rd(addr, length) {
413
+ const out = new Uint8Array(length);
414
+ let off = 0;
415
+ let ts = 0n;
416
+ while (off < length) {
417
+ const n = Math.min(length - off, BNO055_XFER_MAX);
418
+ const rep = await this.request(Bno055Cmd.ReadReg, packBno055ReadReg(addr + off, n), {
419
+ matcher: DepzDevice.expectReport(Bno055Rpt.RegData, unpackBno055RegData),
420
+ });
421
+ if (rep.data.length !== n) {
422
+ throw new DepzError(`READ_REG 0x${(addr + off).toString(16)}: expected ${n}, got ${rep.data.length}`);
423
+ }
424
+ out.set(rep.data, off);
425
+ ts = rep.timestampUs;
426
+ off += n;
427
+ }
428
+ return { timestampUs: ts, data: out };
429
+ }
430
+ async wr(addr, data) {
431
+ for (let off = 0; off < data.length; off += BNO055_XFER_MAX) {
432
+ const chunk = data.subarray(off, off + BNO055_XFER_MAX);
433
+ await this.request(Bno055Cmd.WriteReg, packBno055WriteReg(addr + off, chunk), { okCompletes: true });
434
+ }
435
+ }
436
+ async onPage(page, fn) {
437
+ if (page === 0)
438
+ return fn();
439
+ if (page !== 1)
440
+ throw new RangeError(`BNO055 has register pages 0 and 1, not ${page}`);
441
+ this.requireNotStreaming();
442
+ await this.wr(BNO055_REG_PAGE_ID, Uint8Array.of(1));
443
+ try {
444
+ return await fn();
445
+ }
446
+ finally {
447
+ await this.wr(BNO055_REG_PAGE_ID, Uint8Array.of(0));
448
+ }
449
+ }
450
+ async switchMode(mode) {
451
+ await this.wr(BNO055_REG_OPR_MODE, Uint8Array.of(mode));
452
+ await this.sleepImpl(mode === Bno055OprMode.Config ? BNO055_MODE_SWITCH_TO_CONFIG_MS : BNO055_MODE_SWITCH_FROM_CONFIG_MS);
453
+ if (bno055IsFusion(mode))
454
+ await this.waitFusionStarted(false);
455
+ }
456
+ /** Run `fn` in CONFIG mode and put the previous mode back. */
457
+ async inConfig(fn) {
458
+ const previous = ((await this.rd(BNO055_REG_OPR_MODE, 1)).data[0] & 0x0f);
459
+ if (previous !== Bno055OprMode.Config)
460
+ await this.switchMode(Bno055OprMode.Config);
461
+ try {
462
+ return await fn();
463
+ }
464
+ finally {
465
+ if (previous !== Bno055OprMode.Config)
466
+ await this.switchMode(previous);
467
+ }
468
+ }
469
+ writePage1Config(addr, data) {
470
+ this.requireNotStreaming();
471
+ return this.locked(() => this.inConfig(() => this.onPage(1, () => this.wr(addr, data))));
472
+ }
473
+ async readSystemStatus() {
474
+ const st = (await this.rd(BNO055_REG_ST_RESULT, 1)).data[0];
475
+ const b = (await this.rd(BNO055_REG_SYS_CLK_STATUS, 3)).data;
476
+ return makeBno055SystemStatus(st, b[0], b[1], b[2]);
477
+ }
478
+ /** Poll SYS_STATUS until the sensor's own boot (init + POST) is over. */
479
+ /** A self-test run in CONFIG leaves SYS_STATUS at 4 until the mode leaves CONFIG; step into ACCONLY and back. */
480
+ async clearSelfTestStatus() {
481
+ await this.switchMode(Bno055OprMode.AccOnly);
482
+ await this.switchMode(Bno055OprMode.Config);
483
+ }
484
+ /** Poll SYS_STATUS until boot (init + POST) is over; a 4 that outlasts POST is a self-test leftover, cleared. */
485
+ async waitBooted() {
486
+ const deadline = Date.now() + BNO055_BOOT_SETTLE_TIMEOUT_MS;
487
+ let inSelfTest = 0;
488
+ let cleared = false;
489
+ for (;;) {
490
+ const status = (await this.rd(BNO055_REG_SYS_STATUS, 1)).data[0];
491
+ if (!BNO055_SYS_STATUS_BOOTING.includes(status))
492
+ return;
493
+ inSelfTest = status === 4 ? inSelfTest + 1 : 0;
494
+ if (inSelfTest >= BNO055_STUCK_SELF_TEST_POLLS && !cleared) {
495
+ await this.clearSelfTestStatus();
496
+ cleared = true;
497
+ inSelfTest = 0;
498
+ continue;
499
+ }
500
+ if (Date.now() > deadline)
501
+ throw new DepzError("BNO055 did not finish booting (SYS_STATUS stuck)");
502
+ await this.sleepImpl(5);
503
+ }
504
+ }
505
+ /** A running fusion never outputs the all-zero quaternion. */
506
+ async waitFusionStarted(strict) {
507
+ const deadline = Date.now() + BNO055_FUSION_START_TIMEOUT_MS;
508
+ while ((await this.rd(BNO055_REG_QUA_DATA, 8)).data.every((b) => b === 0)) {
509
+ if (Date.now() > deadline) {
510
+ if (strict)
511
+ throw new DepzError("BNO055 fusion did not start (quaternion stays zero)");
512
+ return;
513
+ }
514
+ await this.sleepImpl(10);
515
+ }
516
+ }
517
+ async currentUnits() {
518
+ if (this.unitsCache === null) {
519
+ this.unitsCache = unpackBno055Units((await this.rd(BNO055_REG_UNIT_SEL, 1)).data[0]);
520
+ }
521
+ return this.unitsCache;
522
+ }
523
+ requireNotStreaming() {
524
+ if (this.streamingFlag)
525
+ throw new DepzError("stopStream() first — the stream reads page 0");
526
+ }
527
+ handleReport(pkt) {
528
+ if (pkt.cmd !== Bno055Rpt.Stream)
529
+ return false;
530
+ if (pkt.payload.length < 10) {
531
+ this.streamParseErrorCount += 1;
532
+ return true;
533
+ }
534
+ const s = unpackBno055Stream(pkt.payload);
535
+ if (s.data.length !== s.length) {
536
+ this.streamParseErrorCount += 1;
537
+ return true;
538
+ }
539
+ const sample = decodeBno055Sample(s.timestampUs, s.addr, s.data, this.streamUnits);
540
+ for (const cb of [...this.sampleCbs])
541
+ cb(sample);
542
+ for (const q of [...this.sampleQueues])
543
+ q.push(sample);
544
+ return true;
545
+ }
546
+ }
547
+ //# sourceMappingURL=bno055.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bno055.js","sourceRoot":"","sources":["../../../src/sensors/bno055/bno055.ts"],"names":[],"mappings":"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"}