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