use VL6180XA1 chip wothout X-NUCLEO-6180XA1 Board. Simple way to use the chip.
Dependents: Check_VL6180XA1_ToF
Fork of X_NUCLEO_6180XA1 by
VL6180X.h@59:81afbb75311d, 2018-01-28 (annotated)
- 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?
User | Revision | Line number | New 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>© 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 |