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.
Diff: inc/VL53l1CB.h
- Revision:
- 9:66969b9016ad
- Child:
- 10:3687b5e79f98
diff -r c07c8a53bfbd -r 66969b9016ad inc/VL53l1CB.h --- /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