@depz/sensor-sdk 0.2.1 → 0.3.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 +13 -5
- package/dist/dataset.d.ts.map +1 -1
- package/dist/dataset.js +66 -2
- package/dist/dataset.js.map +1 -1
- package/dist/device/device.d.ts +6 -0
- package/dist/device/device.d.ts.map +1 -1
- package/dist/device/device.js +29 -6
- package/dist/device/device.js.map +1 -1
- package/dist/discovery.d.ts.map +1 -1
- package/dist/discovery.js +25 -2
- package/dist/discovery.js.map +1 -1
- package/dist/index.d.ts +21 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/protocol/bno055.d.ts +101 -0
- package/dist/protocol/bno055.d.ts.map +1 -0
- package/dist/protocol/bno055.js +105 -0
- package/dist/protocol/bno055.js.map +1 -0
- package/dist/protocol/identity.d.ts +1 -1
- package/dist/protocol/identity.d.ts.map +1 -1
- package/dist/protocol/identity.js +6 -0
- package/dist/protocol/identity.js.map +1 -1
- package/dist/protocol/vl53l7.d.ts +77 -0
- package/dist/protocol/vl53l7.d.ts.map +1 -0
- package/dist/protocol/vl53l7.js +99 -0
- package/dist/protocol/vl53l7.js.map +1 -0
- package/dist/protocol/vl53lx.d.ts +72 -0
- package/dist/protocol/vl53lx.d.ts.map +1 -0
- package/dist/protocol/vl53lx.js +87 -0
- package/dist/protocol/vl53lx.js.map +1 -0
- package/dist/sensors/bno055/bno055.d.ts +207 -0
- package/dist/sensors/bno055/bno055.d.ts.map +1 -0
- package/dist/sensors/bno055/bno055.js +547 -0
- package/dist/sensors/bno055/bno055.js.map +1 -0
- package/dist/sensors/bno055/regs.d.ts +271 -0
- package/dist/sensors/bno055/regs.d.ts.map +1 -0
- package/dist/sensors/bno055/regs.js +366 -0
- package/dist/sensors/bno055/regs.js.map +1 -0
- package/dist/sensors/bno086/bno086.d.ts +15 -0
- package/dist/sensors/bno086/bno086.d.ts.map +1 -1
- package/dist/sensors/bno086/bno086.js +43 -1
- package/dist/sensors/bno086/bno086.js.map +1 -1
- package/dist/sensors/bno086/sh2.d.ts.map +1 -1
- package/dist/sensors/bno086/sh2.js +5 -2
- package/dist/sensors/bno086/sh2.js.map +1 -1
- package/dist/sensors/reg-bridge.d.ts +35 -0
- package/dist/sensors/reg-bridge.d.ts.map +1 -0
- package/dist/sensors/reg-bridge.js +44 -0
- package/dist/sensors/reg-bridge.js.map +1 -0
- package/dist/sensors/vl53l4/vl53l4.d.ts.map +1 -1
- package/dist/sensors/vl53l4/vl53l4.js +18 -30
- package/dist/sensors/vl53l4/vl53l4.js.map +1 -1
- package/dist/sensors/vl53l7/vl53l7.d.ts +97 -0
- package/dist/sensors/vl53l7/vl53l7.d.ts.map +1 -0
- package/dist/sensors/vl53l7/vl53l7.js +138 -0
- package/dist/sensors/vl53l7/vl53l7.js.map +1 -0
- package/dist/sensors/vl53l8/assets/index.d.ts +5 -1
- package/dist/sensors/vl53l8/assets/index.d.ts.map +1 -1
- package/dist/sensors/vl53l8/assets/index.js +7 -1
- package/dist/sensors/vl53l8/assets/index.js.map +1 -1
- package/dist/sensors/vl53l8/assets/l7ch.d.ts +12 -0
- package/dist/sensors/vl53l8/assets/l7ch.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/l7ch.js +18 -0
- package/dist/sensors/vl53l8/assets/l7ch.js.map +1 -0
- package/dist/sensors/vl53l8/assets/l7cx.d.ts +14 -0
- package/dist/sensors/vl53l8/assets/l7cx.d.ts.map +1 -0
- package/dist/sensors/vl53l8/assets/l7cx.js +20 -0
- package/dist/sensors/vl53l8/assets/l7cx.js.map +1 -0
- package/dist/sensors/vl53l8/cnh.d.ts +4 -3
- package/dist/sensors/vl53l8/cnh.d.ts.map +1 -1
- package/dist/sensors/vl53l8/cnh.js +4 -3
- package/dist/sensors/vl53l8/cnh.js.map +1 -1
- package/dist/sensors/vl53l8/uld.d.ts +50 -9
- package/dist/sensors/vl53l8/uld.d.ts.map +1 -1
- package/dist/sensors/vl53l8/uld.js +241 -35
- package/dist/sensors/vl53l8/uld.js.map +1 -1
- package/dist/sensors/vl53l8/vl53l8.d.ts +8 -3
- package/dist/sensors/vl53l8/vl53l8.d.ts.map +1 -1
- package/dist/sensors/vl53l8/vl53l8.js +41 -39
- package/dist/sensors/vl53l8/vl53l8.js.map +1 -1
- package/dist/sensors/vl53lx/decode.d.ts +70 -0
- package/dist/sensors/vl53lx/decode.d.ts.map +1 -0
- package/dist/sensors/vl53lx/decode.js +108 -0
- package/dist/sensors/vl53lx/decode.js.map +1 -0
- package/dist/sensors/vl53lx/uld/arith.d.ts +23 -0
- package/dist/sensors/vl53lx/uld/arith.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/arith.js +42 -0
- package/dist/sensors/vl53lx/uld/arith.js.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/core.d.ts +345 -0
- package/dist/sensors/vl53lx/uld/bare/core.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/core.js +1085 -0
- package/dist/sensors/vl53lx/uld/bare/core.js.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/driver.d.ts +91 -0
- package/dist/sensors/vl53lx/uld/bare/driver.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/driver.js +206 -0
- package/dist/sensors/vl53lx/uld/bare/driver.js.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/hist.d.ts +180 -0
- package/dist/sensors/vl53lx/uld/bare/hist.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/hist.js +949 -0
- package/dist/sensors/vl53lx/uld/bare/hist.js.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/image.d.ts +53 -0
- package/dist/sensors/vl53lx/uld/bare/image.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/image.js +108 -0
- package/dist/sensors/vl53lx/uld/bare/image.js.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/imath.d.ts +39 -0
- package/dist/sensors/vl53lx/uld/bare/imath.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/imath.js +99 -0
- package/dist/sensors/vl53lx/uld/bare/imath.js.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/index.d.ts +22 -0
- package/dist/sensors/vl53lx/uld/bare/index.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/index.js +22 -0
- package/dist/sensors/vl53lx/uld/bare/index.js.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/nvm.d.ts +85 -0
- package/dist/sensors/vl53lx/uld/bare/nvm.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/nvm.js +148 -0
- package/dist/sensors/vl53lx/uld/bare/nvm.js.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/regs.d.ts +54 -0
- package/dist/sensors/vl53lx/uld/bare/regs.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/regs.js +496 -0
- package/dist/sensors/vl53lx/uld/bare/regs.js.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/tuning.d.ts +15 -0
- package/dist/sensors/vl53lx/uld/bare/tuning.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/bare/tuning.js +303 -0
- package/dist/sensors/vl53lx/uld/bare/tuning.js.map +1 -0
- package/dist/sensors/vl53lx/uld/base.d.ts +129 -0
- package/dist/sensors/vl53lx/uld/base.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/base.js +166 -0
- package/dist/sensors/vl53lx/uld/base.js.map +1 -0
- package/dist/sensors/vl53lx/uld/l0x.d.ts +306 -0
- package/dist/sensors/vl53lx/uld/l0x.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/l0x.js +1492 -0
- package/dist/sensors/vl53lx/uld/l0x.js.map +1 -0
- package/dist/sensors/vl53lx/uld/l1.d.ts +69 -0
- package/dist/sensors/vl53lx/uld/l1.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/l1.js +262 -0
- package/dist/sensors/vl53lx/uld/l1.js.map +1 -0
- package/dist/sensors/vl53lx/uld/l3.d.ts +25 -0
- package/dist/sensors/vl53lx/uld/l3.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/l3.js +51 -0
- package/dist/sensors/vl53lx/uld/l3.js.map +1 -0
- package/dist/sensors/vl53lx/uld/l4.d.ts +22 -0
- package/dist/sensors/vl53lx/uld/l4.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/l4.js +99 -0
- package/dist/sensors/vl53lx/uld/l4.js.map +1 -0
- package/dist/sensors/vl53lx/uld/link.d.ts +42 -0
- package/dist/sensors/vl53lx/uld/link.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/link.js +28 -0
- package/dist/sensors/vl53lx/uld/link.js.map +1 -0
- package/dist/sensors/vl53lx/uld/registry.d.ts +68 -0
- package/dist/sensors/vl53lx/uld/registry.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/registry.js +139 -0
- package/dist/sensors/vl53lx/uld/registry.js.map +1 -0
- package/dist/sensors/vl53lx/uld/vl53l1-die.d.ts +172 -0
- package/dist/sensors/vl53lx/uld/vl53l1-die.d.ts.map +1 -0
- package/dist/sensors/vl53lx/uld/vl53l1-die.js +431 -0
- package/dist/sensors/vl53lx/uld/vl53l1-die.js.map +1 -0
- package/dist/sensors/vl53lx/vl53lx.d.ts +323 -0
- package/dist/sensors/vl53lx/vl53lx.d.ts.map +1 -0
- package/dist/sensors/vl53lx/vl53lx.js +688 -0
- package/dist/sensors/vl53lx/vl53lx.js.map +1 -0
- package/dist/transport/webserial.d.ts +4 -0
- package/dist/transport/webserial.d.ts.map +1 -1
- package/dist/transport/webserial.js +58 -12
- package/dist/transport/webserial.js.map +1 -1
- package/package.json +9 -2
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* uld/vl53l1-die — the VL53L1 die: register map, result block, and the
|
|
3
|
+
* VL53L4CD ULD body. Async port of the Python
|
|
4
|
+
* `depz_sensor_sdk.vl53lx.uld.vl53l1_die`.
|
|
5
|
+
*
|
|
6
|
+
* The 17-byte result block at 0x0089, the range-status table, the
|
|
7
|
+
* register-address width, the interrupt-release write and the bus ceiling are
|
|
8
|
+
* what every part built on this die has in common. `VL53L1Die` is the body of
|
|
9
|
+
* the VL53L4CD ULD, shared by `l4.ts` (VL53L4CD/CX) and `l3.ts` (VL53L3CX
|
|
10
|
+
* ULP); `l1.ts` (VL53L1X ULD) overrides the ranging configuration.
|
|
11
|
+
*
|
|
12
|
+
* Register sequences and integer widths are the C driver's — do not
|
|
13
|
+
* "simplify" them.
|
|
14
|
+
*/
|
|
15
|
+
import { I2C_KHZ_BOOT, ProtocolError, Vl53Error } from "./link.js";
|
|
16
|
+
import { measurement, SensorDriver } from "./base.js";
|
|
17
|
+
import { beUint, floorDiv, pyRound, u32 } from "./arith.js";
|
|
18
|
+
export const SOFT_RESET = 0x0000;
|
|
19
|
+
export const I2C_SLAVE__DEVICE_ADDRESS = 0x0001;
|
|
20
|
+
export const OSC_FREQUENCY = 0x0006;
|
|
21
|
+
export const VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND = 0x0008;
|
|
22
|
+
export const XTALK_PLANE_OFFSET_KCPS = 0x0016;
|
|
23
|
+
export const XTALK_X_PLANE_GRADIENT_KCPS = 0x0018;
|
|
24
|
+
export const XTALK_Y_PLANE_GRADIENT_KCPS = 0x001a;
|
|
25
|
+
export const RANGE_OFFSET_MM = 0x001e;
|
|
26
|
+
export const INNER_OFFSET_MM = 0x0020;
|
|
27
|
+
export const OUTER_OFFSET_MM = 0x0022;
|
|
28
|
+
export const GPIO_HV_MUX__CTRL = 0x0030;
|
|
29
|
+
export const GPIO__TIO_HV_STATUS = 0x0031;
|
|
30
|
+
export const SYSTEM__INTERRUPT_CONFIG_GPIO = 0x0046;
|
|
31
|
+
export const PHASECAL_CONFIG__TIMEOUT_MACROP = 0x004b;
|
|
32
|
+
export const RANGE_CONFIG__TIMEOUT_MACROP_A_HI = 0x005e;
|
|
33
|
+
export const RANGE_CONFIG__VCSEL_PERIOD_A = 0x0060;
|
|
34
|
+
export const RANGE_CONFIG__TIMEOUT_MACROP_B_HI = 0x0061;
|
|
35
|
+
export const RANGE_CONFIG__VCSEL_PERIOD_B = 0x0063;
|
|
36
|
+
export const RANGE_CONFIG__SIGMA_THRESH = 0x0064;
|
|
37
|
+
export const MIN_COUNT_RATE_RTN_LIMIT_MCPS = 0x0066;
|
|
38
|
+
export const RANGE_CONFIG__VALID_PHASE_HIGH = 0x0069;
|
|
39
|
+
export const INTERMEASUREMENT_MS = 0x006c;
|
|
40
|
+
export const THRESH_HIGH = 0x0072;
|
|
41
|
+
export const THRESH_LOW = 0x0074;
|
|
42
|
+
export const SD_CONFIG__WOI_SD0 = 0x0078;
|
|
43
|
+
export const SD_CONFIG__INITIAL_PHASE_SD0 = 0x007a;
|
|
44
|
+
export const ROI_CONFIG__USER_ROI_CENTRE_SPAD = 0x007f;
|
|
45
|
+
export const ROI_CONFIG__USER_ROI_XY_SIZE = 0x0080;
|
|
46
|
+
export const SYSTEM__INTERRUPT_CLEAR = 0x0086;
|
|
47
|
+
export const SYSTEM__MODE_START = 0x0087;
|
|
48
|
+
export const RESULT__RANGE_STATUS = 0x0089;
|
|
49
|
+
export const RESULT__SPAD_NB = 0x008c;
|
|
50
|
+
export const RESULT__SIGNAL_RATE = 0x008e;
|
|
51
|
+
export const RESULT__AMBIENT_RATE = 0x0090;
|
|
52
|
+
export const RESULT__SIGMA = 0x0092;
|
|
53
|
+
export const RESULT__DISTANCE = 0x0096;
|
|
54
|
+
export const RESULT__OSC_CALIBRATE_VAL = 0x00de;
|
|
55
|
+
export const FIRMWARE__SYSTEM_STATUS = 0x00e5;
|
|
56
|
+
export const IDENTIFICATION__MODEL_ID = 0x010f;
|
|
57
|
+
export const ROI_CONFIG__MODE_ROI_CENTRE_SPAD = 0x013e;
|
|
58
|
+
/** Detection-threshold window modes (SYSTEM__INTERRUPT_CONFIG_GPIO). */
|
|
59
|
+
export const WINDOW_BELOW = 0;
|
|
60
|
+
export const WINDOW_ABOVE = 1;
|
|
61
|
+
export const WINDOW_OUT = 2;
|
|
62
|
+
export const WINDOW_IN = 3;
|
|
63
|
+
/** The configuration blob spans 0x2D..0x87 on every part of the die. */
|
|
64
|
+
export const CONFIG_ADDR = 0x002d;
|
|
65
|
+
export const CONFIG_END = 0x0087;
|
|
66
|
+
/** Byte 0 of the blob: Fast Mode Plus on the sensor pad, set unconditionally. */
|
|
67
|
+
export const CONFIG_FMP_BYTE = 0x12;
|
|
68
|
+
/** The block the MCU streams: RESULT__RANGE_STATUS .. 0x0099. */
|
|
69
|
+
export const RESULT_BLOCK_ADDR = RESULT__RANGE_STATUS;
|
|
70
|
+
export const RESULT_BLOCK_LEN = 17;
|
|
71
|
+
/** How this die releases its interrupt: a single write. */
|
|
72
|
+
export const DIE_CLEAR_STEPS = [
|
|
73
|
+
[SYSTEM__INTERRUPT_CLEAR, 0x01],
|
|
74
|
+
];
|
|
75
|
+
/** GetResult() raw status → ULD status (status_rtn[24] in VL53L4CD_api.c). */
|
|
76
|
+
export const STATUS_RTN = [
|
|
77
|
+
255, 255, 255, 5, 2, 4, 1, 7, 3, 0, 255, 255, 9, 13, 255, 255, 255, 255, 10, 6, 255, 255, 11,
|
|
78
|
+
12,
|
|
79
|
+
];
|
|
80
|
+
/** UM2931, "Range status description". */
|
|
81
|
+
export const DIE_RANGE_STATUS_NAMES = {
|
|
82
|
+
0: "valid",
|
|
83
|
+
1: "sigma above threshold",
|
|
84
|
+
2: "signal below threshold",
|
|
85
|
+
3: "distance below detection threshold",
|
|
86
|
+
4: "phase out of valid limit",
|
|
87
|
+
5: "hardware fail",
|
|
88
|
+
6: "no wrap-around check done",
|
|
89
|
+
7: "wrapped target, phase mismatch",
|
|
90
|
+
8: "processing fail",
|
|
91
|
+
9: "crosstalk signal fail",
|
|
92
|
+
10: "interrupt error",
|
|
93
|
+
11: "merged target",
|
|
94
|
+
12: "signal too low",
|
|
95
|
+
255: "other error",
|
|
96
|
+
};
|
|
97
|
+
export function dieStatusText(status) {
|
|
98
|
+
return DIE_RANGE_STATUS_NAMES[status] ?? `unknown (${status})`;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Decode the 17-byte block as a ULD of this die reads it. `signalAt` is the
|
|
102
|
+
* offset of the signal rate (5 = 0x008E for the VL53L4CD ULD, 15 = 0x0098 for
|
|
103
|
+
* the VL53L1X ULD) and `perSpadK` the per-SPAD scale (256 / 25).
|
|
104
|
+
*/
|
|
105
|
+
export function parseDieBlock(raw, signalAt, perSpadK) {
|
|
106
|
+
if (raw.length < RESULT_BLOCK_LEN) {
|
|
107
|
+
throw new Vl53Error(`result block too short: ${raw.length} bytes`);
|
|
108
|
+
}
|
|
109
|
+
let status = raw[0] & 0x1f;
|
|
110
|
+
if (status < STATUS_RTN.length)
|
|
111
|
+
status = STATUS_RTN[status];
|
|
112
|
+
const rawSpads = beUint(raw, 3, 5); // 0x008C, 8.8
|
|
113
|
+
const signalKcps = beUint(raw, signalAt, signalAt + 2) * 8;
|
|
114
|
+
const ambientKcps = beUint(raw, 7, 9) * 8; // 0x0090
|
|
115
|
+
return {
|
|
116
|
+
rangeStatus: status,
|
|
117
|
+
streamCount: raw[2],
|
|
118
|
+
numberOfSpad: floorDiv(rawSpads, 256),
|
|
119
|
+
signalRateKcps: signalKcps,
|
|
120
|
+
ambientRateKcps: ambientKcps,
|
|
121
|
+
sigmaMm: floorDiv(beUint(raw, 9, 11), 4),
|
|
122
|
+
distanceMm: beUint(raw, 13, 15), // 0x0096
|
|
123
|
+
signalPerSpadKcps: rawSpads ? floorDiv(signalKcps * perSpadK, rawSpads) : 0,
|
|
124
|
+
ambientPerSpadKcps: rawSpads ? floorDiv(ambientKcps * perSpadK, rawSpads) : 0,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/** ResultsData → the family-wide Measurement every caller speaks. */
|
|
128
|
+
export function dieAsMeasurement(r) {
|
|
129
|
+
return measurement({
|
|
130
|
+
distanceMm: r.distanceMm,
|
|
131
|
+
status: r.rangeStatus,
|
|
132
|
+
statusText: dieStatusText(r.rangeStatus),
|
|
133
|
+
signalKcps: r.signalRateKcps,
|
|
134
|
+
ambientKcps: r.ambientRateKcps,
|
|
135
|
+
sigmaMm: r.sigmaMm,
|
|
136
|
+
spads: r.numberOfSpad,
|
|
137
|
+
extra: {
|
|
138
|
+
signal_per_spad_kcps: r.signalPerSpadKcps,
|
|
139
|
+
ambient_per_spad_kcps: r.ambientPerSpadKcps,
|
|
140
|
+
stream_count: r.streamCount,
|
|
141
|
+
},
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
/** 2304 × (2^30 / osc) wrapped to u32, then >> 6 (both ULDs' macro period). */
|
|
145
|
+
function macroPeriodUs(oscFrequency) {
|
|
146
|
+
return floorDiv(u32(2304 * floorDiv(0x40000000, oscFrequency)), 64);
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* The body every driver of this die shares: identity, boot, the ranging
|
|
150
|
+
* loop, the interrupt, the threshold, offset, crosstalk and ROI registers.
|
|
151
|
+
* A concrete product supplies `CONFIGURATION`, `SUPPORTS` and its own hooks.
|
|
152
|
+
*/
|
|
153
|
+
export class VL53L1Die extends SensorDriver {
|
|
154
|
+
static ADDR_WIDTH = 2;
|
|
155
|
+
static CLEAR_STEPS = DIE_CLEAR_STEPS;
|
|
156
|
+
/** With Fast Mode Plus on the sensor pad. */
|
|
157
|
+
static MAX_KHZ = 1000;
|
|
158
|
+
/** What StopRanging writes: the L4CD ULD 0x80, the L3CX ULP / L1X ULD 0x00. */
|
|
159
|
+
STOP_MODE = 0x80;
|
|
160
|
+
/** Signal-rate offset in the block: 5 (0x008E, L4CD ULD) or 15 (0x0098, L1X ULD). */
|
|
161
|
+
SIGNAL_AT = 5;
|
|
162
|
+
/** Per-SPAD scale: 256 (L4CD ULD) or 25 (L1X ULD, 200.0/8). */
|
|
163
|
+
PER_SPAD_K = 256;
|
|
164
|
+
// ── result block ──
|
|
165
|
+
streamBlock() {
|
|
166
|
+
return [RESULT_BLOCK_ADDR, RESULT_BLOCK_LEN];
|
|
167
|
+
}
|
|
168
|
+
parseResultBlock(raw) {
|
|
169
|
+
return parseDieBlock(raw, this.SIGNAL_AT, this.PER_SPAD_K);
|
|
170
|
+
}
|
|
171
|
+
decode(raw) {
|
|
172
|
+
return dieAsMeasurement(this.parseResultBlock(raw));
|
|
173
|
+
}
|
|
174
|
+
/** One block read instead of the C driver's six register reads. */
|
|
175
|
+
async getResult() {
|
|
176
|
+
return this.parseResultBlock(await this.p.rdMulti(RESULT_BLOCK_ADDR, RESULT_BLOCK_LEN));
|
|
177
|
+
}
|
|
178
|
+
async readMeasurement() {
|
|
179
|
+
return dieAsMeasurement(await this.getResult());
|
|
180
|
+
}
|
|
181
|
+
// ── identity ──
|
|
182
|
+
modelId() {
|
|
183
|
+
return this.p.rdWord(IDENTIFICATION__MODEL_ID);
|
|
184
|
+
}
|
|
185
|
+
/** The bridge always addresses 0x29, so this makes the sensor unreachable. */
|
|
186
|
+
setI2cAddress(newAddress) {
|
|
187
|
+
return this.p.wrByte(I2C_SLAVE__DEVICE_ADDRESS, newAddress >> 1);
|
|
188
|
+
}
|
|
189
|
+
// ── init ──
|
|
190
|
+
bootState() {
|
|
191
|
+
return this.p.rdByte(FIRMWARE__SYSTEM_STATUS);
|
|
192
|
+
}
|
|
193
|
+
async waitBoot(timeoutS = 1.0) {
|
|
194
|
+
const deadline = Date.now() + timeoutS * 1000;
|
|
195
|
+
for (;;) {
|
|
196
|
+
if ((await this.bootState()) === 0x03)
|
|
197
|
+
return;
|
|
198
|
+
if (Date.now() > deadline) {
|
|
199
|
+
throw new Vl53Error("timeout waiting for FIRMWARE__SYSTEM_STATUS == 0x03");
|
|
200
|
+
}
|
|
201
|
+
await this.p.sleepMs(1);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Pull the die through its soft reset (VL53L1_software_reset()); a part that
|
|
206
|
+
* stopped ACKing is reset through XSHUT instead.
|
|
207
|
+
*/
|
|
208
|
+
async resetDevice(timeoutS = 1.0) {
|
|
209
|
+
try {
|
|
210
|
+
await this.p.wrByte(SOFT_RESET, 0x00);
|
|
211
|
+
await this.p.sleepMs(1);
|
|
212
|
+
await this.p.wrByte(SOFT_RESET, 0x01);
|
|
213
|
+
await this.waitBoot(timeoutS);
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
if (!(err instanceof Vl53Error || err instanceof ProtocolError))
|
|
217
|
+
throw err;
|
|
218
|
+
await this.p.xshutReset();
|
|
219
|
+
await this.waitBoot(timeoutS);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
/** Initialise the sensor and leave the bus at this die's ceiling. */
|
|
223
|
+
async sensorInit() {
|
|
224
|
+
await this.p.setAddrWidth(this.ADDR_WIDTH);
|
|
225
|
+
await this.p.setI2cSpeed(I2C_KHZ_BOOT);
|
|
226
|
+
await this.initBoot();
|
|
227
|
+
const config = new Uint8Array(this.CONFIGURATION);
|
|
228
|
+
config[0] = CONFIG_FMP_BYTE;
|
|
229
|
+
await this.p.wrMulti(CONFIG_ADDR, config);
|
|
230
|
+
if (this.MAX_KHZ !== I2C_KHZ_BOOT)
|
|
231
|
+
await this.p.setI2cSpeed(this.MAX_KHZ);
|
|
232
|
+
await this.initAfterConfig();
|
|
233
|
+
await this.p.wrByte(SYSTEM__MODE_START, 0x40); // start VHV
|
|
234
|
+
await this.waitDataReady();
|
|
235
|
+
await this.clearInterrupt();
|
|
236
|
+
await this.stopRanging();
|
|
237
|
+
await this.p.wrByte(VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09);
|
|
238
|
+
await this.p.wrByte(0x000b, 0x00);
|
|
239
|
+
await this.initExtra();
|
|
240
|
+
await this.setRangeTiming(50, 0);
|
|
241
|
+
}
|
|
242
|
+
/** How a part gets to a booted die (the VL53L1X ULD resets first). */
|
|
243
|
+
initBoot() {
|
|
244
|
+
return this.waitBoot();
|
|
245
|
+
}
|
|
246
|
+
/** Writes right after the blob, before VHV (only the L1X ULD has one). */
|
|
247
|
+
async initAfterConfig() { }
|
|
248
|
+
/** Writes at the end of init, before the timing is set. */
|
|
249
|
+
async initExtra() { }
|
|
250
|
+
// ── ranging ──
|
|
251
|
+
clearInterrupt() {
|
|
252
|
+
return this.p.wrByte(SYSTEM__INTERRUPT_CLEAR, 0x01);
|
|
253
|
+
}
|
|
254
|
+
async startRanging() {
|
|
255
|
+
// 0 = continuous, anything else = autonomous low power.
|
|
256
|
+
const mode = (await this.p.rdDword(INTERMEASUREMENT_MS)) === 0 ? 0x21 : 0x40;
|
|
257
|
+
await this.p.wrByte(SYSTEM__MODE_START, mode);
|
|
258
|
+
}
|
|
259
|
+
stopRanging() {
|
|
260
|
+
return this.p.wrByte(SYSTEM__MODE_START, this.STOP_MODE);
|
|
261
|
+
}
|
|
262
|
+
async getInterruptPolarity() {
|
|
263
|
+
return (await this.p.rdByte(GPIO_HV_MUX__CTRL)) & 0x10 ? 0 : 1;
|
|
264
|
+
}
|
|
265
|
+
async setInterruptPolarity(polarity) {
|
|
266
|
+
const temp = (await this.p.rdByte(GPIO_HV_MUX__CTRL)) & 0xef;
|
|
267
|
+
await this.p.wrByte(GPIO_HV_MUX__CTRL, temp | ((polarity & 1 ? 0 : 1) << 4));
|
|
268
|
+
}
|
|
269
|
+
async checkForDataReady() {
|
|
270
|
+
// Polarity first, as both C drivers read it.
|
|
271
|
+
const intPol = await this.getInterruptPolarity();
|
|
272
|
+
return ((await this.p.rdByte(GPIO__TIO_HV_STATUS)) & 1) === intPol;
|
|
273
|
+
}
|
|
274
|
+
// ── timing ──
|
|
275
|
+
async setRangeTiming(timingBudgetMs, interMeasurementMs) {
|
|
276
|
+
const oscFrequency = await this.p.rdWord(OSC_FREQUENCY);
|
|
277
|
+
if (oscFrequency === 0)
|
|
278
|
+
throw new Vl53Error("osc_frequency reads 0");
|
|
279
|
+
if (!(timingBudgetMs >= 10 && timingBudgetMs <= 200)) {
|
|
280
|
+
throw new Vl53Error("timing_budget_ms must be 10..200");
|
|
281
|
+
}
|
|
282
|
+
let timingBudgetUs = timingBudgetMs * 1000;
|
|
283
|
+
const macroPeriod = macroPeriodUs(oscFrequency);
|
|
284
|
+
if (interMeasurementMs === 0) {
|
|
285
|
+
// continuous
|
|
286
|
+
await this.p.wrDword(INTERMEASUREMENT_MS, 0);
|
|
287
|
+
timingBudgetUs -= 2500;
|
|
288
|
+
}
|
|
289
|
+
else if (interMeasurementMs > timingBudgetMs) {
|
|
290
|
+
// autonomous low power
|
|
291
|
+
const clockPll = (await this.p.rdWord(RESULT__OSC_CALIBRATE_VAL)) & 0x3ff;
|
|
292
|
+
const factor = 1.055 * interMeasurementMs * clockPll;
|
|
293
|
+
await this.p.wrDword(INTERMEASUREMENT_MS, Math.trunc(factor));
|
|
294
|
+
timingBudgetUs = floorDiv(timingBudgetUs - 4300, 2);
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
throw new Vl53Error("inter_measurement_ms must be 0 or > timing_budget_ms");
|
|
298
|
+
}
|
|
299
|
+
timingBudgetUs = u32(timingBudgetUs * 4096);
|
|
300
|
+
for (const [reg, mult] of [
|
|
301
|
+
[RANGE_CONFIG__TIMEOUT_MACROP_A_HI, 16],
|
|
302
|
+
[RANGE_CONFIG__TIMEOUT_MACROP_B_HI, 12],
|
|
303
|
+
]) {
|
|
304
|
+
const tmp = floorDiv(u32(macroPeriod * mult), 64);
|
|
305
|
+
let lsByte = floorDiv(timingBudgetUs + floorDiv(tmp, 2), tmp) - 1;
|
|
306
|
+
let msByte = 0;
|
|
307
|
+
while (lsByte >= 0x100) {
|
|
308
|
+
lsByte = floorDiv(lsByte, 2);
|
|
309
|
+
msByte += 1;
|
|
310
|
+
}
|
|
311
|
+
await this.p.wrWord(reg, (msByte * 256 + (lsByte & 0xff)) & 0xffff);
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/** → [timingBudgetMs, interMeasurementMs]. */
|
|
315
|
+
async getRangeTiming() {
|
|
316
|
+
const tmp = await this.p.rdDword(INTERMEASUREMENT_MS);
|
|
317
|
+
let clockPll = (await this.p.rdWord(RESULT__OSC_CALIBRATE_VAL)) & 0x3ff;
|
|
318
|
+
clockPll = Math.trunc(1.065 * clockPll) & 0xffff;
|
|
319
|
+
const interMeasurementMs = clockPll ? floorDiv(tmp, clockPll) & 0xffff : 0;
|
|
320
|
+
const oscFrequency = await this.p.rdWord(OSC_FREQUENCY);
|
|
321
|
+
if (oscFrequency === 0)
|
|
322
|
+
throw new Vl53Error("osc_frequency reads 0");
|
|
323
|
+
const macropHigh = await this.p.rdWord(RANGE_CONFIG__TIMEOUT_MACROP_A_HI);
|
|
324
|
+
let macroPeriod = macroPeriodUs(oscFrequency);
|
|
325
|
+
const lsByte = (macropHigh & 0x00ff) << 4;
|
|
326
|
+
let msByte = (macropHigh & 0xff00) >> 8;
|
|
327
|
+
msByte = u32(0x04 - (msByte - 1) - 1);
|
|
328
|
+
macroPeriod = u32(macroPeriod * 16);
|
|
329
|
+
const mp6 = floorDiv(macroPeriod, 64);
|
|
330
|
+
let budget = floorDiv(u32((lsByte + 1) * mp6 - floorDiv(mp6, 2)), 4096);
|
|
331
|
+
if (msByte < 12)
|
|
332
|
+
budget = floorDiv(budget, 2 ** msByte);
|
|
333
|
+
budget = tmp === 0 ? budget + 2500 : budget * 2 + 4300;
|
|
334
|
+
return [floorDiv(budget, 1000), interMeasurementMs];
|
|
335
|
+
}
|
|
336
|
+
// ── thresholds ──
|
|
337
|
+
async setDetectionThresholds(distanceLowMm, distanceHighMm, window) {
|
|
338
|
+
await this.p.wrByte(SYSTEM__INTERRUPT_CONFIG_GPIO, window);
|
|
339
|
+
await this.p.wrWord(THRESH_HIGH, distanceHighMm);
|
|
340
|
+
await this.p.wrWord(THRESH_LOW, distanceLowMm);
|
|
341
|
+
}
|
|
342
|
+
/** → [distanceLowMm, distanceHighMm, window]. */
|
|
343
|
+
async getDetectionThresholds() {
|
|
344
|
+
const high = await this.p.rdWord(THRESH_HIGH);
|
|
345
|
+
const low = await this.p.rdWord(THRESH_LOW);
|
|
346
|
+
return [low, high, (await this.p.rdByte(SYSTEM__INTERRUPT_CONFIG_GPIO)) & 0x07];
|
|
347
|
+
}
|
|
348
|
+
setSignalThreshold(signalKcps) {
|
|
349
|
+
return this.p.wrWord(MIN_COUNT_RATE_RTN_LIMIT_MCPS, signalKcps >> 3);
|
|
350
|
+
}
|
|
351
|
+
async getSignalThreshold() {
|
|
352
|
+
return ((await this.p.rdWord(MIN_COUNT_RATE_RTN_LIMIT_MCPS)) << 3) & 0xffff;
|
|
353
|
+
}
|
|
354
|
+
async setSigmaThreshold(sigmaMm) {
|
|
355
|
+
if (sigmaMm > 0xffff >> 2)
|
|
356
|
+
throw new Vl53Error("sigma_mm must be <= 16383");
|
|
357
|
+
await this.p.wrWord(RANGE_CONFIG__SIGMA_THRESH, sigmaMm << 2);
|
|
358
|
+
}
|
|
359
|
+
async getSigmaThreshold() {
|
|
360
|
+
return (await this.p.rdWord(RANGE_CONFIG__SIGMA_THRESH)) >> 2;
|
|
361
|
+
}
|
|
362
|
+
// ── offset ──
|
|
363
|
+
async setOffset(offsetMm) {
|
|
364
|
+
await this.p.wrWord(RANGE_OFFSET_MM, (offsetMm * 4) & 0xffff);
|
|
365
|
+
await this.p.wrWord(INNER_OFFSET_MM, 0);
|
|
366
|
+
await this.p.wrWord(OUTER_OFFSET_MM, 0);
|
|
367
|
+
}
|
|
368
|
+
async getOffset() {
|
|
369
|
+
const temp = (((await this.p.rdWord(RANGE_OFFSET_MM)) << 3) & 0xffff) >> 5;
|
|
370
|
+
return temp > 1024 ? temp - 2048 : temp;
|
|
371
|
+
}
|
|
372
|
+
// ── crosstalk (kcps on both ULDs) ──
|
|
373
|
+
async setXtalk(xtalkKcps) {
|
|
374
|
+
await this.p.wrWord(XTALK_X_PLANE_GRADIENT_KCPS, 0x0000);
|
|
375
|
+
await this.p.wrWord(XTALK_Y_PLANE_GRADIENT_KCPS, 0x0000);
|
|
376
|
+
await this.p.wrWord(XTALK_PLANE_OFFSET_KCPS, (xtalkKcps << 9) & 0xffff);
|
|
377
|
+
}
|
|
378
|
+
async getXtalk() {
|
|
379
|
+
return pyRound((await this.p.rdWord(XTALK_PLANE_OFFSET_KCPS)) / 512.0);
|
|
380
|
+
}
|
|
381
|
+
// ── ROI (VL53L1X_SetROI / VL53L3CX_ULP_SetROI, the same registers) ──
|
|
382
|
+
/** An X by Y window of SPADs, 4..16 each way. */
|
|
383
|
+
async setRoi(x, y) {
|
|
384
|
+
let opticalCenter = await this.p.rdByte(ROI_CONFIG__MODE_ROI_CENTRE_SPAD);
|
|
385
|
+
x = Math.min(x, 16);
|
|
386
|
+
y = Math.min(y, 16);
|
|
387
|
+
if (x > 10 || y > 10)
|
|
388
|
+
opticalCenter = 199;
|
|
389
|
+
await this.p.wrByte(ROI_CONFIG__USER_ROI_CENTRE_SPAD, opticalCenter);
|
|
390
|
+
await this.p.wrByte(ROI_CONFIG__USER_ROI_XY_SIZE, ((y - 1) << 4) | (x - 1));
|
|
391
|
+
}
|
|
392
|
+
/** → [x, y]. */
|
|
393
|
+
async getRoi() {
|
|
394
|
+
const temp = await this.p.rdByte(ROI_CONFIG__USER_ROI_XY_SIZE);
|
|
395
|
+
return [(temp & 0x0f) + 1, ((temp & 0xf0) >> 4) + 1];
|
|
396
|
+
}
|
|
397
|
+
setRoiCenter(centerSpad) {
|
|
398
|
+
return this.p.wrByte(ROI_CONFIG__USER_ROI_CENTRE_SPAD, centerSpad);
|
|
399
|
+
}
|
|
400
|
+
getRoiCenter() {
|
|
401
|
+
return this.p.rdByte(ROI_CONFIG__USER_ROI_CENTRE_SPAD);
|
|
402
|
+
}
|
|
403
|
+
// ── temperature ──
|
|
404
|
+
/** Recommended after a >8 °C ambient change. */
|
|
405
|
+
async startTemperatureUpdate() {
|
|
406
|
+
await this.p.wrByte(VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x81); // full VHV
|
|
407
|
+
await this.p.wrByte(0x000b, 0x92);
|
|
408
|
+
await this.startRanging();
|
|
409
|
+
await this.waitDataReady();
|
|
410
|
+
await this.clearInterrupt();
|
|
411
|
+
await this.stopRanging();
|
|
412
|
+
await this.p.wrByte(VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09);
|
|
413
|
+
await this.p.wrByte(0x000b, 0x00);
|
|
414
|
+
}
|
|
415
|
+
// ── calibration ──
|
|
416
|
+
/**
|
|
417
|
+
* The ranging loop every calibration shares: data-ready, GetResult,
|
|
418
|
+
* ClearInterrupt, `nbSamples` times.
|
|
419
|
+
*/
|
|
420
|
+
async collect(nbSamples, onSample, timeoutS = 5.0) {
|
|
421
|
+
await this.startRanging();
|
|
422
|
+
for (let i = 0; i < nbSamples; i++) {
|
|
423
|
+
await this.waitDataReady(timeoutS);
|
|
424
|
+
const result = await this.getResult();
|
|
425
|
+
await this.clearInterrupt();
|
|
426
|
+
onSample(i, result);
|
|
427
|
+
}
|
|
428
|
+
await this.stopRanging();
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
//# sourceMappingURL=vl53l1-die.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vl53l1-die.js","sourceRoot":"","sources":["../../../../src/sensors/vl53lx/uld/vl53l1-die.ts"],"names":[],"mappings":"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"}
|