1 /*******************************************************************************
2 Copyright � 2016, STMicroelectronics International N.V.
3 All rights reserved.
4
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7 * Redistributions of source code must retain the above copyright
8 notice, this list of conditions and the following disclaimer.
9 * Redistributions in binary form must reproduce the above copyright
10 notice, this list of conditions and the following disclaimer in the
11 documentation and/or other materials provided with the distribution.
12 * Neither the name of STMicroelectronics nor the
13 names of its contributors may be used to endorse or promote products
14 derived from this software without specific prior written permission.
15
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
19 NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED.
20 IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY
21 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 ******************************************************************************/
28
29 #include "vl53l0x_api.h"
30 #include "vl53l0x_api_core.h"
31 #include "vl53l0x_api_strings.h"
32
33 #ifndef __KERNEL__
34 #include <stdlib.h>
35 #endif
36
37 #define LOG_FUNCTION_START(fmt, ...) \
38 _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__)
39 #define LOG_FUNCTION_END(status, ...) \
40 _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__)
41 #define LOG_FUNCTION_END_FMT(status, fmt, ...) \
42 _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__)
43
44
VL53L0X_check_part_used(VL53L0X_DEV Dev,uint8_t * Revision,VL53L0X_DeviceInfo_t * pVL53L0X_DeviceInfo)45 VL53L0X_Error VL53L0X_check_part_used(VL53L0X_DEV Dev, uint8_t *Revision,
46 VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo)
47 {
48 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
49 uint8_t ModuleIdInt;
50 char * ProductId_tmp;
51
52 LOG_FUNCTION_START("");
53
54 Status = VL53L0X_get_info_from_device(Dev, 2);
55
56 if (Status == VL53L0X_ERROR_NONE) {
57 ModuleIdInt = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, ModuleId);
58
59 if (ModuleIdInt == 0) {
60 *Revision = 0;
61 VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->ProductId, "");
62 } else {
63 *Revision = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, Revision);
64 ProductId_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, ProductId);
65 VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->ProductId, ProductId_tmp);
66 }
67 }
68
69 LOG_FUNCTION_END(Status);
70 return Status;
71 }
72
73
VL53L0X_get_device_info(VL53L0X_DEV Dev,VL53L0X_DeviceInfo_t * pVL53L0X_DeviceInfo)74 VL53L0X_Error VL53L0X_get_device_info(VL53L0X_DEV Dev,
75 VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo)
76 {
77 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
78 uint8_t revision_id;
79 uint8_t Revision;
80
81 Status = VL53L0X_check_part_used(Dev, &Revision, pVL53L0X_DeviceInfo);
82
83 if (Status == VL53L0X_ERROR_NONE) {
84 if (Revision == 0) {
85 VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name,
86 VL53L0X_STRING_DEVICE_INFO_NAME_TS0);
87 } else if ((Revision <= 34) && (Revision != 32)) {
88 VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name,
89 VL53L0X_STRING_DEVICE_INFO_NAME_TS1);
90 } else if (Revision < 39) {
91 VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name,
92 VL53L0X_STRING_DEVICE_INFO_NAME_TS2);
93 } else {
94 VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Name,
95 VL53L0X_STRING_DEVICE_INFO_NAME_ES1);
96 }
97
98 VL53L0X_COPYSTRING(pVL53L0X_DeviceInfo->Type,
99 VL53L0X_STRING_DEVICE_INFO_TYPE);
100 }
101
102 if (Status == VL53L0X_ERROR_NONE) {
103 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID,
104 &pVL53L0X_DeviceInfo->ProductType);
105 }
106
107 if (Status == VL53L0X_ERROR_NONE) {
108 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_IDENTIFICATION_REVISION_ID,
109 &revision_id);
110 pVL53L0X_DeviceInfo->ProductRevisionMajor = 1;
111 pVL53L0X_DeviceInfo->ProductRevisionMinor = (revision_id & 0xF0) >> 4;
112 }
113
114 return Status;
115 }
116
117
VL53L0X_get_device_error_string(VL53L0X_DeviceError ErrorCode,char * pDeviceErrorString)118 VL53L0X_Error VL53L0X_get_device_error_string(VL53L0X_DeviceError ErrorCode,
119 char *pDeviceErrorString)
120 {
121 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
122
123 LOG_FUNCTION_START("");
124
125 switch (ErrorCode) {
126 case VL53L0X_DEVICEERROR_NONE:
127 VL53L0X_COPYSTRING(pDeviceErrorString,
128 VL53L0X_STRING_DEVICEERROR_NONE);
129 break;
130 case VL53L0X_DEVICEERROR_VCSELCONTINUITYTESTFAILURE:
131 VL53L0X_COPYSTRING(
132 pDeviceErrorString,
133 VL53L0X_STRING_DEVICEERROR_VCSELCONTINUITYTESTFAILURE);
134 break;
135 case VL53L0X_DEVICEERROR_VCSELWATCHDOGTESTFAILURE:
136 VL53L0X_COPYSTRING(
137 pDeviceErrorString,
138 VL53L0X_STRING_DEVICEERROR_VCSELWATCHDOGTESTFAILURE);
139 break;
140 case VL53L0X_DEVICEERROR_NOVHVVALUEFOUND:
141 VL53L0X_COPYSTRING(pDeviceErrorString,
142 VL53L0X_STRING_DEVICEERROR_NOVHVVALUEFOUND);
143 break;
144 case VL53L0X_DEVICEERROR_MSRCNOTARGET:
145 VL53L0X_COPYSTRING(pDeviceErrorString,
146 VL53L0X_STRING_DEVICEERROR_MSRCNOTARGET);
147 break;
148 case VL53L0X_DEVICEERROR_SNRCHECK:
149 VL53L0X_COPYSTRING(pDeviceErrorString,
150 VL53L0X_STRING_DEVICEERROR_SNRCHECK);
151 break;
152 case VL53L0X_DEVICEERROR_RANGEPHASECHECK:
153 VL53L0X_COPYSTRING(pDeviceErrorString,
154 VL53L0X_STRING_DEVICEERROR_RANGEPHASECHECK);
155 break;
156 case VL53L0X_DEVICEERROR_SIGMATHRESHOLDCHECK:
157 VL53L0X_COPYSTRING(pDeviceErrorString,
158 VL53L0X_STRING_DEVICEERROR_SIGMATHRESHOLDCHECK);
159 break;
160 case VL53L0X_DEVICEERROR_TCC:
161 VL53L0X_COPYSTRING(pDeviceErrorString,
162 VL53L0X_STRING_DEVICEERROR_TCC);
163 break;
164 case VL53L0X_DEVICEERROR_PHASECONSISTENCY:
165 VL53L0X_COPYSTRING(pDeviceErrorString,
166 VL53L0X_STRING_DEVICEERROR_PHASECONSISTENCY);
167 break;
168 case VL53L0X_DEVICEERROR_MINCLIP:
169 VL53L0X_COPYSTRING(pDeviceErrorString,
170 VL53L0X_STRING_DEVICEERROR_MINCLIP);
171 break;
172 case VL53L0X_DEVICEERROR_RANGECOMPLETE:
173 VL53L0X_COPYSTRING(pDeviceErrorString,
174 VL53L0X_STRING_DEVICEERROR_RANGECOMPLETE);
175 break;
176 case VL53L0X_DEVICEERROR_ALGOUNDERFLOW:
177 VL53L0X_COPYSTRING(pDeviceErrorString,
178 VL53L0X_STRING_DEVICEERROR_ALGOUNDERFLOW);
179 break;
180 case VL53L0X_DEVICEERROR_ALGOOVERFLOW:
181 VL53L0X_COPYSTRING(pDeviceErrorString,
182 VL53L0X_STRING_DEVICEERROR_ALGOOVERFLOW);
183 break;
184 case VL53L0X_DEVICEERROR_RANGEIGNORETHRESHOLD:
185 VL53L0X_COPYSTRING(pDeviceErrorString,
186 VL53L0X_STRING_DEVICEERROR_RANGEIGNORETHRESHOLD);
187 break;
188
189 default:
190 VL53L0X_COPYSTRING(pDeviceErrorString,
191 VL53L0X_STRING_UNKNOW_ERROR_CODE);
192 }
193
194 LOG_FUNCTION_END(Status);
195 return Status;
196 }
197
VL53L0X_get_range_status_string(uint8_t RangeStatus,char * pRangeStatusString)198 VL53L0X_Error VL53L0X_get_range_status_string(uint8_t RangeStatus,
199 char * pRangeStatusString)
200 {
201 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
202
203 LOG_FUNCTION_START("");
204
205 switch (RangeStatus) {
206 case 0:
207 VL53L0X_COPYSTRING(pRangeStatusString,
208 VL53L0X_STRING_RANGESTATUS_RANGEVALID);
209 break;
210 case 1:
211 VL53L0X_COPYSTRING(pRangeStatusString,
212 VL53L0X_STRING_RANGESTATUS_SIGMA);
213 break;
214 case 2:
215 VL53L0X_COPYSTRING(pRangeStatusString,
216 VL53L0X_STRING_RANGESTATUS_SIGNAL);
217 break;
218 case 3:
219 VL53L0X_COPYSTRING(pRangeStatusString,
220 VL53L0X_STRING_RANGESTATUS_MINRANGE);
221 break;
222 case 4:
223 VL53L0X_COPYSTRING(pRangeStatusString,
224 VL53L0X_STRING_RANGESTATUS_PHASE);
225 break;
226 case 5:
227 VL53L0X_COPYSTRING(pRangeStatusString,
228 VL53L0X_STRING_RANGESTATUS_HW);
229 break;
230
231 default: /**/
232 VL53L0X_COPYSTRING(pRangeStatusString,
233 VL53L0X_STRING_RANGESTATUS_NONE);
234 }
235
236 LOG_FUNCTION_END(Status);
237 return Status;
238 }
239
VL53L0X_get_pal_error_string(VL53L0X_Error PalErrorCode,char * pPalErrorString)240 VL53L0X_Error VL53L0X_get_pal_error_string(VL53L0X_Error PalErrorCode,
241 char * pPalErrorString)
242 {
243 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
244
245 LOG_FUNCTION_START("");
246
247 switch (PalErrorCode) {
248 case VL53L0X_ERROR_NONE:
249 VL53L0X_COPYSTRING(pPalErrorString, VL53L0X_STRING_ERROR_NONE);
250 break;
251 case VL53L0X_ERROR_CALIBRATION_WARNING:
252 VL53L0X_COPYSTRING(pPalErrorString,
253 VL53L0X_STRING_ERROR_CALIBRATION_WARNING);
254 break;
255 case VL53L0X_ERROR_MIN_CLIPPED:
256 VL53L0X_COPYSTRING(pPalErrorString,
257 VL53L0X_STRING_ERROR_MIN_CLIPPED);
258 break;
259 case VL53L0X_ERROR_UNDEFINED:
260 VL53L0X_COPYSTRING(pPalErrorString, VL53L0X_STRING_ERROR_UNDEFINED);
261 break;
262 case VL53L0X_ERROR_INVALID_PARAMS:
263 VL53L0X_COPYSTRING(pPalErrorString,
264 VL53L0X_STRING_ERROR_INVALID_PARAMS);
265 break;
266 case VL53L0X_ERROR_NOT_SUPPORTED:
267 VL53L0X_COPYSTRING(pPalErrorString,
268 VL53L0X_STRING_ERROR_NOT_SUPPORTED);
269 break;
270 case VL53L0X_ERROR_INTERRUPT_NOT_CLEARED:
271 VL53L0X_COPYSTRING(pPalErrorString,
272 VL53L0X_STRING_ERROR_INTERRUPT_NOT_CLEARED);
273 break;
274 case VL53L0X_ERROR_RANGE_ERROR:
275 VL53L0X_COPYSTRING(pPalErrorString,
276 VL53L0X_STRING_ERROR_RANGE_ERROR);
277 break;
278 case VL53L0X_ERROR_TIME_OUT:
279 VL53L0X_COPYSTRING(pPalErrorString, VL53L0X_STRING_ERROR_TIME_OUT);
280 break;
281 case VL53L0X_ERROR_MODE_NOT_SUPPORTED:
282 VL53L0X_COPYSTRING(pPalErrorString,
283 VL53L0X_STRING_ERROR_MODE_NOT_SUPPORTED);
284 break;
285 case VL53L0X_ERROR_BUFFER_TOO_SMALL:
286 VL53L0X_COPYSTRING(pPalErrorString,
287 VL53L0X_STRING_ERROR_BUFFER_TOO_SMALL);
288 break;
289 case VL53L0X_ERROR_GPIO_NOT_EXISTING:
290 VL53L0X_COPYSTRING(pPalErrorString,
291 VL53L0X_STRING_ERROR_GPIO_NOT_EXISTING);
292 break;
293 case VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED:
294 VL53L0X_COPYSTRING(
295 pPalErrorString,
296 VL53L0X_STRING_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED);
297 break;
298 case VL53L0X_ERROR_CONTROL_INTERFACE:
299 VL53L0X_COPYSTRING(pPalErrorString,
300 VL53L0X_STRING_ERROR_CONTROL_INTERFACE);
301 break;
302 case VL53L0X_ERROR_INVALID_COMMAND:
303 VL53L0X_COPYSTRING(pPalErrorString,
304 VL53L0X_STRING_ERROR_INVALID_COMMAND);
305 break;
306 case VL53L0X_ERROR_DIVISION_BY_ZERO:
307 VL53L0X_COPYSTRING(pPalErrorString,
308 VL53L0X_STRING_ERROR_DIVISION_BY_ZERO);
309 break;
310 case VL53L0X_ERROR_REF_SPAD_INIT:
311 VL53L0X_COPYSTRING(pPalErrorString,
312 VL53L0X_STRING_ERROR_REF_SPAD_INIT);
313 break;
314 case VL53L0X_ERROR_NOT_IMPLEMENTED:
315 VL53L0X_COPYSTRING(pPalErrorString,
316 VL53L0X_STRING_ERROR_NOT_IMPLEMENTED);
317 break;
318
319 default:
320 VL53L0X_COPYSTRING(pPalErrorString,
321 VL53L0X_STRING_UNKNOW_ERROR_CODE);
322 }
323
324 LOG_FUNCTION_END(Status);
325 return Status;
326 }
327
VL53L0X_get_pal_state_string(VL53L0X_State PalStateCode,char * pPalStateString)328 VL53L0X_Error VL53L0X_get_pal_state_string(VL53L0X_State PalStateCode,
329 char * pPalStateString)
330 {
331 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
332
333 LOG_FUNCTION_START("");
334
335 switch (PalStateCode) {
336 case VL53L0X_STATE_POWERDOWN:
337 VL53L0X_COPYSTRING(pPalStateString, VL53L0X_STRING_STATE_POWERDOWN);
338 break;
339 case VL53L0X_STATE_WAIT_STATICINIT:
340 VL53L0X_COPYSTRING(pPalStateString,
341 VL53L0X_STRING_STATE_WAIT_STATICINIT);
342 break;
343 case VL53L0X_STATE_STANDBY:
344 VL53L0X_COPYSTRING(pPalStateString, VL53L0X_STRING_STATE_STANDBY);
345 break;
346 case VL53L0X_STATE_IDLE:
347 VL53L0X_COPYSTRING(pPalStateString, VL53L0X_STRING_STATE_IDLE);
348 break;
349 case VL53L0X_STATE_RUNNING:
350 VL53L0X_COPYSTRING(pPalStateString, VL53L0X_STRING_STATE_RUNNING);
351 break;
352 case VL53L0X_STATE_UNKNOWN:
353 VL53L0X_COPYSTRING(pPalStateString, VL53L0X_STRING_STATE_UNKNOWN);
354 break;
355 case VL53L0X_STATE_ERROR:
356 VL53L0X_COPYSTRING(pPalStateString, VL53L0X_STRING_STATE_ERROR);
357 break;
358
359 default:
360 VL53L0X_COPYSTRING(pPalStateString, VL53L0X_STRING_STATE_UNKNOWN);
361 }
362
363 LOG_FUNCTION_END(Status);
364 return Status;
365 }
366
VL53L0X_get_sequence_steps_info(VL53L0X_SequenceStepId SequenceStepId,char * pSequenceStepsString)367 VL53L0X_Error VL53L0X_get_sequence_steps_info(
368 VL53L0X_SequenceStepId SequenceStepId, char *pSequenceStepsString)
369 {
370 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
371 LOG_FUNCTION_START("");
372
373 switch (SequenceStepId) {
374 case VL53L0X_SEQUENCESTEP_TCC:
375 VL53L0X_COPYSTRING(pSequenceStepsString,
376 VL53L0X_STRING_SEQUENCESTEP_TCC);
377 break;
378 case VL53L0X_SEQUENCESTEP_DSS:
379 VL53L0X_COPYSTRING(pSequenceStepsString,
380 VL53L0X_STRING_SEQUENCESTEP_DSS);
381 break;
382 case VL53L0X_SEQUENCESTEP_MSRC:
383 VL53L0X_COPYSTRING(pSequenceStepsString,
384 VL53L0X_STRING_SEQUENCESTEP_MSRC);
385 break;
386 case VL53L0X_SEQUENCESTEP_PRE_RANGE:
387 VL53L0X_COPYSTRING(pSequenceStepsString,
388 VL53L0X_STRING_SEQUENCESTEP_PRE_RANGE);
389 break;
390 case VL53L0X_SEQUENCESTEP_FINAL_RANGE:
391 VL53L0X_COPYSTRING(pSequenceStepsString,
392 VL53L0X_STRING_SEQUENCESTEP_FINAL_RANGE);
393 break;
394
395 default:
396 Status = VL53L0X_ERROR_INVALID_PARAMS;
397 }
398
399 LOG_FUNCTION_END(Status);
400
401 return Status;
402 }
403
404
VL53L0X_get_limit_check_info(VL53L0X_DEV Dev,uint16_t LimitCheckId,char * pLimitCheckString)405 VL53L0X_Error VL53L0X_get_limit_check_info(VL53L0X_DEV Dev,
406 uint16_t LimitCheckId,
407 char * pLimitCheckString)
408 {
409 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
410
411 LOG_FUNCTION_START("");
412
413 switch (LimitCheckId) {
414 case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE:
415 VL53L0X_COPYSTRING(pLimitCheckString,
416 VL53L0X_STRING_CHECKENABLE_SIGMA_FINAL_RANGE);
417 break;
418 case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE:
419 VL53L0X_COPYSTRING(
420 pLimitCheckString,
421 VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE);
422 break;
423 case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP:
424 VL53L0X_COPYSTRING(pLimitCheckString,
425 VL53L0X_STRING_CHECKENABLE_SIGNAL_REF_CLIP);
426 break;
427 case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD:
428 VL53L0X_COPYSTRING(
429 pLimitCheckString,
430 VL53L0X_STRING_CHECKENABLE_RANGE_IGNORE_THRESHOLD);
431 break;
432
433 case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC:
434 VL53L0X_COPYSTRING(pLimitCheckString,
435 VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_MSRC);
436 break;
437
438 case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE:
439 VL53L0X_COPYSTRING(
440 pLimitCheckString,
441 VL53L0X_STRING_CHECKENABLE_SIGNAL_RATE_PRE_RANGE);
442 break;
443
444 default:
445 VL53L0X_COPYSTRING(pLimitCheckString,
446 VL53L0X_STRING_UNKNOW_ERROR_CODE);
447 }
448
449 LOG_FUNCTION_END(Status);
450 return Status;
451 }
452