Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
vl6180x_class.cpp@0:15e49005d54e, 2017-03-09 (annotated)
- Committer:
- mwilkens241
- Date:
- Thu Mar 09 18:43:54 2017 +0000
- Revision:
- 0:15e49005d54e
working vl6180x library based off x_nucleo library; lacks proper wake detection...
Who changed what in which revision?
| User | Revision | Line number | New 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>© 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****/ |