Library to handle the X-NUCLEO-6180XA1 Proximity and ambient light sensor expansion board based on VL6180X.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   HelloWorld_6180XA1 SunTracker_BLE Servo_6180XA1 BLE_HR_Light ... more

Fork of X_NUCLEO_6180XA1 by ST Expansion SW Team

X-NUCLEO-6180XA1 Proximity and Ambient Light Sensor Expansion Board Firmware Package

Introduction

This firmware package includes Components Device Drivers and Board Support Package for STMicroelectronics' X-NUCLEO-6180XA1 Proximity and ambient light sensor expansion board based on VL6180X.

Firmware Library

Class X_NUCLEO_6180XA1 is intended to represent the Proximity and ambient light sensor expansion board with the same name.

The expansion board is providing the support of the following components:

  1. on-board VL6180X proximity and ambient light sensor,
  2. up to three additional VL6180X Satellites,
  3. on-board 4-digit display

It is intentionally implemented as a singleton because only one X-NUCLEO-VL6180XA1 at a time might be deployed in a HW component stack. In order to get the singleton instance you have to call class method `Instance()`, e.g.:

// Sensors expansion board singleton instance
static X_NUCLEO_6180XA1 *6180X_expansion_board = X_NUCLEO_6180XA1::Instance();

Arduino Connector Compatibility Warning

Using the X-NUCLEO-6180XA1 expansion board with the NUCLEO-F429ZI requires adopting the following patch:

  • to remove R46 resistor connected to A3 pin;
  • to solder R47 resistor connected to A5 pin.

Alternatively, you can route the Nucleo board’s A5 pin directly to the expansion board’s A3 pin with a wire. In case you patch your expansion board or route the pin, the interrupt signal for the front sensor will be driven on A5 pin rather than on A3 pin.


Example Applications

Committer:
nikapov
Date:
Mon Aug 21 15:44:34 2017 +0000
Revision:
58:1e9a3a46f814
Parent:
57:fa4c622b04a7
Make compatible with non-copyable version of I2C.

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.cpp
Davidroid 57:fa4c622b04a7 4 * @author AST / EST
Davidroid 57:fa4c622b04a7 5 * @version V0.0.1
Davidroid 57:fa4c622b04a7 6 * @date 14-April-2015
Davidroid 57:fa4c622b04a7 7 * @brief Implementation file for the HTS221 driver class
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
Davidroid 57:fa4c622b04a7 38 /* Includes */
Davidroid 57:fa4c622b04a7 39 #include "VL6180X.h"
Davidroid 57:fa4c622b04a7 40
Davidroid 57:fa4c622b04a7 41
Davidroid 57:fa4c622b04a7 42 #ifndef VL6180X_RANGE_STATUS_ERRSTRING
Davidroid 57:fa4c622b04a7 43 #warning "VL6180X_RANGE_STATUS_ERRSTRING not defined ?"
Davidroid 57:fa4c622b04a7 44 /* TODO you may remove or comment these #warning and keep the default below to keep compatibility
Davidroid 57:fa4c622b04a7 45 or update your vl6180x_platform.h file */
Davidroid 57:fa4c622b04a7 46 /**
Davidroid 57:fa4c622b04a7 47 * force VL6180X_RANGE_STATUS_ERRSTRING to not supported when not part of any cfg file
Davidroid 57:fa4c622b04a7 48 */
Davidroid 57:fa4c622b04a7 49 #define VL6180X_RANGE_STATUS_ERRSTRING 0
Davidroid 57:fa4c622b04a7 50 #endif
Davidroid 57:fa4c622b04a7 51
Davidroid 57:fa4c622b04a7 52 #ifndef VL6180X_SAFE_POLLING_ENTER
Davidroid 57:fa4c622b04a7 53 #warning "VL6180X_SAFE_POLLING_ENTER not defined, likely old vl6180x_cfg.h file ?"
Davidroid 57:fa4c622b04a7 54 /* TODO you may remove or comment these #warning and keep the default below to keep compatibility
Davidroid 57:fa4c622b04a7 55 or update your vl6180x_platform.h file */
Davidroid 57:fa4c622b04a7 56 /**
Davidroid 57:fa4c622b04a7 57 * force VL6180X_SAFE_POLLING_ENTER to off when not in cfg file
Davidroid 57:fa4c622b04a7 58 */
Davidroid 57:fa4c622b04a7 59 #define VL6180X_SAFE_POLLING_ENTER 0 /* off by default as in api 2.0 */
Davidroid 57:fa4c622b04a7 60 #endif
Davidroid 57:fa4c622b04a7 61
Davidroid 57:fa4c622b04a7 62 #ifndef VL6180X_LOG_ENABLE
Davidroid 57:fa4c622b04a7 63 /**
Davidroid 57:fa4c622b04a7 64 * Force VL6180X_LOG_ENABLE to none as default
Davidroid 57:fa4c622b04a7 65 */
Davidroid 57:fa4c622b04a7 66 #define VL6180X_LOG_ENABLE 0
Davidroid 57:fa4c622b04a7 67 #endif
Davidroid 57:fa4c622b04a7 68
Davidroid 57:fa4c622b04a7 69 #ifdef MY_LOG
Davidroid 57:fa4c622b04a7 70 Serial pc(USBTX, USBRX);
Davidroid 57:fa4c622b04a7 71 #endif
Davidroid 57:fa4c622b04a7 72
Davidroid 57:fa4c622b04a7 73 #if VL6180X_RANGE_STATUS_ERRSTRING
Davidroid 57:fa4c622b04a7 74 /**@def VL6180X_HAVE_RANGE_STATUS_ERRSTRING
Davidroid 57:fa4c622b04a7 75 * @brief is defined when @a #VL6180X_RANGE_STATUS_ERRSTRING is enable
Davidroid 57:fa4c622b04a7 76 */
Davidroid 57:fa4c622b04a7 77 #define VL6180X_HAVE_RANGE_STATUS_ERRSTRING
Davidroid 57:fa4c622b04a7 78 #endif
Davidroid 57:fa4c622b04a7 79
Davidroid 57:fa4c622b04a7 80
Davidroid 57:fa4c622b04a7 81 /** @brief Get API version as "hex integer" 0xMMnnss
Davidroid 57:fa4c622b04a7 82 */
Davidroid 57:fa4c622b04a7 83 #define VL6180X_ApiRevInt ((VL6180X_API_REV_MAJOR<<24)+(VL6180X_API_REV_MINOR<<16)+VL6180X_API_REV_SUB)
Davidroid 57:fa4c622b04a7 84
Davidroid 57:fa4c622b04a7 85 /** Get API version as string for exe "2.1.12" "
Davidroid 57:fa4c622b04a7 86 */
Davidroid 57:fa4c622b04a7 87 #define VL6180X_ApiRevStr VL6180X_STR(VL6180X_API_REV_MAJOR) "." VL6180X_STR(VL6180X_API_REV_MINOR) "." VL6180X_STR(VL6180X_API_REV_SUB)
Davidroid 57:fa4c622b04a7 88
Davidroid 57:fa4c622b04a7 89 /** @defgroup api_init Init functions
Davidroid 57:fa4c622b04a7 90 * @brief API init functions
Davidroid 57:fa4c622b04a7 91 * @ingroup api_hl
Davidroid 57:fa4c622b04a7 92 * @{
Davidroid 57:fa4c622b04a7 93 */
Davidroid 57:fa4c622b04a7 94
Davidroid 57:fa4c622b04a7 95
Davidroid 57:fa4c622b04a7 96 /****************** define for i2c configuration *******************************/
Davidroid 57:fa4c622b04a7 97
Davidroid 57:fa4c622b04a7 98 #define TEMP_BUF_SIZE 32
Davidroid 57:fa4c622b04a7 99
Davidroid 57:fa4c622b04a7 100 #define IsValidGPIOFunction(x) ((x)==GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT || (x)==GPIOx_SELECT_OFF)
Davidroid 57:fa4c622b04a7 101 /**
Davidroid 57:fa4c622b04a7 102 * @brief Clear All interrupt causes (als+range+error)
Davidroid 57:fa4c622b04a7 103 *
Davidroid 57:fa4c622b04a7 104 * @param dev The device
Davidroid 57:fa4c622b04a7 105 * @return 0 On success
Davidroid 57:fa4c622b04a7 106 */
Davidroid 57:fa4c622b04a7 107 #define VL6180X_ClearAllInterrupt(dev) VL6180X_ClearInterrupt(dev, INTERRUPT_CLEAR_ERROR|INTERRUPT_CLEAR_RANGING|INTERRUPT_CLEAR_ALS)
Davidroid 57:fa4c622b04a7 108 /**
Davidroid 57:fa4c622b04a7 109 * @brief Clear ALS interrupt
Davidroid 57:fa4c622b04a7 110 *
Davidroid 57:fa4c622b04a7 111 * @param dev The device
Davidroid 57:fa4c622b04a7 112 * @return 0 On success
Davidroid 57:fa4c622b04a7 113 */
Davidroid 57:fa4c622b04a7 114 #define VL6180X_AlsClearInterrupt(dev) VL6180X_ClearInterrupt(dev, INTERRUPT_CLEAR_ALS)
Davidroid 57:fa4c622b04a7 115 /**
Davidroid 57:fa4c622b04a7 116 * @brief Clear range interrupt
Davidroid 57:fa4c622b04a7 117 *
Davidroid 57:fa4c622b04a7 118 * @param dev The device
Davidroid 57:fa4c622b04a7 119 * @return 0 On success
Davidroid 57:fa4c622b04a7 120 */
Davidroid 57:fa4c622b04a7 121 #define VL6180X_RangeClearInterrupt(dev) VL6180X_ClearInterrupt(dev, INTERRUPT_CLEAR_RANGING)
Davidroid 57:fa4c622b04a7 122
Davidroid 57:fa4c622b04a7 123 /******************************************************************************/
Davidroid 57:fa4c622b04a7 124 /******************************* file api.c ***********************************/
Davidroid 57:fa4c622b04a7 125
Davidroid 57:fa4c622b04a7 126 #define VL6180X_9to7Conv(x) (x)
Davidroid 57:fa4c622b04a7 127
Davidroid 57:fa4c622b04a7 128 /* TODO when set all "cached" value with "default init" are updated after init from register read back */
Davidroid 57:fa4c622b04a7 129 #define REFRESH_CACHED_DATA_AFTER_INIT 1
Davidroid 57:fa4c622b04a7 130
Davidroid 57:fa4c622b04a7 131
Davidroid 57:fa4c622b04a7 132 #define IsValidGPIOFunction(x) ((x)==GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT || (x)==GPIOx_SELECT_OFF)
Davidroid 57:fa4c622b04a7 133
Davidroid 57:fa4c622b04a7 134
Davidroid 57:fa4c622b04a7 135 /** default value ECE factor Molecular */
Davidroid 57:fa4c622b04a7 136 #define DEF_ECE_FACTOR_M 85
Davidroid 57:fa4c622b04a7 137 /** default value ECE factor Denominator */
Davidroid 57:fa4c622b04a7 138 #define DEF_ECE_FACTOR_D 100
Davidroid 57:fa4c622b04a7 139 /** default value ALS integration time */
Davidroid 57:fa4c622b04a7 140 #define DEF_INT_PEFRIOD 100
Davidroid 57:fa4c622b04a7 141 /** default value ALS gain */
Davidroid 57:fa4c622b04a7 142 #define DEF_ALS_GAIN 1
Davidroid 57:fa4c622b04a7 143 /** default value ALS scaler */
Davidroid 57:fa4c622b04a7 144 #define DEF_ALS_SCALER 1
Davidroid 57:fa4c622b04a7 145 /** default value for DMAX Enbale */
Davidroid 57:fa4c622b04a7 146 #define DEF_DMAX_ENABLE 1
Davidroid 57:fa4c622b04a7 147 /** default ambient tuning factor %x1000 */
Davidroid 57:fa4c622b04a7 148 #define DEF_AMBIENT_TUNING 80
Davidroid 57:fa4c622b04a7 149
Davidroid 57:fa4c622b04a7 150 #if VL6180X_SINGLE_DEVICE_DRIVER
Davidroid 57:fa4c622b04a7 151 extern struct VL6180XDevData_t SingleVL6180XDevData;
Davidroid 57:fa4c622b04a7 152 #define VL6180XDevDataGet(dev, field) (SingleVL6180XDevData.field)
Davidroid 57:fa4c622b04a7 153 #define VL6180XDevDataSet(dev, field, data) SingleVL6180XDevData.field=(data)
Davidroid 57:fa4c622b04a7 154 #endif
Davidroid 57:fa4c622b04a7 155
Davidroid 57:fa4c622b04a7 156 #define LUXRES_FIX_PREC 8
Davidroid 57:fa4c622b04a7 157 #define GAIN_FIX_PREC 8 /* ! if not sme as LUX_PREC then :( adjust GetLux */
Davidroid 57:fa4c622b04a7 158 #define AN_GAIN_MULT (1<<GAIN_FIX_PREC)
Davidroid 57:fa4c622b04a7 159
Davidroid 57:fa4c622b04a7 160
Davidroid 57:fa4c622b04a7 161 //int32_t _GetAveTotalTime(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 162 //int VL6180X_RangeSetEarlyConvergenceEestimateThreshold(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 163
Davidroid 57:fa4c622b04a7 164 /**
Davidroid 57:fa4c622b04a7 165 * ScalerLookUP scaling factor-1 to register #RANGE_SCALER lookup
Davidroid 57:fa4c622b04a7 166 */
Davidroid 57:fa4c622b04a7 167 static const uint16_t ScalerLookUP[] ROMABLE_DATA ={ 253, 127, 84}; /* lookup table for scaling->scalar 1x2x 3x */
Davidroid 57:fa4c622b04a7 168 /**
Davidroid 57:fa4c622b04a7 169 * scaling factor to Upper limit look up
Davidroid 57:fa4c622b04a7 170 */
Davidroid 57:fa4c622b04a7 171 static const uint16_t UpperLimitLookUP[] ROMABLE_DATA ={ 185, 370, 580}; /* lookup table for scaling->limit 1x2x3x */
Davidroid 57:fa4c622b04a7 172 /**
Davidroid 57:fa4c622b04a7 173 * Als Code gain to fix point gain lookup
Davidroid 57:fa4c622b04a7 174 */
Davidroid 57:fa4c622b04a7 175 static const uint16_t AlsGainLookUp[8] ROMABLE_DATA = {
Davidroid 57:fa4c622b04a7 176 (uint16_t)(20.0f * AN_GAIN_MULT),
Davidroid 57:fa4c622b04a7 177 (uint16_t)(10.0f * AN_GAIN_MULT),
Davidroid 57:fa4c622b04a7 178 (uint16_t)(5.0f * AN_GAIN_MULT),
Davidroid 57:fa4c622b04a7 179 (uint16_t)(2.5f * AN_GAIN_MULT),
Davidroid 57:fa4c622b04a7 180 (uint16_t)(1.67f * AN_GAIN_MULT),
Davidroid 57:fa4c622b04a7 181 (uint16_t)(1.25f * AN_GAIN_MULT),
Davidroid 57:fa4c622b04a7 182 (uint16_t)(1.0f * AN_GAIN_MULT),
Davidroid 57:fa4c622b04a7 183 (uint16_t)(40.0f * AN_GAIN_MULT),
Davidroid 57:fa4c622b04a7 184 };
Davidroid 57:fa4c622b04a7 185
Davidroid 57:fa4c622b04a7 186
Davidroid 57:fa4c622b04a7 187 #if VL6180X_RANGE_STATUS_ERRSTRING
Davidroid 57:fa4c622b04a7 188 const char * ROMABLE_DATA VL6180X_RangeStatusErrString[]={
Davidroid 57:fa4c622b04a7 189 "No Error",
Davidroid 57:fa4c622b04a7 190 "VCSEL Continuity Test",
Davidroid 57:fa4c622b04a7 191 "VCSEL Watchdog Test",
Davidroid 57:fa4c622b04a7 192 "VCSEL Watchdog",
Davidroid 57:fa4c622b04a7 193 "PLL1 Lock",
Davidroid 57:fa4c622b04a7 194 "PLL2 Lock",
Davidroid 57:fa4c622b04a7 195 "Early Convergence Estimate",
Davidroid 57:fa4c622b04a7 196 "Max Convergence",
Davidroid 57:fa4c622b04a7 197 "No Target Ignore",
Davidroid 57:fa4c622b04a7 198 "Not used 9",
Davidroid 57:fa4c622b04a7 199 "Not used 10",
Davidroid 57:fa4c622b04a7 200 "Max Signal To Noise Ratio",
Davidroid 57:fa4c622b04a7 201 "Raw Ranging Algo Underflow",
Davidroid 57:fa4c622b04a7 202 "Raw Ranging Algo Overflow",
Davidroid 57:fa4c622b04a7 203 "Ranging Algo Underflow",
Davidroid 57:fa4c622b04a7 204 "Ranging Algo Overflow",
Davidroid 57:fa4c622b04a7 205
Davidroid 57:fa4c622b04a7 206 "Filtered by post processing"
Davidroid 57:fa4c622b04a7 207 };
Davidroid 57:fa4c622b04a7 208
Davidroid 57:fa4c622b04a7 209 const char * VL6180X_RangeGetStatusErrString(uint8_t RangeErrCode){
Davidroid 57:fa4c622b04a7 210 if( RangeErrCode > sizeof(VL6180X_RangeStatusErrString)/sizeof(VL6180X_RangeStatusErrString[0]) )
Davidroid 57:fa4c622b04a7 211 return NULL;
Davidroid 57:fa4c622b04a7 212 return VL6180X_RangeStatusErrString[RangeErrCode];
Davidroid 57:fa4c622b04a7 213 }
Davidroid 57:fa4c622b04a7 214 #endif
Davidroid 57:fa4c622b04a7 215
Davidroid 57:fa4c622b04a7 216 #if VL6180X_UPSCALE_SUPPORT == 1
Davidroid 57:fa4c622b04a7 217 #define _GetUpscale(dev, ... ) 1
Davidroid 57:fa4c622b04a7 218 #define _SetUpscale(...) -1
Davidroid 57:fa4c622b04a7 219 #define DEF_UPSCALE 1
Davidroid 57:fa4c622b04a7 220 #elif VL6180X_UPSCALE_SUPPORT == 2
Davidroid 57:fa4c622b04a7 221 #define _GetUpscale(dev, ... ) 2
Davidroid 57:fa4c622b04a7 222 #define _SetUpscale(...)
Davidroid 57:fa4c622b04a7 223 #define DEF_UPSCALE 2
Davidroid 57:fa4c622b04a7 224 #elif VL6180X_UPSCALE_SUPPORT == 3
Davidroid 57:fa4c622b04a7 225 #define _GetUpscale(dev, ... ) 3
Davidroid 57:fa4c622b04a7 226 #define _SetUpscale(...)
Davidroid 57:fa4c622b04a7 227 #define DEF_UPSCALE 3
Davidroid 57:fa4c622b04a7 228 #else
Davidroid 57:fa4c622b04a7 229 #define DEF_UPSCALE (-(VL6180X_UPSCALE_SUPPORT))
Davidroid 57:fa4c622b04a7 230 #define _GetUpscale(dev, ... ) VL6180XDevDataGet(dev, UpscaleFactor)
Davidroid 57:fa4c622b04a7 231 #define _SetUpscale(dev, Scaling ) VL6180XDevDataSet(dev, UpscaleFactor, Scaling)
Davidroid 57:fa4c622b04a7 232 #endif
Davidroid 57:fa4c622b04a7 233
Davidroid 57:fa4c622b04a7 234
Davidroid 57:fa4c622b04a7 235 #if VL6180X_SINGLE_DEVICE_DRIVER
Davidroid 57:fa4c622b04a7 236 /**
Davidroid 57:fa4c622b04a7 237 * the unique driver data When single device driver is active
Davidroid 57:fa4c622b04a7 238 */
Davidroid 57:fa4c622b04a7 239 struct VL6180XDevData_t VL6180X_DEV_DATA_ATTR SingleVL6180XDevData={
Davidroid 57:fa4c622b04a7 240 .EceFactorM = DEF_ECE_FACTOR_M,
Davidroid 57:fa4c622b04a7 241 .EceFactorD = DEF_ECE_FACTOR_D,
Davidroid 57:fa4c622b04a7 242 #ifdef VL6180X_HAVE_UPSCALE_DATA
Davidroid 57:fa4c622b04a7 243 .UpscaleFactor = DEF_UPSCALE,
Davidroid 57:fa4c622b04a7 244 #endif
Davidroid 57:fa4c622b04a7 245 #ifdef VL6180X_HAVE_ALS_DATA
Davidroid 57:fa4c622b04a7 246 .IntegrationPeriod = DEF_INT_PEFRIOD,
Davidroid 57:fa4c622b04a7 247 .AlsGainCode = DEF_ALS_GAIN,
Davidroid 57:fa4c622b04a7 248 .AlsScaler = DEF_ALS_SCALER,
Davidroid 57:fa4c622b04a7 249 #endif
Davidroid 57:fa4c622b04a7 250 #ifdef VL6180X_HAVE_DMAX_RANGING
Davidroid 57:fa4c622b04a7 251 .DMaxEnable = DEF_DMAX_ENABLE,
Davidroid 57:fa4c622b04a7 252 #endif
Davidroid 57:fa4c622b04a7 253 };
Davidroid 57:fa4c622b04a7 254 #endif /* VL6180X_SINGLE_DEVICE_DRIVER */
Davidroid 57:fa4c622b04a7 255
Davidroid 57:fa4c622b04a7 256 #define Fix7_2_KCPs(x) ((((uint32_t)(x))*1000)>>7)
Davidroid 57:fa4c622b04a7 257
Davidroid 57:fa4c622b04a7 258 #if VL6180X_WRAP_AROUND_FILTER_SUPPORT
Davidroid 57:fa4c622b04a7 259 static int _filter_Init(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 260 #define _IsWrapArroundActive(dev) VL6180XDevDataGet(dev,WrapAroundFilterActive)
Davidroid 57:fa4c622b04a7 261 #else
Davidroid 57:fa4c622b04a7 262 #define _IsWrapArroundActive(dev) 0
Davidroid 57:fa4c622b04a7 263 #endif
Davidroid 57:fa4c622b04a7 264
Davidroid 57:fa4c622b04a7 265
Davidroid 57:fa4c622b04a7 266 #if VL6180X_HAVE_DMAX_RANGING
Davidroid 57:fa4c622b04a7 267 void _DMax_OneTimeInit(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 268 // static int _DMax_InitData(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 269 static int _DMax_Compute(VL6180XDev_t dev, VL6180X_RangeData_t *pRange);
Davidroid 57:fa4c622b04a7 270 #define _IsDMaxActive(dev) VL6180XDevDataGet(dev,DMaxEnable)
Davidroid 57:fa4c622b04a7 271 #else
Davidroid 57:fa4c622b04a7 272 #define _DMax_InitData(...) 0 /* success */
Davidroid 57:fa4c622b04a7 273 #define _DMax_OneTimeInit(...) (void)0
Davidroid 57:fa4c622b04a7 274 #define _IsDMaxActive(...) 0
Davidroid 57:fa4c622b04a7 275 #endif
Davidroid 57:fa4c622b04a7 276
Davidroid 57:fa4c622b04a7 277 //static int VL6180X_RangeStaticInit(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 278 //static int VL6180X_UpscaleStaticInit(VL6180XDev_t dev);
Davidroid 57:fa4c622b04a7 279
Davidroid 57:fa4c622b04a7 280 int VL6180X::VL6180X_WaitDeviceBooted(VL6180XDev_t dev){
Davidroid 57:fa4c622b04a7 281 uint8_t FreshOutReset=0;
Davidroid 57:fa4c622b04a7 282 int status;
Davidroid 57:fa4c622b04a7 283 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 284 do{
Davidroid 57:fa4c622b04a7 285 status = VL6180X_RdByte(dev,SYSTEM_FRESH_OUT_OF_RESET, &FreshOutReset);
Davidroid 57:fa4c622b04a7 286 }
Davidroid 57:fa4c622b04a7 287 while( FreshOutReset!=1 && status==0);
Davidroid 57:fa4c622b04a7 288 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 289 return status;
Davidroid 57:fa4c622b04a7 290 }
Davidroid 57:fa4c622b04a7 291
Davidroid 57:fa4c622b04a7 292 int VL6180X::VL6180X_InitData(VL6180XDev_t dev){
Davidroid 57:fa4c622b04a7 293 int status, dmax_status ;
Davidroid 57:fa4c622b04a7 294 int8_t offset;
Davidroid 57:fa4c622b04a7 295 uint8_t FreshOutReset;
Davidroid 57:fa4c622b04a7 296 uint32_t CalValue;
Davidroid 57:fa4c622b04a7 297 uint16_t u16;
Davidroid 57:fa4c622b04a7 298 uint32_t XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 299
Davidroid 57:fa4c622b04a7 300 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 301
Davidroid 57:fa4c622b04a7 302 VL6180XDevDataSet(dev, EceFactorM , DEF_ECE_FACTOR_M);
Davidroid 57:fa4c622b04a7 303 VL6180XDevDataSet(dev, EceFactorD , DEF_ECE_FACTOR_D);
Davidroid 57:fa4c622b04a7 304
Davidroid 57:fa4c622b04a7 305 #ifdef VL6180X_HAVE_UPSCALE_DATA
Davidroid 57:fa4c622b04a7 306 VL6180XDevDataSet(dev, UpscaleFactor , DEF_UPSCALE);
Davidroid 57:fa4c622b04a7 307 #endif
Davidroid 57:fa4c622b04a7 308
Davidroid 57:fa4c622b04a7 309 #ifdef VL6180X_HAVE_ALS_DATA
Davidroid 57:fa4c622b04a7 310 VL6180XDevDataSet(dev, IntegrationPeriod, DEF_INT_PEFRIOD);
Davidroid 57:fa4c622b04a7 311 VL6180XDevDataSet(dev, AlsGainCode, DEF_ALS_GAIN);
Davidroid 57:fa4c622b04a7 312 VL6180XDevDataSet(dev, AlsScaler, DEF_ALS_SCALER);
Davidroid 57:fa4c622b04a7 313 #endif
Davidroid 57:fa4c622b04a7 314
Davidroid 57:fa4c622b04a7 315 #ifdef VL6180X_HAVE_WRAP_AROUND_DATA
Davidroid 57:fa4c622b04a7 316 VL6180XDevDataSet(dev, WrapAroundFilterActive, (VL6180X_WRAP_AROUND_FILTER_SUPPORT >0));
Davidroid 57:fa4c622b04a7 317 VL6180XDevDataSet(dev, DMaxEnable, DEF_DMAX_ENABLE);
Davidroid 57:fa4c622b04a7 318 #endif
Davidroid 57:fa4c622b04a7 319
Davidroid 57:fa4c622b04a7 320 _DMax_OneTimeInit(dev);
Davidroid 57:fa4c622b04a7 321 do{
Davidroid 57:fa4c622b04a7 322
Davidroid 57:fa4c622b04a7 323 /* backup offset initial value from nvm these must be done prior any over call that use offset */
Davidroid 57:fa4c622b04a7 324 status = VL6180X::VL6180X_RdByte(dev,SYSRANGE_PART_TO_PART_RANGE_OFFSET, (uint8_t*)&offset);
Davidroid 57:fa4c622b04a7 325 if( status ){
Davidroid 57:fa4c622b04a7 326 VL6180X_ErrLog("SYSRANGE_PART_TO_PART_RANGE_OFFSET rd fail");
Davidroid 57:fa4c622b04a7 327 break;
Davidroid 57:fa4c622b04a7 328 }
Davidroid 57:fa4c622b04a7 329 VL6180XDevDataSet(dev, Part2PartOffsetNVM, offset);
Davidroid 57:fa4c622b04a7 330
Davidroid 57:fa4c622b04a7 331 status=VL6180X_RdDWord( dev, SYSRANGE_RANGE_IGNORE_THRESHOLD, &CalValue);
Davidroid 57:fa4c622b04a7 332 if( status ){
Davidroid 57:fa4c622b04a7 333 VL6180X_ErrLog("Part2PartAmbNVM rd fail");
Davidroid 57:fa4c622b04a7 334 break;
Davidroid 57:fa4c622b04a7 335 }
Davidroid 57:fa4c622b04a7 336 if( (CalValue&0xFFFF0000) == 0 ){
Davidroid 57:fa4c622b04a7 337 CalValue=0x00CE03F8;
Davidroid 57:fa4c622b04a7 338 }
Davidroid 57:fa4c622b04a7 339 VL6180XDevDataSet(dev, Part2PartAmbNVM, CalValue);
Davidroid 57:fa4c622b04a7 340
Davidroid 57:fa4c622b04a7 341 status = VL6180X_RdWord(dev, SYSRANGE_CROSSTALK_COMPENSATION_RATE ,&u16);
Davidroid 57:fa4c622b04a7 342 if( status){
Davidroid 57:fa4c622b04a7 343 VL6180X_ErrLog("SYSRANGE_CROSSTALK_COMPENSATION_RATE rd fail ");
Davidroid 57:fa4c622b04a7 344 break;
Davidroid 57:fa4c622b04a7 345 }
Davidroid 57:fa4c622b04a7 346 XTalkCompRate_KCps = Fix7_2_KCPs(u16);
Davidroid 57:fa4c622b04a7 347 VL6180XDevDataSet(dev, XTalkCompRate_KCps , XTalkCompRate_KCps );
Davidroid 57:fa4c622b04a7 348
Davidroid 57:fa4c622b04a7 349 dmax_status = _DMax_InitData(dev);
Davidroid 57:fa4c622b04a7 350 if( dmax_status < 0 ){
Davidroid 57:fa4c622b04a7 351 VL6180X_ErrLog("DMax init failure");
Davidroid 57:fa4c622b04a7 352 break;
Davidroid 57:fa4c622b04a7 353 }
Davidroid 57:fa4c622b04a7 354
Davidroid 57:fa4c622b04a7 355 /* Read or wait for fresh out of reset */
Davidroid 57:fa4c622b04a7 356 status = VL6180X_RdByte(dev,SYSTEM_FRESH_OUT_OF_RESET, &FreshOutReset);
Davidroid 57:fa4c622b04a7 357 if( status ) {
Davidroid 57:fa4c622b04a7 358 VL6180X_ErrLog("SYSTEM_FRESH_OUT_OF_RESET rd fail");
Davidroid 57:fa4c622b04a7 359 break;
Davidroid 57:fa4c622b04a7 360 }
Davidroid 57:fa4c622b04a7 361 if( FreshOutReset!= 1 || dmax_status )
Davidroid 57:fa4c622b04a7 362 status = CALIBRATION_WARNING;
Davidroid 57:fa4c622b04a7 363
Davidroid 57:fa4c622b04a7 364 }
Davidroid 57:fa4c622b04a7 365 while(0);
Davidroid 57:fa4c622b04a7 366
Davidroid 57:fa4c622b04a7 367 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 368 return status;
Davidroid 57:fa4c622b04a7 369 }
Davidroid 57:fa4c622b04a7 370
Davidroid 57:fa4c622b04a7 371 int8_t VL6180X::VL6180X_GetOffsetCalibrationData(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 372 {
Davidroid 57:fa4c622b04a7 373 int8_t offset;
Davidroid 57:fa4c622b04a7 374 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 375 offset = VL6180XDevDataGet(dev, Part2PartOffsetNVM);
Davidroid 57:fa4c622b04a7 376 LOG_FUNCTION_END( offset );
Davidroid 57:fa4c622b04a7 377 return offset;
Davidroid 57:fa4c622b04a7 378 }
Davidroid 57:fa4c622b04a7 379
Davidroid 57:fa4c622b04a7 380 void VL6180X::VL6180X_SetOffsetCalibrationData(VL6180XDev_t dev, int8_t offset)
Davidroid 57:fa4c622b04a7 381 {
Davidroid 57:fa4c622b04a7 382 LOG_FUNCTION_START("%d", offset);
Davidroid 57:fa4c622b04a7 383 VL6180XDevDataSet(dev, Part2PartOffsetNVM, offset);
Davidroid 57:fa4c622b04a7 384 LOG_FUNCTION_END(0);
Davidroid 57:fa4c622b04a7 385 }
Davidroid 57:fa4c622b04a7 386
Davidroid 57:fa4c622b04a7 387 int VL6180X::VL6180X_SetXTalkCompensationRate(VL6180XDev_t dev, FixPoint97_t Rate)
Davidroid 57:fa4c622b04a7 388 {
Davidroid 57:fa4c622b04a7 389 int status;
Davidroid 57:fa4c622b04a7 390 LOG_FUNCTION_START("%d", Rate);
Davidroid 57:fa4c622b04a7 391 status = VL6180X_WrWord(dev, SYSRANGE_CROSSTALK_COMPENSATION_RATE, Rate);
Davidroid 57:fa4c622b04a7 392 if( status ==0 ){
Davidroid 57:fa4c622b04a7 393 uint32_t XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 394 XTalkCompRate_KCps = Fix7_2_KCPs(Rate);
Davidroid 57:fa4c622b04a7 395 VL6180XDevDataSet(dev, XTalkCompRate_KCps , XTalkCompRate_KCps );
Davidroid 57:fa4c622b04a7 396 /* update dmax whenever xtalk rate changes */
Davidroid 57:fa4c622b04a7 397 status = _DMax_InitData(dev);
Davidroid 57:fa4c622b04a7 398 }
Davidroid 57:fa4c622b04a7 399 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 400 return status;
Davidroid 57:fa4c622b04a7 401 }
Davidroid 57:fa4c622b04a7 402
Davidroid 57:fa4c622b04a7 403 int VL6180X::VL6180X_SetI2CAddress(VL6180XDev_t dev, uint8_t NewAddress){
Davidroid 57:fa4c622b04a7 404 int status;
Davidroid 57:fa4c622b04a7 405 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 406
Davidroid 57:fa4c622b04a7 407 status = VL6180X_WrByte(dev, I2C_SLAVE_DEVICE_ADDRESS, NewAddress);
Davidroid 57:fa4c622b04a7 408 if( status ){
Davidroid 57:fa4c622b04a7 409 VL6180X_ErrLog("new i2c addr Wr fail");
Davidroid 57:fa4c622b04a7 410 }
Davidroid 57:fa4c622b04a7 411 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 412 return status;
Davidroid 57:fa4c622b04a7 413 }
Davidroid 57:fa4c622b04a7 414
Davidroid 57:fa4c622b04a7 415
Davidroid 57:fa4c622b04a7 416 uint16_t VL6180X::VL6180X_GetUpperLimit(VL6180XDev_t dev) {
Davidroid 57:fa4c622b04a7 417 uint16_t limit;
Davidroid 57:fa4c622b04a7 418 int scaling;
Davidroid 57:fa4c622b04a7 419
Davidroid 57:fa4c622b04a7 420 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 421
Davidroid 57:fa4c622b04a7 422 scaling = _GetUpscale(dev);
Davidroid 57:fa4c622b04a7 423 /* FIXME we do assume here _GetUpscale is valid if user call us prior to init we may overflow the LUT mem area */
Davidroid 57:fa4c622b04a7 424 limit = UpperLimitLookUP[scaling - 1];
Davidroid 57:fa4c622b04a7 425
Davidroid 57:fa4c622b04a7 426 LOG_FUNCTION_END((int )limit);
Davidroid 57:fa4c622b04a7 427 return limit;
Davidroid 57:fa4c622b04a7 428 }
Davidroid 57:fa4c622b04a7 429
Davidroid 57:fa4c622b04a7 430
Davidroid 57:fa4c622b04a7 431
Davidroid 57:fa4c622b04a7 432 int VL6180X::VL6180X_StaticInit(VL6180XDev_t dev){
Davidroid 57:fa4c622b04a7 433 int status=0, init_status;
Davidroid 57:fa4c622b04a7 434 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 435
Davidroid 57:fa4c622b04a7 436 /* TODO doc When using configurable scaling but using 1x as start condition
Davidroid 57:fa4c622b04a7 437 * load tunning upscale or not ??? */
Davidroid 57:fa4c622b04a7 438 if( _GetUpscale(dev) == 1 && !(VL6180X_UPSCALE_SUPPORT<0))
Davidroid 57:fa4c622b04a7 439 init_status=VL6180X_RangeStaticInit(dev);
Davidroid 57:fa4c622b04a7 440 else
Davidroid 57:fa4c622b04a7 441 init_status=VL6180X_UpscaleStaticInit(dev);
Davidroid 57:fa4c622b04a7 442
Davidroid 57:fa4c622b04a7 443 if( init_status <0 ){
Davidroid 57:fa4c622b04a7 444 VL6180X_ErrLog("StaticInit fail");
Davidroid 57:fa4c622b04a7 445 goto error;
Davidroid 57:fa4c622b04a7 446 }
Davidroid 57:fa4c622b04a7 447 else if(init_status > 0){
Davidroid 57:fa4c622b04a7 448 VL6180X_ErrLog("StaticInit warning");
Davidroid 57:fa4c622b04a7 449 }
Davidroid 57:fa4c622b04a7 450
Davidroid 57:fa4c622b04a7 451 #if REFRESH_CACHED_DATA_AFTER_INIT
Davidroid 57:fa4c622b04a7 452 /* update cached value after tuning applied */
Davidroid 57:fa4c622b04a7 453 do{
Davidroid 57:fa4c622b04a7 454 #ifdef VL6180X_HAVE_ALS_DATA
Davidroid 57:fa4c622b04a7 455 uint8_t data;
Davidroid 57:fa4c622b04a7 456 status= VL6180X_RdByte(dev, FW_ALS_RESULT_SCALER, &data);
Davidroid 57:fa4c622b04a7 457 if( status ) break;
Davidroid 57:fa4c622b04a7 458 VL6180XDevDataSet(dev, AlsScaler, data);
Davidroid 57:fa4c622b04a7 459
Davidroid 57:fa4c622b04a7 460 status= VL6180X_RdByte(dev, SYSALS_ANALOGUE_GAIN, &data);
Davidroid 57:fa4c622b04a7 461 if( status ) break;
Davidroid 57:fa4c622b04a7 462 VL6180X_AlsSetAnalogueGain(dev, data);
Davidroid 57:fa4c622b04a7 463 #endif
Davidroid 57:fa4c622b04a7 464 }
Davidroid 57:fa4c622b04a7 465 while(0);
Davidroid 57:fa4c622b04a7 466 #endif /* REFRESH_CACHED_DATA_AFTER_INIT */
Davidroid 57:fa4c622b04a7 467 if( status < 0 ){
Davidroid 57:fa4c622b04a7 468 VL6180X_ErrLog("StaticInit fail");
Davidroid 57:fa4c622b04a7 469 }
Davidroid 57:fa4c622b04a7 470 if( !status && init_status){
Davidroid 57:fa4c622b04a7 471 status = init_status;
Davidroid 57:fa4c622b04a7 472 }
Davidroid 57:fa4c622b04a7 473 error:
Davidroid 57:fa4c622b04a7 474 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 475 return status;
Davidroid 57:fa4c622b04a7 476 }
Davidroid 57:fa4c622b04a7 477
Davidroid 57:fa4c622b04a7 478
Davidroid 57:fa4c622b04a7 479 int VL6180X::VL6180X_SetGroupParamHold(VL6180XDev_t dev, int Hold)
Davidroid 57:fa4c622b04a7 480 {
Davidroid 57:fa4c622b04a7 481 int status;
Davidroid 57:fa4c622b04a7 482 uint8_t value;
Davidroid 57:fa4c622b04a7 483
Davidroid 57:fa4c622b04a7 484 LOG_FUNCTION_START("%d", Hold);
Davidroid 57:fa4c622b04a7 485 if( Hold )
Davidroid 57:fa4c622b04a7 486 value = 1;
Davidroid 57:fa4c622b04a7 487 else
Davidroid 57:fa4c622b04a7 488 value = 0;
Davidroid 57:fa4c622b04a7 489 status = VL6180X_WrByte(dev, SYSTEM_GROUPED_PARAMETER_HOLD, value);
Davidroid 57:fa4c622b04a7 490
Davidroid 57:fa4c622b04a7 491 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 492 return status;
Davidroid 57:fa4c622b04a7 493
Davidroid 57:fa4c622b04a7 494 }
Davidroid 57:fa4c622b04a7 495
Davidroid 57:fa4c622b04a7 496 int VL6180X::VL6180X_Prepare(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 497 {
Davidroid 57:fa4c622b04a7 498 int status;
Davidroid 57:fa4c622b04a7 499 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 500
Davidroid 57:fa4c622b04a7 501 do{
Davidroid 57:fa4c622b04a7 502 status=VL6180X_StaticInit(dev);
Davidroid 57:fa4c622b04a7 503 if( status<0) break;
Davidroid 57:fa4c622b04a7 504
Davidroid 57:fa4c622b04a7 505 /* set range InterruptMode to new sample */
Davidroid 57:fa4c622b04a7 506 status=VL6180X_RangeConfigInterrupt(dev, CONFIG_GPIO_INTERRUPT_DISABLED );
Davidroid 57:fa4c622b04a7 507 if( status)
Davidroid 57:fa4c622b04a7 508 break;
Davidroid 57:fa4c622b04a7 509
Davidroid 57:fa4c622b04a7 510 /* set default threshold */
Davidroid 57:fa4c622b04a7 511 status=VL6180X_RangeSetRawThresholds(dev, 10, 200);
Davidroid 57:fa4c622b04a7 512 if( status ){
Davidroid 57:fa4c622b04a7 513 VL6180X_ErrLog("VL6180X_RangeSetRawThresholds fail");
Davidroid 57:fa4c622b04a7 514 break;
Davidroid 57:fa4c622b04a7 515 }
Davidroid 57:fa4c622b04a7 516 #if VL6180X_ALS_SUPPORT
Davidroid 57:fa4c622b04a7 517 status =VL6180X_AlsSetIntegrationPeriod(dev, 100);
Davidroid 57:fa4c622b04a7 518 if( status ) break;
Davidroid 57:fa4c622b04a7 519 status = VL6180X_AlsSetInterMeasurementPeriod(dev, 200);
Davidroid 57:fa4c622b04a7 520 if( status ) break;
Davidroid 57:fa4c622b04a7 521 status = VL6180X_AlsSetAnalogueGain(dev, 0);
Davidroid 57:fa4c622b04a7 522 if( status ) break;
Davidroid 57:fa4c622b04a7 523 status = VL6180X_AlsSetThresholds(dev, 0, 0xFFFF);
Davidroid 57:fa4c622b04a7 524 if( status ) break;
Davidroid 57:fa4c622b04a7 525 /* set Als InterruptMode to new sample */
Davidroid 57:fa4c622b04a7 526 status=VL6180X_AlsConfigInterrupt(dev, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 527 if( status ) {
Davidroid 57:fa4c622b04a7 528 VL6180X_ErrLog("VL6180X_AlsConfigInterrupt fail");
Davidroid 57:fa4c622b04a7 529 break;
Davidroid 57:fa4c622b04a7 530 }
Davidroid 57:fa4c622b04a7 531 #endif
Davidroid 57:fa4c622b04a7 532 #if VL6180X_WRAP_AROUND_FILTER_SUPPORT
Davidroid 57:fa4c622b04a7 533 _filter_Init(dev);
Davidroid 57:fa4c622b04a7 534 #endif
Davidroid 57:fa4c622b04a7 535 /* make sure to reset any left previous condition that can hangs first poll */
Davidroid 57:fa4c622b04a7 536 status=VL6180X_ClearAllInterrupt(dev);
Davidroid 57:fa4c622b04a7 537 }
Davidroid 57:fa4c622b04a7 538 while(0);
Davidroid 57:fa4c622b04a7 539 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 540
Davidroid 57:fa4c622b04a7 541 return status;
Davidroid 57:fa4c622b04a7 542 }
Davidroid 57:fa4c622b04a7 543
Davidroid 57:fa4c622b04a7 544 #if VL6180X_ALS_SUPPORT
Davidroid 57:fa4c622b04a7 545 int VL6180X::VL6180X_AlsGetLux(VL6180XDev_t dev, lux_t *pLux)
Davidroid 57:fa4c622b04a7 546 {
Davidroid 57:fa4c622b04a7 547 int status;
Davidroid 57:fa4c622b04a7 548 uint16_t RawAls;
Davidroid 57:fa4c622b04a7 549 uint32_t luxValue = 0;
Davidroid 57:fa4c622b04a7 550 uint32_t IntPeriod;
Davidroid 57:fa4c622b04a7 551 uint32_t AlsAnGain;
Davidroid 57:fa4c622b04a7 552 uint32_t GainFix;
Davidroid 57:fa4c622b04a7 553 uint32_t AlsScaler;
Davidroid 57:fa4c622b04a7 554
Davidroid 57:fa4c622b04a7 555 #if LUXRES_FIX_PREC != GAIN_FIX_PREC
Davidroid 57:fa4c622b04a7 556 #error "LUXRES_FIX_PREC != GAIN_FIX_PREC review these code to be correct"
Davidroid 57:fa4c622b04a7 557 #endif
Davidroid 57:fa4c622b04a7 558 const uint32_t LuxResxIntIme =(uint32_t)(0.56f* DEF_INT_PEFRIOD *(1<<LUXRES_FIX_PREC));
Davidroid 57:fa4c622b04a7 559
Davidroid 57:fa4c622b04a7 560 LOG_FUNCTION_START("%p", pLux);
Davidroid 57:fa4c622b04a7 561
Davidroid 57:fa4c622b04a7 562 status = VL6180X_RdWord( dev, RESULT_ALS_VAL, &RawAls);
Davidroid 57:fa4c622b04a7 563 if( !status){
Davidroid 57:fa4c622b04a7 564 /* wer are yet here at no fix point */
Davidroid 57:fa4c622b04a7 565 IntPeriod=VL6180XDevDataGet(dev, IntegrationPeriod);
Davidroid 57:fa4c622b04a7 566 AlsScaler=VL6180XDevDataGet(dev, AlsScaler);
Davidroid 57:fa4c622b04a7 567 IntPeriod++; /* what stored is real time ms -1 and it can be 0 for or 0 or 1ms */
Davidroid 57:fa4c622b04a7 568 luxValue = (uint32_t)RawAls * LuxResxIntIme; /* max # 16+8bits + 6bit (0.56*100) */
Davidroid 57:fa4c622b04a7 569 luxValue /= IntPeriod; /* max # 16+8bits + 6bit 16+8+1 to 9 bit */
Davidroid 57:fa4c622b04a7 570 /* between 29 - 21 bit */
Davidroid 57:fa4c622b04a7 571 AlsAnGain = VL6180XDevDataGet(dev, AlsGainCode);
Davidroid 57:fa4c622b04a7 572 GainFix = AlsGainLookUp[AlsAnGain];
Davidroid 57:fa4c622b04a7 573 luxValue = luxValue / (AlsScaler * GainFix);
Davidroid 57:fa4c622b04a7 574 *pLux=luxValue;
Davidroid 57:fa4c622b04a7 575 }
Davidroid 57:fa4c622b04a7 576
Davidroid 57:fa4c622b04a7 577 LOG_FUNCTION_END_FMT(status, "%x",(int)*pLux);
Davidroid 57:fa4c622b04a7 578 return status;
Davidroid 57:fa4c622b04a7 579 }
Davidroid 57:fa4c622b04a7 580
Davidroid 57:fa4c622b04a7 581 int VL6180X::VL6180X_AlsGetMeasurement(VL6180XDev_t dev, VL6180X_AlsData_t *pAlsData)
Davidroid 57:fa4c622b04a7 582 {
Davidroid 57:fa4c622b04a7 583 int status;
Davidroid 57:fa4c622b04a7 584 uint8_t ErrStatus;
Davidroid 57:fa4c622b04a7 585
Davidroid 57:fa4c622b04a7 586 LOG_FUNCTION_START("%p", pAlsData);
Davidroid 57:fa4c622b04a7 587
Davidroid 57:fa4c622b04a7 588 status = VL6180X_AlsGetLux(dev, &pAlsData->lux);
Davidroid 57:fa4c622b04a7 589 if( !status ){
Davidroid 57:fa4c622b04a7 590 status = VL6180X_RdByte(dev, RESULT_ALS_STATUS, & ErrStatus);
Davidroid 57:fa4c622b04a7 591 pAlsData->errorStatus = ErrStatus>>4;
Davidroid 57:fa4c622b04a7 592 }
Davidroid 57:fa4c622b04a7 593 LOG_FUNCTION_END_FMT(status,"%d %d", (int)pAlsData->lux, (int)pAlsData->errorStatus);
Davidroid 57:fa4c622b04a7 594
Davidroid 57:fa4c622b04a7 595 return status;
Davidroid 57:fa4c622b04a7 596 }
Davidroid 57:fa4c622b04a7 597
Davidroid 57:fa4c622b04a7 598
Davidroid 57:fa4c622b04a7 599 int VL6180X::VL6180X_AlsPollMeasurement(VL6180XDev_t dev, VL6180X_AlsData_t *pAlsData) {
Davidroid 57:fa4c622b04a7 600 int status;
Davidroid 57:fa4c622b04a7 601 int ClrStatus;
Davidroid 57:fa4c622b04a7 602 uint8_t IntStatus;
Davidroid 57:fa4c622b04a7 603
Davidroid 57:fa4c622b04a7 604 LOG_FUNCTION_START("%p", pAlsData);
Davidroid 57:fa4c622b04a7 605 #if VL6180X_SAFE_POLLING_ENTER
Davidroid 57:fa4c622b04a7 606 /* if device get stopped with left interrupt uncleared , it is required to clear them now or poll for new condition will never occur*/
Davidroid 57:fa4c622b04a7 607 status=VL6180X_AlsClearInterrupt(dev);
Davidroid 57:fa4c622b04a7 608 if(status){
Davidroid 57:fa4c622b04a7 609 VL6180X_ErrLog("VL6180X_AlsClearInterrupt fail");
Davidroid 57:fa4c622b04a7 610 goto over;
Davidroid 57:fa4c622b04a7 611 }
Davidroid 57:fa4c622b04a7 612 #endif
Davidroid 57:fa4c622b04a7 613
Davidroid 57:fa4c622b04a7 614 status=VL6180X_AlsSetSystemMode(dev, MODE_START_STOP|MODE_SINGLESHOT);
Davidroid 57:fa4c622b04a7 615 if( status){
Davidroid 57:fa4c622b04a7 616 VL6180X_ErrLog("VL6180X_AlsSetSystemMode fail");
Davidroid 57:fa4c622b04a7 617 goto over;
Davidroid 57:fa4c622b04a7 618 }
Davidroid 57:fa4c622b04a7 619
Davidroid 57:fa4c622b04a7 620 /* poll for new sample ready */
Davidroid 57:fa4c622b04a7 621 while (1 ) {
Davidroid 57:fa4c622b04a7 622 status = VL6180X_AlsGetInterruptStatus(dev, &IntStatus);
Davidroid 57:fa4c622b04a7 623 if (status) {
Davidroid 57:fa4c622b04a7 624 break;
Davidroid 57:fa4c622b04a7 625 }
Davidroid 57:fa4c622b04a7 626 if (IntStatus == RES_INT_STAT_GPIO_NEW_SAMPLE_READY) {
Davidroid 57:fa4c622b04a7 627 break; /* break on new data (status is 0) */
Davidroid 57:fa4c622b04a7 628 }
Davidroid 57:fa4c622b04a7 629 wait_ms(10);
Davidroid 57:fa4c622b04a7 630 };
Davidroid 57:fa4c622b04a7 631
Davidroid 57:fa4c622b04a7 632 if (!status) {
Davidroid 57:fa4c622b04a7 633 status = VL6180X_AlsGetMeasurement(dev, pAlsData);
Davidroid 57:fa4c622b04a7 634 }
Davidroid 57:fa4c622b04a7 635
Davidroid 57:fa4c622b04a7 636 ClrStatus = VL6180X_AlsClearInterrupt(dev);
Davidroid 57:fa4c622b04a7 637 if (ClrStatus) {
Davidroid 57:fa4c622b04a7 638 VL6180X_ErrLog("VL6180X_AlsClearInterrupt fail");
Davidroid 57:fa4c622b04a7 639 if (!status) {
Davidroid 57:fa4c622b04a7 640 status = ClrStatus; /* leave previous if already on error */
Davidroid 57:fa4c622b04a7 641 }
Davidroid 57:fa4c622b04a7 642 }
Davidroid 57:fa4c622b04a7 643 over:
Davidroid 57:fa4c622b04a7 644 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 645
Davidroid 57:fa4c622b04a7 646 return status;
Davidroid 57:fa4c622b04a7 647 }
Davidroid 57:fa4c622b04a7 648
Davidroid 57:fa4c622b04a7 649 int VL6180X::VL6180X_AlsGetInterruptStatus(VL6180XDev_t dev, uint8_t *pIntStatus) {
Davidroid 57:fa4c622b04a7 650 int status;
Davidroid 57:fa4c622b04a7 651 uint8_t IntStatus;
Davidroid 57:fa4c622b04a7 652 LOG_FUNCTION_START("%p", pIntStatus);
Davidroid 57:fa4c622b04a7 653
Davidroid 57:fa4c622b04a7 654 status = VL6180X_RdByte(dev, RESULT_INTERRUPT_STATUS_GPIO, &IntStatus);
Davidroid 57:fa4c622b04a7 655 *pIntStatus= (IntStatus>>3)&0x07;
Davidroid 57:fa4c622b04a7 656
Davidroid 57:fa4c622b04a7 657 LOG_FUNCTION_END_FMT(status, "%d", (int)*pIntStatus);
Davidroid 57:fa4c622b04a7 658 return status;
Davidroid 57:fa4c622b04a7 659 }
Davidroid 57:fa4c622b04a7 660
Davidroid 57:fa4c622b04a7 661 int VL6180X::VL6180X_AlsWaitDeviceReady(VL6180XDev_t dev, int MaxLoop ){
Davidroid 57:fa4c622b04a7 662 int status;
Davidroid 57:fa4c622b04a7 663 int n;
Davidroid 57:fa4c622b04a7 664 uint8_t u8;
Davidroid 57:fa4c622b04a7 665 LOG_FUNCTION_START("%d", (int)MaxLoop);
Davidroid 57:fa4c622b04a7 666 if( MaxLoop<1){
Davidroid 57:fa4c622b04a7 667 status=INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 668 }
Davidroid 57:fa4c622b04a7 669 else{
Davidroid 57:fa4c622b04a7 670 for( n=0; n < MaxLoop ; n++){
Davidroid 57:fa4c622b04a7 671 status=VL6180X_RdByte(dev, RESULT_ALS_STATUS, &u8);
Davidroid 57:fa4c622b04a7 672 if( status)
Davidroid 57:fa4c622b04a7 673 break;
Davidroid 57:fa4c622b04a7 674 u8 = u8 & ALS_DEVICE_READY_MASK;
Davidroid 57:fa4c622b04a7 675 if( u8 )
Davidroid 57:fa4c622b04a7 676 break;
Davidroid 57:fa4c622b04a7 677
Davidroid 57:fa4c622b04a7 678 }
Davidroid 57:fa4c622b04a7 679 if( !status && !u8 ){
Davidroid 57:fa4c622b04a7 680 status = TIME_OUT;
Davidroid 57:fa4c622b04a7 681 }
Davidroid 57:fa4c622b04a7 682 }
Davidroid 57:fa4c622b04a7 683 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 684 return status;
Davidroid 57:fa4c622b04a7 685 }
Davidroid 57:fa4c622b04a7 686
Davidroid 57:fa4c622b04a7 687 int VL6180X::VL6180X_AlsSetSystemMode(VL6180XDev_t dev, uint8_t mode)
Davidroid 57:fa4c622b04a7 688 {
Davidroid 57:fa4c622b04a7 689 int status;
Davidroid 57:fa4c622b04a7 690 LOG_FUNCTION_START("%d", (int)mode);
Davidroid 57:fa4c622b04a7 691 /* FIXME if we are called back to back real fast we are not checking
Davidroid 57:fa4c622b04a7 692 * if previous mode "set" got absorbed => bit 0 must be 0 so that wr 1 work */
Davidroid 57:fa4c622b04a7 693 if( mode <= 3){
Davidroid 57:fa4c622b04a7 694 status=VL6180X_WrByte(dev, SYSALS_START, mode);
Davidroid 57:fa4c622b04a7 695 }
Davidroid 57:fa4c622b04a7 696 else{
Davidroid 57:fa4c622b04a7 697 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 698 }
Davidroid 57:fa4c622b04a7 699 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 700 return status;
Davidroid 57:fa4c622b04a7 701 }
Davidroid 57:fa4c622b04a7 702
Davidroid 57:fa4c622b04a7 703 int VL6180X::VL6180X_AlsConfigInterrupt(VL6180XDev_t dev, uint8_t ConfigGpioInt)
Davidroid 57:fa4c622b04a7 704 {
Davidroid 57:fa4c622b04a7 705 int status;
Davidroid 57:fa4c622b04a7 706
Davidroid 57:fa4c622b04a7 707 if( ConfigGpioInt<= CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY){
Davidroid 57:fa4c622b04a7 708 status = VL6180X_UpdateByte(dev, SYSTEM_INTERRUPT_CONFIG_GPIO, (uint8_t)(~CONFIG_GPIO_ALS_MASK), (ConfigGpioInt<<3));
Davidroid 57:fa4c622b04a7 709 }
Davidroid 57:fa4c622b04a7 710 else{
Davidroid 57:fa4c622b04a7 711 VL6180X_ErrLog("Invalid config mode param %d", (int)ConfigGpioInt);
Davidroid 57:fa4c622b04a7 712 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 713 }
Davidroid 57:fa4c622b04a7 714 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 715 return status;
Davidroid 57:fa4c622b04a7 716 }
Davidroid 57:fa4c622b04a7 717
Davidroid 57:fa4c622b04a7 718 int VL6180X::VL6180X_AlsSetThresholds(VL6180XDev_t dev, uint16_t low, uint16_t high) {
Davidroid 57:fa4c622b04a7 719 int status;
Davidroid 57:fa4c622b04a7 720
Davidroid 57:fa4c622b04a7 721 LOG_FUNCTION_START("%d %d", (int )low, (int)high);
Davidroid 57:fa4c622b04a7 722
Davidroid 57:fa4c622b04a7 723 status = VL6180X_WrWord(dev, SYSALS_THRESH_LOW, low);
Davidroid 57:fa4c622b04a7 724 if(!status ){
Davidroid 57:fa4c622b04a7 725 status = VL6180X_WrWord(dev, SYSALS_THRESH_HIGH, high);
Davidroid 57:fa4c622b04a7 726 }
Davidroid 57:fa4c622b04a7 727
Davidroid 57:fa4c622b04a7 728 LOG_FUNCTION_END(status) ;
Davidroid 57:fa4c622b04a7 729 return status;
Davidroid 57:fa4c622b04a7 730 }
Davidroid 57:fa4c622b04a7 731
Davidroid 57:fa4c622b04a7 732 int VL6180X::VL6180X_AlsSetAnalogueGain(VL6180XDev_t dev, uint8_t gain) {
Davidroid 57:fa4c622b04a7 733 int status;
Davidroid 57:fa4c622b04a7 734 uint8_t GainTotal;
Davidroid 57:fa4c622b04a7 735
Davidroid 57:fa4c622b04a7 736 LOG_FUNCTION_START("%d", (int )gain);
Davidroid 57:fa4c622b04a7 737 gain&=~0x40;
Davidroid 57:fa4c622b04a7 738 if (gain > 7) {
Davidroid 57:fa4c622b04a7 739 gain = 7;
Davidroid 57:fa4c622b04a7 740 }
Davidroid 57:fa4c622b04a7 741 GainTotal = gain|0x40;
Davidroid 57:fa4c622b04a7 742
Davidroid 57:fa4c622b04a7 743 status = VL6180X_WrByte(dev, SYSALS_ANALOGUE_GAIN, GainTotal);
Davidroid 57:fa4c622b04a7 744 if( !status){
Davidroid 57:fa4c622b04a7 745 VL6180XDevDataSet(dev, AlsGainCode, gain);
Davidroid 57:fa4c622b04a7 746 }
Davidroid 57:fa4c622b04a7 747
Davidroid 57:fa4c622b04a7 748 LOG_FUNCTION_END_FMT(status, "%d %d", (int ) gain, (int )GainTotal);
Davidroid 57:fa4c622b04a7 749 return status;
Davidroid 57:fa4c622b04a7 750 }
Davidroid 57:fa4c622b04a7 751
Davidroid 57:fa4c622b04a7 752 int VL6180X::VL6180X_AlsSetInterMeasurementPeriod(VL6180XDev_t dev, uint16_t intermeasurement_period_ms)
Davidroid 57:fa4c622b04a7 753 {
Davidroid 57:fa4c622b04a7 754 int status;
Davidroid 57:fa4c622b04a7 755
Davidroid 57:fa4c622b04a7 756 LOG_FUNCTION_START("%d",(int)intermeasurement_period_ms);
Davidroid 57:fa4c622b04a7 757 /* clipping: range is 0-2550ms */
Davidroid 57:fa4c622b04a7 758 if (intermeasurement_period_ms >= 255 *10)
Davidroid 57:fa4c622b04a7 759 intermeasurement_period_ms = 255 *10;
Davidroid 57:fa4c622b04a7 760 status=VL6180X_WrByte(dev, SYSALS_INTERMEASUREMENT_PERIOD, (uint8_t)(intermeasurement_period_ms/10));
Davidroid 57:fa4c622b04a7 761
Davidroid 57:fa4c622b04a7 762 LOG_FUNCTION_END_FMT(status, "%d", (int) intermeasurement_period_ms);
Davidroid 57:fa4c622b04a7 763 return status;
Davidroid 57:fa4c622b04a7 764 }
Davidroid 57:fa4c622b04a7 765
Davidroid 57:fa4c622b04a7 766
Davidroid 57:fa4c622b04a7 767 int VL6180X::VL6180X_AlsSetIntegrationPeriod(VL6180XDev_t dev, uint16_t period_ms)
Davidroid 57:fa4c622b04a7 768 {
Davidroid 57:fa4c622b04a7 769 int status;
Davidroid 57:fa4c622b04a7 770 uint16_t SetIntegrationPeriod;
Davidroid 57:fa4c622b04a7 771
Davidroid 57:fa4c622b04a7 772 LOG_FUNCTION_START("%d", (int)period_ms);
Davidroid 57:fa4c622b04a7 773
Davidroid 57:fa4c622b04a7 774 if( period_ms>=1 )
Davidroid 57:fa4c622b04a7 775 SetIntegrationPeriod = period_ms - 1;
Davidroid 57:fa4c622b04a7 776 else
Davidroid 57:fa4c622b04a7 777 SetIntegrationPeriod = period_ms;
Davidroid 57:fa4c622b04a7 778
Davidroid 57:fa4c622b04a7 779 if (SetIntegrationPeriod > 464) {
Davidroid 57:fa4c622b04a7 780 SetIntegrationPeriod = 464;
Davidroid 57:fa4c622b04a7 781 }
Davidroid 57:fa4c622b04a7 782 else if (SetIntegrationPeriod == 255) {
Davidroid 57:fa4c622b04a7 783 SetIntegrationPeriod++; /* can't write 255 since this causes the device to lock out.*/
Davidroid 57:fa4c622b04a7 784 }
Davidroid 57:fa4c622b04a7 785
Davidroid 57:fa4c622b04a7 786 status =VL6180X_WrWord(dev, SYSALS_INTEGRATION_PERIOD, SetIntegrationPeriod);
Davidroid 57:fa4c622b04a7 787 if( !status ){
Davidroid 57:fa4c622b04a7 788 VL6180XDevDataSet(dev, IntegrationPeriod, SetIntegrationPeriod) ;
Davidroid 57:fa4c622b04a7 789 }
Davidroid 57:fa4c622b04a7 790 LOG_FUNCTION_END_FMT(status, "%d", (int)SetIntegrationPeriod);
Davidroid 57:fa4c622b04a7 791 return status;
Davidroid 57:fa4c622b04a7 792 }
Davidroid 57:fa4c622b04a7 793
Davidroid 57:fa4c622b04a7 794 #endif /* HAVE_ALS_SUPPORT */
Davidroid 57:fa4c622b04a7 795
Davidroid 57:fa4c622b04a7 796
Davidroid 57:fa4c622b04a7 797 int VL6180X::VL6180X_RangePollMeasurement(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData)
Davidroid 57:fa4c622b04a7 798 {
Davidroid 57:fa4c622b04a7 799 int status;
Davidroid 57:fa4c622b04a7 800 int ClrStatus;
Davidroid 57:fa4c622b04a7 801 IntrStatus_t IntStatus;
Davidroid 57:fa4c622b04a7 802
Davidroid 57:fa4c622b04a7 803 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 804 /* start single range measurement */
Davidroid 57:fa4c622b04a7 805
Davidroid 57:fa4c622b04a7 806
Davidroid 57:fa4c622b04a7 807 #if VL6180X_SAFE_POLLING_ENTER
Davidroid 57:fa4c622b04a7 808 /* if device get stopped with left interrupt uncleared , it is required to clear them now or poll for new condition will never occur*/
Davidroid 57:fa4c622b04a7 809 status=VL6180X_RangeClearInterrupt(dev);
Davidroid 57:fa4c622b04a7 810 if(status){
Davidroid 57:fa4c622b04a7 811 VL6180X_ErrLog("VL6180X_RangeClearInterrupt fail");
Davidroid 57:fa4c622b04a7 812 goto done;
Davidroid 57:fa4c622b04a7 813 }
Davidroid 57:fa4c622b04a7 814 #endif
Davidroid 57:fa4c622b04a7 815 /* //![single_shot_snipet] */
Davidroid 57:fa4c622b04a7 816 status=VL6180X_RangeSetSystemMode(dev, MODE_START_STOP|MODE_SINGLESHOT);
Davidroid 57:fa4c622b04a7 817 if( status ){
Davidroid 57:fa4c622b04a7 818 VL6180X_ErrLog("VL6180X_RangeSetSystemMode fail");
Davidroid 57:fa4c622b04a7 819 goto done;
Davidroid 57:fa4c622b04a7 820 }
Davidroid 57:fa4c622b04a7 821
Davidroid 57:fa4c622b04a7 822 /* poll for new sample ready */
Davidroid 57:fa4c622b04a7 823 while(1 ){
Davidroid 57:fa4c622b04a7 824 status=VL6180X_RangeGetInterruptStatus(dev, &IntStatus.val);
Davidroid 57:fa4c622b04a7 825 if( status ){
Davidroid 57:fa4c622b04a7 826 break;
Davidroid 57:fa4c622b04a7 827 }
Davidroid 57:fa4c622b04a7 828 if( IntStatus.status.Error !=0 ){
Davidroid 57:fa4c622b04a7 829 VL6180X_ErrLog("GPIO int Error report %d",(int)IntStatus.val);
Davidroid 57:fa4c622b04a7 830 status = RANGE_ERROR;
Davidroid 57:fa4c622b04a7 831 break;
Davidroid 57:fa4c622b04a7 832 }
Davidroid 57:fa4c622b04a7 833 else
Davidroid 57:fa4c622b04a7 834 if( IntStatus.status.Range == RES_INT_STAT_GPIO_NEW_SAMPLE_READY){
Davidroid 57:fa4c622b04a7 835 break;
Davidroid 57:fa4c622b04a7 836 }
Davidroid 57:fa4c622b04a7 837 wait_ms(10);
Davidroid 57:fa4c622b04a7 838 }
Davidroid 57:fa4c622b04a7 839 /* //![single_shot_snipet] */
Davidroid 57:fa4c622b04a7 840
Davidroid 57:fa4c622b04a7 841 if ( !status ){
Davidroid 57:fa4c622b04a7 842 status = VL6180X_RangeGetMeasurement(dev, pRangeData);
Davidroid 57:fa4c622b04a7 843 }
Davidroid 57:fa4c622b04a7 844
Davidroid 57:fa4c622b04a7 845 /* clear range interrupt source */
Davidroid 57:fa4c622b04a7 846 ClrStatus = VL6180X_RangeClearInterrupt(dev);
Davidroid 57:fa4c622b04a7 847 if( ClrStatus ){
Davidroid 57:fa4c622b04a7 848 VL6180X_ErrLog("VL6180X_RangeClearInterrupt fail");
Davidroid 57:fa4c622b04a7 849 /* leave initial status if already in error */
Davidroid 57:fa4c622b04a7 850 if( !status ){
Davidroid 57:fa4c622b04a7 851 status=ClrStatus;
Davidroid 57:fa4c622b04a7 852 }
Davidroid 57:fa4c622b04a7 853 }
Davidroid 57:fa4c622b04a7 854 done:
Davidroid 57:fa4c622b04a7 855 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 856 return status;
Davidroid 57:fa4c622b04a7 857 }
Davidroid 57:fa4c622b04a7 858
Davidroid 57:fa4c622b04a7 859
Davidroid 57:fa4c622b04a7 860
Davidroid 57:fa4c622b04a7 861 int VL6180X::VL6180X_RangeGetMeasurement(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData)
Davidroid 57:fa4c622b04a7 862 {
Davidroid 57:fa4c622b04a7 863 int status;
Davidroid 57:fa4c622b04a7 864 uint16_t RawRate;
Davidroid 57:fa4c622b04a7 865 uint8_t RawStatus;
Davidroid 57:fa4c622b04a7 866
Davidroid 57:fa4c622b04a7 867 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 868
Davidroid 57:fa4c622b04a7 869 status = VL6180X_RangeGetResult(dev, &pRangeData->range_mm);
Davidroid 57:fa4c622b04a7 870 if( !status ){
Davidroid 57:fa4c622b04a7 871 status = VL6180X_RdWord(dev,RESULT_RANGE_SIGNAL_RATE, &RawRate );
Davidroid 57:fa4c622b04a7 872 if( !status ){
Davidroid 57:fa4c622b04a7 873 pRangeData->signalRate_mcps = VL6180X_9to7Conv(RawRate);
Davidroid 57:fa4c622b04a7 874 status = VL6180X_RdByte(dev, RESULT_RANGE_STATUS, &RawStatus);
Davidroid 57:fa4c622b04a7 875 if( !status ){
Davidroid 57:fa4c622b04a7 876 pRangeData->errorStatus = RawStatus >>4;
Davidroid 57:fa4c622b04a7 877 }
Davidroid 57:fa4c622b04a7 878 else{
Davidroid 57:fa4c622b04a7 879 VL6180X_ErrLog("Rd RESULT_RANGE_STATUS fail");
Davidroid 57:fa4c622b04a7 880 }
Davidroid 57:fa4c622b04a7 881 #if VL6180X_WRAP_AROUND_FILTER_SUPPORT || VL6180X_HAVE_DMAX_RANGING
Davidroid 57:fa4c622b04a7 882 status = _GetRateResult(dev, pRangeData);
Davidroid 57:fa4c622b04a7 883 if( status )
Davidroid 57:fa4c622b04a7 884 goto error;
Davidroid 57:fa4c622b04a7 885 #endif
Davidroid 57:fa4c622b04a7 886 #if VL6180X_WRAP_AROUND_FILTER_SUPPORT
Davidroid 57:fa4c622b04a7 887 /* if enabled run filter */
Davidroid 57:fa4c622b04a7 888 if( _IsWrapArroundActive(dev) ){
Davidroid 57:fa4c622b04a7 889 status=_filter_GetResult(dev, pRangeData);
Davidroid 57:fa4c622b04a7 890 if( !status){
Davidroid 57:fa4c622b04a7 891 /* patch the range status and measure if it is filtered */
Davidroid 57:fa4c622b04a7 892 if( pRangeData->range_mm != pRangeData->FilteredData.range_mm) {
Davidroid 57:fa4c622b04a7 893 pRangeData->errorStatus=RangingFiltered;
Davidroid 57:fa4c622b04a7 894 pRangeData->range_mm = pRangeData->FilteredData.range_mm;
Davidroid 57:fa4c622b04a7 895 }
Davidroid 57:fa4c622b04a7 896 }
Davidroid 57:fa4c622b04a7 897 }
Davidroid 57:fa4c622b04a7 898 #endif
Davidroid 57:fa4c622b04a7 899
Davidroid 57:fa4c622b04a7 900 #if VL6180X_HAVE_DMAX_RANGING
Davidroid 57:fa4c622b04a7 901 if(_IsDMaxActive(dev) ){
Davidroid 57:fa4c622b04a7 902 _DMax_Compute(dev, pRangeData);
Davidroid 57:fa4c622b04a7 903 }
Davidroid 57:fa4c622b04a7 904 #endif
Davidroid 57:fa4c622b04a7 905 }
Davidroid 57:fa4c622b04a7 906 else{
Davidroid 57:fa4c622b04a7 907 VL6180X_ErrLog("Rd RESULT_RANGE_SIGNAL_RATE fail");
Davidroid 57:fa4c622b04a7 908 }
Davidroid 57:fa4c622b04a7 909 }
Davidroid 57:fa4c622b04a7 910 else{
Davidroid 57:fa4c622b04a7 911 VL6180X_ErrLog("VL6180X_GetRangeResult fail");
Davidroid 57:fa4c622b04a7 912 }
Davidroid 57:fa4c622b04a7 913 error:
Davidroid 57:fa4c622b04a7 914 LOG_FUNCTION_END_FMT(status, "%d %d %d", (int)pRangeData->range_mm, (int)pRangeData->signalRate_mcps, (int)pRangeData->errorStatus) ;
Davidroid 57:fa4c622b04a7 915 return status;
Davidroid 57:fa4c622b04a7 916 }
Davidroid 57:fa4c622b04a7 917
Davidroid 57:fa4c622b04a7 918
Davidroid 57:fa4c622b04a7 919 int VL6180X::VL6180X_RangeGetMeasurementIfReady(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData)
Davidroid 57:fa4c622b04a7 920 {
Davidroid 57:fa4c622b04a7 921 int status;
Davidroid 57:fa4c622b04a7 922 IntrStatus_t IntStatus;
Davidroid 57:fa4c622b04a7 923
Davidroid 57:fa4c622b04a7 924 LOG_FUNCTION_START();
Davidroid 57:fa4c622b04a7 925
Davidroid 57:fa4c622b04a7 926 status = VL6180X_RangeGetInterruptStatus(dev, &IntStatus.val);
Davidroid 57:fa4c622b04a7 927 if( status ==0 ){
Davidroid 57:fa4c622b04a7 928 if( IntStatus.status.Error !=0 ){
Davidroid 57:fa4c622b04a7 929 VL6180X_ErrLog("GPIO int Error report %d",(int)IntStatus.val);
Davidroid 57:fa4c622b04a7 930 status = RANGE_ERROR;
Davidroid 57:fa4c622b04a7 931 }
Davidroid 57:fa4c622b04a7 932 else
Davidroid 57:fa4c622b04a7 933 if( IntStatus.status.Range == RES_INT_STAT_GPIO_NEW_SAMPLE_READY){
Davidroid 57:fa4c622b04a7 934 status = VL6180X_RangeGetMeasurement(dev,pRangeData );
Davidroid 57:fa4c622b04a7 935 if( status == 0){
Davidroid 57:fa4c622b04a7 936 /* clear range interrupt source */
Davidroid 57:fa4c622b04a7 937 status = VL6180X_RangeClearInterrupt(dev);
Davidroid 57:fa4c622b04a7 938 if( status ){
Davidroid 57:fa4c622b04a7 939 VL6180X_ErrLog("VL6180X_RangeClearInterrupt fail");
Davidroid 57:fa4c622b04a7 940 }
Davidroid 57:fa4c622b04a7 941 }
Davidroid 57:fa4c622b04a7 942 }
Davidroid 57:fa4c622b04a7 943 else{
Davidroid 57:fa4c622b04a7 944 status = NOT_READY;
Davidroid 57:fa4c622b04a7 945 }
Davidroid 57:fa4c622b04a7 946 }
Davidroid 57:fa4c622b04a7 947 else{
Davidroid 57:fa4c622b04a7 948 VL6180X_ErrLog("fail to get interrupt status");
Davidroid 57:fa4c622b04a7 949 }
Davidroid 57:fa4c622b04a7 950 LOG_FUNCTION_END(status) ;
Davidroid 57:fa4c622b04a7 951 return status;
Davidroid 57:fa4c622b04a7 952 }
Davidroid 57:fa4c622b04a7 953
Davidroid 57:fa4c622b04a7 954 int VL6180X::VL6180X_FilterSetState(VL6180XDev_t dev, int state){
Davidroid 57:fa4c622b04a7 955 int status;
Davidroid 57:fa4c622b04a7 956 LOG_FUNCTION_START("%d", state);
Davidroid 57:fa4c622b04a7 957 #if VL6180X_WRAP_AROUND_FILTER_SUPPORT
Davidroid 57:fa4c622b04a7 958 VL6180XDevDataSet(dev,WrapAroundFilterActive, state);
Davidroid 57:fa4c622b04a7 959 status = 0;
Davidroid 57:fa4c622b04a7 960 #else
Davidroid 57:fa4c622b04a7 961 status = NOT_SUPPORTED;
Davidroid 57:fa4c622b04a7 962 #endif
Davidroid 57:fa4c622b04a7 963 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 964 return status;
Davidroid 57:fa4c622b04a7 965 }
Davidroid 57:fa4c622b04a7 966
Davidroid 57:fa4c622b04a7 967 int VL6180X::VL6180X_FilterGetState(VL6180XDev_t dev){
Davidroid 57:fa4c622b04a7 968 int status;
Davidroid 57:fa4c622b04a7 969 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 970 #if VL6180X_WRAP_AROUND_FILTER_SUPPORT
Davidroid 57:fa4c622b04a7 971 status = VL6180XDevDataGet(dev,WrapAroundFilterActive);
Davidroid 57:fa4c622b04a7 972 #else
Davidroid 57:fa4c622b04a7 973 status = 0;
Davidroid 57:fa4c622b04a7 974 #endif
Davidroid 57:fa4c622b04a7 975 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 976 return status;
Davidroid 57:fa4c622b04a7 977 }
Davidroid 57:fa4c622b04a7 978
Davidroid 57:fa4c622b04a7 979 int VL6180X::VL6180X_RangeGetResult(VL6180XDev_t dev, uint32_t *pRange_mm) {
Davidroid 57:fa4c622b04a7 980 int status;
Davidroid 57:fa4c622b04a7 981 uint8_t RawRange;
Davidroid 57:fa4c622b04a7 982 int32_t Upscale;
Davidroid 57:fa4c622b04a7 983
Davidroid 57:fa4c622b04a7 984 LOG_FUNCTION_START("%p",pRange_mm);
Davidroid 57:fa4c622b04a7 985
Davidroid 57:fa4c622b04a7 986 status = VL6180X_RdByte(dev, RESULT_RANGE_VAL, &RawRange);
Davidroid 57:fa4c622b04a7 987 if( !status ){
Davidroid 57:fa4c622b04a7 988 Upscale = _GetUpscale(dev);
Davidroid 57:fa4c622b04a7 989 *pRange_mm= Upscale*(int32_t)RawRange;
Davidroid 57:fa4c622b04a7 990 }
Davidroid 57:fa4c622b04a7 991 LOG_FUNCTION_END_FMT(status, "%d", (int)*pRange_mm);
Davidroid 57:fa4c622b04a7 992 return status;
Davidroid 57:fa4c622b04a7 993 }
Davidroid 57:fa4c622b04a7 994
Davidroid 57:fa4c622b04a7 995 int VL6180X::VL6180X_RangeSetRawThresholds(VL6180XDev_t dev, uint8_t low, uint8_t high)
Davidroid 57:fa4c622b04a7 996 {
Davidroid 57:fa4c622b04a7 997 int status;
Davidroid 57:fa4c622b04a7 998 LOG_FUNCTION_START("%d %d", (int) low, (int)high);
Davidroid 57:fa4c622b04a7 999 /* TODO we can optimize here grouping high/low in a word but that's cpu endianness dependent */
Davidroid 57:fa4c622b04a7 1000 status=VL6180X_WrByte(dev, SYSRANGE_THRESH_HIGH,high);
Davidroid 57:fa4c622b04a7 1001 if( !status){
Davidroid 57:fa4c622b04a7 1002 status=VL6180X_WrByte(dev, SYSRANGE_THRESH_LOW, low);
Davidroid 57:fa4c622b04a7 1003 }
Davidroid 57:fa4c622b04a7 1004
Davidroid 57:fa4c622b04a7 1005 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1006 return status;
Davidroid 57:fa4c622b04a7 1007 }
Davidroid 57:fa4c622b04a7 1008
Davidroid 57:fa4c622b04a7 1009 int VL6180X::VL6180X_RangeSetThresholds(VL6180XDev_t dev, uint16_t low, uint16_t high, int UseSafeParamHold)
Davidroid 57:fa4c622b04a7 1010 {
Davidroid 57:fa4c622b04a7 1011 int status;
Davidroid 57:fa4c622b04a7 1012 int scale;
Davidroid 57:fa4c622b04a7 1013 LOG_FUNCTION_START("%d %d", (int) low, (int)high);
Davidroid 57:fa4c622b04a7 1014 scale=_GetUpscale(dev,UpscaleFactor);
Davidroid 57:fa4c622b04a7 1015 if( low>scale*255 || high >scale*255){
Davidroid 57:fa4c622b04a7 1016 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1017 }
Davidroid 57:fa4c622b04a7 1018 else{
Davidroid 57:fa4c622b04a7 1019 do{
Davidroid 57:fa4c622b04a7 1020 if( UseSafeParamHold ){
Davidroid 57:fa4c622b04a7 1021 status=VL6180X_SetGroupParamHold(dev, 1);
Davidroid 57:fa4c622b04a7 1022 if( status )
Davidroid 57:fa4c622b04a7 1023 break;
Davidroid 57:fa4c622b04a7 1024 }
Davidroid 57:fa4c622b04a7 1025 status=VL6180X_RangeSetRawThresholds(dev, (uint8_t)(low/scale), (uint8_t)(high/scale));
Davidroid 57:fa4c622b04a7 1026 if( status ){
Davidroid 57:fa4c622b04a7 1027 VL6180X_ErrLog("VL6180X_RangeSetRawThresholds fail");
Davidroid 57:fa4c622b04a7 1028 }
Davidroid 57:fa4c622b04a7 1029 if( UseSafeParamHold ){
Davidroid 57:fa4c622b04a7 1030 int HoldStatus;
Davidroid 57:fa4c622b04a7 1031 /* tryt to unset param hold vene if previous fail */
Davidroid 57:fa4c622b04a7 1032 HoldStatus=VL6180X_SetGroupParamHold(dev, 0);
Davidroid 57:fa4c622b04a7 1033 if( !status)
Davidroid 57:fa4c622b04a7 1034 status=HoldStatus;
Davidroid 57:fa4c622b04a7 1035 }
Davidroid 57:fa4c622b04a7 1036 }
Davidroid 57:fa4c622b04a7 1037 while(0);
Davidroid 57:fa4c622b04a7 1038 }
Davidroid 57:fa4c622b04a7 1039
Davidroid 57:fa4c622b04a7 1040 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1041 return status;
Davidroid 57:fa4c622b04a7 1042 }
Davidroid 57:fa4c622b04a7 1043
Davidroid 57:fa4c622b04a7 1044
Davidroid 57:fa4c622b04a7 1045 int VL6180X::VL6180X_RangeGetThresholds(VL6180XDev_t dev, uint16_t *low, uint16_t *high)
Davidroid 57:fa4c622b04a7 1046 {
Davidroid 57:fa4c622b04a7 1047 int status;
Davidroid 57:fa4c622b04a7 1048 uint8_t RawLow, RawHigh;
Davidroid 57:fa4c622b04a7 1049 int scale;
Davidroid 57:fa4c622b04a7 1050
Davidroid 57:fa4c622b04a7 1051 LOG_FUNCTION_START("%p %p", low , high);
Davidroid 57:fa4c622b04a7 1052
Davidroid 57:fa4c622b04a7 1053 scale=_GetUpscale(dev,UpscaleFactor);
Davidroid 57:fa4c622b04a7 1054 do{
Davidroid 57:fa4c622b04a7 1055 if( high != NULL ){
Davidroid 57:fa4c622b04a7 1056 status=VL6180X_RdByte(dev, SYSRANGE_THRESH_HIGH,&RawHigh);
Davidroid 57:fa4c622b04a7 1057 if( status ){
Davidroid 57:fa4c622b04a7 1058 VL6180X_ErrLog("rd SYSRANGE_THRESH_HIGH fail");
Davidroid 57:fa4c622b04a7 1059 break;
Davidroid 57:fa4c622b04a7 1060 }
Davidroid 57:fa4c622b04a7 1061 *high=(uint16_t)RawHigh*scale;
Davidroid 57:fa4c622b04a7 1062 }
Davidroid 57:fa4c622b04a7 1063 if( low != NULL ) {
Davidroid 57:fa4c622b04a7 1064 status=VL6180X_RdByte(dev, SYSRANGE_THRESH_LOW, &RawLow);
Davidroid 57:fa4c622b04a7 1065 if( status ){
Davidroid 57:fa4c622b04a7 1066 VL6180X_ErrLog("rd SYSRANGE_THRESH_LOW fail");
Davidroid 57:fa4c622b04a7 1067 break;
Davidroid 57:fa4c622b04a7 1068 }
Davidroid 57:fa4c622b04a7 1069 *low=(uint16_t)RawLow*scale;
Davidroid 57:fa4c622b04a7 1070 }
Davidroid 57:fa4c622b04a7 1071 }
Davidroid 57:fa4c622b04a7 1072 while(0);
Davidroid 57:fa4c622b04a7 1073 LOG_FUNCTION_END_FMT(status, "%d %d",(int)*low ,(int)*high);
Davidroid 57:fa4c622b04a7 1074 return status;
Davidroid 57:fa4c622b04a7 1075 }
Davidroid 57:fa4c622b04a7 1076
Davidroid 57:fa4c622b04a7 1077
Davidroid 57:fa4c622b04a7 1078 int VL6180X::VL6180X_RangeGetInterruptStatus(VL6180XDev_t dev, uint8_t *pIntStatus) {
Davidroid 57:fa4c622b04a7 1079 int status;
Davidroid 57:fa4c622b04a7 1080 uint8_t IntStatus;
Davidroid 57:fa4c622b04a7 1081 LOG_FUNCTION_START("%p", pIntStatus);
Davidroid 57:fa4c622b04a7 1082 /* FIXME we are grouping "error" with over status the user must check implicitly for it
Davidroid 57:fa4c622b04a7 1083 * not just new sample or over status , that will nevr show up in case of error*/
Davidroid 57:fa4c622b04a7 1084 status = VL6180X_RdByte(dev, RESULT_INTERRUPT_STATUS_GPIO, &IntStatus);
Davidroid 57:fa4c622b04a7 1085 *pIntStatus= IntStatus&0xC7;
Davidroid 57:fa4c622b04a7 1086
Davidroid 57:fa4c622b04a7 1087 LOG_FUNCTION_END_FMT(status, "%d", (int)*pIntStatus);
Davidroid 57:fa4c622b04a7 1088 return status;
Davidroid 57:fa4c622b04a7 1089 }
Davidroid 57:fa4c622b04a7 1090
Davidroid 57:fa4c622b04a7 1091
Davidroid 57:fa4c622b04a7 1092 int VL6180X::VL6180X_GetInterruptStatus(VL6180XDev_t dev, uint8_t *IntStatus)
Davidroid 57:fa4c622b04a7 1093 {
Davidroid 57:fa4c622b04a7 1094 int status;
Davidroid 57:fa4c622b04a7 1095 LOG_FUNCTION_START("%p" , IntStatus);
Davidroid 57:fa4c622b04a7 1096 status = VL6180X_RdByte(dev, RESULT_INTERRUPT_STATUS_GPIO, IntStatus);
Davidroid 57:fa4c622b04a7 1097 LOG_FUNCTION_END_FMT(status, "%d", (int)*IntStatus);
Davidroid 57:fa4c622b04a7 1098 return status;
Davidroid 57:fa4c622b04a7 1099 }
Davidroid 57:fa4c622b04a7 1100
Davidroid 57:fa4c622b04a7 1101 int VL6180X::VL6180X_ClearInterrupt(VL6180XDev_t dev, uint8_t IntClear )
Davidroid 57:fa4c622b04a7 1102 {
Davidroid 57:fa4c622b04a7 1103 int status;
Davidroid 57:fa4c622b04a7 1104 LOG_FUNCTION_START("%d" ,(int)IntClear);
Davidroid 57:fa4c622b04a7 1105 if( IntClear <= 7 ){
Davidroid 57:fa4c622b04a7 1106 status=VL6180X_WrByte( dev, SYSTEM_INTERRUPT_CLEAR, IntClear);
Davidroid 57:fa4c622b04a7 1107 }
Davidroid 57:fa4c622b04a7 1108 else{
Davidroid 57:fa4c622b04a7 1109 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1110 }
Davidroid 57:fa4c622b04a7 1111 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1112 return status;
Davidroid 57:fa4c622b04a7 1113 }
Davidroid 57:fa4c622b04a7 1114
Davidroid 57:fa4c622b04a7 1115
Davidroid 57:fa4c622b04a7 1116 int VL6180X::VL6180X_RangeStaticInit(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 1117 {
Davidroid 57:fa4c622b04a7 1118 int status;
Davidroid 57:fa4c622b04a7 1119 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 1120
Davidroid 57:fa4c622b04a7 1121 /* REGISTER_TUNING_SR03_270514_CustomerView.txt */
Davidroid 57:fa4c622b04a7 1122 VL6180X_WrByte( dev, 0x0207, 0x01);
Davidroid 57:fa4c622b04a7 1123 VL6180X_WrByte( dev, 0x0208, 0x01);
Davidroid 57:fa4c622b04a7 1124 VL6180X_WrByte( dev, 0x0096, 0x00);
Davidroid 57:fa4c622b04a7 1125 VL6180X_WrByte( dev, 0x0097, 0xfd);
Davidroid 57:fa4c622b04a7 1126 VL6180X_WrByte( dev, 0x00e3, 0x00);
Davidroid 57:fa4c622b04a7 1127 VL6180X_WrByte( dev, 0x00e4, 0x04);
Davidroid 57:fa4c622b04a7 1128 VL6180X_WrByte( dev, 0x00e5, 0x02);
Davidroid 57:fa4c622b04a7 1129 VL6180X_WrByte( dev, 0x00e6, 0x01);
Davidroid 57:fa4c622b04a7 1130 VL6180X_WrByte( dev, 0x00e7, 0x03);
Davidroid 57:fa4c622b04a7 1131 VL6180X_WrByte( dev, 0x00f5, 0x02);
Davidroid 57:fa4c622b04a7 1132 VL6180X_WrByte( dev, 0x00d9, 0x05);
Davidroid 57:fa4c622b04a7 1133 VL6180X_WrByte( dev, 0x00db, 0xce);
Davidroid 57:fa4c622b04a7 1134 VL6180X_WrByte( dev, 0x00dc, 0x03);
Davidroid 57:fa4c622b04a7 1135 VL6180X_WrByte( dev, 0x00dd, 0xf8);
Davidroid 57:fa4c622b04a7 1136 VL6180X_WrByte( dev, 0x009f, 0x00);
Davidroid 57:fa4c622b04a7 1137 VL6180X_WrByte( dev, 0x00a3, 0x3c);
Davidroid 57:fa4c622b04a7 1138 VL6180X_WrByte( dev, 0x00b7, 0x00);
Davidroid 57:fa4c622b04a7 1139 VL6180X_WrByte( dev, 0x00bb, 0x3c);
Davidroid 57:fa4c622b04a7 1140 VL6180X_WrByte( dev, 0x00b2, 0x09);
Davidroid 57:fa4c622b04a7 1141 VL6180X_WrByte( dev, 0x00ca, 0x09);
Davidroid 57:fa4c622b04a7 1142 VL6180X_WrByte( dev, 0x0198, 0x01);
Davidroid 57:fa4c622b04a7 1143 VL6180X_WrByte( dev, 0x01b0, 0x17);
Davidroid 57:fa4c622b04a7 1144 VL6180X_WrByte( dev, 0x01ad, 0x00);
Davidroid 57:fa4c622b04a7 1145 VL6180X_WrByte( dev, 0x00ff, 0x05);
Davidroid 57:fa4c622b04a7 1146 VL6180X_WrByte( dev, 0x0100, 0x05);
Davidroid 57:fa4c622b04a7 1147 VL6180X_WrByte( dev, 0x0199, 0x05);
Davidroid 57:fa4c622b04a7 1148 VL6180X_WrByte( dev, 0x01a6, 0x1b);
Davidroid 57:fa4c622b04a7 1149 VL6180X_WrByte( dev, 0x01ac, 0x3e);
Davidroid 57:fa4c622b04a7 1150 VL6180X_WrByte( dev, 0x01a7, 0x1f);
Davidroid 57:fa4c622b04a7 1151 VL6180X_WrByte( dev, 0x0030, 0x00);
Davidroid 57:fa4c622b04a7 1152
Davidroid 57:fa4c622b04a7 1153 /* Recommended : Public registers - See data sheet for more detail */
Davidroid 57:fa4c622b04a7 1154 VL6180X_WrByte( dev, SYSTEM_MODE_GPIO1, 0x10); /* Enables polling for New Sample ready when measurement completes */
Davidroid 57:fa4c622b04a7 1155 VL6180X_WrByte( dev, READOUT_AVERAGING_SAMPLE_PERIOD, 0x30); /* Set the averaging sample period (compromise between lower noise and increased execution time) */
Davidroid 57:fa4c622b04a7 1156 VL6180X_WrByte( dev, SYSALS_ANALOGUE_GAIN, 0x46); /* Sets the light and dark gain (upper nibble). Dark gain should not be changed.*/
Davidroid 57:fa4c622b04a7 1157 VL6180X_WrByte( dev, SYSRANGE_VHV_REPEAT_RATE, 0xFF); /* sets the # of range measurements after which auto calibration of system is performed */
Davidroid 57:fa4c622b04a7 1158 VL6180X_WrByte( dev, SYSALS_INTEGRATION_PERIOD, 0x63); /* Set ALS integration time to 100ms */
Davidroid 57:fa4c622b04a7 1159 VL6180X_WrByte( dev, SYSRANGE_VHV_RECALIBRATE, 0x01); /* perform a single temperature calibration of the ranging sensor */
Davidroid 57:fa4c622b04a7 1160
Davidroid 57:fa4c622b04a7 1161 /* Optional: Public registers - See data sheet for more detail */
Davidroid 57:fa4c622b04a7 1162 VL6180X_WrByte( dev, SYSRANGE_INTERMEASUREMENT_PERIOD, 0x09); /* Set default ranging inter-measurement period to 100ms */
Davidroid 57:fa4c622b04a7 1163 VL6180X_WrByte( dev, SYSALS_INTERMEASUREMENT_PERIOD, 0x31); /* Set default ALS inter-measurement period to 500ms */
Davidroid 57:fa4c622b04a7 1164 VL6180X_WrByte( dev, SYSTEM_INTERRUPT_CONFIG_GPIO, 0x24); /* Configures interrupt on New sample ready */
Davidroid 57:fa4c622b04a7 1165
Davidroid 57:fa4c622b04a7 1166
Davidroid 57:fa4c622b04a7 1167 status=VL6180X_RangeSetMaxConvergenceTime(dev, 50); /* Calculate ece value on initialization (use max conv) */
Davidroid 57:fa4c622b04a7 1168 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1169
Davidroid 57:fa4c622b04a7 1170 return status;
Davidroid 57:fa4c622b04a7 1171 }
Davidroid 57:fa4c622b04a7 1172
Davidroid 57:fa4c622b04a7 1173 #if VL6180X_UPSCALE_SUPPORT != 1
Davidroid 57:fa4c622b04a7 1174
Davidroid 57:fa4c622b04a7 1175 int VL6180X::_UpscaleInitPatch0(VL6180XDev_t dev){
Davidroid 57:fa4c622b04a7 1176 int status;
Davidroid 57:fa4c622b04a7 1177 uint32_t CalValue=0;
Davidroid 57:fa4c622b04a7 1178 CalValue= VL6180XDevDataGet(dev, Part2PartAmbNVM);
Davidroid 57:fa4c622b04a7 1179 status=VL6180X_WrDWord( dev, 0xDA, CalValue);
Davidroid 57:fa4c622b04a7 1180 return status;
Davidroid 57:fa4c622b04a7 1181 }
Davidroid 57:fa4c622b04a7 1182
Davidroid 57:fa4c622b04a7 1183 /* only include up-scaling register setting when up-scale support is configured in */
Davidroid 57:fa4c622b04a7 1184 int VL6180X::VL6180X_UpscaleRegInit(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 1185 {
Davidroid 57:fa4c622b04a7 1186 /* apply REGISTER_TUNING_ER02_100614_CustomerView.txt */
Davidroid 57:fa4c622b04a7 1187 VL6180X_WrByte( dev, 0x0207, 0x01);
Davidroid 57:fa4c622b04a7 1188 VL6180X_WrByte( dev, 0x0208, 0x01);
Davidroid 57:fa4c622b04a7 1189 VL6180X_WrByte( dev, 0x0096, 0x00);
Davidroid 57:fa4c622b04a7 1190 VL6180X_WrByte( dev, 0x0097, 0x54);
Davidroid 57:fa4c622b04a7 1191 VL6180X_WrByte( dev, 0x00e3, 0x00);
Davidroid 57:fa4c622b04a7 1192 VL6180X_WrByte( dev, 0x00e4, 0x04);
Davidroid 57:fa4c622b04a7 1193 VL6180X_WrByte( dev, 0x00e5, 0x02);
Davidroid 57:fa4c622b04a7 1194 VL6180X_WrByte( dev, 0x00e6, 0x01);
Davidroid 57:fa4c622b04a7 1195 VL6180X_WrByte( dev, 0x00e7, 0x03);
Davidroid 57:fa4c622b04a7 1196 VL6180X_WrByte( dev, 0x00f5, 0x02);
Davidroid 57:fa4c622b04a7 1197 VL6180X_WrByte( dev, 0x00d9, 0x05);
Davidroid 57:fa4c622b04a7 1198
Davidroid 57:fa4c622b04a7 1199 _UpscaleInitPatch0(dev);
Davidroid 57:fa4c622b04a7 1200
Davidroid 57:fa4c622b04a7 1201 VL6180X_WrByte( dev, 0x009f, 0x00);
Davidroid 57:fa4c622b04a7 1202 VL6180X_WrByte( dev, 0x00a3, 0x28);
Davidroid 57:fa4c622b04a7 1203 VL6180X_WrByte( dev, 0x00b7, 0x00);
Davidroid 57:fa4c622b04a7 1204 VL6180X_WrByte( dev, 0x00bb, 0x28);
Davidroid 57:fa4c622b04a7 1205 VL6180X_WrByte( dev, 0x00b2, 0x09);
Davidroid 57:fa4c622b04a7 1206 VL6180X_WrByte( dev, 0x00ca, 0x09);
Davidroid 57:fa4c622b04a7 1207 VL6180X_WrByte( dev, 0x0198, 0x01);
Davidroid 57:fa4c622b04a7 1208 VL6180X_WrByte( dev, 0x01b0, 0x17);
Davidroid 57:fa4c622b04a7 1209 VL6180X_WrByte( dev, 0x01ad, 0x00);
Davidroid 57:fa4c622b04a7 1210 VL6180X_WrByte( dev, 0x00ff, 0x05);
Davidroid 57:fa4c622b04a7 1211 VL6180X_WrByte( dev, 0x0100, 0x05);
Davidroid 57:fa4c622b04a7 1212 VL6180X_WrByte( dev, 0x0199, 0x05);
Davidroid 57:fa4c622b04a7 1213 VL6180X_WrByte( dev, 0x01a6, 0x1b);
Davidroid 57:fa4c622b04a7 1214 VL6180X_WrByte( dev, 0x01ac, 0x3e);
Davidroid 57:fa4c622b04a7 1215 VL6180X_WrByte( dev, 0x01a7, 0x1f);
Davidroid 57:fa4c622b04a7 1216 VL6180X_WrByte( dev, 0x0030, 0x00);
Davidroid 57:fa4c622b04a7 1217 VL6180X_WrByte( dev, SYSTEM_MODE_GPIO1, 0x10);
Davidroid 57:fa4c622b04a7 1218 VL6180X_WrByte( dev, READOUT_AVERAGING_SAMPLE_PERIOD, 0x30);
Davidroid 57:fa4c622b04a7 1219 VL6180X_WrByte( dev, SYSALS_ANALOGUE_GAIN, 0x46);
Davidroid 57:fa4c622b04a7 1220 VL6180X_WrByte( dev, SYSRANGE_VHV_REPEAT_RATE, 0xFF);
Davidroid 57:fa4c622b04a7 1221 VL6180X_WrByte( dev, SYSALS_INTEGRATION_PERIOD, 0x63);
Davidroid 57:fa4c622b04a7 1222 VL6180X_WrByte( dev, SYSRANGE_VHV_RECALIBRATE, 0x01);
Davidroid 57:fa4c622b04a7 1223 VL6180X_WrByte( dev, SYSRANGE_MAX_AMBIENT_LEVEL_MULT, 0xff);
Davidroid 57:fa4c622b04a7 1224 VL6180X_WrByte( dev, SYSRANGE_INTERMEASUREMENT_PERIOD, 0x09);
Davidroid 57:fa4c622b04a7 1225 VL6180X_WrByte( dev, SYSALS_INTERMEASUREMENT_PERIOD, 0x31);
Davidroid 57:fa4c622b04a7 1226 VL6180X_WrByte( dev, SYSTEM_INTERRUPT_CONFIG_GPIO, 0x24);
Davidroid 57:fa4c622b04a7 1227 #if VL6180X_EXTENDED_RANGE
Davidroid 57:fa4c622b04a7 1228 VL6180X_RangeSetMaxConvergenceTime(dev, 63);
Davidroid 57:fa4c622b04a7 1229 #else
Davidroid 57:fa4c622b04a7 1230 VL6180X_RangeSetMaxConvergenceTime(dev, 50);
Davidroid 57:fa4c622b04a7 1231 #endif
Davidroid 57:fa4c622b04a7 1232 return 0;
Davidroid 57:fa4c622b04a7 1233 }
Davidroid 57:fa4c622b04a7 1234 #else
Davidroid 57:fa4c622b04a7 1235 #define VL6180X_UpscaleRegInit(...) -1
Davidroid 57:fa4c622b04a7 1236 #endif
Davidroid 57:fa4c622b04a7 1237
Davidroid 57:fa4c622b04a7 1238 int VL6180X::VL6180X_UpscaleSetScaling(VL6180XDev_t dev, uint8_t scaling)
Davidroid 57:fa4c622b04a7 1239 {
Davidroid 57:fa4c622b04a7 1240 int status;
Davidroid 57:fa4c622b04a7 1241 uint16_t Scaler;
Davidroid 57:fa4c622b04a7 1242 int8_t Offset;
Davidroid 57:fa4c622b04a7 1243
Davidroid 57:fa4c622b04a7 1244 LOG_FUNCTION_START("%d",(int) scaling);
Davidroid 57:fa4c622b04a7 1245
Davidroid 57:fa4c622b04a7 1246 #ifdef VL6180X_HAVE_UPSCALE_DATA
Davidroid 57:fa4c622b04a7 1247 #define min_scaling 1
Davidroid 57:fa4c622b04a7 1248 #define max_scaling sizeof(ScalerLookUP)/sizeof(ScalerLookUP[0])
Davidroid 57:fa4c622b04a7 1249 #else
Davidroid 57:fa4c622b04a7 1250 /* we are in fixed config so only allow configured factor */
Davidroid 57:fa4c622b04a7 1251 #define min_scaling VL6180X_UPSCALE_SUPPORT
Davidroid 57:fa4c622b04a7 1252 #define max_scaling VL6180X_UPSCALE_SUPPORT
Davidroid 57:fa4c622b04a7 1253 #endif
Davidroid 57:fa4c622b04a7 1254
Davidroid 57:fa4c622b04a7 1255 if( scaling>=min_scaling && scaling<= max_scaling ){
Davidroid 57:fa4c622b04a7 1256
Davidroid 57:fa4c622b04a7 1257 Scaler = ScalerLookUP[scaling-1];
Davidroid 57:fa4c622b04a7 1258 status = VL6180X_WrWord(dev, RANGE_SCALER, Scaler);
Davidroid 57:fa4c622b04a7 1259 _SetUpscale(dev, scaling );
Davidroid 57:fa4c622b04a7 1260
Davidroid 57:fa4c622b04a7 1261 /* Apply scaling on part-2-part offset */
Davidroid 57:fa4c622b04a7 1262 Offset = VL6180XDevDataGet(dev, Part2PartOffsetNVM)/scaling;
Davidroid 57:fa4c622b04a7 1263 status = VL6180X_WrByte(dev, SYSRANGE_PART_TO_PART_RANGE_OFFSET, Offset);
Davidroid 57:fa4c622b04a7 1264 #if ! VL6180X_EXTENDED_RANGE
Davidroid 57:fa4c622b04a7 1265 if( status ==0 ){
Davidroid 57:fa4c622b04a7 1266 status = VL6180X_RangeSetEceState(dev, scaling == 1); /* enable ece only at 1x scaling */
Davidroid 57:fa4c622b04a7 1267 }
Davidroid 57:fa4c622b04a7 1268 if( status == 0 && !VL6180X_EXTENDED_RANGE && scaling!=1 ){
Davidroid 57:fa4c622b04a7 1269 status = NOT_GUARANTEED ;
Davidroid 57:fa4c622b04a7 1270 }
Davidroid 57:fa4c622b04a7 1271 #endif
Davidroid 57:fa4c622b04a7 1272 }
Davidroid 57:fa4c622b04a7 1273 else{
Davidroid 57:fa4c622b04a7 1274 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1275 }
Davidroid 57:fa4c622b04a7 1276 #undef min_scaling
Davidroid 57:fa4c622b04a7 1277 #undef max_scaling
Davidroid 57:fa4c622b04a7 1278 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1279 return status;
Davidroid 57:fa4c622b04a7 1280 }
Davidroid 57:fa4c622b04a7 1281
Davidroid 57:fa4c622b04a7 1282
Davidroid 57:fa4c622b04a7 1283 int VL6180X::VL6180X_UpscaleGetScaling(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 1284 {
Davidroid 57:fa4c622b04a7 1285 int status;
Davidroid 57:fa4c622b04a7 1286 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 1287 status=_GetUpscale(dev );
Davidroid 57:fa4c622b04a7 1288 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1289
Davidroid 57:fa4c622b04a7 1290 return status;
Davidroid 57:fa4c622b04a7 1291 }
Davidroid 57:fa4c622b04a7 1292
Davidroid 57:fa4c622b04a7 1293
Davidroid 57:fa4c622b04a7 1294 int VL6180X::VL6180X_UpscaleStaticInit(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 1295 {
Davidroid 57:fa4c622b04a7 1296 /* todo make these a fail macro in case only 1x is suppoted */
Davidroid 57:fa4c622b04a7 1297 int status;
Davidroid 57:fa4c622b04a7 1298
Davidroid 57:fa4c622b04a7 1299 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 1300 do{
Davidroid 57:fa4c622b04a7 1301 status=VL6180X_UpscaleRegInit(dev);
Davidroid 57:fa4c622b04a7 1302 if( status){
Davidroid 57:fa4c622b04a7 1303 VL6180X_ErrLog("regInit fail");
Davidroid 57:fa4c622b04a7 1304 break;
Davidroid 57:fa4c622b04a7 1305 }
Davidroid 57:fa4c622b04a7 1306 #if VL6180X_EXTENDED_RANGE
Davidroid 57:fa4c622b04a7 1307 status = VL6180X_RangeSetEceState(dev, 0);
Davidroid 57:fa4c622b04a7 1308 if( status){
Davidroid 57:fa4c622b04a7 1309 VL6180X_ErrLog("VL6180X_RangeSetEceState fail");
Davidroid 57:fa4c622b04a7 1310 break;
Davidroid 57:fa4c622b04a7 1311 }
Davidroid 57:fa4c622b04a7 1312 #endif
Davidroid 57:fa4c622b04a7 1313 } while(0);
Davidroid 57:fa4c622b04a7 1314 if( !status){
Davidroid 57:fa4c622b04a7 1315 /* must write the scaler at least once to the device to ensure the scaler is in a known state. */
Davidroid 57:fa4c622b04a7 1316 status=VL6180X_UpscaleSetScaling(dev, _GetUpscale(dev));
Davidroid 57:fa4c622b04a7 1317 VL6180X_WrByte( dev, SYSTEM_FRESH_OUT_OF_RESET, 0x00); /* change fresh out of set status to 0 */
Davidroid 57:fa4c622b04a7 1318 }
Davidroid 57:fa4c622b04a7 1319 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1320 return status;
Davidroid 57:fa4c622b04a7 1321 }
Davidroid 57:fa4c622b04a7 1322
Davidroid 57:fa4c622b04a7 1323
Davidroid 57:fa4c622b04a7 1324 int VL6180X::VL6180X_SetGPIOxPolarity(VL6180XDev_t dev, int pin, int active_high)
Davidroid 57:fa4c622b04a7 1325 {
Davidroid 57:fa4c622b04a7 1326 int status;
Davidroid 57:fa4c622b04a7 1327 LOG_FUNCTION_START("%d %d",(int) pin, (int)active_high);
Davidroid 57:fa4c622b04a7 1328
Davidroid 57:fa4c622b04a7 1329 if( pin ==0 || pin ==1 ){
Davidroid 57:fa4c622b04a7 1330 uint16_t RegIndex;
Davidroid 57:fa4c622b04a7 1331 uint8_t DataSet;
Davidroid 57:fa4c622b04a7 1332 if( pin==0 )
Davidroid 57:fa4c622b04a7 1333 RegIndex= SYSTEM_MODE_GPIO0;
Davidroid 57:fa4c622b04a7 1334 else
Davidroid 57:fa4c622b04a7 1335 RegIndex= SYSTEM_MODE_GPIO1;
Davidroid 57:fa4c622b04a7 1336
Davidroid 57:fa4c622b04a7 1337 if (active_high )
Davidroid 57:fa4c622b04a7 1338 DataSet = GPIOx_POLARITY_SELECT_MASK;
Davidroid 57:fa4c622b04a7 1339 else
Davidroid 57:fa4c622b04a7 1340 DataSet = 0;
Davidroid 57:fa4c622b04a7 1341
Davidroid 57:fa4c622b04a7 1342 status = VL6180X_UpdateByte(dev, RegIndex, (uint8_t)~GPIOx_POLARITY_SELECT_MASK, DataSet);
Davidroid 57:fa4c622b04a7 1343 }
Davidroid 57:fa4c622b04a7 1344 else{
Davidroid 57:fa4c622b04a7 1345 VL6180X_ErrLog("Invalid pin param %d", (int)pin);
Davidroid 57:fa4c622b04a7 1346 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1347 }
Davidroid 57:fa4c622b04a7 1348
Davidroid 57:fa4c622b04a7 1349 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1350
Davidroid 57:fa4c622b04a7 1351 return status;
Davidroid 57:fa4c622b04a7 1352 }
Davidroid 57:fa4c622b04a7 1353
Davidroid 57:fa4c622b04a7 1354 int VL6180X::VL6180X_SetGPIOxFunctionality(VL6180XDev_t dev, int pin, uint8_t functionality)
Davidroid 57:fa4c622b04a7 1355 {
Davidroid 57:fa4c622b04a7 1356 int status;
Davidroid 57:fa4c622b04a7 1357
Davidroid 57:fa4c622b04a7 1358 LOG_FUNCTION_START("%d %d",(int) pin, (int)functionality);
Davidroid 57:fa4c622b04a7 1359
Davidroid 57:fa4c622b04a7 1360 if( ((pin ==0) || (pin ==1)) && IsValidGPIOFunction(functionality) ){
Davidroid 57:fa4c622b04a7 1361 uint16_t RegIndex;
Davidroid 57:fa4c622b04a7 1362
Davidroid 57:fa4c622b04a7 1363 if( pin==0 )
Davidroid 57:fa4c622b04a7 1364 RegIndex= SYSTEM_MODE_GPIO0;
Davidroid 57:fa4c622b04a7 1365 else
Davidroid 57:fa4c622b04a7 1366 RegIndex= SYSTEM_MODE_GPIO1;
Davidroid 57:fa4c622b04a7 1367
Davidroid 57:fa4c622b04a7 1368 status = VL6180X_UpdateByte(dev, RegIndex, (uint8_t)~GPIOx_FUNCTIONALITY_SELECT_MASK, functionality<<GPIOx_FUNCTIONALITY_SELECT_SHIFT);
Davidroid 57:fa4c622b04a7 1369 if( status){
Davidroid 57:fa4c622b04a7 1370 VL6180X_ErrLog("Update SYSTEM_MODE_GPIO%d fail", (int)pin);
Davidroid 57:fa4c622b04a7 1371 }
Davidroid 57:fa4c622b04a7 1372 }
Davidroid 57:fa4c622b04a7 1373 else{
Davidroid 57:fa4c622b04a7 1374 VL6180X_ErrLog("Invalid pin %d or function %d", (int)pin, (int) functionality);
Davidroid 57:fa4c622b04a7 1375 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1376 }
Davidroid 57:fa4c622b04a7 1377
Davidroid 57:fa4c622b04a7 1378 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1379 return status;
Davidroid 57:fa4c622b04a7 1380 }
Davidroid 57:fa4c622b04a7 1381
Davidroid 57:fa4c622b04a7 1382
Davidroid 57:fa4c622b04a7 1383 int VL6180X::VL6180X_SetupGPIOx(VL6180XDev_t dev, int pin, uint8_t IntFunction, int ActiveHigh)
Davidroid 57:fa4c622b04a7 1384 {
Davidroid 57:fa4c622b04a7 1385 int status;
Davidroid 57:fa4c622b04a7 1386
Davidroid 57:fa4c622b04a7 1387 LOG_FUNCTION_START("%d %d",(int) pin, (int)IntFunction);
Davidroid 57:fa4c622b04a7 1388
Davidroid 57:fa4c622b04a7 1389 if( ((pin ==0) || (pin ==1)) && IsValidGPIOFunction(IntFunction) ){
Davidroid 57:fa4c622b04a7 1390 uint16_t RegIndex;
Davidroid 57:fa4c622b04a7 1391 uint8_t value=0;
Davidroid 57:fa4c622b04a7 1392
Davidroid 57:fa4c622b04a7 1393 if( pin==0 )
Davidroid 57:fa4c622b04a7 1394 RegIndex= SYSTEM_MODE_GPIO0;
Davidroid 57:fa4c622b04a7 1395 else
Davidroid 57:fa4c622b04a7 1396 RegIndex= SYSTEM_MODE_GPIO1;
Davidroid 57:fa4c622b04a7 1397
Davidroid 57:fa4c622b04a7 1398 if( ActiveHigh )
Davidroid 57:fa4c622b04a7 1399 value|=GPIOx_POLARITY_SELECT_MASK;
Davidroid 57:fa4c622b04a7 1400
Davidroid 57:fa4c622b04a7 1401 value |= IntFunction<<GPIOx_FUNCTIONALITY_SELECT_SHIFT;
Davidroid 57:fa4c622b04a7 1402 status = VL6180X_WrByte(dev, RegIndex, value);
Davidroid 57:fa4c622b04a7 1403 if( status ){
Davidroid 57:fa4c622b04a7 1404 VL6180X_ErrLog("SYSTEM_MODE_GPIO%d wr fail", (int)pin-SYSTEM_MODE_GPIO0);
Davidroid 57:fa4c622b04a7 1405 }
Davidroid 57:fa4c622b04a7 1406 }
Davidroid 57:fa4c622b04a7 1407 else{
Davidroid 57:fa4c622b04a7 1408 VL6180X_ErrLog("Invalid pin %d or function %d", (int)pin, (int) IntFunction);
Davidroid 57:fa4c622b04a7 1409 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1410 }
Davidroid 57:fa4c622b04a7 1411
Davidroid 57:fa4c622b04a7 1412 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1413 return status;
Davidroid 57:fa4c622b04a7 1414 }
Davidroid 57:fa4c622b04a7 1415
Davidroid 57:fa4c622b04a7 1416
Davidroid 57:fa4c622b04a7 1417 int VL6180X::VL6180X_DisableGPIOxOut(VL6180XDev_t dev, int pin) {
Davidroid 57:fa4c622b04a7 1418 int status;
Davidroid 57:fa4c622b04a7 1419
Davidroid 57:fa4c622b04a7 1420 LOG_FUNCTION_START("%d",(int)pin);
Davidroid 57:fa4c622b04a7 1421
Davidroid 57:fa4c622b04a7 1422 status=VL6180X_SetGPIOxFunctionality(dev, pin, GPIOx_SELECT_OFF);
Davidroid 57:fa4c622b04a7 1423
Davidroid 57:fa4c622b04a7 1424 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1425 return status;
Davidroid 57:fa4c622b04a7 1426 }
Davidroid 57:fa4c622b04a7 1427
Davidroid 57:fa4c622b04a7 1428
Davidroid 57:fa4c622b04a7 1429 int VL6180X::VL6180X_SetupGPIO1(VL6180XDev_t dev, uint8_t IntFunction, int ActiveHigh)
Davidroid 57:fa4c622b04a7 1430 {
Davidroid 57:fa4c622b04a7 1431 int status;
Davidroid 57:fa4c622b04a7 1432 LOG_FUNCTION_START("%d %d",(int)IntFunction, (int)ActiveHigh );
Davidroid 57:fa4c622b04a7 1433 status=VL6180X_SetupGPIOx(dev, 1 , IntFunction, ActiveHigh);
Davidroid 57:fa4c622b04a7 1434 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1435 return status;
Davidroid 57:fa4c622b04a7 1436 }
Davidroid 57:fa4c622b04a7 1437
Davidroid 57:fa4c622b04a7 1438 int VL6180X::VL6180X_RangeConfigInterrupt(VL6180XDev_t dev, uint8_t ConfigGpioInt)
Davidroid 57:fa4c622b04a7 1439 {
Davidroid 57:fa4c622b04a7 1440 int status;
Davidroid 57:fa4c622b04a7 1441
Davidroid 57:fa4c622b04a7 1442 if( ConfigGpioInt<= CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY){
Davidroid 57:fa4c622b04a7 1443 status = VL6180X_UpdateByte(dev, SYSTEM_INTERRUPT_CONFIG_GPIO, (uint8_t)(~CONFIG_GPIO_RANGE_MASK), ConfigGpioInt);
Davidroid 57:fa4c622b04a7 1444 }
Davidroid 57:fa4c622b04a7 1445 else{
Davidroid 57:fa4c622b04a7 1446 VL6180X_ErrLog("Invalid config mode param %d", (int)ConfigGpioInt);
Davidroid 57:fa4c622b04a7 1447 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1448 }
Davidroid 57:fa4c622b04a7 1449 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1450 return status;
Davidroid 57:fa4c622b04a7 1451 }
Davidroid 57:fa4c622b04a7 1452
Davidroid 57:fa4c622b04a7 1453
Davidroid 57:fa4c622b04a7 1454 int VL6180X::VL6180X_RangeSetEceFactor(VL6180XDev_t dev, uint16_t FactorM, uint16_t FactorD){
Davidroid 57:fa4c622b04a7 1455 int status;
Davidroid 57:fa4c622b04a7 1456 uint8_t u8;
Davidroid 57:fa4c622b04a7 1457
Davidroid 57:fa4c622b04a7 1458 LOG_FUNCTION_START("%d %d", (int)FactorM, (int)FactorD );
Davidroid 57:fa4c622b04a7 1459 do{
Davidroid 57:fa4c622b04a7 1460 /* D cannot be 0 M must be <=D and >= 0 */
Davidroid 57:fa4c622b04a7 1461 if( FactorM <= FactorD && FactorD> 0){
Davidroid 57:fa4c622b04a7 1462 VL6180XDevDataSet(dev, EceFactorM, FactorM);
Davidroid 57:fa4c622b04a7 1463 VL6180XDevDataSet(dev, EceFactorD, FactorD);
Davidroid 57:fa4c622b04a7 1464 /* read and re-apply max conv time to get new ece factor set */
Davidroid 57:fa4c622b04a7 1465 status = VL6180X_RdByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, &u8);
Davidroid 57:fa4c622b04a7 1466 if( status){
Davidroid 57:fa4c622b04a7 1467 VL6180X_ErrLog("SYSRANGE_MAX_CONVERGENCE_TIME rd fail ");
Davidroid 57:fa4c622b04a7 1468 break;
Davidroid 57:fa4c622b04a7 1469 }
Davidroid 57:fa4c622b04a7 1470 status = VL6180X_RangeSetMaxConvergenceTime(dev, u8);
Davidroid 57:fa4c622b04a7 1471 if( status <0 ){
Davidroid 57:fa4c622b04a7 1472 VL6180X_ErrLog("fail to apply time after ece m/d change");
Davidroid 57:fa4c622b04a7 1473 break;
Davidroid 57:fa4c622b04a7 1474 }
Davidroid 57:fa4c622b04a7 1475 }
Davidroid 57:fa4c622b04a7 1476 else{
Davidroid 57:fa4c622b04a7 1477 VL6180X_ErrLog("invalid factor %d/%d", (int)FactorM, (int)FactorD );
Davidroid 57:fa4c622b04a7 1478 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1479 }
Davidroid 57:fa4c622b04a7 1480 }
Davidroid 57:fa4c622b04a7 1481 while(0);
Davidroid 57:fa4c622b04a7 1482 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1483 return status;
Davidroid 57:fa4c622b04a7 1484 }
Davidroid 57:fa4c622b04a7 1485
Davidroid 57:fa4c622b04a7 1486 int VL6180X::VL6180X_RangeSetEceState(VL6180XDev_t dev, int enable ){
Davidroid 57:fa4c622b04a7 1487 int status;
Davidroid 57:fa4c622b04a7 1488 uint8_t or_mask;
Davidroid 57:fa4c622b04a7 1489
Davidroid 57:fa4c622b04a7 1490 LOG_FUNCTION_START("%d", (int)enable);
Davidroid 57:fa4c622b04a7 1491 if( enable )
Davidroid 57:fa4c622b04a7 1492 or_mask = RANGE_CHECK_ECE_ENABLE_MASK;
Davidroid 57:fa4c622b04a7 1493 else
Davidroid 57:fa4c622b04a7 1494 or_mask = 0;
Davidroid 57:fa4c622b04a7 1495
Davidroid 57:fa4c622b04a7 1496 status =VL6180X_UpdateByte(dev, SYSRANGE_RANGE_CHECK_ENABLES, ~RANGE_CHECK_ECE_ENABLE_MASK, or_mask);
Davidroid 57:fa4c622b04a7 1497 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1498 return status;
Davidroid 57:fa4c622b04a7 1499 }
Davidroid 57:fa4c622b04a7 1500
Davidroid 57:fa4c622b04a7 1501
Davidroid 57:fa4c622b04a7 1502 int VL6180X::VL6180X_RangeSetMaxConvergenceTime(VL6180XDev_t dev, uint8_t MaxConTime_msec)
Davidroid 57:fa4c622b04a7 1503 {
Davidroid 57:fa4c622b04a7 1504 int status = 0;
Davidroid 57:fa4c622b04a7 1505 LOG_FUNCTION_START("%d",(int)MaxConTime_msec);
Davidroid 57:fa4c622b04a7 1506 do{
Davidroid 57:fa4c622b04a7 1507 status=VL6180X_WrByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, MaxConTime_msec);
Davidroid 57:fa4c622b04a7 1508 if( status ){
Davidroid 57:fa4c622b04a7 1509 break;
Davidroid 57:fa4c622b04a7 1510 }
Davidroid 57:fa4c622b04a7 1511 status=VL6180X_RangeSetEarlyConvergenceEestimateThreshold(dev);
Davidroid 57:fa4c622b04a7 1512 if( status){
Davidroid 57:fa4c622b04a7 1513 break;
Davidroid 57:fa4c622b04a7 1514 }
Davidroid 57:fa4c622b04a7 1515 status = _DMax_InitData(dev);
Davidroid 57:fa4c622b04a7 1516 }
Davidroid 57:fa4c622b04a7 1517 while(0);
Davidroid 57:fa4c622b04a7 1518 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1519 return status;
Davidroid 57:fa4c622b04a7 1520 }
Davidroid 57:fa4c622b04a7 1521
Davidroid 57:fa4c622b04a7 1522 int VL6180X::VL6180X_RangeSetInterMeasPeriod(VL6180XDev_t dev, uint32_t InterMeasTime_msec){
Davidroid 57:fa4c622b04a7 1523 uint8_t SetTime;
Davidroid 57:fa4c622b04a7 1524 int status;
Davidroid 57:fa4c622b04a7 1525
Davidroid 57:fa4c622b04a7 1526 LOG_FUNCTION_START("%d",(int)InterMeasTime_msec);
Davidroid 57:fa4c622b04a7 1527 do {
Davidroid 57:fa4c622b04a7 1528 if( InterMeasTime_msec > 2550 ){
Davidroid 57:fa4c622b04a7 1529 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1530 break;
Davidroid 57:fa4c622b04a7 1531 }
Davidroid 57:fa4c622b04a7 1532 /* doc in not 100% clear and confusing about the limit practically all value are OK but 0
Davidroid 57:fa4c622b04a7 1533 * that can hang device in continuous mode */
Davidroid 57:fa4c622b04a7 1534 if( InterMeasTime_msec < 10 ) {
Davidroid 57:fa4c622b04a7 1535 InterMeasTime_msec=10;
Davidroid 57:fa4c622b04a7 1536 }
Davidroid 57:fa4c622b04a7 1537 SetTime=(uint8_t)(InterMeasTime_msec/10);
Davidroid 57:fa4c622b04a7 1538 status=VL6180X_WrByte(dev, SYSRANGE_INTERMEASUREMENT_PERIOD, SetTime);
Davidroid 57:fa4c622b04a7 1539 if( status ){
Davidroid 57:fa4c622b04a7 1540 VL6180X_ErrLog("SYSRANGE_INTERMEASUREMENT_PERIOD wr fail");
Davidroid 57:fa4c622b04a7 1541 }
Davidroid 57:fa4c622b04a7 1542 else
Davidroid 57:fa4c622b04a7 1543 if( SetTime != InterMeasTime_msec /10 ) {
Davidroid 57:fa4c622b04a7 1544 status = MIN_CLIPED; /* on success change status to clip if it did */
Davidroid 57:fa4c622b04a7 1545 }
Davidroid 57:fa4c622b04a7 1546 }while(0);
Davidroid 57:fa4c622b04a7 1547 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1548 return status;
Davidroid 57:fa4c622b04a7 1549 }
Davidroid 57:fa4c622b04a7 1550
Davidroid 57:fa4c622b04a7 1551
Davidroid 57:fa4c622b04a7 1552 int VL6180X::VL6180X_RangeGetDeviceReady(VL6180XDev_t dev, int * Ready){
Davidroid 57:fa4c622b04a7 1553 int status;
Davidroid 57:fa4c622b04a7 1554 uint8_t u8;
Davidroid 57:fa4c622b04a7 1555 LOG_FUNCTION_START("%p", (int)Ready);
Davidroid 57:fa4c622b04a7 1556 status=VL6180X_RdByte(dev, RESULT_RANGE_STATUS, &u8);
Davidroid 57:fa4c622b04a7 1557 if( !status)
Davidroid 57:fa4c622b04a7 1558 *Ready = u8&RANGE_DEVICE_READY_MASK;
Davidroid 57:fa4c622b04a7 1559 LOG_FUNCTION_END_FMT(status,"%d", *Ready);
Davidroid 57:fa4c622b04a7 1560 return status;
Davidroid 57:fa4c622b04a7 1561 }
Davidroid 57:fa4c622b04a7 1562
Davidroid 57:fa4c622b04a7 1563
Davidroid 57:fa4c622b04a7 1564 int VL6180X::VL6180X_RangeWaitDeviceReady(VL6180XDev_t dev, int MaxLoop ){
Davidroid 57:fa4c622b04a7 1565 int status; /* if user specify an invalid <=0 loop count we'll return error */
Davidroid 57:fa4c622b04a7 1566 int n;
Davidroid 57:fa4c622b04a7 1567 uint8_t u8;
Davidroid 57:fa4c622b04a7 1568 LOG_FUNCTION_START("%d", (int)MaxLoop);
Davidroid 57:fa4c622b04a7 1569 if( MaxLoop<1){
Davidroid 57:fa4c622b04a7 1570 status=INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1571 }
Davidroid 57:fa4c622b04a7 1572 else{
Davidroid 57:fa4c622b04a7 1573 for( n=0; n < MaxLoop ; n++){
Davidroid 57:fa4c622b04a7 1574 status=VL6180X_RdByte(dev, RESULT_RANGE_STATUS, &u8);
Davidroid 57:fa4c622b04a7 1575 if( status)
Davidroid 57:fa4c622b04a7 1576 break;
Davidroid 57:fa4c622b04a7 1577 u8 = u8 & RANGE_DEVICE_READY_MASK;
Davidroid 57:fa4c622b04a7 1578 if( u8 )
Davidroid 57:fa4c622b04a7 1579 break;
Davidroid 57:fa4c622b04a7 1580
Davidroid 57:fa4c622b04a7 1581 }
Davidroid 57:fa4c622b04a7 1582 if( !status && !u8 ){
Davidroid 57:fa4c622b04a7 1583 status = TIME_OUT;
Davidroid 57:fa4c622b04a7 1584 }
Davidroid 57:fa4c622b04a7 1585 }
Davidroid 57:fa4c622b04a7 1586 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1587 return status;
Davidroid 57:fa4c622b04a7 1588 }
Davidroid 57:fa4c622b04a7 1589
Davidroid 57:fa4c622b04a7 1590 int VL6180X::VL6180X_RangeSetSystemMode(VL6180XDev_t dev, uint8_t mode)
Davidroid 57:fa4c622b04a7 1591 {
Davidroid 57:fa4c622b04a7 1592 int status;
Davidroid 57:fa4c622b04a7 1593 LOG_FUNCTION_START("%d", (int)mode);
Davidroid 57:fa4c622b04a7 1594 /* FIXME we are not checking device is ready via @a VL6180X_RangeWaitDeviceReady
Davidroid 57:fa4c622b04a7 1595 * so if called back to back real fast we are not checking
Davidroid 57:fa4c622b04a7 1596 * if previous mode "set" got absorbed => bit 0 must be 0 so that it work
Davidroid 57:fa4c622b04a7 1597 */
Davidroid 57:fa4c622b04a7 1598 if( mode <= 3){
Davidroid 57:fa4c622b04a7 1599 status=VL6180X_WrByte(dev, SYSRANGE_START, mode);
Davidroid 57:fa4c622b04a7 1600 if( status ){
Davidroid 57:fa4c622b04a7 1601 VL6180X_ErrLog("SYSRANGE_START wr fail");
Davidroid 57:fa4c622b04a7 1602 }
Davidroid 57:fa4c622b04a7 1603 }
Davidroid 57:fa4c622b04a7 1604 else{
Davidroid 57:fa4c622b04a7 1605 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 1606 }
Davidroid 57:fa4c622b04a7 1607 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1608 return status;
Davidroid 57:fa4c622b04a7 1609 }
Davidroid 57:fa4c622b04a7 1610
Davidroid 57:fa4c622b04a7 1611
Davidroid 57:fa4c622b04a7 1612 int VL6180X::VL6180X_RangeStartContinuousMode(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 1613 {
Davidroid 57:fa4c622b04a7 1614 int status;
Davidroid 57:fa4c622b04a7 1615 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 1616 status= VL6180X_RangeSetSystemMode(dev, MODE_START_STOP | MODE_CONTINUOUS);
Davidroid 57:fa4c622b04a7 1617 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1618 return status;
Davidroid 57:fa4c622b04a7 1619 }
Davidroid 57:fa4c622b04a7 1620
Davidroid 57:fa4c622b04a7 1621 int VL6180X::VL6180X_RangeStartSingleShot(VL6180XDev_t dev) {
Davidroid 57:fa4c622b04a7 1622 int status;
Davidroid 57:fa4c622b04a7 1623 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 1624 status = VL6180X_RangeSetSystemMode(dev, MODE_START_STOP|MODE_SINGLESHOT);
Davidroid 57:fa4c622b04a7 1625 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1626 return status;
Davidroid 57:fa4c622b04a7 1627 }
Davidroid 57:fa4c622b04a7 1628
Davidroid 57:fa4c622b04a7 1629
Davidroid 57:fa4c622b04a7 1630 int VL6180X::VL6180X_RangeSetEarlyConvergenceEestimateThreshold(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 1631 {
Davidroid 57:fa4c622b04a7 1632 int status;
Davidroid 57:fa4c622b04a7 1633
Davidroid 57:fa4c622b04a7 1634 const uint32_t cMicroSecPerMilliSec = 1000;
Davidroid 57:fa4c622b04a7 1635 const uint32_t cEceSampleTime_us = 500;
Davidroid 57:fa4c622b04a7 1636 uint32_t ece_factor_m = VL6180XDevDataGet(dev, EceFactorM);
Davidroid 57:fa4c622b04a7 1637 uint32_t ece_factor_d = VL6180XDevDataGet(dev, EceFactorD);
Davidroid 57:fa4c622b04a7 1638 uint32_t convergTime_us;
Davidroid 57:fa4c622b04a7 1639 uint32_t fineThresh;
Davidroid 57:fa4c622b04a7 1640 uint32_t eceThresh;
Davidroid 57:fa4c622b04a7 1641 uint8_t u8;
Davidroid 57:fa4c622b04a7 1642 uint32_t maxConv_ms;
Davidroid 57:fa4c622b04a7 1643 int32_t AveTime;
Davidroid 57:fa4c622b04a7 1644
Davidroid 57:fa4c622b04a7 1645 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 1646
Davidroid 57:fa4c622b04a7 1647 do{
Davidroid 57:fa4c622b04a7 1648 status = VL6180X_RdByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, &u8);
Davidroid 57:fa4c622b04a7 1649 if( status ){
Davidroid 57:fa4c622b04a7 1650 VL6180X_ErrLog("SYSRANGE_MAX_CONVERGENCE_TIME rd fail");
Davidroid 57:fa4c622b04a7 1651 break;
Davidroid 57:fa4c622b04a7 1652 }
Davidroid 57:fa4c622b04a7 1653 maxConv_ms = u8;
Davidroid 57:fa4c622b04a7 1654 AveTime = _GetAveTotalTime(dev);
Davidroid 57:fa4c622b04a7 1655 if( AveTime <0 ){
Davidroid 57:fa4c622b04a7 1656 status=-1;
Davidroid 57:fa4c622b04a7 1657 break;
Davidroid 57:fa4c622b04a7 1658 }
Davidroid 57:fa4c622b04a7 1659
Davidroid 57:fa4c622b04a7 1660 convergTime_us = maxConv_ms * cMicroSecPerMilliSec - AveTime;
Davidroid 57:fa4c622b04a7 1661 status = VL6180X_RdDWord(dev, 0xB8, &fineThresh);
Davidroid 57:fa4c622b04a7 1662 if( status ) {
Davidroid 57:fa4c622b04a7 1663 VL6180X_ErrLog("reg 0xB8 rd fail");
Davidroid 57:fa4c622b04a7 1664 break;
Davidroid 57:fa4c622b04a7 1665 }
Davidroid 57:fa4c622b04a7 1666 fineThresh*=256;
Davidroid 57:fa4c622b04a7 1667 eceThresh = ece_factor_m * cEceSampleTime_us * fineThresh/(convergTime_us * ece_factor_d);
Davidroid 57:fa4c622b04a7 1668
Davidroid 57:fa4c622b04a7 1669 status=VL6180X_WrWord(dev, SYSRANGE_EARLY_CONVERGENCE_ESTIMATE, (uint16_t)eceThresh);
Davidroid 57:fa4c622b04a7 1670 }
Davidroid 57:fa4c622b04a7 1671 while(0);
Davidroid 57:fa4c622b04a7 1672
Davidroid 57:fa4c622b04a7 1673 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 1674 return status;
Davidroid 57:fa4c622b04a7 1675 }
Davidroid 57:fa4c622b04a7 1676
Davidroid 57:fa4c622b04a7 1677 /*
Davidroid 57:fa4c622b04a7 1678 * Return >0 = time
Davidroid 57:fa4c622b04a7 1679 * <0 1 if fail to get read data from device to compute time
Davidroid 57:fa4c622b04a7 1680 */
Davidroid 57:fa4c622b04a7 1681 int32_t VL6180X::_GetAveTotalTime(VL6180XDev_t dev) {
Davidroid 57:fa4c622b04a7 1682 uint32_t cFwOverhead_us = 24;
Davidroid 57:fa4c622b04a7 1683 uint32_t cVcpSetupTime_us = 70;
Davidroid 57:fa4c622b04a7 1684 uint32_t cPLL2_StartupDelay_us = 200;
Davidroid 57:fa4c622b04a7 1685 uint8_t cMeasMask = 0x07;
Davidroid 57:fa4c622b04a7 1686 uint32_t Samples;
Davidroid 57:fa4c622b04a7 1687 uint32_t SamplePeriod;
Davidroid 57:fa4c622b04a7 1688 uint32_t SingleTime_us;
Davidroid 57:fa4c622b04a7 1689 int32_t TotalAveTime_us;
Davidroid 57:fa4c622b04a7 1690 uint8_t u8;
Davidroid 57:fa4c622b04a7 1691 int status;
Davidroid 57:fa4c622b04a7 1692
Davidroid 57:fa4c622b04a7 1693 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 1694
Davidroid 57:fa4c622b04a7 1695 status = VL6180X_RdByte(dev, 0x109, &u8);
Davidroid 57:fa4c622b04a7 1696 if (status) {
Davidroid 57:fa4c622b04a7 1697 VL6180X_ErrLog("rd 0x109 fail");
Davidroid 57:fa4c622b04a7 1698 return -1;
Davidroid 57:fa4c622b04a7 1699 }
Davidroid 57:fa4c622b04a7 1700 Samples = u8 & cMeasMask;
Davidroid 57:fa4c622b04a7 1701 status = VL6180X_RdByte(dev, READOUT_AVERAGING_SAMPLE_PERIOD, &u8);
Davidroid 57:fa4c622b04a7 1702 if (status) {
Davidroid 57:fa4c622b04a7 1703 VL6180X_ErrLog("i2c READOUT_AVERAGING_SAMPLE_PERIOD fail");
Davidroid 57:fa4c622b04a7 1704 return -1;
Davidroid 57:fa4c622b04a7 1705 }
Davidroid 57:fa4c622b04a7 1706 SamplePeriod = u8;
Davidroid 57:fa4c622b04a7 1707 SingleTime_us = cFwOverhead_us + cVcpSetupTime_us + (SamplePeriod * 10);
Davidroid 57:fa4c622b04a7 1708 TotalAveTime_us = (Samples + 1) * SingleTime_us + cPLL2_StartupDelay_us;
Davidroid 57:fa4c622b04a7 1709
Davidroid 57:fa4c622b04a7 1710 LOG_FUNCTION_END(TotalAveTime_us);
Davidroid 57:fa4c622b04a7 1711 return TotalAveTime_us;
Davidroid 57:fa4c622b04a7 1712 }
Davidroid 57:fa4c622b04a7 1713
Davidroid 57:fa4c622b04a7 1714 #if VL6180X_HAVE_DMAX_RANGING
Davidroid 57:fa4c622b04a7 1715 #define _GetDMaxDataRetSignalAt400mm(dev) VL6180XDevDataGet(dev, DMaxData.retSignalAt400mm)
Davidroid 57:fa4c622b04a7 1716 #else
Davidroid 57:fa4c622b04a7 1717 #define _GetDMaxDataRetSignalAt400mm(dev) 375 // Use a default high value
Davidroid 57:fa4c622b04a7 1718 #endif
Davidroid 57:fa4c622b04a7 1719
Davidroid 57:fa4c622b04a7 1720
Davidroid 57:fa4c622b04a7 1721 #if VL6180X_WRAP_AROUND_FILTER_SUPPORT
Davidroid 57:fa4c622b04a7 1722
Davidroid 57:fa4c622b04a7 1723 #define FILTER_STDDEV_SAMPLES 6
Davidroid 57:fa4c622b04a7 1724 #define MIN_FILTER_STDDEV_SAMPLES 3
Davidroid 57:fa4c622b04a7 1725 #define MIN_FILTER_VALID_STDDEV_SAMPLES 3
Davidroid 57:fa4c622b04a7 1726 #define FILTER_INVALID_DISTANCE 65535
Davidroid 57:fa4c622b04a7 1727
Davidroid 57:fa4c622b04a7 1728 #define _FilterData(field) VL6180XDevDataGet(dev, FilterData.field)
Davidroid 57:fa4c622b04a7 1729 /*
Davidroid 57:fa4c622b04a7 1730 * One time init
Davidroid 57:fa4c622b04a7 1731 */
Davidroid 57:fa4c622b04a7 1732 static int _filter_Init( VL6180XDev_t dev) {
Davidroid 57:fa4c622b04a7 1733 int i;
Davidroid 57:fa4c622b04a7 1734 _FilterData(MeasurementIndex) = 0;
Davidroid 57:fa4c622b04a7 1735
Davidroid 57:fa4c622b04a7 1736 _FilterData(Default_ZeroVal) = 0;
Davidroid 57:fa4c622b04a7 1737 _FilterData(Default_VAVGVal) = 0;
Davidroid 57:fa4c622b04a7 1738 _FilterData(NoDelay_ZeroVal) = 0;
Davidroid 57:fa4c622b04a7 1739 _FilterData(NoDelay_VAVGVal) = 0;
Davidroid 57:fa4c622b04a7 1740 _FilterData(Previous_VAVGDiff) = 0;
Davidroid 57:fa4c622b04a7 1741
Davidroid 57:fa4c622b04a7 1742 _FilterData(StdFilteredReads) = 0;
Davidroid 57:fa4c622b04a7 1743
Davidroid 57:fa4c622b04a7 1744 for (i = 0; i < FILTER_NBOF_SAMPLES; i++) {
Davidroid 57:fa4c622b04a7 1745 _FilterData(LastTrueRange)[i] = FILTER_INVALID_DISTANCE;
Davidroid 57:fa4c622b04a7 1746 _FilterData(LastReturnRates)[i] = 0;
Davidroid 57:fa4c622b04a7 1747 }
Davidroid 57:fa4c622b04a7 1748 return 0;
Davidroid 57:fa4c622b04a7 1749 }
Davidroid 57:fa4c622b04a7 1750
Davidroid 57:fa4c622b04a7 1751
Davidroid 57:fa4c622b04a7 1752 static uint32_t _filter_StdDevDamper(uint32_t AmbientRate, uint32_t SignalRate, const uint32_t StdDevLimitLowLight, const uint32_t StdDevLimitLowLightSNR, const uint32_t StdDevLimitHighLight, const uint32_t StdDevLimitHighLightSNR) {
Davidroid 57:fa4c622b04a7 1753 uint32_t newStdDev;
Davidroid 57:fa4c622b04a7 1754 uint16_t SNR;
Davidroid 57:fa4c622b04a7 1755
Davidroid 57:fa4c622b04a7 1756 if (AmbientRate > 0)
Davidroid 57:fa4c622b04a7 1757 SNR = (uint16_t) ((100 * SignalRate) / AmbientRate);
Davidroid 57:fa4c622b04a7 1758 else
Davidroid 57:fa4c622b04a7 1759 SNR = 9999;
Davidroid 57:fa4c622b04a7 1760
Davidroid 57:fa4c622b04a7 1761 if (SNR >= StdDevLimitLowLightSNR) {
Davidroid 57:fa4c622b04a7 1762 newStdDev = StdDevLimitLowLight;
Davidroid 57:fa4c622b04a7 1763 } else {
Davidroid 57:fa4c622b04a7 1764 if (SNR <= StdDevLimitHighLightSNR)
Davidroid 57:fa4c622b04a7 1765 newStdDev = StdDevLimitHighLight;
Davidroid 57:fa4c622b04a7 1766 else {
Davidroid 57:fa4c622b04a7 1767 newStdDev = (uint32_t) (StdDevLimitHighLight + (SNR - StdDevLimitHighLightSNR) * (int) (StdDevLimitLowLight - StdDevLimitHighLight) / (StdDevLimitLowLightSNR - StdDevLimitHighLightSNR));
Davidroid 57:fa4c622b04a7 1768 }
Davidroid 57:fa4c622b04a7 1769 }
Davidroid 57:fa4c622b04a7 1770
Davidroid 57:fa4c622b04a7 1771 return newStdDev;
Davidroid 57:fa4c622b04a7 1772 }
Davidroid 57:fa4c622b04a7 1773
Davidroid 57:fa4c622b04a7 1774
Davidroid 57:fa4c622b04a7 1775 /*
Davidroid 57:fa4c622b04a7 1776 * Return <0 on error
Davidroid 57:fa4c622b04a7 1777 */
Davidroid 57:fa4c622b04a7 1778 int32_t VL6180X::_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 1779 int status;
Davidroid 57:fa4c622b04a7 1780 uint16_t m_newTrueRange_mm = 0;
Davidroid 57:fa4c622b04a7 1781
Davidroid 57:fa4c622b04a7 1782 uint16_t i;
Davidroid 57:fa4c622b04a7 1783 uint16_t bypassFilter = 0;
Davidroid 57:fa4c622b04a7 1784
Davidroid 57:fa4c622b04a7 1785 uint16_t registerValue;
Davidroid 57:fa4c622b04a7 1786
Davidroid 57:fa4c622b04a7 1787 uint32_t register32BitsValue1;
Davidroid 57:fa4c622b04a7 1788 uint32_t register32BitsValue2;
Davidroid 57:fa4c622b04a7 1789
Davidroid 57:fa4c622b04a7 1790 uint16_t ValidDistance = 0;
Davidroid 57:fa4c622b04a7 1791
Davidroid 57:fa4c622b04a7 1792 uint16_t WrapAroundFlag = 0;
Davidroid 57:fa4c622b04a7 1793 uint16_t NoWrapAroundFlag = 0;
Davidroid 57:fa4c622b04a7 1794 uint16_t NoWrapAroundHighConfidenceFlag = 0;
Davidroid 57:fa4c622b04a7 1795
Davidroid 57:fa4c622b04a7 1796 uint16_t FlushFilter = 0;
Davidroid 57:fa4c622b04a7 1797 uint32_t RateChange = 0;
Davidroid 57:fa4c622b04a7 1798
Davidroid 57:fa4c622b04a7 1799 uint16_t StdDevSamples = 0;
Davidroid 57:fa4c622b04a7 1800 uint32_t StdDevDistanceSum = 0;
Davidroid 57:fa4c622b04a7 1801 uint32_t StdDevDistanceMean = 0;
Davidroid 57:fa4c622b04a7 1802 uint32_t StdDevDistance = 0;
Davidroid 57:fa4c622b04a7 1803 uint32_t StdDevRateSum = 0;
Davidroid 57:fa4c622b04a7 1804 uint32_t StdDevRateMean = 0;
Davidroid 57:fa4c622b04a7 1805 uint32_t StdDevRate = 0;
Davidroid 57:fa4c622b04a7 1806 uint32_t StdDevLimitWithTargetMove = 0;
Davidroid 57:fa4c622b04a7 1807
Davidroid 57:fa4c622b04a7 1808 uint32_t VAVGDiff;
Davidroid 57:fa4c622b04a7 1809 uint32_t IdealVAVGDiff;
Davidroid 57:fa4c622b04a7 1810 uint32_t MinVAVGDiff;
Davidroid 57:fa4c622b04a7 1811 uint32_t MaxVAVGDiff;
Davidroid 57:fa4c622b04a7 1812
Davidroid 57:fa4c622b04a7 1813 /* Filter Parameters */
Davidroid 57:fa4c622b04a7 1814 static const uint16_t ROMABLE_DATA WrapAroundLowRawRangeLimit = 60;
Davidroid 57:fa4c622b04a7 1815 static const uint32_t ROMABLE_DATA WrapAroundLowReturnRateLimit_ROM = 800; // Shall be adapted depending on crossTalk
Davidroid 57:fa4c622b04a7 1816 static const uint16_t ROMABLE_DATA WrapAroundLowRawRangeLimit2 = 165;
Davidroid 57:fa4c622b04a7 1817 static const uint32_t ROMABLE_DATA WrapAroundLowReturnRateLimit2_ROM = 180; // Shall be adapted depending on crossTalk and device sensitivity
Davidroid 57:fa4c622b04a7 1818
Davidroid 57:fa4c622b04a7 1819 static const uint32_t ROMABLE_DATA WrapAroundLowReturnRateFilterLimit_ROM = 850; // Shall be adapted depending on crossTalk and device sensitivity
Davidroid 57:fa4c622b04a7 1820 static const uint16_t ROMABLE_DATA WrapAroundHighRawRangeFilterLimit = 350;
Davidroid 57:fa4c622b04a7 1821 static const uint32_t ROMABLE_DATA WrapAroundHighReturnRateFilterLimit_ROM = 1400; // Shall be adapted depending on crossTalk and device sensitivity
Davidroid 57:fa4c622b04a7 1822
Davidroid 57:fa4c622b04a7 1823 static const uint32_t ROMABLE_DATA WrapAroundMaximumAmbientRateFilterLimit = 7500;
Davidroid 57:fa4c622b04a7 1824
Davidroid 57:fa4c622b04a7 1825 /* Temporal filter data and flush values */
Davidroid 57:fa4c622b04a7 1826 static const uint32_t ROMABLE_DATA MinReturnRateFilterFlush = 75;
Davidroid 57:fa4c622b04a7 1827 static const uint32_t ROMABLE_DATA MaxReturnRateChangeFilterFlush = 50;
Davidroid 57:fa4c622b04a7 1828
Davidroid 57:fa4c622b04a7 1829 /* STDDEV values and damper values */
Davidroid 57:fa4c622b04a7 1830
Davidroid 57:fa4c622b04a7 1831 static const uint32_t ROMABLE_DATA StdDevLimitLowLight = 300;
Davidroid 57:fa4c622b04a7 1832 static const uint32_t ROMABLE_DATA StdDevLimitLowLightSNR = 30; /* 0.3 */
Davidroid 57:fa4c622b04a7 1833 static const uint32_t ROMABLE_DATA StdDevLimitHighLight = 2500;
Davidroid 57:fa4c622b04a7 1834 static const uint32_t ROMABLE_DATA StdDevLimitHighLightSNR = 5; /* 0.05 */
Davidroid 57:fa4c622b04a7 1835
Davidroid 57:fa4c622b04a7 1836 static const uint32_t ROMABLE_DATA StdDevHighConfidenceSNRLimit = 8;
Davidroid 57:fa4c622b04a7 1837
Davidroid 57:fa4c622b04a7 1838 static const uint32_t ROMABLE_DATA StdDevMovingTargetStdDevLimit = 90000;
Davidroid 57:fa4c622b04a7 1839
Davidroid 57:fa4c622b04a7 1840 static const uint32_t ROMABLE_DATA StdDevMovingTargetReturnRateLimit = 3500;
Davidroid 57:fa4c622b04a7 1841 static const uint32_t ROMABLE_DATA StdDevMovingTargetStdDevForReturnRateLimit = 5000;
Davidroid 57:fa4c622b04a7 1842
Davidroid 57:fa4c622b04a7 1843 static const uint32_t ROMABLE_DATA MAX_VAVGDiff = 1800;
Davidroid 57:fa4c622b04a7 1844
Davidroid 57:fa4c622b04a7 1845 /* WrapAroundDetection variables */
Davidroid 57:fa4c622b04a7 1846 static const uint16_t ROMABLE_DATA WrapAroundNoDelayCheckPeriod = 2;
Davidroid 57:fa4c622b04a7 1847 static const uint16_t ROMABLE_DATA StdFilteredReadsIncrement = 2;
Davidroid 57:fa4c622b04a7 1848 static const uint16_t ROMABLE_DATA StdMaxFilteredReads = 4;
Davidroid 57:fa4c622b04a7 1849
Davidroid 57:fa4c622b04a7 1850 uint32_t SignalRateDMax;
Davidroid 57:fa4c622b04a7 1851 uint32_t WrapAroundLowReturnRateLimit;
Davidroid 57:fa4c622b04a7 1852 uint32_t WrapAroundLowReturnRateLimit2;
Davidroid 57:fa4c622b04a7 1853 uint32_t WrapAroundLowReturnRateFilterLimit;
Davidroid 57:fa4c622b04a7 1854 uint32_t WrapAroundHighReturnRateFilterLimit;
Davidroid 57:fa4c622b04a7 1855
Davidroid 57:fa4c622b04a7 1856 uint8_t u8, u8_2;
Davidroid 57:fa4c622b04a7 1857 uint32_t XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 1858 uint32_t StdDevLimit = 300;
Davidroid 57:fa4c622b04a7 1859 uint32_t MaxOrInvalidDistance = 255*_GetUpscale(dev);
Davidroid 57:fa4c622b04a7 1860 /* #define MaxOrInvalidDistance (uint16_t) (255 * 3) */
Davidroid 57:fa4c622b04a7 1861
Davidroid 57:fa4c622b04a7 1862 /* Check if distance is Valid or not */
Davidroid 57:fa4c622b04a7 1863 switch (errorCode) {
Davidroid 57:fa4c622b04a7 1864 case 0x0C:
Davidroid 57:fa4c622b04a7 1865 m_trueRange_mm = MaxOrInvalidDistance;
Davidroid 57:fa4c622b04a7 1866 ValidDistance = 0;
Davidroid 57:fa4c622b04a7 1867 break;
Davidroid 57:fa4c622b04a7 1868 case 0x0D:
Davidroid 57:fa4c622b04a7 1869 m_trueRange_mm = MaxOrInvalidDistance;
Davidroid 57:fa4c622b04a7 1870 ValidDistance = 1;
Davidroid 57:fa4c622b04a7 1871 break;
Davidroid 57:fa4c622b04a7 1872 case 0x0F:
Davidroid 57:fa4c622b04a7 1873 m_trueRange_mm = MaxOrInvalidDistance;
Davidroid 57:fa4c622b04a7 1874 ValidDistance = 1;
Davidroid 57:fa4c622b04a7 1875 break;
Davidroid 57:fa4c622b04a7 1876 default:
Davidroid 57:fa4c622b04a7 1877 if (m_rawRange_mm >= MaxOrInvalidDistance) {
Davidroid 57:fa4c622b04a7 1878 ValidDistance = 0;
Davidroid 57:fa4c622b04a7 1879 } else {
Davidroid 57:fa4c622b04a7 1880 ValidDistance = 1;
Davidroid 57:fa4c622b04a7 1881 }
Davidroid 57:fa4c622b04a7 1882 break;
Davidroid 57:fa4c622b04a7 1883 }
Davidroid 57:fa4c622b04a7 1884 m_newTrueRange_mm = m_trueRange_mm;
Davidroid 57:fa4c622b04a7 1885
Davidroid 57:fa4c622b04a7 1886 XTalkCompRate_KCps = VL6180XDevDataGet(dev, XTalkCompRate_KCps );
Davidroid 57:fa4c622b04a7 1887
Davidroid 57:fa4c622b04a7 1888
Davidroid 57:fa4c622b04a7 1889 //Update signal rate limits depending on crosstalk
Davidroid 57:fa4c622b04a7 1890 SignalRateDMax = (uint32_t)_GetDMaxDataRetSignalAt400mm(dev) + XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 1891 WrapAroundLowReturnRateLimit = WrapAroundLowReturnRateLimit_ROM + XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 1892 WrapAroundLowReturnRateLimit2 = ((WrapAroundLowReturnRateLimit2_ROM * SignalRateDMax) / 312) + XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 1893 WrapAroundLowReturnRateFilterLimit = ((WrapAroundLowReturnRateFilterLimit_ROM * SignalRateDMax) / 312) + XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 1894 WrapAroundHighReturnRateFilterLimit = ((WrapAroundHighReturnRateFilterLimit_ROM * SignalRateDMax) / 312) + XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 1895
Davidroid 57:fa4c622b04a7 1896
Davidroid 57:fa4c622b04a7 1897 /* Checks on low range data */
Davidroid 57:fa4c622b04a7 1898 if ((m_rawRange_mm < WrapAroundLowRawRangeLimit) && (m_rtnSignalRate < WrapAroundLowReturnRateLimit)) {
Davidroid 57:fa4c622b04a7 1899 m_newTrueRange_mm = MaxOrInvalidDistance;
Davidroid 57:fa4c622b04a7 1900 bypassFilter = 1;
Davidroid 57:fa4c622b04a7 1901 }
Davidroid 57:fa4c622b04a7 1902 if ((m_rawRange_mm < WrapAroundLowRawRangeLimit2) && (m_rtnSignalRate < WrapAroundLowReturnRateLimit2)) {
Davidroid 57:fa4c622b04a7 1903 m_newTrueRange_mm = MaxOrInvalidDistance;
Davidroid 57:fa4c622b04a7 1904 bypassFilter = 1;
Davidroid 57:fa4c622b04a7 1905 }
Davidroid 57:fa4c622b04a7 1906
Davidroid 57:fa4c622b04a7 1907 /* Checks on Ambient rate level */
Davidroid 57:fa4c622b04a7 1908 if (m_rtnAmbientRate > WrapAroundMaximumAmbientRateFilterLimit) {
Davidroid 57:fa4c622b04a7 1909 /* Too high ambient rate */
Davidroid 57:fa4c622b04a7 1910 FlushFilter = 1;
Davidroid 57:fa4c622b04a7 1911 bypassFilter = 1;
Davidroid 57:fa4c622b04a7 1912 }
Davidroid 57:fa4c622b04a7 1913 /* Checks on Filter flush */
Davidroid 57:fa4c622b04a7 1914 if (m_rtnSignalRate < MinReturnRateFilterFlush) {
Davidroid 57:fa4c622b04a7 1915 /* Completely lost target, so flush the filter */
Davidroid 57:fa4c622b04a7 1916 FlushFilter = 1;
Davidroid 57:fa4c622b04a7 1917 bypassFilter = 1;
Davidroid 57:fa4c622b04a7 1918 }
Davidroid 57:fa4c622b04a7 1919 if (_FilterData(LastReturnRates)[0] != 0) {
Davidroid 57:fa4c622b04a7 1920 if (m_rtnSignalRate > _FilterData(LastReturnRates)[0])
Davidroid 57:fa4c622b04a7 1921 RateChange = (100 * (m_rtnSignalRate - _FilterData(LastReturnRates)[0])) / _FilterData(LastReturnRates)[0];
Davidroid 57:fa4c622b04a7 1922 else
Davidroid 57:fa4c622b04a7 1923 RateChange = (100 * (_FilterData(LastReturnRates)[0] - m_rtnSignalRate)) / _FilterData(LastReturnRates)[0];
Davidroid 57:fa4c622b04a7 1924 } else
Davidroid 57:fa4c622b04a7 1925 RateChange = 0;
Davidroid 57:fa4c622b04a7 1926 if (RateChange > MaxReturnRateChangeFilterFlush) {
Davidroid 57:fa4c622b04a7 1927 FlushFilter = 1;
Davidroid 57:fa4c622b04a7 1928 }
Davidroid 57:fa4c622b04a7 1929 /* TODO optimize filter using circular buffer */
Davidroid 57:fa4c622b04a7 1930 if (FlushFilter == 1) {
Davidroid 57:fa4c622b04a7 1931 _FilterData(MeasurementIndex) = 0;
Davidroid 57:fa4c622b04a7 1932 for (i = 0; i < FILTER_NBOF_SAMPLES; i++) {
Davidroid 57:fa4c622b04a7 1933 _FilterData(LastTrueRange)[i] = FILTER_INVALID_DISTANCE;
Davidroid 57:fa4c622b04a7 1934 _FilterData(LastReturnRates)[i] = 0;
Davidroid 57:fa4c622b04a7 1935 }
Davidroid 57:fa4c622b04a7 1936 } else {
Davidroid 57:fa4c622b04a7 1937 for (i = (uint16_t) (FILTER_NBOF_SAMPLES - 1); i > 0; i--) {
Davidroid 57:fa4c622b04a7 1938 _FilterData(LastTrueRange)[i] = _FilterData(LastTrueRange)[i - 1];
Davidroid 57:fa4c622b04a7 1939 _FilterData(LastReturnRates)[i] = _FilterData(LastReturnRates)[i - 1];
Davidroid 57:fa4c622b04a7 1940 }
Davidroid 57:fa4c622b04a7 1941 }
Davidroid 57:fa4c622b04a7 1942 if (ValidDistance == 1)
Davidroid 57:fa4c622b04a7 1943 _FilterData(LastTrueRange)[0] = m_trueRange_mm;
Davidroid 57:fa4c622b04a7 1944 else
Davidroid 57:fa4c622b04a7 1945 _FilterData(LastTrueRange)[0] = FILTER_INVALID_DISTANCE;
Davidroid 57:fa4c622b04a7 1946 _FilterData(LastReturnRates)[0] = m_rtnSignalRate;
Davidroid 57:fa4c622b04a7 1947
Davidroid 57:fa4c622b04a7 1948 /* Check if we need to go through the filter or not */
Davidroid 57:fa4c622b04a7 1949 if (!(((m_rawRange_mm < WrapAroundHighRawRangeFilterLimit) && (m_rtnSignalRate < WrapAroundLowReturnRateFilterLimit)) || ((m_rawRange_mm >= WrapAroundHighRawRangeFilterLimit) && (m_rtnSignalRate < WrapAroundHighReturnRateFilterLimit))))
Davidroid 57:fa4c622b04a7 1950 bypassFilter = 1;
Davidroid 57:fa4c622b04a7 1951
Davidroid 57:fa4c622b04a7 1952 /* Check which kind of measurement has been made */
Davidroid 57:fa4c622b04a7 1953 status = VL6180X_RdByte(dev, 0x01AC, &u8 );
Davidroid 57:fa4c622b04a7 1954 if( status ){
Davidroid 57:fa4c622b04a7 1955 VL6180X_ErrLog("0x01AC rd fail");
Davidroid 57:fa4c622b04a7 1956 goto done_err;
Davidroid 57:fa4c622b04a7 1957 }
Davidroid 57:fa4c622b04a7 1958 registerValue =u8;
Davidroid 57:fa4c622b04a7 1959
Davidroid 57:fa4c622b04a7 1960 /* Read data for filtering */
Davidroid 57:fa4c622b04a7 1961 status = VL6180X_RdByte(dev, 0x10C, &u8 ); /* read only 8 lsb bits */
Davidroid 57:fa4c622b04a7 1962 if( status ){
Davidroid 57:fa4c622b04a7 1963 VL6180X_ErrLog("0x010C rd fail");
Davidroid 57:fa4c622b04a7 1964 goto done_err;
Davidroid 57:fa4c622b04a7 1965 }
Davidroid 57:fa4c622b04a7 1966 register32BitsValue1=u8;
Davidroid 57:fa4c622b04a7 1967 status = VL6180X_RdByte(dev, 0x0110, &u8); /* read only 8 lsb bits */
Davidroid 57:fa4c622b04a7 1968 if( status ){
Davidroid 57:fa4c622b04a7 1969 VL6180X_ErrLog("0x0110 rd fail");
Davidroid 57:fa4c622b04a7 1970 goto done_err;
Davidroid 57:fa4c622b04a7 1971 }
Davidroid 57:fa4c622b04a7 1972 register32BitsValue2 = u8;
Davidroid 57:fa4c622b04a7 1973
Davidroid 57:fa4c622b04a7 1974 if (registerValue == 0x3E) {
Davidroid 57:fa4c622b04a7 1975 _FilterData(Default_ZeroVal) = register32BitsValue1;
Davidroid 57:fa4c622b04a7 1976 _FilterData(Default_VAVGVal) = register32BitsValue2;
Davidroid 57:fa4c622b04a7 1977 } else {
Davidroid 57:fa4c622b04a7 1978 _FilterData(NoDelay_ZeroVal) = register32BitsValue1;
Davidroid 57:fa4c622b04a7 1979 _FilterData(NoDelay_VAVGVal) = register32BitsValue2;
Davidroid 57:fa4c622b04a7 1980 }
Davidroid 57:fa4c622b04a7 1981
Davidroid 57:fa4c622b04a7 1982 if (bypassFilter == 1) {
Davidroid 57:fa4c622b04a7 1983 /* Do not go through the filter */
Davidroid 57:fa4c622b04a7 1984 if (registerValue != 0x3E) {
Davidroid 57:fa4c622b04a7 1985 status = VL6180X_WrByte(dev, 0x1AC, 0x3E);
Davidroid 57:fa4c622b04a7 1986 if( status ){
Davidroid 57:fa4c622b04a7 1987 VL6180X_ErrLog("0x01AC bypass wr fail");
Davidroid 57:fa4c622b04a7 1988 goto done_err;
Davidroid 57:fa4c622b04a7 1989 }
Davidroid 57:fa4c622b04a7 1990 status = VL6180X_WrByte(dev, 0x0F2, 0x01);
Davidroid 57:fa4c622b04a7 1991 if( status ){
Davidroid 57:fa4c622b04a7 1992 VL6180X_ErrLog("0x0F2 bypass wr fail");
Davidroid 57:fa4c622b04a7 1993 goto done_err;
Davidroid 57:fa4c622b04a7 1994 }
Davidroid 57:fa4c622b04a7 1995 }
Davidroid 57:fa4c622b04a7 1996 /* Set both Default and NoDelay To same value */
Davidroid 57:fa4c622b04a7 1997 _FilterData(Default_ZeroVal) = register32BitsValue1;
Davidroid 57:fa4c622b04a7 1998 _FilterData(Default_VAVGVal) = register32BitsValue2;
Davidroid 57:fa4c622b04a7 1999 _FilterData(NoDelay_ZeroVal) = register32BitsValue1;
Davidroid 57:fa4c622b04a7 2000 _FilterData(NoDelay_VAVGVal) = register32BitsValue2;
Davidroid 57:fa4c622b04a7 2001 _FilterData(MeasurementIndex) = 0;
Davidroid 57:fa4c622b04a7 2002
Davidroid 57:fa4c622b04a7 2003 return m_newTrueRange_mm;
Davidroid 57:fa4c622b04a7 2004 }
Davidroid 57:fa4c622b04a7 2005
Davidroid 57:fa4c622b04a7 2006 if (_FilterData(MeasurementIndex) % WrapAroundNoDelayCheckPeriod == 0) {
Davidroid 57:fa4c622b04a7 2007 u8=0x3C;
Davidroid 57:fa4c622b04a7 2008 u8_2 = 0x05;
Davidroid 57:fa4c622b04a7 2009 } else {
Davidroid 57:fa4c622b04a7 2010 u8=0x3E;
Davidroid 57:fa4c622b04a7 2011 u8_2 = 0x01;
Davidroid 57:fa4c622b04a7 2012 }
Davidroid 57:fa4c622b04a7 2013 status = VL6180X_WrByte(dev, 0x01AC, u8);
Davidroid 57:fa4c622b04a7 2014 if( status ){
Davidroid 57:fa4c622b04a7 2015 VL6180X_ErrLog("0x01AC wr fail");
Davidroid 57:fa4c622b04a7 2016 goto done_err;
Davidroid 57:fa4c622b04a7 2017 }
Davidroid 57:fa4c622b04a7 2018 status = VL6180X_WrByte(dev, 0x0F2, u8_2);
Davidroid 57:fa4c622b04a7 2019 if( status ){
Davidroid 57:fa4c622b04a7 2020 VL6180X_ErrLog("0x0F2 wr fail");
Davidroid 57:fa4c622b04a7 2021 goto done_err;
Davidroid 57:fa4c622b04a7 2022 }
Davidroid 57:fa4c622b04a7 2023
Davidroid 57:fa4c622b04a7 2024
Davidroid 57:fa4c622b04a7 2025 _FilterData(MeasurementIndex)++;
Davidroid 57:fa4c622b04a7 2026
Davidroid 57:fa4c622b04a7 2027 /* Computes current VAVGDiff */
Davidroid 57:fa4c622b04a7 2028 if (_FilterData(Default_VAVGVal) > _FilterData(NoDelay_VAVGVal))
Davidroid 57:fa4c622b04a7 2029 VAVGDiff = _FilterData(Default_VAVGVal) - _FilterData(NoDelay_VAVGVal);
Davidroid 57:fa4c622b04a7 2030 else
Davidroid 57:fa4c622b04a7 2031 VAVGDiff = 0;
Davidroid 57:fa4c622b04a7 2032 _FilterData(Previous_VAVGDiff) = VAVGDiff;
Davidroid 57:fa4c622b04a7 2033
Davidroid 57:fa4c622b04a7 2034 /* Check the VAVGDiff */
Davidroid 57:fa4c622b04a7 2035 if (_FilterData(Default_ZeroVal) > _FilterData(NoDelay_ZeroVal))
Davidroid 57:fa4c622b04a7 2036 IdealVAVGDiff = _FilterData(Default_ZeroVal) - _FilterData(NoDelay_ZeroVal);
Davidroid 57:fa4c622b04a7 2037 else
Davidroid 57:fa4c622b04a7 2038 IdealVAVGDiff = _FilterData(NoDelay_ZeroVal) - _FilterData(Default_ZeroVal);
Davidroid 57:fa4c622b04a7 2039 if (IdealVAVGDiff > MAX_VAVGDiff)
Davidroid 57:fa4c622b04a7 2040 MinVAVGDiff = IdealVAVGDiff - MAX_VAVGDiff;
Davidroid 57:fa4c622b04a7 2041 else
Davidroid 57:fa4c622b04a7 2042 MinVAVGDiff = 0;
Davidroid 57:fa4c622b04a7 2043 MaxVAVGDiff = IdealVAVGDiff + MAX_VAVGDiff;
Davidroid 57:fa4c622b04a7 2044 if (VAVGDiff < MinVAVGDiff || VAVGDiff > MaxVAVGDiff) {
Davidroid 57:fa4c622b04a7 2045 WrapAroundFlag = 1;
Davidroid 57:fa4c622b04a7 2046 } else {
Davidroid 57:fa4c622b04a7 2047 /* Go through filtering check */
Davidroid 57:fa4c622b04a7 2048
Davidroid 57:fa4c622b04a7 2049 /* StdDevLimit Damper on SNR */
Davidroid 57:fa4c622b04a7 2050 StdDevLimit = _filter_StdDevDamper(m_rtnAmbientRate, m_rtnSignalRate, StdDevLimitLowLight, StdDevLimitLowLightSNR, StdDevLimitHighLight, StdDevLimitHighLightSNR);
Davidroid 57:fa4c622b04a7 2051
Davidroid 57:fa4c622b04a7 2052 /* Standard deviations computations */
Davidroid 57:fa4c622b04a7 2053 StdDevSamples = 0;
Davidroid 57:fa4c622b04a7 2054 StdDevDistanceSum = 0;
Davidroid 57:fa4c622b04a7 2055 StdDevDistanceMean = 0;
Davidroid 57:fa4c622b04a7 2056 StdDevDistance = 0;
Davidroid 57:fa4c622b04a7 2057 StdDevRateSum = 0;
Davidroid 57:fa4c622b04a7 2058 StdDevRateMean = 0;
Davidroid 57:fa4c622b04a7 2059 StdDevRate = 0;
Davidroid 57:fa4c622b04a7 2060 for (i = 0; (i < FILTER_NBOF_SAMPLES) && (StdDevSamples < FILTER_STDDEV_SAMPLES); i++) {
Davidroid 57:fa4c622b04a7 2061 if (_FilterData(LastTrueRange)[i] != FILTER_INVALID_DISTANCE) {
Davidroid 57:fa4c622b04a7 2062 StdDevSamples = (uint16_t) (StdDevSamples + 1);
Davidroid 57:fa4c622b04a7 2063 StdDevDistanceSum = (uint32_t) (StdDevDistanceSum + _FilterData(LastTrueRange)[i]);
Davidroid 57:fa4c622b04a7 2064 StdDevRateSum = (uint32_t) (StdDevRateSum + _FilterData(LastReturnRates)[i]);
Davidroid 57:fa4c622b04a7 2065 }
Davidroid 57:fa4c622b04a7 2066 }
Davidroid 57:fa4c622b04a7 2067 if (StdDevSamples > 0) {
Davidroid 57:fa4c622b04a7 2068 StdDevDistanceMean = (uint32_t) (StdDevDistanceSum / StdDevSamples);
Davidroid 57:fa4c622b04a7 2069 StdDevRateMean = (uint32_t) (StdDevRateSum / StdDevSamples);
Davidroid 57:fa4c622b04a7 2070 }
Davidroid 57:fa4c622b04a7 2071 /* TODO optimize shorten Std dev in aisngle loop computation using sum of x2 - (sum of x)2 */
Davidroid 57:fa4c622b04a7 2072 StdDevSamples = 0;
Davidroid 57:fa4c622b04a7 2073 StdDevDistanceSum = 0;
Davidroid 57:fa4c622b04a7 2074 StdDevRateSum = 0;
Davidroid 57:fa4c622b04a7 2075 for (i = 0; (i < FILTER_NBOF_SAMPLES) && (StdDevSamples < FILTER_STDDEV_SAMPLES); i++) {
Davidroid 57:fa4c622b04a7 2076 if (_FilterData(LastTrueRange)[i] != FILTER_INVALID_DISTANCE) {
Davidroid 57:fa4c622b04a7 2077 StdDevSamples = (uint16_t) (StdDevSamples + 1);
Davidroid 57:fa4c622b04a7 2078 StdDevDistanceSum = (uint32_t) (StdDevDistanceSum + (int) (_FilterData(LastTrueRange)[i] - StdDevDistanceMean) * (int) (_FilterData(LastTrueRange)[i] - StdDevDistanceMean));
Davidroid 57:fa4c622b04a7 2079 StdDevRateSum = (uint32_t) (StdDevRateSum + (int) (_FilterData(LastReturnRates)[i] - StdDevRateMean) * (int) (_FilterData(LastReturnRates)[i] - StdDevRateMean));
Davidroid 57:fa4c622b04a7 2080 }
Davidroid 57:fa4c622b04a7 2081 }
Davidroid 57:fa4c622b04a7 2082 if (StdDevSamples >= MIN_FILTER_STDDEV_SAMPLES) {
Davidroid 57:fa4c622b04a7 2083 StdDevDistance = (uint16_t) (StdDevDistanceSum / StdDevSamples);
Davidroid 57:fa4c622b04a7 2084 StdDevRate = (uint16_t) (StdDevRateSum / StdDevSamples);
Davidroid 57:fa4c622b04a7 2085 } else {
Davidroid 57:fa4c622b04a7 2086 StdDevDistance = 0;
Davidroid 57:fa4c622b04a7 2087 StdDevRate = 0;
Davidroid 57:fa4c622b04a7 2088 }
Davidroid 57:fa4c622b04a7 2089
Davidroid 57:fa4c622b04a7 2090 /* Check Return rate standard deviation */
Davidroid 57:fa4c622b04a7 2091 if (StdDevRate < StdDevMovingTargetStdDevLimit) {
Davidroid 57:fa4c622b04a7 2092 if (StdDevSamples < MIN_FILTER_VALID_STDDEV_SAMPLES) {
Davidroid 57:fa4c622b04a7 2093 m_newTrueRange_mm = MaxOrInvalidDistance;
Davidroid 57:fa4c622b04a7 2094 } else {
Davidroid 57:fa4c622b04a7 2095 /* Check distance standard deviation */
Davidroid 57:fa4c622b04a7 2096 if (StdDevRate < StdDevMovingTargetReturnRateLimit)
Davidroid 57:fa4c622b04a7 2097 StdDevLimitWithTargetMove = StdDevLimit + (((StdDevMovingTargetStdDevForReturnRateLimit - StdDevLimit) * StdDevRate) / StdDevMovingTargetReturnRateLimit);
Davidroid 57:fa4c622b04a7 2098 else
Davidroid 57:fa4c622b04a7 2099 StdDevLimitWithTargetMove = StdDevMovingTargetStdDevForReturnRateLimit;
Davidroid 57:fa4c622b04a7 2100
Davidroid 57:fa4c622b04a7 2101 if ((StdDevDistance * StdDevHighConfidenceSNRLimit) < StdDevLimitWithTargetMove) {
Davidroid 57:fa4c622b04a7 2102 NoWrapAroundHighConfidenceFlag = 1;
Davidroid 57:fa4c622b04a7 2103 } else {
Davidroid 57:fa4c622b04a7 2104 if (StdDevDistance < StdDevLimitWithTargetMove) {
Davidroid 57:fa4c622b04a7 2105 if (StdDevSamples >= MIN_FILTER_VALID_STDDEV_SAMPLES) {
Davidroid 57:fa4c622b04a7 2106 NoWrapAroundFlag = 1;
Davidroid 57:fa4c622b04a7 2107 } else {
Davidroid 57:fa4c622b04a7 2108 m_newTrueRange_mm = MaxOrInvalidDistance;
Davidroid 57:fa4c622b04a7 2109 }
Davidroid 57:fa4c622b04a7 2110 } else {
Davidroid 57:fa4c622b04a7 2111 WrapAroundFlag = 1;
Davidroid 57:fa4c622b04a7 2112 }
Davidroid 57:fa4c622b04a7 2113 }
Davidroid 57:fa4c622b04a7 2114 }
Davidroid 57:fa4c622b04a7 2115 } else {
Davidroid 57:fa4c622b04a7 2116 WrapAroundFlag = 1;
Davidroid 57:fa4c622b04a7 2117 }
Davidroid 57:fa4c622b04a7 2118 }
Davidroid 57:fa4c622b04a7 2119
Davidroid 57:fa4c622b04a7 2120 if (m_newTrueRange_mm == MaxOrInvalidDistance) {
Davidroid 57:fa4c622b04a7 2121 if (_FilterData(StdFilteredReads) > 0)
Davidroid 57:fa4c622b04a7 2122 _FilterData(StdFilteredReads) = (uint16_t) (_FilterData(StdFilteredReads) - 1);
Davidroid 57:fa4c622b04a7 2123 } else {
Davidroid 57:fa4c622b04a7 2124 if (WrapAroundFlag == 1) {
Davidroid 57:fa4c622b04a7 2125 m_newTrueRange_mm = MaxOrInvalidDistance;
Davidroid 57:fa4c622b04a7 2126 _FilterData(StdFilteredReads) = (uint16_t) (_FilterData(StdFilteredReads) + StdFilteredReadsIncrement);
Davidroid 57:fa4c622b04a7 2127 if (_FilterData(StdFilteredReads) > StdMaxFilteredReads)
Davidroid 57:fa4c622b04a7 2128 _FilterData(StdFilteredReads) = StdMaxFilteredReads;
Davidroid 57:fa4c622b04a7 2129 } else {
Davidroid 57:fa4c622b04a7 2130 if (NoWrapAroundFlag == 1) {
Davidroid 57:fa4c622b04a7 2131 if (_FilterData(StdFilteredReads) > 0) {
Davidroid 57:fa4c622b04a7 2132 m_newTrueRange_mm = MaxOrInvalidDistance;
Davidroid 57:fa4c622b04a7 2133 if (_FilterData(StdFilteredReads) > StdFilteredReadsIncrement)
Davidroid 57:fa4c622b04a7 2134 _FilterData(StdFilteredReads) = (uint16_t) (_FilterData(StdFilteredReads) - StdFilteredReadsIncrement);
Davidroid 57:fa4c622b04a7 2135 else
Davidroid 57:fa4c622b04a7 2136 _FilterData(StdFilteredReads) = 0;
Davidroid 57:fa4c622b04a7 2137 }
Davidroid 57:fa4c622b04a7 2138 } else {
Davidroid 57:fa4c622b04a7 2139 if (NoWrapAroundHighConfidenceFlag == 1) {
Davidroid 57:fa4c622b04a7 2140 _FilterData(StdFilteredReads) = 0;
Davidroid 57:fa4c622b04a7 2141 }
Davidroid 57:fa4c622b04a7 2142 }
Davidroid 57:fa4c622b04a7 2143 }
Davidroid 57:fa4c622b04a7 2144 }
Davidroid 57:fa4c622b04a7 2145
Davidroid 57:fa4c622b04a7 2146 return m_newTrueRange_mm;
Davidroid 57:fa4c622b04a7 2147 done_err:
Davidroid 57:fa4c622b04a7 2148 return -1;
Davidroid 57:fa4c622b04a7 2149
Davidroid 57:fa4c622b04a7 2150 #undef MaxOrInvalidDistance
Davidroid 57:fa4c622b04a7 2151 }
Davidroid 57:fa4c622b04a7 2152
Davidroid 57:fa4c622b04a7 2153
Davidroid 57:fa4c622b04a7 2154 int VL6180X::_filter_GetResult(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData) {
Davidroid 57:fa4c622b04a7 2155 uint32_t m_rawRange_mm = 0;
Davidroid 57:fa4c622b04a7 2156 int32_t FilteredRange;
Davidroid 57:fa4c622b04a7 2157 const uint8_t scaler = _GetUpscale(dev);
Davidroid 57:fa4c622b04a7 2158 uint8_t u8;
Davidroid 57:fa4c622b04a7 2159 int status;
Davidroid 57:fa4c622b04a7 2160
Davidroid 57:fa4c622b04a7 2161 do {
Davidroid 57:fa4c622b04a7 2162 status = VL6180X_RdByte(dev, RESULT_RANGE_RAW, &u8);
Davidroid 57:fa4c622b04a7 2163 if (status) {
Davidroid 57:fa4c622b04a7 2164 VL6180X_ErrLog("RESULT_RANGE_RAW rd fail");
Davidroid 57:fa4c622b04a7 2165 break;
Davidroid 57:fa4c622b04a7 2166 }
Davidroid 57:fa4c622b04a7 2167 m_rawRange_mm = u8;
Davidroid 57:fa4c622b04a7 2168
Davidroid 57:fa4c622b04a7 2169 FilteredRange = _filter_Start(dev, pRangeData->range_mm, (m_rawRange_mm * scaler), pRangeData->rtnRate, pRangeData->rtnAmbRate, pRangeData->errorStatus);
Davidroid 57:fa4c622b04a7 2170 if( FilteredRange<0 ){
Davidroid 57:fa4c622b04a7 2171 status = -1;
Davidroid 57:fa4c622b04a7 2172 break;
Davidroid 57:fa4c622b04a7 2173 }
Davidroid 57:fa4c622b04a7 2174 pRangeData->FilteredData.range_mm= FilteredRange;
Davidroid 57:fa4c622b04a7 2175 pRangeData->FilteredData.rawRange_mm = m_rawRange_mm * scaler;
Davidroid 57:fa4c622b04a7 2176 } while (0);
Davidroid 57:fa4c622b04a7 2177 return status;
Davidroid 57:fa4c622b04a7 2178 }
Davidroid 57:fa4c622b04a7 2179
Davidroid 57:fa4c622b04a7 2180 #undef _FilterData
Davidroid 57:fa4c622b04a7 2181 #undef FILTER_STDDEV_SAMPLES
Davidroid 57:fa4c622b04a7 2182 #undef MIN_FILTER_STDDEV_SAMPLES
Davidroid 57:fa4c622b04a7 2183 #undef MIN_FILTER_VALID_STDDEV_SAMPLES
Davidroid 57:fa4c622b04a7 2184 #undef FILTER_INVALID_DISTANCE
Davidroid 57:fa4c622b04a7 2185
Davidroid 57:fa4c622b04a7 2186 #endif /* VL6180X_WRAP_AROUND_FILTER_SUPPORT */
Davidroid 57:fa4c622b04a7 2187
Davidroid 57:fa4c622b04a7 2188 #ifdef VL6180X_HAVE_RATE_DATA
Davidroid 57:fa4c622b04a7 2189
Davidroid 57:fa4c622b04a7 2190 int VL6180X::_GetRateResult(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData) {
Davidroid 57:fa4c622b04a7 2191 uint32_t m_rtnConvTime = 0;
Davidroid 57:fa4c622b04a7 2192 uint32_t m_rtnSignalRate = 0;
Davidroid 57:fa4c622b04a7 2193 uint32_t m_rtnAmbientRate = 0;
Davidroid 57:fa4c622b04a7 2194 uint32_t m_rtnSignalCount = 0;
Davidroid 57:fa4c622b04a7 2195 uint32_t m_rtnAmbientCount = 0;
Davidroid 57:fa4c622b04a7 2196 uint32_t m_refConvTime = 0;
Davidroid 57:fa4c622b04a7 2197 uint32_t cRtnSignalCountMax = 0x7FFFFFFF;
Davidroid 57:fa4c622b04a7 2198 uint32_t cDllPeriods = 6;
Davidroid 57:fa4c622b04a7 2199 uint32_t calcConvTime = 0;
Davidroid 57:fa4c622b04a7 2200
Davidroid 57:fa4c622b04a7 2201 int status;
Davidroid 57:fa4c622b04a7 2202
Davidroid 57:fa4c622b04a7 2203 do {
Davidroid 57:fa4c622b04a7 2204
Davidroid 57:fa4c622b04a7 2205 status = VL6180X_RdDWord(dev, RESULT_RANGE_RETURN_SIGNAL_COUNT, &m_rtnSignalCount);
Davidroid 57:fa4c622b04a7 2206 if (status) {
Davidroid 57:fa4c622b04a7 2207 VL6180X_ErrLog("RESULT_RANGE_RETURN_SIGNAL_COUNT rd fail");
Davidroid 57:fa4c622b04a7 2208 break;
Davidroid 57:fa4c622b04a7 2209 }
Davidroid 57:fa4c622b04a7 2210 if (m_rtnSignalCount > cRtnSignalCountMax) {
Davidroid 57:fa4c622b04a7 2211 m_rtnSignalCount = 0;
Davidroid 57:fa4c622b04a7 2212 }
Davidroid 57:fa4c622b04a7 2213
Davidroid 57:fa4c622b04a7 2214 status = VL6180X_RdDWord(dev, RESULT_RANGE_RETURN_AMB_COUNT, &m_rtnAmbientCount);
Davidroid 57:fa4c622b04a7 2215 if (status) {
Davidroid 57:fa4c622b04a7 2216 VL6180X_ErrLog("RESULT_RANGE_RETURN_AMB_COUNTrd fail");
Davidroid 57:fa4c622b04a7 2217 break;
Davidroid 57:fa4c622b04a7 2218 }
Davidroid 57:fa4c622b04a7 2219
Davidroid 57:fa4c622b04a7 2220
Davidroid 57:fa4c622b04a7 2221 status = VL6180X_RdDWord(dev, RESULT_RANGE_RETURN_CONV_TIME, &m_rtnConvTime);
Davidroid 57:fa4c622b04a7 2222 if (status) {
Davidroid 57:fa4c622b04a7 2223 VL6180X_ErrLog("RESULT_RANGE_RETURN_CONV_TIME rd fail");
Davidroid 57:fa4c622b04a7 2224 break;
Davidroid 57:fa4c622b04a7 2225 }
Davidroid 57:fa4c622b04a7 2226
Davidroid 57:fa4c622b04a7 2227 status = VL6180X_RdDWord(dev, RESULT_RANGE_REFERENCE_CONV_TIME, &m_refConvTime);
Davidroid 57:fa4c622b04a7 2228 if (status) {
Davidroid 57:fa4c622b04a7 2229 VL6180X_ErrLog("RESULT_RANGE_REFERENCE_CONV_TIME rd fail");
Davidroid 57:fa4c622b04a7 2230 break;
Davidroid 57:fa4c622b04a7 2231 }
Davidroid 57:fa4c622b04a7 2232
Davidroid 57:fa4c622b04a7 2233 pRangeData->rtnConvTime = m_rtnConvTime;
Davidroid 57:fa4c622b04a7 2234 pRangeData->refConvTime = m_refConvTime;
Davidroid 57:fa4c622b04a7 2235
Davidroid 57:fa4c622b04a7 2236 calcConvTime = m_refConvTime;
Davidroid 57:fa4c622b04a7 2237 if (m_rtnConvTime > m_refConvTime) {
Davidroid 57:fa4c622b04a7 2238 calcConvTime = m_rtnConvTime;
Davidroid 57:fa4c622b04a7 2239 }
Davidroid 57:fa4c622b04a7 2240 if (calcConvTime == 0)
Davidroid 57:fa4c622b04a7 2241 calcConvTime = 63000;
Davidroid 57:fa4c622b04a7 2242
Davidroid 57:fa4c622b04a7 2243 m_rtnSignalRate = (m_rtnSignalCount * 1000) / calcConvTime;
Davidroid 57:fa4c622b04a7 2244 m_rtnAmbientRate = (m_rtnAmbientCount * cDllPeriods * 1000) / calcConvTime;
Davidroid 57:fa4c622b04a7 2245
Davidroid 57:fa4c622b04a7 2246 pRangeData->rtnRate = m_rtnSignalRate;
Davidroid 57:fa4c622b04a7 2247 pRangeData->rtnAmbRate = m_rtnAmbientRate;
Davidroid 57:fa4c622b04a7 2248
Davidroid 57:fa4c622b04a7 2249
Davidroid 57:fa4c622b04a7 2250 } while (0);
Davidroid 57:fa4c622b04a7 2251 return status;
Davidroid 57:fa4c622b04a7 2252 }
Davidroid 57:fa4c622b04a7 2253 #endif /* VL6180X_HAVE_RATE_DATA */
Davidroid 57:fa4c622b04a7 2254
Davidroid 57:fa4c622b04a7 2255
Davidroid 57:fa4c622b04a7 2256 int VL6180X::VL6180X_DMaxSetState(VL6180XDev_t dev, int state){
Davidroid 57:fa4c622b04a7 2257 int status;
Davidroid 57:fa4c622b04a7 2258 LOG_FUNCTION_START("%d", state);
Davidroid 57:fa4c622b04a7 2259 #if VL6180X_HAVE_DMAX_RANGING
Davidroid 57:fa4c622b04a7 2260 VL6180XDevDataSet(dev,DMaxEnable, state);
Davidroid 57:fa4c622b04a7 2261 if( state ){
Davidroid 57:fa4c622b04a7 2262 status = _DMax_InitData(dev);
Davidroid 57:fa4c622b04a7 2263 }
Davidroid 57:fa4c622b04a7 2264 else {
Davidroid 57:fa4c622b04a7 2265 status = 0;
Davidroid 57:fa4c622b04a7 2266 }
Davidroid 57:fa4c622b04a7 2267 #else
Davidroid 57:fa4c622b04a7 2268 status = NOT_SUPPORTED;
Davidroid 57:fa4c622b04a7 2269 #endif
Davidroid 57:fa4c622b04a7 2270 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 2271 return status;
Davidroid 57:fa4c622b04a7 2272 }
Davidroid 57:fa4c622b04a7 2273
Davidroid 57:fa4c622b04a7 2274 int VL6180X::VL6180X_DMaxGetState(VL6180XDev_t dev){
Davidroid 57:fa4c622b04a7 2275 int status;
Davidroid 57:fa4c622b04a7 2276 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 2277 #if VL6180X_HAVE_DMAX_RANGING
Davidroid 57:fa4c622b04a7 2278 status = VL6180XDevDataGet(dev,DMaxEnable);
Davidroid 57:fa4c622b04a7 2279 #else
Davidroid 57:fa4c622b04a7 2280 status = 0;
Davidroid 57:fa4c622b04a7 2281 #endif
Davidroid 57:fa4c622b04a7 2282 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 2283 return status;
Davidroid 57:fa4c622b04a7 2284 }
Davidroid 57:fa4c622b04a7 2285
Davidroid 57:fa4c622b04a7 2286
Davidroid 57:fa4c622b04a7 2287 #if VL6180X_HAVE_DMAX_RANGING
Davidroid 57:fa4c622b04a7 2288
Davidroid 57:fa4c622b04a7 2289 #define _DMaxData(field) VL6180XDevDataGet(dev, DMaxData.field)
Davidroid 57:fa4c622b04a7 2290 /*
Davidroid 57:fa4c622b04a7 2291 * Convert fix point x.7 to KCpount per sec
Davidroid 57:fa4c622b04a7 2292 */
Davidroid 57:fa4c622b04a7 2293
Davidroid 57:fa4c622b04a7 2294 #ifndef VL6180X_PLATFORM_PROVIDE_SQRT
Davidroid 57:fa4c622b04a7 2295
Davidroid 57:fa4c622b04a7 2296 /*
Davidroid 57:fa4c622b04a7 2297 * 32 bit integer square root with not so bad precision (integer result) and is quite fast
Davidroid 57:fa4c622b04a7 2298 * see http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
Davidroid 57:fa4c622b04a7 2299 */
Davidroid 57:fa4c622b04a7 2300 uint32_t VL6180X_SqrtUint32(uint32_t num) {
Davidroid 57:fa4c622b04a7 2301 uint32_t res = 0;
Davidroid 57:fa4c622b04a7 2302 uint32_t bit = 1 << 30; /* The second-to-top bit is set: 1 << 30 for 32 bits */
Davidroid 57:fa4c622b04a7 2303
Davidroid 57:fa4c622b04a7 2304 /* "bit" starts at the highest power of four <= the argument. */
Davidroid 57:fa4c622b04a7 2305 while (bit > num)
Davidroid 57:fa4c622b04a7 2306 bit >>= 2;
Davidroid 57:fa4c622b04a7 2307
Davidroid 57:fa4c622b04a7 2308 while (bit != 0) {
Davidroid 57:fa4c622b04a7 2309 if (num >= res + bit) {
Davidroid 57:fa4c622b04a7 2310 num -= res + bit;
Davidroid 57:fa4c622b04a7 2311 res = (res >> 1) + bit;
Davidroid 57:fa4c622b04a7 2312 }
Davidroid 57:fa4c622b04a7 2313 else
Davidroid 57:fa4c622b04a7 2314 res >>= 1;
Davidroid 57:fa4c622b04a7 2315 bit >>= 2;
Davidroid 57:fa4c622b04a7 2316 }
Davidroid 57:fa4c622b04a7 2317 return res;
Davidroid 57:fa4c622b04a7 2318 }
Davidroid 57:fa4c622b04a7 2319 #endif
Davidroid 57:fa4c622b04a7 2320
Davidroid 57:fa4c622b04a7 2321
Davidroid 57:fa4c622b04a7 2322 /* DMax one time init */
Davidroid 57:fa4c622b04a7 2323 void _DMax_OneTimeInit(VL6180XDev_t dev){
Davidroid 57:fa4c622b04a7 2324 _DMaxData(ambTuningWindowFactor_K)=DEF_AMBIENT_TUNING;
Davidroid 57:fa4c622b04a7 2325 }
Davidroid 57:fa4c622b04a7 2326
Davidroid 57:fa4c622b04a7 2327
Davidroid 57:fa4c622b04a7 2328 static uint32_t _DMax_RawValueAtRateKCps(VL6180XDev_t dev, int32_t rate){
Davidroid 57:fa4c622b04a7 2329 uint32_t snrLimit_K;
Davidroid 57:fa4c622b04a7 2330 int32_t DMaxSq;
Davidroid 57:fa4c622b04a7 2331 uint32_t RawDMax;
Davidroid 57:fa4c622b04a7 2332 DMaxFix_t retSignalAt400mm;
Davidroid 57:fa4c622b04a7 2333 uint32_t ambTuningWindowFactor_K;
Davidroid 57:fa4c622b04a7 2334
Davidroid 57:fa4c622b04a7 2335
Davidroid 57:fa4c622b04a7 2336 ambTuningWindowFactor_K = _DMaxData(ambTuningWindowFactor_K);
Davidroid 57:fa4c622b04a7 2337 snrLimit_K = _DMaxData(snrLimit_K);
Davidroid 57:fa4c622b04a7 2338 retSignalAt400mm = _DMaxData(retSignalAt400mm); /* 12 to 18 bits Kcps */
Davidroid 57:fa4c622b04a7 2339 if( rate > 0 ){
Davidroid 57:fa4c622b04a7 2340 DMaxSq = 400*400*1000 / rate -(400*400/330); /* K of (1/RtnAmb -1/330 )=> 30bit- (12-18)bit => 12-18 bits*/
Davidroid 57:fa4c622b04a7 2341 if( DMaxSq<= 0){
Davidroid 57:fa4c622b04a7 2342 RawDMax = 0;
Davidroid 57:fa4c622b04a7 2343 }
Davidroid 57:fa4c622b04a7 2344 else{
Davidroid 57:fa4c622b04a7 2345 /* value can be more 32 bit so base on raneg apply *retSignalAt400mm before or after division to presevr accuracy */
Davidroid 57:fa4c622b04a7 2346 if( DMaxSq< (2<<12) ){
Davidroid 57:fa4c622b04a7 2347 DMaxSq = DMaxSq*retSignalAt400mm/(snrLimit_K+ambTuningWindowFactor_K); /* max 12 + 12 to 18 -10 => 12-26 bit */
Davidroid 57:fa4c622b04a7 2348 }else{
Davidroid 57:fa4c622b04a7 2349 DMaxSq = DMaxSq/(snrLimit_K+ambTuningWindowFactor_K)*retSignalAt400mm; /* 12 to 18 -10 + 12 to 18 *=> 12-26 bit */
Davidroid 57:fa4c622b04a7 2350 }
Davidroid 57:fa4c622b04a7 2351 RawDMax=VL6180X_SqrtUint32(DMaxSq);
Davidroid 57:fa4c622b04a7 2352 }
Davidroid 57:fa4c622b04a7 2353 }
Davidroid 57:fa4c622b04a7 2354 else{
Davidroid 57:fa4c622b04a7 2355 RawDMax = 0x7FFFFFFF; /* bigest possibmle 32bit signed value */
Davidroid 57:fa4c622b04a7 2356 }
Davidroid 57:fa4c622b04a7 2357 return RawDMax;
Davidroid 57:fa4c622b04a7 2358 }
Davidroid 57:fa4c622b04a7 2359
Davidroid 57:fa4c622b04a7 2360 /*
Davidroid 57:fa4c622b04a7 2361 * fetch static data from register to avoid re-read
Davidroid 57:fa4c622b04a7 2362 * precompute all intermediate constant and cliipings
Davidroid 57:fa4c622b04a7 2363 *
Davidroid 57:fa4c622b04a7 2364 * to be re-used/call on changes of :
Davidroid 57:fa4c622b04a7 2365 * 0x2A
Davidroid 57:fa4c622b04a7 2366 * SYSRANGE_MAX_AMBIENT_LEVEL_MULT
Davidroid 57:fa4c622b04a7 2367 * Dev Data XtalkComRate_KCPs
Davidroid 57:fa4c622b04a7 2368 * SYSRANGE_MAX_CONVERGENCE_TIME
Davidroid 57:fa4c622b04a7 2369 * SYSRANGE_RANGE_CHECK_ENABLES mask RANGE_CHECK_RANGE_ENABLE_MASK
Davidroid 57:fa4c622b04a7 2370 * range 0xb8-0xbb (0xbb)
Davidroid 57:fa4c622b04a7 2371 */
Davidroid 57:fa4c622b04a7 2372 int VL6180X::_DMax_InitData(VL6180XDev_t dev){
Davidroid 57:fa4c622b04a7 2373 int status, warning;
Davidroid 57:fa4c622b04a7 2374 uint8_t u8;
Davidroid 57:fa4c622b04a7 2375 uint16_t u16;
Davidroid 57:fa4c622b04a7 2376 uint32_t u32;
Davidroid 57:fa4c622b04a7 2377 uint32_t Reg2A_KCps;
Davidroid 57:fa4c622b04a7 2378 uint32_t RegB8;
Davidroid 57:fa4c622b04a7 2379 uint8_t MaxConvTime;
Davidroid 57:fa4c622b04a7 2380 uint32_t XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 2381 uint32_t RangeIgnoreThreshold;
Davidroid 57:fa4c622b04a7 2382 int32_t minSignalNeeded;
Davidroid 57:fa4c622b04a7 2383 uint8_t SysRangeCheckEn;
Davidroid 57:fa4c622b04a7 2384 uint8_t snrLimit;
Davidroid 57:fa4c622b04a7 2385 warning=0;
Davidroid 57:fa4c622b04a7 2386
Davidroid 57:fa4c622b04a7 2387 static const int ROMABLE_DATA MaxConvTimeAdjust=-4;
Davidroid 57:fa4c622b04a7 2388
Davidroid 57:fa4c622b04a7 2389 LOG_FUNCTION_START("");
Davidroid 57:fa4c622b04a7 2390 do{
Davidroid 57:fa4c622b04a7 2391 status = VL6180X_RdByte(dev, 0x02A ,&u8);
Davidroid 57:fa4c622b04a7 2392 if( status ){
Davidroid 57:fa4c622b04a7 2393 VL6180X_ErrLog("Reg 0x02A rd fail");
Davidroid 57:fa4c622b04a7 2394 break;
Davidroid 57:fa4c622b04a7 2395 }
Davidroid 57:fa4c622b04a7 2396
Davidroid 57:fa4c622b04a7 2397 if( u8 == 0 ) {
Davidroid 57:fa4c622b04a7 2398 warning = CALIBRATION_WARNING;
Davidroid 57:fa4c622b04a7 2399 u8 = 40; /* use a default average value */
Davidroid 57:fa4c622b04a7 2400 }
Davidroid 57:fa4c622b04a7 2401 Reg2A_KCps = Fix7_2_KCPs(u8); /* convert to KCPs */
Davidroid 57:fa4c622b04a7 2402
Davidroid 57:fa4c622b04a7 2403 status = VL6180X_RdByte(dev, SYSRANGE_RANGE_CHECK_ENABLES, &SysRangeCheckEn);
Davidroid 57:fa4c622b04a7 2404 if (status) {
Davidroid 57:fa4c622b04a7 2405 VL6180X_ErrLog("SYSRANGE_RANGE_CHECK_ENABLES rd fail ");
Davidroid 57:fa4c622b04a7 2406 break;
Davidroid 57:fa4c622b04a7 2407 }
Davidroid 57:fa4c622b04a7 2408
Davidroid 57:fa4c622b04a7 2409 status = VL6180X_RdByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, &MaxConvTime);
Davidroid 57:fa4c622b04a7 2410 if( status){
Davidroid 57:fa4c622b04a7 2411 VL6180X_ErrLog("SYSRANGE_MAX_CONVERGENCE_TIME rd fail ");
Davidroid 57:fa4c622b04a7 2412 break;
Davidroid 57:fa4c622b04a7 2413 }
Davidroid 57:fa4c622b04a7 2414
Davidroid 57:fa4c622b04a7 2415 status = VL6180X_RdDWord(dev, 0x0B8, &RegB8);
Davidroid 57:fa4c622b04a7 2416 if( status ){
Davidroid 57:fa4c622b04a7 2417 VL6180X_ErrLog("reg 0x0B8 rd fail ");
Davidroid 57:fa4c622b04a7 2418 break;
Davidroid 57:fa4c622b04a7 2419 }
Davidroid 57:fa4c622b04a7 2420
Davidroid 57:fa4c622b04a7 2421 status = VL6180X_RdByte(dev, SYSRANGE_MAX_AMBIENT_LEVEL_MULT, &snrLimit);
Davidroid 57:fa4c622b04a7 2422 if( status){
Davidroid 57:fa4c622b04a7 2423 VL6180X_ErrLog("SYSRANGE_MAX_AMBIENT_LEVEL_MULT rd fail ");
Davidroid 57:fa4c622b04a7 2424 break;
Davidroid 57:fa4c622b04a7 2425 }
Davidroid 57:fa4c622b04a7 2426 _DMaxData(snrLimit_K) = (int32_t)16*1000/snrLimit;
Davidroid 57:fa4c622b04a7 2427 XTalkCompRate_KCps = VL6180XDevDataGet(dev, XTalkCompRate_KCps );
Davidroid 57:fa4c622b04a7 2428
Davidroid 57:fa4c622b04a7 2429 if( Reg2A_KCps >= XTalkCompRate_KCps){
Davidroid 57:fa4c622b04a7 2430 _DMaxData(retSignalAt400mm)=( Reg2A_KCps - XTalkCompRate_KCps);
Davidroid 57:fa4c622b04a7 2431 }
Davidroid 57:fa4c622b04a7 2432 else{
Davidroid 57:fa4c622b04a7 2433 _DMaxData(retSignalAt400mm)=0; /* Reg2A_K - XTalkCompRate_KCp <0 is invalid */
Davidroid 57:fa4c622b04a7 2434 }
Davidroid 57:fa4c622b04a7 2435
Davidroid 57:fa4c622b04a7 2436 /* if xtalk range check is off omit it in snr clipping */
Davidroid 57:fa4c622b04a7 2437 if( SysRangeCheckEn&RANGE_CHECK_RANGE_ENABLE_MASK ){
Davidroid 57:fa4c622b04a7 2438 status = VL6180X_RdWord(dev, SYSRANGE_RANGE_IGNORE_THRESHOLD, &u16);
Davidroid 57:fa4c622b04a7 2439 if( status){
Davidroid 57:fa4c622b04a7 2440 VL6180X_ErrLog("SYSRANGE_RANGE_IGNORE_THRESHOLD rd fail ");
Davidroid 57:fa4c622b04a7 2441 break;
Davidroid 57:fa4c622b04a7 2442 }
Davidroid 57:fa4c622b04a7 2443 RangeIgnoreThreshold = Fix7_2_KCPs(u16);
Davidroid 57:fa4c622b04a7 2444 }
Davidroid 57:fa4c622b04a7 2445 else{
Davidroid 57:fa4c622b04a7 2446 RangeIgnoreThreshold = 0;
Davidroid 57:fa4c622b04a7 2447 }
Davidroid 57:fa4c622b04a7 2448
Davidroid 57:fa4c622b04a7 2449 minSignalNeeded = (RegB8*256)/((int32_t)MaxConvTime+(int32_t)MaxConvTimeAdjust); /* KCps 8+8 bit -(1 to 6 bit) => 15-10 bit */
Davidroid 57:fa4c622b04a7 2450 /* minSignalNeeded = max ( minSignalNeeded, RangeIgnoreThreshold - XTalkCompRate_KCps) */
Davidroid 57:fa4c622b04a7 2451 if( minSignalNeeded <= RangeIgnoreThreshold - XTalkCompRate_KCps )
Davidroid 57:fa4c622b04a7 2452 minSignalNeeded = RangeIgnoreThreshold - XTalkCompRate_KCps;
Davidroid 57:fa4c622b04a7 2453
Davidroid 57:fa4c622b04a7 2454 u32 = (minSignalNeeded*(uint32_t)snrLimit)/16;
Davidroid 57:fa4c622b04a7 2455 _DMaxData(ClipSnrLimit ) = _DMax_RawValueAtRateKCps(dev, u32 ); /* clip to dmax to min signal snr limit rate*/
Davidroid 57:fa4c622b04a7 2456 }
Davidroid 57:fa4c622b04a7 2457 while(0);
Davidroid 57:fa4c622b04a7 2458 if( !status )
Davidroid 57:fa4c622b04a7 2459 status = warning;
Davidroid 57:fa4c622b04a7 2460 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 2461 return status;
Davidroid 57:fa4c622b04a7 2462 }
Davidroid 57:fa4c622b04a7 2463
Davidroid 57:fa4c622b04a7 2464 static int _DMax_Compute(VL6180XDev_t dev, VL6180X_RangeData_t *pRange){
Davidroid 57:fa4c622b04a7 2465 uint32_t rtnAmbRate;
Davidroid 57:fa4c622b04a7 2466 int32_t DMax;
Davidroid 57:fa4c622b04a7 2467 int scaling;
Davidroid 57:fa4c622b04a7 2468 uint16_t HwLimitAtScale;
Davidroid 57:fa4c622b04a7 2469 static const int ROMABLE_DATA rtnAmbLowLimit_KCps=330*1000;
Davidroid 57:fa4c622b04a7 2470
Davidroid 57:fa4c622b04a7 2471 rtnAmbRate = pRange->rtnAmbRate;
Davidroid 57:fa4c622b04a7 2472 if( rtnAmbRate < rtnAmbLowLimit_KCps ){
Davidroid 57:fa4c622b04a7 2473 DMax = _DMax_RawValueAtRateKCps( dev, rtnAmbRate);
Davidroid 57:fa4c622b04a7 2474 scaling = _GetUpscale(dev);
Davidroid 57:fa4c622b04a7 2475 HwLimitAtScale=UpperLimitLookUP[scaling - 1];
Davidroid 57:fa4c622b04a7 2476
Davidroid 57:fa4c622b04a7 2477 if( DMax > _DMaxData(ClipSnrLimit) ){
Davidroid 57:fa4c622b04a7 2478 DMax=_DMaxData(ClipSnrLimit);
Davidroid 57:fa4c622b04a7 2479 }
Davidroid 57:fa4c622b04a7 2480 if( DMax > HwLimitAtScale ){
Davidroid 57:fa4c622b04a7 2481 DMax=HwLimitAtScale;
Davidroid 57:fa4c622b04a7 2482 }
Davidroid 57:fa4c622b04a7 2483 pRange->DMax=DMax;
Davidroid 57:fa4c622b04a7 2484 }
Davidroid 57:fa4c622b04a7 2485 else{
Davidroid 57:fa4c622b04a7 2486 pRange->DMax = 0;
Davidroid 57:fa4c622b04a7 2487 }
Davidroid 57:fa4c622b04a7 2488 return 0;
Davidroid 57:fa4c622b04a7 2489 }
Davidroid 57:fa4c622b04a7 2490
Davidroid 57:fa4c622b04a7 2491 #undef _DMaxData
Davidroid 57:fa4c622b04a7 2492 #undef Fix7_2_KCPs
Davidroid 57:fa4c622b04a7 2493
Davidroid 57:fa4c622b04a7 2494 #endif /* VL6180X_HAVE_DMAX_RANGING */
Davidroid 57:fa4c622b04a7 2495
Davidroid 57:fa4c622b04a7 2496
Davidroid 57:fa4c622b04a7 2497 /******************************************************************************/
Davidroid 57:fa4c622b04a7 2498 /******************************************************************************/
Davidroid 57:fa4c622b04a7 2499
Davidroid 57:fa4c622b04a7 2500
Davidroid 57:fa4c622b04a7 2501
Davidroid 57:fa4c622b04a7 2502 /****************** Write and read functions from I2C *************************/
Davidroid 57:fa4c622b04a7 2503
Davidroid 57:fa4c622b04a7 2504 int VL6180X::VL6180X_WrByte(VL6180XDev_t dev, uint16_t index, uint8_t data)
Davidroid 57:fa4c622b04a7 2505 {
Davidroid 57:fa4c622b04a7 2506 int status;
Davidroid 57:fa4c622b04a7 2507
Davidroid 57:fa4c622b04a7 2508 status=VL6180X_I2CWrite(dev->I2cAddr, index, &data,(uint8_t)1);
Davidroid 57:fa4c622b04a7 2509 return status;
Davidroid 57:fa4c622b04a7 2510 }
Davidroid 57:fa4c622b04a7 2511
Davidroid 57:fa4c622b04a7 2512 int VL6180X::VL6180X_WrWord(VL6180XDev_t dev, uint16_t index, uint16_t data)
Davidroid 57:fa4c622b04a7 2513 {
Davidroid 57:fa4c622b04a7 2514 int status;
Davidroid 57:fa4c622b04a7 2515
Davidroid 57:fa4c622b04a7 2516 status=VL6180X_I2CWrite(dev->I2cAddr, index, (uint8_t *)&data,(uint8_t)2);
Davidroid 57:fa4c622b04a7 2517 return status;
Davidroid 57:fa4c622b04a7 2518 }
Davidroid 57:fa4c622b04a7 2519
Davidroid 57:fa4c622b04a7 2520 int VL6180X::VL6180X_WrDWord(VL6180XDev_t dev, uint16_t index, uint32_t data)
Davidroid 57:fa4c622b04a7 2521 {
Davidroid 57:fa4c622b04a7 2522 int status;
Davidroid 57:fa4c622b04a7 2523
Davidroid 57:fa4c622b04a7 2524 status=VL6180X_I2CWrite(dev->I2cAddr, index, (uint8_t *)&data,(uint8_t)4);
Davidroid 57:fa4c622b04a7 2525 return status;
Davidroid 57:fa4c622b04a7 2526 }
Davidroid 57:fa4c622b04a7 2527
Davidroid 57:fa4c622b04a7 2528 int VL6180X::VL6180X_RdByte(VL6180XDev_t dev, uint16_t index, uint8_t *data)
Davidroid 57:fa4c622b04a7 2529 {
Davidroid 57:fa4c622b04a7 2530 int status;
Davidroid 57:fa4c622b04a7 2531
Davidroid 57:fa4c622b04a7 2532 uint8_t buffer=0;
Davidroid 57:fa4c622b04a7 2533 status=VL6180X_I2CRead(dev->I2cAddr, index, &buffer,1);
Davidroid 57:fa4c622b04a7 2534 if(!status)
Davidroid 57:fa4c622b04a7 2535 {
Davidroid 57:fa4c622b04a7 2536 *data=buffer;
Davidroid 57:fa4c622b04a7 2537 }
Davidroid 57:fa4c622b04a7 2538 return status;
Davidroid 57:fa4c622b04a7 2539 }
Davidroid 57:fa4c622b04a7 2540
Davidroid 57:fa4c622b04a7 2541 int VL6180X::VL6180X_RdWord(VL6180XDev_t dev, uint16_t index, uint16_t *data)
Davidroid 57:fa4c622b04a7 2542 {
Davidroid 57:fa4c622b04a7 2543 int status;
Davidroid 57:fa4c622b04a7 2544
Davidroid 57:fa4c622b04a7 2545 uint8_t buffer[2];
Davidroid 57:fa4c622b04a7 2546 buffer[0]=buffer[1]=0;
Davidroid 57:fa4c622b04a7 2547 status=VL6180X_I2CRead(dev->I2cAddr, index, buffer, 2);
Davidroid 57:fa4c622b04a7 2548 if(!status)
Davidroid 57:fa4c622b04a7 2549 {
Davidroid 57:fa4c622b04a7 2550 memcpy(data, buffer, 2);
Davidroid 57:fa4c622b04a7 2551 }
Davidroid 57:fa4c622b04a7 2552 return status;
Davidroid 57:fa4c622b04a7 2553 }
Davidroid 57:fa4c622b04a7 2554
Davidroid 57:fa4c622b04a7 2555 int VL6180X::VL6180X_RdDWord(VL6180XDev_t dev, uint16_t index, uint32_t *data)
Davidroid 57:fa4c622b04a7 2556 {
Davidroid 57:fa4c622b04a7 2557 int status;
Davidroid 57:fa4c622b04a7 2558 uint8_t buffer[4];
Davidroid 57:fa4c622b04a7 2559 buffer[0]=buffer[1]=buffer[2]=buffer[3]=0;
Davidroid 57:fa4c622b04a7 2560 status=VL6180X_I2CRead(dev->I2cAddr, index, buffer,4);
Davidroid 57:fa4c622b04a7 2561 if(!status)
Davidroid 57:fa4c622b04a7 2562 {
Davidroid 57:fa4c622b04a7 2563 memcpy(data, buffer, 4);
Davidroid 57:fa4c622b04a7 2564 }
Davidroid 57:fa4c622b04a7 2565 return status;
Davidroid 57:fa4c622b04a7 2566 }
Davidroid 57:fa4c622b04a7 2567
Davidroid 57:fa4c622b04a7 2568 int VL6180X::VL6180X_UpdateByte(VL6180XDev_t dev, uint16_t index, uint8_t AndData, uint8_t OrData)
Davidroid 57:fa4c622b04a7 2569 {
Davidroid 57:fa4c622b04a7 2570 int status;
Davidroid 57:fa4c622b04a7 2571 uint8_t buffer=0;
Davidroid 57:fa4c622b04a7 2572
Davidroid 57:fa4c622b04a7 2573 status=VL6180X_I2CWrite(dev->I2cAddr, index, (uint8_t *)&buffer,(uint8_t)0);
Davidroid 57:fa4c622b04a7 2574 if(!status)
Davidroid 57:fa4c622b04a7 2575 {
Davidroid 57:fa4c622b04a7 2576 /* read data direct onto buffer */
Davidroid 57:fa4c622b04a7 2577 status=VL6180X_I2CRead(dev->I2cAddr, index, &buffer,1);
Davidroid 57:fa4c622b04a7 2578 if(!status)
Davidroid 57:fa4c622b04a7 2579 {
Davidroid 57:fa4c622b04a7 2580 buffer=(buffer & AndData)|OrData;
Davidroid 57:fa4c622b04a7 2581 status=VL6180X_I2CWrite(dev->I2cAddr, index, &buffer, (uint8_t)1);
Davidroid 57:fa4c622b04a7 2582 }
Davidroid 57:fa4c622b04a7 2583 }
Davidroid 57:fa4c622b04a7 2584 return status;
Davidroid 57:fa4c622b04a7 2585 }
Davidroid 57:fa4c622b04a7 2586
Davidroid 57:fa4c622b04a7 2587 int VL6180X::VL6180X_I2CWrite(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t* pBuffer, uint16_t NumByteToWrite)
Davidroid 57:fa4c622b04a7 2588 {
Davidroid 57:fa4c622b04a7 2589 int ret;
Davidroid 57:fa4c622b04a7 2590 int i;
Davidroid 57:fa4c622b04a7 2591 uint8_t tmp[TEMP_BUF_SIZE];
Davidroid 57:fa4c622b04a7 2592 uint16_t myRegisterAddr = RegisterAddr;
Davidroid 57:fa4c622b04a7 2593 uint16_t WriteDeviceAddr=0;
Davidroid 57:fa4c622b04a7 2594
Davidroid 57:fa4c622b04a7 2595 /* First, prepare 8 bits device address in 7bits i2ci format */
Davidroid 57:fa4c622b04a7 2596 WriteDeviceAddr=DeviceAddr*2;
Davidroid 57:fa4c622b04a7 2597 if(NumByteToWrite >= TEMP_BUF_SIZE) return -2;
Davidroid 57:fa4c622b04a7 2598
Davidroid 57:fa4c622b04a7 2599 /* then prepare 16 bits register address in BE format. Then, send data and STOP condition */
Davidroid 57:fa4c622b04a7 2600 tmp[0] = *(((uint8_t*)&myRegisterAddr)+1);
Davidroid 57:fa4c622b04a7 2601 tmp[1] = (uint8_t)RegisterAddr;
Davidroid 57:fa4c622b04a7 2602
Davidroid 57:fa4c622b04a7 2603 if(NumByteToWrite>1) /* swap data endianess */
Davidroid 57:fa4c622b04a7 2604 {
Davidroid 57:fa4c622b04a7 2605 for(i=0;i<NumByteToWrite;i++)
Davidroid 57:fa4c622b04a7 2606 {
Davidroid 57:fa4c622b04a7 2607 tmp[NumByteToWrite+sizeof(RegisterAddr)-1-i]=pBuffer[i];
Davidroid 57:fa4c622b04a7 2608 }
Davidroid 57:fa4c622b04a7 2609 }
Davidroid 57:fa4c622b04a7 2610 else
Davidroid 57:fa4c622b04a7 2611 {
Davidroid 57:fa4c622b04a7 2612 memcpy(tmp+sizeof(RegisterAddr), pBuffer, NumByteToWrite);
Davidroid 57:fa4c622b04a7 2613 }
nikapov 58:1e9a3a46f814 2614 ret = _dev_i2c->write(WriteDeviceAddr, (const char*)tmp, NumByteToWrite+sizeof(RegisterAddr), false);
Davidroid 57:fa4c622b04a7 2615
Davidroid 57:fa4c622b04a7 2616 if(ret)
Davidroid 57:fa4c622b04a7 2617 return -1;
Davidroid 57:fa4c622b04a7 2618 return 0;
Davidroid 57:fa4c622b04a7 2619 }
Davidroid 57:fa4c622b04a7 2620
Davidroid 57:fa4c622b04a7 2621 int VL6180X::VL6180X_I2CRead(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t* pBuffer, uint16_t NumByteToRead)
Davidroid 57:fa4c622b04a7 2622 {
Davidroid 57:fa4c622b04a7 2623 int ret,i;
Davidroid 57:fa4c622b04a7 2624 uint8_t tmp[TEMP_BUF_SIZE];
Davidroid 57:fa4c622b04a7 2625 uint16_t myRegisterAddr = RegisterAddr;
Davidroid 57:fa4c622b04a7 2626 uint16_t myRegisterAddrBE;
Davidroid 57:fa4c622b04a7 2627 uint16_t ReadDeviceAddr=DeviceAddr;
Davidroid 57:fa4c622b04a7 2628
Davidroid 57:fa4c622b04a7 2629 ReadDeviceAddr=DeviceAddr*2;
Davidroid 57:fa4c622b04a7 2630 myRegisterAddrBE = *(((uint8_t*)&myRegisterAddr)+1);
Davidroid 57:fa4c622b04a7 2631 *(((uint8_t*)&myRegisterAddrBE)+1) = (uint8_t)myRegisterAddr;
Davidroid 57:fa4c622b04a7 2632
Davidroid 57:fa4c622b04a7 2633 /* Send 8 bits device address and 16 bits register address in BE format, with no STOP condition */
nikapov 58:1e9a3a46f814 2634 ret = _dev_i2c->write(ReadDeviceAddr, (const char*)&myRegisterAddrBE, sizeof(RegisterAddr), true);
Davidroid 57:fa4c622b04a7 2635 if(!ret)
Davidroid 57:fa4c622b04a7 2636 {
Davidroid 57:fa4c622b04a7 2637 ReadDeviceAddr|=0x001;
Davidroid 57:fa4c622b04a7 2638 /* Read data, with STOP condition */
nikapov 58:1e9a3a46f814 2639 ret = _dev_i2c->read(ReadDeviceAddr, (char*)tmp, NumByteToRead, false);
Davidroid 57:fa4c622b04a7 2640 }
Davidroid 57:fa4c622b04a7 2641 if(ret)
Davidroid 57:fa4c622b04a7 2642 return -1;
Davidroid 57:fa4c622b04a7 2643
Davidroid 57:fa4c622b04a7 2644 if(NumByteToRead>1) /* swap data endianess */
Davidroid 57:fa4c622b04a7 2645 {
Davidroid 57:fa4c622b04a7 2646 for(i=0;i<NumByteToRead;i++)
Davidroid 57:fa4c622b04a7 2647 {
Davidroid 57:fa4c622b04a7 2648 pBuffer[i] = tmp[NumByteToRead-1-i];
Davidroid 57:fa4c622b04a7 2649 }
Davidroid 57:fa4c622b04a7 2650 }
Davidroid 57:fa4c622b04a7 2651 else
Davidroid 57:fa4c622b04a7 2652 {
Davidroid 57:fa4c622b04a7 2653 memcpy(pBuffer, tmp, NumByteToRead);
Davidroid 57:fa4c622b04a7 2654 }
Davidroid 57:fa4c622b04a7 2655 return 0;
Davidroid 57:fa4c622b04a7 2656 }
Davidroid 57:fa4c622b04a7 2657
Davidroid 57:fa4c622b04a7 2658 /******************************************************************************/
Davidroid 57:fa4c622b04a7 2659
Davidroid 57:fa4c622b04a7 2660 int VL6180X::als_set_thresholds(uint16_t lux_threshold_low, uint16_t lux_threshold_high)
Davidroid 57:fa4c622b04a7 2661 {
Davidroid 57:fa4c622b04a7 2662 uint32_t AlsAnGain, IntPeriod, AlsScaler, GainFix, RawAlsHigh, RawAlsLow;
Davidroid 57:fa4c622b04a7 2663 uint16_t RawThreshLow, RawThreshHigh;
Davidroid 57:fa4c622b04a7 2664 const uint32_t LuxResxIntIme =(uint32_t)(0.56f* DEF_INT_PEFRIOD *(1<<LUXRES_FIX_PREC));
Davidroid 57:fa4c622b04a7 2665 void *p_low;
Davidroid 57:fa4c622b04a7 2666 void *p_high;
Davidroid 57:fa4c622b04a7 2667
Davidroid 57:fa4c622b04a7 2668 AlsAnGain=VL6180XDevDataGet(_device, AlsGainCode);
Davidroid 57:fa4c622b04a7 2669 IntPeriod=VL6180XDevDataGet(_device, IntegrationPeriod);
Davidroid 57:fa4c622b04a7 2670 AlsScaler=VL6180XDevDataGet(_device, AlsScaler);
Davidroid 57:fa4c622b04a7 2671 GainFix=AlsGainLookUp[AlsAnGain];
Davidroid 57:fa4c622b04a7 2672 IntPeriod++;
Davidroid 57:fa4c622b04a7 2673 RawAlsLow=lux_threshold_low*AlsScaler*GainFix;
Davidroid 57:fa4c622b04a7 2674 RawAlsLow=RawAlsLow*IntPeriod;
Davidroid 57:fa4c622b04a7 2675 RawAlsLow=RawAlsLow/LuxResxIntIme;
Davidroid 57:fa4c622b04a7 2676 RawAlsHigh=lux_threshold_high*(AlsScaler*GainFix);
Davidroid 57:fa4c622b04a7 2677 RawAlsHigh=RawAlsHigh*IntPeriod;
Davidroid 57:fa4c622b04a7 2678 RawAlsHigh=RawAlsHigh/LuxResxIntIme;
Davidroid 57:fa4c622b04a7 2679 p_low=&RawAlsLow;
Davidroid 57:fa4c622b04a7 2680 RawThreshLow=*(uint16_t*)p_low;
Davidroid 57:fa4c622b04a7 2681 p_high=&RawAlsHigh;
Davidroid 57:fa4c622b04a7 2682 RawThreshHigh=*(uint16_t*)p_high;
Davidroid 57:fa4c622b04a7 2683 return VL6180X_AlsSetThresholds(_device, RawThreshLow, RawThreshHigh);
Davidroid 57:fa4c622b04a7 2684 }
Davidroid 57:fa4c622b04a7 2685
Davidroid 57:fa4c622b04a7 2686 int VL6180X::read_id(uint8_t *id)
Davidroid 57:fa4c622b04a7 2687 {
Davidroid 57:fa4c622b04a7 2688 return VL6180X_RdByte(_device, IDENTIFICATION_MODEL_ID, id);
Davidroid 57:fa4c622b04a7 2689 }
Davidroid 57:fa4c622b04a7 2690
Davidroid 57:fa4c622b04a7 2691
Davidroid 57:fa4c622b04a7 2692 int VL6180X::start_measurement(operating_mode_t operating_mode, void (*fptr)(void), uint16_t low, uint16_t high)
Davidroid 57:fa4c622b04a7 2693 {
Davidroid 57:fa4c622b04a7 2694 int status, r_status, l_status;
Davidroid 57:fa4c622b04a7 2695
Davidroid 57:fa4c622b04a7 2696 switch (operating_mode) {
Davidroid 57:fa4c622b04a7 2697 case(range_single_shot_polling):
Davidroid 57:fa4c622b04a7 2698 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
Davidroid 57:fa4c622b04a7 2699 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2700 disable_gpio_x_out(1);
Davidroid 57:fa4c622b04a7 2701 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2702 return RangeMeasPollSingleShot();
Davidroid 57:fa4c622b04a7 2703 else
Davidroid 57:fa4c622b04a7 2704 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2705
Davidroid 57:fa4c622b04a7 2706 case(als_single_shot_polling):
Davidroid 57:fa4c622b04a7 2707 r_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
Davidroid 57:fa4c622b04a7 2708 l_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2709 disable_gpio_x_out(1);
Davidroid 57:fa4c622b04a7 2710 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2711 return AlsMeasPollSingleShot();
Davidroid 57:fa4c622b04a7 2712 else
Davidroid 57:fa4c622b04a7 2713 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2714
Davidroid 57:fa4c622b04a7 2715 case(range_continuous_polling):
Davidroid 57:fa4c622b04a7 2716 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
Davidroid 57:fa4c622b04a7 2717 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2718 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2719 return RangeMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 2720 else
Davidroid 57:fa4c622b04a7 2721 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2722
Davidroid 57:fa4c622b04a7 2723 case(als_continuous_polling):
Davidroid 57:fa4c622b04a7 2724 r_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
Davidroid 57:fa4c622b04a7 2725 l_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2726 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2727 return AlsMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 2728 else
Davidroid 57:fa4c622b04a7 2729 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2730
Davidroid 57:fa4c622b04a7 2731 case(range_continuous_interrupt):
Davidroid 57:fa4c622b04a7 2732 if (_gpio1Int==NULL) return 1;
Davidroid 57:fa4c622b04a7 2733 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
Davidroid 57:fa4c622b04a7 2734 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2735 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2736 return RangeMeasIntContinuousMode(fptr);
Davidroid 57:fa4c622b04a7 2737 else
Davidroid 57:fa4c622b04a7 2738 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2739
Davidroid 57:fa4c622b04a7 2740 case(als_continuous_interrupt):
Davidroid 57:fa4c622b04a7 2741 if (_gpio1Int==NULL) return 1;
Davidroid 57:fa4c622b04a7 2742 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
Davidroid 57:fa4c622b04a7 2743 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2744 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2745 return AlsMeasIntContinuousMode(fptr);
Davidroid 57:fa4c622b04a7 2746 else
Davidroid 57:fa4c622b04a7 2747 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2748
Davidroid 57:fa4c622b04a7 2749 case(interleaved_mode_interrupt):
Davidroid 57:fa4c622b04a7 2750 if (_gpio1Int==NULL) return 1;
Davidroid 57:fa4c622b04a7 2751 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_NEW_SAMPLE_READY);
Davidroid 57:fa4c622b04a7 2752 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2753 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2754 return InterleavedMode(fptr);
Davidroid 57:fa4c622b04a7 2755 else
Davidroid 57:fa4c622b04a7 2756 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2757
Davidroid 57:fa4c622b04a7 2758 case(range_continuous_polling_low_threshold):
Davidroid 57:fa4c622b04a7 2759 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW);
Davidroid 57:fa4c622b04a7 2760 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2761 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2762 {
Davidroid 57:fa4c622b04a7 2763 status=RangeSetLowThreshold(low);
Davidroid 57:fa4c622b04a7 2764 if(!status)
Davidroid 57:fa4c622b04a7 2765 return RangeMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 2766 else
Davidroid 57:fa4c622b04a7 2767 return status;
Davidroid 57:fa4c622b04a7 2768 }
Davidroid 57:fa4c622b04a7 2769 else
Davidroid 57:fa4c622b04a7 2770 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2771
Davidroid 57:fa4c622b04a7 2772 case(range_continuous_polling_high_threshold):
Davidroid 57:fa4c622b04a7 2773 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH);
Davidroid 57:fa4c622b04a7 2774 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2775 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2776 {
Davidroid 57:fa4c622b04a7 2777 status=RangeSetHighThreshold(high);
Davidroid 57:fa4c622b04a7 2778 if(!status)
Davidroid 57:fa4c622b04a7 2779 return RangeMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 2780 else
Davidroid 57:fa4c622b04a7 2781 return status;
Davidroid 57:fa4c622b04a7 2782 }
Davidroid 57:fa4c622b04a7 2783 else
Davidroid 57:fa4c622b04a7 2784 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2785
Davidroid 57:fa4c622b04a7 2786 case(range_continuous_polling_out_of_window):
Davidroid 57:fa4c622b04a7 2787 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW);
Davidroid 57:fa4c622b04a7 2788 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2789 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2790 {
Davidroid 57:fa4c622b04a7 2791 status=VL6180X_RangeSetThresholds(_device,low,high,1);
Davidroid 57:fa4c622b04a7 2792 if(!status)
Davidroid 57:fa4c622b04a7 2793 return RangeMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 2794 else
Davidroid 57:fa4c622b04a7 2795 return status;
Davidroid 57:fa4c622b04a7 2796 }
Davidroid 57:fa4c622b04a7 2797 else
Davidroid 57:fa4c622b04a7 2798 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2799
Davidroid 57:fa4c622b04a7 2800 case(als_continuous_polling_low_threshold):
Davidroid 57:fa4c622b04a7 2801 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW);
Davidroid 57:fa4c622b04a7 2802 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2803 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2804 {
Davidroid 57:fa4c622b04a7 2805 status=AlsSetLowThreshold(low);
Davidroid 57:fa4c622b04a7 2806 if(!status)
Davidroid 57:fa4c622b04a7 2807 return AlsMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 2808 else
Davidroid 57:fa4c622b04a7 2809 return status;
Davidroid 57:fa4c622b04a7 2810 }
Davidroid 57:fa4c622b04a7 2811 else
Davidroid 57:fa4c622b04a7 2812 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2813
Davidroid 57:fa4c622b04a7 2814 case(als_continuous_polling_high_threshold):
Davidroid 57:fa4c622b04a7 2815 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH);
Davidroid 57:fa4c622b04a7 2816 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2817 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2818 {
Davidroid 57:fa4c622b04a7 2819 status=AlsSetHighThreshold(high);
Davidroid 57:fa4c622b04a7 2820 if(!status)
Davidroid 57:fa4c622b04a7 2821 return AlsMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 2822 else
Davidroid 57:fa4c622b04a7 2823 return status;
Davidroid 57:fa4c622b04a7 2824 }
Davidroid 57:fa4c622b04a7 2825 else
Davidroid 57:fa4c622b04a7 2826 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2827
Davidroid 57:fa4c622b04a7 2828 case(als_continuous_polling_out_of_window):
Davidroid 57:fa4c622b04a7 2829 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW);
Davidroid 57:fa4c622b04a7 2830 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2831 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2832 {
Davidroid 57:fa4c622b04a7 2833 status=VL6180X_AlsSetThresholds(_device,low,high);
Davidroid 57:fa4c622b04a7 2834 if(!status)
Davidroid 57:fa4c622b04a7 2835 return AlsMeasPollContinuousMode();
Davidroid 57:fa4c622b04a7 2836 else
Davidroid 57:fa4c622b04a7 2837 return status;
Davidroid 57:fa4c622b04a7 2838 }
Davidroid 57:fa4c622b04a7 2839 else
Davidroid 57:fa4c622b04a7 2840 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2841
Davidroid 57:fa4c622b04a7 2842 case(range_continuous_interrupt_low_threshold):
Davidroid 57:fa4c622b04a7 2843 if (_gpio1Int==NULL) return 1;
Davidroid 57:fa4c622b04a7 2844 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW);
Davidroid 57:fa4c622b04a7 2845 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2846 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2847 {
Davidroid 57:fa4c622b04a7 2848 status=RangeSetLowThreshold(low);
Davidroid 57:fa4c622b04a7 2849 if(!status)
Davidroid 57:fa4c622b04a7 2850 return RangeMeasIntContinuousMode(fptr);
Davidroid 57:fa4c622b04a7 2851 else
Davidroid 57:fa4c622b04a7 2852 return status;
Davidroid 57:fa4c622b04a7 2853 }
Davidroid 57:fa4c622b04a7 2854 else
Davidroid 57:fa4c622b04a7 2855 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2856
Davidroid 57:fa4c622b04a7 2857 case(range_continuous_interrupt_high_threshold):
Davidroid 57:fa4c622b04a7 2858 if (_gpio1Int==NULL) return 1;
Davidroid 57:fa4c622b04a7 2859 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH);
Davidroid 57:fa4c622b04a7 2860 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2861 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2862 {
Davidroid 57:fa4c622b04a7 2863 status=RangeSetHighThreshold(high);
Davidroid 57:fa4c622b04a7 2864 if(!status)
Davidroid 57:fa4c622b04a7 2865 return RangeMeasIntContinuousMode(fptr);
Davidroid 57:fa4c622b04a7 2866 else
Davidroid 57:fa4c622b04a7 2867 return status;
Davidroid 57:fa4c622b04a7 2868 }
Davidroid 57:fa4c622b04a7 2869 else
Davidroid 57:fa4c622b04a7 2870 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2871
Davidroid 57:fa4c622b04a7 2872 case(range_continuous_interrupt_out_of_window):
Davidroid 57:fa4c622b04a7 2873 if (_gpio1Int==NULL) return 1;
Davidroid 57:fa4c622b04a7 2874 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW);
Davidroid 57:fa4c622b04a7 2875 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2876 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2877 {
Davidroid 57:fa4c622b04a7 2878 status=VL6180X_RangeSetThresholds(_device,low,high,1);
Davidroid 57:fa4c622b04a7 2879 if(!status)
Davidroid 57:fa4c622b04a7 2880 return RangeMeasIntContinuousMode(fptr);
Davidroid 57:fa4c622b04a7 2881 else
Davidroid 57:fa4c622b04a7 2882 return status;
Davidroid 57:fa4c622b04a7 2883 }
Davidroid 57:fa4c622b04a7 2884 else
Davidroid 57:fa4c622b04a7 2885 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2886
Davidroid 57:fa4c622b04a7 2887 case(als_continuous_interrupt_low_threshold):
Davidroid 57:fa4c622b04a7 2888 if (_gpio1Int==NULL) return 1;
Davidroid 57:fa4c622b04a7 2889 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_LEVEL_LOW);
Davidroid 57:fa4c622b04a7 2890 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2891 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2892 {
Davidroid 57:fa4c622b04a7 2893 status=AlsSetLowThreshold(low);
Davidroid 57:fa4c622b04a7 2894 if(!status)
Davidroid 57:fa4c622b04a7 2895 return AlsMeasIntContinuousMode(fptr);
Davidroid 57:fa4c622b04a7 2896 else
Davidroid 57:fa4c622b04a7 2897 return status;
Davidroid 57:fa4c622b04a7 2898 }
Davidroid 57:fa4c622b04a7 2899 else
Davidroid 57:fa4c622b04a7 2900 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2901
Davidroid 57:fa4c622b04a7 2902 case(als_continuous_interrupt_high_threshold):
Davidroid 57:fa4c622b04a7 2903 if (_gpio1Int==NULL) return 1;
Davidroid 57:fa4c622b04a7 2904 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_LEVEL_HIGH);
Davidroid 57:fa4c622b04a7 2905 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2906 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2907 {
Davidroid 57:fa4c622b04a7 2908 status=AlsSetHighThreshold(high);
Davidroid 57:fa4c622b04a7 2909 if(!status)
Davidroid 57:fa4c622b04a7 2910 return AlsMeasIntContinuousMode(fptr);
Davidroid 57:fa4c622b04a7 2911 else
Davidroid 57:fa4c622b04a7 2912 return status;
Davidroid 57:fa4c622b04a7 2913 }
Davidroid 57:fa4c622b04a7 2914 else
Davidroid 57:fa4c622b04a7 2915 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2916
Davidroid 57:fa4c622b04a7 2917 case(als_continuous_interrupt_out_of_window):
Davidroid 57:fa4c622b04a7 2918 if (_gpio1Int==NULL) return 1;
Davidroid 57:fa4c622b04a7 2919 l_status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_OUT_OF_WINDOW);
Davidroid 57:fa4c622b04a7 2920 r_status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 2921 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 2922 {
Davidroid 57:fa4c622b04a7 2923 status=VL6180X_AlsSetThresholds(_device,low,high);
Davidroid 57:fa4c622b04a7 2924 if(!status)
Davidroid 57:fa4c622b04a7 2925 return AlsMeasIntContinuousMode(fptr);
Davidroid 57:fa4c622b04a7 2926 else
Davidroid 57:fa4c622b04a7 2927 return status;
Davidroid 57:fa4c622b04a7 2928 }
Davidroid 57:fa4c622b04a7 2929 else
Davidroid 57:fa4c622b04a7 2930 return (r_status|l_status);
Davidroid 57:fa4c622b04a7 2931
Davidroid 57:fa4c622b04a7 2932 default:
Davidroid 57:fa4c622b04a7 2933 return INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 2934 }
Davidroid 57:fa4c622b04a7 2935 }
Davidroid 57:fa4c622b04a7 2936
Davidroid 57:fa4c622b04a7 2937 int VL6180X::GetRangeError(measure_data_t *Data, VL6180X_RangeData_t RangeData)
Davidroid 57:fa4c622b04a7 2938 {
Davidroid 57:fa4c622b04a7 2939 Data->range_error=RangeData.errorStatus;
Davidroid 57:fa4c622b04a7 2940 if(Data->range_error!=0)
Davidroid 57:fa4c622b04a7 2941 {
Davidroid 57:fa4c622b04a7 2942 VL6180X_ErrLog("Range error %d",Data->range_error);
Davidroid 57:fa4c622b04a7 2943 return RANGE_ERROR;
Davidroid 57:fa4c622b04a7 2944 }
Davidroid 57:fa4c622b04a7 2945 return NoError_;
Davidroid 57:fa4c622b04a7 2946 }
Davidroid 57:fa4c622b04a7 2947
Davidroid 57:fa4c622b04a7 2948 int VL6180X::GetAlsError(measure_data_t *Data, VL6180X_AlsData_t AlsData)
Davidroid 57:fa4c622b04a7 2949 {
Davidroid 57:fa4c622b04a7 2950 Data->als_error=AlsData.errorStatus;
Davidroid 57:fa4c622b04a7 2951 if(Data->als_error!=0)
Davidroid 57:fa4c622b04a7 2952 {
Davidroid 57:fa4c622b04a7 2953 VL6180X_ErrLog("Light error %d",Data->light_error);
Davidroid 57:fa4c622b04a7 2954 return API_ERROR;
Davidroid 57:fa4c622b04a7 2955 }
Davidroid 57:fa4c622b04a7 2956 return NoError_;
Davidroid 57:fa4c622b04a7 2957 }
Davidroid 57:fa4c622b04a7 2958
Davidroid 57:fa4c622b04a7 2959 int VL6180X::RangeMeasPollSingleShot()
Davidroid 57:fa4c622b04a7 2960 {
Davidroid 57:fa4c622b04a7 2961 int status;
Davidroid 57:fa4c622b04a7 2962
Davidroid 57:fa4c622b04a7 2963 status=VL6180X_RangeClearInterrupt(_device);
Davidroid 57:fa4c622b04a7 2964 if(status)
Davidroid 57:fa4c622b04a7 2965 {
Davidroid 57:fa4c622b04a7 2966 VL6180X_ErrLog("VL6180X_RangeClearInterrupt fail");
Davidroid 57:fa4c622b04a7 2967 return status;
Davidroid 57:fa4c622b04a7 2968 }
Davidroid 57:fa4c622b04a7 2969 status=VL6180X_ClearErrorInterrupt(_device);
Davidroid 57:fa4c622b04a7 2970 if(status)
Davidroid 57:fa4c622b04a7 2971 {
Davidroid 57:fa4c622b04a7 2972 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 2973 return status;
Davidroid 57:fa4c622b04a7 2974 }
Davidroid 57:fa4c622b04a7 2975 return range_start_single_shot();
Davidroid 57:fa4c622b04a7 2976 }
Davidroid 57:fa4c622b04a7 2977
Davidroid 57:fa4c622b04a7 2978
Davidroid 57:fa4c622b04a7 2979 int VL6180X::AlsMeasPollSingleShot()
Davidroid 57:fa4c622b04a7 2980 {
Davidroid 57:fa4c622b04a7 2981 int status;
Davidroid 57:fa4c622b04a7 2982
Davidroid 57:fa4c622b04a7 2983 status=VL6180X_AlsClearInterrupt(_device);
Davidroid 57:fa4c622b04a7 2984 if(status)
Davidroid 57:fa4c622b04a7 2985 {
Davidroid 57:fa4c622b04a7 2986 VL6180X_ErrLog("VL6180X_AlsClearInterrupt fail");
Davidroid 57:fa4c622b04a7 2987 return status;
Davidroid 57:fa4c622b04a7 2988 }
Davidroid 57:fa4c622b04a7 2989 status=VL6180X_ClearErrorInterrupt(_device);
Davidroid 57:fa4c622b04a7 2990 if(status)
Davidroid 57:fa4c622b04a7 2991 {
Davidroid 57:fa4c622b04a7 2992 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 2993 return status;
Davidroid 57:fa4c622b04a7 2994 }
Davidroid 57:fa4c622b04a7 2995 return als_start_single_shot();
Davidroid 57:fa4c622b04a7 2996 }
Davidroid 57:fa4c622b04a7 2997
Davidroid 57:fa4c622b04a7 2998
Davidroid 57:fa4c622b04a7 2999 int VL6180X::RangeMeasPollContinuousMode()
Davidroid 57:fa4c622b04a7 3000 {
Davidroid 57:fa4c622b04a7 3001 int status;
Davidroid 57:fa4c622b04a7 3002
Davidroid 57:fa4c622b04a7 3003 status=VL6180X_RangeClearInterrupt(_device);
Davidroid 57:fa4c622b04a7 3004 if(status)
Davidroid 57:fa4c622b04a7 3005 {
Davidroid 57:fa4c622b04a7 3006 VL6180X_ErrLog("VL6180X_RangeClearInterrupt fail");
Davidroid 57:fa4c622b04a7 3007 return status;
Davidroid 57:fa4c622b04a7 3008 }
Davidroid 57:fa4c622b04a7 3009 status=VL6180X_ClearErrorInterrupt(_device);
Davidroid 57:fa4c622b04a7 3010 if(status)
Davidroid 57:fa4c622b04a7 3011 {
Davidroid 57:fa4c622b04a7 3012 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 3013 return status;
Davidroid 57:fa4c622b04a7 3014 }
Davidroid 57:fa4c622b04a7 3015 return range_start_continuous_mode();
Davidroid 57:fa4c622b04a7 3016 }
Davidroid 57:fa4c622b04a7 3017
Davidroid 57:fa4c622b04a7 3018
Davidroid 57:fa4c622b04a7 3019 int VL6180X::AlsMeasPollContinuousMode()
Davidroid 57:fa4c622b04a7 3020 {
Davidroid 57:fa4c622b04a7 3021 int status;
Davidroid 57:fa4c622b04a7 3022
Davidroid 57:fa4c622b04a7 3023 status=VL6180X_AlsClearInterrupt(_device);
Davidroid 57:fa4c622b04a7 3024 if(status)
Davidroid 57:fa4c622b04a7 3025 {
Davidroid 57:fa4c622b04a7 3026 VL6180X_ErrLog("VL6180X_AlsClearInterrupt fail");
Davidroid 57:fa4c622b04a7 3027 return status;
Davidroid 57:fa4c622b04a7 3028 }
Davidroid 57:fa4c622b04a7 3029 status=VL6180X_ClearErrorInterrupt(_device);
Davidroid 57:fa4c622b04a7 3030 if(status)
Davidroid 57:fa4c622b04a7 3031 {
Davidroid 57:fa4c622b04a7 3032 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 3033 return status;
Davidroid 57:fa4c622b04a7 3034 }
Davidroid 57:fa4c622b04a7 3035 return als_start_continuous_mode();
Davidroid 57:fa4c622b04a7 3036 }
Davidroid 57:fa4c622b04a7 3037
Davidroid 57:fa4c622b04a7 3038
Davidroid 57:fa4c622b04a7 3039 int VL6180X::AlsGetMeasurementIfReady(VL6180XDev_t dev, VL6180X_AlsData_t *pAlsData)
Davidroid 57:fa4c622b04a7 3040 {
Davidroid 57:fa4c622b04a7 3041 int status;
Davidroid 57:fa4c622b04a7 3042 uint8_t IntStatus;
Davidroid 57:fa4c622b04a7 3043
Davidroid 57:fa4c622b04a7 3044 status=VL6180X_AlsGetInterruptStatus(dev, &IntStatus);
Davidroid 57:fa4c622b04a7 3045 if(!status)
Davidroid 57:fa4c622b04a7 3046 {
Davidroid 57:fa4c622b04a7 3047 if(IntStatus==RES_INT_STAT_GPIO_NEW_SAMPLE_READY)
Davidroid 57:fa4c622b04a7 3048 {
Davidroid 57:fa4c622b04a7 3049 status = VL6180X_AlsGetMeasurement(dev, pAlsData);
Davidroid 57:fa4c622b04a7 3050 if(!status)
Davidroid 57:fa4c622b04a7 3051 {
Davidroid 57:fa4c622b04a7 3052 status=VL6180X_AlsClearInterrupt(_device);
Davidroid 57:fa4c622b04a7 3053 if(status)
Davidroid 57:fa4c622b04a7 3054 VL6180X_ErrLog("VL6180X_AlsClearInterrupt fail");
Davidroid 57:fa4c622b04a7 3055 }
Davidroid 57:fa4c622b04a7 3056 }
Davidroid 57:fa4c622b04a7 3057 else
Davidroid 57:fa4c622b04a7 3058 status=NOT_READY;
Davidroid 57:fa4c622b04a7 3059 }
Davidroid 57:fa4c622b04a7 3060 else
Davidroid 57:fa4c622b04a7 3061 VL6180X_ErrLog("Failed to get interrupt status");
Davidroid 57:fa4c622b04a7 3062 return status;
Davidroid 57:fa4c622b04a7 3063 }
Davidroid 57:fa4c622b04a7 3064
Davidroid 57:fa4c622b04a7 3065
Davidroid 57:fa4c622b04a7 3066 int VL6180X::RangeMeasIntContinuousMode(void (*fptr)(void))
Davidroid 57:fa4c622b04a7 3067 {
Davidroid 57:fa4c622b04a7 3068 int status, ClrStatus;
Davidroid 57:fa4c622b04a7 3069
Davidroid 57:fa4c622b04a7 3070 enable_interrupt_measure_detection_irq();
Davidroid 57:fa4c622b04a7 3071 attach_interrupt_measure_detection_irq(fptr);
Davidroid 57:fa4c622b04a7 3072 status=setup_gpio_1(GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT, 1);
Davidroid 57:fa4c622b04a7 3073 ClrStatus=VL6180X_ClearAllInterrupt(_device);
Davidroid 57:fa4c622b04a7 3074 if(ClrStatus)
Davidroid 57:fa4c622b04a7 3075 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 3076 if(!status)
Davidroid 57:fa4c622b04a7 3077 status=range_start_continuous_mode();
Davidroid 57:fa4c622b04a7 3078 return status;
Davidroid 57:fa4c622b04a7 3079 }
Davidroid 57:fa4c622b04a7 3080
Davidroid 57:fa4c622b04a7 3081
Davidroid 57:fa4c622b04a7 3082 int VL6180X::AlsMeasIntContinuousMode(void (*fptr)(void))
Davidroid 57:fa4c622b04a7 3083 {
Davidroid 57:fa4c622b04a7 3084 int status, ClrStatus;
Davidroid 57:fa4c622b04a7 3085
Davidroid 57:fa4c622b04a7 3086 enable_interrupt_measure_detection_irq();
Davidroid 57:fa4c622b04a7 3087 attach_interrupt_measure_detection_irq(fptr);
Davidroid 57:fa4c622b04a7 3088 status=setup_gpio_1(GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT, 1);
Davidroid 57:fa4c622b04a7 3089 ClrStatus=VL6180X_ClearAllInterrupt(_device);
Davidroid 57:fa4c622b04a7 3090 if(ClrStatus)
Davidroid 57:fa4c622b04a7 3091 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 3092 if(!status)
Davidroid 57:fa4c622b04a7 3093 status=als_start_continuous_mode();
Davidroid 57:fa4c622b04a7 3094 return status;
Davidroid 57:fa4c622b04a7 3095 }
Davidroid 57:fa4c622b04a7 3096
Davidroid 57:fa4c622b04a7 3097
Davidroid 57:fa4c622b04a7 3098 int VL6180X::StartInterleavedMode()
Davidroid 57:fa4c622b04a7 3099 {
Davidroid 57:fa4c622b04a7 3100 int status;
Davidroid 57:fa4c622b04a7 3101 uint16_t integration_period, intermeasurement_period_ms;
Davidroid 57:fa4c622b04a7 3102 uint8_t max_convergence_time;
Davidroid 57:fa4c622b04a7 3103 uint8_t buf;
Davidroid 57:fa4c622b04a7 3104
Davidroid 57:fa4c622b04a7 3105 status=VL6180X_WrByte(_device, 0x2A3, 1);
Davidroid 57:fa4c622b04a7 3106 if(status)
Davidroid 57:fa4c622b04a7 3107 {
Davidroid 57:fa4c622b04a7 3108 VL6180X_ErrLog("Failed to write INTERLEAVED_MODE_ENABLE!\n\r");
Davidroid 57:fa4c622b04a7 3109 return status;
Davidroid 57:fa4c622b04a7 3110 }
Davidroid 57:fa4c622b04a7 3111 status=VL6180X_RdByte(_device, SYSRANGE_MAX_CONVERGENCE_TIME, &max_convergence_time);
Davidroid 57:fa4c622b04a7 3112 if(status)
Davidroid 57:fa4c622b04a7 3113 {
Davidroid 57:fa4c622b04a7 3114 VL6180X_ErrLog("Failed to read SYSRANGE_MAX_CONVERGENCE_TIME!\n\r");
Davidroid 57:fa4c622b04a7 3115 return status;
Davidroid 57:fa4c622b04a7 3116 }
Davidroid 57:fa4c622b04a7 3117 status=VL6180X_RdWord(_device, SYSALS_INTEGRATION_PERIOD, &integration_period);
Davidroid 57:fa4c622b04a7 3118 if(status)
Davidroid 57:fa4c622b04a7 3119 {
Davidroid 57:fa4c622b04a7 3120 VL6180X_ErrLog("Failed to read SYSALS_INTEGRATION_PERIOD!\n\r");
Davidroid 57:fa4c622b04a7 3121 return status;
Davidroid 57:fa4c622b04a7 3122 }
Davidroid 57:fa4c622b04a7 3123 max_convergence_time&=0x3F;
Davidroid 57:fa4c622b04a7 3124 integration_period&=0x01FF;
Davidroid 57:fa4c622b04a7 3125 intermeasurement_period_ms=((max_convergence_time+5)+(integration_period*1.1));
Davidroid 57:fa4c622b04a7 3126 intermeasurement_period_ms=(intermeasurement_period_ms/0.9)+10;
Davidroid 57:fa4c622b04a7 3127 intermeasurement_period_ms=200;
Davidroid 57:fa4c622b04a7 3128 status=VL6180X_AlsSetInterMeasurementPeriod(_device, intermeasurement_period_ms);
Davidroid 57:fa4c622b04a7 3129 VL6180X_RdByte(_device, 0x03E, &buf);
Davidroid 57:fa4c622b04a7 3130 if(status)
Davidroid 57:fa4c622b04a7 3131 {
Davidroid 57:fa4c622b04a7 3132 VL6180X_ErrLog("Failed to write SYSALS_INTERMEASUREMENT_PERIOD!\n\r");
Davidroid 57:fa4c622b04a7 3133 return status;
Davidroid 57:fa4c622b04a7 3134 }
Davidroid 57:fa4c622b04a7 3135 return als_start_continuous_mode();
Davidroid 57:fa4c622b04a7 3136 }
Davidroid 57:fa4c622b04a7 3137
Davidroid 57:fa4c622b04a7 3138
Davidroid 57:fa4c622b04a7 3139 int VL6180X::InterleavedMode(void (*fptr)(void))
Davidroid 57:fa4c622b04a7 3140 {
Davidroid 57:fa4c622b04a7 3141 int status, ClrStatus;
Davidroid 57:fa4c622b04a7 3142
Davidroid 57:fa4c622b04a7 3143 enable_interrupt_measure_detection_irq();
Davidroid 57:fa4c622b04a7 3144 attach_interrupt_measure_detection_irq(fptr);
Davidroid 57:fa4c622b04a7 3145 status=setup_gpio_1(GPIOx_SELECT_GPIO_INTERRUPT_OUTPUT, 1);
Davidroid 57:fa4c622b04a7 3146 ClrStatus=VL6180X_ClearAllInterrupt(_device);
Davidroid 57:fa4c622b04a7 3147 if(ClrStatus)
Davidroid 57:fa4c622b04a7 3148 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 3149 if(!status)
Davidroid 57:fa4c622b04a7 3150 status=StartInterleavedMode();
Davidroid 57:fa4c622b04a7 3151 return status;
Davidroid 57:fa4c622b04a7 3152 }
Davidroid 57:fa4c622b04a7 3153
Davidroid 57:fa4c622b04a7 3154
Davidroid 57:fa4c622b04a7 3155 int VL6180X::handle_irq(operating_mode_t operating_mode, measure_data_t *Data)
Davidroid 57:fa4c622b04a7 3156 {
Davidroid 57:fa4c622b04a7 3157 int status;
Davidroid 57:fa4c622b04a7 3158 enable_interrupt_measure_detection_irq();
Davidroid 57:fa4c622b04a7 3159 status=get_measurement(operating_mode, Data);
Davidroid 57:fa4c622b04a7 3160 return status;
Davidroid 57:fa4c622b04a7 3161 }
Davidroid 57:fa4c622b04a7 3162
Davidroid 57:fa4c622b04a7 3163
Davidroid 57:fa4c622b04a7 3164 int VL6180X::RangeSetLowThreshold(uint16_t threshold)
Davidroid 57:fa4c622b04a7 3165 {
Davidroid 57:fa4c622b04a7 3166 int status;
Davidroid 57:fa4c622b04a7 3167 uint16_t low, high;
Davidroid 57:fa4c622b04a7 3168
Davidroid 57:fa4c622b04a7 3169 status=VL6180X_RangeGetThresholds(_device, &low, &high);
Davidroid 57:fa4c622b04a7 3170 if(!status)
Davidroid 57:fa4c622b04a7 3171 status=VL6180X_RangeSetThresholds(_device, threshold, high, 1);
Davidroid 57:fa4c622b04a7 3172 return status;
Davidroid 57:fa4c622b04a7 3173 }
Davidroid 57:fa4c622b04a7 3174
Davidroid 57:fa4c622b04a7 3175
Davidroid 57:fa4c622b04a7 3176 int VL6180X::RangeSetHighThreshold(uint16_t threshold)
Davidroid 57:fa4c622b04a7 3177 {
Davidroid 57:fa4c622b04a7 3178 int status;
Davidroid 57:fa4c622b04a7 3179 uint16_t low, high;
Davidroid 57:fa4c622b04a7 3180
Davidroid 57:fa4c622b04a7 3181 status=VL6180X_RangeGetThresholds(_device, &low, &high);
Davidroid 57:fa4c622b04a7 3182 if(!status)
Davidroid 57:fa4c622b04a7 3183 status=VL6180X_RangeSetThresholds(_device, low, threshold, 1);
Davidroid 57:fa4c622b04a7 3184 return status;
Davidroid 57:fa4c622b04a7 3185 }
Davidroid 57:fa4c622b04a7 3186
Davidroid 57:fa4c622b04a7 3187
Davidroid 57:fa4c622b04a7 3188 int VL6180X::AlsSetLowThreshold(uint16_t threshold)
Davidroid 57:fa4c622b04a7 3189 {
Davidroid 57:fa4c622b04a7 3190 int status;
Davidroid 57:fa4c622b04a7 3191 lux_t low, high;
Davidroid 57:fa4c622b04a7 3192
Davidroid 57:fa4c622b04a7 3193 status=AlsGetThresholds(_device, &low, &high);
Davidroid 57:fa4c622b04a7 3194 if(!status)
Davidroid 57:fa4c622b04a7 3195 status=VL6180X_AlsSetThresholds(_device, threshold, high);
Davidroid 57:fa4c622b04a7 3196 return status;
Davidroid 57:fa4c622b04a7 3197 }
Davidroid 57:fa4c622b04a7 3198
Davidroid 57:fa4c622b04a7 3199
Davidroid 57:fa4c622b04a7 3200 int VL6180X::AlsSetHighThreshold(uint16_t threshold)
Davidroid 57:fa4c622b04a7 3201 {
Davidroid 57:fa4c622b04a7 3202 int status;
Davidroid 57:fa4c622b04a7 3203 lux_t low, high;
Davidroid 57:fa4c622b04a7 3204
Davidroid 57:fa4c622b04a7 3205 status=AlsGetThresholds(_device, &low, &high);
Davidroid 57:fa4c622b04a7 3206 if(!status)
Davidroid 57:fa4c622b04a7 3207 status=VL6180X_AlsSetThresholds(_device, low, threshold);
Davidroid 57:fa4c622b04a7 3208 return status;
Davidroid 57:fa4c622b04a7 3209 }
Davidroid 57:fa4c622b04a7 3210
Davidroid 57:fa4c622b04a7 3211
Davidroid 57:fa4c622b04a7 3212 int VL6180X::AlsGetThresholds(VL6180XDev_t dev, lux_t *low, lux_t *high)
Davidroid 57:fa4c622b04a7 3213 {
Davidroid 57:fa4c622b04a7 3214 int status;
Davidroid 57:fa4c622b04a7 3215 uint16_t RawAlsLow, RawAlsHigh;
Davidroid 57:fa4c622b04a7 3216 uint32_t luxLowValue, luxHighValue, IntPeriod, AlsAnGain, GainFix, AlsScaler;
Davidroid 57:fa4c622b04a7 3217 const uint32_t LuxResxIntIme =(uint32_t)(0.56f* DEF_INT_PEFRIOD *(1<<LUXRES_FIX_PREC));
Davidroid 57:fa4c622b04a7 3218
Davidroid 57:fa4c622b04a7 3219 status=VL6180X_RdWord(dev, SYSALS_THRESH_LOW, &RawAlsLow);
Davidroid 57:fa4c622b04a7 3220 if(status)
Davidroid 57:fa4c622b04a7 3221 {
Davidroid 57:fa4c622b04a7 3222 VL6180X_ErrLog("rd SYSALS_THRESH_LOW fail");
Davidroid 57:fa4c622b04a7 3223 return status;
Davidroid 57:fa4c622b04a7 3224 }
Davidroid 57:fa4c622b04a7 3225 status=VL6180X_RdWord(dev, SYSALS_THRESH_HIGH, &RawAlsHigh);
Davidroid 57:fa4c622b04a7 3226 if(status)
Davidroid 57:fa4c622b04a7 3227 {
Davidroid 57:fa4c622b04a7 3228 VL6180X_ErrLog("rd SYSALS_THRESH_HIGH fail");
Davidroid 57:fa4c622b04a7 3229 return status;
Davidroid 57:fa4c622b04a7 3230 }
Davidroid 57:fa4c622b04a7 3231 AlsAnGain=VL6180XDevDataGet(dev, AlsGainCode);
Davidroid 57:fa4c622b04a7 3232 IntPeriod=VL6180XDevDataGet(dev, IntegrationPeriod);
Davidroid 57:fa4c622b04a7 3233 AlsScaler=VL6180XDevDataGet(dev, AlsScaler);
Davidroid 57:fa4c622b04a7 3234 GainFix=AlsGainLookUp[AlsAnGain];
Davidroid 57:fa4c622b04a7 3235 IntPeriod++;
Davidroid 57:fa4c622b04a7 3236 luxLowValue=(uint32_t)RawAlsLow*LuxResxIntIme;
Davidroid 57:fa4c622b04a7 3237 luxLowValue=luxLowValue/IntPeriod;
Davidroid 57:fa4c622b04a7 3238 luxLowValue=luxLowValue/(AlsScaler*GainFix);
Davidroid 57:fa4c622b04a7 3239 luxHighValue=(uint32_t)RawAlsHigh*LuxResxIntIme;
Davidroid 57:fa4c622b04a7 3240 luxHighValue=luxHighValue/IntPeriod;
Davidroid 57:fa4c622b04a7 3241 luxHighValue=luxHighValue/(AlsScaler*GainFix);
Davidroid 57:fa4c622b04a7 3242 *low=luxLowValue;
Davidroid 57:fa4c622b04a7 3243 *high=luxHighValue;
Davidroid 57:fa4c622b04a7 3244 return status;
Davidroid 57:fa4c622b04a7 3245 }
Davidroid 57:fa4c622b04a7 3246
Davidroid 57:fa4c622b04a7 3247
Davidroid 57:fa4c622b04a7 3248 int VL6180X::get_measurement(operating_mode_t operating_mode, measure_data_t *Data)
Davidroid 57:fa4c622b04a7 3249 {
Davidroid 57:fa4c622b04a7 3250 switch(operating_mode)
Davidroid 57:fa4c622b04a7 3251 {
Davidroid 57:fa4c622b04a7 3252 case(range_single_shot_polling):
Davidroid 57:fa4c622b04a7 3253 case(range_continuous_polling):
Davidroid 57:fa4c622b04a7 3254 case(range_continuous_interrupt):
Davidroid 57:fa4c622b04a7 3255 case(range_continuous_polling_low_threshold):
Davidroid 57:fa4c622b04a7 3256 case(range_continuous_polling_high_threshold):
Davidroid 57:fa4c622b04a7 3257 case(range_continuous_polling_out_of_window):
Davidroid 57:fa4c622b04a7 3258 case(range_continuous_interrupt_low_threshold):
Davidroid 57:fa4c622b04a7 3259 case(range_continuous_interrupt_high_threshold):
Davidroid 57:fa4c622b04a7 3260 case(range_continuous_interrupt_out_of_window):
Davidroid 57:fa4c622b04a7 3261 return GetRangeMeas(operating_mode, Data);
Davidroid 57:fa4c622b04a7 3262
Davidroid 57:fa4c622b04a7 3263 case(als_single_shot_polling):
Davidroid 57:fa4c622b04a7 3264 case(als_continuous_polling):
Davidroid 57:fa4c622b04a7 3265 case(als_continuous_interrupt):
Davidroid 57:fa4c622b04a7 3266 case(als_continuous_polling_low_threshold):
Davidroid 57:fa4c622b04a7 3267 case(als_continuous_polling_high_threshold):
Davidroid 57:fa4c622b04a7 3268 case(als_continuous_polling_out_of_window):
Davidroid 57:fa4c622b04a7 3269 case(als_continuous_interrupt_low_threshold):
Davidroid 57:fa4c622b04a7 3270 case(als_continuous_interrupt_high_threshold):
Davidroid 57:fa4c622b04a7 3271 case(als_continuous_interrupt_out_of_window):
Davidroid 57:fa4c622b04a7 3272 return GetAlsMeas(operating_mode, Data);
Davidroid 57:fa4c622b04a7 3273
Davidroid 57:fa4c622b04a7 3274 case(interleaved_mode_interrupt):
Davidroid 57:fa4c622b04a7 3275 return GetRangeAlsMeas(Data);
Davidroid 57:fa4c622b04a7 3276
Davidroid 57:fa4c622b04a7 3277 default:
Davidroid 57:fa4c622b04a7 3278 return INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 3279 }
Davidroid 57:fa4c622b04a7 3280 }
Davidroid 57:fa4c622b04a7 3281
Davidroid 57:fa4c622b04a7 3282
Davidroid 57:fa4c622b04a7 3283 int VL6180X::GetRangeMeas(operating_mode_t operating_mode, measure_data_t *Data)
Davidroid 57:fa4c622b04a7 3284 {
Davidroid 57:fa4c622b04a7 3285 VL6180X_RangeData_t RangeData;
Davidroid 57:fa4c622b04a7 3286 int status, ClrStatus;
Davidroid 57:fa4c622b04a7 3287 IntrStatus_t IntStatus;
Davidroid 57:fa4c622b04a7 3288
Davidroid 57:fa4c622b04a7 3289 status=VL6180X_RangeGetInterruptStatus(_device, &IntStatus.val);
Davidroid 57:fa4c622b04a7 3290 if(!status)
Davidroid 57:fa4c622b04a7 3291 {
Davidroid 57:fa4c622b04a7 3292 Data->int_error=IntStatus.status.Error;
Davidroid 57:fa4c622b04a7 3293 if(IntStatus.status.Error!=0)
Davidroid 57:fa4c622b04a7 3294 {
Davidroid 57:fa4c622b04a7 3295 VL6180X_ErrLog("GPIO int Error report %d",(int)IntStatus.val);
Davidroid 57:fa4c622b04a7 3296 status=RANGE_ERROR;
Davidroid 57:fa4c622b04a7 3297 }
Davidroid 57:fa4c622b04a7 3298 }
Davidroid 57:fa4c622b04a7 3299 else
Davidroid 57:fa4c622b04a7 3300 {
Davidroid 57:fa4c622b04a7 3301 VL6180X_ErrLog("Failed to read RESULT_INTERRUPT_STATUS_GPIO");
Davidroid 57:fa4c622b04a7 3302 }
Davidroid 57:fa4c622b04a7 3303 ClrStatus=VL6180X_RangeClearInterrupt(_device);
Davidroid 57:fa4c622b04a7 3304 if(ClrStatus)
Davidroid 57:fa4c622b04a7 3305 {
Davidroid 57:fa4c622b04a7 3306 VL6180X_ErrLog("VL6180X_RangeClearInterrupt fail");
Davidroid 57:fa4c622b04a7 3307 }
Davidroid 57:fa4c622b04a7 3308 ClrStatus=VL6180X_ClearErrorInterrupt(_device);
Davidroid 57:fa4c622b04a7 3309 if(ClrStatus)
Davidroid 57:fa4c622b04a7 3310 {
Davidroid 57:fa4c622b04a7 3311 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 3312 }
Davidroid 57:fa4c622b04a7 3313 if(status)
Davidroid 57:fa4c622b04a7 3314 return status;
Davidroid 57:fa4c622b04a7 3315 if((operating_mode==range_single_shot_polling)||(operating_mode==range_continuous_polling)||(operating_mode==range_continuous_interrupt))
Davidroid 57:fa4c622b04a7 3316 {
Davidroid 57:fa4c622b04a7 3317 if(IntStatus.status.Range==RES_INT_STAT_GPIO_NEW_SAMPLE_READY)
Davidroid 57:fa4c622b04a7 3318 status=VL6180X_RangeGetMeasurement(_device, &RangeData);
Davidroid 57:fa4c622b04a7 3319 else
Davidroid 57:fa4c622b04a7 3320 return NOT_READY;
Davidroid 57:fa4c622b04a7 3321 }
Davidroid 57:fa4c622b04a7 3322 else if((operating_mode==range_continuous_polling_low_threshold)||(operating_mode==range_continuous_interrupt_low_threshold))
Davidroid 57:fa4c622b04a7 3323 {
Davidroid 57:fa4c622b04a7 3324 if(IntStatus.status.Range==RES_INT_STAT_GPIO_LOW_LEVEL_THRESHOLD)
Davidroid 57:fa4c622b04a7 3325 status=VL6180X_RangeGetMeasurement(_device, &RangeData);
Davidroid 57:fa4c622b04a7 3326 else
Davidroid 57:fa4c622b04a7 3327 return NOT_READY;
Davidroid 57:fa4c622b04a7 3328 }
Davidroid 57:fa4c622b04a7 3329 else if((operating_mode==range_continuous_polling_high_threshold)||(operating_mode==range_continuous_interrupt_high_threshold))
Davidroid 57:fa4c622b04a7 3330 {
Davidroid 57:fa4c622b04a7 3331 if(IntStatus.status.Range==RES_INT_STAT_GPIO_HIGH_LEVEL_THRESHOLD)
Davidroid 57:fa4c622b04a7 3332 status=VL6180X_RangeGetMeasurement(_device, &RangeData);
Davidroid 57:fa4c622b04a7 3333 else
Davidroid 57:fa4c622b04a7 3334 return NOT_READY;
Davidroid 57:fa4c622b04a7 3335 }
Davidroid 57:fa4c622b04a7 3336 else if((operating_mode==range_continuous_polling_out_of_window)||(operating_mode==range_continuous_interrupt_out_of_window))
Davidroid 57:fa4c622b04a7 3337 {
Davidroid 57:fa4c622b04a7 3338 if(IntStatus.status.Range==RES_INT_STAT_GPIO_OUT_OF_WINDOW)
Davidroid 57:fa4c622b04a7 3339 status=VL6180X_RangeGetMeasurement(_device, &RangeData);
Davidroid 57:fa4c622b04a7 3340 else
Davidroid 57:fa4c622b04a7 3341 return NOT_READY;
Davidroid 57:fa4c622b04a7 3342 }
Davidroid 57:fa4c622b04a7 3343 if(!status)
Davidroid 57:fa4c622b04a7 3344 {
Davidroid 57:fa4c622b04a7 3345 status=GetRangeError(Data, RangeData);
Davidroid 57:fa4c622b04a7 3346 if(!status)
Davidroid 57:fa4c622b04a7 3347 Data->range_mm=RangeData.range_mm;
Davidroid 57:fa4c622b04a7 3348 else
Davidroid 57:fa4c622b04a7 3349 Data->range_mm=0xFFFFFFFF;
Davidroid 57:fa4c622b04a7 3350 }
Davidroid 57:fa4c622b04a7 3351 return status;
Davidroid 57:fa4c622b04a7 3352 }
Davidroid 57:fa4c622b04a7 3353
Davidroid 57:fa4c622b04a7 3354
Davidroid 57:fa4c622b04a7 3355 int VL6180X::GetAlsMeas(operating_mode_t operating_mode, measure_data_t *Data)
Davidroid 57:fa4c622b04a7 3356 {
Davidroid 57:fa4c622b04a7 3357 VL6180X_AlsData_t AlsData;
Davidroid 57:fa4c622b04a7 3358 int status, ClrStatus;
Davidroid 57:fa4c622b04a7 3359 uint8_t IntStatus;
Davidroid 57:fa4c622b04a7 3360
Davidroid 57:fa4c622b04a7 3361 status=VL6180X_AlsGetInterruptStatus(_device, &IntStatus);
Davidroid 57:fa4c622b04a7 3362 if(status)
Davidroid 57:fa4c622b04a7 3363 {
Davidroid 57:fa4c622b04a7 3364 VL6180X_ErrLog("Failed to read RESULT_INTERRUPT_STATUS_GPIO");
Davidroid 57:fa4c622b04a7 3365 }
Davidroid 57:fa4c622b04a7 3366 ClrStatus=VL6180X_AlsClearInterrupt(_device);
Davidroid 57:fa4c622b04a7 3367 if(ClrStatus)
Davidroid 57:fa4c622b04a7 3368 {
Davidroid 57:fa4c622b04a7 3369 VL6180X_ErrLog("VL6180X_AlsClearInterrupt fail");
Davidroid 57:fa4c622b04a7 3370 }
Davidroid 57:fa4c622b04a7 3371 ClrStatus=VL6180X_ClearErrorInterrupt(_device);
Davidroid 57:fa4c622b04a7 3372 if(ClrStatus)
Davidroid 57:fa4c622b04a7 3373 {
Davidroid 57:fa4c622b04a7 3374 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 3375 }
Davidroid 57:fa4c622b04a7 3376 if(status)
Davidroid 57:fa4c622b04a7 3377 return status;
Davidroid 57:fa4c622b04a7 3378 if((operating_mode==als_single_shot_polling)||(operating_mode==als_continuous_polling)||(operating_mode==als_continuous_interrupt))
Davidroid 57:fa4c622b04a7 3379 {
Davidroid 57:fa4c622b04a7 3380 if(IntStatus==RES_INT_STAT_GPIO_NEW_SAMPLE_READY)
Davidroid 57:fa4c622b04a7 3381 status=VL6180X_AlsGetMeasurement(_device, &AlsData);
Davidroid 57:fa4c622b04a7 3382 else
Davidroid 57:fa4c622b04a7 3383 return NOT_READY;
Davidroid 57:fa4c622b04a7 3384 }
Davidroid 57:fa4c622b04a7 3385 else if((operating_mode==als_continuous_polling_low_threshold)||(operating_mode==als_continuous_interrupt_low_threshold))
Davidroid 57:fa4c622b04a7 3386 {
Davidroid 57:fa4c622b04a7 3387 if(IntStatus==RES_INT_STAT_GPIO_LOW_LEVEL_THRESHOLD)
Davidroid 57:fa4c622b04a7 3388 status=VL6180X_AlsGetMeasurement(_device, &AlsData);
Davidroid 57:fa4c622b04a7 3389 else
Davidroid 57:fa4c622b04a7 3390 return NOT_READY;
Davidroid 57:fa4c622b04a7 3391 }
Davidroid 57:fa4c622b04a7 3392 else if((operating_mode==als_continuous_polling_high_threshold)||(operating_mode==als_continuous_interrupt_high_threshold))
Davidroid 57:fa4c622b04a7 3393 {
Davidroid 57:fa4c622b04a7 3394 if(IntStatus==RES_INT_STAT_GPIO_HIGH_LEVEL_THRESHOLD)
Davidroid 57:fa4c622b04a7 3395 status=VL6180X_AlsGetMeasurement(_device, &AlsData);
Davidroid 57:fa4c622b04a7 3396 else
Davidroid 57:fa4c622b04a7 3397 return NOT_READY;
Davidroid 57:fa4c622b04a7 3398 }
Davidroid 57:fa4c622b04a7 3399 else if((operating_mode==als_continuous_polling_out_of_window)||(operating_mode==als_continuous_interrupt_out_of_window))
Davidroid 57:fa4c622b04a7 3400 {
Davidroid 57:fa4c622b04a7 3401 if(IntStatus==RES_INT_STAT_GPIO_OUT_OF_WINDOW)
Davidroid 57:fa4c622b04a7 3402 status=VL6180X_AlsGetMeasurement(_device, &AlsData);
Davidroid 57:fa4c622b04a7 3403 else
Davidroid 57:fa4c622b04a7 3404 return NOT_READY;
Davidroid 57:fa4c622b04a7 3405 }
Davidroid 57:fa4c622b04a7 3406 if(!status)
Davidroid 57:fa4c622b04a7 3407 {
Davidroid 57:fa4c622b04a7 3408 status=GetAlsError(Data, AlsData);
Davidroid 57:fa4c622b04a7 3409 if(!status)
Davidroid 57:fa4c622b04a7 3410 Data->lux=AlsData.lux;
Davidroid 57:fa4c622b04a7 3411 else
Davidroid 57:fa4c622b04a7 3412 Data->lux=0xFFFFFFFF;
Davidroid 57:fa4c622b04a7 3413 }
Davidroid 57:fa4c622b04a7 3414 return status;
Davidroid 57:fa4c622b04a7 3415 }
Davidroid 57:fa4c622b04a7 3416
Davidroid 57:fa4c622b04a7 3417
Davidroid 57:fa4c622b04a7 3418 int VL6180X::GetRangeAlsMeas(measure_data_t *Data)
Davidroid 57:fa4c622b04a7 3419 {
Davidroid 57:fa4c622b04a7 3420 int status, ClrStatus, r_status, l_status;
Davidroid 57:fa4c622b04a7 3421 IntrStatus_t IntStatus;
Davidroid 57:fa4c622b04a7 3422 VL6180X_RangeData_t RangeData;
Davidroid 57:fa4c622b04a7 3423 VL6180X_AlsData_t AlsData;
Davidroid 57:fa4c622b04a7 3424
Davidroid 57:fa4c622b04a7 3425 status=VL6180X_RdByte(_device, RESULT_INTERRUPT_STATUS_GPIO, &IntStatus.val);
Davidroid 57:fa4c622b04a7 3426 if(!status)
Davidroid 57:fa4c622b04a7 3427 {
Davidroid 57:fa4c622b04a7 3428 Data->int_error=IntStatus.status.Error;
Davidroid 57:fa4c622b04a7 3429 if(IntStatus.status.Error!=0)
Davidroid 57:fa4c622b04a7 3430 {
Davidroid 57:fa4c622b04a7 3431 VL6180X_ErrLog("GPIO int Error report %d",(int)IntStatus.val);
Davidroid 57:fa4c622b04a7 3432 status=RANGE_ERROR;
Davidroid 57:fa4c622b04a7 3433 }
Davidroid 57:fa4c622b04a7 3434 }
Davidroid 57:fa4c622b04a7 3435 else
Davidroid 57:fa4c622b04a7 3436 {
Davidroid 57:fa4c622b04a7 3437 VL6180X_ErrLog("Failed to read RESULT_INTERRUPT_STATUS_GPIO");
Davidroid 57:fa4c622b04a7 3438 }
Davidroid 57:fa4c622b04a7 3439 ClrStatus=VL6180X_ClearAllInterrupt(_device);
Davidroid 57:fa4c622b04a7 3440 if(ClrStatus)
Davidroid 57:fa4c622b04a7 3441 VL6180X_ErrLog("VL6180X_ClearAllInterrupt fail");
Davidroid 57:fa4c622b04a7 3442 if(status)
Davidroid 57:fa4c622b04a7 3443 return status;
Davidroid 57:fa4c622b04a7 3444
Davidroid 57:fa4c622b04a7 3445 if(IntStatus.status.Als==RES_INT_STAT_GPIO_NEW_SAMPLE_READY)
Davidroid 57:fa4c622b04a7 3446 {
Davidroid 57:fa4c622b04a7 3447 r_status=VL6180X_RangeGetMeasurement(_device, &RangeData);
Davidroid 57:fa4c622b04a7 3448 l_status=VL6180X_AlsGetMeasurement(_device, &AlsData);
Davidroid 57:fa4c622b04a7 3449 if((!r_status)&&(!l_status))
Davidroid 57:fa4c622b04a7 3450 {
Davidroid 57:fa4c622b04a7 3451 r_status=GetRangeError(Data, RangeData);
Davidroid 57:fa4c622b04a7 3452 l_status=GetAlsError(Data, AlsData);
Davidroid 57:fa4c622b04a7 3453 if(!r_status)
Davidroid 57:fa4c622b04a7 3454 Data->range_mm=RangeData.range_mm;
Davidroid 57:fa4c622b04a7 3455 else
Davidroid 57:fa4c622b04a7 3456 Data->range_mm=0xFFFFFFFF;
Davidroid 57:fa4c622b04a7 3457 if(!l_status)
Davidroid 57:fa4c622b04a7 3458 Data->lux=AlsData.lux;
Davidroid 57:fa4c622b04a7 3459 else
Davidroid 57:fa4c622b04a7 3460 Data->lux=0xFFFFFFFF;
Davidroid 57:fa4c622b04a7 3461 status=r_status|l_status;
Davidroid 57:fa4c622b04a7 3462 }
Davidroid 57:fa4c622b04a7 3463 else
Davidroid 57:fa4c622b04a7 3464 {
Davidroid 57:fa4c622b04a7 3465 status=r_status|l_status;
Davidroid 57:fa4c622b04a7 3466 }
Davidroid 57:fa4c622b04a7 3467 }
Davidroid 57:fa4c622b04a7 3468 else
Davidroid 57:fa4c622b04a7 3469 return NOT_READY;
Davidroid 57:fa4c622b04a7 3470 return status;
Davidroid 57:fa4c622b04a7 3471 }
Davidroid 57:fa4c622b04a7 3472
Davidroid 57:fa4c622b04a7 3473
Davidroid 57:fa4c622b04a7 3474 int VL6180X::stop_measurement(operating_mode_t operating_mode)
Davidroid 57:fa4c622b04a7 3475 {
Davidroid 57:fa4c622b04a7 3476 int status;
Davidroid 57:fa4c622b04a7 3477
Davidroid 57:fa4c622b04a7 3478 switch(operating_mode)
Davidroid 57:fa4c622b04a7 3479 {
Davidroid 57:fa4c622b04a7 3480 case(range_single_shot_polling):
Davidroid 57:fa4c622b04a7 3481 case(range_continuous_polling):
Davidroid 57:fa4c622b04a7 3482 case(range_continuous_interrupt):
Davidroid 57:fa4c622b04a7 3483 case(range_continuous_polling_low_threshold):
Davidroid 57:fa4c622b04a7 3484 case(range_continuous_polling_high_threshold):
Davidroid 57:fa4c622b04a7 3485 case(range_continuous_polling_out_of_window):
Davidroid 57:fa4c622b04a7 3486 case(range_continuous_interrupt_low_threshold):
Davidroid 57:fa4c622b04a7 3487 case(range_continuous_interrupt_high_threshold):
Davidroid 57:fa4c622b04a7 3488 case(range_continuous_interrupt_out_of_window):
Davidroid 57:fa4c622b04a7 3489 return StopRangeMeasurement(operating_mode);
Davidroid 57:fa4c622b04a7 3490
Davidroid 57:fa4c622b04a7 3491 case(als_single_shot_polling):
Davidroid 57:fa4c622b04a7 3492 case(als_continuous_polling):
Davidroid 57:fa4c622b04a7 3493 case(als_continuous_interrupt):
Davidroid 57:fa4c622b04a7 3494 case(als_continuous_polling_low_threshold):
Davidroid 57:fa4c622b04a7 3495 case(als_continuous_polling_high_threshold):
Davidroid 57:fa4c622b04a7 3496 case(als_continuous_polling_out_of_window):
Davidroid 57:fa4c622b04a7 3497 case(als_continuous_interrupt_low_threshold):
Davidroid 57:fa4c622b04a7 3498 case(als_continuous_interrupt_high_threshold):
Davidroid 57:fa4c622b04a7 3499 case(als_continuous_interrupt_out_of_window):
Davidroid 57:fa4c622b04a7 3500 return StopAlsMeasurement(operating_mode);
Davidroid 57:fa4c622b04a7 3501
Davidroid 57:fa4c622b04a7 3502 case(interleaved_mode_interrupt):
Davidroid 57:fa4c622b04a7 3503 status=StopRangeMeasurement(range_continuous_interrupt);
Davidroid 57:fa4c622b04a7 3504 if(!status)
Davidroid 57:fa4c622b04a7 3505 return StopAlsMeasurement(als_continuous_interrupt);
Davidroid 57:fa4c622b04a7 3506 else return status;
Davidroid 57:fa4c622b04a7 3507
Davidroid 57:fa4c622b04a7 3508 default:
Davidroid 57:fa4c622b04a7 3509 return INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 3510 }
Davidroid 57:fa4c622b04a7 3511 }
Davidroid 57:fa4c622b04a7 3512
Davidroid 57:fa4c622b04a7 3513
Davidroid 57:fa4c622b04a7 3514 int VL6180X::IsPresent()
Davidroid 57:fa4c622b04a7 3515 {
Davidroid 57:fa4c622b04a7 3516 int status; uint8_t id;
Davidroid 57:fa4c622b04a7 3517
Davidroid 57:fa4c622b04a7 3518 status=read_id(&id);
Davidroid 57:fa4c622b04a7 3519 if(status)
Davidroid 57:fa4c622b04a7 3520 VL6180X_ErrLog("Failed to read ID device. _device not present!\n\r");
Davidroid 57:fa4c622b04a7 3521 return status;
Davidroid 57:fa4c622b04a7 3522 }
Davidroid 57:fa4c622b04a7 3523
Davidroid 57:fa4c622b04a7 3524
Davidroid 57:fa4c622b04a7 3525 int VL6180X::StopRangeMeasurement(operating_mode_t operating_mode)
Davidroid 57:fa4c622b04a7 3526 {
Davidroid 57:fa4c622b04a7 3527 int status;
Davidroid 57:fa4c622b04a7 3528
Davidroid 57:fa4c622b04a7 3529 if(operating_mode==range_single_shot_polling)
Davidroid 57:fa4c622b04a7 3530 status=VL6180X_RangeSetSystemMode(_device, MODE_SINGLESHOT);
Davidroid 57:fa4c622b04a7 3531 else
Davidroid 57:fa4c622b04a7 3532 status=VL6180X_RangeSetSystemMode(_device, MODE_START_STOP|MODE_SINGLESHOT);
Davidroid 57:fa4c622b04a7 3533 if(status)
Davidroid 57:fa4c622b04a7 3534 return status;
Davidroid 57:fa4c622b04a7 3535 status=VL6180X_RangeConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 3536 if(status)
Davidroid 57:fa4c622b04a7 3537 {
Davidroid 57:fa4c622b04a7 3538 VL6180X_ErrLog("VL6180X_RangeConfigInterrupt fail"\n\r);
Davidroid 57:fa4c622b04a7 3539 return status;
Davidroid 57:fa4c622b04a7 3540 }
Davidroid 57:fa4c622b04a7 3541 status=VL6180X_RangeClearInterrupt(_device);
Davidroid 57:fa4c622b04a7 3542 if(status)
Davidroid 57:fa4c622b04a7 3543 {
Davidroid 57:fa4c622b04a7 3544 VL6180X_ErrLog("VL6180X_RangeClearInterrupt fail");
Davidroid 57:fa4c622b04a7 3545 return status;
Davidroid 57:fa4c622b04a7 3546 }
Davidroid 57:fa4c622b04a7 3547 status=VL6180X_ClearErrorInterrupt(_device);
Davidroid 57:fa4c622b04a7 3548 if(status)
Davidroid 57:fa4c622b04a7 3549 {
Davidroid 57:fa4c622b04a7 3550 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 3551 return status;
Davidroid 57:fa4c622b04a7 3552 }
Davidroid 57:fa4c622b04a7 3553 status=VL6180X_RangeSetRawThresholds(_device, 10, 200);
Davidroid 57:fa4c622b04a7 3554 if(status)
Davidroid 57:fa4c622b04a7 3555 VL6180X_ErrLog("VL6180X_RangeSetThresholds fail");
Davidroid 57:fa4c622b04a7 3556 return status;
Davidroid 57:fa4c622b04a7 3557 }
Davidroid 57:fa4c622b04a7 3558
Davidroid 57:fa4c622b04a7 3559
Davidroid 57:fa4c622b04a7 3560 int VL6180X::StopAlsMeasurement(operating_mode_t operating_mode)
Davidroid 57:fa4c622b04a7 3561 {
Davidroid 57:fa4c622b04a7 3562 int status;
Davidroid 57:fa4c622b04a7 3563
Davidroid 57:fa4c622b04a7 3564 if(operating_mode==als_single_shot_polling)
Davidroid 57:fa4c622b04a7 3565 status=VL6180X_AlsSetSystemMode(_device, MODE_SINGLESHOT);
Davidroid 57:fa4c622b04a7 3566 else
Davidroid 57:fa4c622b04a7 3567 status=VL6180X_AlsSetSystemMode(_device, MODE_START_STOP|MODE_SINGLESHOT);
Davidroid 57:fa4c622b04a7 3568 if(status)
Davidroid 57:fa4c622b04a7 3569 return status;
Davidroid 57:fa4c622b04a7 3570 status=VL6180X_AlsConfigInterrupt(_device, CONFIG_GPIO_INTERRUPT_DISABLED);
Davidroid 57:fa4c622b04a7 3571 if(status)
Davidroid 57:fa4c622b04a7 3572 {
Davidroid 57:fa4c622b04a7 3573 VL6180X_ErrLog("VL6180X_AlsConfigInterrupt fail"\n\r);
Davidroid 57:fa4c622b04a7 3574 return status;
Davidroid 57:fa4c622b04a7 3575 }
Davidroid 57:fa4c622b04a7 3576 status=VL6180X_AlsClearInterrupt(_device);
Davidroid 57:fa4c622b04a7 3577 if(status)
Davidroid 57:fa4c622b04a7 3578 {
Davidroid 57:fa4c622b04a7 3579 VL6180X_ErrLog("VL6180X_AlsClearInterrupt fail");
Davidroid 57:fa4c622b04a7 3580 return status;
Davidroid 57:fa4c622b04a7 3581 }
Davidroid 57:fa4c622b04a7 3582 status=VL6180X_ClearErrorInterrupt(_device);
Davidroid 57:fa4c622b04a7 3583 if(status)
Davidroid 57:fa4c622b04a7 3584 {
Davidroid 57:fa4c622b04a7 3585 VL6180X_ErrLog("VL6180X_ClearErrorInterrupt fail");
Davidroid 57:fa4c622b04a7 3586 return status;
Davidroid 57:fa4c622b04a7 3587 }
Davidroid 57:fa4c622b04a7 3588 status=VL6180X_AlsSetThresholds(_device, 0x0, 1800);
Davidroid 57:fa4c622b04a7 3589 if(status)
Davidroid 57:fa4c622b04a7 3590 VL6180X_ErrLog("VL6180X_AlsSetThresholds fail");
Davidroid 57:fa4c622b04a7 3591 return status;
Davidroid 57:fa4c622b04a7 3592 }
Davidroid 57:fa4c622b04a7 3593
Davidroid 57:fa4c622b04a7 3594
Davidroid 57:fa4c622b04a7 3595
Davidroid 57:fa4c622b04a7 3596
Davidroid 57:fa4c622b04a7 3597 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/