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: src/VL53l1CB.cpp
- Revision:
- 9:66969b9016ad
- Child:
- 10:3687b5e79f98
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/VL53l1CB.cpp Wed Jun 09 08:40:49 2021 +0100 @@ -0,0 +1,988 @@ +/** + ****************************************************************************** + * @file vl53l1x_class.cpp + * @author JS + * @version V0.0.1 + * @date 15-January-2019 + * @brief Implementation file for the VL53L1 sensor component driver class + ****************************************************************************** + * @attention + * + * <h2><center>© COPYRIGHT(c) 2018 STMicroelectronics</center></h2> + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. 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. + * 3. 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 AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS 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. + * + ****************************************************************************** +*/ + +/* Includes */ +#include <stdlib.h> +#include "VL53L1CB.h" +/************************************************/ +#include "vl53l1_platform_user_config.h" +#include "vl53l1_def.h" +#include "vl53l1_wait.h" +#include "vl53l1_api.h" +#include "vl53l1_api_debug.h" +#include "vl53l1_api_strings.h" +#include "vl53l1_preset_setup.h" +#include "vl53l1_api_calibration.h" +#include "vl53l1_nvm_structs.h" +#include "vl53l1_nvm.h" +#include "vl53l1_core.h" +#include "vl53l1_register_funcs.h" +/***********************************************************/ +#include "vl53l1_api_core.h" + +#include "vl53l1_configuration.h" + + +#ifndef MIN +#define MIN(v1, v2) ((v1) < (v2) ? (v1) : (v2)) +#endif +#ifndef MAX +#define MAX(v1, v2) ((v1) < (v2) ? (v2) : (v1)) +#endif + + +VL53L1_ERROR VL53L1::VL53L1_GetSWVersion(VL53L1_Version_t *pVersion) +{ + VL53L1_ERROR Status = 0; + + pVersion->major = VL53L1_IMPLEMENTATION_VER_MAJOR; + pVersion->minor = VL53L1_IMPLEMENTATION_VER_MINOR; + pVersion->build = VL53L1_IMPLEMENTATION_VER_SUB; + pVersion->revision = VL53L1_IMPLEMENTATION_VER_REVISION; + return Status; +} + +VL53L1_ERROR VL53L1::vl53L1_SetI2CAddress(uint8_t new_address) +{ + VL53L1_ERROR status = 0; + // status = (VL53L1_ERROR)VL53L1_SetDeviceAddress(Device,new_address); + + + // Device->i2c_slave_address = new_address; //~~ was + if ( Device->i2c_slave_address != new_address) + { + status = VL53L1_WrByte(Device, VL53L1_I2C_SLAVE__DEVICE_ADDRESS, new_address >> 1); + printf("VL53L1_SetI2CAddress %d to %d status = %d\n", Device->i2c_slave_address,new_address,status); + Device->i2c_slave_address = new_address; + + } + return status; +} + +int VL53L1::init_sensor(uint8_t new_addr) +{ + Device->i2c_slave_address = new_addr; + int status = 0; + VL53L1_Off(); + VL53L1_On(); + + status = is_present(); + if (!status) { + printf("Failed to init VL53L0X sensor!\n\r"); + return status; + } + return status; +} + + +VL53L1_ERROR VL53L1::VL53L1_SensorInit() +{ + VL53L1_ERROR status = 0; + uint8_t Addr = 0x00; + + for (Addr = 0x2D; Addr <= 0x87; Addr++){ + status = VL53L1_WrByte(Device, Addr, VL51L1X_DEFAULT_CONFIGURATION[Addr - 0x2D]); + if (status != 0) + { + printf("Writing config failed - %d\r\n", status); + } + } + + // uint16_t sensorID= 0; +// status = VL53L1X_GetSensorId(&sensorID); + // printf("Sensor id is - %d (%X)\r\n", sensorID, sensorID); + + status = VL53L1_StartRanging(); + if (status != 0) + { + printf("start ranging failed - %d\r\n", status); + } + + status = VL53L1_ClearInterrupt(); + status = VL53L1_StopRanging(); + status = VL53L1_WrByte(Device, VL53L1_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND, 0x09); // two bounds VHV + status = VL53L1_WrByte(Device, 0x0B, 0); // start VHV from the previous temperature + return status; +} + + +VL53L1_ERROR VL53L1::VL53L1_ClearInterrupt() +{ + VL53L1_ERROR status = 0; + + status = VL53L1_WrByte(Device, SYSTEM__INTERRUPT_CLEAR, 0x01); +// printf("VL53L1::VL53L1X_ClearInterrupt()\n"); + return status; +} + + + + + +VL53L1_ERROR VL53L1::VL53L1_GetInterruptPolarity(uint8_t *pInterruptPolarity) +{ + uint8_t Temp; + VL53L1_ERROR status = 0; + + status = VL53L1_RdByte(Device, GPIO_HV_MUX__CTRL, &Temp); + Temp = Temp & 0x10; + *pInterruptPolarity = !(Temp>>4); + return status; +} + + + +VL53L1_ERROR VL53L1::VL53L1_StartRanging() +{ + VL53L1_ERROR status = 0; + + status = VL53L1_WrByte(Device, SYSTEM__MODE_START, 0x40); + return status; +} + + +VL53L1_ERROR VL53L1::VL53L1_StopRanging() +{ + VL53L1_ERROR status = 0; + + status = VL53L1_WrByte(Device, SYSTEM__MODE_START, 0x00); + return status; +} + + + + +VL53L1_ERROR VL53L1::vl53L1_BootState(uint8_t *state) +{ + VL53L1_ERROR status = 0; + uint8_t tmp = 0; + + status = VL53L1_RdByte(Device,VL53L1_FIRMWARE__SYSTEM_STATUS, &tmp); + *state = tmp; + return status; +} + + +VL53L1_ERROR VL53L1::VL53L1_GetDistance(uint16_t *distance) +{ + VL53L1_ERROR status = 0; + uint16_t tmp; + + status = (VL53L1_RdWord(Device, + VL53L1_RESULT__FINAL_CROSSTALK_CORRECTED_RANGE_MM_SD0, &tmp)); + *distance = tmp; + return status; +} + + + /* Write and read functions from I2C */ + + +VL53L1_ERROR VL53L1::VL53L1_WriteMulti(VL53L1_DEV Dev, uint16_t index, uint8_t *pdata, uint32_t count) +{ + int status; +//printf(" class VL53L1_WriteMulti \n"); + status = VL53L1_I2CWrite(Dev->i2c_slave_address, index, pdata, (uint16_t)count); + return status; +} + +VL53L1_ERROR VL53L1::VL53L1_ReadMulti(VL53L1_DEV Dev, uint16_t index, uint8_t *pdata, uint32_t count) +{ + int status; + + status = VL53L1_I2CRead(Dev->i2c_slave_address, index, pdata, (uint16_t)count); + + return status; +} + + +VL53L1_ERROR VL53L1::VL53L1_WrByte(VL53L1_DEV Dev, uint16_t index, uint8_t data) +{ + int status; + + status=VL53L1_I2CWrite(Dev->i2c_slave_address, index, &data, 1); + return status; +} + +VL53L1_ERROR VL53L1::VL53L1_WrWord(VL53L1_DEV Dev, uint16_t index, uint16_t data) +{ + int status; + uint8_t buffer[2]; + + buffer[0] = data >> 8; + buffer[1] = data & 0x00FF; + status=VL53L1_I2CWrite(Dev->i2c_slave_address, index, (uint8_t *)buffer, 2); + return status; +} + +VL53L1_ERROR VL53L1::VL53L1_WrDWord(VL53L1_DEV Dev, uint16_t index, uint32_t data) +{ + int status; + uint8_t buffer[4]; + + buffer[0] = (data >> 24) & 0xFF; + buffer[1] = (data >> 16) & 0xFF; + buffer[2] = (data >> 8) & 0xFF; + buffer[3] = (data >> 0) & 0xFF; + status=VL53L1_I2CWrite(Dev->i2c_slave_address, index, (uint8_t *)buffer, 4); + return status; +} + + +VL53L1_ERROR VL53L1::VL53L1_RdByte(VL53L1_DEV Dev, uint16_t index, uint8_t *data) +{ + int status; + + status = VL53L1_I2CRead(Dev->i2c_slave_address, index, data, 1); + + if(status) + return -1; + + return 0; +} + +VL53L1_ERROR VL53L1::VL53L1_RdWord(VL53L1_DEV Dev, uint16_t index, uint16_t *data) +{ + int status; + uint8_t buffer[2] = {0,0}; + + status = VL53L1_I2CRead(Dev->i2c_slave_address, index, buffer, 2); + if (!status) + { + *data = (buffer[0] << 8) + buffer[1]; + } + // printf("VL53L1_RdWord %d %d %d \n",Dev->i2c_slave_address,index,status); + return status; + +} + +VL53L1_ERROR VL53L1::VL53L1_RdDWord(VL53L1_DEV Dev, uint16_t index, uint32_t *data) +{ + int status; + uint8_t buffer[4] = {0,0,0,0}; + + status = VL53L1_I2CRead(Dev->i2c_slave_address, index, buffer, 4); + if(!status) + { + *data = (buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3]; + } + return status; + +} + +VL53L1_ERROR VL53L1::VL53L1_UpdateByte(VL53L1_DEV Dev, uint16_t index, uint8_t AndData, uint8_t OrData) +{ + int status; + uint8_t buffer = 0; + + /* read data direct onto buffer */ + status = VL53L1_I2CRead(Dev->i2c_slave_address, index, &buffer,1); + if (!status) + { + buffer = (buffer & AndData) | OrData; + status = VL53L1_I2CWrite(Dev->i2c_slave_address, index, &buffer, (uint16_t)1); + } + return status; +} + +VL53L1_ERROR VL53L1::VL53L1_I2CWrite(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t* pBuffer, uint16_t NumByteToWrite) +{ + int ret; + ret = dev_i2c->ToF_i2c_write(pBuffer, DeviceAddr, RegisterAddr, NumByteToWrite); + if (ret) { + return -1; + } + return 0; + +} + +VL53L1_ERROR VL53L1::VL53L1_I2CRead(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t* pBuffer, uint16_t NumByteToRead) +{ + int ret; + + ret = dev_i2c->ToF_i2c_read(pBuffer, DeviceAddr, RegisterAddr, NumByteToRead); + //ret = dev_i2c->i2c_read(pBuffer, DeviceAddr, RegisterAddr, NumByteToRead); + if (ret) { + return -1; + } + return 0; +} + + +VL53L1_ERROR VL53L1::VL53L1_GetTickCount( + uint32_t *ptick_count_ms) +{ + + /* Returns current tick count in [ms] */ + + VL53L1_ERROR status = VL53L1_ERROR_NONE; + + //*ptick_count_ms = timeGetTime(); + *ptick_count_ms = us_ticker_read() / 1000; + + return status; +} + + + +VL53L1_ERROR VL53L1::VL53L1_WaitUs(VL53L1_Dev_t *pdev, int32_t wait_time) +{ + //(void)pdev; + wait_us(wait_time); + return VL53L1_ERROR_NONE; +} + + +VL53L1_ERROR VL53L1::VL53L1_WaitMs(VL53L1_Dev_t *pdev, int32_t wait_time) +{ + //(void)pdev; + +#if (MBED_VERSION > 60300) + thread_sleep_for(wait_time); +#else + wait_ms(wait_time); // NEEDS A DELAY BETWEEN SENSORS +#endif + return VL53L1_ERROR_NONE; +} + + +VL53L1_ERROR VL53L1::vl53L1_WaitValueMaskEx( + VL53L1_Dev_t *pdev, + uint32_t timeout_ms, + uint16_t index, + uint8_t value, + uint8_t mask, + uint32_t poll_delay_ms) +{ + + /* + * Platform implementation of WaitValueMaskEx V2WReg script command + * + * WaitValueMaskEx( + * duration_ms, + * index, + * value, + * mask, + * poll_delay_ms); + */ + + + return VL53L1_WaitValueMaskEx( pdev, timeout_ms,index, value, mask, poll_delay_ms); +} + + +/***************************************************************************/ +//VL53L1_ERROR VL53L1::VL53L1_WaitValueMaskEx( + +VL53L1_ERROR VL53L1::vl53L1_WaitDeviceBooted(VL53L1_DEV Dev) +{ + + return VL53L1_WaitDeviceBooted(Dev); +} + + +static int32_t BDTable[VL53L1_TUNING_MAX_TUNABLE_KEY] = { + TUNING_VERSION, + TUNING_PROXY_MIN, + TUNING_SINGLE_TARGET_XTALK_TARGET_DISTANCE_MM, + TUNING_SINGLE_TARGET_XTALK_SAMPLE_NUMBER, + TUNING_MIN_AMBIENT_DMAX_VALID, + TUNING_MAX_SIMPLE_OFFSET_CALIBRATION_SAMPLE_NUMBER, + TUNING_XTALK_FULL_ROI_TARGET_DISTANCE_MM, + TUNING_SIMPLE_OFFSET_CALIBRATION_REPEAT, + TUNING_XTALK_FULL_ROI_BIN_SUM_MARGIN, + TUNING_XTALK_FULL_ROI_DEFAULT_OFFSET, + TUNING_ZERO_DISTANCE_OFFSET_NON_LINEAR_FACTOR_DEFAULT, +}; + + +VL53L1_ERROR VL53L1::vl53L1_GetVersion(VL53L1_Version_t *pVersion) +{ + + return VL53L1_GetVersion(pVersion); +} + + +VL53L1_ERROR VL53L1::vl53L1_GetProductRevision( + uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor) +{ + return VL53L1_GetProductRevision(Device,pProductRevisionMajor,pProductRevisionMinor); +} + +//****************************************************************** + + +VL53L1_ERROR VL53L1::vl53L1_GetDeviceInfo( + VL53L1_DeviceInfo_t *pVL53L1_DeviceInfo) +{ + return VL53L1_GetDeviceInfo(Device,pVL53L1_DeviceInfo); +} + +VL53L1_ERROR VL53L1::vl53L1_GetUID( uint64_t *pUid) +{ + return VL53L1_GetUID(Device,pUid); +} + +VL53L1_ERROR VL53L1::vl53L1_GetRangeStatusString(uint8_t RangeStatus, + char *pRangeStatusString) +{ + return VL53L1_GetRangeStatusString(RangeStatus, + pRangeStatusString); +} + +VL53L1_ERROR VL53L1::vl53L1_GetPalErrorString(VL53L1_Error PalErrorCode, + char *pPalErrorString) +{ + return VL53L1_GetPalErrorString(PalErrorCode,pPalErrorString); +} + +VL53L1_ERROR VL53L1::vl53L1_GetPalStateString(VL53L1_State PalStateCode, + char *pPalStateString) +{ + return VL53L1_GetPalStateString(PalStateCode, pPalStateString); +} + +VL53L1_ERROR VL53L1::vl53L1_GetPalState(VL53L1_DEV Dev, VL53L1_State *pPalState) +{ + return VL53L1_GetPalState(Dev,pPalState); +} + + +VL53L1_ERROR VL53L1::VL53L1_SetDeviceAddress(VL53L1_DEV Dev, uint8_t DeviceAddress) +{ + VL53L1_Error Status = VL53L1_ERROR_NONE; + + // LOG_FUNCTION_START(""); + + Status = VL53L1_WrByte(Dev, VL53L1_I2C_SLAVE__DEVICE_ADDRESS, + DeviceAddress / 2); + +// LOG_FUNCTION_END(Status); + return Status; +} + +VL53L1_ERROR VL53L1::vl53L1_DataInit() +{ + printf("vl53L1_DataInit %d \n",Device->i2c_slave_address); + return VL53L1_DataInit( Device); +} + + +VL53L1_ERROR VL53L1::vl53L1_StaticInit() +{ + return VL53L1_StaticInit( Device); +} + + + VL53L1_ERROR VL53L1::vl53L1_SetPresetMode(VL53L1_PresetModes PresetMode) +{ + return VL53L1_SetPresetMode(Device,PresetMode); +} + + + VL53L1_ERROR VL53L1::vl53L1_GetPresetMode( VL53L1_PresetModes *pPresetMode) +{ + return VL53L1_GetPresetMode(Device,pPresetMode); +} + + + VL53L1_ERROR VL53L1::vl53L1_SetDistanceMode(VL53L1_DistanceModes DistanceMode) +{ + return VL53L1_SetDistanceMode(Device,DistanceMode); +} + +VL53L1_ERROR VL53L1::vl53L1_GetDistanceMode(VL53L1_DistanceModes *pDistanceMode) +{ + return VL53L1_GetDistanceMode(Device,pDistanceMode); +} + +VL53L1_ERROR VL53L1::vl53L1_SetOutputMode(VL53L1_OutputModes OutputMode) +{ + return VL53L1_SetOutputMode(Device,OutputMode); +} + +VL53L1_ERROR VL53L1::vl53L1_GetOutputMode(VL53L1_OutputModes *pOutputMode) +{ + return VL53L1_GetOutputMode(Device,pOutputMode); +} + + + +VL53L1_ERROR VL53L1::vl53L1_SetMeasurementTimingBudgetMicroSeconds( + uint32_t MeasurementTimingBudgetMicroSeconds) +{ + return VL53L1_SetMeasurementTimingBudgetMicroSeconds(Device, + MeasurementTimingBudgetMicroSeconds); +} + + +VL53L1_ERROR VL53L1::vl53L1_GetMeasurementTimingBudgetMicroSeconds( + uint32_t *pMeasurementTimingBudgetMicroSeconds) +{ + return VL53L1_GetMeasurementTimingBudgetMicroSeconds(Device, + pMeasurementTimingBudgetMicroSeconds); +} + + + +VL53L1_ERROR VL53L1::vl53L1_SetInterMeasurementPeriodMilliSeconds( + uint32_t InterMeasurementPeriodMilliSeconds) +{ + return VL53L1_SetInterMeasurementPeriodMilliSeconds(Device,InterMeasurementPeriodMilliSeconds); +} + +VL53L1_ERROR VL53L1::vl53L1_GetInterMeasurementPeriodMilliSeconds( + uint32_t *pInterMeasurementPeriodMilliSeconds) +{ + return VL53L1_GetInterMeasurementPeriodMilliSeconds(Device,pInterMeasurementPeriodMilliSeconds); +} + +VL53L1_ERROR VL53L1::vl53L1_SetDmaxReflectance(FixPoint1616_t DmaxReflectance) +{ + + return VL53L1_SetDmaxReflectance(Device,DmaxReflectance); +} + +VL53L1_ERROR VL53L1::vl53L1_GetDmaxReflectance( + FixPoint1616_t *pDmaxReflectance) +{ + return VL53L1_GetDmaxReflectance(Device,pDmaxReflectance); +} + + +VL53L1_ERROR VL53L1::vl53L1_SetDmaxMode(VL53L1_DeviceDmaxModes DmaxMode) +{ + return VL53L1_SetDmaxMode(Device,DmaxMode); +} + + +VL53L1_ERROR VL53L1::vl53L1_GetDmaxMode( + VL53L1_DeviceDmaxModes *pDmaxMode) +{ + return VL53L1_GetDmaxMode(Device,pDmaxMode); +} + + + +VL53L1_ERROR VL53L1::vl53L1_GetNumberOfLimitCheck(uint16_t *pNumberOfLimitCheck) +{ + VL53L1_Error Status = VL53L1_ERROR_NONE; + + // LOG_FUNCTION_START(""); + + *pNumberOfLimitCheck = VL53L1_CHECKENABLE_NUMBER_OF_CHECKS; + + // LOG_FUNCTION_END(Status); + return Status; +} + +VL53L1_ERROR VL53L1::vl53L1_GetLimitCheckInfo(uint16_t LimitCheckId, + char *pLimitCheckString) +{ + return VL53L1_GetLimitCheckInfo(LimitCheckId, + pLimitCheckString); + +} + +VL53L1_ERROR VL53L1::vl53L1_GetLimitCheckStatus(uint16_t LimitCheckId, + uint8_t *pLimitCheckStatus) +{ + return VL53L1_GetLimitCheckStatus(Device,LimitCheckId,pLimitCheckStatus); +} + + +VL53L1_ERROR VL53L1::vl53L1_SetLimitCheckEnable(uint16_t LimitCheckId, + uint8_t LimitCheckEnable) +{ + + return VL53L1_SetLimitCheckEnable(Device,LimitCheckId,LimitCheckEnable); +} + +VL53L1_ERROR VL53L1::vl53L1_GetLimitCheckEnable(uint16_t LimitCheckId, + uint8_t *pLimitCheckEnable) +{ + return VL53L1_GetLimitCheckEnable(Device,LimitCheckId,pLimitCheckEnable); +} + +VL53L1_ERROR VL53L1::vl53L1_SetLimitCheckValue( uint16_t LimitCheckId, + FixPoint1616_t LimitCheckValue) +{ + return VL53L1_SetLimitCheckValue(Device,LimitCheckId,LimitCheckValue); +} + +VL53L1_ERROR VL53L1::vl53L1_GetLimitCheckValue( uint16_t LimitCheckId, + FixPoint1616_t *pLimitCheckValue) +{ + return VL53L1_GetLimitCheckValue(Device,LimitCheckId,pLimitCheckValue); +} + +VL53L1_ERROR VL53L1::vl53L1_GetLimitCheckCurrent( uint16_t LimitCheckId, + FixPoint1616_t *pLimitCheckCurrent) +{ + return VL53L1_GetLimitCheckCurrent(Device,LimitCheckId,pLimitCheckCurrent); +} + + +VL53L1_ERROR VL53L1::vl53L1_GetMaxNumberOfROI( uint8_t *pMaxNumberOfROI) +{ + return VL53L1_GetMaxNumberOfROI(Device,pMaxNumberOfROI); +} + +VL53L1_ERROR VL53L1::vl53L1_SetROI( VL53L1_RoiConfig_t *pRoiConfig) +{ + + return VL53L1_SetROI(Device,pRoiConfig); +} + +VL53L1_ERROR VL53L1::vl53L1_GetROI(VL53L1_RoiConfig_t *pRoiConfig) +{ + return VL53L1_GetROI(Device,pRoiConfig); +} + + + + +VL53L1_ERROR VL53L1::vl53L1_GetNumberOfSequenceSteps(uint8_t *pNumberOfSequenceSteps) +{ + VL53L1_Error Status = VL53L1_ERROR_NONE; + + // SUPPRESS_UNUSED_WARNING(Dev); + + // LOG_FUNCTION_START(""); + + *pNumberOfSequenceSteps = VL53L1_SEQUENCESTEP_NUMBER_OF_ITEMS; + +// LOG_FUNCTION_END(Status); + return Status; +} + +VL53L1_ERROR VL53L1::vl53L1_GetSequenceStepsInfo(VL53L1_SequenceStepId SequenceStepId, + char *pSequenceStepsString) +{ + return VL53L1_GetSequenceStepsInfo(SequenceStepId,pSequenceStepsString); +} + +VL53L1_ERROR VL53L1::vl53L1_SetSequenceStepEnable(VL53L1_SequenceStepId SequenceStepId, + uint8_t SequenceStepEnabled) +{ + + return VL53L1_SetSequenceStepEnable(Device,SequenceStepId,SequenceStepEnabled); +} + + +VL53L1_ERROR VL53L1::vl53L1_GetSequenceStepEnable(VL53L1_SequenceStepId SequenceStepId, + uint8_t *pSequenceStepEnabled) +{ + return VL53L1_GetSequenceStepEnable(Device,SequenceStepId,pSequenceStepEnabled); +} + + + +VL53L1_ERROR VL53L1::vl53L1_StartMeasurement() +{ + return VL53L1_StartMeasurement(Device); +} + +VL53L1_ERROR VL53L1::vl53L1_StopMeasurement() +{ + return VL53L1_StopMeasurement(Device); +} + + +VL53L1_ERROR VL53L1::vl53L1_ClearInterruptAndStartMeasurement() +{ + + return VL53L1_ClearInterruptAndStartMeasurement(Device); +} + + +VL53L1_ERROR VL53L1::vl53L1_GetMeasurementDataReady(uint8_t *pMeasurementDataReady) +{ + return VL53L1_GetMeasurementDataReady(Device, pMeasurementDataReady); +} + +VL53L1_ERROR VL53L1::vl53L1_WaitMeasurementDataReady() +{ + return VL53L1_WaitMeasurementDataReady(Device); +} + + +//****************************************************************** + + + +VL53L1_ERROR VL53L1::vl53L1_GetCalibrationData( + VL53L1_CalibrationData_t *pCalibrationData) +{ + + VL53L1_Error Status = VL53L1_ERROR_NONE; + Status = VL53L1_GetCalibrationData(Device,pCalibrationData); + + return Status; +} + + +VL53L1_ERROR VL53L1::vl53L1_GetRangingMeasurementData( + VL53L1_RangingMeasurementData_t *pRangingMeasurementData) +{ +// printf(" VL53L1_GetRangingMeasurementData 000 \n"); + VL53L1_Error Status = VL53L1_ERROR_NONE; + Status = VL53L1_GetRangingMeasurementData(Device,pRangingMeasurementData); + + return Status; +} + + + + + +VL53L1_ERROR VL53L1::vl53L1_GetMultiRangingData( + VL53L1_MultiRangingData_t *pMultiRangingData) +{ + return VL53L1_GetMultiRangingData(Device,pMultiRangingData); +} + +VL53L1_ERROR VL53L1::vl53L1_GetAdditionalData( + VL53L1_AdditionalData_t *pAdditionalData) +{ + return VL53L1_GetAdditionalData(Device, pAdditionalData); +} + + + +VL53L1_ERROR VL53L1::vl53L1_SetTuningParameter( + uint16_t TuningParameterId, int32_t TuningParameterValue) +{ + return VL53L1_SetTuningParameter(Device,TuningParameterId,TuningParameterValue); +} + +VL53L1_ERROR VL53L1::vl53L1_GetTuningParameter( + uint16_t TuningParameterId, int32_t *pTuningParameterValue) +{ + + return VL53L1_GetTuningParameter(Device,TuningParameterId,pTuningParameterValue); +} + + +VL53L1_ERROR VL53L1::vl53L1_SetXTalkCompensationEnable( + uint8_t XTalkCompensationEnable) +{ + + return VL53L1_SetXTalkCompensationEnable(Device,XTalkCompensationEnable); +} + + +VL53L1_ERROR VL53L1::vl53L1_GetXTalkCompensationEnable( + uint8_t *pXTalkCompensationEnable) +{ + VL53L1_Error Status = VL53L1_ERROR_NONE; + + // LOG_FUNCTION_START(""); + + VL53L1_GetXTalkCompensationEnable( + Device, + pXTalkCompensationEnable); + + // LOG_FUNCTION_END(Status); + return Status; +} + + +VL53L1_ERROR VL53L1::vl53L1_PerformXTalkCalibration( + uint8_t CalibrationOption) +{ + + return VL53L1_PerformXTalkCalibration(Device,CalibrationOption); +} + +VL53L1_ERROR VL53L1::vl53L1_SetOffsetCalibrationMode( + VL53L1_OffsetCalibrationModes OffsetCalibrationMode) +{ + return VL53L1_SetOffsetCalibrationMode(Device,OffsetCalibrationMode); +} + +VL53L1_ERROR VL53L1::vl53L1_SetOffsetCorrectionMode( + VL53L1_OffsetCorrectionModes OffsetCorrectionMode) +{ + return VL53L1_SetOffsetCorrectionMode(Device,OffsetCorrectionMode); +} + +VL53L1_ERROR VL53L1::vl53L1_PerformOffsetCalibration( + int32_t CalDistanceMilliMeter, FixPoint1616_t CalReflectancePercent) +{ + return VL53L1_PerformOffsetCalibration(Device,CalDistanceMilliMeter,CalReflectancePercent); +} + +VL53L1_ERROR VL53L1::vl53L1_PerformOffsetSimpleCalibration( + int32_t CalDistanceMilliMeter) +{ + return VL53L1_PerformOffsetSimpleCalibration(Device,CalDistanceMilliMeter); +} + +VL53L1_ERROR VL53L1::vl53L1_PerformOffsetZeroDistanceCalibration() +{ + return VL53L1_PerformOffsetZeroDistanceCalibration(Device); +} + +VL53L1_ERROR VL53L1::vl53L1_SetCalibrationData( + VL53L1_CalibrationData_t *pCalibrationData) +{ + return VL53L1_SetCalibrationData(Device,pCalibrationData); +} + + +VL53L1_ERROR VL53L1::vl53L1_SetZoneCalibrationData( + VL53L1_ZoneCalibrationData_t *pZoneCalibrationData) +{ + return VL53L1_SetZoneCalibrationData(Device, pZoneCalibrationData); +} + +VL53L1_ERROR VL53L1::vl53L1_GetZoneCalibrationData( + VL53L1_ZoneCalibrationData_t *pZoneCalibrationData) +{ + return VL53L1_GetZoneCalibrationData(Device, pZoneCalibrationData); +} + +VL53L1_Error VL53L1::vl53L1_SmudgeCorrectionEnable( + VL53L1_SmudgeCorrectionModes Mode) + +{ + return VL53L1_SmudgeCorrectionEnable(Device, Mode); +} + +VL53L1_ERROR VL53L1::vl53L1_GetOpticalCenter( + FixPoint1616_t *pOpticalCenterX, + FixPoint1616_t *pOpticalCenterY) +{ + return VL53L1_GetOpticalCenter(Device,pOpticalCenterX,pOpticalCenterY); +} + + + + + + +VL53L1_ERROR VL53L1::vl53L1_SetThresholdConfig(VL53L1_DetectionConfig_t *pConfig) +{ + return VL53L1_SetThresholdConfig(Device,pConfig); +} + + +VL53L1_ERROR VL53L1::vl53L1_GetThresholdConfig(VL53L1_DetectionConfig_t *pConfig) +{ + return VL53L1_GetThresholdConfig(Device,pConfig); +} + + + + +VL53L1_ERROR VL53L1::vl53L1_PerformOffsetPerVcselCalibration(int32_t CalDistanceMilliMeter) +{ + return VL53L1_PerformOffsetPerVcselCalibration(Device,CalDistanceMilliMeter); +} + + + +// from vl53l1_api_debug.c + + +VL53L1_ERROR VL53L1::vl53L1_get_additional_data( + VL53L1_DEV Dev, + VL53L1_additional_data_t *pdata) +{ + return VL53L1_get_additional_data(Dev,pdata); +} + + + +int VL53L1::handle_irq(uint16_t *distance) +{ + int status; + status = get_measurement(distance); + enable_interrupt_measure_detection_irq(); + return status; +} + +int VL53L1::get_measurement(uint16_t *distance) +{ + int status = 0; + + status = VL53L1_GetDistance(distance); + status = VL53L1_ClearInterrupt(); + + return status; +} + +int VL53L1::start_measurement(void (*fptr)(void)) +{ + int status = 0; + + if (_gpio1Int == NULL) { + printf("GPIO1 Error\r\n"); + return 1; + } + + status = VL53L1_StopRanging(); // it is safer to do this while sensor is stopped + + if (status == 0) { + attach_interrupt_measure_detection_irq(fptr); + enable_interrupt_measure_detection_irq(); + } + + if (status == 0) { + status = VL53L1_StartRanging(); + } + + return status; +} + +int VL53L1::stop_measurement() +{ + int status = 0; + + if (status == 0) { + printf("Call of VL53L1_StopMeasurement\n"); + status = VL53L1_StopRanging(); + } + + if (status == 0) + status = VL53L1_ClearInterrupt(); + + return status; +} + +