use VL6180XA1 chip wothout X-NUCLEO-6180XA1 Board. Simple way to use the chip.

Dependents:   Check_VL6180XA1_ToF

Fork of X_NUCLEO_6180XA1 by ST

Committer:
kenjiArai
Date:
Sun Jan 28 02:07:05 2018 +0000
Revision:
59:81afbb75311d
Parent:
Components/VL6180X/VL6180X.h@58:1e9a3a46f814
Child:
60:972b4898a007
use VL6180XA1 chip wothout  X-NUCLEO-6180XA1 Board. Simple way to use the chip.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Davidroid 57:fa4c622b04a7 1 /**
Davidroid 57:fa4c622b04a7 2 ******************************************************************************
Davidroid 57:fa4c622b04a7 3 * @file VL6180X.h
Davidroid 57:fa4c622b04a7 4 * @author AST / EST
Davidroid 57:fa4c622b04a7 5 * @version V0.0.1
Davidroid 57:fa4c622b04a7 6 * @date 9-November-2015
Davidroid 57:fa4c622b04a7 7 * @brief Header file for component VL6180X
Davidroid 57:fa4c622b04a7 8 ******************************************************************************
Davidroid 57:fa4c622b04a7 9 * @attention
Davidroid 57:fa4c622b04a7 10 *
Davidroid 57:fa4c622b04a7 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Davidroid 57:fa4c622b04a7 12 *
Davidroid 57:fa4c622b04a7 13 * Redistribution and use in source and binary forms, with or without modification,
Davidroid 57:fa4c622b04a7 14 * are permitted provided that the following conditions are met:
Davidroid 57:fa4c622b04a7 15 * 1. Redistributions of source code must retain the above copyright notice,
Davidroid 57:fa4c622b04a7 16 * this list of conditions and the following disclaimer.
Davidroid 57:fa4c622b04a7 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
Davidroid 57:fa4c622b04a7 18 * this list of conditions and the following disclaimer in the documentation
Davidroid 57:fa4c622b04a7 19 * and/or other materials provided with the distribution.
Davidroid 57:fa4c622b04a7 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Davidroid 57:fa4c622b04a7 21 * may be used to endorse or promote products derived from this software
Davidroid 57:fa4c622b04a7 22 * without specific prior written permission.
Davidroid 57:fa4c622b04a7 23 *
Davidroid 57:fa4c622b04a7 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Davidroid 57:fa4c622b04a7 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Davidroid 57:fa4c622b04a7 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Davidroid 57:fa4c622b04a7 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Davidroid 57:fa4c622b04a7 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Davidroid 57:fa4c622b04a7 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Davidroid 57:fa4c622b04a7 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Davidroid 57:fa4c622b04a7 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Davidroid 57:fa4c622b04a7 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Davidroid 57:fa4c622b04a7 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Davidroid 57:fa4c622b04a7 34 *
Davidroid 57:fa4c622b04a7 35 ******************************************************************************
Davidroid 57:fa4c622b04a7 36 */
Davidroid 57:fa4c622b04a7 37
kenjiArai 59:81afbb75311d 38 //------- January 28th, 2018 by JH1PJL / K.Arai --------------------------------
kenjiArai 59:81afbb75311d 39 // Change X_NUCLEO_6180XA1 library to 6180XA1_simple library
kenjiArai 59:81afbb75311d 40 // modified -> VL6180X.h
kenjiArai 59:81afbb75311d 41 // only MY_LOG in vl6180x_platform.h and VL6180X.cpp
kenjiArai 59:81afbb75311d 42 // deleted -> Components directory, ST_INTERFACES Lib.,
kenjiArai 59:81afbb75311d 43 // SX_NUCLEO_COMMON Lib. and X_NUCLEO_COMMON lib.
kenjiArai 59:81afbb75311d 44 // except following files
kenjiArai 59:81afbb75311d 45 // moved -> Component.h, DevI2C.h, LightSensor.h and RangSensor.h
kenjiArai 59:81afbb75311d 46 //------------------------------------------------------------------------------
Davidroid 57:fa4c622b04a7 47
Davidroid 57:fa4c622b04a7 48 #ifndef __VL6180X_CLASS_H
Davidroid 57:fa4c622b04a7 49 #define __VL6180X_CLASS_H
Davidroid 57:fa4c622b04a7 50
Davidroid 57:fa4c622b04a7 51 /* Includes ------------------------------------------------------------------*/
Davidroid 57:fa4c622b04a7 52 #include "RangeSensor.h"
Davidroid 57:fa4c622b04a7 53 #include "LightSensor.h"
kenjiArai 59:81afbb75311d 54 #include "DevI2C.h"
Davidroid 57:fa4c622b04a7 55 #include "vl6180x_cfg.h"
Davidroid 57:fa4c622b04a7 56 #include "vl6180x_def.h"
Davidroid 57:fa4c622b04a7 57 #include "vl6180x_types.h"
Davidroid 57:fa4c622b04a7 58 #include "vl6180x_platform.h"
Davidroid 57:fa4c622b04a7 59
Davidroid 57:fa4c622b04a7 60 /* Definitions ---------------------------------------------------------------*/
Davidroid 57:fa4c622b04a7 61
Davidroid 57:fa4c622b04a7 62 /**
Davidroid 57:fa4c622b04a7 63 * @brief Clear error interrupt
Davidroid 57:fa4c622b04a7 64 *
Davidroid 57:fa4c622b04a7 65 * @param dev The device
Davidroid 57:fa4c622b04a7 66 * @return 0 On success
Davidroid 57:fa4c622b04a7 67 */
Davidroid 57:fa4c622b04a7 68 #define VL6180X_ClearErrorInterrupt(dev) VL6180X_ClearInterrupt(dev, INTERRUPT_CLEAR_ERROR)
Davidroid 57:fa4c622b04a7 69
Davidroid 57:fa4c622b04a7 70 /**
Davidroid 57:fa4c622b04a7 71 * @brief Clear All interrupt causes (als+range+error)
Davidroid 57:fa4c622b04a7 72 *
Davidroid 57:fa4c622b04a7 73 * @param dev The device
Davidroid 57:fa4c622b04a7 74 * @return 0 On success
Davidroid 57:fa4c622b04a7 75 */
Davidroid 57:fa4c622b04a7 76 #define VL6180X_ClearAllInterrupt(dev) VL6180X_ClearInterrupt(dev, INTERRUPT_CLEAR_ERROR|INTERRUPT_CLEAR_RANGING|INTERRUPT_CLEAR_ALS)
Davidroid 57:fa4c622b04a7 77
Davidroid 57:fa4c622b04a7 78 /**
Davidroid 57:fa4c622b04a7 79 * Default device address
Davidroid 57:fa4c622b04a7 80 */
Davidroid 57:fa4c622b04a7 81 #define DEFAULT_DEVICE_ADDRESS 0x29
Davidroid 57:fa4c622b04a7 82
Davidroid 57:fa4c622b04a7 83 /* Types ---------------------------------------------------------------------*/
Davidroid 57:fa4c622b04a7 84
Davidroid 57:fa4c622b04a7 85 /* data struct containing range measure, light measure and type of error provided to the user
kenjiArai 59:81afbb75311d 86 in case of invalid data range_mm=0xFFFFFFFF and lux=0xFFFFFFFF */
kenjiArai 59:81afbb75311d 87 typedef struct MeasureData {
kenjiArai 59:81afbb75311d 88 uint32_t range_mm;
kenjiArai 59:81afbb75311d 89 uint32_t lux;
kenjiArai 59:81afbb75311d 90 uint32_t range_error;
kenjiArai 59:81afbb75311d 91 uint32_t als_error;
kenjiArai 59:81afbb75311d 92 uint32_t int_error;
Davidroid 57:fa4c622b04a7 93 } measure_data_t;
Davidroid 57:fa4c622b04a7 94
kenjiArai 59:81afbb75311d 95 /* sensor operating modes */
kenjiArai 59:81afbb75311d 96 typedef enum {
kenjiArai 59:81afbb75311d 97 range_single_shot_polling=1,
kenjiArai 59:81afbb75311d 98 als_single_shot_polling,
kenjiArai 59:81afbb75311d 99 range_continuous_polling,
kenjiArai 59:81afbb75311d 100 als_continuous_polling,
kenjiArai 59:81afbb75311d 101 range_continuous_interrupt,
kenjiArai 59:81afbb75311d 102 als_continuous_interrupt,
kenjiArai 59:81afbb75311d 103 interleaved_mode_interrupt,
kenjiArai 59:81afbb75311d 104 range_continuous_polling_low_threshold,
kenjiArai 59:81afbb75311d 105 range_continuous_polling_high_threshold,
kenjiArai 59:81afbb75311d 106 range_continuous_polling_out_of_window,
kenjiArai 59:81afbb75311d 107 als_continuous_polling_low_threshold,
kenjiArai 59:81afbb75311d 108 als_continuous_polling_high_threshold,
kenjiArai 59:81afbb75311d 109 als_continuous_polling_out_of_window,
kenjiArai 59:81afbb75311d 110 range_continuous_interrupt_low_threshold,
kenjiArai 59:81afbb75311d 111 range_continuous_interrupt_high_threshold,
kenjiArai 59:81afbb75311d 112 range_continuous_interrupt_out_of_window,
kenjiArai 59:81afbb75311d 113 als_continuous_interrupt_low_threshold,
kenjiArai 59:81afbb75311d 114 als_continuous_interrupt_high_threshold,
kenjiArai 59:81afbb75311d 115 als_continuous_interrupt_out_of_window,
kenjiArai 59:81afbb75311d 116 range_continuous_als_single_shot,
kenjiArai 59:81afbb75311d 117 range_single_shot_als_continuous,
Davidroid 57:fa4c622b04a7 118 } operating_mode_t;
Davidroid 57:fa4c622b04a7 119
Davidroid 57:fa4c622b04a7 120
Davidroid 57:fa4c622b04a7 121 /* Classes -------------------------------------------------------------------*/
Davidroid 57:fa4c622b04a7 122
Davidroid 57:fa4c622b04a7 123 /**
Davidroid 57:fa4c622b04a7 124 * Class representing a VL6180X sensor component
Davidroid 57:fa4c622b04a7 125 */
Davidroid 57:fa4c622b04a7 126 class VL6180X : public RangeSensor, public LightSensor
Davidroid 57:fa4c622b04a7 127 {
Davidroid 57:fa4c622b04a7 128 public:
Davidroid 57:fa4c622b04a7 129 /** Constructor 1 (DigitalOut)
Davidroid 57:fa4c622b04a7 130 * @param[in] &i2c device I2C to be used for communication
kenjiArai 59:81afbb75311d 131 * @param[in] pin Mbed DigitalOut PinName to be used as component GPIO_0 CE
Davidroid 57:fa4c622b04a7 132 * @param[in] &pin_gpio1 pin Mbed InterruptIn PinName to be used as component GPIO_1 INT
kenjiArai 59:81afbb75311d 133 * @param[in] DevAddr device address, 0x29 by default
Davidroid 57:fa4c622b04a7 134 */
kenjiArai 59:81afbb75311d 135 VL6180X(DevI2C &i2c, PinName ce_pin, PinName pin_gpio1, uint8_t DevAddr=DEFAULT_DEVICE_ADDRESS)
kenjiArai 59:81afbb75311d 136 : RangeSensor(), LightSensor(), _dev_i2c(&i2c), _gpio0(ce_pin) {
kenjiArai 59:81afbb75311d 137 _my_device.I2cAddr=DevAddr;
Davidroid 57:fa4c622b04a7 138 _my_device.Present=0;
Davidroid 57:fa4c622b04a7 139 _my_device.Ready=0;
Davidroid 57:fa4c622b04a7 140 _device=&_my_device;;
Davidroid 57:fa4c622b04a7 141 if (pin_gpio1 != NC) {
kenjiArai 59:81afbb75311d 142 _gpio1Int = new InterruptIn(pin_gpio1);
kenjiArai 59:81afbb75311d 143 } else {
kenjiArai 59:81afbb75311d 144 _gpio1Int = NULL;
kenjiArai 59:81afbb75311d 145 }
kenjiArai 59:81afbb75311d 146 init((void *)DevAddr);
kenjiArai 59:81afbb75311d 147 }
kenjiArai 59:81afbb75311d 148
Davidroid 57:fa4c622b04a7 149 /** Destructor
Davidroid 57:fa4c622b04a7 150 */
kenjiArai 59:81afbb75311d 151 virtual ~VL6180X() {
kenjiArai 59:81afbb75311d 152 if (_gpio1Int != NULL) {
kenjiArai 59:81afbb75311d 153 delete _gpio1Int;
kenjiArai 59:81afbb75311d 154 }
kenjiArai 59:81afbb75311d 155 }
kenjiArai 59:81afbb75311d 156
Davidroid 57:fa4c622b04a7 157 /* warning: VL6180X class inherits from GenericSensor, RangeSensor and LightSensor, that haven`t a destructor.
Davidroid 57:fa4c622b04a7 158 The warning should request to introduce a virtual destructor to make sure to delete the object */
Davidroid 57:fa4c622b04a7 159
kenjiArai 59:81afbb75311d 160 /*** Interface Methods ***/
kenjiArai 59:81afbb75311d 161 /*** High level API ***/
kenjiArai 59:81afbb75311d 162 /**
kenjiArai 59:81afbb75311d 163 * @brief PowerOn the sensor
kenjiArai 59:81afbb75311d 164 * @return void
kenjiArai 59:81afbb75311d 165 */
kenjiArai 59:81afbb75311d 166 /* turns on the sensor */
kenjiArai 59:81afbb75311d 167 void on(void) {
kenjiArai 59:81afbb75311d 168 _gpio0=1;
Davidroid 57:fa4c622b04a7 169 _my_device.I2cAddr=DEFAULT_DEVICE_ADDRESS;
kenjiArai 59:81afbb75311d 170 _my_device.Ready=0;
kenjiArai 59:81afbb75311d 171 }
Davidroid 57:fa4c622b04a7 172
kenjiArai 59:81afbb75311d 173 /**
kenjiArai 59:81afbb75311d 174 * @brief PowerOff the sensor
kenjiArai 59:81afbb75311d 175 * @return void
kenjiArai 59:81afbb75311d 176 */
Davidroid 57:fa4c622b04a7 177 /* turns off the sensor */
kenjiArai 59:81afbb75311d 178 void off(void) {
kenjiArai 59:81afbb75311d 179 _gpio0=0;
Davidroid 57:fa4c622b04a7 180 _my_device.I2cAddr=DEFAULT_DEVICE_ADDRESS;
kenjiArai 59:81afbb75311d 181 _my_device.Ready=0;
kenjiArai 59:81afbb75311d 182 }
kenjiArai 59:81afbb75311d 183
kenjiArai 59:81afbb75311d 184 /**
kenjiArai 59:81afbb75311d 185 * @brief Start the measure indicated by operating mode
kenjiArai 59:81afbb75311d 186 * @param[in] operating_mode specifies requested measure
kenjiArai 59:81afbb75311d 187 * @param[in] fptr specifies call back function must be !NULL in case of interrupt measure
kenjiArai 59:81afbb75311d 188 * @param[in] low specifies measure low threashold in Lux or in mm according to measure
kenjiArai 59:81afbb75311d 189 * @param[in] high specifies measure high threashold in Lux or in mm according to measure
kenjiArai 59:81afbb75311d 190 * @return 0 on Success
kenjiArai 59:81afbb75311d 191 */
Davidroid 57:fa4c622b04a7 192 int start_measurement(operating_mode_t operating_mode, void (*fptr)(void), uint16_t low, uint16_t high);
Davidroid 57:fa4c622b04a7 193
kenjiArai 59:81afbb75311d 194 /**
kenjiArai 59:81afbb75311d 195 * @brief Get results for the measure indicated by operating mode
kenjiArai 59:81afbb75311d 196 * @param[in] operating_mode specifies requested measure results
kenjiArai 59:81afbb75311d 197 * @param[out] Data pointer to the measure_data_t structure to read data in to
kenjiArai 59:81afbb75311d 198 * @return 0 on Success
kenjiArai 59:81afbb75311d 199 */
kenjiArai 59:81afbb75311d 200 int get_measurement(operating_mode_t operating_mode, measure_data_t *Data);
Davidroid 57:fa4c622b04a7 201
kenjiArai 59:81afbb75311d 202 /**
kenjiArai 59:81afbb75311d 203 * @brief Stop the currently running measure indicate by operating_mode
kenjiArai 59:81afbb75311d 204 * @param[in] operating_mode specifies requested measure to stop
kenjiArai 59:81afbb75311d 205 * @return 0 on Success
kenjiArai 59:81afbb75311d 206 */
Davidroid 57:fa4c622b04a7 207 int stop_measurement(operating_mode_t operating_mode);
kenjiArai 59:81afbb75311d 208
kenjiArai 59:81afbb75311d 209 /**
kenjiArai 59:81afbb75311d 210 * @brief Interrupt handling func to be called by user after an INT is occourred
kenjiArai 59:81afbb75311d 211 * @param[in] opeating_mode indicating the in progress measure
kenjiArai 59:81afbb75311d 212 * @param[out] Data pointer to the measure_data_t structure to read data in to
kenjiArai 59:81afbb75311d 213 * @return 0 on Success
kenjiArai 59:81afbb75311d 214 */
kenjiArai 59:81afbb75311d 215 int handle_irq(operating_mode_t operating_mode, measure_data_t *Data);
Davidroid 57:fa4c622b04a7 216
kenjiArai 59:81afbb75311d 217 /**
kenjiArai 59:81afbb75311d 218 * @brief Enable interrupt measure IRQ
kenjiArai 59:81afbb75311d 219 * @return 0 on Success
kenjiArai 59:81afbb75311d 220 */
kenjiArai 59:81afbb75311d 221 void enable_interrupt_measure_detection_irq(void) {
kenjiArai 59:81afbb75311d 222 if (_gpio1Int != NULL) {
kenjiArai 59:81afbb75311d 223 _gpio1Int->enable_irq();
kenjiArai 59:81afbb75311d 224 }
Davidroid 57:fa4c622b04a7 225 }
Davidroid 57:fa4c622b04a7 226
kenjiArai 59:81afbb75311d 227 /**
kenjiArai 59:81afbb75311d 228 * @brief Disable interrupt measure IRQ
kenjiArai 59:81afbb75311d 229 * @return 0 on Success
kenjiArai 59:81afbb75311d 230 */
kenjiArai 59:81afbb75311d 231 void disable_interrupt_measure_detection_irq(void) {
kenjiArai 59:81afbb75311d 232 if (_gpio1Int != NULL) {
kenjiArai 59:81afbb75311d 233 _gpio1Int->disable_irq();
kenjiArai 59:81afbb75311d 234 }
Davidroid 57:fa4c622b04a7 235 }
kenjiArai 59:81afbb75311d 236
kenjiArai 59:81afbb75311d 237 /*** End High level API ***/
kenjiArai 59:81afbb75311d 238
kenjiArai 59:81afbb75311d 239 /**
kenjiArai 59:81afbb75311d 240 * @brief Attach a function to call when an interrupt is detected, i.e. measurement is ready
kenjiArai 59:81afbb75311d 241 * @param[in] fptr pointer to call back function to be called whenever an interrupt occours
kenjiArai 59:81afbb75311d 242 * @return 0 on Success
kenjiArai 59:81afbb75311d 243 */
kenjiArai 59:81afbb75311d 244 void attach_interrupt_measure_detection_irq(void (*fptr)(void)) {
kenjiArai 59:81afbb75311d 245 if (_gpio1Int != NULL) {
kenjiArai 59:81afbb75311d 246 _gpio1Int->rise(fptr);
kenjiArai 59:81afbb75311d 247 }
Davidroid 57:fa4c622b04a7 248 }
kenjiArai 59:81afbb75311d 249
kenjiArai 59:81afbb75311d 250 /**
kenjiArai 59:81afbb75311d 251 * @brief Check the sensor presence
kenjiArai 59:81afbb75311d 252 * @return 1 when device is present
kenjiArai 59:81afbb75311d 253 */
kenjiArai 59:81afbb75311d 254 unsigned present() {
Davidroid 57:fa4c622b04a7 255 return _device->Present;
Davidroid 57:fa4c622b04a7 256 }
kenjiArai 59:81afbb75311d 257
kenjiArai 59:81afbb75311d 258 /** Wrapper functions */
kenjiArai 59:81afbb75311d 259 /** @defgroup api_init Init functions
kenjiArai 59:81afbb75311d 260 * @brief API init functions
kenjiArai 59:81afbb75311d 261 * @ingroup api_hl
kenjiArai 59:81afbb75311d 262 * @{
kenjiArai 59:81afbb75311d 263 */
kenjiArai 59:81afbb75311d 264 /**
kenjiArai 59:81afbb75311d 265 * @brief Wait for device booted after chip enable (hardware standby)
kenjiArai 59:81afbb75311d 266 * @par Function Description
kenjiArai 59:81afbb75311d 267 * After Chip enable Application you can also simply wait at least 1ms to ensure device is ready
kenjiArai 59:81afbb75311d 268 * @warning After device chip enable (_gpio0) de-asserted user must wait gpio1 to get asserted (hardware standby).
kenjiArai 59:81afbb75311d 269 * or wait at least 400usec prior to do any low level access or api call .
kenjiArai 59:81afbb75311d 270 *
kenjiArai 59:81afbb75311d 271 * This function implements polling for standby but you must ensure 400usec from chip enable passed\n
kenjiArai 59:81afbb75311d 272 * @warning if device get prepared @a VL6180X_Prepare() re-using these function can hold indefinitely\n
kenjiArai 59:81afbb75311d 273 *
kenjiArai 59:81afbb75311d 274 * @param void
kenjiArai 59:81afbb75311d 275 * @return 0 on success
kenjiArai 59:81afbb75311d 276 */
kenjiArai 59:81afbb75311d 277 int wait_device_booted() {
Davidroid 57:fa4c622b04a7 278 return VL6180X_WaitDeviceBooted(_device);
Davidroid 57:fa4c622b04a7 279 }
Davidroid 57:fa4c622b04a7 280
kenjiArai 59:81afbb75311d 281 /**
kenjiArai 59:81afbb75311d 282 *
kenjiArai 59:81afbb75311d 283 * @brief One time device initialization
kenjiArai 59:81afbb75311d 284 *
kenjiArai 59:81afbb75311d 285 * To be called once and only once after device is brought out of reset (Chip enable) and booted see @a VL6180X_WaitDeviceBooted()
kenjiArai 59:81afbb75311d 286 *
kenjiArai 59:81afbb75311d 287 * @par Function Description
kenjiArai 59:81afbb75311d 288 * When not used after a fresh device "power up" or reset, it may return @a #CALIBRATION_WARNING
kenjiArai 59:81afbb75311d 289 * meaning wrong calibration data may have been fetched from device that can result in ranging offset error\n
kenjiArai 59:81afbb75311d 290 * If application cannot execute device reset or need to run VL6180X_InitData multiple time
kenjiArai 59:81afbb75311d 291 * then it must ensure proper offset calibration saving and restore on its own
kenjiArai 59:81afbb75311d 292 * by using @a VL6180X_GetOffsetCalibrationData() on first power up and then @a VL6180X_SetOffsetCalibrationData() all all subsequent init
kenjiArai 59:81afbb75311d 293 *
kenjiArai 59:81afbb75311d 294 * @param void
kenjiArai 59:81afbb75311d 295 * @return 0 on success, @a #CALIBRATION_WARNING if failed
kenjiArai 59:81afbb75311d 296 */
kenjiArai 59:81afbb75311d 297 virtual int init(void * NewAddr) {
kenjiArai 59:81afbb75311d 298 int status;
kenjiArai 59:81afbb75311d 299
kenjiArai 59:81afbb75311d 300 off();
kenjiArai 59:81afbb75311d 301 on();
Davidroid 57:fa4c622b04a7 302
kenjiArai 59:81afbb75311d 303 status=VL6180X_WaitDeviceBooted(_device);
kenjiArai 59:81afbb75311d 304 if(status) {
kenjiArai 59:81afbb75311d 305 VL6180X_ErrLog("WaitDeviceBooted fail\n\r");
kenjiArai 59:81afbb75311d 306 }
kenjiArai 59:81afbb75311d 307 status=IsPresent();
kenjiArai 59:81afbb75311d 308 if(!status) {
kenjiArai 59:81afbb75311d 309 _device->Present=1;
kenjiArai 59:81afbb75311d 310 VL6180X_InitData(_device);
kenjiArai 59:81afbb75311d 311 if(status) {
kenjiArai 59:81afbb75311d 312 printf("Failed to init VL6180X sensor!\n\r");
kenjiArai 59:81afbb75311d 313 return status;
kenjiArai 59:81afbb75311d 314 }
kenjiArai 59:81afbb75311d 315 status=prepare();
kenjiArai 59:81afbb75311d 316 if(status) {
kenjiArai 59:81afbb75311d 317 printf("Failed to prepare VL6180X!\n\r");
kenjiArai 59:81afbb75311d 318 return status;
kenjiArai 59:81afbb75311d 319 }
kenjiArai 59:81afbb75311d 320 if(*(uint8_t*)NewAddr!=DEFAULT_DEVICE_ADDRESS) {
kenjiArai 59:81afbb75311d 321 status=set_i2c_address(*(uint8_t*)NewAddr);
kenjiArai 59:81afbb75311d 322 if(status) {
kenjiArai 59:81afbb75311d 323 printf("Failed to change I2C address!\n\r");
kenjiArai 59:81afbb75311d 324 return status;
kenjiArai 59:81afbb75311d 325 }
kenjiArai 59:81afbb75311d 326 }
kenjiArai 59:81afbb75311d 327 _device->Ready=1;
kenjiArai 59:81afbb75311d 328 }
kenjiArai 59:81afbb75311d 329 return status;
Davidroid 57:fa4c622b04a7 330 }
Davidroid 57:fa4c622b04a7 331
kenjiArai 59:81afbb75311d 332 /**
kenjiArai 59:81afbb75311d 333 * @brief Configure GPIO1 function and set polarity.
kenjiArai 59:81afbb75311d 334 * @par Function Description
kenjiArai 59:81afbb75311d 335 * To be used prior to arm single shot measure or start continuous mode.
kenjiArai 59:81afbb75311d 336 *
kenjiArai 59:81afbb75311d 337 * The function uses @a VL6180X_SetupGPIOx() for setting gpio 1.
kenjiArai 59:81afbb75311d 338 * @warning changing polarity can generate a spurious interrupt on pins.
kenjiArai 59:81afbb75311d 339 * It sets an interrupt flags condition that must be cleared to avoid polling hangs. \n
kenjiArai 59:81afbb75311d 340 * It is safe to run VL6180X_ClearAllInterrupt() just after.
kenjiArai 59:81afbb75311d 341 *
kenjiArai 59:81afbb75311d 342 * @param IntFunction The interrupt functionality to use one of :\n
kenjiArai 59:81afbb75311d 343 * @a #GPIOx_SELECT_OFF \n
kenjiArai 59:81afbb75311d 344 * @a #GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT
kenjiArai 59:81afbb75311d 345 * @param ActiveHigh The interrupt line polarity see ::IntrPol_e
kenjiArai 59:81afbb75311d 346 * use @a #INTR_POL_LOW (falling edge) or @a #INTR_POL_HIGH (rising edge)
kenjiArai 59:81afbb75311d 347 * @return 0 on success
kenjiArai 59:81afbb75311d 348 */
kenjiArai 59:81afbb75311d 349 int setup_gpio_1(uint8_t InitFunction, int ActiveHigh) {
kenjiArai 59:81afbb75311d 350 return VL6180X_SetupGPIO1(_device, InitFunction, ActiveHigh);
Davidroid 57:fa4c622b04a7 351 }
Davidroid 57:fa4c622b04a7 352
kenjiArai 59:81afbb75311d 353 /**
kenjiArai 59:81afbb75311d 354 * @brief Prepare device for operation
kenjiArai 59:81afbb75311d 355 * @par Function Description
kenjiArai 59:81afbb75311d 356 * Does static initialization and reprogram common default settings \n
kenjiArai 59:81afbb75311d 357 * _device is prepared for new measure, ready single shot ranging or ALS typical polling operation\n
kenjiArai 59:81afbb75311d 358 * After prepare user can : \n
kenjiArai 59:81afbb75311d 359 * @li Call other API function to set other settings\n
kenjiArai 59:81afbb75311d 360 * @li Configure the interrupt pins, etc... \n
kenjiArai 59:81afbb75311d 361 * @li Then start ranging or ALS operations in single shot or continuous mode
kenjiArai 59:81afbb75311d 362 *
kenjiArai 59:81afbb75311d 363 * @param void
kenjiArai 59:81afbb75311d 364 * @return 0 on success
kenjiArai 59:81afbb75311d 365 */
kenjiArai 59:81afbb75311d 366 int prepare() {
kenjiArai 59:81afbb75311d 367 return VL6180X_Prepare(_device);
Davidroid 57:fa4c622b04a7 368 }
Davidroid 57:fa4c622b04a7 369
kenjiArai 59:81afbb75311d 370 /**
kenjiArai 59:81afbb75311d 371 * @brief Start continuous ranging mode
kenjiArai 59:81afbb75311d 372 *
kenjiArai 59:81afbb75311d 373 * @details End user should ensure device is in idle state and not already running
kenjiArai 59:81afbb75311d 374 * @return 0 on success
kenjiArai 59:81afbb75311d 375 */
kenjiArai 59:81afbb75311d 376 int range_start_continuous_mode() {
kenjiArai 59:81afbb75311d 377 return VL6180X_RangeStartContinuousMode(_device);
Davidroid 57:fa4c622b04a7 378 }
Davidroid 57:fa4c622b04a7 379
kenjiArai 59:81afbb75311d 380 /**
kenjiArai 59:81afbb75311d 381 * @brief Start single shot ranging measure
kenjiArai 59:81afbb75311d 382 *
kenjiArai 59:81afbb75311d 383 * @details End user should ensure device is in idle state and not already running
kenjiArai 59:81afbb75311d 384 * @return 0 on success
kenjiArai 59:81afbb75311d 385 */
kenjiArai 59:81afbb75311d 386 int range_start_single_shot() {
kenjiArai 59:81afbb75311d 387 return VL6180X_RangeStartSingleShot(_device);
kenjiArai 59:81afbb75311d 388 }
kenjiArai 59:81afbb75311d 389
kenjiArai 59:81afbb75311d 390 /**
kenjiArai 59:81afbb75311d 391 * @brief Set maximum convergence time
kenjiArai 59:81afbb75311d 392 *
kenjiArai 59:81afbb75311d 393 * @par Function Description
kenjiArai 59:81afbb75311d 394 * Setting a low convergence time can impact maximal detectable distance.
kenjiArai 59:81afbb75311d 395 * Refer to VL6180X Datasheet Table 7 : Typical range convergence time.
kenjiArai 59:81afbb75311d 396 * A typical value for up to x3 scaling is 50 ms
kenjiArai 59:81afbb75311d 397 *
kenjiArai 59:81afbb75311d 398 * @param MaxConTime_msec
kenjiArai 59:81afbb75311d 399 * @return 0 on success. <0 on error. >0 for calibration warning status
kenjiArai 59:81afbb75311d 400 */
kenjiArai 59:81afbb75311d 401 int range_set_max_convergence_time(uint8_t MaxConTime_msec) {
Davidroid 57:fa4c622b04a7 402 return VL6180X_RangeSetMaxConvergenceTime(_device, MaxConTime_msec);
Davidroid 57:fa4c622b04a7 403 }
Davidroid 57:fa4c622b04a7 404
kenjiArai 59:81afbb75311d 405 /**
kenjiArai 59:81afbb75311d 406 * @brief Single shot Range measurement in polling mode.
kenjiArai 59:81afbb75311d 407 *
kenjiArai 59:81afbb75311d 408 * @par Function Description
kenjiArai 59:81afbb75311d 409 * Kick off a new single shot range then wait for ready to retrieve it by polling interrupt status \n
kenjiArai 59:81afbb75311d 410 * Ranging must be prepared by a first call to @a VL6180X_Prepare() and it is safer to clear very first poll call \n
kenjiArai 59:81afbb75311d 411 * This function reference VL6180X_PollDelay(dev) porting macro/call on each polling loop,
kenjiArai 59:81afbb75311d 412 * but PollDelay(dev) may never be called if measure in ready on first poll loop \n
kenjiArai 59:81afbb75311d 413 * Should not be use in continuous mode operation as it will stop it and cause stop/start misbehaviour \n
kenjiArai 59:81afbb75311d 414 * \n This function clears Range Interrupt status , but not error one. For that uses @a VL6180X_ClearErrorInterrupt() \n
kenjiArai 59:81afbb75311d 415 * This range error is not related VL6180X_RangeData_t::errorStatus that refer measure status \n
kenjiArai 59:81afbb75311d 416 *
kenjiArai 59:81afbb75311d 417 * @param pRangeData Will be populated with the result ranging data @a VL6180X_RangeData_t
kenjiArai 59:81afbb75311d 418 * @return 0 on success , @a #RANGE_ERROR if device reports an error case in it status (not cleared) use
kenjiArai 59:81afbb75311d 419 *
kenjiArai 59:81afbb75311d 420 * \sa ::VL6180X_RangeData_t
kenjiArai 59:81afbb75311d 421 */
kenjiArai 59:81afbb75311d 422 int range_poll_measurement(VL6180X_RangeData_t *pRangeData) {
Davidroid 57:fa4c622b04a7 423 return VL6180X_RangePollMeasurement(_device, pRangeData);
Davidroid 57:fa4c622b04a7 424 }
Davidroid 57:fa4c622b04a7 425
kenjiArai 59:81afbb75311d 426 /**
kenjiArai 59:81afbb75311d 427 * @brief Check for measure readiness and get it if ready
kenjiArai 59:81afbb75311d 428 *
kenjiArai 59:81afbb75311d 429 * @par Function Description
kenjiArai 59:81afbb75311d 430 * Using this function is an alternative to @a VL6180X_RangePollMeasurement() to avoid polling operation. This is suitable for applications
kenjiArai 59:81afbb75311d 431 * where host CPU is triggered on a interrupt (not from VL6180X) to perform ranging operation. In this scenario, we assume that the very first ranging
kenjiArai 59:81afbb75311d 432 * operation is triggered by a call to @a VL6180X_RangeStartSingleShot(). Then, host CPU regularly calls @a VL6180X_RangeGetMeasurementIfReady() to
kenjiArai 59:81afbb75311d 433 * get a distance measure if ready. In case the distance is not ready, host may get it at the next call.\n
kenjiArai 59:81afbb75311d 434 *
kenjiArai 59:81afbb75311d 435 * @warning
kenjiArai 59:81afbb75311d 436 * This function does not re-start a new measurement : this is up to the host CPU to do it.\n
kenjiArai 59:81afbb75311d 437 * This function clears Range Interrupt for measure ready , but not error interrupts. For that, uses @a VL6180X_ClearErrorInterrupt() \n
kenjiArai 59:81afbb75311d 438 *
kenjiArai 59:81afbb75311d 439 * @param pRangeData Will be populated with the result ranging data if available
kenjiArai 59:81afbb75311d 440 * @return 0 when measure is ready pRange data is updated (untouched when not ready), >0 for warning and @a #NOT_READY if measurement not yet ready, <0 for error @a #RANGE_ERROR if device report an error,
kenjiArai 59:81afbb75311d 441 */
kenjiArai 59:81afbb75311d 442 int _range_get_measurement_if_ready(VL6180X_RangeData_t *pRangeData) {
Davidroid 57:fa4c622b04a7 443 return VL6180X_RangeGetMeasurementIfReady(_device, pRangeData);
Davidroid 57:fa4c622b04a7 444 }
Davidroid 57:fa4c622b04a7 445
kenjiArai 59:81afbb75311d 446 /**
kenjiArai 59:81afbb75311d 447 * @brief Retrieve range measurements set from device
kenjiArai 59:81afbb75311d 448 *
kenjiArai 59:81afbb75311d 449 * @par Function Description
kenjiArai 59:81afbb75311d 450 * The measurement is made of range_mm status and error code @a VL6180X_RangeData_t \n
kenjiArai 59:81afbb75311d 451 * Based on configuration selected extra measures are included.
kenjiArai 59:81afbb75311d 452 *
kenjiArai 59:81afbb75311d 453 * @warning should not be used in continuous if wrap around filter is active \n
kenjiArai 59:81afbb75311d 454 * Does not perform any wait nor check for result availability or validity.
kenjiArai 59:81afbb75311d 455 *\sa VL6180X_RangeGetResult for "range only" measurement
kenjiArai 59:81afbb75311d 456 *
kenjiArai 59:81afbb75311d 457 * @param pRangeData Pointer to the data structure to fill up
kenjiArai 59:81afbb75311d 458 * @return 0 on success
kenjiArai 59:81afbb75311d 459 */
kenjiArai 59:81afbb75311d 460 int range_get_measurement(VL6180X_RangeData_t *pRangeData) {
Davidroid 57:fa4c622b04a7 461 return VL6180X_RangeGetMeasurement(_device, pRangeData);
Davidroid 57:fa4c622b04a7 462 }
Davidroid 57:fa4c622b04a7 463
kenjiArai 59:81afbb75311d 464 /**
kenjiArai 59:81afbb75311d 465 * @brief Get a single distance measure result
kenjiArai 59:81afbb75311d 466 *
kenjiArai 59:81afbb75311d 467 * @par Function Description
kenjiArai 59:81afbb75311d 468 * It can be called after having initialized a component. It start a single
kenjiArai 59:81afbb75311d 469 * distance measure in polling mode and wait until the measure is finisched.
kenjiArai 59:81afbb75311d 470 * The function block until the measure is finished, it can blocks indefinitely
kenjiArai 59:81afbb75311d 471 * in case the measure never ends for any reason \n
kenjiArai 59:81afbb75311d 472 *
kenjiArai 59:81afbb75311d 473 * @param pi_data Pointer to distance
kenjiArai 59:81afbb75311d 474 * @return 0 on success
kenjiArai 59:81afbb75311d 475 */
kenjiArai 59:81afbb75311d 476 virtual int get_distance(uint32_t *pi_data) {
kenjiArai 59:81afbb75311d 477 int status=0;
Davidroid 57:fa4c622b04a7 478 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 479 status=start_measurement(range_single_shot_polling, NULL, NULL, NULL);
Davidroid 57:fa4c622b04a7 480 if (!status) {
kenjiArai 59:81afbb75311d 481 range_wait_device_ready(2000);
Davidroid 57:fa4c622b04a7 482 for (status=1; status!=0; status=VL6180X_RangeGetResult(_device, pi_data));
Davidroid 57:fa4c622b04a7 483 }
Davidroid 57:fa4c622b04a7 484 stop_measurement(range_single_shot_polling);
Davidroid 57:fa4c622b04a7 485 range_wait_device_ready(2000);
Davidroid 57:fa4c622b04a7 486 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 487
Davidroid 57:fa4c622b04a7 488 return status;
Davidroid 57:fa4c622b04a7 489 }
kenjiArai 59:81afbb75311d 490
kenjiArai 59:81afbb75311d 491 /**
kenjiArai 59:81afbb75311d 492 * @brief Configure ranging interrupt reported to application
kenjiArai 59:81afbb75311d 493 *
kenjiArai 59:81afbb75311d 494 * @param ConfigGpioInt Select ranging report\n select one (and only one) of:\n
kenjiArai 59:81afbb75311d 495 * @a #CONFIG_GPIO_INTERRUPT_DISABLED \n
kenjiArai 59:81afbb75311d 496 * @a #CONFIG_GPIO_INTERRUPT_LEVEL_LOW \n
kenjiArai 59:81afbb75311d 497 * @a #CONFIG_GPIO_INTERRUPT_LEVEL_HIGH \n
kenjiArai 59:81afbb75311d 498 * @a #CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW \n
kenjiArai 59:81afbb75311d 499 * @a #CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY
kenjiArai 59:81afbb75311d 500 * @return 0 on success
kenjiArai 59:81afbb75311d 501 */
kenjiArai 59:81afbb75311d 502 int range_config_interrupt(uint8_t ConfigGpioInt) {
Davidroid 57:fa4c622b04a7 503 return VL6180X_RangeConfigInterrupt(_device, ConfigGpioInt);
Davidroid 57:fa4c622b04a7 504 }
Davidroid 57:fa4c622b04a7 505
kenjiArai 59:81afbb75311d 506 /**
kenjiArai 59:81afbb75311d 507 * @brief Return ranging error interrupt status
kenjiArai 59:81afbb75311d 508 *
kenjiArai 59:81afbb75311d 509 * @par Function Description
kenjiArai 59:81afbb75311d 510 * Appropriate Interrupt report must have been selected first by @a VL6180X_RangeConfigInterrupt() or @a VL6180X_Prepare() \n
kenjiArai 59:81afbb75311d 511 *
kenjiArai 59:81afbb75311d 512 * Can be used in polling loop to wait for a given ranging event or in interrupt to read the trigger \n
kenjiArai 59:81afbb75311d 513 * Events triggers are : \n
kenjiArai 59:81afbb75311d 514 * @a #RES_INT_STAT_GPIO_LOW_LEVEL_THRESHOLD \n
kenjiArai 59:81afbb75311d 515 * @a #RES_INT_STAT_GPIO_HIGH_LEVEL_THRESHOLD \n
kenjiArai 59:81afbb75311d 516 * @a #RES_INT_STAT_GPIO_OUT_OF_WINDOW \n (RES_INT_STAT_GPIO_LOW_LEVEL_THRESHOLD|RES_INT_STAT_GPIO_HIGH_LEVEL_THRESHOLD)
kenjiArai 59:81afbb75311d 517 * @a #RES_INT_STAT_GPIO_NEW_SAMPLE_READY \n
kenjiArai 59:81afbb75311d 518 *
kenjiArai 59:81afbb75311d 519 * @sa IntrStatus_t
kenjiArai 59:81afbb75311d 520 * @param pIntStatus Pointer to status variable to update
kenjiArai 59:81afbb75311d 521 * @return 0 on success
kenjiArai 59:81afbb75311d 522 */
kenjiArai 59:81afbb75311d 523 int range_get_interrupt_status(uint8_t *pIntStatus) {
Davidroid 57:fa4c622b04a7 524 return VL6180X_RangeGetInterruptStatus(_device, pIntStatus);
Davidroid 57:fa4c622b04a7 525 }
Davidroid 57:fa4c622b04a7 526
kenjiArai 59:81afbb75311d 527 /**
kenjiArai 59:81afbb75311d 528 * @brief Run a single ALS measurement in single shot polling mode
kenjiArai 59:81afbb75311d 529 *
kenjiArai 59:81afbb75311d 530 * @par Function Description
kenjiArai 59:81afbb75311d 531 * Kick off a new single shot ALS then wait new measurement ready to retrieve it ( polling system interrupt status register for als) \n
kenjiArai 59:81afbb75311d 532 * ALS must be prepared by a first call to @a VL6180X_Prepare() \n
kenjiArai 59:81afbb75311d 533 * \n Should not be used in continuous or interrupt mode it will break it and create hazard in start/stop \n
kenjiArai 59:81afbb75311d 534 *
kenjiArai 59:81afbb75311d 535 * @param dev The device
kenjiArai 59:81afbb75311d 536 * @param pAlsData Als data structure to fill up @a VL6180X_AlsData_t
kenjiArai 59:81afbb75311d 537 * @return 0 on success
kenjiArai 59:81afbb75311d 538 */
kenjiArai 59:81afbb75311d 539 int als_poll_measurement(VL6180X_AlsData_t *pAlsData) {
Davidroid 57:fa4c622b04a7 540 return VL6180X_AlsPollMeasurement(_device, pAlsData);
Davidroid 57:fa4c622b04a7 541 }
Davidroid 57:fa4c622b04a7 542
kenjiArai 59:81afbb75311d 543 /**
kenjiArai 59:81afbb75311d 544 * @brief Get actual ALS measurement
kenjiArai 59:81afbb75311d 545 *
kenjiArai 59:81afbb75311d 546 * @par Function Description
kenjiArai 59:81afbb75311d 547 * Can be called after success status polling or in interrupt mode to retrieve ALS measurement from device \n
kenjiArai 59:81afbb75311d 548 * This function doesn't perform any data ready check !
kenjiArai 59:81afbb75311d 549 *
kenjiArai 59:81afbb75311d 550 * @param pAlsData Pointer to measurement struct @a VL6180X_AlsData_t
kenjiArai 59:81afbb75311d 551 * @return 0 on success
kenjiArai 59:81afbb75311d 552 */
kenjiArai 59:81afbb75311d 553 int als_get_measurement(VL6180X_AlsData_t *pAlsData) {
Davidroid 57:fa4c622b04a7 554 return VL6180X_AlsGetMeasurement(_device, pAlsData);
Davidroid 57:fa4c622b04a7 555 }
Davidroid 57:fa4c622b04a7 556
kenjiArai 59:81afbb75311d 557 /**
kenjiArai 59:81afbb75311d 558 * @brief Configure ALS interrupts provide to application
kenjiArai 59:81afbb75311d 559 *
kenjiArai 59:81afbb75311d 560 * @param ConfigGpioInt Select one (and only one) of : \n
kenjiArai 59:81afbb75311d 561 * @a #CONFIG_GPIO_INTERRUPT_DISABLED \n
kenjiArai 59:81afbb75311d 562 * @a #CONFIG_GPIO_INTERRUPT_LEVEL_LOW \n
kenjiArai 59:81afbb75311d 563 * @a #CONFIG_GPIO_INTERRUPT_LEVEL_HIGH \n
kenjiArai 59:81afbb75311d 564 * @a #CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW \n
kenjiArai 59:81afbb75311d 565 * @a #CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY
kenjiArai 59:81afbb75311d 566 * @return 0 on success may return #INVALID_PARAMS for invalid mode
kenjiArai 59:81afbb75311d 567 */
kenjiArai 59:81afbb75311d 568 int als_config_interrupt(uint8_t ConfigGpioInt) {
Davidroid 57:fa4c622b04a7 569 return VL6180X_AlsConfigInterrupt(_device, ConfigGpioInt);
Davidroid 57:fa4c622b04a7 570 }
Davidroid 57:fa4c622b04a7 571
kenjiArai 59:81afbb75311d 572 /**
kenjiArai 59:81afbb75311d 573 * @brief Set ALS integration period
kenjiArai 59:81afbb75311d 574 *
kenjiArai 59:81afbb75311d 575 * @param period_ms Integration period in msec. Value in between 50 to 100 msec is recommended\n
kenjiArai 59:81afbb75311d 576 * @return 0 on success
kenjiArai 59:81afbb75311d 577 */
kenjiArai 59:81afbb75311d 578 int als_set_integration_period(uint16_t period_ms) {
kenjiArai 59:81afbb75311d 579 return VL6180X_AlsSetIntegrationPeriod(_device, period_ms);
Davidroid 57:fa4c622b04a7 580 }
Davidroid 57:fa4c622b04a7 581
kenjiArai 59:81afbb75311d 582 /**
kenjiArai 59:81afbb75311d 583 * @brief Set ALS "inter-measurement period"
kenjiArai 59:81afbb75311d 584 *
kenjiArai 59:81afbb75311d 585 * @par Function Description
kenjiArai 59:81afbb75311d 586 * The so call data-sheet "inter measurement period" is actually an extra inter-measurement delay
kenjiArai 59:81afbb75311d 587 *
kenjiArai 59:81afbb75311d 588 * @param intermeasurement_period_ms Inter measurement time in milli second\n
kenjiArai 59:81afbb75311d 589 * @warning applied value is clipped to 2550 ms\n
kenjiArai 59:81afbb75311d 590 * @return 0 on success if value is
kenjiArai 59:81afbb75311d 591 */
kenjiArai 59:81afbb75311d 592 int als_set_inter_measurement_period(uint16_t intermeasurement_period_ms) {
Davidroid 57:fa4c622b04a7 593 return VL6180X_AlsSetInterMeasurementPeriod(_device, intermeasurement_period_ms);
Davidroid 57:fa4c622b04a7 594 }
Davidroid 57:fa4c622b04a7 595
kenjiArai 59:81afbb75311d 596 /**
kenjiArai 59:81afbb75311d 597 * @brief Set ALS analog gain code
kenjiArai 59:81afbb75311d 598 *
kenjiArai 59:81afbb75311d 599 * @par Function Description
kenjiArai 59:81afbb75311d 600 * ALS gain code value programmed in @a SYSALS_ANALOGUE_GAIN .
kenjiArai 59:81afbb75311d 601 * @param gain Gain code see datasheet or AlsGainLookUp for real value. Value is clipped to 7.
kenjiArai 59:81afbb75311d 602 * @return 0 on success
kenjiArai 59:81afbb75311d 603 */
kenjiArai 59:81afbb75311d 604 int als_set_analogue_gain(uint8_t gain) {
Davidroid 57:fa4c622b04a7 605 return VL6180X_AlsSetAnalogueGain(_device, gain);
Davidroid 57:fa4c622b04a7 606 }
Davidroid 57:fa4c622b04a7 607
kenjiArai 59:81afbb75311d 608 /**
kenjiArai 59:81afbb75311d 609 * @brief Set thresholds for ALS continuous mode
kenjiArai 59:81afbb75311d 610 * @warning Threshold are raw device value not lux!
kenjiArai 59:81afbb75311d 611 *
kenjiArai 59:81afbb75311d 612 * @par Function Description
kenjiArai 59:81afbb75311d 613 * Basically value programmed in @a SYSALS_THRESH_LOW and @a SYSALS_THRESH_HIGH registers
kenjiArai 59:81afbb75311d 614 * @param low ALS low raw threshold for @a SYSALS_THRESH_LOW
kenjiArai 59:81afbb75311d 615 * @param high ALS high raw threshold for @a SYSALS_THRESH_HIGH
kenjiArai 59:81afbb75311d 616 * @return 0 on success
kenjiArai 59:81afbb75311d 617 */
Davidroid 57:fa4c622b04a7 618 int als_set_thresholds(uint16_t lux_threshold_low, uint16_t lux_threshold_high);
Davidroid 57:fa4c622b04a7 619
kenjiArai 59:81afbb75311d 620 /**
kenjiArai 59:81afbb75311d 621 * Read ALS interrupt status
kenjiArai 59:81afbb75311d 622 * @param pIntStatus Pointer to status
kenjiArai 59:81afbb75311d 623 * @return 0 on success
kenjiArai 59:81afbb75311d 624 */
kenjiArai 59:81afbb75311d 625 int als_get_interrupt_status(uint8_t *pIntStatus) {
Davidroid 57:fa4c622b04a7 626 return VL6180X_AlsGetInterruptStatus(_device, pIntStatus);
Davidroid 57:fa4c622b04a7 627 }
Davidroid 57:fa4c622b04a7 628
kenjiArai 59:81afbb75311d 629 /**
kenjiArai 59:81afbb75311d 630 * @brief Low level ranging and ALS register static settings (you should call @a VL6180X_Prepare() function instead)
kenjiArai 59:81afbb75311d 631 *
kenjiArai 59:81afbb75311d 632 * @return 0 on success
kenjiArai 59:81afbb75311d 633 */
kenjiArai 59:81afbb75311d 634 int static_init() {
Davidroid 57:fa4c622b04a7 635 return VL6180X_StaticInit(_device);
Davidroid 57:fa4c622b04a7 636 }
Davidroid 57:fa4c622b04a7 637
kenjiArai 59:81afbb75311d 638 /**
kenjiArai 59:81afbb75311d 639 * @brief Wait for device to be ready (before a new ranging command can be issued by application)
kenjiArai 59:81afbb75311d 640 * @param MaxLoop Max Number of i2c polling loop see @a #msec_2_i2cloop
kenjiArai 59:81afbb75311d 641 * @return 0 on success. <0 when fail \n
kenjiArai 59:81afbb75311d 642 * @ref VL6180X_ErrCode_t::TIME_OUT for time out \n
kenjiArai 59:81afbb75311d 643 * @ref VL6180X_ErrCode_t::INVALID_PARAMS if MaxLop<1
kenjiArai 59:81afbb75311d 644 */
kenjiArai 59:81afbb75311d 645 int range_wait_device_ready(int MaxLoop) {
Davidroid 57:fa4c622b04a7 646 return VL6180X_RangeWaitDeviceReady(_device, MaxLoop);
Davidroid 57:fa4c622b04a7 647 }
Davidroid 57:fa4c622b04a7 648
kenjiArai 59:81afbb75311d 649 /**
kenjiArai 59:81afbb75311d 650 * @brief Program Inter measurement period (used only in continuous mode)
kenjiArai 59:81afbb75311d 651 *
kenjiArai 59:81afbb75311d 652 * @par Function Description
kenjiArai 59:81afbb75311d 653 * When trying to set too long time, it returns #INVALID_PARAMS
kenjiArai 59:81afbb75311d 654 *
kenjiArai 59:81afbb75311d 655 * @param InterMeasTime_msec Requires inter-measurement time in msec
kenjiArai 59:81afbb75311d 656 * @return 0 on success
kenjiArai 59:81afbb75311d 657 */
kenjiArai 59:81afbb75311d 658 int range_set_inter_meas_period(uint32_t InterMeasTime_msec) {
Davidroid 57:fa4c622b04a7 659 return VL6180X_RangeSetInterMeasPeriod(_device, InterMeasTime_msec);
Davidroid 57:fa4c622b04a7 660 }
Davidroid 57:fa4c622b04a7 661
kenjiArai 59:81afbb75311d 662 /**
kenjiArai 59:81afbb75311d 663 * @brief Set device ranging scaling factor
kenjiArai 59:81afbb75311d 664 *
kenjiArai 59:81afbb75311d 665 * @par Function Description
kenjiArai 59:81afbb75311d 666 * The ranging scaling factor is applied on the raw distance measured by the device to increase operating ranging at the price of the precision.
kenjiArai 59:81afbb75311d 667 * Changing the scaling factor when device is not in f/w standby state (free running) is not safe.
kenjiArai 59:81afbb75311d 668 * It can be source of spurious interrupt, wrongly scaled range etc ...
kenjiArai 59:81afbb75311d 669 * @warning __This function doesns't update high/low threshold and other programmed settings linked to scaling factor__.
kenjiArai 59:81afbb75311d 670 * To ensure proper operation, threshold and scaling changes should be done following this procedure: \n
kenjiArai 59:81afbb75311d 671 * @li Set Group hold : @a VL6180X_SetGroupParamHold() \n
kenjiArai 59:81afbb75311d 672 * @li Get Threshold @a VL6180X_RangeGetThresholds() \n
kenjiArai 59:81afbb75311d 673 * @li Change scaling : @a VL6180X_UpscaleSetScaling() \n
kenjiArai 59:81afbb75311d 674 * @li Set Threshold : @a VL6180X_RangeSetThresholds() \n
kenjiArai 59:81afbb75311d 675 * @li Unset Group Hold : @a VL6180X_SetGroupParamHold()
kenjiArai 59:81afbb75311d 676 *
kenjiArai 59:81afbb75311d 677 * @param scaling Scaling factor to apply (1,2 or 3)
kenjiArai 59:81afbb75311d 678 * @return 0 on success when up-scale support is not configured it fail for any
kenjiArai 59:81afbb75311d 679 * scaling than the one statically configured.
kenjiArai 59:81afbb75311d 680 */
kenjiArai 59:81afbb75311d 681 int upscale_set_scaling(uint8_t scaling) {
Davidroid 57:fa4c622b04a7 682 return VL6180X_UpscaleSetScaling(_device, scaling);
Davidroid 57:fa4c622b04a7 683 }
Davidroid 57:fa4c622b04a7 684
kenjiArai 59:81afbb75311d 685 /**
kenjiArai 59:81afbb75311d 686 * @brief Get current ranging scaling factor
kenjiArai 59:81afbb75311d 687 *
kenjiArai 59:81afbb75311d 688 * @return The current scaling factor
kenjiArai 59:81afbb75311d 689 */
kenjiArai 59:81afbb75311d 690 int upscale_get_scaling() {
Davidroid 57:fa4c622b04a7 691 return VL6180X_UpscaleGetScaling(_device);
Davidroid 57:fa4c622b04a7 692 }
Davidroid 57:fa4c622b04a7 693
kenjiArai 59:81afbb75311d 694 /**
kenjiArai 59:81afbb75311d 695 * @brief Get the maximal distance for actual scaling
kenjiArai 59:81afbb75311d 696 * @par Function Description
kenjiArai 59:81afbb75311d 697 * Do not use prior to @a VL6180X_Prepare() or at least @a VL6180X_InitData()
kenjiArai 59:81afbb75311d 698 *
kenjiArai 59:81afbb75311d 699 * Any range value more than the value returned by this function is to be considered as "no target detected"
kenjiArai 59:81afbb75311d 700 * or "no target in detectable range" \n
kenjiArai 59:81afbb75311d 701 * @warning The maximal distance depends on the scaling
kenjiArai 59:81afbb75311d 702 *
kenjiArai 59:81afbb75311d 703 * @return The maximal range limit for actual mode and scaling
kenjiArai 59:81afbb75311d 704 */
kenjiArai 59:81afbb75311d 705 uint16_t get_upper_limit() {
Davidroid 57:fa4c622b04a7 706 return VL6180X_GetUpperLimit(_device);
Davidroid 57:fa4c622b04a7 707 }
Davidroid 57:fa4c622b04a7 708
kenjiArai 59:81afbb75311d 709 /**
kenjiArai 59:81afbb75311d 710 * @brief Apply low and high ranging thresholds that are considered only in continuous mode
kenjiArai 59:81afbb75311d 711 *
kenjiArai 59:81afbb75311d 712 * @par Function Description
kenjiArai 59:81afbb75311d 713 * This function programs low and high ranging thresholds that are considered in continuous mode :
kenjiArai 59:81afbb75311d 714 * interrupt will be raised only when an object is detected at a distance inside this [low:high] range.
kenjiArai 59:81afbb75311d 715 * The function takes care of applying current scaling factor if any.\n
kenjiArai 59:81afbb75311d 716 * To be safe, in continuous operation, thresholds must be changed under "group parameter hold" cover.
kenjiArai 59:81afbb75311d 717 * Group hold can be activated/deactivated directly in the function or externally (then set 0)
kenjiArai 59:81afbb75311d 718 * using /a VL6180X_SetGroupParamHold() function.
kenjiArai 59:81afbb75311d 719 *
kenjiArai 59:81afbb75311d 720 * @param low Low threshold in mm
kenjiArai 59:81afbb75311d 721 * @param high High threshold in mm
kenjiArai 59:81afbb75311d 722 * @param SafeHold Use of group parameters hold to surround threshold programming.
kenjiArai 59:81afbb75311d 723 * @return 0 On success
kenjiArai 59:81afbb75311d 724 */
kenjiArai 59:81afbb75311d 725 int range_set_thresholds(uint16_t low, uint16_t high, int SafeHold) {
Davidroid 57:fa4c622b04a7 726 return VL6180X_RangeSetThresholds(_device, low, high, SafeHold);
Davidroid 57:fa4c622b04a7 727 }
Davidroid 57:fa4c622b04a7 728
kenjiArai 59:81afbb75311d 729 /**
kenjiArai 59:81afbb75311d 730 * @brief Get scaled high and low threshold from device
kenjiArai 59:81afbb75311d 731 *
kenjiArai 59:81afbb75311d 732 * @par Function Description
kenjiArai 59:81afbb75311d 733 * Due to scaling factor, the returned value may be different from what has been programmed first (precision lost).
kenjiArai 59:81afbb75311d 734 * For instance VL6180X_RangeSetThresholds(dev,11,22) with scale 3
kenjiArai 59:81afbb75311d 735 * will read back 9 ((11/3)x3) and 21 ((22/3)x3).
kenjiArai 59:81afbb75311d 736 *
kenjiArai 59:81afbb75311d 737 * @param low scaled low Threshold ptr can be NULL if not needed
kenjiArai 59:81afbb75311d 738 * @param high scaled High Threshold ptr can be NULL if not needed
kenjiArai 59:81afbb75311d 739 * @return 0 on success, return value is undefined if both low and high are NULL
kenjiArai 59:81afbb75311d 740 * @warning return value is undefined if both low and high are NULL
kenjiArai 59:81afbb75311d 741 */
kenjiArai 59:81afbb75311d 742 int range_get_thresholds(uint16_t *low, uint16_t *high) {
Davidroid 57:fa4c622b04a7 743 return VL6180X_RangeGetThresholds(_device, low, high);
Davidroid 57:fa4c622b04a7 744 }
Davidroid 57:fa4c622b04a7 745
kenjiArai 59:81afbb75311d 746 /**
kenjiArai 59:81afbb75311d 747 * @brief Set ranging raw thresholds (scaling not considered so not recommended to use it)
kenjiArai 59:81afbb75311d 748 *
kenjiArai 59:81afbb75311d 749 * @param low raw low threshold set to raw register
kenjiArai 59:81afbb75311d 750 * @param high raw high threshold set to raw register
kenjiArai 59:81afbb75311d 751 * @return 0 on success
kenjiArai 59:81afbb75311d 752 */
kenjiArai 59:81afbb75311d 753 int range_set_raw_thresholds(uint8_t low, uint8_t high) {
Davidroid 57:fa4c622b04a7 754 return VL6180X_RangeSetRawThresholds(_device, low, high);
Davidroid 57:fa4c622b04a7 755 }
Davidroid 57:fa4c622b04a7 756
kenjiArai 59:81afbb75311d 757 /**
kenjiArai 59:81afbb75311d 758 * @brief Set Early Convergence Estimate ratio
kenjiArai 59:81afbb75311d 759 * @par Function Description
kenjiArai 59:81afbb75311d 760 * For more information on ECE check datasheet
kenjiArai 59:81afbb75311d 761 * @warning May return a calibration warning in some use cases
kenjiArai 59:81afbb75311d 762 *
kenjiArai 59:81afbb75311d 763 * @param FactorM ECE factor M in M/D
kenjiArai 59:81afbb75311d 764 * @param FactorD ECE factor D in M/D
kenjiArai 59:81afbb75311d 765 * @return 0 on success. <0 on error. >0 on warning
kenjiArai 59:81afbb75311d 766 */
kenjiArai 59:81afbb75311d 767 int range_set_ece_factor(uint16_t FactorM, uint16_t FactorD) {
Davidroid 57:fa4c622b04a7 768 return VL6180X_RangeSetEceFactor(_device, FactorM, FactorD);
Davidroid 57:fa4c622b04a7 769 }
Davidroid 57:fa4c622b04a7 770
kenjiArai 59:81afbb75311d 771 /**
kenjiArai 59:81afbb75311d 772 * @brief Set Early Convergence Estimate state (See #SYSRANGE_RANGE_CHECK_ENABLES register)
kenjiArai 59:81afbb75311d 773 * @param enable State to be set 0=disabled, otherwise enabled
kenjiArai 59:81afbb75311d 774 * @return 0 on success
kenjiArai 59:81afbb75311d 775 */
kenjiArai 59:81afbb75311d 776 int range_set_ece_state(int enable) {
Davidroid 57:fa4c622b04a7 777 return VL6180X_RangeSetEceState(_device, enable);
Davidroid 57:fa4c622b04a7 778 }
Davidroid 57:fa4c622b04a7 779
kenjiArai 59:81afbb75311d 780 /**
kenjiArai 59:81afbb75311d 781 * @brief Set activation state of the wrap around filter
kenjiArai 59:81afbb75311d 782 * @param state New activation state (0=off, otherwise on)
kenjiArai 59:81afbb75311d 783 * @return 0 on success
kenjiArai 59:81afbb75311d 784 */
kenjiArai 59:81afbb75311d 785 int flter_set_state(int state) {
Davidroid 57:fa4c622b04a7 786 return VL6180X_FilterSetState(_device, state);
Davidroid 57:fa4c622b04a7 787 }
Davidroid 57:fa4c622b04a7 788
kenjiArai 59:81afbb75311d 789 /**
kenjiArai 59:81afbb75311d 790 * Get activation state of the wrap around filter
kenjiArai 59:81afbb75311d 791 * @return Filter enabled or not, when filter is not supported it always returns 0S
kenjiArai 59:81afbb75311d 792 */
kenjiArai 59:81afbb75311d 793 int filter_get_state() {
Davidroid 57:fa4c622b04a7 794 return VL6180X_FilterGetState(_device);
Davidroid 57:fa4c622b04a7 795 }
Davidroid 57:fa4c622b04a7 796
kenjiArai 59:81afbb75311d 797 /**
kenjiArai 59:81afbb75311d 798 * @brief Set activation state of DMax computation
kenjiArai 59:81afbb75311d 799 * @param state New activation state (0=off, otherwise on)
kenjiArai 59:81afbb75311d 800 * @return 0 on success
kenjiArai 59:81afbb75311d 801 */
kenjiArai 59:81afbb75311d 802 int d_max_set_state(int state) {
Davidroid 57:fa4c622b04a7 803 return VL6180X_DMaxSetState(_device, state);
Davidroid 57:fa4c622b04a7 804 }
Davidroid 57:fa4c622b04a7 805
kenjiArai 59:81afbb75311d 806 /**
kenjiArai 59:81afbb75311d 807 * Get activation state of DMax computation
kenjiArai 59:81afbb75311d 808 * @return Filter enabled or not, when filter is not supported it always returns 0S
kenjiArai 59:81afbb75311d 809 */
kenjiArai 59:81afbb75311d 810 int d_max_get_state() {
Davidroid 57:fa4c622b04a7 811 return VL6180X_DMaxGetState(_device);
Davidroid 57:fa4c622b04a7 812 }
Davidroid 57:fa4c622b04a7 813
kenjiArai 59:81afbb75311d 814 /**
kenjiArai 59:81afbb75311d 815 * @brief Set ranging mode and start/stop measure (use high level functions instead : @a VL6180X_RangeStartSingleShot() or @a VL6180X_RangeStartContinuousMode())
kenjiArai 59:81afbb75311d 816 *
kenjiArai 59:81afbb75311d 817 * @par Function Description
kenjiArai 59:81afbb75311d 818 * When used outside scope of known polling single shot stopped state, \n
kenjiArai 59:81afbb75311d 819 * user must ensure the device state is "idle" before to issue a new command.
kenjiArai 59:81afbb75311d 820 *
kenjiArai 59:81afbb75311d 821 * @param mode A combination of working mode (#MODE_SINGLESHOT or #MODE_CONTINUOUS) and start/stop condition (#MODE_START_STOP) \n
kenjiArai 59:81afbb75311d 822 * @return 0 on success
kenjiArai 59:81afbb75311d 823 */
kenjiArai 59:81afbb75311d 824 int range_set_system_mode(uint8_t mode) {
Davidroid 57:fa4c622b04a7 825 return VL6180X_RangeSetSystemMode(_device, mode);
Davidroid 57:fa4c622b04a7 826 }
Davidroid 57:fa4c622b04a7 827
kenjiArai 59:81afbb75311d 828 /** @} */
kenjiArai 59:81afbb75311d 829
kenjiArai 59:81afbb75311d 830 /** @defgroup api_ll_range_calibration Ranging calibration functions
kenjiArai 59:81afbb75311d 831 * @brief Ranging calibration functions
kenjiArai 59:81afbb75311d 832 * @ingroup api_ll
kenjiArai 59:81afbb75311d 833 * @{
kenjiArai 59:81afbb75311d 834 */
kenjiArai 59:81afbb75311d 835 /**
kenjiArai 59:81afbb75311d 836 * @brief Get part to part calibration offset
kenjiArai 59:81afbb75311d 837 *
kenjiArai 59:81afbb75311d 838 * @par Function Description
kenjiArai 59:81afbb75311d 839 * Should only be used after a successful call to @a VL6180X_InitData to backup device nvm value
kenjiArai 59:81afbb75311d 840 *
kenjiArai 59:81afbb75311d 841 * @return part to part calibration offset from device
kenjiArai 59:81afbb75311d 842 */
kenjiArai 59:81afbb75311d 843 int8_t get_offset_calibration_data() {
Davidroid 57:fa4c622b04a7 844 return VL6180X_GetOffsetCalibrationData(_device);
Davidroid 57:fa4c622b04a7 845 }
Davidroid 57:fa4c622b04a7 846
kenjiArai 59:81afbb75311d 847 /**
kenjiArai 59:81afbb75311d 848 * Set or over-write part to part calibration offset
kenjiArai 59:81afbb75311d 849 * \sa VL6180X_InitData(), VL6180X_GetOffsetCalibrationData()
kenjiArai 59:81afbb75311d 850 * @param offset Offset
kenjiArai 59:81afbb75311d 851 */
kenjiArai 59:81afbb75311d 852 void set_offset_calibration_data(int8_t offset) {
Davidroid 57:fa4c622b04a7 853 return VL6180X_SetOffsetCalibrationData(_device, offset);
Davidroid 57:fa4c622b04a7 854 }
Davidroid 57:fa4c622b04a7 855
kenjiArai 59:81afbb75311d 856 /**
kenjiArai 59:81afbb75311d 857 * @brief Set Cross talk compensation rate
kenjiArai 59:81afbb75311d 858 *
kenjiArai 59:81afbb75311d 859 * @par Function Description
kenjiArai 59:81afbb75311d 860 * It programs register @a #SYSRANGE_CROSSTALK_COMPENSATION_RATE
kenjiArai 59:81afbb75311d 861 *
kenjiArai 59:81afbb75311d 862 * @param Rate Compensation rate (9.7 fix point) see datasheet for details
kenjiArai 59:81afbb75311d 863 * @return 0 on success
kenjiArai 59:81afbb75311d 864 */
kenjiArai 59:81afbb75311d 865 int set_x_talk_compensation_rate(FixPoint97_t Rate) {
Davidroid 57:fa4c622b04a7 866 return VL6180X_SetXTalkCompensationRate(_device, Rate);
Davidroid 57:fa4c622b04a7 867 }
kenjiArai 59:81afbb75311d 868 /** @} */
kenjiArai 59:81afbb75311d 869
kenjiArai 59:81afbb75311d 870 /** @defgroup api_ll_als ALS functions
kenjiArai 59:81afbb75311d 871 * @brief ALS functions
kenjiArai 59:81afbb75311d 872 * @ingroup api_ll
kenjiArai 59:81afbb75311d 873 * @{
kenjiArai 59:81afbb75311d 874 */
kenjiArai 59:81afbb75311d 875
kenjiArai 59:81afbb75311d 876 /**
kenjiArai 59:81afbb75311d 877 * @brief Wait for device to be ready for new als operation or max pollign loop (time out)
kenjiArai 59:81afbb75311d 878 * @param MaxLoop Max Number of i2c polling loop see @a #msec_2_i2cloop
kenjiArai 59:81afbb75311d 879 * @return 0 on success. <0 when @a VL6180X_ErrCode_t::TIME_OUT if timed out
kenjiArai 59:81afbb75311d 880 */
kenjiArai 59:81afbb75311d 881 int als_wait_device_ready(int MaxLoop) {
Davidroid 57:fa4c622b04a7 882 return VL6180X_AlsWaitDeviceReady(_device, MaxLoop);
Davidroid 57:fa4c622b04a7 883 }
kenjiArai 59:81afbb75311d 884
kenjiArai 59:81afbb75311d 885 /**
kenjiArai 59:81afbb75311d 886 * @brief Set ALS system mode and start/stop measure
kenjiArai 59:81afbb75311d 887 *
kenjiArai 59:81afbb75311d 888 * @warning When used outside after single shot polling, \n
kenjiArai 59:81afbb75311d 889 * User must ensure the device state is ready before issuing a new command (using @a VL6180X_AlsWaitDeviceReady()). \n
kenjiArai 59:81afbb75311d 890 * Non respect of this, can cause loss of interrupt or device hanging.
kenjiArai 59:81afbb75311d 891 *
kenjiArai 59:81afbb75311d 892 * @param mode A combination of working mode (#MODE_SINGLESHOT or #MODE_CONTINUOUS) and start condition (#MODE_START_STOP) \n
kenjiArai 59:81afbb75311d 893 * @return 0 on success
kenjiArai 59:81afbb75311d 894 */
kenjiArai 59:81afbb75311d 895 int als_set_system_mode(uint8_t mode) {
Davidroid 57:fa4c622b04a7 896 return VL6180X_AlsSetSystemMode(_device, mode);
Davidroid 57:fa4c622b04a7 897 }
Davidroid 57:fa4c622b04a7 898
kenjiArai 59:81afbb75311d 899 /** @defgroup api_ll_misc Misc functions
kenjiArai 59:81afbb75311d 900 * @brief Misc functions
kenjiArai 59:81afbb75311d 901 * @ingroup api_ll
kenjiArai 59:81afbb75311d 902 * @{
kenjiArai 59:81afbb75311d 903 */
Davidroid 57:fa4c622b04a7 904
kenjiArai 59:81afbb75311d 905 /**
kenjiArai 59:81afbb75311d 906 * Set Group parameter Hold state
kenjiArai 59:81afbb75311d 907 *
kenjiArai 59:81afbb75311d 908 * @par Function Description
kenjiArai 59:81afbb75311d 909 * Group parameter holds @a #SYSTEM_GROUPED_PARAMETER_HOLD enable safe update (non atomic across multiple measure) by host
kenjiArai 59:81afbb75311d 910 * \n The critical register group is composed of: \n
kenjiArai 59:81afbb75311d 911 * #SYSTEM_INTERRUPT_CONFIG_GPIO \n
kenjiArai 59:81afbb75311d 912 * #SYSRANGE_THRESH_HIGH \n
kenjiArai 59:81afbb75311d 913 * #SYSRANGE_THRESH_LOW \n
kenjiArai 59:81afbb75311d 914 * #SYSALS_INTEGRATION_PERIOD \n
kenjiArai 59:81afbb75311d 915 * #SYSALS_ANALOGUE_GAIN \n
kenjiArai 59:81afbb75311d 916 * #SYSALS_THRESH_HIGH \n
kenjiArai 59:81afbb75311d 917 * #SYSALS_THRESH_LOW
kenjiArai 59:81afbb75311d 918 *
kenjiArai 59:81afbb75311d 919 *
kenjiArai 59:81afbb75311d 920 * @param Hold Group parameter Hold state to be set (on/off)
kenjiArai 59:81afbb75311d 921 * @return 0 on success
kenjiArai 59:81afbb75311d 922 */
kenjiArai 59:81afbb75311d 923 int set_group_param_hold(int Hold) {
Davidroid 57:fa4c622b04a7 924 return VL6180X_SetGroupParamHold(_device, Hold);
kenjiArai 59:81afbb75311d 925 }
Davidroid 57:fa4c622b04a7 926
kenjiArai 59:81afbb75311d 927 /**
kenjiArai 59:81afbb75311d 928 * @brief Set new device i2c address
kenjiArai 59:81afbb75311d 929 *
kenjiArai 59:81afbb75311d 930 * After completion the device will answer to the new address programmed.
kenjiArai 59:81afbb75311d 931 *
kenjiArai 59:81afbb75311d 932 * @sa AN4478: Using multiple VL6180X's in a single design
kenjiArai 59:81afbb75311d 933 * @param NewAddr The new i2c address (7bit)
kenjiArai 59:81afbb75311d 934 * @return 0 on success
kenjiArai 59:81afbb75311d 935 */
kenjiArai 59:81afbb75311d 936 int set_i2c_address(int NewAddr) {
kenjiArai 59:81afbb75311d 937 int status;
kenjiArai 59:81afbb75311d 938
kenjiArai 59:81afbb75311d 939 status=VL6180X_SetI2CAddress(_device, NewAddr);
kenjiArai 59:81afbb75311d 940 if (!status) {
kenjiArai 59:81afbb75311d 941 _device->I2cAddr=NewAddr;
kenjiArai 59:81afbb75311d 942 }
Davidroid 57:fa4c622b04a7 943 return status;
Davidroid 57:fa4c622b04a7 944 }
Davidroid 57:fa4c622b04a7 945
kenjiArai 59:81afbb75311d 946 /**
kenjiArai 59:81afbb75311d 947 * @brief Fully configure gpio 0/1 pin : polarity and functionality
kenjiArai 59:81afbb75311d 948 *
kenjiArai 59:81afbb75311d 949 * @param pin gpio pin 0 or 1
kenjiArai 59:81afbb75311d 950 * @param IntFunction Pin functionality : either #GPIOx_SELECT_OFF or #GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT (refer to #SYSTEM_MODE_GPIO1 register definition)
kenjiArai 59:81afbb75311d 951 * @param ActiveHigh Set active high polarity, or active low see @a ::IntrPol_e
kenjiArai 59:81afbb75311d 952 * @return 0 on success
kenjiArai 59:81afbb75311d 953 */
kenjiArai 59:81afbb75311d 954 int setup_gpio_x(int pin, uint8_t IntFunction, int ActiveHigh) {
Davidroid 57:fa4c622b04a7 955 return VL6180X_SetupGPIOx(_device, pin, IntFunction, ActiveHigh);
Davidroid 57:fa4c622b04a7 956 }
Davidroid 57:fa4c622b04a7 957
kenjiArai 59:81afbb75311d 958 /**
kenjiArai 59:81afbb75311d 959 * @brief Set interrupt pin polarity for the given GPIO
kenjiArai 59:81afbb75311d 960 *
kenjiArai 59:81afbb75311d 961 * @param pin Pin 0 or 1
kenjiArai 59:81afbb75311d 962 * @param active_high select active high or low polarity using @ref IntrPol_e
kenjiArai 59:81afbb75311d 963 * @return 0 on success
kenjiArai 59:81afbb75311d 964 */
kenjiArai 59:81afbb75311d 965 int set_gpio_x_polarity(int pin, int active_high) {
Davidroid 57:fa4c622b04a7 966 return VL6180X_SetGPIOxPolarity(_device, pin, active_high);
Davidroid 57:fa4c622b04a7 967 }
Davidroid 57:fa4c622b04a7 968
kenjiArai 59:81afbb75311d 969 /**
kenjiArai 59:81afbb75311d 970 * Select interrupt functionality for the given GPIO
kenjiArai 59:81afbb75311d 971 *
kenjiArai 59:81afbb75311d 972 * @par Function Description
kenjiArai 59:81afbb75311d 973 * Functionality refer to @a SYSTEM_MODE_GPIO0
kenjiArai 59:81afbb75311d 974 *
kenjiArai 59:81afbb75311d 975 * @param pin Pin to configure 0 or 1 (_gpio0 or gpio1)\nNote that _gpio0 is chip enable at power up !
kenjiArai 59:81afbb75311d 976 * @param functionality Pin functionality : either #GPIOx_SELECT_OFF or #GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT (refer to #SYSTEM_MODE_GPIO1 register definition)
kenjiArai 59:81afbb75311d 977 * @return 0 on success
kenjiArai 59:81afbb75311d 978 */
kenjiArai 59:81afbb75311d 979 int set_gpio_x_functionality(int pin, uint8_t functionality) {
Davidroid 57:fa4c622b04a7 980 return VL6180X_SetGPIOxFunctionality(_device, pin, functionality);
Davidroid 57:fa4c622b04a7 981 }
Davidroid 57:fa4c622b04a7 982
kenjiArai 59:81afbb75311d 983 /**
kenjiArai 59:81afbb75311d 984 * #brief Disable and turn to Hi-Z gpio output pin
kenjiArai 59:81afbb75311d 985 *
kenjiArai 59:81afbb75311d 986 * @param pin The pin number to disable 0 or 1
kenjiArai 59:81afbb75311d 987 * @return 0 on success
kenjiArai 59:81afbb75311d 988 */
kenjiArai 59:81afbb75311d 989 int disable_gpio_x_out(int pin) {
Davidroid 57:fa4c622b04a7 990 return VL6180X_DisableGPIOxOut(_device, pin);
Davidroid 57:fa4c622b04a7 991 }
Davidroid 57:fa4c622b04a7 992
kenjiArai 59:81afbb75311d 993 /** @} */
kenjiArai 59:81afbb75311d 994
kenjiArai 59:81afbb75311d 995 /** @defgroup api_ll_intr Interrupts management functions
kenjiArai 59:81afbb75311d 996 * @brief Interrupts management functions
kenjiArai 59:81afbb75311d 997 * @ingroup api_ll
kenjiArai 59:81afbb75311d 998 * @{
kenjiArai 59:81afbb75311d 999 */
Davidroid 57:fa4c622b04a7 1000
kenjiArai 59:81afbb75311d 1001 /**
kenjiArai 59:81afbb75311d 1002 * @brief Get all interrupts cause
kenjiArai 59:81afbb75311d 1003 *
kenjiArai 59:81afbb75311d 1004 * @param status Ptr to interrupt status. You can use @a IntrStatus_t::val
kenjiArai 59:81afbb75311d 1005 * @return 0 on success
kenjiArai 59:81afbb75311d 1006 */
kenjiArai 59:81afbb75311d 1007 int get_interrupt_status(uint8_t *status) {
Davidroid 57:fa4c622b04a7 1008 return VL6180X_GetInterruptStatus(_device, status);
Davidroid 57:fa4c622b04a7 1009 }
Davidroid 57:fa4c622b04a7 1010
kenjiArai 59:81afbb75311d 1011 /**
kenjiArai 59:81afbb75311d 1012 * @brief Clear given system interrupt condition
kenjiArai 59:81afbb75311d 1013 *
kenjiArai 59:81afbb75311d 1014 * @par Function Description
kenjiArai 59:81afbb75311d 1015 * Clear given interrupt cause by writing into register #SYSTEM_INTERRUPT_CLEAR register.
kenjiArai 59:81afbb75311d 1016 * @param dev The device
kenjiArai 59:81afbb75311d 1017 * @param IntClear Which interrupt source to clear. Use any combinations of #INTERRUPT_CLEAR_RANGING , #INTERRUPT_CLEAR_ALS , #INTERRUPT_CLEAR_ERROR.
kenjiArai 59:81afbb75311d 1018 * @return 0 On success
kenjiArai 59:81afbb75311d 1019 */
kenjiArai 59:81afbb75311d 1020 int clear_interrupt(uint8_t IntClear) {
Davidroid 57:fa4c622b04a7 1021 return VL6180X_ClearInterrupt(_device, IntClear );
Davidroid 57:fa4c622b04a7 1022 }
Davidroid 57:fa4c622b04a7 1023
kenjiArai 59:81afbb75311d 1024 /** @} */
kenjiArai 59:81afbb75311d 1025
kenjiArai 59:81afbb75311d 1026 /**
kenjiArai 59:81afbb75311d 1027 * @brief Get a single light (in Lux) measure result
kenjiArai 59:81afbb75311d 1028 *
kenjiArai 59:81afbb75311d 1029 * @par Function Description
kenjiArai 59:81afbb75311d 1030 * It can be called after having initialized a component. It start a single
kenjiArai 59:81afbb75311d 1031 * light measure in polling mode and wait until the measure is finisched.
kenjiArai 59:81afbb75311d 1032 * The function block until the measure is finished, it can blocks indefinitely
kenjiArai 59:81afbb75311d 1033 * in case the measure never ends for any reason \n
kenjiArai 59:81afbb75311d 1034 */
kenjiArai 59:81afbb75311d 1035 virtual int get_lux(uint32_t *pi_data) {
kenjiArai 59:81afbb75311d 1036 int status=0;
Davidroid 57:fa4c622b04a7 1037 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 1038 status = start_measurement(als_single_shot_polling, NULL, NULL, NULL);
kenjiArai 59:81afbb75311d 1039 if (!status) {
kenjiArai 59:81afbb75311d 1040 als_wait_device_ready(2000);
Davidroid 57:fa4c622b04a7 1041 for (status=1; status!=0; status=VL6180X_AlsGetLux(_device, pi_data));
Davidroid 57:fa4c622b04a7 1042 }
Davidroid 57:fa4c622b04a7 1043 stop_measurement(als_single_shot_polling);
kenjiArai 59:81afbb75311d 1044 als_wait_device_ready(2000);
kenjiArai 59:81afbb75311d 1045 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1046
Davidroid 57:fa4c622b04a7 1047 return status;
Davidroid 57:fa4c622b04a7 1048 }
Davidroid 57:fa4c622b04a7 1049
kenjiArai 59:81afbb75311d 1050 /**
kenjiArai 59:81afbb75311d 1051 * @brief Start the ALS (light) measure in continous mode
kenjiArai 59:81afbb75311d 1052 *
kenjiArai 59:81afbb75311d 1053 * @par Function Description
kenjiArai 59:81afbb75311d 1054 * Start the ALS (light) measure in continous mode
kenjiArai 59:81afbb75311d 1055 * @return 0 On success
kenjiArai 59:81afbb75311d 1056 */
kenjiArai 59:81afbb75311d 1057 int als_start_continuous_mode() {
Davidroid 57:fa4c622b04a7 1058 return VL6180X_AlsSetSystemMode(_device, MODE_START_STOP|MODE_CONTINUOUS);
Davidroid 57:fa4c622b04a7 1059 }
Davidroid 57:fa4c622b04a7 1060
kenjiArai 59:81afbb75311d 1061 /**
kenjiArai 59:81afbb75311d 1062 * @brief Start the ALS (light) measure in single shot mode
kenjiArai 59:81afbb75311d 1063 *
kenjiArai 59:81afbb75311d 1064 * @par Function Description
kenjiArai 59:81afbb75311d 1065 * Start the ALS (light) measure in single shot mode
kenjiArai 59:81afbb75311d 1066 * @return 0 On success
kenjiArai 59:81afbb75311d 1067 */
kenjiArai 59:81afbb75311d 1068 int als_start_single_shot() {
Davidroid 57:fa4c622b04a7 1069 return VL6180X_AlsSetSystemMode(_device, MODE_START_STOP|MODE_SINGLESHOT);
Davidroid 57:fa4c622b04a7 1070 }
kenjiArai 59:81afbb75311d 1071
kenjiArai 59:81afbb75311d 1072 private:
Davidroid 57:fa4c622b04a7 1073 /* api.h functions */
Davidroid 57:fa4c622b04a7 1074 int VL6180X_WaitDeviceBooted(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1075 int VL6180X_InitData(VL6180XDev_t dev );
Davidroid 57:fa4c622b04a7 1076 int VL6180X_SetupGPIO1(VL6180XDev_t dev, uint8_t IntFunction, int ActiveHigh);
Davidroid 57:fa4c622b04a7 1077 int VL6180X_Prepare(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1078 int VL6180X_RangeStartContinuousMode(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1079 int VL6180X_RangeStartSingleShot(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1080 int VL6180X_RangeSetMaxConvergenceTime(VL6180XDev_t dev, uint8_t MaxConTime_msec);
Davidroid 57:fa4c622b04a7 1081 int VL6180X_RangePollMeasurement(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData);
Davidroid 57:fa4c622b04a7 1082 int VL6180X_RangeGetMeasurementIfReady(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData);
Davidroid 57:fa4c622b04a7 1083 int VL6180X_RangeGetMeasurement(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData);
Davidroid 57:fa4c622b04a7 1084 int VL6180X_RangeGetResult(VL6180XDev_t dev, uint32_t *pRange_mm);
Davidroid 57:fa4c622b04a7 1085 int VL6180X_RangeConfigInterrupt(VL6180XDev_t dev, uint8_t ConfigGpioInt);
Davidroid 57:fa4c622b04a7 1086 int VL6180X_RangeGetInterruptStatus(VL6180XDev_t dev, uint8_t *pIntStatus);
Davidroid 57:fa4c622b04a7 1087 int VL6180X_AlsPollMeasurement(VL6180XDev_t dev, VL6180X_AlsData_t *pAlsData);
Davidroid 57:fa4c622b04a7 1088 int VL6180X_AlsGetMeasurement(VL6180XDev_t dev, VL6180X_AlsData_t *pAlsData);
Davidroid 57:fa4c622b04a7 1089 int VL6180X_AlsConfigInterrupt(VL6180XDev_t dev, uint8_t ConfigGpioInt);
Davidroid 57:fa4c622b04a7 1090 int VL6180X_AlsSetIntegrationPeriod(VL6180XDev_t dev, uint16_t period_ms);
Davidroid 57:fa4c622b04a7 1091 int VL6180X_AlsSetInterMeasurementPeriod(VL6180XDev_t dev, uint16_t intermeasurement_period_ms);
Davidroid 57:fa4c622b04a7 1092 int VL6180X_AlsSetAnalogueGain(VL6180XDev_t dev, uint8_t gain);
Davidroid 57:fa4c622b04a7 1093 int VL6180X_AlsSetThresholds(VL6180XDev_t dev, uint16_t low, uint16_t high);
Davidroid 57:fa4c622b04a7 1094 int VL6180X_AlsGetInterruptStatus(VL6180XDev_t dev, uint8_t *pIntStatus);
Davidroid 57:fa4c622b04a7 1095 int VL6180X_StaticInit(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1096 int VL6180X_RangeWaitDeviceReady(VL6180XDev_t dev, int MaxLoop );
Davidroid 57:fa4c622b04a7 1097 int VL6180X_RangeSetInterMeasPeriod(VL6180XDev_t dev, uint32_t InterMeasTime_msec);
Davidroid 57:fa4c622b04a7 1098 int VL6180X_UpscaleSetScaling(VL6180XDev_t dev, uint8_t scaling);
Davidroid 57:fa4c622b04a7 1099 int VL6180X_UpscaleGetScaling(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1100 uint16_t VL6180X_GetUpperLimit(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1101 int VL6180X_RangeSetThresholds(VL6180XDev_t dev, uint16_t low, uint16_t high, int SafeHold);
Davidroid 57:fa4c622b04a7 1102 int VL6180X_RangeGetThresholds(VL6180XDev_t dev, uint16_t *low, uint16_t *high);
Davidroid 57:fa4c622b04a7 1103 int VL6180X_RangeSetRawThresholds(VL6180XDev_t dev, uint8_t low, uint8_t high);
Davidroid 57:fa4c622b04a7 1104 int VL6180X_RangeSetEceFactor(VL6180XDev_t dev, uint16_t FactorM, uint16_t FactorD);
Davidroid 57:fa4c622b04a7 1105 int VL6180X_RangeSetEceState(VL6180XDev_t dev, int enable );
Davidroid 57:fa4c622b04a7 1106 int VL6180X_FilterSetState(VL6180XDev_t dev, int state);
Davidroid 57:fa4c622b04a7 1107 int VL6180X_FilterGetState(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1108 int VL6180X_DMaxSetState(VL6180XDev_t dev, int state);
Davidroid 57:fa4c622b04a7 1109 int VL6180X_DMaxGetState(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1110 int VL6180X_RangeSetSystemMode(VL6180XDev_t dev, uint8_t mode);
Davidroid 57:fa4c622b04a7 1111 int8_t VL6180X_GetOffsetCalibrationData(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1112 void VL6180X_SetOffsetCalibrationData(VL6180XDev_t dev, int8_t offset);
Davidroid 57:fa4c622b04a7 1113 int VL6180X_SetXTalkCompensationRate(VL6180XDev_t dev, FixPoint97_t Rate);
Davidroid 57:fa4c622b04a7 1114 int VL6180X_AlsWaitDeviceReady(VL6180XDev_t dev, int MaxLoop );
kenjiArai 59:81afbb75311d 1115 int VL6180X_AlsSetSystemMode(VL6180XDev_t dev, uint8_t mode);
Davidroid 57:fa4c622b04a7 1116 int VL6180X_SetGroupParamHold(VL6180XDev_t dev, int Hold);
Davidroid 57:fa4c622b04a7 1117 int VL6180X_SetI2CAddress(VL6180XDev_t dev, uint8_t NewAddr);
Davidroid 57:fa4c622b04a7 1118 int VL6180X_SetupGPIOx(VL6180XDev_t dev, int pin, uint8_t IntFunction, int ActiveHigh);
Davidroid 57:fa4c622b04a7 1119 int VL6180X_SetGPIOxPolarity(VL6180XDev_t dev, int pin, int active_high);
Davidroid 57:fa4c622b04a7 1120 int VL6180X_SetGPIOxFunctionality(VL6180XDev_t dev, int pin, uint8_t functionality);
Davidroid 57:fa4c622b04a7 1121 int VL6180X_DisableGPIOxOut(VL6180XDev_t dev, int pin);
Davidroid 57:fa4c622b04a7 1122 int VL6180X_GetInterruptStatus(VL6180XDev_t dev, uint8_t *status);
Davidroid 57:fa4c622b04a7 1123 int VL6180X_ClearInterrupt(VL6180XDev_t dev, uint8_t IntClear );
kenjiArai 59:81afbb75311d 1124
Davidroid 57:fa4c622b04a7 1125 /* Other functions defined in api.c */
kenjiArai 59:81afbb75311d 1126 int VL6180X_RangeStaticInit(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1127 int VL6180X_UpscaleRegInit(VL6180XDev_t dev);
kenjiArai 59:81afbb75311d 1128 int VL6180X_UpscaleStaticInit(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1129 int VL6180X_AlsGetLux(VL6180XDev_t dev, lux_t *pLux);
kenjiArai 59:81afbb75311d 1130 int _UpscaleInitPatch0(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1131 int VL6180X_RangeGetDeviceReady(VL6180XDev_t dev, int * Ready);
Davidroid 57:fa4c622b04a7 1132 int VL6180X_RangeSetEarlyConvergenceEestimateThreshold(VL6180XDev_t dev);
kenjiArai 59:81afbb75311d 1133 int32_t _GetAveTotalTime(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 1134 int32_t _filter_Start(VL6180XDev_t dev, uint16_t m_trueRange_mm, uint16_t m_rawRange_mm, uint32_t m_rtnSignalRate, uint32_t m_rtnAmbientRate, uint16_t errorCode);
Davidroid 57:fa4c622b04a7 1135 int _filter_GetResult(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData);
kenjiArai 59:81afbb75311d 1136 int _GetRateResult(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData);
Davidroid 57:fa4c622b04a7 1137 int _DMax_InitData(VL6180XDev_t dev);
kenjiArai 59:81afbb75311d 1138
Davidroid 57:fa4c622b04a7 1139 /* Read function of the ID device */
Davidroid 57:fa4c622b04a7 1140 virtual int read_id(uint8_t *id);
kenjiArai 59:81afbb75311d 1141
Davidroid 57:fa4c622b04a7 1142 /* Write and read functions from I2C */
Davidroid 57:fa4c622b04a7 1143 int VL6180X_WrByte(VL6180XDev_t dev, uint16_t index, uint8_t data);
Davidroid 57:fa4c622b04a7 1144 int VL6180X_WrWord(VL6180XDev_t dev, uint16_t index, uint16_t data);
Davidroid 57:fa4c622b04a7 1145 int VL6180X_WrDWord(VL6180XDev_t dev, uint16_t index, uint32_t data);
Davidroid 57:fa4c622b04a7 1146 int VL6180X_RdByte(VL6180XDev_t dev, uint16_t index, uint8_t *data);
Davidroid 57:fa4c622b04a7 1147 int VL6180X_RdWord(VL6180XDev_t dev, uint16_t index, uint16_t *data);
Davidroid 57:fa4c622b04a7 1148 int VL6180X_RdDWord(VL6180XDev_t dev, uint16_t index, uint32_t *data);
Davidroid 57:fa4c622b04a7 1149 int VL6180X_UpdateByte(VL6180XDev_t dev, uint16_t index, uint8_t AndData, uint8_t OrData);
Davidroid 57:fa4c622b04a7 1150 int VL6180X_I2CWrite(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t *pBuffer, uint16_t NumByteToWrite);
Davidroid 57:fa4c622b04a7 1151 int VL6180X_I2CRead(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t *pBuffer, uint16_t NumByteToRead);
kenjiArai 59:81afbb75311d 1152
Davidroid 57:fa4c622b04a7 1153 int IsPresent();
Davidroid 57:fa4c622b04a7 1154 int StopRangeMeasurement(operating_mode_t operating_mode);
Davidroid 57:fa4c622b04a7 1155 int StopAlsMeasurement(operating_mode_t operating_mode);
kenjiArai 59:81afbb75311d 1156 int GetRangeMeas(operating_mode_t operating_mode, measure_data_t *Data);
Davidroid 57:fa4c622b04a7 1157 int GetAlsMeas(operating_mode_t operating_mode, measure_data_t *Data);
Davidroid 57:fa4c622b04a7 1158 int GetRangeAlsMeas(measure_data_t *Data);
Davidroid 57:fa4c622b04a7 1159 int RangeSetLowThreshold(uint16_t threshold);
Davidroid 57:fa4c622b04a7 1160 int RangeSetHighThreshold(uint16_t threshold);
kenjiArai 59:81afbb75311d 1161 int AlsSetLowThreshold(uint16_t threshold);
Davidroid 57:fa4c622b04a7 1162 int AlsSetHighThreshold(uint16_t threshold);
Davidroid 57:fa4c622b04a7 1163 int GetRangeError(measure_data_t *Data, VL6180X_RangeData_t RangeData);
Davidroid 57:fa4c622b04a7 1164 int GetAlsError(measure_data_t *Data, VL6180X_AlsData_t AlsData);
Davidroid 57:fa4c622b04a7 1165 int RangeMeasPollSingleShot();
kenjiArai 59:81afbb75311d 1166 int AlsMeasPollSingleShot();
kenjiArai 59:81afbb75311d 1167 int RangeMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 1168 int AlsMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 1169 int AlsGetMeasurementIfReady(VL6180XDev_t dev, VL6180X_AlsData_t *pAlsData);
Davidroid 57:fa4c622b04a7 1170 int RangeMeasIntContinuousMode(void (*fptr)(void));
Davidroid 57:fa4c622b04a7 1171 int AlsMeasIntContinuousMode(void (*fptr)(void));
Davidroid 57:fa4c622b04a7 1172 int InterleavedMode(void (*fptr)(void));
Davidroid 57:fa4c622b04a7 1173 int StartInterleavedMode();
Davidroid 57:fa4c622b04a7 1174 int AlsGetThresholds(VL6180XDev_t dev, lux_t *low, lux_t *high);
Davidroid 57:fa4c622b04a7 1175
kenjiArai 59:81afbb75311d 1176 /* IO _device */
nikapov 58:1e9a3a46f814 1177 DevI2C *_dev_i2c;
Davidroid 57:fa4c622b04a7 1178 /* Digital out pin */
kenjiArai 59:81afbb75311d 1179 DigitalOut _gpio0;
Davidroid 57:fa4c622b04a7 1180 /* Measure detection IRQ */
Davidroid 57:fa4c622b04a7 1181 InterruptIn *_gpio1Int;
Davidroid 57:fa4c622b04a7 1182 /* _device data */
Davidroid 57:fa4c622b04a7 1183 MyVL6180Dev_t _my_device;
kenjiArai 59:81afbb75311d 1184 VL6180XDev_t _device;
Davidroid 57:fa4c622b04a7 1185 };
Davidroid 57:fa4c622b04a7 1186
Davidroid 57:fa4c622b04a7 1187 #endif // __VL6180X_CLASS_H