ST Expansion SW Team / Vl6180

Dependencies:   VL6180_Board

Dependents:   X_NUCLEO_6180

Committer:
charlesmn
Date:
Tue Nov 10 10:15:46 2020 +0000
Revision:
2:bc1d979ae392
Parent:
VL6180INC/vl6180_class.h@0:1da5e4bcb8e5
Child:
3:b01812cb5250
Reformatted to look like VCL53L1 and VL53L3 libraries

Who changed what in which revision?

UserRevisionLine numberNew contents of line
charlesmn 0:1da5e4bcb8e5 1 /*******************************************************************************
charlesmn 0:1da5e4bcb8e5 2 * @file vl6180_class.h
charlesmn 0:1da5e4bcb8e5 3 * @author JS
charlesmn 0:1da5e4bcb8e5 4 * @version V0.0.1
charlesmn 0:1da5e4bcb8e5 5 * @date 15-January-2019
charlesmn 0:1da5e4bcb8e5 6 * @brief Header file for VL53L1 sensor component
charlesmn 0:1da5e4bcb8e5 7 ******************************************************************************
charlesmn 0:1da5e4bcb8e5 8 Copyright © 2019, STMicroelectronics International N.V.
charlesmn 0:1da5e4bcb8e5 9 All rights reserved.
charlesmn 0:1da5e4bcb8e5 10 Redistribution and use in source and binary forms, with or without
charlesmn 0:1da5e4bcb8e5 11 modification, are permitted provided that the following conditions are met:
charlesmn 0:1da5e4bcb8e5 12 * Redistributions of source code must retain the above copyright
charlesmn 0:1da5e4bcb8e5 13 notice, this list of conditions and the following disclaimer.
charlesmn 0:1da5e4bcb8e5 14 * Redistributions in binary form must reproduce the above copyright
charlesmn 0:1da5e4bcb8e5 15 notice, this list of conditions and the following disclaimer in the
charlesmn 0:1da5e4bcb8e5 16 documentation and/or other materials provided with the distribution.
charlesmn 0:1da5e4bcb8e5 17 * Neither the name of STMicroelectronics nor the
charlesmn 0:1da5e4bcb8e5 18 names of its contributors may be used to endorse or promote products
charlesmn 0:1da5e4bcb8e5 19 derived from this software without specific prior written permission.
charlesmn 0:1da5e4bcb8e5 20 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
charlesmn 0:1da5e4bcb8e5 21 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
charlesmn 0:1da5e4bcb8e5 22 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
charlesmn 0:1da5e4bcb8e5 23 NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED.
charlesmn 0:1da5e4bcb8e5 24 IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY
charlesmn 0:1da5e4bcb8e5 25 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
charlesmn 0:1da5e4bcb8e5 26 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
charlesmn 0:1da5e4bcb8e5 27 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
charlesmn 0:1da5e4bcb8e5 28 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
charlesmn 0:1da5e4bcb8e5 29 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
charlesmn 0:1da5e4bcb8e5 30 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
charlesmn 0:1da5e4bcb8e5 31 *****************************************************************************/
charlesmn 0:1da5e4bcb8e5 32
charlesmn 0:1da5e4bcb8e5 33 #ifndef __VL6180_CLASS_H
charlesmn 0:1da5e4bcb8e5 34 #define __VL6180_CLASS_H
charlesmn 0:1da5e4bcb8e5 35
charlesmn 0:1da5e4bcb8e5 36
charlesmn 0:1da5e4bcb8e5 37 /* Includes ------------------------------------------------------------------*/
charlesmn 0:1da5e4bcb8e5 38
charlesmn 0:1da5e4bcb8e5 39 #include "mbed.h"
charlesmn 0:1da5e4bcb8e5 40 #include "PinNames.h"
charlesmn 0:1da5e4bcb8e5 41 #include "RangeSensor.h"
charlesmn 0:1da5e4bcb8e5 42 #include "vl6180_I2c.h"
charlesmn 0:1da5e4bcb8e5 43 #include "Stmpe1600.h"
charlesmn 0:1da5e4bcb8e5 44 #include "vl6180_platform.h"
charlesmn 0:1da5e4bcb8e5 45 /**********************************************************/
charlesmn 0:1da5e4bcb8e5 46
charlesmn 0:1da5e4bcb8e5 47 #define VL53L1X_IMPLEMENTATION_VER_MAJOR 1
charlesmn 0:1da5e4bcb8e5 48 #define VL53L1X_IMPLEMENTATION_VER_MINOR 0
charlesmn 0:1da5e4bcb8e5 49 #define VL53L1X_IMPLEMENTATION_VER_SUB 1
charlesmn 0:1da5e4bcb8e5 50 #define VL53L1X_IMPLEMENTATION_VER_REVISION 0000
charlesmn 0:1da5e4bcb8e5 51
charlesmn 0:1da5e4bcb8e5 52 typedef int8_t VL6180_ERROR;
charlesmn 0:1da5e4bcb8e5 53 typedef int8_t VL6180_ERROR;
charlesmn 0:1da5e4bcb8e5 54
charlesmn 0:1da5e4bcb8e5 55 //#define SOFT_RESET 0x0000
charlesmn 0:1da5e4bcb8e5 56 #define VL53L1_I2C_SLAVE__DEVICE_ADDRESS 0x0001
charlesmn 0:1da5e4bcb8e5 57 #define VL53L1_VHV_CONFIG__TIMEOUT_MACROP_LOOP_BOUND 0x0008
charlesmn 0:1da5e4bcb8e5 58 #define ALGO__CROSSTALK_COMPENSATION_PLANE_OFFSET_KCPS 0x0016
charlesmn 0:1da5e4bcb8e5 59 #define ALGO__CROSSTALK_COMPENSATION_X_PLANE_GRADIENT_KCPS 0x0018
charlesmn 0:1da5e4bcb8e5 60 #define ALGO__CROSSTALK_COMPENSATION_Y_PLANE_GRADIENT_KCPS 0x001A
charlesmn 0:1da5e4bcb8e5 61 #define ALGO__PART_TO_PART_RANGE_OFFSET_MM 0x001E
charlesmn 0:1da5e4bcb8e5 62 #define MM_CONFIG__INNER_OFFSET_MM 0x0020
charlesmn 0:1da5e4bcb8e5 63 #define MM_CONFIG__OUTER_OFFSET_MM 0x0022
charlesmn 0:1da5e4bcb8e5 64 #define GPIO_HV_MUX__CTRL 0x0030
charlesmn 0:1da5e4bcb8e5 65 #define GPIO__TIO_HV_STATUS 0x0031
charlesmn 0:1da5e4bcb8e5 66 #define SYSTEM__INTERRUPT_CONFIG_GPIO 0x0046
charlesmn 0:1da5e4bcb8e5 67 #define PHASECAL_CONFIG__TIMEOUT_MACROP 0x004B
charlesmn 0:1da5e4bcb8e5 68 #define RANGE_CONFIG__TIMEOUT_MACROP_A_HI 0x005E
charlesmn 0:1da5e4bcb8e5 69 #define RANGE_CONFIG__VCSEL_PERIOD_A 0x0060
charlesmn 0:1da5e4bcb8e5 70 #define RANGE_CONFIG__VCSEL_PERIOD_B 0x0063
charlesmn 0:1da5e4bcb8e5 71 #define RANGE_CONFIG__TIMEOUT_MACROP_B_HI 0x0061
charlesmn 0:1da5e4bcb8e5 72 #define RANGE_CONFIG__TIMEOUT_MACROP_B_LO 0x0062
charlesmn 0:1da5e4bcb8e5 73 #define RANGE_CONFIG__SIGMA_THRESH 0x0064
charlesmn 0:1da5e4bcb8e5 74 #define RANGE_CONFIG__MIN_COUNT_RATE_RTN_LIMIT_MCPS 0x0066
charlesmn 0:1da5e4bcb8e5 75 #define RANGE_CONFIG__VALID_PHASE_HIGH 0x0069
charlesmn 0:1da5e4bcb8e5 76 #define VL53L1_SYSTEM__INTERMEASUREMENT_PERIOD 0x006C
charlesmn 0:1da5e4bcb8e5 77 #define SYSTEM__THRESH_HIGH 0x0072
charlesmn 0:1da5e4bcb8e5 78 #define SYSTEM__THRESH_LOW 0x0074
charlesmn 0:1da5e4bcb8e5 79 #define SD_CONFIG__WOI_SD0 0x0078
charlesmn 0:1da5e4bcb8e5 80 #define SD_CONFIG__INITIAL_PHASE_SD0 0x007A
charlesmn 0:1da5e4bcb8e5 81 #define ROI_CONFIG__USER_ROI_CENTRE_SPAD 0x007F
charlesmn 0:1da5e4bcb8e5 82 #define ROI_CONFIG__USER_ROI_REQUESTED_GLOBAL_XY_SIZE 0x0080
charlesmn 0:1da5e4bcb8e5 83 #define SYSTEM__SEQUENCE_CONFIG 0x0081
charlesmn 0:1da5e4bcb8e5 84 #define VL53L1_SYSTEM__GROUPED_PARAMETER_HOLD 0x0082
charlesmn 0:1da5e4bcb8e5 85 #define SYSTEM__INTERRUPT_CLEAR 0x0086
charlesmn 0:1da5e4bcb8e5 86 #define SYSTEM__MODE_START 0x0087
charlesmn 0:1da5e4bcb8e5 87 #define VL53L1_RESULT__RANGE_STATUS 0x0089
charlesmn 0:1da5e4bcb8e5 88 #define VL53L1_RESULT__DSS_ACTUAL_EFFECTIVE_SPADS_SD0 0x008C
charlesmn 0:1da5e4bcb8e5 89 #define RESULT__AMBIENT_COUNT_RATE_MCPS_SD 0x0090
charlesmn 0:1da5e4bcb8e5 90 #define VL53L1_RESULT__FINAL_CROSSTALK_CORRECTED_RANGE_MM_SD0 0x0096
charlesmn 0:1da5e4bcb8e5 91 #define VL53L1_RESULT__PEAK_SIGNAL_COUNT_RATE_CROSSTALK_CORRECTED_MCPS_SD0 0x0098
charlesmn 0:1da5e4bcb8e5 92 #define VL53L1_RESULT__OSC_CALIBRATE_VAL 0x00DE
charlesmn 0:1da5e4bcb8e5 93 #define VL53L1_FIRMWARE__SYSTEM_STATUS 0x00E5
charlesmn 0:1da5e4bcb8e5 94 #define VL53L1_IDENTIFICATION__MODEL_ID 0x010F
charlesmn 0:1da5e4bcb8e5 95 #define VL53L1_ROI_CONFIG__MODE_ROI_CENTRE_SPAD 0x013E
charlesmn 0:1da5e4bcb8e5 96
charlesmn 0:1da5e4bcb8e5 97
charlesmn 0:1da5e4bcb8e5 98 #define VL53L1X_DEFAULT_DEVICE_ADDRESS 0x52
charlesmn 0:1da5e4bcb8e5 99
charlesmn 0:1da5e4bcb8e5 100 #define VL53L1X_REG_IDENTIFICATION_MODEL_ID 0x010F
charlesmn 0:1da5e4bcb8e5 101
charlesmn 0:1da5e4bcb8e5 102
charlesmn 0:1da5e4bcb8e5 103 /****************************************
charlesmn 0:1da5e4bcb8e5 104 * PRIVATE define do not edit
charlesmn 0:1da5e4bcb8e5 105 ****************************************/
charlesmn 0:1da5e4bcb8e5 106
charlesmn 0:1da5e4bcb8e5 107 /**
charlesmn 0:1da5e4bcb8e5 108 * @brief defines SW Version
charlesmn 0:1da5e4bcb8e5 109 */
charlesmn 0:1da5e4bcb8e5 110
charlesmn 0:1da5e4bcb8e5 111 typedef struct {
charlesmn 0:1da5e4bcb8e5 112 uint8_t major; /*!< major number */
charlesmn 0:1da5e4bcb8e5 113 uint8_t minor; /*!< minor number */
charlesmn 0:1da5e4bcb8e5 114 uint8_t build; /*!< build number */
charlesmn 0:1da5e4bcb8e5 115 uint32_t revision; /*!< revision number */
charlesmn 0:1da5e4bcb8e5 116 } VL6180_Version_t;
charlesmn 0:1da5e4bcb8e5 117
charlesmn 0:1da5e4bcb8e5 118
charlesmn 0:1da5e4bcb8e5 119 /*
charlesmn 0:1da5e4bcb8e5 120 typedef struct {
charlesmn 0:1da5e4bcb8e5 121
charlesmn 0:1da5e4bcb8e5 122
charlesmn 0:1da5e4bcb8e5 123 // VL53L1_DevData_t Data;
charlesmn 0:1da5e4bcb8e5 124
charlesmn 0:1da5e4bcb8e5 125
charlesmn 0:1da5e4bcb8e5 126 // uint8_t i2c_slave_address;
charlesmn 0:1da5e4bcb8e5 127 uint8_t I2cDevAddr;
charlesmn 0:1da5e4bcb8e5 128
charlesmn 0:1da5e4bcb8e5 129 uint8_t comms_type;
charlesmn 0:1da5e4bcb8e5 130
charlesmn 0:1da5e4bcb8e5 131 uint16_t comms_speed_khz;
charlesmn 0:1da5e4bcb8e5 132
charlesmn 0:1da5e4bcb8e5 133
charlesmn 0:1da5e4bcb8e5 134 uint32_t new_data_ready_poll_duration_ms;
charlesmn 0:1da5e4bcb8e5 135 // I2C_HandleTypeDef *I2cHandle;
charlesmn 0:1da5e4bcb8e5 136
charlesmn 0:1da5e4bcb8e5 137 } VL53L1_Dev_t;
charlesmn 0:1da5e4bcb8e5 138 */
charlesmn 0:1da5e4bcb8e5 139
charlesmn 0:1da5e4bcb8e5 140
charlesmn 0:1da5e4bcb8e5 141
charlesmn 0:1da5e4bcb8e5 142 //typedef VL53L1_Dev_t *VL53L1_DEV;
charlesmn 0:1da5e4bcb8e5 143
charlesmn 0:1da5e4bcb8e5 144
charlesmn 0:1da5e4bcb8e5 145 /* Classes -------------------------------------------------------------------*/
charlesmn 0:1da5e4bcb8e5 146 /** Class representing a VL6180 sensor component
charlesmn 0:1da5e4bcb8e5 147 */
charlesmn 0:1da5e4bcb8e5 148 class VL6180 : public RangeSensor
charlesmn 0:1da5e4bcb8e5 149 {
charlesmn 0:1da5e4bcb8e5 150
charlesmn 0:1da5e4bcb8e5 151
charlesmn 0:1da5e4bcb8e5 152
charlesmn 0:1da5e4bcb8e5 153 public:
charlesmn 0:1da5e4bcb8e5 154
charlesmn 0:1da5e4bcb8e5 155 #define VL6180_RangeClearInterrupt(dev) VL6180_ClearInterrupt(dev, INTERRUPT_CLEAR_RANGING)
charlesmn 0:1da5e4bcb8e5 156 #define VL53L1DevStructGetLLDriverHandle(Dev) (&Dev->Data.LLData)
charlesmn 0:1da5e4bcb8e5 157 /** Constructor
charlesmn 0:1da5e4bcb8e5 158 * @param[in] &i2c device I2C to be used for communication
charlesmn 0:1da5e4bcb8e5 159 * @param[in] &pin_gpio1 pin Mbed InterruptIn PinName to be used as component GPIO_1 INT
charlesmn 0:1da5e4bcb8e5 160 * @param[in] DevAddr device address, 0x52 by default
charlesmn 0:1da5e4bcb8e5 161 */
charlesmn 0:1da5e4bcb8e5 162 VL6180(vl6180_DevI2C *i2c, DigitalOut *pin, PinName pin_gpio1, uint8_t dev_addr = VL53L1X_DEFAULT_DEVICE_ADDRESS)
charlesmn 0:1da5e4bcb8e5 163 : RangeSensor(), dev_i2c(i2c), _gpio0(pin)
charlesmn 0:1da5e4bcb8e5 164 {
charlesmn 0:1da5e4bcb8e5 165 MyDevice->i2c_addr=dev_addr;
charlesmn 0:1da5e4bcb8e5 166 // Device = &MyDevice;
charlesmn 0:1da5e4bcb8e5 167
charlesmn 0:1da5e4bcb8e5 168 _expgpio0 = NULL;
charlesmn 0:1da5e4bcb8e5 169 if (pin_gpio1 != NC) {
charlesmn 0:1da5e4bcb8e5 170 _gpio1Int = new InterruptIn(pin_gpio1);
charlesmn 0:1da5e4bcb8e5 171 } else {
charlesmn 0:1da5e4bcb8e5 172 _gpio1Int = NULL;
charlesmn 0:1da5e4bcb8e5 173 }
charlesmn 0:1da5e4bcb8e5 174 }
charlesmn 0:1da5e4bcb8e5 175
charlesmn 0:1da5e4bcb8e5 176 /** Constructor 2 (STMPE1600DigiOut)
charlesmn 0:1da5e4bcb8e5 177 * @param[in] i2c device I2C to be used for communication
charlesmn 0:1da5e4bcb8e5 178 * @param[in] &pin Gpio Expander STMPE1600DigiOut pin to be used as component GPIO_0 CE
charlesmn 0:1da5e4bcb8e5 179 * @param[in] pin_gpio1 pin Mbed InterruptIn PinName to be used as component GPIO_1 INT
charlesmn 0:1da5e4bcb8e5 180 * @param[in] device address, 0x29 by default
charlesmn 0:1da5e4bcb8e5 181 */
charlesmn 0:1da5e4bcb8e5 182 VL6180(vl6180_DevI2C *i2c, Stmpe1600DigiOut *pin, PinName pin_gpio1,
charlesmn 0:1da5e4bcb8e5 183 uint8_t dev_addr = VL53L1X_DEFAULT_DEVICE_ADDRESS)
charlesmn 0:1da5e4bcb8e5 184 : dev_i2c(i2c), _expgpio0(pin)
charlesmn 0:1da5e4bcb8e5 185 {
charlesmn 0:1da5e4bcb8e5 186 // MyDevice.I2cDevAddr=dev_addr;
charlesmn 0:1da5e4bcb8e5 187 // Device = &MyDevice;
charlesmn 0:1da5e4bcb8e5 188
charlesmn 0:1da5e4bcb8e5 189 _gpio0 = NULL;
charlesmn 0:1da5e4bcb8e5 190 if (pin_gpio1 != NC) {
charlesmn 0:1da5e4bcb8e5 191 _gpio1Int = new InterruptIn(pin_gpio1);
charlesmn 0:1da5e4bcb8e5 192 } else {
charlesmn 0:1da5e4bcb8e5 193 _gpio1Int = NULL;
charlesmn 0:1da5e4bcb8e5 194 }
charlesmn 0:1da5e4bcb8e5 195 }
charlesmn 0:1da5e4bcb8e5 196
charlesmn 0:1da5e4bcb8e5 197 /** Destructor
charlesmn 0:1da5e4bcb8e5 198 */
charlesmn 0:1da5e4bcb8e5 199 virtual ~VL6180()
charlesmn 0:1da5e4bcb8e5 200 {
charlesmn 0:1da5e4bcb8e5 201 if (_gpio1Int != NULL) {
charlesmn 0:1da5e4bcb8e5 202 delete _gpio1Int;
charlesmn 0:1da5e4bcb8e5 203 }
charlesmn 0:1da5e4bcb8e5 204 }
charlesmn 0:1da5e4bcb8e5 205
charlesmn 0:1da5e4bcb8e5 206
charlesmn 0:1da5e4bcb8e5 207
charlesmn 0:1da5e4bcb8e5 208 MyVL6180Dev_t getDevicePtr() { return Device; }
charlesmn 0:1da5e4bcb8e5 209
charlesmn 0:1da5e4bcb8e5 210
charlesmn 0:1da5e4bcb8e5 211 /* warning: VL53L1 class inherits from GenericSensor, RangeSensor and LightSensor, that haven`t a destructor.
charlesmn 0:1da5e4bcb8e5 212 The warning should request to introduce a virtual destructor to make sure to delete the object */
charlesmn 0:1da5e4bcb8e5 213
charlesmn 0:1da5e4bcb8e5 214 /*** Interface Methods ***/
charlesmn 0:1da5e4bcb8e5 215 /*** High level API ***/
charlesmn 0:1da5e4bcb8e5 216 /**
charlesmn 0:1da5e4bcb8e5 217 * @brief PowerOn the sensor
charlesmn 0:1da5e4bcb8e5 218 * @return void
charlesmn 0:1da5e4bcb8e5 219 */
charlesmn 0:1da5e4bcb8e5 220 /* turns on the sensor */
charlesmn 0:1da5e4bcb8e5 221 virtual void VL53L1_On(void)
charlesmn 0:1da5e4bcb8e5 222 {
charlesmn 0:1da5e4bcb8e5 223 printf("VL53L1_On\r\n");
charlesmn 0:1da5e4bcb8e5 224 if (_gpio0) {
charlesmn 0:1da5e4bcb8e5 225 *_gpio0 = 1;
charlesmn 0:1da5e4bcb8e5 226 } else {
charlesmn 0:1da5e4bcb8e5 227 if (_expgpio0) {
charlesmn 0:1da5e4bcb8e5 228 *_expgpio0 = 1;
charlesmn 0:1da5e4bcb8e5 229 }
charlesmn 0:1da5e4bcb8e5 230 }
charlesmn 0:1da5e4bcb8e5 231 wait_ms(10);
charlesmn 0:1da5e4bcb8e5 232 }
charlesmn 0:1da5e4bcb8e5 233
charlesmn 0:1da5e4bcb8e5 234 /**
charlesmn 0:1da5e4bcb8e5 235 * @brief PowerOff the sensor
charlesmn 0:1da5e4bcb8e5 236 * @return void
charlesmn 0:1da5e4bcb8e5 237 */
charlesmn 0:1da5e4bcb8e5 238 /* turns off the sensor */
charlesmn 0:1da5e4bcb8e5 239 virtual void VL53L1_Off(void)
charlesmn 0:1da5e4bcb8e5 240 {
charlesmn 0:1da5e4bcb8e5 241 printf("VL53L1_Off\r\n");
charlesmn 0:1da5e4bcb8e5 242 if (_gpio0) {
charlesmn 0:1da5e4bcb8e5 243 *_gpio0 = 0;
charlesmn 0:1da5e4bcb8e5 244 } else {
charlesmn 0:1da5e4bcb8e5 245 if (_expgpio0) {
charlesmn 0:1da5e4bcb8e5 246 *_expgpio0 = 0;
charlesmn 0:1da5e4bcb8e5 247 }
charlesmn 0:1da5e4bcb8e5 248 }
charlesmn 0:1da5e4bcb8e5 249 wait_ms(10);
charlesmn 0:1da5e4bcb8e5 250 }
charlesmn 0:1da5e4bcb8e5 251
charlesmn 0:1da5e4bcb8e5 252 int is_present()
charlesmn 0:1da5e4bcb8e5 253 {
charlesmn 0:1da5e4bcb8e5 254 int status;
charlesmn 0:1da5e4bcb8e5 255 uint8_t id = 0;
charlesmn 0:1da5e4bcb8e5 256
charlesmn 0:1da5e4bcb8e5 257 status = read_id(&id);
charlesmn 0:1da5e4bcb8e5 258 if (status) {
charlesmn 0:1da5e4bcb8e5 259 printf("Failed to read ID device. Device not present!\n\r");
charlesmn 0:1da5e4bcb8e5 260 }
charlesmn 0:1da5e4bcb8e5 261 return status;
charlesmn 0:1da5e4bcb8e5 262 }
charlesmn 0:1da5e4bcb8e5 263
charlesmn 0:1da5e4bcb8e5 264 /**
charlesmn 0:1da5e4bcb8e5 265 * @brief Initialize the sensor with default values
charlesmn 0:1da5e4bcb8e5 266 * @return 0 on Success
charlesmn 0:1da5e4bcb8e5 267 */
charlesmn 0:1da5e4bcb8e5 268
charlesmn 0:1da5e4bcb8e5 269 VL6180_ERROR InitSensor(uint8_t address){
charlesmn 0:1da5e4bcb8e5 270 VL6180_ERROR status = 0;
charlesmn 0:1da5e4bcb8e5 271 VL53L1_Off();
charlesmn 0:1da5e4bcb8e5 272 VL53L1_On();
charlesmn 0:1da5e4bcb8e5 273 status = vl6180_SetI2CAddress(address);
charlesmn 0:1da5e4bcb8e5 274 printf("vl6180_SetI2CAddress %d %d \n",address,status);
charlesmn 0:1da5e4bcb8e5 275
charlesmn 0:1da5e4bcb8e5 276 wait_ms(20); // cgm todo fix
charlesmn 0:1da5e4bcb8e5 277 return status;
charlesmn 0:1da5e4bcb8e5 278 }
charlesmn 0:1da5e4bcb8e5 279
charlesmn 0:1da5e4bcb8e5 280
charlesmn 0:1da5e4bcb8e5 281
charlesmn 0:1da5e4bcb8e5 282 /**
charlesmn 0:1da5e4bcb8e5 283 *
charlesmn 0:1da5e4bcb8e5 284 * @brief One time device initialization
charlesmn 0:1da5e4bcb8e5 285 * @param void
charlesmn 0:1da5e4bcb8e5 286 * @return 0 on success, @a #CALIBRATION_WARNING if failed
charlesmn 0:1da5e4bcb8e5 287 */
charlesmn 0:1da5e4bcb8e5 288 virtual int init(void *init)
charlesmn 0:1da5e4bcb8e5 289 {
charlesmn 0:1da5e4bcb8e5 290 printf("init called no function \n");
charlesmn 0:1da5e4bcb8e5 291 return 0;
charlesmn 0:1da5e4bcb8e5 292 // return vl6180_SensorInit();
charlesmn 0:1da5e4bcb8e5 293 }
charlesmn 0:1da5e4bcb8e5 294
charlesmn 0:1da5e4bcb8e5 295
charlesmn 0:1da5e4bcb8e5 296 /**
charlesmn 0:1da5e4bcb8e5 297 * @brief Initialize the sensor with default values
charlesmn 0:1da5e4bcb8e5 298 * @return "0" on success
charlesmn 0:1da5e4bcb8e5 299 */
charlesmn 0:1da5e4bcb8e5 300 int init_sensor(uint8_t new_addr);
charlesmn 0:1da5e4bcb8e5 301
charlesmn 0:1da5e4bcb8e5 302 /* Read function of the ID device */
charlesmn 0:1da5e4bcb8e5 303 virtual int read_id(uint8_t *id){
charlesmn 0:1da5e4bcb8e5 304 int status = 0;
charlesmn 0:1da5e4bcb8e5 305 uint16_t rl_id = 0;
charlesmn 0:1da5e4bcb8e5 306
charlesmn 0:1da5e4bcb8e5 307 uint8_t ExpanderData[2];
charlesmn 0:1da5e4bcb8e5 308
charlesmn 0:1da5e4bcb8e5 309 ExpanderData[0] = 0;
charlesmn 0:1da5e4bcb8e5 310 ExpanderData[1] = 0;
charlesmn 0:1da5e4bcb8e5 311 rl_id = 0;
charlesmn 0:1da5e4bcb8e5 312 dev_i2c->vl6180_i2c_read(&ExpanderData[0], Device.i2c_addr, IDENTIFICATION_MODEL_ID, 2); // cgm is IDENTIFICATION_MODEL_ID correct
charlesmn 0:1da5e4bcb8e5 313
charlesmn 0:1da5e4bcb8e5 314 rl_id = (ExpanderData[0] << 8) + ExpanderData[1];
charlesmn 0:1da5e4bcb8e5 315 printf("Model ID is: %d (%X) \r\n",rl_id, rl_id);
charlesmn 0:1da5e4bcb8e5 316
charlesmn 0:1da5e4bcb8e5 317 uint8_t tmp = 0;
charlesmn 0:1da5e4bcb8e5 318 ExpanderData[0] = VL53L1_FIRMWARE__SYSTEM_STATUS >> 8;
charlesmn 0:1da5e4bcb8e5 319 ExpanderData[1] = VL53L1_FIRMWARE__SYSTEM_STATUS & 0x0FF;
charlesmn 0:1da5e4bcb8e5 320 dev_i2c->vl6180_i2c_read(&tmp, Device.i2c_addr, VL53L1_FIRMWARE__SYSTEM_STATUS, 1);
charlesmn 0:1da5e4bcb8e5 321
charlesmn 0:1da5e4bcb8e5 322 printf("Firmware system is: %d\r\n",tmp);
charlesmn 0:1da5e4bcb8e5 323
charlesmn 0:1da5e4bcb8e5 324 if (rl_id == 0xEACC) {
charlesmn 0:1da5e4bcb8e5 325 printf("Device is present %d:\r\n", rl_id);
charlesmn 0:1da5e4bcb8e5 326 return status;
charlesmn 0:1da5e4bcb8e5 327 }
charlesmn 0:1da5e4bcb8e5 328 return -1;
charlesmn 0:1da5e4bcb8e5 329 }
charlesmn 0:1da5e4bcb8e5 330
charlesmn 0:1da5e4bcb8e5 331
charlesmn 0:1da5e4bcb8e5 332
charlesmn 0:1da5e4bcb8e5 333 /**
charlesmn 0:1da5e4bcb8e5 334 * @brief Get ranging result and only that
charlesmn 0:1da5e4bcb8e5 335 * @param pRange_mm Pointer to range distance
charlesmn 0:1da5e4bcb8e5 336 * @return 0 on success
charlesmn 0:1da5e4bcb8e5 337 */
charlesmn 0:1da5e4bcb8e5 338 virtual int get_distance(uint32_t *piData)
charlesmn 0:1da5e4bcb8e5 339 {
charlesmn 0:1da5e4bcb8e5 340 int status;
charlesmn 0:1da5e4bcb8e5 341 uint16_t distance;
charlesmn 0:1da5e4bcb8e5 342 // status = vl6180_GetDistance(&distance); //todo cgm does not exist
charlesmn 0:1da5e4bcb8e5 343 *piData = (uint32_t) distance;
charlesmn 0:1da5e4bcb8e5 344 return status;
charlesmn 0:1da5e4bcb8e5 345 }
charlesmn 0:1da5e4bcb8e5 346
charlesmn 0:1da5e4bcb8e5 347
charlesmn 0:1da5e4bcb8e5 348 /**
charlesmn 0:1da5e4bcb8e5 349 * @brief Run a single ALS measurement in single shot polling mode
charlesmn 0:1da5e4bcb8e5 350 *
charlesmn 0:1da5e4bcb8e5 351 * @par Function Description
charlesmn 0:1da5e4bcb8e5 352 * Kick off a new single shot ALS then wait new measurement ready to retrieve it ( polling system interrupt status register for als) \n
charlesmn 0:1da5e4bcb8e5 353 * ALS must be prepared by a first call to @a VL6180x_Prepare() \n
charlesmn 0:1da5e4bcb8e5 354 * \n Should not be used in continuous or interrupt mode it will break it and create hazard in start/stop \n
charlesmn 0:1da5e4bcb8e5 355 *
charlesmn 0:1da5e4bcb8e5 356 * @param dev The device
charlesmn 0:1da5e4bcb8e5 357 * @param pAlsData Als data structure to fill up @a VL6180x_AlsData_t
charlesmn 0:1da5e4bcb8e5 358 * @return 0 on success
charlesmn 0:1da5e4bcb8e5 359 */
charlesmn 0:1da5e4bcb8e5 360 // VL6180_ERROR VL6180x_AlsPollMeasurement(VL6180xDev_t dev, VL6180x_AlsData_t *pAlsData);
charlesmn 0:1da5e4bcb8e5 361
charlesmn 0:1da5e4bcb8e5 362
charlesmn 0:1da5e4bcb8e5 363 /* VL53L1X_api.h functions */
charlesmn 0:1da5e4bcb8e5 364
charlesmn 0:1da5e4bcb8e5 365
charlesmn 0:1da5e4bcb8e5 366
charlesmn 0:1da5e4bcb8e5 367 /**
charlesmn 0:1da5e4bcb8e5 368 * @brief This function returns the SW driver version
charlesmn 0:1da5e4bcb8e5 369 */
charlesmn 0:1da5e4bcb8e5 370 VL6180_ERROR vl6180_GetSWVersion(VL6180_Version_t *pVersion);
charlesmn 0:1da5e4bcb8e5 371
charlesmn 0:1da5e4bcb8e5 372 /**
charlesmn 0:1da5e4bcb8e5 373 * @brief This function sets the sensor I2C address used in case multiple devices application, default address 0x52
charlesmn 0:1da5e4bcb8e5 374 */
charlesmn 0:1da5e4bcb8e5 375 VL6180_ERROR vl6180_SetI2CAddress(uint8_t new_address);
charlesmn 0:1da5e4bcb8e5 376
charlesmn 0:1da5e4bcb8e5 377 /**
charlesmn 0:1da5e4bcb8e5 378 * @brief This function loads the 135 bytes default values to initialize the sensor.
charlesmn 0:1da5e4bcb8e5 379 * @param dev Device address
charlesmn 0:1da5e4bcb8e5 380 * @return 0:success, != 0:failed
charlesmn 0:1da5e4bcb8e5 381 */
charlesmn 0:1da5e4bcb8e5 382 VL6180_ERROR vl6180_SensorInit();
charlesmn 0:1da5e4bcb8e5 383
charlesmn 0:1da5e4bcb8e5 384 /**
charlesmn 0:1da5e4bcb8e5 385 * @brief This function clears the interrupt, to be called after a ranging data reading
charlesmn 0:1da5e4bcb8e5 386 * to arm the interrupt for the next data ready event.
charlesmn 0:1da5e4bcb8e5 387 */
charlesmn 0:1da5e4bcb8e5 388 VL6180_ERROR vl6180_ClearInterrupt();
charlesmn 0:1da5e4bcb8e5 389
charlesmn 0:1da5e4bcb8e5 390 /**
charlesmn 0:1da5e4bcb8e5 391 * @brief This function programs the interrupt polarity\n
charlesmn 0:1da5e4bcb8e5 392 * 1=active high (default), 0=active low
charlesmn 0:1da5e4bcb8e5 393 */
charlesmn 0:1da5e4bcb8e5 394 VL6180_ERROR vl6180_SetInterruptPolarity(uint8_t IntPol);
charlesmn 0:1da5e4bcb8e5 395
charlesmn 0:1da5e4bcb8e5 396 /**
charlesmn 0:1da5e4bcb8e5 397 * @brief This function returns the current interrupt polarity\n
charlesmn 0:1da5e4bcb8e5 398 * 1=active high (default), 0=active low
charlesmn 0:1da5e4bcb8e5 399 */
charlesmn 0:1da5e4bcb8e5 400 VL6180_ERROR vl6180_GetInterruptPolarity(uint8_t *pIntPol);
charlesmn 0:1da5e4bcb8e5 401
charlesmn 0:1da5e4bcb8e5 402 /**
charlesmn 0:1da5e4bcb8e5 403 * @brief This function starts the ranging distance operation\n
charlesmn 0:1da5e4bcb8e5 404 * 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
charlesmn 0:1da5e4bcb8e5 405 * 1=active high (default), 0=active low, use SetInterruptPolarity() to change the interrupt polarity if required.
charlesmn 0:1da5e4bcb8e5 406 */
charlesmn 0:1da5e4bcb8e5 407 VL6180_ERROR vl6180_StartRanging();
charlesmn 0:1da5e4bcb8e5 408
charlesmn 0:1da5e4bcb8e5 409 /**
charlesmn 0:1da5e4bcb8e5 410 * @brief This function stops the ranging.
charlesmn 0:1da5e4bcb8e5 411 */
charlesmn 0:1da5e4bcb8e5 412 VL6180_ERROR vl6180_StopRanging();
charlesmn 0:1da5e4bcb8e5 413
charlesmn 0:1da5e4bcb8e5 414
charlesmn 0:1da5e4bcb8e5 415 /**
charlesmn 0:1da5e4bcb8e5 416 * @brief This function programs the timing budget in ms.
charlesmn 0:1da5e4bcb8e5 417 * Predefined values = 15, 20, 33, 50, 100(default), 200, 500.
charlesmn 0:1da5e4bcb8e5 418 */
charlesmn 0:1da5e4bcb8e5 419 VL6180_ERROR vl6180_SetTimingBudgetInMs(uint16_t TimingBudgetInMs);
charlesmn 0:1da5e4bcb8e5 420
charlesmn 0:1da5e4bcb8e5 421 /**
charlesmn 0:1da5e4bcb8e5 422 * @brief This function returns the current timing budget in ms.
charlesmn 0:1da5e4bcb8e5 423 */
charlesmn 0:1da5e4bcb8e5 424 VL6180_ERROR vl6180_GetTimingBudgetInMs(uint16_t *pTimingBudgetInMs);
charlesmn 0:1da5e4bcb8e5 425
charlesmn 0:1da5e4bcb8e5 426 /**
charlesmn 0:1da5e4bcb8e5 427 * @brief This function programs the distance mode (1=short, 2=long(default)).
charlesmn 0:1da5e4bcb8e5 428 * Short mode max distance is limited to 1.3 m but better ambient immunity.\n
charlesmn 0:1da5e4bcb8e5 429 * Long mode can range up to 4 m in the dark with 200 ms timing budget.
charlesmn 0:1da5e4bcb8e5 430 */
charlesmn 0:1da5e4bcb8e5 431 VL6180_ERROR vl6180_SetDistanceMode(uint16_t DistanceMode);
charlesmn 0:1da5e4bcb8e5 432
charlesmn 0:1da5e4bcb8e5 433 /**
charlesmn 0:1da5e4bcb8e5 434 * @brief This function returns the current distance mode (1=short, 2=long).
charlesmn 0:1da5e4bcb8e5 435 */
charlesmn 0:1da5e4bcb8e5 436 VL6180_ERROR vl6180_GetDistanceMode(uint16_t *pDistanceMode);
charlesmn 0:1da5e4bcb8e5 437
charlesmn 0:1da5e4bcb8e5 438 /**
charlesmn 0:1da5e4bcb8e5 439 * @brief This function programs the Intermeasurement period in ms\n
charlesmn 0:1da5e4bcb8e5 440 * Intermeasurement period must be >/= timing budget. This condition is not checked by the API,
charlesmn 0:1da5e4bcb8e5 441 * the customer has the duty to check the condition. Default = 100 ms
charlesmn 0:1da5e4bcb8e5 442 */
charlesmn 0:1da5e4bcb8e5 443 VL6180_ERROR vl6180_SetInterMeasurementInMs(uint16_t InterMeasurementInMs);
charlesmn 0:1da5e4bcb8e5 444
charlesmn 0:1da5e4bcb8e5 445 /**
charlesmn 0:1da5e4bcb8e5 446 * @brief This function returns the Intermeasurement period in ms.
charlesmn 0:1da5e4bcb8e5 447 */
charlesmn 0:1da5e4bcb8e5 448 VL6180_ERROR vl6180_GetInterMeasurementInMs(uint16_t * pIM);
charlesmn 0:1da5e4bcb8e5 449
charlesmn 0:1da5e4bcb8e5 450 /**
charlesmn 0:1da5e4bcb8e5 451 * @brief This function returns the boot state of the device (1:booted, 0:not booted)
charlesmn 0:1da5e4bcb8e5 452 */
charlesmn 0:1da5e4bcb8e5 453 VL6180_ERROR vl6180_BootState(uint8_t *state);
charlesmn 0:1da5e4bcb8e5 454
charlesmn 0:1da5e4bcb8e5 455 /**
charlesmn 0:1da5e4bcb8e5 456 * @brief This function returns the sensor id, sensor Id must be 0xEEAC
charlesmn 0:1da5e4bcb8e5 457 */
charlesmn 0:1da5e4bcb8e5 458 VL6180_ERROR vl6180_GetSensorId(uint16_t *id);
charlesmn 0:1da5e4bcb8e5 459
charlesmn 0:1da5e4bcb8e5 460 /**
charlesmn 0:1da5e4bcb8e5 461 * @brief This function returns the distance measured by the sensor in mm
charlesmn 0:1da5e4bcb8e5 462 */
charlesmn 0:1da5e4bcb8e5 463 VL6180_ERROR vl6180_GetDistance(uint16_t *distance);
charlesmn 0:1da5e4bcb8e5 464
charlesmn 0:1da5e4bcb8e5 465 /**
charlesmn 0:1da5e4bcb8e5 466 * @brief This function returns the returned signal per SPAD in kcps/SPAD.
charlesmn 0:1da5e4bcb8e5 467 * With kcps stands for Kilo Count Per Second
charlesmn 0:1da5e4bcb8e5 468 */
charlesmn 0:1da5e4bcb8e5 469 VL6180_ERROR VL53L1X_GetSignalPerSpad(uint16_t *signalPerSp);
charlesmn 0:1da5e4bcb8e5 470
charlesmn 0:1da5e4bcb8e5 471 /**
charlesmn 0:1da5e4bcb8e5 472 * @brief This function returns the ambient per SPAD in kcps/SPAD
charlesmn 0:1da5e4bcb8e5 473 */
charlesmn 0:1da5e4bcb8e5 474 VL6180_ERROR VL53L1X_GetAmbientPerSpad(uint16_t *amb);
charlesmn 0:1da5e4bcb8e5 475
charlesmn 0:1da5e4bcb8e5 476 /**
charlesmn 0:1da5e4bcb8e5 477 * @brief This function returns the returned signal in kcps.
charlesmn 0:1da5e4bcb8e5 478 */
charlesmn 0:1da5e4bcb8e5 479 VL6180_ERROR VL53L1X_GetSignalRate(uint16_t *signalRate);
charlesmn 0:1da5e4bcb8e5 480
charlesmn 0:1da5e4bcb8e5 481 /**
charlesmn 0:1da5e4bcb8e5 482 * @brief This function returns the current number of enabled SPADs
charlesmn 0:1da5e4bcb8e5 483 */
charlesmn 0:1da5e4bcb8e5 484 VL6180_ERROR VL53L1X_GetSpadNb(uint16_t *spNb);
charlesmn 0:1da5e4bcb8e5 485
charlesmn 0:1da5e4bcb8e5 486 /**
charlesmn 0:1da5e4bcb8e5 487 * @brief This function returns the ambient rate in kcps
charlesmn 0:1da5e4bcb8e5 488 */
charlesmn 0:1da5e4bcb8e5 489 VL6180_ERROR VL53L1X_GetAmbientRate(uint16_t *ambRate);
charlesmn 0:1da5e4bcb8e5 490
charlesmn 0:1da5e4bcb8e5 491 /**
charlesmn 0:1da5e4bcb8e5 492 * @brief This function returns the ranging status error \n
charlesmn 0:1da5e4bcb8e5 493 * (0:no error, 1:sigma failed, 2:signal failed, ..., 7:wrap-around)
charlesmn 0:1da5e4bcb8e5 494 */
charlesmn 0:1da5e4bcb8e5 495 VL6180_ERROR VL53L1X_GetRangeStatus(uint8_t *rangeStatus);
charlesmn 0:1da5e4bcb8e5 496
charlesmn 0:1da5e4bcb8e5 497 /**
charlesmn 0:1da5e4bcb8e5 498 * @brief This function programs the offset correction in mm
charlesmn 0:1da5e4bcb8e5 499 * @param OffsetValue:the offset correction value to program in mm
charlesmn 0:1da5e4bcb8e5 500 */
charlesmn 0:1da5e4bcb8e5 501 VL6180_ERROR VL53L1X_SetOffset(int16_t OffsetValue);
charlesmn 0:1da5e4bcb8e5 502
charlesmn 0:1da5e4bcb8e5 503 /**
charlesmn 0:1da5e4bcb8e5 504 * @brief This function returns the programmed offset correction value in mm
charlesmn 0:1da5e4bcb8e5 505 */
charlesmn 0:1da5e4bcb8e5 506 VL6180_ERROR VL53L1X_GetOffset(int16_t *Offset);
charlesmn 0:1da5e4bcb8e5 507
charlesmn 0:1da5e4bcb8e5 508 /**
charlesmn 0:1da5e4bcb8e5 509 * @brief This function programs the xtalk correction value in cps (Count Per Second).\n
charlesmn 0:1da5e4bcb8e5 510 * This is the number of photons reflected back from the cover glass in cps.
charlesmn 0:1da5e4bcb8e5 511 */
charlesmn 0:1da5e4bcb8e5 512 VL6180_ERROR VL53L1X_SetXtalk(uint16_t XtalkValue);
charlesmn 0:1da5e4bcb8e5 513
charlesmn 0:1da5e4bcb8e5 514 /**
charlesmn 0:1da5e4bcb8e5 515 * @brief This function returns the current programmed xtalk correction value in cps
charlesmn 0:1da5e4bcb8e5 516 */
charlesmn 0:1da5e4bcb8e5 517 VL6180_ERROR VL53L1X_GetXtalk(uint16_t *Xtalk);
charlesmn 0:1da5e4bcb8e5 518
charlesmn 0:1da5e4bcb8e5 519 /**
charlesmn 0:1da5e4bcb8e5 520 * @brief This function programs the threshold detection mode\n
charlesmn 0:1da5e4bcb8e5 521 * Example:\n
charlesmn 0:1da5e4bcb8e5 522 * VL53L1X_SetDistanceThreshold(dev,100,300,0,1): Below 100 \n
charlesmn 0:1da5e4bcb8e5 523 * VL53L1X_SetDistanceThreshold(dev,100,300,1,1): Above 300 \n
charlesmn 0:1da5e4bcb8e5 524 * VL53L1X_SetDistanceThreshold(dev,100,300,2,1): Out of window \n
charlesmn 0:1da5e4bcb8e5 525 * VL53L1X_SetDistanceThreshold(dev,100,300,3,1): In window \n
charlesmn 0:1da5e4bcb8e5 526 * @param dev : device address
charlesmn 0:1da5e4bcb8e5 527 * @param ThreshLow(in mm) : the threshold under which one the device raises an interrupt if Window = 0
charlesmn 0:1da5e4bcb8e5 528 * @param ThreshHigh(in mm) : the threshold above which one the device raises an interrupt if Window = 1
charlesmn 0:1da5e4bcb8e5 529 * @param Window detection mode : 0=below, 1=above, 2=out, 3=in
charlesmn 0:1da5e4bcb8e5 530 * @param IntOnNoTarget = 1 (No longer used - just use 1)
charlesmn 0:1da5e4bcb8e5 531 */
charlesmn 0:1da5e4bcb8e5 532 VL6180_ERROR vl6180_SetDistanceThreshold(uint16_t ThreshLow,
charlesmn 0:1da5e4bcb8e5 533 uint16_t ThreshHigh, uint8_t Window,
charlesmn 0:1da5e4bcb8e5 534 uint8_t IntOnNoTarget);
charlesmn 0:1da5e4bcb8e5 535
charlesmn 0:1da5e4bcb8e5 536 /**
charlesmn 0:1da5e4bcb8e5 537 * @brief This function returns the window detection mode (0=below; 1=above; 2=out; 3=in)
charlesmn 0:1da5e4bcb8e5 538 */
charlesmn 0:1da5e4bcb8e5 539 VL6180_ERROR vl6180_GetDistanceThresholdWindow(uint16_t *window);
charlesmn 0:1da5e4bcb8e5 540
charlesmn 0:1da5e4bcb8e5 541 /**
charlesmn 0:1da5e4bcb8e5 542 * @brief This function returns the low threshold in mm
charlesmn 0:1da5e4bcb8e5 543 */
charlesmn 0:1da5e4bcb8e5 544 VL6180_ERROR vl6180_GetDistanceThresholdLow(uint16_t *low);
charlesmn 0:1da5e4bcb8e5 545
charlesmn 0:1da5e4bcb8e5 546 /**
charlesmn 0:1da5e4bcb8e5 547 * @brief This function returns the high threshold in mm
charlesmn 0:1da5e4bcb8e5 548 */
charlesmn 0:1da5e4bcb8e5 549 VL6180_ERROR vl6180_GetDistanceThresholdHigh(uint16_t *high);
charlesmn 0:1da5e4bcb8e5 550
charlesmn 0:1da5e4bcb8e5 551 /**
charlesmn 0:1da5e4bcb8e5 552 * @brief This function programs the ROI (Region of Interest)\n
charlesmn 0:1da5e4bcb8e5 553 * The ROI position is centered, only the ROI size can be reprogrammed.\n
charlesmn 0:1da5e4bcb8e5 554 * The smallest acceptable ROI size = 4\n
charlesmn 0:1da5e4bcb8e5 555 * @param X:ROI Width; Y=ROI Height
charlesmn 0:1da5e4bcb8e5 556 */
charlesmn 0:1da5e4bcb8e5 557 VL6180_ERROR VL53L1X_SetROI(uint16_t X, uint16_t Y);
charlesmn 0:1da5e4bcb8e5 558
charlesmn 0:1da5e4bcb8e5 559 /**
charlesmn 0:1da5e4bcb8e5 560 *@brief This function returns width X and height Y
charlesmn 0:1da5e4bcb8e5 561 */
charlesmn 0:1da5e4bcb8e5 562 VL6180_ERROR VL53L1X_GetROI_XY(uint16_t *ROI_X, uint16_t *ROI_Y);
charlesmn 0:1da5e4bcb8e5 563
charlesmn 0:1da5e4bcb8e5 564 /**
charlesmn 0:1da5e4bcb8e5 565 * @brief This function programs a new signal threshold in kcps (default=1024 kcps\n
charlesmn 0:1da5e4bcb8e5 566 */
charlesmn 0:1da5e4bcb8e5 567 VL6180_ERROR VL53L1X_SetSignalThreshold(uint16_t signal);
charlesmn 0:1da5e4bcb8e5 568
charlesmn 0:1da5e4bcb8e5 569 /**
charlesmn 0:1da5e4bcb8e5 570 * @brief This function returns the current signal threshold in kcps
charlesmn 0:1da5e4bcb8e5 571 */
charlesmn 0:1da5e4bcb8e5 572 VL6180_ERROR VL53L1X_GetSignalThreshold(uint16_t *signal);
charlesmn 0:1da5e4bcb8e5 573
charlesmn 0:1da5e4bcb8e5 574 /**
charlesmn 0:1da5e4bcb8e5 575 * @brief This function programs a new sigma threshold in mm (default=15 mm)
charlesmn 0:1da5e4bcb8e5 576 */
charlesmn 0:1da5e4bcb8e5 577 VL6180_ERROR VL53L1X_SetSigmaThreshold(uint16_t sigma);
charlesmn 0:1da5e4bcb8e5 578
charlesmn 0:1da5e4bcb8e5 579 /**
charlesmn 0:1da5e4bcb8e5 580 * @brief This function returns the current sigma threshold in mm
charlesmn 0:1da5e4bcb8e5 581 */
charlesmn 0:1da5e4bcb8e5 582 VL6180_ERROR VL53L1X_GetSigmaThreshold(uint16_t *signal);
charlesmn 0:1da5e4bcb8e5 583
charlesmn 0:1da5e4bcb8e5 584 /**
charlesmn 0:1da5e4bcb8e5 585 * @brief This function performs the temperature calibration.
charlesmn 0:1da5e4bcb8e5 586 * It is recommended to call this function any time the temperature might have changed by more than 8 deg C
charlesmn 0:1da5e4bcb8e5 587 * without sensor ranging activity for an extended period.
charlesmn 0:1da5e4bcb8e5 588 */
charlesmn 0:1da5e4bcb8e5 589 VL6180_ERROR VL53L1X_StartTemperatureUpdate();
charlesmn 0:1da5e4bcb8e5 590
charlesmn 0:1da5e4bcb8e5 591 /**
charlesmn 0:1da5e4bcb8e5 592 * @brief Wait for device booted after chip enable (hardware standby)
charlesmn 0:1da5e4bcb8e5 593 * @par Function Description
charlesmn 0:1da5e4bcb8e5 594 * After Chip enable Application you can also simply wait at least 1ms to ensure device is ready
charlesmn 0:1da5e4bcb8e5 595 * @warning After device chip enable (gpio0) de-asserted user must wait gpio1 to get asserted (hardware standby).
charlesmn 0:1da5e4bcb8e5 596 * or wait at least 400usec prior to do any low level access or api call .
charlesmn 0:1da5e4bcb8e5 597 *
charlesmn 0:1da5e4bcb8e5 598 * This function implements polling for standby but you must ensure 400usec from chip enable passed\n
charlesmn 0:1da5e4bcb8e5 599 * @warning Calling this function if device is not fresh out of reset will result in an indefinite loop\n
charlesmn 0:1da5e4bcb8e5 600 *
charlesmn 0:1da5e4bcb8e5 601 * @param dev The device
charlesmn 0:1da5e4bcb8e5 602 * @return 0 on success
charlesmn 0:1da5e4bcb8e5 603 */
charlesmn 0:1da5e4bcb8e5 604 VL6180_ERROR vl6180_WaitDeviceBooted(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 605
charlesmn 0:1da5e4bcb8e5 606 VL6180_ERROR vl6180_InitData(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 607
charlesmn 0:1da5e4bcb8e5 608 VL6180_ERROR vl6180_DMaxSetState(VL6180Dev_t dev, int state);
charlesmn 0:1da5e4bcb8e5 609
charlesmn 0:1da5e4bcb8e5 610 VL6180_ERROR vl6180_UpscaleGetScaling(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 611
charlesmn 0:1da5e4bcb8e5 612 VL6180_ERROR vl6180_FilterGetState(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 613
charlesmn 0:1da5e4bcb8e5 614 /**
charlesmn 0:1da5e4bcb8e5 615 * @brief Prepare device for operation
charlesmn 0:1da5e4bcb8e5 616 * @par Function Description
charlesmn 0:1da5e4bcb8e5 617 * Does static initialization and reprogram common default settings \n
charlesmn 0:1da5e4bcb8e5 618 * Device is prepared for new measure, ready single shot ranging typical polling operation\n
charlesmn 0:1da5e4bcb8e5 619 * After prepare user can : \n
charlesmn 0:1da5e4bcb8e5 620 * @li Call other API function to set other settings\n
charlesmn 0:1da5e4bcb8e5 621 * @li Configure the interrupt pins, etc... \n
charlesmn 0:1da5e4bcb8e5 622 * @li Then start ranging operations in single shot or continuous mode
charlesmn 0:1da5e4bcb8e5 623 *
charlesmn 0:1da5e4bcb8e5 624 * @param dev The device
charlesmn 0:1da5e4bcb8e5 625 * @return 0 on success
charlesmn 0:1da5e4bcb8e5 626 */
charlesmn 0:1da5e4bcb8e5 627 VL6180_ERROR vl6180_Prepare(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 628
charlesmn 0:1da5e4bcb8e5 629 /**
charlesmn 0:1da5e4bcb8e5 630 * @brief Single shot Range measurement in polling mode.
charlesmn 0:1da5e4bcb8e5 631 *
charlesmn 0:1da5e4bcb8e5 632 * @par Function Description
charlesmn 0:1da5e4bcb8e5 633 * Kick off a new single shot range then wait for ready to retrieve it by polling interrupt status \n
charlesmn 0:1da5e4bcb8e5 634 * Ranging must be prepared by a first call to @a VL6180_Prepare() and it is safer to clear very first poll call \n
charlesmn 0:1da5e4bcb8e5 635 * This function reference VL6180_PollDelay(dev) porting macro/call on each polling loop,
charlesmn 0:1da5e4bcb8e5 636 * but PollDelay(dev) may never be called if measure in ready on first poll loop \n
charlesmn 0:1da5e4bcb8e5 637 * Should not be use in continuous mode operation as it will stop it and cause stop/start misbehaviour \n
charlesmn 0:1da5e4bcb8e5 638 * \n This function clears Range Interrupt status , but not error one. For that uses @a VL6180_ClearErrorInterrupt() \n
charlesmn 0:1da5e4bcb8e5 639 * This range error is not related VL6180_RangeData_t::errorStatus that refer measure status \n
charlesmn 0:1da5e4bcb8e5 640 *
charlesmn 0:1da5e4bcb8e5 641 * @param dev The device
charlesmn 0:1da5e4bcb8e5 642 * @param pRangeData Will be populated with the result ranging data @a VL6180_RangeData_t
charlesmn 0:1da5e4bcb8e5 643 * @return 0 on success , @a #RANGE_ERROR if device reports an error case in it status (not cleared) use
charlesmn 0:1da5e4bcb8e5 644 *
charlesmn 0:1da5e4bcb8e5 645 * \sa ::VL6180_RangeData_t
charlesmn 0:1da5e4bcb8e5 646 */
charlesmn 0:1da5e4bcb8e5 647 VL6180_ERROR vl6180_RangePollMeasurement(VL6180Dev_t dev, VL6180_RangeData_t *pRangeData);
charlesmn 0:1da5e4bcb8e5 648
charlesmn 0:1da5e4bcb8e5 649 /**************************************************************************/
charlesmn 0:1da5e4bcb8e5 650
charlesmn 0:1da5e4bcb8e5 651 VL6180_ERROR VL6180_I2CWrite(uint8_t dev, uint16_t index, uint8_t *data, uint16_t number_of_bytes);
charlesmn 0:1da5e4bcb8e5 652 VL6180_ERROR VL6180_I2CRead(uint8_t dev, uint16_t index, uint8_t *data, uint16_t number_of_bytes);
charlesmn 0:1da5e4bcb8e5 653
charlesmn 0:1da5e4bcb8e5 654
charlesmn 0:1da5e4bcb8e5 655
charlesmn 0:1da5e4bcb8e5 656 VL6180_ERROR vl6180_RangeStartContinuousMode(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 657
charlesmn 0:1da5e4bcb8e5 658 VL6180_ERROR vl6180_RangeStartSingleShot(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 659
charlesmn 0:1da5e4bcb8e5 660 VL6180_ERROR vl6180_RangeSetInterMeasPeriod(VL6180Dev_t dev, uint32_t InterMeasTime_msec);
charlesmn 0:1da5e4bcb8e5 661
charlesmn 0:1da5e4bcb8e5 662 VL6180_ERROR vl6180_RangeGetMeasurement(VL6180Dev_t dev, VL6180_RangeData_t *pRangeData);
charlesmn 0:1da5e4bcb8e5 663
charlesmn 0:1da5e4bcb8e5 664 VL6180_ERROR vl6180_RangeGetMeasurementIfReady(VL6180Dev_t dev, VL6180_RangeData_t *pRangeData);
charlesmn 0:1da5e4bcb8e5 665
charlesmn 0:1da5e4bcb8e5 666 VL6180_ERROR vl6180_SetupGPIO1(VL6180Dev_t dev, uint8_t IntFunction, int ActiveHigh);
charlesmn 0:1da5e4bcb8e5 667
charlesmn 0:1da5e4bcb8e5 668 VL6180_ERROR vl6180_RangeConfigInterrupt(VL6180Dev_t dev, uint8_t ConfigGpioInt);
charlesmn 0:1da5e4bcb8e5 669
charlesmn 0:1da5e4bcb8e5 670 VL6180_ERROR vl6180_ClearInterrupt(VL6180Dev_t dev, uint8_t IntClear);
charlesmn 0:1da5e4bcb8e5 671
charlesmn 0:1da5e4bcb8e5 672 VL6180_ERROR vl6180_RangeSetThresholds(VL6180Dev_t dev, uint16_t low, uint16_t high, int UseSafeParamHold);
charlesmn 0:1da5e4bcb8e5 673
charlesmn 0:1da5e4bcb8e5 674 VL6180_ERROR vl6180_FilterSetState(VL6180Dev_t dev, int state);
charlesmn 0:1da5e4bcb8e5 675
charlesmn 0:1da5e4bcb8e5 676 VL6180_ERROR vl6180_UpscaleSetScaling(VL6180Dev_t dev, uint8_t scaling);
charlesmn 0:1da5e4bcb8e5 677
charlesmn 0:1da5e4bcb8e5 678 protected:
charlesmn 0:1da5e4bcb8e5 679
charlesmn 0:1da5e4bcb8e5 680 /* IO Device */
charlesmn 0:1da5e4bcb8e5 681 vl6180_DevI2C *dev_i2c;
charlesmn 0:1da5e4bcb8e5 682
charlesmn 0:1da5e4bcb8e5 683 /* Digital out pin */
charlesmn 0:1da5e4bcb8e5 684 DigitalOut *_gpio0;
charlesmn 0:1da5e4bcb8e5 685 /* GPIO expander */
charlesmn 0:1da5e4bcb8e5 686 Stmpe1600DigiOut *_expgpio0;
charlesmn 0:1da5e4bcb8e5 687 /* Measure detection IRQ */
charlesmn 0:1da5e4bcb8e5 688 InterruptIn *_gpio1Int;
charlesmn 0:1da5e4bcb8e5 689
charlesmn 0:1da5e4bcb8e5 690 ///* Digital out pin */
charlesmn 0:1da5e4bcb8e5 691 //int gpio0;
charlesmn 0:1da5e4bcb8e5 692 //int gpio1Int;
charlesmn 0:1da5e4bcb8e5 693 /* Device data */
charlesmn 0:1da5e4bcb8e5 694 // VL53L1_DEV_t MyDevice;
charlesmn 0:1da5e4bcb8e5 695 // VL53L1_DEV Device;
charlesmn 0:1da5e4bcb8e5 696 VL6180Dev_t MyDevice;
charlesmn 0:1da5e4bcb8e5 697 MyVL6180Dev_t Device;
charlesmn 0:1da5e4bcb8e5 698 };
charlesmn 0:1da5e4bcb8e5 699
charlesmn 0:1da5e4bcb8e5 700
charlesmn 0:1da5e4bcb8e5 701 #endif /* _VL6180_CLASS_H_ */