@depz/sensor-sdk 0.1.3 → 0.2.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.
@@ -0,0 +1,214 @@
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 declare const ULD_VERSION: readonly [number, number, number, number];
17
+ export declare const SOFT_RESET = 0;
18
+ export declare const I2C_SLAVE__DEVICE_ADDRESS = 1;
19
+ /** Unnamed in the C driver. */
20
+ export declare const OSC_FREQUENCY = 6;
21
+ export declare const VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND = 8;
22
+ export declare const XTALK_PLANE_OFFSET_KCPS = 22;
23
+ export declare const XTALK_X_PLANE_GRADIENT_KCPS = 24;
24
+ export declare const XTALK_Y_PLANE_GRADIENT_KCPS = 26;
25
+ export declare const RANGE_OFFSET_MM = 30;
26
+ export declare const INNER_OFFSET_MM = 32;
27
+ export declare const OUTER_OFFSET_MM = 34;
28
+ export declare const GPIO_HV_MUX__CTRL = 48;
29
+ export declare const GPIO__TIO_HV_STATUS = 49;
30
+ export declare const SYSTEM__INTERRUPT = 70;
31
+ export declare const RANGE_CONFIG_A = 94;
32
+ export declare const RANGE_CONFIG_B = 97;
33
+ export declare const RANGE_CONFIG__SIGMA_THRESH = 100;
34
+ export declare const MIN_COUNT_RATE_RTN_LIMIT_MCPS = 102;
35
+ export declare const INTERMEASUREMENT_MS = 108;
36
+ export declare const THRESH_HIGH = 114;
37
+ export declare const THRESH_LOW = 116;
38
+ export declare const SYSTEM__INTERRUPT_CLEAR = 134;
39
+ export declare const SYSTEM_START = 135;
40
+ export declare const RESULT__RANGE_STATUS = 137;
41
+ export declare const RESULT__SPAD_NB = 140;
42
+ export declare const RESULT__SIGNAL_RATE = 142;
43
+ export declare const RESULT__AMBIENT_RATE = 144;
44
+ export declare const RESULT__SIGMA = 146;
45
+ export declare const RESULT__DISTANCE = 150;
46
+ export declare const RESULT__OSC_CALIBRATE_VAL = 222;
47
+ export declare const FIRMWARE__SYSTEM_STATUS = 229;
48
+ export declare const IDENTIFICATION__MODEL_ID = 271;
49
+ export declare const MODEL_ID_VL53L4CD = 60330;
50
+ export declare const WINDOW_BELOW = 0;
51
+ export declare const WINDOW_ABOVE = 1;
52
+ export declare const WINDOW_OUT = 2;
53
+ export declare const WINDOW_IN = 3;
54
+ export declare const CONFIG_ADDR = 45;
55
+ export declare const CONFIG_END = 135;
56
+ /**
57
+ * VL53L4CD_DEFAULT_CONFIGURATION[] — 91 bytes, registers 0x2D..0x87.
58
+ * `configBlock()` always overrides byte 0 (register 0x2D) with
59
+ * CONFIG_FMP_BYTE (0x12) to put the sensor's I2C pad in Fast Mode Plus —
60
+ * exactly what VL53L4CD_I2C_FAST_MODE_PLUS does in the C ULD. FM+ pads work
61
+ * at every bus step down to 100 kHz, so it is set unconditionally and never
62
+ * cleared (clearing it mid-block NACKs and truncates the write).
63
+ */
64
+ export declare const DEFAULT_CONFIGURATION: Uint8Array;
65
+ export declare const CONFIG_FMP_BYTE = 18;
66
+ export declare const RESULT_BLOCK_ADDR = 137;
67
+ export declare const RESULT_BLOCK_LEN = 17;
68
+ export declare const I2C_KHZ_BOOT = 400;
69
+ export declare const I2C_KHZ_DEFAULT = 1000;
70
+ /** GetResult() raw status → ULD status (status_rtn[24] in VL53L4CD_api.c). */
71
+ export declare const STATUS_RTN: readonly number[];
72
+ /** UM2931, "Range status description". */
73
+ export declare const RANGE_STATUS_NAMES: Readonly<Record<number, string>>;
74
+ export declare class Vl53l4cdError extends Error {
75
+ constructor(message?: string);
76
+ }
77
+ /** What the ULD needs from the register bridge. */
78
+ export interface Vl53l4Platform {
79
+ rdMulti(addr: number, size: number): Promise<Uint8Array>;
80
+ wrMulti(addr: number, data: Uint8Array): Promise<void>;
81
+ setI2cSpeed(khz: number): Promise<void>;
82
+ sleepMs(ms: number): Promise<void>;
83
+ }
84
+ /** VL53L4CD_ResultsData_t plus the sensor's own frame counter. */
85
+ export interface Vl53l4Results {
86
+ /** 0 = valid (RANGE_STATUS_NAMES). */
87
+ rangeStatus: number;
88
+ distanceMm: number;
89
+ ambientRateKcps: number;
90
+ ambientPerSpadKcps: number;
91
+ signalRateKcps: number;
92
+ signalPerSpadKcps: number;
93
+ numberOfSpad: number;
94
+ sigmaMm: number;
95
+ /**
96
+ * 0x008B RESULT__STREAM_COUNT: wraps at 255. The C ULD ignores it; it is
97
+ * what tells a frame the host never received from one the sensor never
98
+ * produced.
99
+ */
100
+ streamCount: number;
101
+ }
102
+ /** Human-readable text for a decoded range status. */
103
+ export declare function rangeStatusText(rangeStatus: number): string;
104
+ /**
105
+ * Decode the streamed 0x0089..0x0099 block exactly as VL53L4CD_GetResult()
106
+ * decodes the same registers read one by one. Register contents are
107
+ * big-endian words (the bridge passes them through untouched).
108
+ */
109
+ export declare function parseResultBlock(raw: Uint8Array): Vl53l4Results;
110
+ /**
111
+ * The 91-byte block sensorInit() writes at CONFIG_ADDR: the ST default
112
+ * configuration with byte 0 forced to CONFIG_FMP_BYTE (Fast Mode Plus).
113
+ */
114
+ export declare function configBlock(): Uint8Array;
115
+ /** SetRangeTiming register words. */
116
+ export interface RangeTimingRegisters {
117
+ rangeConfigA: number;
118
+ rangeConfigB: number;
119
+ /** INTERMEASUREMENT_MS raw dword. */
120
+ intermeasurementRaw: number;
121
+ }
122
+ /**
123
+ * SetRangeTiming register math → RANGE_CONFIG_A, RANGE_CONFIG_B and the
124
+ * INTERMEASUREMENT_MS raw dword.
125
+ *
126
+ * `oscFrequency` is the word read from 0x0006; `clockPll` is the word read
127
+ * from RESULT__OSC_CALIBRATE_VAL (used only in autonomous mode, i.e. when
128
+ * `interMeasurementMs > 0`).
129
+ */
130
+ export declare function rangeTimingRegisters(timingBudgetMs: number, interMeasurementMs: number, oscFrequency: number, clockPll?: number): RangeTimingRegisters;
131
+ /** GetRangeTiming decode result. */
132
+ export interface RangeTiming {
133
+ timingBudgetMs: number;
134
+ interMeasurementMs: number;
135
+ }
136
+ /**
137
+ * GetRangeTiming register math → timing budget and inter-measurement period.
138
+ *
139
+ * Inputs are the raw register reads: INTERMEASUREMENT_MS dword, the
140
+ * RESULT__OSC_CALIBRATE_VAL word, the 0x0006 word and the RANGE_CONFIG_A
141
+ * word.
142
+ */
143
+ export declare function decodeRangeTiming(intermeasurementRaw: number, clockPll: number, oscFrequency: number, rangeConfigA: number): RangeTiming;
144
+ /** RANGE_OFFSET_MM word for setOffset (INNER/OUTER are zeroed alongside). */
145
+ export declare function offsetRaw(offsetMm: number): number;
146
+ /** getOffset: RANGE_OFFSET_MM word → signed millimetres. */
147
+ export declare function decodeOffset(rawWord: number): number;
148
+ /** XTALK_PLANE_OFFSET_KCPS word for setXtalk. */
149
+ export declare function xtalkRaw(xtalkKcps: number): number;
150
+ /** getXtalk: XTALK_PLANE_OFFSET_KCPS word → kcps. */
151
+ export declare function decodeXtalk(rawWord: number): number;
152
+ export declare function signalThresholdRaw(signalKcps: number): number;
153
+ export declare function decodeSignalThreshold(rawWord: number): number;
154
+ export declare function sigmaThresholdRaw(sigmaMm: number): number;
155
+ export declare function decodeSigmaThreshold(rawWord: number): number;
156
+ /** Port of VL53L4CD_api.c + VL53L4CD_calibration.c (ULD 2.2.3). */
157
+ export declare class VL53L4CD {
158
+ readonly p: Vl53l4Platform;
159
+ constructor(p: Vl53l4Platform);
160
+ rdByte(addr: number): Promise<number>;
161
+ rdWord(addr: number): Promise<number>;
162
+ rdDword(addr: number): Promise<number>;
163
+ wrByte(addr: number, value: number): Promise<void>;
164
+ wrWord(addr: number, value: number): Promise<void>;
165
+ wrDword(addr: number, value: number): Promise<void>;
166
+ getSensorId(): Promise<number>;
167
+ isAlive(): Promise<boolean>;
168
+ waitBoot(timeoutMs?: number): Promise<void>;
169
+ /**
170
+ * Initialise the sensor and leave the bus at `busKhz`.
171
+ *
172
+ * The configuration block is written at I2C_KHZ_BOOT (400 kHz) because that
173
+ * is the only speed an unconfigured sensor is specified for; the bridge is
174
+ * re-timed to `busKhz` after it. A sensor reset just re-runs this whole
175
+ * sequence.
176
+ */
177
+ sensorInit(busKhz?: number): Promise<void>;
178
+ clearInterrupt(): Promise<void>;
179
+ startRanging(): Promise<void>;
180
+ stopRanging(): Promise<void>;
181
+ checkForDataReady(): Promise<boolean>;
182
+ waitDataReady(timeoutMs?: number): Promise<void>;
183
+ /**
184
+ * One block read instead of the C driver's six register reads — the sensor
185
+ * auto-increments and the decoding is identical.
186
+ */
187
+ getResult(): Promise<Vl53l4Results>;
188
+ setRangeTiming(timingBudgetMs: number, interMeasurementMs: number): Promise<void>;
189
+ getRangeTiming(): Promise<RangeTiming>;
190
+ setOffset(offsetMm: number): Promise<void>;
191
+ getOffset(): Promise<number>;
192
+ setXtalk(xtalkKcps: number): Promise<void>;
193
+ getXtalk(): Promise<number>;
194
+ setDetectionThresholds(distanceLowMm: number, distanceHighMm: number, window: number): Promise<void>;
195
+ getDetectionThresholds(): Promise<{
196
+ distanceLowMm: number;
197
+ distanceHighMm: number;
198
+ window: number;
199
+ }>;
200
+ setSignalThreshold(signalKcps: number): Promise<void>;
201
+ getSignalThreshold(): Promise<number>;
202
+ setSigmaThreshold(sigmaMm: number): Promise<void>;
203
+ getSigmaThreshold(): Promise<number>;
204
+ /** Recommended after a >8 °C ambient change (ST Example_3). */
205
+ startTemperatureUpdate(): Promise<void>;
206
+ /**
207
+ * The ranging loop both calibrations share: data-ready, getResult,
208
+ * clearInterrupt, `nbSamples` times.
209
+ */
210
+ private collect;
211
+ calibrateOffset(targetDistMm: number, nbSamples?: number): Promise<number>;
212
+ calibrateXtalk(targetDistMm: number, nbSamples?: number): Promise<number>;
213
+ }
214
+ //# sourceMappingURL=uld.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uld.d.ts","sourceRoot":"","sources":["../../../src/sensors/vl53l4/uld.ts"],"names":[],"mappings":"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"}