ST Expansion SW Team / Vl6180

Dependencies:   VL6180_Board

Dependents:   X_NUCLEO_6180

Committer:
charlesmn
Date:
Tue Nov 10 16:09:01 2020 +0000
Revision:
3:b01812cb5250
Parent:
2:bc1d979ae392
Used the correct version of RangeSensor.h which allows the program to build.

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 3:b01812cb5250 231 #if (MBED_VERSION > 60300)
charlesmn 3:b01812cb5250 232 thread_sleep_for(10);
charlesmn 3:b01812cb5250 233 #else
charlesmn 3:b01812cb5250 234 wait_ms(10); // NEEDS A DELAY BETWEEN SENSORS
charlesmn 3:b01812cb5250 235 #endif
charlesmn 3:b01812cb5250 236
charlesmn 0:1da5e4bcb8e5 237 }
charlesmn 0:1da5e4bcb8e5 238
charlesmn 0:1da5e4bcb8e5 239 /**
charlesmn 0:1da5e4bcb8e5 240 * @brief PowerOff the sensor
charlesmn 0:1da5e4bcb8e5 241 * @return void
charlesmn 0:1da5e4bcb8e5 242 */
charlesmn 0:1da5e4bcb8e5 243 /* turns off the sensor */
charlesmn 0:1da5e4bcb8e5 244 virtual void VL53L1_Off(void)
charlesmn 0:1da5e4bcb8e5 245 {
charlesmn 0:1da5e4bcb8e5 246 printf("VL53L1_Off\r\n");
charlesmn 0:1da5e4bcb8e5 247 if (_gpio0) {
charlesmn 0:1da5e4bcb8e5 248 *_gpio0 = 0;
charlesmn 0:1da5e4bcb8e5 249 } else {
charlesmn 0:1da5e4bcb8e5 250 if (_expgpio0) {
charlesmn 0:1da5e4bcb8e5 251 *_expgpio0 = 0;
charlesmn 0:1da5e4bcb8e5 252 }
charlesmn 0:1da5e4bcb8e5 253 }
charlesmn 3:b01812cb5250 254 #if (MBED_VERSION > 60300)
charlesmn 3:b01812cb5250 255 thread_sleep_for(10);
charlesmn 3:b01812cb5250 256 #else
charlesmn 3:b01812cb5250 257 wait_ms(10); // NEEDS A DELAY BETWEEN SENSORS
charlesmn 3:b01812cb5250 258 #endif
charlesmn 3:b01812cb5250 259
charlesmn 0:1da5e4bcb8e5 260 }
charlesmn 0:1da5e4bcb8e5 261
charlesmn 0:1da5e4bcb8e5 262 int is_present()
charlesmn 0:1da5e4bcb8e5 263 {
charlesmn 0:1da5e4bcb8e5 264 int status;
charlesmn 0:1da5e4bcb8e5 265 uint8_t id = 0;
charlesmn 0:1da5e4bcb8e5 266
charlesmn 0:1da5e4bcb8e5 267 status = read_id(&id);
charlesmn 0:1da5e4bcb8e5 268 if (status) {
charlesmn 0:1da5e4bcb8e5 269 printf("Failed to read ID device. Device not present!\n\r");
charlesmn 0:1da5e4bcb8e5 270 }
charlesmn 0:1da5e4bcb8e5 271 return status;
charlesmn 0:1da5e4bcb8e5 272 }
charlesmn 0:1da5e4bcb8e5 273
charlesmn 0:1da5e4bcb8e5 274 /**
charlesmn 0:1da5e4bcb8e5 275 * @brief Initialize the sensor with default values
charlesmn 0:1da5e4bcb8e5 276 * @return 0 on Success
charlesmn 0:1da5e4bcb8e5 277 */
charlesmn 0:1da5e4bcb8e5 278
charlesmn 0:1da5e4bcb8e5 279 VL6180_ERROR InitSensor(uint8_t address){
charlesmn 0:1da5e4bcb8e5 280 VL6180_ERROR status = 0;
charlesmn 0:1da5e4bcb8e5 281 VL53L1_Off();
charlesmn 0:1da5e4bcb8e5 282 VL53L1_On();
charlesmn 0:1da5e4bcb8e5 283 status = vl6180_SetI2CAddress(address);
charlesmn 0:1da5e4bcb8e5 284 printf("vl6180_SetI2CAddress %d %d \n",address,status);
charlesmn 0:1da5e4bcb8e5 285
charlesmn 3:b01812cb5250 286 #if (MBED_VERSION > 60300)
charlesmn 3:b01812cb5250 287 thread_sleep_for(20);
charlesmn 3:b01812cb5250 288 #else
charlesmn 3:b01812cb5250 289 wait_ms(20); // NEEDS A DELAY BETWEEN SENSORS
charlesmn 3:b01812cb5250 290 #endif
charlesmn 3:b01812cb5250 291
charlesmn 0:1da5e4bcb8e5 292 return status;
charlesmn 0:1da5e4bcb8e5 293 }
charlesmn 0:1da5e4bcb8e5 294
charlesmn 0:1da5e4bcb8e5 295
charlesmn 0:1da5e4bcb8e5 296
charlesmn 0:1da5e4bcb8e5 297 /**
charlesmn 0:1da5e4bcb8e5 298 *
charlesmn 0:1da5e4bcb8e5 299 * @brief One time device initialization
charlesmn 0:1da5e4bcb8e5 300 * @param void
charlesmn 0:1da5e4bcb8e5 301 * @return 0 on success, @a #CALIBRATION_WARNING if failed
charlesmn 0:1da5e4bcb8e5 302 */
charlesmn 0:1da5e4bcb8e5 303 virtual int init(void *init)
charlesmn 0:1da5e4bcb8e5 304 {
charlesmn 0:1da5e4bcb8e5 305 printf("init called no function \n");
charlesmn 0:1da5e4bcb8e5 306 return 0;
charlesmn 0:1da5e4bcb8e5 307 // return vl6180_SensorInit();
charlesmn 0:1da5e4bcb8e5 308 }
charlesmn 0:1da5e4bcb8e5 309
charlesmn 0:1da5e4bcb8e5 310
charlesmn 0:1da5e4bcb8e5 311 /**
charlesmn 0:1da5e4bcb8e5 312 * @brief Initialize the sensor with default values
charlesmn 0:1da5e4bcb8e5 313 * @return "0" on success
charlesmn 0:1da5e4bcb8e5 314 */
charlesmn 0:1da5e4bcb8e5 315 int init_sensor(uint8_t new_addr);
charlesmn 0:1da5e4bcb8e5 316
charlesmn 0:1da5e4bcb8e5 317 /* Read function of the ID device */
charlesmn 0:1da5e4bcb8e5 318 virtual int read_id(uint8_t *id){
charlesmn 0:1da5e4bcb8e5 319 int status = 0;
charlesmn 0:1da5e4bcb8e5 320 uint16_t rl_id = 0;
charlesmn 0:1da5e4bcb8e5 321
charlesmn 0:1da5e4bcb8e5 322 uint8_t ExpanderData[2];
charlesmn 0:1da5e4bcb8e5 323
charlesmn 0:1da5e4bcb8e5 324 ExpanderData[0] = 0;
charlesmn 0:1da5e4bcb8e5 325 ExpanderData[1] = 0;
charlesmn 0:1da5e4bcb8e5 326 rl_id = 0;
charlesmn 0:1da5e4bcb8e5 327 dev_i2c->vl6180_i2c_read(&ExpanderData[0], Device.i2c_addr, IDENTIFICATION_MODEL_ID, 2); // cgm is IDENTIFICATION_MODEL_ID correct
charlesmn 0:1da5e4bcb8e5 328
charlesmn 0:1da5e4bcb8e5 329 rl_id = (ExpanderData[0] << 8) + ExpanderData[1];
charlesmn 0:1da5e4bcb8e5 330 printf("Model ID is: %d (%X) \r\n",rl_id, rl_id);
charlesmn 0:1da5e4bcb8e5 331
charlesmn 0:1da5e4bcb8e5 332 uint8_t tmp = 0;
charlesmn 0:1da5e4bcb8e5 333 ExpanderData[0] = VL53L1_FIRMWARE__SYSTEM_STATUS >> 8;
charlesmn 0:1da5e4bcb8e5 334 ExpanderData[1] = VL53L1_FIRMWARE__SYSTEM_STATUS & 0x0FF;
charlesmn 0:1da5e4bcb8e5 335 dev_i2c->vl6180_i2c_read(&tmp, Device.i2c_addr, VL53L1_FIRMWARE__SYSTEM_STATUS, 1);
charlesmn 0:1da5e4bcb8e5 336
charlesmn 0:1da5e4bcb8e5 337 printf("Firmware system is: %d\r\n",tmp);
charlesmn 0:1da5e4bcb8e5 338
charlesmn 0:1da5e4bcb8e5 339 if (rl_id == 0xEACC) {
charlesmn 0:1da5e4bcb8e5 340 printf("Device is present %d:\r\n", rl_id);
charlesmn 0:1da5e4bcb8e5 341 return status;
charlesmn 0:1da5e4bcb8e5 342 }
charlesmn 0:1da5e4bcb8e5 343 return -1;
charlesmn 0:1da5e4bcb8e5 344 }
charlesmn 0:1da5e4bcb8e5 345
charlesmn 0:1da5e4bcb8e5 346
charlesmn 0:1da5e4bcb8e5 347
charlesmn 0:1da5e4bcb8e5 348 /**
charlesmn 0:1da5e4bcb8e5 349 * @brief Get ranging result and only that
charlesmn 0:1da5e4bcb8e5 350 * @param pRange_mm Pointer to range distance
charlesmn 0:1da5e4bcb8e5 351 * @return 0 on success
charlesmn 0:1da5e4bcb8e5 352 */
charlesmn 0:1da5e4bcb8e5 353 virtual int get_distance(uint32_t *piData)
charlesmn 0:1da5e4bcb8e5 354 {
charlesmn 0:1da5e4bcb8e5 355 int status;
charlesmn 0:1da5e4bcb8e5 356 uint16_t distance;
charlesmn 0:1da5e4bcb8e5 357 // status = vl6180_GetDistance(&distance); //todo cgm does not exist
charlesmn 0:1da5e4bcb8e5 358 *piData = (uint32_t) distance;
charlesmn 0:1da5e4bcb8e5 359 return status;
charlesmn 0:1da5e4bcb8e5 360 }
charlesmn 0:1da5e4bcb8e5 361
charlesmn 0:1da5e4bcb8e5 362
charlesmn 0:1da5e4bcb8e5 363 /**
charlesmn 0:1da5e4bcb8e5 364 * @brief Run a single ALS measurement in single shot polling mode
charlesmn 0:1da5e4bcb8e5 365 *
charlesmn 0:1da5e4bcb8e5 366 * @par Function Description
charlesmn 0:1da5e4bcb8e5 367 * 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 368 * ALS must be prepared by a first call to @a VL6180x_Prepare() \n
charlesmn 0:1da5e4bcb8e5 369 * \n Should not be used in continuous or interrupt mode it will break it and create hazard in start/stop \n
charlesmn 0:1da5e4bcb8e5 370 *
charlesmn 0:1da5e4bcb8e5 371 * @param dev The device
charlesmn 0:1da5e4bcb8e5 372 * @param pAlsData Als data structure to fill up @a VL6180x_AlsData_t
charlesmn 0:1da5e4bcb8e5 373 * @return 0 on success
charlesmn 0:1da5e4bcb8e5 374 */
charlesmn 0:1da5e4bcb8e5 375 // VL6180_ERROR VL6180x_AlsPollMeasurement(VL6180xDev_t dev, VL6180x_AlsData_t *pAlsData);
charlesmn 0:1da5e4bcb8e5 376
charlesmn 0:1da5e4bcb8e5 377
charlesmn 0:1da5e4bcb8e5 378 /* VL53L1X_api.h functions */
charlesmn 0:1da5e4bcb8e5 379
charlesmn 0:1da5e4bcb8e5 380
charlesmn 0:1da5e4bcb8e5 381
charlesmn 0:1da5e4bcb8e5 382 /**
charlesmn 0:1da5e4bcb8e5 383 * @brief This function returns the SW driver version
charlesmn 0:1da5e4bcb8e5 384 */
charlesmn 0:1da5e4bcb8e5 385 VL6180_ERROR vl6180_GetSWVersion(VL6180_Version_t *pVersion);
charlesmn 0:1da5e4bcb8e5 386
charlesmn 0:1da5e4bcb8e5 387 /**
charlesmn 0:1da5e4bcb8e5 388 * @brief This function sets the sensor I2C address used in case multiple devices application, default address 0x52
charlesmn 0:1da5e4bcb8e5 389 */
charlesmn 0:1da5e4bcb8e5 390 VL6180_ERROR vl6180_SetI2CAddress(uint8_t new_address);
charlesmn 0:1da5e4bcb8e5 391
charlesmn 0:1da5e4bcb8e5 392 /**
charlesmn 0:1da5e4bcb8e5 393 * @brief This function loads the 135 bytes default values to initialize the sensor.
charlesmn 0:1da5e4bcb8e5 394 * @param dev Device address
charlesmn 0:1da5e4bcb8e5 395 * @return 0:success, != 0:failed
charlesmn 0:1da5e4bcb8e5 396 */
charlesmn 0:1da5e4bcb8e5 397 VL6180_ERROR vl6180_SensorInit();
charlesmn 0:1da5e4bcb8e5 398
charlesmn 0:1da5e4bcb8e5 399 /**
charlesmn 0:1da5e4bcb8e5 400 * @brief This function clears the interrupt, to be called after a ranging data reading
charlesmn 0:1da5e4bcb8e5 401 * to arm the interrupt for the next data ready event.
charlesmn 0:1da5e4bcb8e5 402 */
charlesmn 0:1da5e4bcb8e5 403 VL6180_ERROR vl6180_ClearInterrupt();
charlesmn 0:1da5e4bcb8e5 404
charlesmn 0:1da5e4bcb8e5 405 /**
charlesmn 0:1da5e4bcb8e5 406 * @brief This function programs the interrupt polarity\n
charlesmn 0:1da5e4bcb8e5 407 * 1=active high (default), 0=active low
charlesmn 0:1da5e4bcb8e5 408 */
charlesmn 0:1da5e4bcb8e5 409 VL6180_ERROR vl6180_SetInterruptPolarity(uint8_t IntPol);
charlesmn 0:1da5e4bcb8e5 410
charlesmn 0:1da5e4bcb8e5 411 /**
charlesmn 0:1da5e4bcb8e5 412 * @brief This function returns the current interrupt polarity\n
charlesmn 0:1da5e4bcb8e5 413 * 1=active high (default), 0=active low
charlesmn 0:1da5e4bcb8e5 414 */
charlesmn 0:1da5e4bcb8e5 415 VL6180_ERROR vl6180_GetInterruptPolarity(uint8_t *pIntPol);
charlesmn 0:1da5e4bcb8e5 416
charlesmn 0:1da5e4bcb8e5 417 /**
charlesmn 0:1da5e4bcb8e5 418 * @brief This function starts the ranging distance operation\n
charlesmn 0:1da5e4bcb8e5 419 * 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 420 * 1=active high (default), 0=active low, use SetInterruptPolarity() to change the interrupt polarity if required.
charlesmn 0:1da5e4bcb8e5 421 */
charlesmn 0:1da5e4bcb8e5 422 VL6180_ERROR vl6180_StartRanging();
charlesmn 0:1da5e4bcb8e5 423
charlesmn 0:1da5e4bcb8e5 424 /**
charlesmn 0:1da5e4bcb8e5 425 * @brief This function stops the ranging.
charlesmn 0:1da5e4bcb8e5 426 */
charlesmn 0:1da5e4bcb8e5 427 VL6180_ERROR vl6180_StopRanging();
charlesmn 0:1da5e4bcb8e5 428
charlesmn 0:1da5e4bcb8e5 429
charlesmn 0:1da5e4bcb8e5 430 /**
charlesmn 0:1da5e4bcb8e5 431 * @brief This function programs the timing budget in ms.
charlesmn 0:1da5e4bcb8e5 432 * Predefined values = 15, 20, 33, 50, 100(default), 200, 500.
charlesmn 0:1da5e4bcb8e5 433 */
charlesmn 0:1da5e4bcb8e5 434 VL6180_ERROR vl6180_SetTimingBudgetInMs(uint16_t TimingBudgetInMs);
charlesmn 0:1da5e4bcb8e5 435
charlesmn 0:1da5e4bcb8e5 436 /**
charlesmn 0:1da5e4bcb8e5 437 * @brief This function returns the current timing budget in ms.
charlesmn 0:1da5e4bcb8e5 438 */
charlesmn 0:1da5e4bcb8e5 439 VL6180_ERROR vl6180_GetTimingBudgetInMs(uint16_t *pTimingBudgetInMs);
charlesmn 0:1da5e4bcb8e5 440
charlesmn 0:1da5e4bcb8e5 441 /**
charlesmn 0:1da5e4bcb8e5 442 * @brief This function programs the distance mode (1=short, 2=long(default)).
charlesmn 0:1da5e4bcb8e5 443 * Short mode max distance is limited to 1.3 m but better ambient immunity.\n
charlesmn 0:1da5e4bcb8e5 444 * Long mode can range up to 4 m in the dark with 200 ms timing budget.
charlesmn 0:1da5e4bcb8e5 445 */
charlesmn 0:1da5e4bcb8e5 446 VL6180_ERROR vl6180_SetDistanceMode(uint16_t DistanceMode);
charlesmn 0:1da5e4bcb8e5 447
charlesmn 0:1da5e4bcb8e5 448 /**
charlesmn 0:1da5e4bcb8e5 449 * @brief This function returns the current distance mode (1=short, 2=long).
charlesmn 0:1da5e4bcb8e5 450 */
charlesmn 0:1da5e4bcb8e5 451 VL6180_ERROR vl6180_GetDistanceMode(uint16_t *pDistanceMode);
charlesmn 0:1da5e4bcb8e5 452
charlesmn 0:1da5e4bcb8e5 453 /**
charlesmn 0:1da5e4bcb8e5 454 * @brief This function programs the Intermeasurement period in ms\n
charlesmn 0:1da5e4bcb8e5 455 * Intermeasurement period must be >/= timing budget. This condition is not checked by the API,
charlesmn 0:1da5e4bcb8e5 456 * the customer has the duty to check the condition. Default = 100 ms
charlesmn 0:1da5e4bcb8e5 457 */
charlesmn 0:1da5e4bcb8e5 458 VL6180_ERROR vl6180_SetInterMeasurementInMs(uint16_t InterMeasurementInMs);
charlesmn 0:1da5e4bcb8e5 459
charlesmn 0:1da5e4bcb8e5 460 /**
charlesmn 0:1da5e4bcb8e5 461 * @brief This function returns the Intermeasurement period in ms.
charlesmn 0:1da5e4bcb8e5 462 */
charlesmn 0:1da5e4bcb8e5 463 VL6180_ERROR vl6180_GetInterMeasurementInMs(uint16_t * pIM);
charlesmn 0:1da5e4bcb8e5 464
charlesmn 0:1da5e4bcb8e5 465 /**
charlesmn 0:1da5e4bcb8e5 466 * @brief This function returns the boot state of the device (1:booted, 0:not booted)
charlesmn 0:1da5e4bcb8e5 467 */
charlesmn 0:1da5e4bcb8e5 468 VL6180_ERROR vl6180_BootState(uint8_t *state);
charlesmn 0:1da5e4bcb8e5 469
charlesmn 0:1da5e4bcb8e5 470 /**
charlesmn 0:1da5e4bcb8e5 471 * @brief This function returns the sensor id, sensor Id must be 0xEEAC
charlesmn 0:1da5e4bcb8e5 472 */
charlesmn 0:1da5e4bcb8e5 473 VL6180_ERROR vl6180_GetSensorId(uint16_t *id);
charlesmn 0:1da5e4bcb8e5 474
charlesmn 0:1da5e4bcb8e5 475 /**
charlesmn 0:1da5e4bcb8e5 476 * @brief This function returns the distance measured by the sensor in mm
charlesmn 0:1da5e4bcb8e5 477 */
charlesmn 0:1da5e4bcb8e5 478 VL6180_ERROR vl6180_GetDistance(uint16_t *distance);
charlesmn 0:1da5e4bcb8e5 479
charlesmn 0:1da5e4bcb8e5 480 /**
charlesmn 0:1da5e4bcb8e5 481 * @brief This function returns the returned signal per SPAD in kcps/SPAD.
charlesmn 0:1da5e4bcb8e5 482 * With kcps stands for Kilo Count Per Second
charlesmn 0:1da5e4bcb8e5 483 */
charlesmn 0:1da5e4bcb8e5 484 VL6180_ERROR VL53L1X_GetSignalPerSpad(uint16_t *signalPerSp);
charlesmn 0:1da5e4bcb8e5 485
charlesmn 0:1da5e4bcb8e5 486 /**
charlesmn 0:1da5e4bcb8e5 487 * @brief This function returns the ambient per SPAD in kcps/SPAD
charlesmn 0:1da5e4bcb8e5 488 */
charlesmn 0:1da5e4bcb8e5 489 VL6180_ERROR VL53L1X_GetAmbientPerSpad(uint16_t *amb);
charlesmn 0:1da5e4bcb8e5 490
charlesmn 0:1da5e4bcb8e5 491 /**
charlesmn 0:1da5e4bcb8e5 492 * @brief This function returns the returned signal in kcps.
charlesmn 0:1da5e4bcb8e5 493 */
charlesmn 0:1da5e4bcb8e5 494 VL6180_ERROR VL53L1X_GetSignalRate(uint16_t *signalRate);
charlesmn 0:1da5e4bcb8e5 495
charlesmn 0:1da5e4bcb8e5 496 /**
charlesmn 0:1da5e4bcb8e5 497 * @brief This function returns the current number of enabled SPADs
charlesmn 0:1da5e4bcb8e5 498 */
charlesmn 0:1da5e4bcb8e5 499 VL6180_ERROR VL53L1X_GetSpadNb(uint16_t *spNb);
charlesmn 0:1da5e4bcb8e5 500
charlesmn 0:1da5e4bcb8e5 501 /**
charlesmn 0:1da5e4bcb8e5 502 * @brief This function returns the ambient rate in kcps
charlesmn 0:1da5e4bcb8e5 503 */
charlesmn 0:1da5e4bcb8e5 504 VL6180_ERROR VL53L1X_GetAmbientRate(uint16_t *ambRate);
charlesmn 0:1da5e4bcb8e5 505
charlesmn 0:1da5e4bcb8e5 506 /**
charlesmn 0:1da5e4bcb8e5 507 * @brief This function returns the ranging status error \n
charlesmn 0:1da5e4bcb8e5 508 * (0:no error, 1:sigma failed, 2:signal failed, ..., 7:wrap-around)
charlesmn 0:1da5e4bcb8e5 509 */
charlesmn 0:1da5e4bcb8e5 510 VL6180_ERROR VL53L1X_GetRangeStatus(uint8_t *rangeStatus);
charlesmn 0:1da5e4bcb8e5 511
charlesmn 0:1da5e4bcb8e5 512 /**
charlesmn 0:1da5e4bcb8e5 513 * @brief This function programs the offset correction in mm
charlesmn 0:1da5e4bcb8e5 514 * @param OffsetValue:the offset correction value to program in mm
charlesmn 0:1da5e4bcb8e5 515 */
charlesmn 0:1da5e4bcb8e5 516 VL6180_ERROR VL53L1X_SetOffset(int16_t OffsetValue);
charlesmn 0:1da5e4bcb8e5 517
charlesmn 0:1da5e4bcb8e5 518 /**
charlesmn 0:1da5e4bcb8e5 519 * @brief This function returns the programmed offset correction value in mm
charlesmn 0:1da5e4bcb8e5 520 */
charlesmn 0:1da5e4bcb8e5 521 VL6180_ERROR VL53L1X_GetOffset(int16_t *Offset);
charlesmn 0:1da5e4bcb8e5 522
charlesmn 0:1da5e4bcb8e5 523 /**
charlesmn 0:1da5e4bcb8e5 524 * @brief This function programs the xtalk correction value in cps (Count Per Second).\n
charlesmn 0:1da5e4bcb8e5 525 * This is the number of photons reflected back from the cover glass in cps.
charlesmn 0:1da5e4bcb8e5 526 */
charlesmn 0:1da5e4bcb8e5 527 VL6180_ERROR VL53L1X_SetXtalk(uint16_t XtalkValue);
charlesmn 0:1da5e4bcb8e5 528
charlesmn 0:1da5e4bcb8e5 529 /**
charlesmn 0:1da5e4bcb8e5 530 * @brief This function returns the current programmed xtalk correction value in cps
charlesmn 0:1da5e4bcb8e5 531 */
charlesmn 0:1da5e4bcb8e5 532 VL6180_ERROR VL53L1X_GetXtalk(uint16_t *Xtalk);
charlesmn 0:1da5e4bcb8e5 533
charlesmn 0:1da5e4bcb8e5 534 /**
charlesmn 0:1da5e4bcb8e5 535 * @brief This function programs the threshold detection mode\n
charlesmn 0:1da5e4bcb8e5 536 * Example:\n
charlesmn 0:1da5e4bcb8e5 537 * VL53L1X_SetDistanceThreshold(dev,100,300,0,1): Below 100 \n
charlesmn 0:1da5e4bcb8e5 538 * VL53L1X_SetDistanceThreshold(dev,100,300,1,1): Above 300 \n
charlesmn 0:1da5e4bcb8e5 539 * VL53L1X_SetDistanceThreshold(dev,100,300,2,1): Out of window \n
charlesmn 0:1da5e4bcb8e5 540 * VL53L1X_SetDistanceThreshold(dev,100,300,3,1): In window \n
charlesmn 0:1da5e4bcb8e5 541 * @param dev : device address
charlesmn 0:1da5e4bcb8e5 542 * @param ThreshLow(in mm) : the threshold under which one the device raises an interrupt if Window = 0
charlesmn 0:1da5e4bcb8e5 543 * @param ThreshHigh(in mm) : the threshold above which one the device raises an interrupt if Window = 1
charlesmn 0:1da5e4bcb8e5 544 * @param Window detection mode : 0=below, 1=above, 2=out, 3=in
charlesmn 0:1da5e4bcb8e5 545 * @param IntOnNoTarget = 1 (No longer used - just use 1)
charlesmn 0:1da5e4bcb8e5 546 */
charlesmn 0:1da5e4bcb8e5 547 VL6180_ERROR vl6180_SetDistanceThreshold(uint16_t ThreshLow,
charlesmn 0:1da5e4bcb8e5 548 uint16_t ThreshHigh, uint8_t Window,
charlesmn 0:1da5e4bcb8e5 549 uint8_t IntOnNoTarget);
charlesmn 0:1da5e4bcb8e5 550
charlesmn 0:1da5e4bcb8e5 551 /**
charlesmn 0:1da5e4bcb8e5 552 * @brief This function returns the window detection mode (0=below; 1=above; 2=out; 3=in)
charlesmn 0:1da5e4bcb8e5 553 */
charlesmn 0:1da5e4bcb8e5 554 VL6180_ERROR vl6180_GetDistanceThresholdWindow(uint16_t *window);
charlesmn 0:1da5e4bcb8e5 555
charlesmn 0:1da5e4bcb8e5 556 /**
charlesmn 0:1da5e4bcb8e5 557 * @brief This function returns the low threshold in mm
charlesmn 0:1da5e4bcb8e5 558 */
charlesmn 0:1da5e4bcb8e5 559 VL6180_ERROR vl6180_GetDistanceThresholdLow(uint16_t *low);
charlesmn 0:1da5e4bcb8e5 560
charlesmn 0:1da5e4bcb8e5 561 /**
charlesmn 0:1da5e4bcb8e5 562 * @brief This function returns the high threshold in mm
charlesmn 0:1da5e4bcb8e5 563 */
charlesmn 0:1da5e4bcb8e5 564 VL6180_ERROR vl6180_GetDistanceThresholdHigh(uint16_t *high);
charlesmn 0:1da5e4bcb8e5 565
charlesmn 0:1da5e4bcb8e5 566 /**
charlesmn 0:1da5e4bcb8e5 567 * @brief This function programs the ROI (Region of Interest)\n
charlesmn 0:1da5e4bcb8e5 568 * The ROI position is centered, only the ROI size can be reprogrammed.\n
charlesmn 0:1da5e4bcb8e5 569 * The smallest acceptable ROI size = 4\n
charlesmn 0:1da5e4bcb8e5 570 * @param X:ROI Width; Y=ROI Height
charlesmn 0:1da5e4bcb8e5 571 */
charlesmn 0:1da5e4bcb8e5 572 VL6180_ERROR VL53L1X_SetROI(uint16_t X, uint16_t Y);
charlesmn 0:1da5e4bcb8e5 573
charlesmn 0:1da5e4bcb8e5 574 /**
charlesmn 0:1da5e4bcb8e5 575 *@brief This function returns width X and height Y
charlesmn 0:1da5e4bcb8e5 576 */
charlesmn 0:1da5e4bcb8e5 577 VL6180_ERROR VL53L1X_GetROI_XY(uint16_t *ROI_X, uint16_t *ROI_Y);
charlesmn 0:1da5e4bcb8e5 578
charlesmn 0:1da5e4bcb8e5 579 /**
charlesmn 0:1da5e4bcb8e5 580 * @brief This function programs a new signal threshold in kcps (default=1024 kcps\n
charlesmn 0:1da5e4bcb8e5 581 */
charlesmn 0:1da5e4bcb8e5 582 VL6180_ERROR VL53L1X_SetSignalThreshold(uint16_t signal);
charlesmn 0:1da5e4bcb8e5 583
charlesmn 0:1da5e4bcb8e5 584 /**
charlesmn 0:1da5e4bcb8e5 585 * @brief This function returns the current signal threshold in kcps
charlesmn 0:1da5e4bcb8e5 586 */
charlesmn 0:1da5e4bcb8e5 587 VL6180_ERROR VL53L1X_GetSignalThreshold(uint16_t *signal);
charlesmn 0:1da5e4bcb8e5 588
charlesmn 0:1da5e4bcb8e5 589 /**
charlesmn 0:1da5e4bcb8e5 590 * @brief This function programs a new sigma threshold in mm (default=15 mm)
charlesmn 0:1da5e4bcb8e5 591 */
charlesmn 0:1da5e4bcb8e5 592 VL6180_ERROR VL53L1X_SetSigmaThreshold(uint16_t sigma);
charlesmn 0:1da5e4bcb8e5 593
charlesmn 0:1da5e4bcb8e5 594 /**
charlesmn 0:1da5e4bcb8e5 595 * @brief This function returns the current sigma threshold in mm
charlesmn 0:1da5e4bcb8e5 596 */
charlesmn 0:1da5e4bcb8e5 597 VL6180_ERROR VL53L1X_GetSigmaThreshold(uint16_t *signal);
charlesmn 0:1da5e4bcb8e5 598
charlesmn 0:1da5e4bcb8e5 599 /**
charlesmn 0:1da5e4bcb8e5 600 * @brief This function performs the temperature calibration.
charlesmn 0:1da5e4bcb8e5 601 * It is recommended to call this function any time the temperature might have changed by more than 8 deg C
charlesmn 0:1da5e4bcb8e5 602 * without sensor ranging activity for an extended period.
charlesmn 0:1da5e4bcb8e5 603 */
charlesmn 0:1da5e4bcb8e5 604 VL6180_ERROR VL53L1X_StartTemperatureUpdate();
charlesmn 0:1da5e4bcb8e5 605
charlesmn 0:1da5e4bcb8e5 606 /**
charlesmn 0:1da5e4bcb8e5 607 * @brief Wait for device booted after chip enable (hardware standby)
charlesmn 0:1da5e4bcb8e5 608 * @par Function Description
charlesmn 0:1da5e4bcb8e5 609 * After Chip enable Application you can also simply wait at least 1ms to ensure device is ready
charlesmn 0:1da5e4bcb8e5 610 * @warning After device chip enable (gpio0) de-asserted user must wait gpio1 to get asserted (hardware standby).
charlesmn 0:1da5e4bcb8e5 611 * or wait at least 400usec prior to do any low level access or api call .
charlesmn 0:1da5e4bcb8e5 612 *
charlesmn 0:1da5e4bcb8e5 613 * This function implements polling for standby but you must ensure 400usec from chip enable passed\n
charlesmn 0:1da5e4bcb8e5 614 * @warning Calling this function if device is not fresh out of reset will result in an indefinite loop\n
charlesmn 0:1da5e4bcb8e5 615 *
charlesmn 0:1da5e4bcb8e5 616 * @param dev The device
charlesmn 0:1da5e4bcb8e5 617 * @return 0 on success
charlesmn 0:1da5e4bcb8e5 618 */
charlesmn 0:1da5e4bcb8e5 619 VL6180_ERROR vl6180_WaitDeviceBooted(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 620
charlesmn 0:1da5e4bcb8e5 621 VL6180_ERROR vl6180_InitData(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 622
charlesmn 0:1da5e4bcb8e5 623 VL6180_ERROR vl6180_DMaxSetState(VL6180Dev_t dev, int state);
charlesmn 0:1da5e4bcb8e5 624
charlesmn 0:1da5e4bcb8e5 625 VL6180_ERROR vl6180_UpscaleGetScaling(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 626
charlesmn 0:1da5e4bcb8e5 627 VL6180_ERROR vl6180_FilterGetState(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 628
charlesmn 0:1da5e4bcb8e5 629 /**
charlesmn 0:1da5e4bcb8e5 630 * @brief Prepare device for operation
charlesmn 0:1da5e4bcb8e5 631 * @par Function Description
charlesmn 0:1da5e4bcb8e5 632 * Does static initialization and reprogram common default settings \n
charlesmn 0:1da5e4bcb8e5 633 * Device is prepared for new measure, ready single shot ranging typical polling operation\n
charlesmn 0:1da5e4bcb8e5 634 * After prepare user can : \n
charlesmn 0:1da5e4bcb8e5 635 * @li Call other API function to set other settings\n
charlesmn 0:1da5e4bcb8e5 636 * @li Configure the interrupt pins, etc... \n
charlesmn 0:1da5e4bcb8e5 637 * @li Then start ranging operations in single shot or continuous mode
charlesmn 0:1da5e4bcb8e5 638 *
charlesmn 0:1da5e4bcb8e5 639 * @param dev The device
charlesmn 0:1da5e4bcb8e5 640 * @return 0 on success
charlesmn 0:1da5e4bcb8e5 641 */
charlesmn 0:1da5e4bcb8e5 642 VL6180_ERROR vl6180_Prepare(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 643
charlesmn 0:1da5e4bcb8e5 644 /**
charlesmn 0:1da5e4bcb8e5 645 * @brief Single shot Range measurement in polling mode.
charlesmn 0:1da5e4bcb8e5 646 *
charlesmn 0:1da5e4bcb8e5 647 * @par Function Description
charlesmn 0:1da5e4bcb8e5 648 * Kick off a new single shot range then wait for ready to retrieve it by polling interrupt status \n
charlesmn 0:1da5e4bcb8e5 649 * 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 650 * This function reference VL6180_PollDelay(dev) porting macro/call on each polling loop,
charlesmn 0:1da5e4bcb8e5 651 * but PollDelay(dev) may never be called if measure in ready on first poll loop \n
charlesmn 0:1da5e4bcb8e5 652 * Should not be use in continuous mode operation as it will stop it and cause stop/start misbehaviour \n
charlesmn 0:1da5e4bcb8e5 653 * \n This function clears Range Interrupt status , but not error one. For that uses @a VL6180_ClearErrorInterrupt() \n
charlesmn 0:1da5e4bcb8e5 654 * This range error is not related VL6180_RangeData_t::errorStatus that refer measure status \n
charlesmn 0:1da5e4bcb8e5 655 *
charlesmn 0:1da5e4bcb8e5 656 * @param dev The device
charlesmn 0:1da5e4bcb8e5 657 * @param pRangeData Will be populated with the result ranging data @a VL6180_RangeData_t
charlesmn 0:1da5e4bcb8e5 658 * @return 0 on success , @a #RANGE_ERROR if device reports an error case in it status (not cleared) use
charlesmn 0:1da5e4bcb8e5 659 *
charlesmn 0:1da5e4bcb8e5 660 * \sa ::VL6180_RangeData_t
charlesmn 0:1da5e4bcb8e5 661 */
charlesmn 0:1da5e4bcb8e5 662 VL6180_ERROR vl6180_RangePollMeasurement(VL6180Dev_t dev, VL6180_RangeData_t *pRangeData);
charlesmn 0:1da5e4bcb8e5 663
charlesmn 0:1da5e4bcb8e5 664 /**************************************************************************/
charlesmn 0:1da5e4bcb8e5 665
charlesmn 0:1da5e4bcb8e5 666 VL6180_ERROR VL6180_I2CWrite(uint8_t dev, uint16_t index, uint8_t *data, uint16_t number_of_bytes);
charlesmn 0:1da5e4bcb8e5 667 VL6180_ERROR VL6180_I2CRead(uint8_t dev, uint16_t index, uint8_t *data, uint16_t number_of_bytes);
charlesmn 0:1da5e4bcb8e5 668
charlesmn 0:1da5e4bcb8e5 669
charlesmn 0:1da5e4bcb8e5 670
charlesmn 0:1da5e4bcb8e5 671 VL6180_ERROR vl6180_RangeStartContinuousMode(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 672
charlesmn 0:1da5e4bcb8e5 673 VL6180_ERROR vl6180_RangeStartSingleShot(VL6180Dev_t dev);
charlesmn 0:1da5e4bcb8e5 674
charlesmn 0:1da5e4bcb8e5 675 VL6180_ERROR vl6180_RangeSetInterMeasPeriod(VL6180Dev_t dev, uint32_t InterMeasTime_msec);
charlesmn 0:1da5e4bcb8e5 676
charlesmn 0:1da5e4bcb8e5 677 VL6180_ERROR vl6180_RangeGetMeasurement(VL6180Dev_t dev, VL6180_RangeData_t *pRangeData);
charlesmn 0:1da5e4bcb8e5 678
charlesmn 0:1da5e4bcb8e5 679 VL6180_ERROR vl6180_RangeGetMeasurementIfReady(VL6180Dev_t dev, VL6180_RangeData_t *pRangeData);
charlesmn 0:1da5e4bcb8e5 680
charlesmn 0:1da5e4bcb8e5 681 VL6180_ERROR vl6180_SetupGPIO1(VL6180Dev_t dev, uint8_t IntFunction, int ActiveHigh);
charlesmn 0:1da5e4bcb8e5 682
charlesmn 0:1da5e4bcb8e5 683 VL6180_ERROR vl6180_RangeConfigInterrupt(VL6180Dev_t dev, uint8_t ConfigGpioInt);
charlesmn 0:1da5e4bcb8e5 684
charlesmn 0:1da5e4bcb8e5 685 VL6180_ERROR vl6180_ClearInterrupt(VL6180Dev_t dev, uint8_t IntClear);
charlesmn 0:1da5e4bcb8e5 686
charlesmn 0:1da5e4bcb8e5 687 VL6180_ERROR vl6180_RangeSetThresholds(VL6180Dev_t dev, uint16_t low, uint16_t high, int UseSafeParamHold);
charlesmn 0:1da5e4bcb8e5 688
charlesmn 0:1da5e4bcb8e5 689 VL6180_ERROR vl6180_FilterSetState(VL6180Dev_t dev, int state);
charlesmn 0:1da5e4bcb8e5 690
charlesmn 0:1da5e4bcb8e5 691 VL6180_ERROR vl6180_UpscaleSetScaling(VL6180Dev_t dev, uint8_t scaling);
charlesmn 0:1da5e4bcb8e5 692
charlesmn 0:1da5e4bcb8e5 693 protected:
charlesmn 0:1da5e4bcb8e5 694
charlesmn 0:1da5e4bcb8e5 695 /* IO Device */
charlesmn 0:1da5e4bcb8e5 696 vl6180_DevI2C *dev_i2c;
charlesmn 0:1da5e4bcb8e5 697
charlesmn 0:1da5e4bcb8e5 698 /* Digital out pin */
charlesmn 0:1da5e4bcb8e5 699 DigitalOut *_gpio0;
charlesmn 0:1da5e4bcb8e5 700 /* GPIO expander */
charlesmn 0:1da5e4bcb8e5 701 Stmpe1600DigiOut *_expgpio0;
charlesmn 0:1da5e4bcb8e5 702 /* Measure detection IRQ */
charlesmn 0:1da5e4bcb8e5 703 InterruptIn *_gpio1Int;
charlesmn 0:1da5e4bcb8e5 704
charlesmn 0:1da5e4bcb8e5 705 ///* Digital out pin */
charlesmn 0:1da5e4bcb8e5 706 //int gpio0;
charlesmn 0:1da5e4bcb8e5 707 //int gpio1Int;
charlesmn 0:1da5e4bcb8e5 708 /* Device data */
charlesmn 0:1da5e4bcb8e5 709 // VL53L1_DEV_t MyDevice;
charlesmn 0:1da5e4bcb8e5 710 // VL53L1_DEV Device;
charlesmn 0:1da5e4bcb8e5 711 VL6180Dev_t MyDevice;
charlesmn 0:1da5e4bcb8e5 712 MyVL6180Dev_t Device;
charlesmn 0:1da5e4bcb8e5 713 };
charlesmn 0:1da5e4bcb8e5 714
charlesmn 0:1da5e4bcb8e5 715
charlesmn 0:1da5e4bcb8e5 716 #endif /* _VL6180_CLASS_H_ */