Line Health / VL6180
Committer:
mwilkens241
Date:
Fri Mar 31 15:49:47 2017 +0000
Revision:
2:40f590e28101
Parent:
0:15e49005d54e
stole some things out of here, not much changed

Who changed what in which revision?

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