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

Dependents:   Check_VL6180XA1_ToF

Fork of X_NUCLEO_6180XA1 by ST

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

Who changed what in which revision?

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