x-cube-tof1/Drivers/BSP/Components/vl53l4cx/modules/vl53lx_api.h

703 lines
24 KiB
C

/**
******************************************************************************
* Copyright (c) 2020, STMicroelectronics - All Rights Reserved
*
* This software is licensed under terms that can be found in the LICENSE file
* in the root directory of this software component.
* If no LICENSE file comes with this software, it is provided AS-IS.
*
******************************************************************************
*/
#ifndef _VL53LX_API_H_
#define _VL53LX_API_H_
#include "vl53lx_api_core.h"
#include "vl53lx_preset_setup.h"
#ifdef __cplusplus
extern "C"
{
#endif
/** @defgroup VL53LX_group VL53LX Function Definition
* @brief VL53LX Function Definition
* @{
*/
/** @defgroup VL53LX_general_group VL53LX General Functions
* @brief General functions and definitions
* @{
*/
/**
* @brief Return the VL53LX driver Version
*
* @note This function doesn't access to the device
*
* @param pVersion Rer to current driver Version
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetVersion(VL53LX_Version_t *pVersion);
/**
* @brief Reads the Product Revision for a for given Device
* This function can be used to distinguish cut1.0 from cut1.1.
*
* @param Dev Device Handle
* @param pProductRevisionMajor Pointer to Product Revision Major
* for a given Device
* @param pProductRevisionMinor Pointer to Product Revision Minor
* for a given Device
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetProductRevision(VL53LX_DEV Dev,
uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor);
/**
* @brief Reads the Device information for given Device
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @param pVL53LX_DeviceInfo Pointer to current device info for a given
* Device
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetDeviceInfo(VL53LX_DEV Dev,
VL53LX_DeviceInfo_t *pVL53LX_DeviceInfo);
/**
* @brief Reads the Device unique identifier
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @param pUid Pointer to current device unique ID
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetUID(VL53LX_DEV Dev, uint64_t *pUid);
/** @} VL53LX_general_group */
/** @defgroup VL53LX_init_group VL53LX Init Functions
* @brief VL53LX Init Functions
* @{
*/
/**
* @brief Set new device address
*
* After completion the device will answer to the new address programmed.
* This function should be called when several devices are used in parallel
* before start programming the sensor.
* When a single device us used, there is no need to call this function.
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @param DeviceAddress The new Device address
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_SetDeviceAddress(VL53LX_DEV Dev,
uint8_t DeviceAddress);
/**
*
* @brief One time device initialization
*
* To be called after device has been powered on and booted
* see @a VL53LX_WaitDeviceBooted()
*
* @par Function Description
* When not used after a fresh device "power up", it may return
* @a #VL53LX_ERROR_CALIBRATION_WARNING meaning wrong calibration data
* may have been fetched from device that can result in ranging offset error\n
* If VL53LX_DataInit is called several times then the application must restore
* calibration calling @a VL53LX_SetOffsetCalibrationData()
* It implies application has gathered calibration data thanks to
* @a VL53LX_GetOffsetCalibrationData() after an initial calibration stage.
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_DataInit(VL53LX_DEV Dev);
/**
* @brief Wait for device booted after chip enable (hardware standby)
*
* @param Dev Device Handle
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*
*/
VL53LX_Error VL53LX_WaitDeviceBooted(VL53LX_DEV Dev);
/** @} VL53LX_init_group */
/** @defgroup VL53LX_parameters_group VL53LX Parameters Functions
* @brief Functions used to prepare and setup the device
* @{
*/
/**
* @brief Set the distance mode
* @par Function Description
* Set the distance mode to be used for the next ranging.<br>
* The modes Short, Medium and Long are used to optimize the ranging accuracy
* in a specific range of distance.<br> The user select one of these modes to
* select the distance range.
* @note This function doesn't Access to the device
*
* @warning This function should be called after @a VL53LX_DataInit().
* @param Dev Device Handle
* @param DistanceMode Distance mode to apply, valid values are:
* @li VL53LX_DISTANCEMODE_SHORT
* @li VL53LX_DISTANCEMODE_MEDIUM
* @li VL53LX_DISTANCEMODE_LONG
* @return VL53LX_ERROR_NONE Success
* @return VL53LX_ERROR_MODE_NOT_SUPPORTED This error occurs when DistanceMode
* is not in the supported list
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_SetDistanceMode(VL53LX_DEV Dev,
VL53LX_DistanceModes DistanceMode);
/**
* @brief Get the distance mode
* @par Function Description
* Get the distance mode used for the next ranging.
*
* @param Dev Device Handle
* @param *pDistanceMode Pointer to Distance mode
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetDistanceMode(VL53LX_DEV Dev,
VL53LX_DistanceModes *pDistanceMode);
/**
* @brief Set Ranging Timing Budget in microseconds
*
* @par Function Description
* Defines the maximum time allowed by the user to the device to run a
* full ranging sequence for the current mode (ranging, histogram, ASL ...)
*
* @param Dev Device Handle
* @param MeasurementTimingBudgetMicroSeconds Max measurement time in
* microseconds.
* @return VL53LX_ERROR_NONE Success
* @return VL53LX_ERROR_INVALID_PARAMS Error timing parameter not
* supported.
* The maximum accepted value for the
* computed timing budget is 10 seconds
* the minimum value depends on the preset
* mode selected.
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_SetMeasurementTimingBudgetMicroSeconds(
VL53LX_DEV Dev, uint32_t MeasurementTimingBudgetMicroSeconds);
/**
* @brief Get Ranging Timing Budget in microseconds
*
* @par Function Description
* Returns the programmed the maximum time allowed by the user to the
* device to run a full ranging sequence for the current mode
* (ranging, histogram, ...)
*
* @param Dev Device Handle
* @param pMeasurementTimingBudgetMicroSeconds Max measurement time in
* microseconds.
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetMeasurementTimingBudgetMicroSeconds(
VL53LX_DEV Dev, uint32_t *pMeasurementTimingBudgetMicroSeconds);
/** @} VL53LX_parameters_group */
/** @defgroup VL53LX_ROI_group VL53LX ROI Functions
* @brief Functions used to select ROIs
* @{
*/
/**
* @brief Set the ROI to be used for ranging
*
* @par Function Description
* The user defined ROI is a rectangle described as per the following system
* from the Top Left corner to the Bottom Right corner.
* <br>Minimal ROI size is 4x4 spads
* @image html roi_coord.png
*
* @param Dev Device Handle
* @param pUserROi Pointer to the Structure defining the ROI
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_SetUserROI(VL53LX_DEV Dev,
VL53LX_UserRoi_t *pUserROi);
/**
* @brief Get the ROI managed by the Device
*
* @par Function Description
* Get the ROI managed by the Device
*
* @param Dev Device Handle
* @param pUserROi Pointer to the Structure defining the ROI
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetUserROI(VL53LX_DEV Dev,
VL53LX_UserRoi_t *pUserROi);
/** @} VL53LX_ROI_group */
/** @defgroup VL53LX_measurement_group VL53LX Measurement Functions
* @brief Functions used for the measurements
* @{
*/
/**
* @brief Start device measurement
*
* @details Started measurement will depend on distance parameter set through
* @a VL53LX_SetDistanceMode()
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @return VL53LX_ERROR_NONE Success
* @return VL53LX_ERROR_TIME_OUT Time out on start measurement
* @return VL53LX_ERROR_INVALID_PARAMS This error might occur in timed mode
* when inter measurement period is smaller or too close to the timing budget.
* In such case measurements are not started and user must correct the timings
* passed to @a VL53LX_SetMeasurementTimingBudgetMicroSeconds() and
* @a VL53LX_SetInterMeasurementPeriodMilliSeconds() functions.
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_StartMeasurement(VL53LX_DEV Dev);
/**
* @brief Stop device measurement
*
* @details Will set the device in standby mode at end of current measurement\n
* Not necessary in single mode as device shall return automatically
* in standby mode at end of measurement.
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_StopMeasurement(VL53LX_DEV Dev);
/**
* @brief Clear the Interrupt flag and start new measurement
* *
* @note This function Access to the device
*
* @param Dev Device Handle
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_ClearInterruptAndStartMeasurement(VL53LX_DEV Dev);
/**
* @brief Return Measurement Data Ready
*
* @par Function Description
* This function indicate that a measurement data is ready.
* This function is used for non-blocking capture.
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @param pMeasurementDataReady Pointer to Measurement Data Ready.
* 0 = data not ready, 1 = data ready
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetMeasurementDataReady(VL53LX_DEV Dev,
uint8_t *pMeasurementDataReady);
/**
* @brief Wait for measurement data ready.
* Blocking function.
* Note that the timeout is given by:
* VL53LX_RANGE_COMPLETION_POLLING_TIMEOUT_MS defined in def.h
*
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @return VL53LX_ERROR_NONE Success
* @return VL53LX_ERROR_TIME_OUT In case of timeout
*/
VL53LX_Error VL53LX_WaitMeasurementDataReady(VL53LX_DEV Dev);
/**
* @brief Retrieve all measurements from device with the current setup
*
* @par Function Description
* Get data from last successful Ranging measurement
*
* @warning USER must call @a VL53LX_ClearInterruptAndStartMeasurement() prior
* to call again this function
*
* @note This function Access to the device
*
* @note The first valid value returned by this function will have a range
* status equal to VL53LX_RANGESTATUS_RANGE_VALID_NO_WRAP_CHECK which means that
* the data is valid but no wrap around check have been done. User should take
* care about that.
*
* @param Dev Device Handle
* @param pMultiRangingData Pointer to the data structure to fill up.
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetMultiRangingData(VL53LX_DEV Dev,
VL53LX_MultiRangingData_t *pMultiRangingData);
/**
* @brief Get Additional Data
*
* @par Function Description
* This function is used to get lld debugging data on the last histogram
* measurement. shall be called when a new measurement is ready (interrupt or
* positive VL53LX_GetMeasurementDataReady() polling) and before a call to
* VL53LX_ClearInterruptAndStartMeasurement().
*
* @param Dev Device Handle
* @param pAdditionalData Pointer to Additional data
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetAdditionalData(VL53LX_DEV Dev,
VL53LX_AdditionalData_t *pAdditionalData);
/** @} VL53LX_measurement_group */
/** @defgroup VL53LX_Calibration_group VL53LX Calibration Functions
* @brief Functions used for Calibration
* @{
*/
/**
* @brief Set Tuning Parameter value for a given parameter ID
*
* @par Function Description
* This function is used to improve the performance of the device. It permit to
* change a particular value used for a timeout or a threshold or a constant
* in an algorithm. The function will change the value of the parameter
* identified by an unique ID.
*
* @note This function doesn't Access to the device
*
* @param Dev Device Handle
* @param TuningParameterId Tuning Parameter ID
* @param TuningParameterValue Tuning Parameter Value
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_SetTuningParameter(VL53LX_DEV Dev,
uint16_t TuningParameterId, int32_t TuningParameterValue);
/**
* @brief Get Tuning Parameter value for a given parameter ID
*
* @par Function Description
* This function is used to get the value of the parameter
* identified by an unique ID.
*
* @note This function doesn't Access to the device
*
* @param Dev Device Handle
* @param TuningParameterId Tuning Parameter ID
* @param pTuningParameterValue Pointer to Tuning Parameter Value
* for a given TuningParameterId.
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetTuningParameter(VL53LX_DEV Dev,
uint16_t TuningParameterId, int32_t *pTuningParameterValue);
/**
* @brief Performs Reference Spad Management
*
* @par Function Description
* The reference SPAD initialization procedure determines the minimum amount
* of reference spads to be enables to achieve a target reference signal rate
* and should be performed once during initialization.
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_PerformRefSpadManagement(VL53LX_DEV Dev);
/**
* @brief Enable/Disable dynamic Xtalk compensation feature
*
* Enable/Disable dynamic Xtalk compensation (aka smudge correction).
*
* @param Dev Device Handle
* @param Mode Set the smudge correction mode
* See ::VL53LX_SmudgeCorrectionModes
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_SmudgeCorrectionEnable(VL53LX_DEV Dev,
VL53LX_SmudgeCorrectionModes Mode);
/**
* @brief Enable/Disable Cross talk compensation feature
*
* Enable/Disable Cross Talk correction.
*
* @param Dev Device Handle
* @param XTalkCompensationEnable Cross talk compensation
* to be set 0 = disabled or 1 = enabled.
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_SetXTalkCompensationEnable(VL53LX_DEV Dev,
uint8_t XTalkCompensationEnable);
/**
* @brief Get Cross talk compensation rate enable
*
* Get if the Cross Talk is Enabled or Disabled.
*
* @note This function doesn't access to the device
*
* @param Dev Device Handle
* @param pXTalkCompensationEnable Pointer to the Cross talk compensation
* state 0=disabled or 1 = enabled
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetXTalkCompensationEnable(VL53LX_DEV Dev,
uint8_t *pXTalkCompensationEnable);
/**
* @brief Perform XTalk Calibration
*
* @details Perform a XTalk calibration of the Device.
* This function will launch a measurement, if interrupts
* are enabled an interrupt will be done.
* This function will clear the interrupt generated automatically.
* This function will program a new value for the XTalk compensation
* and it will enable the cross talk before exit.
*
* @warning This function is a blocking function
*
* @note This function Access to the device
*
* @param Dev Device Handle
* the calibration sets appropriate
* distance mode and thus override existing one<br>
* The calibration uses a target which should be located at least @60cm from the
* device. The actual location of the target shall be passed
* through the bare driver tuning parameters table
*
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_PerformXTalkCalibration(VL53LX_DEV Dev);
/**
* @brief Define the mode to be used for the offset correction
*
* Define the mode to be used for the offset correction.
*
* @param Dev Device Handle
* @param OffsetCorrectionMode Offset Correction Mode valid values are:
* @li VL53LX_OFFSETCORRECTIONMODE_STANDARD
* @li VL53LX_OFFSETCORRECTIONMODE_PERVCSEL
*
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_SetOffsetCorrectionMode(VL53LX_DEV Dev,
VL53LX_OffsetCorrectionModes OffsetCorrectionMode);
/**
* @brief Perform Offset simple Calibration
*
* @details Perform a very simple offset calibration of the Device.
* This function will launch few ranging measurements and computes offset
* calibration. The preset mode and the distance mode MUST be set by the
* application before to call this function.
*
* @warning This function is a blocking function
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @param CalDistanceMilliMeter Calibration distance value used for the
* offset compensation.
*
* @return VL53LX_ERROR_NONE
* @return VL53LX_ERROR_OFFSET_CAL_NO_SAMPLE_FAIL the calibration failed by
* lack of valid measurements
* @return VL53LX_WARNING_OFFSET_CAL_SIGMA_TOO_HIGH means that the target
* distance combined to the number of loops performed in the calibration lead to
* an internal overflow. Try to reduce the distance of the target (140 mm)
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_PerformOffsetSimpleCalibration(VL53LX_DEV Dev,
int32_t CalDistanceMilliMeter);
/**
* @brief Perform Offset simple Calibration with a "zero distance" target
*
* @details Perform a simple offset calibration of the Device.
* This function will launch few ranging measurements and computes offset
* calibration. The preset mode and the distance mode MUST be set by the
* application before to call this function.
* A target must be place very close to the device.
* Ideally the target shall be touching the coverglass.
*
* @warning This function is a blocking function
*
* @note This function Access to the device
*
* @param Dev Device Handle
*
* @return VL53LX_ERROR_NONE
* @return VL53LX_ERROR_OFFSET_CAL_NO_SAMPLE_FAIL the calibration failed by
* lack of valid measurements
* @return VL53LX_WARNING_OFFSET_CAL_SIGMA_TOO_HIGH means that the target
* distance is too large, try to put the target closer to the device
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_PerformOffsetZeroDistanceCalibration(VL53LX_DEV Dev);
/**
* @brief Perform Offset per Vcsel Calibration. i.e. per distance mode
*
* @details Perform offset calibration of the Device depending on the
* three distance mode settings: short, medium and long.
* This function will launch few ranging measurements and computes offset
* calibration in each of the three distance modes.
* The preset mode MUST be set by the application before to call this function.
*
* @warning This function is a blocking function
*
* @note This function Access to the device
*
* @param Dev Device Handle
* @param CalDistanceMilliMeter Distance of the target used for the
* offset compensation calibration.
*
* @return VL53LX_ERROR_NONE
* @return VL53LX_ERROR_OFFSET_CAL_NO_SAMPLE_FAIL the calibration failed by
* lack of valid measurements
* @return VL53LX_WARNING_OFFSET_CAL_SIGMA_TOO_HIGH means that the target
* distance combined to the number of loops performed in the calibration lead to
* an internal overflow. Try to reduce the distance of the target (140 mm)
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_PerformOffsetPerVcselCalibration(VL53LX_DEV Dev,
int32_t CalDistanceMilliMeter);
/**
* @brief Sets the Calibration Data.
*
* @par Function Description
* This function set all the Calibration Data issued from the functions
* @a VL53LX_PerformRefSpadManagement(), @a VL53LX_PerformXTalkCalibration,
* @a VL53LX_PerformOffsetCalibration()
*
* @note This function doesn't Accesses the device
*
* @param Dev Device Handle
* @param *pCalibrationData Pointer to Calibration data to be set.
* @return VL53LX_ERROR_NONE Success
* @return VL53LX_ERROR_INVALID_PARAMS pCalibrationData points to an older
* version of the inner structure. Need for support to convert its content.
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_SetCalibrationData(VL53LX_DEV Dev,
VL53LX_CalibrationData_t *pCalibrationData);
/**
* @brief Gets the Calibration Data.
*
* @par Function Description
* This function get all the Calibration Data issued from the functions
* @a VL53LX_PerformRefSpadManagement(), @a VL53LX_PerformXTalkCalibration,
* @a VL53LX_PerformOffsetCalibration()
*
* @note This function doesn't Accesses the device
*
* @param Dev Device Handle
* @param *pCalibrationData pointer where to store Calibration
* data.
* @return VL53LX_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetCalibrationData(VL53LX_DEV Dev,
VL53LX_CalibrationData_t *pCalibrationData);
/**
* @brief Gets the optical center.
*
* @par Function Description
* This function get the optical center issued from the nvm set at FTM stage
* expressed in the same coordinate system as the ROI are
*
* @note This function doesn't Accesses the device
*
* @param Dev Device Handle
* @param pOpticalCenterX pointer to the X position of center
* in 16.16 fix point
* @param pOpticalCenterY pointer to the Y position of center
* in 16.16 fix point
* @return VL53L1_ERROR_NONE Success
* @return "Other error code" See ::VL53LX_Error
*/
VL53LX_Error VL53LX_GetOpticalCenter(VL53LX_DEV Dev,
FixPoint1616_t *pOpticalCenterX,
FixPoint1616_t *pOpticalCenterY);
/** @} VL53LX_Calibration_group */
/** @} VL53LX_group */
#ifdef __cplusplus
}
#endif
#endif /* _VL53LX_API_H_ */