The VL53L1CB proximity sensor, based on ST’s FlightSense™, Time-of-Flight technology.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   VL53L1CB_noshield_1sensor_polls_auton VL53L1CB_noshield_1sensor_interrupt_auton X_NUCLEO_53L1A2

Based on VL53L1 library, this is a library for the VL53L1CB ToF chip.

Revision:
9:66969b9016ad
Child:
10:3687b5e79f98
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/inc/VL53l1CB.h	Wed Jun 09 08:40:49 2021 +0100
@@ -0,0 +1,716 @@
+/*******************************************************************************
+ * @file    vl53l1x_class.h
+ * @author  JS
+ * @version V0.0.1
+ * @date    15-January-2019
+ * @brief   Header file for VL53L1 sensor component
+ ******************************************************************************
+ Copyright © 2019, STMicroelectronics International N.V.
+ All rights reserved.
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of STMicroelectronics nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
+ NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED.
+ IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *****************************************************************************/
+
+#ifndef __VL53L1X_CLASS_H
+#define __VL53L1X_CLASS_H
+
+
+#ifdef _MSC_VER
+#   ifdef VL53L1X_API_EXPORTS
+#       define VL53L1X_API  __declspec(dllexport)
+#   else
+#       define VL53L1X_API
+#   endif
+#else
+#   define VL53L1X_API
+#endif
+
+
+/* Includes ------------------------------------------------------------------*/
+
+#include "mbed.h"
+#include "PinNames.h"
+
+#include "RangeSensor.h"
+#include "Stmpe1600.h"
+
+#include "vl53l1_error_codes.h"
+#include "vl53l1_platform_user_data.h"
+
+//#include "DevI2C.h"
+#include "ToF_I2C.h"
+/**********************************************************/
+#include "vl53l1_def.h"
+/***********************************************************/
+
+
+#define VL53L1_IMPLEMENTATION_VER_MAJOR       1
+#define VL53L1_IMPLEMENTATION_VER_MINOR       0
+#define VL53L1_IMPLEMENTATION_VER_SUB         1
+#define VL53L1_IMPLEMENTATION_VER_REVISION  0000
+
+typedef int8_t VL53L1_ERROR;
+
+//#define SOFT_RESET                                          0x0000
+#define VL53L1_I2C_SLAVE__DEVICE_ADDRESS                    0x0001
+#define VL53L1_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND        0x0008
+#define ALGO__CROSSTALK_COMPENSATION_PLANE_OFFSET_KCPS      0x0016
+#define ALGO__CROSSTALK_COMPENSATION_X_PLANE_GRADIENT_KCPS  0x0018
+#define ALGO__CROSSTALK_COMPENSATION_Y_PLANE_GRADIENT_KCPS  0x001A
+#define ALGO__PART_TO_PART_RANGE_OFFSET_MM                  0x001E
+#define MM_CONFIG__INNER_OFFSET_MM                          0x0020
+#define MM_CONFIG__OUTER_OFFSET_MM                          0x0022
+#define GPIO_HV_MUX__CTRL                                   0x0030
+#define GPIO__TIO_HV_STATUS                                 0x0031
+#define SYSTEM__INTERRUPT_CONFIG_GPIO                       0x0046
+#define PHASECAL_CONFIG__TIMEOUT_MACROP                     0x004B
+#define RANGE_CONFIG__TIMEOUT_MACROP_A_HI                   0x005E
+#define RANGE_CONFIG__VCSEL_PERIOD_A                        0x0060
+#define RANGE_CONFIG__VCSEL_PERIOD_B                        0x0063
+#define RANGE_CONFIG__TIMEOUT_MACROP_B_HI                   0x0061
+#define RANGE_CONFIG__TIMEOUT_MACROP_B_LO                   0x0062
+#define RANGE_CONFIG__SIGMA_THRESH                          0x0064
+#define RANGE_CONFIG__MIN_COUNT_RATE_RTN_LIMIT_MCPS         0x0066
+#define RANGE_CONFIG__VALID_PHASE_HIGH                      0x0069
+#define VL53L1_SYSTEM__INTERMEASUREMENT_PERIOD              0x006C
+#define SYSTEM__THRESH_HIGH                                 0x0072
+#define SYSTEM__THRESH_LOW                                  0x0074
+#define SD_CONFIG__WOI_SD0                                  0x0078
+#define SD_CONFIG__INITIAL_PHASE_SD0                        0x007A
+#define ROI_CONFIG__USER_ROI_CENTRE_SPAD                    0x007F
+#define ROI_CONFIG__USER_ROI_REQUESTED_GLOBAL_XY_SIZE       0x0080
+#define SYSTEM__SEQUENCE_CONFIG                             0x0081
+#define VL53L1_SYSTEM__GROUPED_PARAMETER_HOLD               0x0082
+#define SYSTEM__INTERRUPT_CLEAR                             0x0086
+#define SYSTEM__MODE_START                                  0x0087
+#define VL53L1_RESULT__RANGE_STATUS                         0x0089
+#define VL53L1_RESULT__DSS_ACTUAL_EFFECTIVE_SPADS_SD0       0x008C
+#define RESULT__AMBIENT_COUNT_RATE_MCPS_SD                  0x0090
+#define VL53L1_RESULT__FINAL_CROSSTALK_CORRECTED_RANGE_MM_SD0               0x0096
+#define VL53L1_RESULT__PEAK_SIGNAL_COUNT_RATE_CROSSTALK_CORRECTED_MCPS_SD0  0x0098
+#define VL53L1_RESULT__OSC_CALIBRATE_VAL                    0x00DE
+#define VL53L1_FIRMWARE__SYSTEM_STATUS                      0x00E5
+#define VL53L1_IDENTIFICATION__MODEL_ID                     0x010F
+#define VL53L1_ROI_CONFIG__MODE_ROI_CENTRE_SPAD             0x013E
+
+
+#define VL53L1_DEFAULT_DEVICE_ADDRESS                      0x52
+
+#define VL53L1_REG_IDENTIFICATION_MODEL_ID                 0x010F
+
+/****************************************
+ * PRIVATE define do not edit
+ ****************************************/
+
+/**
+ *  @brief defines SW Version
+ */
+//typedef struct {
+ //   uint8_t      major;    /*!< major number */
+//    uint8_t      minor;    /*!< minor number */
+//    uint8_t      build;    /*!< build number */
+//    uint32_t     revision; /*!< revision number */
+//} VL53L1X_Version_t;
+
+
+/* Classes -------------------------------------------------------------------*/
+/** Class representing a VL53L1 sensor component
+ */
+class VL53L1 : public RangeSensor
+{
+ 
+
+ 
+ public:
+ 
+ 
+ #define VL53L1DevStructGetLLDriverHandle(Dev) (&Dev->Data.LLData)
+    /** Constructor
+     * @param[in] &i2c device I2C to be used for communication
+     * @param[in] &pin_gpio1 pin Mbed InterruptIn PinName to be used as component GPIO_1 INT
+     * @param[in] DevAddr device address, 0x52 by default
+     */
+
+    VL53L1(ToF_DevI2C *i2c, DigitalOut *pin, PinName pin_gpio1, uint8_t dev_addr = VL53L1_DEFAULT_DEVICE_ADDRESS) 
+    : RangeSensor(), dev_i2c(i2c), _gpio0(pin)
+    {
+        MyDevice.i2c_slave_address=dev_addr;
+        Device = &MyDevice;
+               
+        _expgpio0 = NULL;
+        if (pin_gpio1 != NC) {
+            _gpio1Int = new InterruptIn(pin_gpio1);
+        } else {
+            _gpio1Int = NULL;
+        }
+    }
+
+    
+    /** Constructor 2 (STMPE1600DigiOut)
+     * @param[in] i2c device I2C to be used for communication
+     * @param[in] &pin Gpio Expander STMPE1600DigiOut pin to be used as component GPIO_0 CE
+     * @param[in] pin_gpio1 pin Mbed InterruptIn PinName to be used as component GPIO_1 INT
+     * @param[in] device address, 0x29 by default
+     */
+    VL53L1(ToF_DevI2C *i2c, Stmpe1600DigiOut *pin, PinName pin_gpio1,
+            uint8_t dev_addr = VL53L1_DEFAULT_DEVICE_ADDRESS) 
+            : dev_i2c(i2c), _expgpio0(pin)
+    {
+        MyDevice.i2c_slave_address=dev_addr;
+        Device = &MyDevice;
+               
+        _gpio0 = NULL;
+        if (pin_gpio1 != NC) {
+            _gpio1Int = new InterruptIn(pin_gpio1);
+        } else {
+            _gpio1Int = NULL;
+        }
+    }    
+    
+   /** Destructor
+    */
+    virtual ~VL53L1()
+    {        
+        if (_gpio1Int != NULL) {
+            delete _gpio1Int;
+        }
+    }
+    
+        
+    
+    VL53L1_DEV getDevicePtr() { return Device; }
+
+    
+    /* warning: VL53L1 class inherits from GenericSensor, RangeSensor and LightSensor, that haven`t a destructor.
+       The warning should request to introduce a virtual destructor to make sure to delete the object */
+
+    /*** Interface Methods ***/
+    /*** High level API ***/
+    /**
+     * @brief       PowerOn the sensor
+     * @return      void
+     */
+    /* turns on the sensor */
+    virtual void VL53L1_On(void)
+    {
+        printf("VL53L1_On\r\n");
+        if (_gpio0) {
+            *_gpio0 = 1;
+        } else {
+            if (_expgpio0) {
+                *_expgpio0 = 1;
+            }
+        }
+#if (MBED_VERSION  > 60300) 
+    thread_sleep_for(100);
+#else
+    wait_ms(100);  // NEEDS A DELAY BETWEEN SENSORS
+#endif
+    }
+
+    /**
+     * @brief       PowerOff the sensor
+     * @return      void
+     */
+    /* turns off the sensor */
+    virtual void VL53L1_Off(void)
+    {
+        printf("VL53L1_Off\r\n");
+        if (_gpio0) {
+            *_gpio0 = 0;
+        } else {
+            if (_expgpio0) {
+                *_expgpio0 = 0;
+            }
+        }
+#if (MBED_VERSION  > 60300) 
+    thread_sleep_for(100);
+#else
+    wait_ms(100);  // NEEDS A DELAY BETWEEN SENSORS
+#endif
+    }
+    
+    int is_present()
+    {
+        int status;
+        uint8_t id = 0;
+
+        status = read_id(&id);
+        if (status) {
+            printf("Failed to read ID device. Device not present!\n\r");
+        }
+        return status;
+    }
+
+    /**
+     * @brief       Initialize the sensor with default values
+     * @return      0 on Success
+     */
+     
+     VL53L1_ERROR InitSensor(uint8_t address){
+        VL53L1_ERROR status = 0;
+        uint8_t sensorState = 0;
+        VL53L1_Off();
+        VL53L1_On();
+        status = vl53L1_SetI2CAddress(address);
+        if(!status){
+            status = VL53L1_SensorInit();
+        }      
+     
+        while(!status && !sensorState) {
+            status = vl53L1_BootState(&sensorState);
+
+#if (MBED_VERSION  > 60300) 
+        thread_sleep_for(2);
+#else
+        wait_ms(2);  // NEEDS A DELAY BETWEEN SENSORS
+#endif
+        }           
+        return status;
+     }
+
+
+
+/**
+ *
+ * @brief One time device initialization
+ * @param void
+ * @return     0 on success,  @a #CALIBRATION_WARNING if failed
+ */
+    virtual int init(void *init)
+    {
+         return VL53L1_SensorInit();
+         return 0;
+    }
+
+
+    /**
+     * @brief       Initialize the sensor with default values
+     * @return      "0" on success
+     */
+    int init_sensor(uint8_t new_addr);
+
+    /* Read function of the ID device */
+    virtual int read_id(uint8_t *id){
+        int status = 0;
+        uint16_t rl_id = 0;
+    
+        uint8_t ExpanderData[2];
+    
+        ExpanderData[0] = 0;
+        ExpanderData[1] = 0;
+        rl_id = 0;
+        dev_i2c->ToF_i2c_read(&ExpanderData[0], Device->i2c_slave_address, VL53L1_REG_IDENTIFICATION_MODEL_ID, 2);
+    
+        rl_id = (ExpanderData[0] << 8) + ExpanderData[1];
+        printf("Model ID is: %d (%X)  \r\n",rl_id, rl_id);
+    
+        uint8_t tmp = 0;
+        ExpanderData[0] = VL53L1_FIRMWARE__SYSTEM_STATUS >> 8;
+        ExpanderData[1] = VL53L1_FIRMWARE__SYSTEM_STATUS & 0x0FF;
+        dev_i2c->ToF_i2c_read(&tmp, Device->i2c_slave_address, VL53L1_FIRMWARE__SYSTEM_STATUS, 1);
+
+        printf("Firmware system is: %d\r\n",tmp);
+    
+        if (rl_id == 0xEACC) {
+            printf("Device is present %d:\r\n", rl_id);
+            return status;
+        }
+        return -1;
+    }
+
+
+    /**
+     * @brief       Interrupt handling func to be called by user after an INT is occurred
+     * @param[out]  Data pointer to the distance to read data in to
+     * @return      0 on Success
+     */
+    int handle_irq(uint16_t *distance);
+
+    /**
+     * @brief       Start the measure indicated by operating mode
+     * @param[in]   fptr specifies call back function must be !NULL in case of interrupt measure
+     * @return      0 on Success
+     */
+    int start_measurement(void (*fptr)(void));
+    /**
+     * @brief       Stop the currently running measure indicate by operating_mode
+     * @return      0 on Success
+     */
+    int stop_measurement();
+    /**
+     * @brief       Get results for the measure
+     * @param[out]  Data pointer to the distance_data to read data in to
+     * @return      0 on Success
+     */
+    int get_measurement(uint16_t *distance);
+    /**
+     * @brief       Enable interrupt measure IRQ
+     * @return      0 on Success
+     */
+    void enable_interrupt_measure_detection_irq(void)
+    {
+        if (_gpio1Int != NULL)
+            _gpio1Int->enable_irq();
+    }
+
+    /**
+     * @brief       Disable interrupt measure IRQ
+     * @return      0 on Success
+     */
+    void disable_interrupt_measure_detection_irq(void)
+    {
+        if (_gpio1Int != NULL)
+            _gpio1Int->disable_irq();
+    }
+    /**
+     * @brief       Attach a function to call when an interrupt is detected, i.e. measurement is ready
+     * @param[in]   fptr pointer to call back function to be called whenever an interrupt occours
+     * @return      0 on Success
+     */
+    void attach_interrupt_measure_detection_irq(void (*fptr)(void))
+    {
+        if (_gpio1Int != NULL)
+            _gpio1Int->rise(fptr);
+    }
+
+/**
+ * @brief Get ranging result and only that
+ * @param pRange_mm  Pointer to range distance
+ * @return           0 on success
+ */
+    virtual int get_distance(uint32_t *piData)
+    {
+    int status;
+    uint16_t distance;
+    status = VL53L1_GetDistance(&distance);
+    *piData = (uint32_t) distance;
+    return status;
+    }
+
+
+/* VL53L1X_api.h functions */
+
+
+
+    /**
+     * @brief This function returns the SW driver version
+     */
+    VL53L1_ERROR VL53L1_GetSWVersion(VL53L1_Version_t *pVersion);
+
+    /**
+     * @brief This function sets the sensor I2C address used in case multiple devices application, default address 0x52
+     */
+    VL53L1_ERROR vl53L1_SetI2CAddress(uint8_t new_address);
+
+    /**
+     * @brief This function loads the 135 bytes default values to initialize the sensor.
+     * @param dev Device address
+     * @return 0:success, != 0:failed
+     */
+    VL53L1_ERROR VL53L1_SensorInit();
+
+    /**
+     * @brief This function clears the interrupt, to be called after a ranging data reading
+     * to arm the interrupt for the next data ready event.
+     */
+    VL53L1_ERROR VL53L1_ClearInterrupt();
+
+
+    /**
+     * @brief This function returns the current interrupt polarity\n
+     * 1=active high (default), 0=active low
+     */
+    VL53L1_ERROR VL53L1_GetInterruptPolarity(uint8_t *pIntPol);
+
+    /**
+     * @brief This function starts the ranging distance operation\n
+     * The ranging operation is continuous. The clear interrupt has to be done after each get data to allow the interrupt to raise when the next data is ready\n
+     * 1=active high (default), 0=active low, use SetInterruptPolarity() to change the interrupt polarity if required.
+     */
+    VL53L1_ERROR VL53L1_StartRanging();
+
+    /**
+     * @brief This function stops the ranging.
+     */
+    VL53L1_ERROR VL53L1_StopRanging();
+
+
+
+    /**
+     * @brief This function returns the boot state of the device (1:booted, 0:not booted)
+     */
+    VL53L1_ERROR vl53L1_BootState(uint8_t *state);
+
+    /**
+     * @brief This function returns the sensor id, sensor Id must be 0xEEAC
+     */
+  //  VL53L1_ERROR VL53L1X_GetSensorId(uint16_t *id);
+
+    /**
+     * @brief This function returns the distance measured by the sensor in mm
+     */
+    VL53L1_ERROR VL53L1_GetDistance(uint16_t *distance);
+
+
+    
+    
+    /**************************************************************************/
+    VL53L1_ERROR vl53L1_WaitDeviceBooted(VL53L1_DEV Dev);
+    
+    
+    VL53L1_ERROR vl53L1_GetCalibrationData(VL53L1_CalibrationData_t  *pCalibrationData);
+        
+    
+    
+    VL53L1_GPIO_Interrupt_Mode ConvertModeToLLD(VL53L1_Error *pStatus,
+        VL53L1_ThresholdMode CrossMode);
+      
+    VL53L1_ERROR vl53L1_GetVersion(VL53L1_Version_t *pVersion);
+    
+    VL53L1_ERROR vl53L1_GetProductRevision(
+    uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor);
+    
+    
+    VL53L1_ERROR vl53L1_GetDeviceInfo(
+    VL53L1_DeviceInfo_t *pVL53L1_DeviceInfo);
+    
+    VL53L1_ERROR vl53L1_GetUID( uint64_t *pUid);
+    
+    VL53L1_ERROR vl53L1_GetRangeStatusString(uint8_t RangeStatus,
+    char *pRangeStatusString);
+    
+    
+    VL53L1_ERROR vl53L1_GetPalErrorString(VL53L1_Error PalErrorCode,
+    char *pPalErrorString);
+    
+    
+    VL53L1_ERROR vl53L1_GetPalStateString(VL53L1_State PalStateCode,
+    char *pPalStateString);
+    
+    
+    VL53L1_ERROR vl53L1_GetPalState(VL53L1_DEV Dev, VL53L1_State *pPalState);
+    
+    VL53L1_ERROR vl53L1_DataInit();
+    
+    VL53L1_ERROR vl53L1_StaticInit();
+        
+    VL53L1_Error vl53L1_ClearInterruptAndStartMeasurement();
+    
+    VL53L1_ERROR vl53L1_GetRangingMeasurementData(
+        VL53L1_RangingMeasurementData_t *pRangingMeasurementData);
+
+    VL53L1_ERROR vl53L1_GetMultiRangingData(
+        VL53L1_MultiRangingData_t *pMultiRangingData);   
+        
+    VL53L1_ERROR vl53L1_GetAdditionalData(
+                VL53L1_AdditionalData_t *pAdditionalData);
+                
+    VL53L1_ERROR vl53L1_SetTuningParameter(
+        uint16_t TuningParameterId, int32_t TuningParameterValue);
+        
+    VL53L1_ERROR vl53L1_GetTuningParameter(
+        uint16_t TuningParameterId, int32_t *pTuningParameterValue);
+  
+    VL53L1_ERROR vl53L1_SetXTalkCompensationEnable(
+         uint8_t XTalkCompensationEnable);
+         
+         
+    VL53L1_ERROR vl53L1_GetXTalkCompensationEnable(
+            uint8_t *pXTalkCompensationEnable);
+                       
+    VL53L1_ERROR vl53L1_PerformXTalkCalibration(
+    uint8_t CalibrationOption);
+    
+    VL53L1_ERROR vl53L1_SetOffsetCalibrationMode(
+            VL53L1_OffsetCalibrationModes OffsetCalibrationMode);
+            
+
+    VL53L1_ERROR vl53L1_SetOffsetCorrectionMode(
+            VL53L1_OffsetCorrectionModes OffsetCorrectionMode);
+        
+    VL53L1_ERROR vl53L1_PerformOffsetCalibration(
+            int32_t CalDistanceMilliMeter, FixPoint1616_t CalReflectancePercent);
+            
+    VL53L1_ERROR vl53L1_PerformOffsetSimpleCalibration(
+             int32_t CalDistanceMilliMeter);
+    
+    VL53L1_ERROR vl53L1_PerformOffsetZeroDistanceCalibration();
+    
+    VL53L1_ERROR vl53L1_SetCalibrationData(
+        VL53L1_CalibrationData_t *pCalibrationData);
+        
+    VL53L1_ERROR vl53L1_SetZoneCalibrationData(
+        VL53L1_ZoneCalibrationData_t *pZoneCalibrationData);
+        
+    VL53L1_ERROR vl53L1_GetZoneCalibrationData(
+        VL53L1_ZoneCalibrationData_t  *pZoneCalibrationData);
+        
+    VL53L1_ERROR vl53L1_GetOpticalCenter(
+        FixPoint1616_t *pOpticalCenterX,
+        FixPoint1616_t *pOpticalCenterY);
+        
+    VL53L1_ERROR vl53L1_SetThresholdConfig(VL53L1_DetectionConfig_t *pConfig);
+    
+    
+     VL53L1_ERROR vl53L1_GetLimitCheckStatus( uint16_t LimitCheckId,
+                                              uint8_t *pLimitCheckStatus);    
+                                              
+        
+    VL53L1_ERROR vl53L1_SetLimitCheckEnable( uint16_t LimitCheckId,
+                                             uint8_t LimitCheckEnable);
+        
+    VL53L1_ERROR vl53L1_GetLimitCheckEnable(uint16_t LimitCheckId,
+                                             uint8_t *pLimitCheckEnable);
+    
+    VL53L1_ERROR vl53L1_GetThresholdConfig(VL53L1_DetectionConfig_t *pConfig);
+        
+        
+    VL53L1_ERROR vl53L1_PerformOffsetPerVcselCalibration(int32_t CalDistanceMilliMeter);
+  
+    VL53L1_ERROR vl53L1_GetNumberOfLimitCheck(uint16_t *pNumberOfLimitCheck);      
+    
+    VL53L1_ERROR vl53L1_GetLimitCheckInfo(uint16_t LimitCheckId,
+                                           char *pLimitCheckString);       
+        
+    VL53L1_ERROR vl53L1_SetPresetMode(VL53L1_PresetModes PresetMode);
+        
+    VL53L1_ERROR vl53L1_GetPresetMode( VL53L1_PresetModes *pPresetMode);
+                                    
+    VL53L1_ERROR vl53L1_SetDistanceMode( VL53L1_DistanceModes DistanceMode);
+                                                                                    
+    VL53L1_ERROR vl53L1_GetDistanceMode(VL53L1_DistanceModes *pDistanceMode);
+                                             
+    VL53L1_ERROR vl53L1_SetOutputMode(VL53L1_OutputModes OutputMode);
+                                           
+    VL53L1_ERROR vl53L1_GetOutputMode(VL53L1_OutputModes *pOutputMode);
+                                        
+    VL53L1_ERROR vl53L1_SetMeasurementTimingBudgetMicroSeconds(uint32_t MeasurementTimingBudgetMicroSeconds);
+                                    
+    VL53L1_ERROR vl53L1_SetInterMeasurementPeriodMilliSeconds(uint32_t InterMeasurementPeriodMilliSeconds);
+                                   
+    
+    VL53L1_ERROR vl53L1_GetInterMeasurementPeriodMilliSeconds(
+            uint32_t *pInterMeasurementPeriodMilliSeconds);
+        
+        
+    VL53L1_ERROR vl53L1_SetDmaxReflectance( FixPoint1616_t DmaxReflectance);
+                                                
+    VL53L1_ERROR vl53L1_GetDmaxReflectance(FixPoint1616_t *pDmaxReflectance);
+                                                
+                                                
+    VL53L1_ERROR vl53L1_GetDmaxMode( VL53L1_DeviceDmaxModes *pDmaxMode);    
+                                    
+    VL53L1_ERROR vl53L1_GetMeasurementTimingBudgetMicroSeconds(
+                                 uint32_t *pMeasurementTimingBudgetMicroSeconds);  
+                                 
+    VL53L1_ERROR vl53L1_SetDmaxMode(VL53L1_DeviceDmaxModes DmaxMode);    
+                                     
+    VL53L1_ERROR vl53L1_SetLimitCheckValue( uint16_t LimitCheckId,
+                                            FixPoint1616_t LimitCheckValue);
+                                            
+    VL53L1_ERROR vl53L1_GetLimitCheckValue(uint16_t LimitCheckId,
+                                            FixPoint1616_t *pLimitCheckValue);   
+                                            
+    VL53L1_ERROR vl53L1_GetLimitCheckCurrent( uint16_t LimitCheckId,
+                                              FixPoint1616_t *pLimitCheckCurrent);   
+                                            
+    VL53L1_ERROR vl53L1_GetMaxNumberOfROI( uint8_t *pMaxNumberOfROI);    
+                                           
+    VL53L1_ERROR vl53L1_SetROI(VL53L1_RoiConfig_t *pRoiConfig);
+                                
+     VL53L1_ERROR vl53L1_GetROI(VL53L1_RoiConfig_t *pRoiConfig);
+                                 
+    VL53L1_ERROR vl53L1_GetNumberOfSequenceSteps(uint8_t *pNumberOfSequenceSteps);          
+    
+    VL53L1_ERROR vl53L1_GetSequenceStepsInfo(VL53L1_SequenceStepId SequenceStepId,
+                                              char *pSequenceStepsString);   
+                                              
+                                              
+    VL53L1_ERROR vl53L1_SetSequenceStepEnable(VL53L1_SequenceStepId SequenceStepId, uint8_t SequenceStepEnabled);    
+        
+        
+    VL53L1_ERROR vl53L1_GetSequenceStepEnable(VL53L1_SequenceStepId SequenceStepId, uint8_t *pSequenceStepEnabled); 
+           
+    
+    VL53L1_ERROR vl53L1_StartMeasurement();
+    
+    VL53L1_ERROR vl53L1_StopMeasurement();
+    
+    
+    VL53L1_ERROR vl53L1_GetMeasurementDataReady(uint8_t *pMeasurementDataReady); 
+                                                 
+    VL53L1_ERROR vl53L1_WaitMeasurementDataReady();        
+    
+    VL53L1_Error vl53L1_SmudgeCorrectionEnable(VL53L1_SmudgeCorrectionModes Mode);                                                                                                                                                    
+    /***************************************************************************/
+    
+
+    /* Write and read functions from I2C */
+
+    VL53L1_ERROR VL53L1_WrByte(VL53L1_DEV dev, uint16_t index, uint8_t data);
+    VL53L1_ERROR VL53L1_WrWord(VL53L1_DEV dev, uint16_t index, uint16_t data);
+    VL53L1_ERROR VL53L1_WrDWord(VL53L1_DEV dev, uint16_t index, uint32_t data);
+    VL53L1_ERROR VL53L1_RdByte(VL53L1_DEV dev, uint16_t index, uint8_t *data);
+    VL53L1_ERROR VL53L1_RdWord(VL53L1_DEV dev, uint16_t index, uint16_t *data);
+    VL53L1_ERROR VL53L1_RdDWord(VL53L1_DEV dev, uint16_t index, uint32_t *data);
+    VL53L1_ERROR VL53L1_UpdateByte(VL53L1_DEV dev, uint16_t index, uint8_t AndData, uint8_t OrData);
+
+    VL53L1_ERROR VL53L1_WriteMulti(VL53L1_DEV Dev, uint16_t index, uint8_t *pdata, uint32_t count);
+    VL53L1_ERROR VL53L1_ReadMulti(VL53L1_DEV Dev, uint16_t index, uint8_t *pdata, uint32_t count);
+
+    VL53L1_ERROR VL53L1_I2CWrite(uint8_t dev, uint16_t index, uint8_t *data, uint16_t number_of_bytes);
+    VL53L1_ERROR VL53L1_I2CRead(uint8_t dev, uint16_t index, uint8_t *data, uint16_t number_of_bytes);
+    VL53L1_ERROR VL53L1_GetTickCount(uint32_t *ptick_count_ms);
+    VL53L1_ERROR VL53L1_WaitUs(VL53L1_Dev_t *pdev, int32_t wait_us);
+    VL53L1_ERROR VL53L1_WaitMs(VL53L1_Dev_t *pdev, int32_t wait_ms);
+    
+    VL53L1_ERROR vl53L1_WaitValueMaskEx(VL53L1_Dev_t *pdev, uint32_t timeout_ms, uint16_t index, uint8_t value, uint8_t mask, uint32_t poll_delay_ms);
+    VL53L1_ERROR VL53L1_SetDeviceAddress(VL53L1_DEV Dev, uint8_t DeviceAddress);
+    
+    // from vl53l1_api_debug.c
+
+    VL53L1_Error vl53L1_get_additional_data(
+        VL53L1_DEV                       Dev,
+        VL53L1_additional_data_t        *pdata);
+
+
+ protected:
+
+    /* IO Device */
+    ToF_DevI2C *dev_i2c;
+    
+    /* Digital out pin */
+    DigitalOut *_gpio0;
+    /* GPIO expander */
+    Stmpe1600DigiOut *_expgpio0;
+    /* Measure detection IRQ */
+    InterruptIn *_gpio1Int;
+ 
+    ///* Digital out pin */
+    /* Device data */
+    VL53L1_Dev_t MyDevice;
+    VL53L1_DEV Device;
+};
+
+
+#endif /* _VL53L1X_CLASS_H_ */
\ No newline at end of file