INSAT Mini Project

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON

Fork of X_NUCLEO_6180XA1 by ST

Committer:
Hamdi
Date:
Tue Feb 20 19:17:52 2018 +0000
Revision:
59:f1110f5e3d90
Parent:
58:1e9a3a46f814
Light cloud Mini Project

Who changed what in which revision?

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