@depz/sensor-sdk 0.1.2 → 0.1.4
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 +4 -3
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +3 -0
- package/dist/discovery.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/protocol/identity.d.ts +1 -1
- package/dist/protocol/identity.d.ts.map +1 -1
- package/dist/protocol/identity.js +1 -0
- package/dist/protocol/identity.js.map +1 -1
- package/dist/protocol/usb-ids.d.ts +1 -1
- package/dist/protocol/usb-ids.js +2 -2
- package/dist/protocol/usb-ids.js.map +1 -1
- package/dist/protocol/vl53l4.d.ts +82 -0
- package/dist/protocol/vl53l4.d.ts.map +1 -0
- package/dist/protocol/vl53l4.js +108 -0
- package/dist/protocol/vl53l4.js.map +1 -0
- package/dist/sensors/bno086/bno086.d.ts +4 -3
- package/dist/sensors/bno086/bno086.d.ts.map +1 -1
- package/dist/sensors/bno086/bno086.js +7 -5
- package/dist/sensors/bno086/bno086.js.map +1 -1
- package/dist/sensors/vl53l4/uld.d.ts +214 -0
- package/dist/sensors/vl53l4/uld.d.ts.map +1 -0
- package/dist/sensors/vl53l4/uld.js +504 -0
- package/dist/sensors/vl53l4/uld.js.map +1 -0
- package/dist/sensors/vl53l4/vl53l4.d.ts +195 -0
- package/dist/sensors/vl53l4/vl53l4.d.ts.map +1 -0
- package/dist/sensors/vl53l4/vl53l4.js +399 -0
- package/dist/sensors/vl53l4/vl53l4.js.map +1 -0
- package/dist/sensors/vl53l8/uld.d.ts +8 -0
- package/dist/sensors/vl53l8/uld.d.ts.map +1 -1
- package/dist/sensors/vl53l8/uld.js +9 -1
- package/dist/sensors/vl53l8/uld.js.map +1 -1
- package/dist/transport/ws-backend.d.ts +19 -0
- package/dist/transport/ws-backend.d.ts.map +1 -1
- package/dist/transport/ws-backend.js +25 -1
- package/dist/transport/ws-backend.js.map +1 -1
- package/package.json +3 -2
|
@@ -0,0 +1,504 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* VL53L4CD ULD driver (ST STSW-IMG026 2.2.3) over the register bridge.
|
|
3
|
+
*
|
|
4
|
+
* Port of `VL53L4CD_api.c` + `VL53L4CD_calibration.c` — a 1:1 async mirror of
|
|
5
|
+
* the Python reference `depz_sensor_sdk.vl53l4.uld` (itself absorbed from the
|
|
6
|
+
* firmware repo's hardware-proven port). The MCU owns nothing but the I2C
|
|
7
|
+
* bus, XSHUT, INT and one streaming FSM — every register sequence below goes
|
|
8
|
+
* over VL53_READ_REG / VL53_WRITE_REG (contracts/10_SENSOR_VL53L4.md §1).
|
|
9
|
+
*
|
|
10
|
+
* Register sequences are a faithful port of the C code, integer widths and
|
|
11
|
+
* 32-bit truncations included; do not "simplify" them. Pure codec/math pieces
|
|
12
|
+
* (`parseResultBlock`, `rangeTimingRegisters`, `decodeRangeTiming`,
|
|
13
|
+
* `configBlock`, the tuning codecs) are module functions so the golden
|
|
14
|
+
* vectors can hold them to byte-exact parity with the other SDKs.
|
|
15
|
+
*/
|
|
16
|
+
export const ULD_VERSION = [2, 2, 3, 0];
|
|
17
|
+
// ── Registers (VL53L4CD_api.h) ───────────────────────────────────────────────
|
|
18
|
+
export const SOFT_RESET = 0x0000;
|
|
19
|
+
export const I2C_SLAVE__DEVICE_ADDRESS = 0x0001;
|
|
20
|
+
/** Unnamed in the C driver. */
|
|
21
|
+
export const OSC_FREQUENCY = 0x0006;
|
|
22
|
+
export const VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND = 0x0008;
|
|
23
|
+
export const XTALK_PLANE_OFFSET_KCPS = 0x0016;
|
|
24
|
+
export const XTALK_X_PLANE_GRADIENT_KCPS = 0x0018;
|
|
25
|
+
export const XTALK_Y_PLANE_GRADIENT_KCPS = 0x001a;
|
|
26
|
+
export const RANGE_OFFSET_MM = 0x001e;
|
|
27
|
+
export const INNER_OFFSET_MM = 0x0020;
|
|
28
|
+
export const OUTER_OFFSET_MM = 0x0022;
|
|
29
|
+
export const GPIO_HV_MUX__CTRL = 0x0030;
|
|
30
|
+
export const GPIO__TIO_HV_STATUS = 0x0031;
|
|
31
|
+
export const SYSTEM__INTERRUPT = 0x0046;
|
|
32
|
+
export const RANGE_CONFIG_A = 0x005e;
|
|
33
|
+
export const RANGE_CONFIG_B = 0x0061;
|
|
34
|
+
export const RANGE_CONFIG__SIGMA_THRESH = 0x0064;
|
|
35
|
+
export const MIN_COUNT_RATE_RTN_LIMIT_MCPS = 0x0066;
|
|
36
|
+
export const INTERMEASUREMENT_MS = 0x006c;
|
|
37
|
+
export const THRESH_HIGH = 0x0072;
|
|
38
|
+
export const THRESH_LOW = 0x0074;
|
|
39
|
+
export const SYSTEM__INTERRUPT_CLEAR = 0x0086;
|
|
40
|
+
export const SYSTEM_START = 0x0087;
|
|
41
|
+
export const RESULT__RANGE_STATUS = 0x0089;
|
|
42
|
+
export const RESULT__SPAD_NB = 0x008c;
|
|
43
|
+
export const RESULT__SIGNAL_RATE = 0x008e;
|
|
44
|
+
export const RESULT__AMBIENT_RATE = 0x0090;
|
|
45
|
+
export const RESULT__SIGMA = 0x0092;
|
|
46
|
+
export const RESULT__DISTANCE = 0x0096;
|
|
47
|
+
export const RESULT__OSC_CALIBRATE_VAL = 0x00de;
|
|
48
|
+
export const FIRMWARE__SYSTEM_STATUS = 0x00e5;
|
|
49
|
+
export const IDENTIFICATION__MODEL_ID = 0x010f;
|
|
50
|
+
export const MODEL_ID_VL53L4CD = 0xebaa;
|
|
51
|
+
// Detection-threshold window modes (SYSTEM__INTERRUPT).
|
|
52
|
+
export const WINDOW_BELOW = 0;
|
|
53
|
+
export const WINDOW_ABOVE = 1;
|
|
54
|
+
export const WINDOW_OUT = 2;
|
|
55
|
+
export const WINDOW_IN = 3;
|
|
56
|
+
export const CONFIG_ADDR = 0x002d;
|
|
57
|
+
export const CONFIG_END = 0x0087;
|
|
58
|
+
/**
|
|
59
|
+
* VL53L4CD_DEFAULT_CONFIGURATION[] — 91 bytes, registers 0x2D..0x87.
|
|
60
|
+
* `configBlock()` always overrides byte 0 (register 0x2D) with
|
|
61
|
+
* CONFIG_FMP_BYTE (0x12) to put the sensor's I2C pad in Fast Mode Plus —
|
|
62
|
+
* exactly what VL53L4CD_I2C_FAST_MODE_PLUS does in the C ULD. FM+ pads work
|
|
63
|
+
* at every bus step down to 100 kHz, so it is set unconditionally and never
|
|
64
|
+
* cleared (clearing it mid-block NACKs and truncates the write).
|
|
65
|
+
*/
|
|
66
|
+
// prettier-ignore
|
|
67
|
+
export const DEFAULT_CONFIGURATION = Uint8Array.from([
|
|
68
|
+
0x00, 0x00, 0x00, 0x11, 0x02, 0x00, 0x02, 0x08, // 0x2D..0x34
|
|
69
|
+
0x00, 0x08, 0x10, 0x01, 0x01, 0x00, 0x00, 0x00, // 0x35..0x3C
|
|
70
|
+
0x00, 0xff, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, // 0x3D..0x44
|
|
71
|
+
0x00, 0x20, 0x0b, 0x00, 0x00, 0x02, 0x14, 0x21, // 0x45..0x4C
|
|
72
|
+
0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0xc8, // 0x4D..0x54
|
|
73
|
+
0x00, 0x00, 0x38, 0xff, 0x01, 0x00, 0x08, 0x00, // 0x55..0x5C
|
|
74
|
+
0x00, 0x01, 0xcc, 0x07, 0x01, 0xf1, 0x05, 0x00, // 0x5D..0x64
|
|
75
|
+
0xa0, 0x00, 0x80, 0x08, 0x38, 0x00, 0x00, 0x00, // 0x65..0x6C
|
|
76
|
+
0x00, 0x0f, 0x89, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x6D..0x74
|
|
77
|
+
0x00, 0x00, 0x01, 0x07, 0x05, 0x06, 0x06, 0x00, // 0x75..0x7C
|
|
78
|
+
0x00, 0x02, 0xc7, 0xff, 0x9b, 0x00, 0x00, 0x00, // 0x7D..0x84
|
|
79
|
+
0x01, 0x00, 0x00, // 0x85..0x87
|
|
80
|
+
]);
|
|
81
|
+
export const CONFIG_FMP_BYTE = 0x12;
|
|
82
|
+
// The block the MCU streams: RESULT__RANGE_STATUS .. 0x0099 — every field of
|
|
83
|
+
// VL53L4CD_ResultsData_t in one read.
|
|
84
|
+
export const RESULT_BLOCK_ADDR = RESULT__RANGE_STATUS;
|
|
85
|
+
export const RESULT_BLOCK_LEN = 17;
|
|
86
|
+
// The bridge boots at 400 kHz and an unconfigured sensor is only specified
|
|
87
|
+
// for that speed, so init always runs its configuration block there. The bus
|
|
88
|
+
// is left at I2C_KHZ_DEFAULT afterwards (the block read is ~4x faster at 1 MHz).
|
|
89
|
+
export const I2C_KHZ_BOOT = 400;
|
|
90
|
+
export const I2C_KHZ_DEFAULT = 1000;
|
|
91
|
+
/** GetResult() raw status → ULD status (status_rtn[24] in VL53L4CD_api.c). */
|
|
92
|
+
// prettier-ignore
|
|
93
|
+
export const STATUS_RTN = [
|
|
94
|
+
255, 255, 255, 5, 2, 4, 1, 7, 3,
|
|
95
|
+
0, 255, 255, 9, 13, 255, 255, 255, 255, 10, 6,
|
|
96
|
+
255, 255, 11, 12,
|
|
97
|
+
];
|
|
98
|
+
/** UM2931, "Range status description". */
|
|
99
|
+
export const RANGE_STATUS_NAMES = {
|
|
100
|
+
0: "valid",
|
|
101
|
+
1: "sigma above threshold",
|
|
102
|
+
2: "signal below threshold",
|
|
103
|
+
3: "distance below detection threshold",
|
|
104
|
+
4: "phase out of valid limit",
|
|
105
|
+
5: "hardware fail",
|
|
106
|
+
6: "no wrap-around check done",
|
|
107
|
+
7: "wrapped target, phase mismatch",
|
|
108
|
+
8: "processing fail",
|
|
109
|
+
9: "crosstalk signal fail",
|
|
110
|
+
10: "interrupt error",
|
|
111
|
+
11: "merged target",
|
|
112
|
+
12: "signal too low",
|
|
113
|
+
255: "other error",
|
|
114
|
+
};
|
|
115
|
+
export class Vl53l4cdError extends Error {
|
|
116
|
+
constructor(message) {
|
|
117
|
+
super(message);
|
|
118
|
+
this.name = "Vl53l4cdError";
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
/** Human-readable text for a decoded range status. */
|
|
122
|
+
export function rangeStatusText(rangeStatus) {
|
|
123
|
+
return RANGE_STATUS_NAMES[rangeStatus] ?? `unknown (${rangeStatus})`;
|
|
124
|
+
}
|
|
125
|
+
/** Exact 32-bit truncation (`& 0xFFFFFFFF` in the Python reference). */
|
|
126
|
+
function u32(x) {
|
|
127
|
+
return x >>> 0;
|
|
128
|
+
}
|
|
129
|
+
function beWord(raw, off) {
|
|
130
|
+
return ((raw[off] << 8) | raw[off + 1]) & 0xffff;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Decode the streamed 0x0089..0x0099 block exactly as VL53L4CD_GetResult()
|
|
134
|
+
* decodes the same registers read one by one. Register contents are
|
|
135
|
+
* big-endian words (the bridge passes them through untouched).
|
|
136
|
+
*/
|
|
137
|
+
export function parseResultBlock(raw) {
|
|
138
|
+
if (raw.length < 15) {
|
|
139
|
+
throw new Vl53l4cdError(`result block too short: ${raw.length} bytes`);
|
|
140
|
+
}
|
|
141
|
+
let status = raw[0] & 0x1f;
|
|
142
|
+
if (status < STATUS_RTN.length) {
|
|
143
|
+
status = STATUS_RTN[status];
|
|
144
|
+
}
|
|
145
|
+
const rawSpads = beWord(raw, 3); // 0x008C
|
|
146
|
+
const signalKcps = beWord(raw, 5) * 8; // 0x008E
|
|
147
|
+
const ambientKcps = beWord(raw, 7) * 8; // 0x0090
|
|
148
|
+
return {
|
|
149
|
+
rangeStatus: status,
|
|
150
|
+
streamCount: raw[2],
|
|
151
|
+
numberOfSpad: Math.floor(rawSpads / 256),
|
|
152
|
+
signalRateKcps: signalKcps,
|
|
153
|
+
ambientRateKcps: ambientKcps,
|
|
154
|
+
sigmaMm: Math.floor(beWord(raw, 9) / 4), // 0x0092
|
|
155
|
+
distanceMm: beWord(raw, 13), // 0x0096
|
|
156
|
+
signalPerSpadKcps: rawSpads !== 0 ? Math.floor((signalKcps * 256) / rawSpads) : 0,
|
|
157
|
+
ambientPerSpadKcps: rawSpads !== 0 ? Math.floor((ambientKcps * 256) / rawSpads) : 0,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The 91-byte block sensorInit() writes at CONFIG_ADDR: the ST default
|
|
162
|
+
* configuration with byte 0 forced to CONFIG_FMP_BYTE (Fast Mode Plus).
|
|
163
|
+
*/
|
|
164
|
+
export function configBlock() {
|
|
165
|
+
const out = DEFAULT_CONFIGURATION.slice();
|
|
166
|
+
out[0] = CONFIG_FMP_BYTE;
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* SetRangeTiming register math → RANGE_CONFIG_A, RANGE_CONFIG_B and the
|
|
171
|
+
* INTERMEASUREMENT_MS raw dword.
|
|
172
|
+
*
|
|
173
|
+
* `oscFrequency` is the word read from 0x0006; `clockPll` is the word read
|
|
174
|
+
* from RESULT__OSC_CALIBRATE_VAL (used only in autonomous mode, i.e. when
|
|
175
|
+
* `interMeasurementMs > 0`).
|
|
176
|
+
*/
|
|
177
|
+
export function rangeTimingRegisters(timingBudgetMs, interMeasurementMs, oscFrequency, clockPll = 0) {
|
|
178
|
+
if (oscFrequency === 0)
|
|
179
|
+
throw new Vl53l4cdError("oscFrequency reads 0");
|
|
180
|
+
if (!(timingBudgetMs >= 10 && timingBudgetMs <= 200)) {
|
|
181
|
+
throw new Vl53l4cdError("timingBudgetMs must be 10..200");
|
|
182
|
+
}
|
|
183
|
+
let timingBudgetUs = timingBudgetMs * 1000;
|
|
184
|
+
const macroPeriodUs = u32(2304 * Math.floor(0x40000000 / oscFrequency)) >>> 6;
|
|
185
|
+
let intermeasurementRaw;
|
|
186
|
+
if (interMeasurementMs === 0) {
|
|
187
|
+
// continuous
|
|
188
|
+
intermeasurementRaw = 0;
|
|
189
|
+
timingBudgetUs -= 2500;
|
|
190
|
+
}
|
|
191
|
+
else if (interMeasurementMs > timingBudgetMs) {
|
|
192
|
+
// autonomous low power (1.055 is a frozen double-precision PLL factor)
|
|
193
|
+
intermeasurementRaw = Math.floor(1.055 * interMeasurementMs * (clockPll & 0x3ff));
|
|
194
|
+
timingBudgetUs = Math.floor((timingBudgetUs - 4300) / 2);
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
throw new Vl53l4cdError("interMeasurementMs must be 0 or > timingBudgetMs");
|
|
198
|
+
}
|
|
199
|
+
timingBudgetUs = u32(timingBudgetUs * 4096); // (x << 12) & 0xFFFFFFFF
|
|
200
|
+
const words = [];
|
|
201
|
+
for (const mult of [16, 12]) {
|
|
202
|
+
// RANGE_CONFIG_A, RANGE_CONFIG_B
|
|
203
|
+
const tmp = u32(macroPeriodUs * mult) >>> 6;
|
|
204
|
+
let lsByte = Math.floor((timingBudgetUs + (tmp >>> 1)) / tmp) - 1;
|
|
205
|
+
let msByte = 0;
|
|
206
|
+
while (lsByte > 0xff) {
|
|
207
|
+
// ls_byte & 0xFFFFFF00 in the reference (lsByte is non-negative here)
|
|
208
|
+
lsByte = Math.floor(lsByte / 2);
|
|
209
|
+
msByte += 1;
|
|
210
|
+
}
|
|
211
|
+
words.push(((msByte << 8) + (lsByte & 0xff)) & 0xffff);
|
|
212
|
+
}
|
|
213
|
+
return { rangeConfigA: words[0], rangeConfigB: words[1], intermeasurementRaw };
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* GetRangeTiming register math → timing budget and inter-measurement period.
|
|
217
|
+
*
|
|
218
|
+
* Inputs are the raw register reads: INTERMEASUREMENT_MS dword, the
|
|
219
|
+
* RESULT__OSC_CALIBRATE_VAL word, the 0x0006 word and the RANGE_CONFIG_A
|
|
220
|
+
* word.
|
|
221
|
+
*/
|
|
222
|
+
export function decodeRangeTiming(intermeasurementRaw, clockPll, oscFrequency, rangeConfigA) {
|
|
223
|
+
if (oscFrequency === 0)
|
|
224
|
+
throw new Vl53l4cdError("oscFrequency reads 0");
|
|
225
|
+
// 1.065 is a frozen double-precision PLL factor.
|
|
226
|
+
const pll = Math.floor(1.065 * (clockPll & 0x3ff)) & 0xffff;
|
|
227
|
+
const interMeasurementMs = pll !== 0 ? Math.floor(intermeasurementRaw / pll) & 0xffff : 0;
|
|
228
|
+
let macroPeriodUs = u32(2304 * Math.floor(0x40000000 / oscFrequency)) >>> 6;
|
|
229
|
+
const lsByte = (rangeConfigA & 0x00ff) << 4;
|
|
230
|
+
let msByte = (rangeConfigA & 0xff00) >> 8;
|
|
231
|
+
msByte = u32(0x04 - (msByte - 1) - 1);
|
|
232
|
+
macroPeriodUs = u32(macroPeriodUs * 16);
|
|
233
|
+
const sub = macroPeriodUs >>> 6;
|
|
234
|
+
let budget = u32((lsByte + 1) * sub - (sub >>> 1)) >>> 12;
|
|
235
|
+
if (msByte < 12)
|
|
236
|
+
budget >>= msByte;
|
|
237
|
+
budget = intermeasurementRaw === 0 ? budget + 2500 : budget * 2 + 4300;
|
|
238
|
+
return { timingBudgetMs: Math.floor(budget / 1000), interMeasurementMs };
|
|
239
|
+
}
|
|
240
|
+
// ── Threshold / offset / xtalk raw codecs (register word ↔ user units) ───────
|
|
241
|
+
/** RANGE_OFFSET_MM word for setOffset (INNER/OUTER are zeroed alongside). */
|
|
242
|
+
export function offsetRaw(offsetMm) {
|
|
243
|
+
return (offsetMm * 4) & 0xffff;
|
|
244
|
+
}
|
|
245
|
+
/** getOffset: RANGE_OFFSET_MM word → signed millimetres. */
|
|
246
|
+
export function decodeOffset(rawWord) {
|
|
247
|
+
const temp = ((rawWord << 3) & 0xffff) >> 5;
|
|
248
|
+
return temp > 1024 ? temp - 2048 : temp;
|
|
249
|
+
}
|
|
250
|
+
/** XTALK_PLANE_OFFSET_KCPS word for setXtalk. */
|
|
251
|
+
export function xtalkRaw(xtalkKcps) {
|
|
252
|
+
return (xtalkKcps << 9) & 0xffff;
|
|
253
|
+
}
|
|
254
|
+
/** getXtalk: XTALK_PLANE_OFFSET_KCPS word → kcps. */
|
|
255
|
+
export function decodeXtalk(rawWord) {
|
|
256
|
+
return roundHalfEven(rawWord / 512.0);
|
|
257
|
+
}
|
|
258
|
+
export function signalThresholdRaw(signalKcps) {
|
|
259
|
+
return signalKcps >> 3;
|
|
260
|
+
}
|
|
261
|
+
export function decodeSignalThreshold(rawWord) {
|
|
262
|
+
return (rawWord << 3) & 0xffff;
|
|
263
|
+
}
|
|
264
|
+
export function sigmaThresholdRaw(sigmaMm) {
|
|
265
|
+
if (sigmaMm > 0xffff >> 2) {
|
|
266
|
+
throw new Vl53l4cdError("sigmaMm must be <= 16383");
|
|
267
|
+
}
|
|
268
|
+
return sigmaMm << 2;
|
|
269
|
+
}
|
|
270
|
+
export function decodeSigmaThreshold(rawWord) {
|
|
271
|
+
return rawWord >> 2;
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Python's banker's rounding (`round()`): exact .5 goes to the nearest even
|
|
275
|
+
* integer. Keeps the codecs bit-identical to the reference.
|
|
276
|
+
*/
|
|
277
|
+
function roundHalfEven(x) {
|
|
278
|
+
const r = Math.round(x);
|
|
279
|
+
return Math.abs(x % 1) === 0.5 && r % 2 !== 0 ? r - 1 : r;
|
|
280
|
+
}
|
|
281
|
+
/** Port of VL53L4CD_api.c + VL53L4CD_calibration.c (ULD 2.2.3). */
|
|
282
|
+
export class VL53L4CD {
|
|
283
|
+
p;
|
|
284
|
+
constructor(p) {
|
|
285
|
+
this.p = p;
|
|
286
|
+
}
|
|
287
|
+
// ── register access helpers (16-bit addr, big-endian contents) ─────────────
|
|
288
|
+
async rdByte(addr) {
|
|
289
|
+
return (await this.p.rdMulti(addr, 1))[0];
|
|
290
|
+
}
|
|
291
|
+
async rdWord(addr) {
|
|
292
|
+
const b = await this.p.rdMulti(addr, 2);
|
|
293
|
+
return ((b[0] << 8) | b[1]) & 0xffff;
|
|
294
|
+
}
|
|
295
|
+
async rdDword(addr) {
|
|
296
|
+
const b = await this.p.rdMulti(addr, 4);
|
|
297
|
+
return ((b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]) >>> 0;
|
|
298
|
+
}
|
|
299
|
+
async wrByte(addr, value) {
|
|
300
|
+
await this.p.wrMulti(addr, Uint8Array.of(value & 0xff));
|
|
301
|
+
}
|
|
302
|
+
async wrWord(addr, value) {
|
|
303
|
+
await this.p.wrMulti(addr, Uint8Array.of((value >> 8) & 0xff, value & 0xff));
|
|
304
|
+
}
|
|
305
|
+
async wrDword(addr, value) {
|
|
306
|
+
await this.p.wrMulti(addr, Uint8Array.of((value >>> 24) & 0xff, (value >>> 16) & 0xff, (value >>> 8) & 0xff, value & 0xff));
|
|
307
|
+
}
|
|
308
|
+
// ── identity ───────────────────────────────────────────────────────────────
|
|
309
|
+
getSensorId() {
|
|
310
|
+
return this.rdWord(IDENTIFICATION__MODEL_ID);
|
|
311
|
+
}
|
|
312
|
+
async isAlive() {
|
|
313
|
+
return (await this.getSensorId()) === MODEL_ID_VL53L4CD;
|
|
314
|
+
}
|
|
315
|
+
// ── init ───────────────────────────────────────────────────────────────────
|
|
316
|
+
async waitBoot(timeoutMs = 1000) {
|
|
317
|
+
for (let i = 0; i < Math.max(1, timeoutMs); i++) {
|
|
318
|
+
if ((await this.rdByte(FIRMWARE__SYSTEM_STATUS)) === 0x03)
|
|
319
|
+
return;
|
|
320
|
+
await this.p.sleepMs(1);
|
|
321
|
+
}
|
|
322
|
+
throw new Vl53l4cdError("timeout waiting for FIRMWARE__SYSTEM_STATUS == 0x03");
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Initialise the sensor and leave the bus at `busKhz`.
|
|
326
|
+
*
|
|
327
|
+
* The configuration block is written at I2C_KHZ_BOOT (400 kHz) because that
|
|
328
|
+
* is the only speed an unconfigured sensor is specified for; the bridge is
|
|
329
|
+
* re-timed to `busKhz` after it. A sensor reset just re-runs this whole
|
|
330
|
+
* sequence.
|
|
331
|
+
*/
|
|
332
|
+
async sensorInit(busKhz = I2C_KHZ_DEFAULT) {
|
|
333
|
+
await this.p.setI2cSpeed(I2C_KHZ_BOOT);
|
|
334
|
+
await this.waitBoot();
|
|
335
|
+
// The C driver writes the 91 bytes one register at a time; the sensor
|
|
336
|
+
// auto-increments, so one transaction does the same job.
|
|
337
|
+
await this.p.wrMulti(CONFIG_ADDR, configBlock());
|
|
338
|
+
if (busKhz !== I2C_KHZ_BOOT) {
|
|
339
|
+
await this.p.setI2cSpeed(busKhz);
|
|
340
|
+
}
|
|
341
|
+
await this.wrByte(SYSTEM_START, 0x40); // start VHV
|
|
342
|
+
await this.waitDataReady();
|
|
343
|
+
await this.clearInterrupt();
|
|
344
|
+
await this.stopRanging();
|
|
345
|
+
await this.wrByte(VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09);
|
|
346
|
+
await this.wrByte(0x000b, 0x00);
|
|
347
|
+
await this.wrWord(0x0024, 0x0500);
|
|
348
|
+
await this.setRangeTiming(50, 0);
|
|
349
|
+
}
|
|
350
|
+
// ── ranging ────────────────────────────────────────────────────────────────
|
|
351
|
+
async clearInterrupt() {
|
|
352
|
+
await this.wrByte(SYSTEM__INTERRUPT_CLEAR, 0x01);
|
|
353
|
+
}
|
|
354
|
+
async startRanging() {
|
|
355
|
+
// 0 = continuous, anything else = autonomous low power.
|
|
356
|
+
const mode = (await this.rdDword(INTERMEASUREMENT_MS)) === 0 ? 0x21 : 0x40;
|
|
357
|
+
await this.wrByte(SYSTEM_START, mode);
|
|
358
|
+
}
|
|
359
|
+
async stopRanging() {
|
|
360
|
+
await this.wrByte(SYSTEM_START, 0x80);
|
|
361
|
+
}
|
|
362
|
+
async checkForDataReady() {
|
|
363
|
+
const intPol = (((await this.rdByte(GPIO_HV_MUX__CTRL)) & 0x10) >> 4) === 1 ? 0 : 1;
|
|
364
|
+
return ((await this.rdByte(GPIO__TIO_HV_STATUS)) & 1) === intPol;
|
|
365
|
+
}
|
|
366
|
+
async waitDataReady(timeoutMs = 1000) {
|
|
367
|
+
for (let i = 0; i < Math.max(1, timeoutMs); i++) {
|
|
368
|
+
if (await this.checkForDataReady())
|
|
369
|
+
return;
|
|
370
|
+
await this.p.sleepMs(1);
|
|
371
|
+
}
|
|
372
|
+
throw new Vl53l4cdError("timeout waiting for data ready");
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* One block read instead of the C driver's six register reads — the sensor
|
|
376
|
+
* auto-increments and the decoding is identical.
|
|
377
|
+
*/
|
|
378
|
+
async getResult() {
|
|
379
|
+
return parseResultBlock(await this.p.rdMulti(RESULT_BLOCK_ADDR, RESULT_BLOCK_LEN));
|
|
380
|
+
}
|
|
381
|
+
// ── timing ─────────────────────────────────────────────────────────────────
|
|
382
|
+
async setRangeTiming(timingBudgetMs, interMeasurementMs) {
|
|
383
|
+
const clockPll = interMeasurementMs > 0 ? await this.rdWord(RESULT__OSC_CALIBRATE_VAL) : 0;
|
|
384
|
+
const { rangeConfigA, rangeConfigB, intermeasurementRaw } = rangeTimingRegisters(timingBudgetMs, interMeasurementMs, await this.rdWord(OSC_FREQUENCY), clockPll);
|
|
385
|
+
await this.wrDword(INTERMEASUREMENT_MS, intermeasurementRaw);
|
|
386
|
+
await this.wrWord(RANGE_CONFIG_A, rangeConfigA);
|
|
387
|
+
await this.wrWord(RANGE_CONFIG_B, rangeConfigB);
|
|
388
|
+
}
|
|
389
|
+
async getRangeTiming() {
|
|
390
|
+
return decodeRangeTiming(await this.rdDword(INTERMEASUREMENT_MS), await this.rdWord(RESULT__OSC_CALIBRATE_VAL), await this.rdWord(OSC_FREQUENCY), await this.rdWord(RANGE_CONFIG_A));
|
|
391
|
+
}
|
|
392
|
+
// ── offset ─────────────────────────────────────────────────────────────────
|
|
393
|
+
async setOffset(offsetMm) {
|
|
394
|
+
await this.wrWord(RANGE_OFFSET_MM, offsetRaw(offsetMm));
|
|
395
|
+
await this.wrWord(INNER_OFFSET_MM, 0);
|
|
396
|
+
await this.wrWord(OUTER_OFFSET_MM, 0);
|
|
397
|
+
}
|
|
398
|
+
async getOffset() {
|
|
399
|
+
return decodeOffset(await this.rdWord(RANGE_OFFSET_MM));
|
|
400
|
+
}
|
|
401
|
+
// ── crosstalk ──────────────────────────────────────────────────────────────
|
|
402
|
+
async setXtalk(xtalkKcps) {
|
|
403
|
+
await this.wrWord(XTALK_X_PLANE_GRADIENT_KCPS, 0x0000);
|
|
404
|
+
await this.wrWord(XTALK_Y_PLANE_GRADIENT_KCPS, 0x0000);
|
|
405
|
+
await this.wrWord(XTALK_PLANE_OFFSET_KCPS, xtalkRaw(xtalkKcps));
|
|
406
|
+
}
|
|
407
|
+
async getXtalk() {
|
|
408
|
+
return decodeXtalk(await this.rdWord(XTALK_PLANE_OFFSET_KCPS));
|
|
409
|
+
}
|
|
410
|
+
// ── thresholds ─────────────────────────────────────────────────────────────
|
|
411
|
+
async setDetectionThresholds(distanceLowMm, distanceHighMm, window) {
|
|
412
|
+
await this.wrByte(SYSTEM__INTERRUPT, window);
|
|
413
|
+
await this.wrWord(THRESH_HIGH, distanceHighMm);
|
|
414
|
+
await this.wrWord(THRESH_LOW, distanceLowMm);
|
|
415
|
+
}
|
|
416
|
+
async getDetectionThresholds() {
|
|
417
|
+
const distanceHighMm = await this.rdWord(THRESH_HIGH);
|
|
418
|
+
const distanceLowMm = await this.rdWord(THRESH_LOW);
|
|
419
|
+
const window = (await this.rdByte(SYSTEM__INTERRUPT)) & 0x07;
|
|
420
|
+
return { distanceLowMm, distanceHighMm, window };
|
|
421
|
+
}
|
|
422
|
+
async setSignalThreshold(signalKcps) {
|
|
423
|
+
await this.wrWord(MIN_COUNT_RATE_RTN_LIMIT_MCPS, signalThresholdRaw(signalKcps));
|
|
424
|
+
}
|
|
425
|
+
async getSignalThreshold() {
|
|
426
|
+
return decodeSignalThreshold(await this.rdWord(MIN_COUNT_RATE_RTN_LIMIT_MCPS));
|
|
427
|
+
}
|
|
428
|
+
async setSigmaThreshold(sigmaMm) {
|
|
429
|
+
await this.wrWord(RANGE_CONFIG__SIGMA_THRESH, sigmaThresholdRaw(sigmaMm));
|
|
430
|
+
}
|
|
431
|
+
async getSigmaThreshold() {
|
|
432
|
+
return decodeSigmaThreshold(await this.rdWord(RANGE_CONFIG__SIGMA_THRESH));
|
|
433
|
+
}
|
|
434
|
+
// ── temperature ────────────────────────────────────────────────────────────
|
|
435
|
+
/** Recommended after a >8 °C ambient change (ST Example_3). */
|
|
436
|
+
async startTemperatureUpdate() {
|
|
437
|
+
await this.wrByte(VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x81);
|
|
438
|
+
await this.wrByte(0x000b, 0x92);
|
|
439
|
+
await this.startRanging();
|
|
440
|
+
await this.waitDataReady();
|
|
441
|
+
await this.clearInterrupt();
|
|
442
|
+
await this.stopRanging();
|
|
443
|
+
await this.wrByte(VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09);
|
|
444
|
+
await this.wrByte(0x000b, 0x00);
|
|
445
|
+
}
|
|
446
|
+
// ── calibration (VL53L4CD_calibration.c) ───────────────────────────────────
|
|
447
|
+
/**
|
|
448
|
+
* The ranging loop both calibrations share: data-ready, getResult,
|
|
449
|
+
* clearInterrupt, `nbSamples` times.
|
|
450
|
+
*/
|
|
451
|
+
async collect(nbSamples, onSample, timeoutMs = 5000) {
|
|
452
|
+
await this.startRanging();
|
|
453
|
+
for (let i = 0; i < nbSamples; i++) {
|
|
454
|
+
await this.waitDataReady(timeoutMs);
|
|
455
|
+
const result = await this.getResult();
|
|
456
|
+
await this.clearInterrupt();
|
|
457
|
+
onSample(i, result);
|
|
458
|
+
}
|
|
459
|
+
await this.stopRanging();
|
|
460
|
+
}
|
|
461
|
+
async calibrateOffset(targetDistMm, nbSamples = 20) {
|
|
462
|
+
if (!(nbSamples >= 5 && nbSamples <= 255) || !(targetDistMm >= 10 && targetDistMm <= 1000)) {
|
|
463
|
+
throw new Vl53l4cdError("nbSamples must be 5..255, target 10..1000 mm");
|
|
464
|
+
}
|
|
465
|
+
await this.wrWord(RANGE_OFFSET_MM, 0);
|
|
466
|
+
await this.wrWord(INNER_OFFSET_MM, 0);
|
|
467
|
+
await this.wrWord(OUTER_OFFSET_MM, 0);
|
|
468
|
+
await this.collect(10, () => undefined); // device heat loop
|
|
469
|
+
const distances = [];
|
|
470
|
+
await this.collect(nbSamples, (_i, r) => distances.push(r.distanceMm));
|
|
471
|
+
const sum = distances.reduce((a, b) => a + b, 0);
|
|
472
|
+
const offsetMm = targetDistMm - Math.floor(sum / nbSamples);
|
|
473
|
+
await this.wrWord(RANGE_OFFSET_MM, offsetRaw(offsetMm));
|
|
474
|
+
return offsetMm;
|
|
475
|
+
}
|
|
476
|
+
async calibrateXtalk(targetDistMm, nbSamples = 20) {
|
|
477
|
+
if (!(nbSamples >= 5 && nbSamples <= 255) || !(targetDistMm >= 10 && targetDistMm <= 5000)) {
|
|
478
|
+
throw new Vl53l4cdError("nbSamples must be 5..255, target 10..5000 mm");
|
|
479
|
+
}
|
|
480
|
+
await this.wrWord(XTALK_PLANE_OFFSET_KCPS, 0); // disable compensation
|
|
481
|
+
await this.collect(10, () => undefined); // device heat loop
|
|
482
|
+
const samples = [];
|
|
483
|
+
await this.collect(nbSamples, (i, r) => {
|
|
484
|
+
// Discard invalid measurements and the first frame.
|
|
485
|
+
if (r.rangeStatus === 0 && i > 0)
|
|
486
|
+
samples.push(r);
|
|
487
|
+
});
|
|
488
|
+
if (samples.length === 0) {
|
|
489
|
+
throw new Vl53l4cdError("xtalk calibration failed: no valid samples");
|
|
490
|
+
}
|
|
491
|
+
const n = samples.length;
|
|
492
|
+
const avgDistance = samples.reduce((a, s) => a + s.distanceMm, 0) / n;
|
|
493
|
+
const avgSpadNb = samples.reduce((a, s) => a + s.numberOfSpad, 0) / n;
|
|
494
|
+
const avgSignal = samples.reduce((a, s) => a + s.signalRateKcps, 0) / n;
|
|
495
|
+
const tmpXtalk = (1.0 - avgDistance / targetDistMm) * (avgSignal / avgSpadNb);
|
|
496
|
+
if (tmpXtalk > 127) {
|
|
497
|
+
// 127 kcps is the max xtalk value (65536/512)
|
|
498
|
+
throw new Vl53l4cdError(`xtalk calibration failed: ${tmpXtalk.toFixed(1)} kcps > 127`);
|
|
499
|
+
}
|
|
500
|
+
await this.wrWord(XTALK_PLANE_OFFSET_KCPS, Math.trunc(tmpXtalk * 512.0) & 0xffff);
|
|
501
|
+
return roundHalfEven(tmpXtalk);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
//# sourceMappingURL=uld.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uld.js","sourceRoot":"","sources":["../../../src/sensors/vl53l4/uld.ts"],"names":[],"mappings":"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"}
|