Abraham Marsen
/
Jazz_Hands_Nordic
Georgia Institute of Technology ECE 4180 Spring 2015 Jazz Hands project, Nordic nRF51822 half
SparkFun_APDS9960/APDS9960.cpp@0:b8221deeaa87, 2015-04-30 (annotated)
- Committer:
- Grimmkey
- Date:
- Thu Apr 30 20:46:27 2015 +0000
- Revision:
- 0:b8221deeaa87
Georgia Institute of Technology ECE 4180 Spring 2015 Jazz Hands project, Nordic nRF51822 half
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Grimmkey | 0:b8221deeaa87 | 1 | /** |
Grimmkey | 0:b8221deeaa87 | 2 | * @author Abraham Marsen & Allison Ashlock |
Grimmkey | 0:b8221deeaa87 | 3 | * Georgia Institute of Technology |
Grimmkey | 0:b8221deeaa87 | 4 | * ECE 4180 Embedded Systems Design |
Grimmkey | 0:b8221deeaa87 | 5 | * Professor Hamblen |
Grimmkey | 0:b8221deeaa87 | 6 | * Spring 2015 |
Grimmkey | 0:b8221deeaa87 | 7 | * |
Grimmkey | 0:b8221deeaa87 | 8 | * @section LICENSE |
Grimmkey | 0:b8221deeaa87 | 9 | * ---------------------------------------------------------------------------- |
Grimmkey | 0:b8221deeaa87 | 10 | * "THE BEER-WARE LICENSE" (Revision 42): |
Grimmkey | 0:b8221deeaa87 | 11 | * <amarsen3@gmail.com> wrote this file. As long as you retain this notice you |
Grimmkey | 0:b8221deeaa87 | 12 | * can do whatever you want with this stuff. If we meet some day, and you think |
Grimmkey | 0:b8221deeaa87 | 13 | * this stuff is worth it, you can buy me a beer in return. |
Grimmkey | 0:b8221deeaa87 | 14 | * ---------------------------------------------------------------------------- |
Grimmkey | 0:b8221deeaa87 | 15 | * |
Grimmkey | 0:b8221deeaa87 | 16 | * |
Grimmkey | 0:b8221deeaa87 | 17 | * @section DESCRIPTION |
Grimmkey | 0:b8221deeaa87 | 18 | * |
Grimmkey | 0:b8221deeaa87 | 19 | * Avago Digital Proximity, Ambient Light, RGB and Gesture Sensor APDS-9960 |
Grimmkey | 0:b8221deeaa87 | 20 | * |
Grimmkey | 0:b8221deeaa87 | 21 | * Datasheet, specs, and information: |
Grimmkey | 0:b8221deeaa87 | 22 | * |
Grimmkey | 0:b8221deeaa87 | 23 | * https://www.sparkfun.com/products/12787 |
Grimmkey | 0:b8221deeaa87 | 24 | */ |
Grimmkey | 0:b8221deeaa87 | 25 | |
Grimmkey | 0:b8221deeaa87 | 26 | #include "APDS9960.h" |
Grimmkey | 0:b8221deeaa87 | 27 | |
Grimmkey | 0:b8221deeaa87 | 28 | APDS9960::APDS9960(PinName sda, PinName scl): i2c_(sda, scl) |
Grimmkey | 0:b8221deeaa87 | 29 | { |
Grimmkey | 0:b8221deeaa87 | 30 | i2c_.frequency(400000); |
Grimmkey | 0:b8221deeaa87 | 31 | //i2c_ = I2C(sda, scl); |
Grimmkey | 0:b8221deeaa87 | 32 | //400KHz, as specified by the datasheet. |
Grimmkey | 0:b8221deeaa87 | 33 | |
Grimmkey | 0:b8221deeaa87 | 34 | gest_ud_delta_ = 0; |
Grimmkey | 0:b8221deeaa87 | 35 | gest_lr_delta_ = 0; |
Grimmkey | 0:b8221deeaa87 | 36 | |
Grimmkey | 0:b8221deeaa87 | 37 | gest_ud_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 38 | gest_lr_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 39 | |
Grimmkey | 0:b8221deeaa87 | 40 | gest_near_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 41 | gest_far_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 42 | |
Grimmkey | 0:b8221deeaa87 | 43 | gest_state_ = 0; |
Grimmkey | 0:b8221deeaa87 | 44 | gest_motion_ = DIR_NA; |
Grimmkey | 0:b8221deeaa87 | 45 | } |
Grimmkey | 0:b8221deeaa87 | 46 | APDS9960::~APDS9960() |
Grimmkey | 0:b8221deeaa87 | 47 | { |
Grimmkey | 0:b8221deeaa87 | 48 | } |
Grimmkey | 0:b8221deeaa87 | 49 | bool APDS9960::init() |
Grimmkey | 0:b8221deeaa87 | 50 | { |
Grimmkey | 0:b8221deeaa87 | 51 | |
Grimmkey | 0:b8221deeaa87 | 52 | |
Grimmkey | 0:b8221deeaa87 | 53 | |
Grimmkey | 0:b8221deeaa87 | 54 | // Initialize I2C |
Grimmkey | 0:b8221deeaa87 | 55 | // Read ID register and check against known values for APDS-9960 |
Grimmkey | 0:b8221deeaa87 | 56 | uint8_t id = ReadDataByte(APDS9960_ID); |
Grimmkey | 0:b8221deeaa87 | 57 | //printf("id:%u\n\r",id); |
Grimmkey | 0:b8221deeaa87 | 58 | |
Grimmkey | 0:b8221deeaa87 | 59 | if( !(id == APDS9960_ID_1 || id == APDS9960_ID_2) ) { |
Grimmkey | 0:b8221deeaa87 | 60 | |
Grimmkey | 0:b8221deeaa87 | 61 | return false; |
Grimmkey | 0:b8221deeaa87 | 62 | } |
Grimmkey | 0:b8221deeaa87 | 63 | //printf("APDS9960_ID_1:%u\n\rAPDS9960_ID_2:%u\n\r",APDS9960_ID_1,APDS9960_ID_2); |
Grimmkey | 0:b8221deeaa87 | 64 | /* Set ENABLE register to 0 (disable all features) */ |
Grimmkey | 0:b8221deeaa87 | 65 | if( !setMode(ALL, OFF) ) { |
Grimmkey | 0:b8221deeaa87 | 66 | return false; |
Grimmkey | 0:b8221deeaa87 | 67 | } |
Grimmkey | 0:b8221deeaa87 | 68 | //printf("Set Mode: All off.\n\r"); |
Grimmkey | 0:b8221deeaa87 | 69 | |
Grimmkey | 0:b8221deeaa87 | 70 | /* Set default values for ambient light and proximity registers */ |
Grimmkey | 0:b8221deeaa87 | 71 | if( WriteDataByte(APDS9960_ATIME, DEFAULT_ATIME) ) { |
Grimmkey | 0:b8221deeaa87 | 72 | return false; |
Grimmkey | 0:b8221deeaa87 | 73 | } |
Grimmkey | 0:b8221deeaa87 | 74 | //printf("DEFAULTT_ATIME:%u\n\r",DEFAULT_ATIME); |
Grimmkey | 0:b8221deeaa87 | 75 | if( WriteDataByte(APDS9960_WTIME, DEFAULT_WTIME) ) { |
Grimmkey | 0:b8221deeaa87 | 76 | return false; |
Grimmkey | 0:b8221deeaa87 | 77 | } |
Grimmkey | 0:b8221deeaa87 | 78 | //printf("DEFAULTT_WTIME:%u\n\r",DEFAULT_WTIME); |
Grimmkey | 0:b8221deeaa87 | 79 | |
Grimmkey | 0:b8221deeaa87 | 80 | if( WriteDataByte(APDS9960_PPULSE, DEFAULT_PROX_PPULSE) ) { |
Grimmkey | 0:b8221deeaa87 | 81 | return false; |
Grimmkey | 0:b8221deeaa87 | 82 | } |
Grimmkey | 0:b8221deeaa87 | 83 | //printf("DEFAULT_PROX_PPULSE:%u\n\r",DEFAULT_PROX_PPULSE); |
Grimmkey | 0:b8221deeaa87 | 84 | |
Grimmkey | 0:b8221deeaa87 | 85 | |
Grimmkey | 0:b8221deeaa87 | 86 | if( WriteDataByte(APDS9960_POFFSET_UR, DEFAULT_POFFSET_UR) ) { |
Grimmkey | 0:b8221deeaa87 | 87 | return false; |
Grimmkey | 0:b8221deeaa87 | 88 | } |
Grimmkey | 0:b8221deeaa87 | 89 | //printf("DEFAULT_POFFSET_UR:%u\n\r",DEFAULT_POFFSET_UR); |
Grimmkey | 0:b8221deeaa87 | 90 | |
Grimmkey | 0:b8221deeaa87 | 91 | if( WriteDataByte(APDS9960_POFFSET_DL, DEFAULT_POFFSET_DL) ) { |
Grimmkey | 0:b8221deeaa87 | 92 | return false; |
Grimmkey | 0:b8221deeaa87 | 93 | } |
Grimmkey | 0:b8221deeaa87 | 94 | //printf("DEFAULT_POFFSET_DL:%u\n\r",DEFAULT_POFFSET_DL); |
Grimmkey | 0:b8221deeaa87 | 95 | |
Grimmkey | 0:b8221deeaa87 | 96 | if( WriteDataByte(APDS9960_CONFIG1, DEFAULT_CONFIG1) ) { |
Grimmkey | 0:b8221deeaa87 | 97 | return false; |
Grimmkey | 0:b8221deeaa87 | 98 | } |
Grimmkey | 0:b8221deeaa87 | 99 | //printf("DEFAULT_CONFIG1:%u\n\r",DEFAULT_CONFIG1); |
Grimmkey | 0:b8221deeaa87 | 100 | if( !setLEDDrive(DEFAULT_LDRIVE) ) { |
Grimmkey | 0:b8221deeaa87 | 101 | return false; |
Grimmkey | 0:b8221deeaa87 | 102 | } |
Grimmkey | 0:b8221deeaa87 | 103 | //printf("led drive set\n\r"); |
Grimmkey | 0:b8221deeaa87 | 104 | if( !setProxGain(DEFAULT_PGAIN) ) { |
Grimmkey | 0:b8221deeaa87 | 105 | return false; |
Grimmkey | 0:b8221deeaa87 | 106 | } |
Grimmkey | 0:b8221deeaa87 | 107 | //printf("proxgain set\n\r"); |
Grimmkey | 0:b8221deeaa87 | 108 | if( !setAmbientLightGain(DEFAULT_AGAIN) ) { |
Grimmkey | 0:b8221deeaa87 | 109 | return false; |
Grimmkey | 0:b8221deeaa87 | 110 | } |
Grimmkey | 0:b8221deeaa87 | 111 | //printf("ambient light gain set\r\n"); |
Grimmkey | 0:b8221deeaa87 | 112 | if( !setProxIntLowThresh(DEFAULT_PILT) ) { |
Grimmkey | 0:b8221deeaa87 | 113 | return false; |
Grimmkey | 0:b8221deeaa87 | 114 | } |
Grimmkey | 0:b8221deeaa87 | 115 | //printf("proxintlowthresh set\n\r"); |
Grimmkey | 0:b8221deeaa87 | 116 | if( !setProxIntHighThresh(DEFAULT_PIHT) ) { |
Grimmkey | 0:b8221deeaa87 | 117 | return false; |
Grimmkey | 0:b8221deeaa87 | 118 | } |
Grimmkey | 0:b8221deeaa87 | 119 | //printf("proxinthigh thresh set\r\n"); |
Grimmkey | 0:b8221deeaa87 | 120 | if( !setLightIntLowThreshold(DEFAULT_AILT) ) { |
Grimmkey | 0:b8221deeaa87 | 121 | return false; |
Grimmkey | 0:b8221deeaa87 | 122 | } |
Grimmkey | 0:b8221deeaa87 | 123 | //printf("light int low thresh set\r\n"); |
Grimmkey | 0:b8221deeaa87 | 124 | if( !setLightIntHighThreshold(DEFAULT_AIHT) ) { |
Grimmkey | 0:b8221deeaa87 | 125 | return false; |
Grimmkey | 0:b8221deeaa87 | 126 | } |
Grimmkey | 0:b8221deeaa87 | 127 | //printf("light int hight thresh set\n\r"); |
Grimmkey | 0:b8221deeaa87 | 128 | //printf("All set\n\r"); |
Grimmkey | 0:b8221deeaa87 | 129 | |
Grimmkey | 0:b8221deeaa87 | 130 | if( WriteDataByte(APDS9960_CONFIG2, DEFAULT_CONFIG2) ) { |
Grimmkey | 0:b8221deeaa87 | 131 | return false; |
Grimmkey | 0:b8221deeaa87 | 132 | } |
Grimmkey | 0:b8221deeaa87 | 133 | |
Grimmkey | 0:b8221deeaa87 | 134 | //printf("DEFAULT_CONFIG2:%u\n\r",DEFAULT_CONFIG2); |
Grimmkey | 0:b8221deeaa87 | 135 | if( WriteDataByte(APDS9960_CONFIG3, DEFAULT_CONFIG3) ) { |
Grimmkey | 0:b8221deeaa87 | 136 | return false; |
Grimmkey | 0:b8221deeaa87 | 137 | } |
Grimmkey | 0:b8221deeaa87 | 138 | //printf("DEFAULT_CONFIG3:%u\n\r",DEFAULT_CONFIG3); |
Grimmkey | 0:b8221deeaa87 | 139 | /* Set default values for gesture sense registers */ |
Grimmkey | 0:b8221deeaa87 | 140 | if( !setGestEnterThresh(DEFAULT_GPENTH) ) { |
Grimmkey | 0:b8221deeaa87 | 141 | return false; |
Grimmkey | 0:b8221deeaa87 | 142 | } |
Grimmkey | 0:b8221deeaa87 | 143 | |
Grimmkey | 0:b8221deeaa87 | 144 | //printf("Set Gesture Enter Thershold\n\r"); |
Grimmkey | 0:b8221deeaa87 | 145 | if( !setGestExitThresh(DEFAULT_GEXTH) ) { |
Grimmkey | 0:b8221deeaa87 | 146 | return false; |
Grimmkey | 0:b8221deeaa87 | 147 | } |
Grimmkey | 0:b8221deeaa87 | 148 | |
Grimmkey | 0:b8221deeaa87 | 149 | //printf("Set Gesture Exit Thershold\n\r"); |
Grimmkey | 0:b8221deeaa87 | 150 | if( WriteDataByte(APDS9960_GCONF1, DEFAULT_GCONF1) ) { |
Grimmkey | 0:b8221deeaa87 | 151 | return false; |
Grimmkey | 0:b8221deeaa87 | 152 | } |
Grimmkey | 0:b8221deeaa87 | 153 | |
Grimmkey | 0:b8221deeaa87 | 154 | //printf("DEFAULT_CONFIG1:%u\n\r",DEFAULT_CONFIG1); |
Grimmkey | 0:b8221deeaa87 | 155 | if( !setGestGain(DEFAULT_GGAIN) ) { |
Grimmkey | 0:b8221deeaa87 | 156 | return false; |
Grimmkey | 0:b8221deeaa87 | 157 | } |
Grimmkey | 0:b8221deeaa87 | 158 | //printf("Set Gest Gain\n\r"); |
Grimmkey | 0:b8221deeaa87 | 159 | |
Grimmkey | 0:b8221deeaa87 | 160 | if( !setGestLEDDrive(DEFAULT_GLDRIVE) ) { |
Grimmkey | 0:b8221deeaa87 | 161 | return false; |
Grimmkey | 0:b8221deeaa87 | 162 | } |
Grimmkey | 0:b8221deeaa87 | 163 | |
Grimmkey | 0:b8221deeaa87 | 164 | //printf("Set Gest LED Drive\n\r"); |
Grimmkey | 0:b8221deeaa87 | 165 | if( !setGestWaitTime(DEFAULT_GWTIME) ) { |
Grimmkey | 0:b8221deeaa87 | 166 | return false; |
Grimmkey | 0:b8221deeaa87 | 167 | } |
Grimmkey | 0:b8221deeaa87 | 168 | //printf("set gest wait time\n\r"); |
Grimmkey | 0:b8221deeaa87 | 169 | |
Grimmkey | 0:b8221deeaa87 | 170 | if( WriteDataByte(APDS9960_GOFFSET_U, DEFAULT_GOFFSET) ) { |
Grimmkey | 0:b8221deeaa87 | 171 | return false; |
Grimmkey | 0:b8221deeaa87 | 172 | } |
Grimmkey | 0:b8221deeaa87 | 173 | |
Grimmkey | 0:b8221deeaa87 | 174 | |
Grimmkey | 0:b8221deeaa87 | 175 | if( WriteDataByte(APDS9960_GOFFSET_D, DEFAULT_GOFFSET) ) { |
Grimmkey | 0:b8221deeaa87 | 176 | return false; |
Grimmkey | 0:b8221deeaa87 | 177 | } |
Grimmkey | 0:b8221deeaa87 | 178 | |
Grimmkey | 0:b8221deeaa87 | 179 | |
Grimmkey | 0:b8221deeaa87 | 180 | if( WriteDataByte(APDS9960_GOFFSET_L, DEFAULT_GOFFSET) ) { |
Grimmkey | 0:b8221deeaa87 | 181 | return false; |
Grimmkey | 0:b8221deeaa87 | 182 | } |
Grimmkey | 0:b8221deeaa87 | 183 | |
Grimmkey | 0:b8221deeaa87 | 184 | |
Grimmkey | 0:b8221deeaa87 | 185 | if( WriteDataByte(APDS9960_GOFFSET_R, DEFAULT_GOFFSET) ) { |
Grimmkey | 0:b8221deeaa87 | 186 | return false; |
Grimmkey | 0:b8221deeaa87 | 187 | } |
Grimmkey | 0:b8221deeaa87 | 188 | |
Grimmkey | 0:b8221deeaa87 | 189 | |
Grimmkey | 0:b8221deeaa87 | 190 | if( WriteDataByte(APDS9960_GPULSE, DEFAULT_GPULSE) ) { |
Grimmkey | 0:b8221deeaa87 | 191 | return false; |
Grimmkey | 0:b8221deeaa87 | 192 | } |
Grimmkey | 0:b8221deeaa87 | 193 | |
Grimmkey | 0:b8221deeaa87 | 194 | |
Grimmkey | 0:b8221deeaa87 | 195 | if( WriteDataByte(APDS9960_GCONF3, DEFAULT_GCONF3) ) { |
Grimmkey | 0:b8221deeaa87 | 196 | return false; |
Grimmkey | 0:b8221deeaa87 | 197 | } |
Grimmkey | 0:b8221deeaa87 | 198 | |
Grimmkey | 0:b8221deeaa87 | 199 | |
Grimmkey | 0:b8221deeaa87 | 200 | if( !setGestIntEnable(DEFAULT_GIEN) ) { |
Grimmkey | 0:b8221deeaa87 | 201 | return false; |
Grimmkey | 0:b8221deeaa87 | 202 | } |
Grimmkey | 0:b8221deeaa87 | 203 | |
Grimmkey | 0:b8221deeaa87 | 204 | return true; |
Grimmkey | 0:b8221deeaa87 | 205 | }; |
Grimmkey | 0:b8221deeaa87 | 206 | |
Grimmkey | 0:b8221deeaa87 | 207 | |
Grimmkey | 0:b8221deeaa87 | 208 | |
Grimmkey | 0:b8221deeaa87 | 209 | uint8_t APDS9960::getMode() |
Grimmkey | 0:b8221deeaa87 | 210 | { |
Grimmkey | 0:b8221deeaa87 | 211 | uint8_t enable_value= ReadDataByte(APDS9960_ENABLE); |
Grimmkey | 0:b8221deeaa87 | 212 | |
Grimmkey | 0:b8221deeaa87 | 213 | /* Read current ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 214 | if( enable_value == ERROR) { |
Grimmkey | 0:b8221deeaa87 | 215 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 216 | } |
Grimmkey | 0:b8221deeaa87 | 217 | // //printf("enable_value:%u\r\n", enable_value); |
Grimmkey | 0:b8221deeaa87 | 218 | |
Grimmkey | 0:b8221deeaa87 | 219 | return enable_value; |
Grimmkey | 0:b8221deeaa87 | 220 | } |
Grimmkey | 0:b8221deeaa87 | 221 | |
Grimmkey | 0:b8221deeaa87 | 222 | bool APDS9960::setMode(uint8_t mode, uint8_t enable) |
Grimmkey | 0:b8221deeaa87 | 223 | { |
Grimmkey | 0:b8221deeaa87 | 224 | uint8_t reg_val; |
Grimmkey | 0:b8221deeaa87 | 225 | /* Read current ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 226 | reg_val = getMode(); |
Grimmkey | 0:b8221deeaa87 | 227 | //printf("reg_val:%u\r\n", reg_val); |
Grimmkey | 0:b8221deeaa87 | 228 | if( reg_val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 229 | return false; |
Grimmkey | 0:b8221deeaa87 | 230 | } |
Grimmkey | 0:b8221deeaa87 | 231 | /* Change bit(s) in ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 232 | enable = enable & 0x01; |
Grimmkey | 0:b8221deeaa87 | 233 | if(mode <= 6 ) { |
Grimmkey | 0:b8221deeaa87 | 234 | if (enable) { |
Grimmkey | 0:b8221deeaa87 | 235 | reg_val |= (1 << mode); |
Grimmkey | 0:b8221deeaa87 | 236 | } else { |
Grimmkey | 0:b8221deeaa87 | 237 | reg_val &= ~(1 << mode); |
Grimmkey | 0:b8221deeaa87 | 238 | } |
Grimmkey | 0:b8221deeaa87 | 239 | } else if( mode == ALL ) { |
Grimmkey | 0:b8221deeaa87 | 240 | if (enable) { |
Grimmkey | 0:b8221deeaa87 | 241 | reg_val = 0x7F; |
Grimmkey | 0:b8221deeaa87 | 242 | } else { |
Grimmkey | 0:b8221deeaa87 | 243 | reg_val = 0x00; |
Grimmkey | 0:b8221deeaa87 | 244 | } |
Grimmkey | 0:b8221deeaa87 | 245 | } |
Grimmkey | 0:b8221deeaa87 | 246 | /* Write value back to ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 247 | if( WriteDataByte(APDS9960_ENABLE, reg_val) ) { |
Grimmkey | 0:b8221deeaa87 | 248 | return false; |
Grimmkey | 0:b8221deeaa87 | 249 | } |
Grimmkey | 0:b8221deeaa87 | 250 | return true; |
Grimmkey | 0:b8221deeaa87 | 251 | } |
Grimmkey | 0:b8221deeaa87 | 252 | |
Grimmkey | 0:b8221deeaa87 | 253 | bool APDS9960::enPower() |
Grimmkey | 0:b8221deeaa87 | 254 | { |
Grimmkey | 0:b8221deeaa87 | 255 | if( !setMode(POWER, 1) ) { |
Grimmkey | 0:b8221deeaa87 | 256 | return false; |
Grimmkey | 0:b8221deeaa87 | 257 | } |
Grimmkey | 0:b8221deeaa87 | 258 | return true; |
Grimmkey | 0:b8221deeaa87 | 259 | } |
Grimmkey | 0:b8221deeaa87 | 260 | |
Grimmkey | 0:b8221deeaa87 | 261 | bool APDS9960::disPower() |
Grimmkey | 0:b8221deeaa87 | 262 | { |
Grimmkey | 0:b8221deeaa87 | 263 | if( !setMode(POWER, 0) ) { |
Grimmkey | 0:b8221deeaa87 | 264 | return false; |
Grimmkey | 0:b8221deeaa87 | 265 | } |
Grimmkey | 0:b8221deeaa87 | 266 | return true; |
Grimmkey | 0:b8221deeaa87 | 267 | } |
Grimmkey | 0:b8221deeaa87 | 268 | |
Grimmkey | 0:b8221deeaa87 | 269 | bool APDS9960::enLightSens(bool interrupts) |
Grimmkey | 0:b8221deeaa87 | 270 | { |
Grimmkey | 0:b8221deeaa87 | 271 | /* Set default gain, interrupts, enable power, and enable sensor */ |
Grimmkey | 0:b8221deeaa87 | 272 | if( !setAmbientLightGain(DEFAULT_AGAIN) ) { |
Grimmkey | 0:b8221deeaa87 | 273 | return false; |
Grimmkey | 0:b8221deeaa87 | 274 | } |
Grimmkey | 0:b8221deeaa87 | 275 | if( interrupts ) { |
Grimmkey | 0:b8221deeaa87 | 276 | if( !setAmbientLightIntEnable(1) ) { |
Grimmkey | 0:b8221deeaa87 | 277 | return false; |
Grimmkey | 0:b8221deeaa87 | 278 | } |
Grimmkey | 0:b8221deeaa87 | 279 | } else { |
Grimmkey | 0:b8221deeaa87 | 280 | if( !setAmbientLightIntEnable(0) ) { |
Grimmkey | 0:b8221deeaa87 | 281 | return false; |
Grimmkey | 0:b8221deeaa87 | 282 | } |
Grimmkey | 0:b8221deeaa87 | 283 | } |
Grimmkey | 0:b8221deeaa87 | 284 | if( !enPower() ){ |
Grimmkey | 0:b8221deeaa87 | 285 | return false; |
Grimmkey | 0:b8221deeaa87 | 286 | } |
Grimmkey | 0:b8221deeaa87 | 287 | if( !setMode(AMBIENT_LIGHT, 1) ) { |
Grimmkey | 0:b8221deeaa87 | 288 | return false; |
Grimmkey | 0:b8221deeaa87 | 289 | } |
Grimmkey | 0:b8221deeaa87 | 290 | |
Grimmkey | 0:b8221deeaa87 | 291 | return true; |
Grimmkey | 0:b8221deeaa87 | 292 | |
Grimmkey | 0:b8221deeaa87 | 293 | } |
Grimmkey | 0:b8221deeaa87 | 294 | |
Grimmkey | 0:b8221deeaa87 | 295 | bool APDS9960::disLightSens() |
Grimmkey | 0:b8221deeaa87 | 296 | { |
Grimmkey | 0:b8221deeaa87 | 297 | if( !setAmbientLightIntEnable(0) ) { |
Grimmkey | 0:b8221deeaa87 | 298 | return false; |
Grimmkey | 0:b8221deeaa87 | 299 | } |
Grimmkey | 0:b8221deeaa87 | 300 | if( !setMode(AMBIENT_LIGHT, 0) ) { |
Grimmkey | 0:b8221deeaa87 | 301 | return false; |
Grimmkey | 0:b8221deeaa87 | 302 | } |
Grimmkey | 0:b8221deeaa87 | 303 | |
Grimmkey | 0:b8221deeaa87 | 304 | return true; |
Grimmkey | 0:b8221deeaa87 | 305 | } |
Grimmkey | 0:b8221deeaa87 | 306 | |
Grimmkey | 0:b8221deeaa87 | 307 | bool APDS9960::enProxSens(bool interrupts ) |
Grimmkey | 0:b8221deeaa87 | 308 | { |
Grimmkey | 0:b8221deeaa87 | 309 | /* Set default gain, LED, interrupts, enable power, and enable sensor */ |
Grimmkey | 0:b8221deeaa87 | 310 | if( !setProxGain(DEFAULT_PGAIN) ) { |
Grimmkey | 0:b8221deeaa87 | 311 | return false; |
Grimmkey | 0:b8221deeaa87 | 312 | } |
Grimmkey | 0:b8221deeaa87 | 313 | if( !setLEDDrive(DEFAULT_LDRIVE) ) { |
Grimmkey | 0:b8221deeaa87 | 314 | return false; |
Grimmkey | 0:b8221deeaa87 | 315 | } |
Grimmkey | 0:b8221deeaa87 | 316 | if( interrupts ) { |
Grimmkey | 0:b8221deeaa87 | 317 | if( !setProxIntEnable(1) ) { |
Grimmkey | 0:b8221deeaa87 | 318 | return false; |
Grimmkey | 0:b8221deeaa87 | 319 | } |
Grimmkey | 0:b8221deeaa87 | 320 | } else { |
Grimmkey | 0:b8221deeaa87 | 321 | if( !setProxIntEnable(0) ) { |
Grimmkey | 0:b8221deeaa87 | 322 | return false; |
Grimmkey | 0:b8221deeaa87 | 323 | } |
Grimmkey | 0:b8221deeaa87 | 324 | } |
Grimmkey | 0:b8221deeaa87 | 325 | if( !enPower() ){ |
Grimmkey | 0:b8221deeaa87 | 326 | return false; |
Grimmkey | 0:b8221deeaa87 | 327 | } |
Grimmkey | 0:b8221deeaa87 | 328 | if( !setMode(PROXIMITY, 1) ) { |
Grimmkey | 0:b8221deeaa87 | 329 | return false; |
Grimmkey | 0:b8221deeaa87 | 330 | } |
Grimmkey | 0:b8221deeaa87 | 331 | |
Grimmkey | 0:b8221deeaa87 | 332 | return true; |
Grimmkey | 0:b8221deeaa87 | 333 | } |
Grimmkey | 0:b8221deeaa87 | 334 | |
Grimmkey | 0:b8221deeaa87 | 335 | bool APDS9960::disProxSens(){ |
Grimmkey | 0:b8221deeaa87 | 336 | if( !setProxIntEnable(0) ) { |
Grimmkey | 0:b8221deeaa87 | 337 | return false; |
Grimmkey | 0:b8221deeaa87 | 338 | } |
Grimmkey | 0:b8221deeaa87 | 339 | if( !setMode(PROXIMITY, 0) ) { |
Grimmkey | 0:b8221deeaa87 | 340 | return false; |
Grimmkey | 0:b8221deeaa87 | 341 | } |
Grimmkey | 0:b8221deeaa87 | 342 | |
Grimmkey | 0:b8221deeaa87 | 343 | return true; |
Grimmkey | 0:b8221deeaa87 | 344 | } |
Grimmkey | 0:b8221deeaa87 | 345 | |
Grimmkey | 0:b8221deeaa87 | 346 | bool APDS9960::enGestSens(bool interrupts) |
Grimmkey | 0:b8221deeaa87 | 347 | { |
Grimmkey | 0:b8221deeaa87 | 348 | /* Enable gesture mode |
Grimmkey | 0:b8221deeaa87 | 349 | Set ENABLE to 0 (power off) |
Grimmkey | 0:b8221deeaa87 | 350 | Set WTIME to 0xFF |
Grimmkey | 0:b8221deeaa87 | 351 | Set AUX to LED_BOOST_300 |
Grimmkey | 0:b8221deeaa87 | 352 | Enable PON, WEN, PEN, GEN in ENABLE |
Grimmkey | 0:b8221deeaa87 | 353 | */ |
Grimmkey | 0:b8221deeaa87 | 354 | rstGestParameters(); |
Grimmkey | 0:b8221deeaa87 | 355 | if( WriteDataByte(APDS9960_WTIME, 0xFF) ) { |
Grimmkey | 0:b8221deeaa87 | 356 | return false; |
Grimmkey | 0:b8221deeaa87 | 357 | } |
Grimmkey | 0:b8221deeaa87 | 358 | if( WriteDataByte(APDS9960_PPULSE, DEFAULT_GEST_PPULSE) ) { |
Grimmkey | 0:b8221deeaa87 | 359 | return false; |
Grimmkey | 0:b8221deeaa87 | 360 | } |
Grimmkey | 0:b8221deeaa87 | 361 | if( !setLEDBoost(LED_BOOST_300) ) { |
Grimmkey | 0:b8221deeaa87 | 362 | return false; |
Grimmkey | 0:b8221deeaa87 | 363 | } |
Grimmkey | 0:b8221deeaa87 | 364 | if( interrupts ) { |
Grimmkey | 0:b8221deeaa87 | 365 | if( !setGestIntEnable(1) ) { |
Grimmkey | 0:b8221deeaa87 | 366 | return false; |
Grimmkey | 0:b8221deeaa87 | 367 | } |
Grimmkey | 0:b8221deeaa87 | 368 | } else { |
Grimmkey | 0:b8221deeaa87 | 369 | if( !setGestIntEnable(0) ) { |
Grimmkey | 0:b8221deeaa87 | 370 | return false; |
Grimmkey | 0:b8221deeaa87 | 371 | } |
Grimmkey | 0:b8221deeaa87 | 372 | } |
Grimmkey | 0:b8221deeaa87 | 373 | if( !setGestMode(1) ) { |
Grimmkey | 0:b8221deeaa87 | 374 | return false; |
Grimmkey | 0:b8221deeaa87 | 375 | } |
Grimmkey | 0:b8221deeaa87 | 376 | if( !enPower() ) { |
Grimmkey | 0:b8221deeaa87 | 377 | return false; |
Grimmkey | 0:b8221deeaa87 | 378 | } |
Grimmkey | 0:b8221deeaa87 | 379 | if( !setMode(WAIT, 1) ) { |
Grimmkey | 0:b8221deeaa87 | 380 | return false; |
Grimmkey | 0:b8221deeaa87 | 381 | } |
Grimmkey | 0:b8221deeaa87 | 382 | if( !setMode(PROXIMITY, 1) ) { |
Grimmkey | 0:b8221deeaa87 | 383 | return false; |
Grimmkey | 0:b8221deeaa87 | 384 | } |
Grimmkey | 0:b8221deeaa87 | 385 | if( !setMode(GESTURE, 1) ) { |
Grimmkey | 0:b8221deeaa87 | 386 | return false; |
Grimmkey | 0:b8221deeaa87 | 387 | } |
Grimmkey | 0:b8221deeaa87 | 388 | //printf("gestures enabled"); |
Grimmkey | 0:b8221deeaa87 | 389 | return true; |
Grimmkey | 0:b8221deeaa87 | 390 | } |
Grimmkey | 0:b8221deeaa87 | 391 | |
Grimmkey | 0:b8221deeaa87 | 392 | bool APDS9960::disGestSens() |
Grimmkey | 0:b8221deeaa87 | 393 | { |
Grimmkey | 0:b8221deeaa87 | 394 | rstGestParameters(); |
Grimmkey | 0:b8221deeaa87 | 395 | if( !setGestIntEnable(0) ) { |
Grimmkey | 0:b8221deeaa87 | 396 | return false; |
Grimmkey | 0:b8221deeaa87 | 397 | } |
Grimmkey | 0:b8221deeaa87 | 398 | if( !setGestMode(0) ) { |
Grimmkey | 0:b8221deeaa87 | 399 | return false; |
Grimmkey | 0:b8221deeaa87 | 400 | } |
Grimmkey | 0:b8221deeaa87 | 401 | if( !setMode(GESTURE, 0) ) { |
Grimmkey | 0:b8221deeaa87 | 402 | return false; |
Grimmkey | 0:b8221deeaa87 | 403 | } |
Grimmkey | 0:b8221deeaa87 | 404 | return true; |
Grimmkey | 0:b8221deeaa87 | 405 | } |
Grimmkey | 0:b8221deeaa87 | 406 | |
Grimmkey | 0:b8221deeaa87 | 407 | uint8_t APDS9960::getLEDDrive() |
Grimmkey | 0:b8221deeaa87 | 408 | { |
Grimmkey | 0:b8221deeaa87 | 409 | uint8_t val = ReadDataByte(APDS9960_CONTROL); |
Grimmkey | 0:b8221deeaa87 | 410 | |
Grimmkey | 0:b8221deeaa87 | 411 | /* Read value from CONTROL register */ |
Grimmkey | 0:b8221deeaa87 | 412 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 413 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 414 | } |
Grimmkey | 0:b8221deeaa87 | 415 | |
Grimmkey | 0:b8221deeaa87 | 416 | /* Shift and mask out LED drive bits */ |
Grimmkey | 0:b8221deeaa87 | 417 | val = (val >> 6) & 0x03; |
Grimmkey | 0:b8221deeaa87 | 418 | |
Grimmkey | 0:b8221deeaa87 | 419 | return val; |
Grimmkey | 0:b8221deeaa87 | 420 | } |
Grimmkey | 0:b8221deeaa87 | 421 | |
Grimmkey | 0:b8221deeaa87 | 422 | bool APDS9960::setLEDDrive(uint8_t drive) |
Grimmkey | 0:b8221deeaa87 | 423 | { |
Grimmkey | 0:b8221deeaa87 | 424 | uint8_t val = ReadDataByte(APDS9960_CONTROL); |
Grimmkey | 0:b8221deeaa87 | 425 | |
Grimmkey | 0:b8221deeaa87 | 426 | /* Read value from CONTROL register */ |
Grimmkey | 0:b8221deeaa87 | 427 | if( val == ERROR) { |
Grimmkey | 0:b8221deeaa87 | 428 | return false; |
Grimmkey | 0:b8221deeaa87 | 429 | } |
Grimmkey | 0:b8221deeaa87 | 430 | |
Grimmkey | 0:b8221deeaa87 | 431 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 432 | drive &= 0x03; |
Grimmkey | 0:b8221deeaa87 | 433 | drive = drive << 6; |
Grimmkey | 0:b8221deeaa87 | 434 | val &= 0x3F; |
Grimmkey | 0:b8221deeaa87 | 435 | val |= drive; |
Grimmkey | 0:b8221deeaa87 | 436 | |
Grimmkey | 0:b8221deeaa87 | 437 | /* Write register value back into CONTROL register */ |
Grimmkey | 0:b8221deeaa87 | 438 | if( WriteDataByte(APDS9960_CONTROL, val) ) { |
Grimmkey | 0:b8221deeaa87 | 439 | return false; |
Grimmkey | 0:b8221deeaa87 | 440 | } |
Grimmkey | 0:b8221deeaa87 | 441 | |
Grimmkey | 0:b8221deeaa87 | 442 | return true; |
Grimmkey | 0:b8221deeaa87 | 443 | } |
Grimmkey | 0:b8221deeaa87 | 444 | |
Grimmkey | 0:b8221deeaa87 | 445 | uint8_t APDS9960::getGestLEDDrive() |
Grimmkey | 0:b8221deeaa87 | 446 | { |
Grimmkey | 0:b8221deeaa87 | 447 | uint8_t val=ReadDataByte(APDS9960_GCONF2); |
Grimmkey | 0:b8221deeaa87 | 448 | /* Read valeue from GCONF2 register */ |
Grimmkey | 0:b8221deeaa87 | 449 | if( val == ERROR) { |
Grimmkey | 0:b8221deeaa87 | 450 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 451 | } |
Grimmkey | 0:b8221deeaa87 | 452 | /* Shift and mask out GLDRIVE bits */ |
Grimmkey | 0:b8221deeaa87 | 453 | val = (val >> 3) & 0x03; |
Grimmkey | 0:b8221deeaa87 | 454 | return val; |
Grimmkey | 0:b8221deeaa87 | 455 | } |
Grimmkey | 0:b8221deeaa87 | 456 | |
Grimmkey | 0:b8221deeaa87 | 457 | bool APDS9960::setGestLEDDrive(uint8_t drive) |
Grimmkey | 0:b8221deeaa87 | 458 | { |
Grimmkey | 0:b8221deeaa87 | 459 | uint8_t val =ReadDataByte(APDS9960_GCONF2); |
Grimmkey | 0:b8221deeaa87 | 460 | |
Grimmkey | 0:b8221deeaa87 | 461 | /* Read value from GCONF2 register */ |
Grimmkey | 0:b8221deeaa87 | 462 | |
Grimmkey | 0:b8221deeaa87 | 463 | if( val == ERROR){ |
Grimmkey | 0:b8221deeaa87 | 464 | return false; |
Grimmkey | 0:b8221deeaa87 | 465 | } |
Grimmkey | 0:b8221deeaa87 | 466 | |
Grimmkey | 0:b8221deeaa87 | 467 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 468 | drive &= 0x03;//0b00000011; |
Grimmkey | 0:b8221deeaa87 | 469 | drive = drive << 3; |
Grimmkey | 0:b8221deeaa87 | 470 | val &= 0xE7;//0b11100111; |
Grimmkey | 0:b8221deeaa87 | 471 | val |= drive; |
Grimmkey | 0:b8221deeaa87 | 472 | |
Grimmkey | 0:b8221deeaa87 | 473 | /* Write register value back into GCONF2 register */ |
Grimmkey | 0:b8221deeaa87 | 474 | if( WriteDataByte(APDS9960_GCONF2, val)){ |
Grimmkey | 0:b8221deeaa87 | 475 | return false; |
Grimmkey | 0:b8221deeaa87 | 476 | } |
Grimmkey | 0:b8221deeaa87 | 477 | |
Grimmkey | 0:b8221deeaa87 | 478 | return true; |
Grimmkey | 0:b8221deeaa87 | 479 | } |
Grimmkey | 0:b8221deeaa87 | 480 | |
Grimmkey | 0:b8221deeaa87 | 481 | /* Gain control */ |
Grimmkey | 0:b8221deeaa87 | 482 | uint8_t APDS9960::getAmbientLightGain() |
Grimmkey | 0:b8221deeaa87 | 483 | { |
Grimmkey | 0:b8221deeaa87 | 484 | uint8_t val = ReadDataByte(APDS9960_CONTROL); |
Grimmkey | 0:b8221deeaa87 | 485 | |
Grimmkey | 0:b8221deeaa87 | 486 | /* Read value from CONTROL register */ |
Grimmkey | 0:b8221deeaa87 | 487 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 488 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 489 | } |
Grimmkey | 0:b8221deeaa87 | 490 | |
Grimmkey | 0:b8221deeaa87 | 491 | /* Shift and mask out ADRIVE bits */ |
Grimmkey | 0:b8221deeaa87 | 492 | val &= 0x03; |
Grimmkey | 0:b8221deeaa87 | 493 | |
Grimmkey | 0:b8221deeaa87 | 494 | return val; |
Grimmkey | 0:b8221deeaa87 | 495 | } |
Grimmkey | 0:b8221deeaa87 | 496 | |
Grimmkey | 0:b8221deeaa87 | 497 | bool APDS9960::setAmbientLightGain(uint8_t gain) |
Grimmkey | 0:b8221deeaa87 | 498 | { |
Grimmkey | 0:b8221deeaa87 | 499 | uint8_t val = ReadDataByte(APDS9960_ENABLE); |
Grimmkey | 0:b8221deeaa87 | 500 | |
Grimmkey | 0:b8221deeaa87 | 501 | /* Read value from CONTROL register */ |
Grimmkey | 0:b8221deeaa87 | 502 | |
Grimmkey | 0:b8221deeaa87 | 503 | if( val == ERROR){//!wireReadDataByte(APDS9960_CONTROL, val) ) { |
Grimmkey | 0:b8221deeaa87 | 504 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 505 | } |
Grimmkey | 0:b8221deeaa87 | 506 | |
Grimmkey | 0:b8221deeaa87 | 507 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 508 | gain &= 0x03; |
Grimmkey | 0:b8221deeaa87 | 509 | gain = gain << 2; |
Grimmkey | 0:b8221deeaa87 | 510 | val &= 0xF3; |
Grimmkey | 0:b8221deeaa87 | 511 | val |= gain; |
Grimmkey | 0:b8221deeaa87 | 512 | |
Grimmkey | 0:b8221deeaa87 | 513 | /*Write register value back into CONTROL register*/ |
Grimmkey | 0:b8221deeaa87 | 514 | if(WriteDataByte(APDS9960_CONTROL, val)){ |
Grimmkey | 0:b8221deeaa87 | 515 | return false; |
Grimmkey | 0:b8221deeaa87 | 516 | } |
Grimmkey | 0:b8221deeaa87 | 517 | return true; |
Grimmkey | 0:b8221deeaa87 | 518 | } |
Grimmkey | 0:b8221deeaa87 | 519 | |
Grimmkey | 0:b8221deeaa87 | 520 | uint8_t APDS9960::getProxGain() |
Grimmkey | 0:b8221deeaa87 | 521 | { |
Grimmkey | 0:b8221deeaa87 | 522 | uint8_t val = ReadDataByte(APDS9960_CONTROL); |
Grimmkey | 0:b8221deeaa87 | 523 | |
Grimmkey | 0:b8221deeaa87 | 524 | /* Read value from CONTROL register */ |
Grimmkey | 0:b8221deeaa87 | 525 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 526 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 527 | } |
Grimmkey | 0:b8221deeaa87 | 528 | |
Grimmkey | 0:b8221deeaa87 | 529 | /* Shift and mask out PDRIVE bits */ |
Grimmkey | 0:b8221deeaa87 | 530 | val = (val >> 2) & 0x03; |
Grimmkey | 0:b8221deeaa87 | 531 | |
Grimmkey | 0:b8221deeaa87 | 532 | return val; |
Grimmkey | 0:b8221deeaa87 | 533 | } |
Grimmkey | 0:b8221deeaa87 | 534 | |
Grimmkey | 0:b8221deeaa87 | 535 | bool APDS9960::setProxGain(uint8_t gain) |
Grimmkey | 0:b8221deeaa87 | 536 | { |
Grimmkey | 0:b8221deeaa87 | 537 | uint8_t val = ReadDataByte(APDS9960_CONTROL); |
Grimmkey | 0:b8221deeaa87 | 538 | |
Grimmkey | 0:b8221deeaa87 | 539 | /* Read value from CONTROL register */ |
Grimmkey | 0:b8221deeaa87 | 540 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 541 | return false; |
Grimmkey | 0:b8221deeaa87 | 542 | } |
Grimmkey | 0:b8221deeaa87 | 543 | |
Grimmkey | 0:b8221deeaa87 | 544 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 545 | gain &= 0x03; |
Grimmkey | 0:b8221deeaa87 | 546 | gain = gain << 2; |
Grimmkey | 0:b8221deeaa87 | 547 | val &= 0xF3; |
Grimmkey | 0:b8221deeaa87 | 548 | val |= gain; |
Grimmkey | 0:b8221deeaa87 | 549 | |
Grimmkey | 0:b8221deeaa87 | 550 | /* Write register value back into CONTROL register */ |
Grimmkey | 0:b8221deeaa87 | 551 | if( WriteDataByte(APDS9960_CONTROL, val) ) { |
Grimmkey | 0:b8221deeaa87 | 552 | return false; |
Grimmkey | 0:b8221deeaa87 | 553 | } |
Grimmkey | 0:b8221deeaa87 | 554 | |
Grimmkey | 0:b8221deeaa87 | 555 | return true; |
Grimmkey | 0:b8221deeaa87 | 556 | } |
Grimmkey | 0:b8221deeaa87 | 557 | |
Grimmkey | 0:b8221deeaa87 | 558 | uint8_t APDS9960::getGestGain() |
Grimmkey | 0:b8221deeaa87 | 559 | { |
Grimmkey | 0:b8221deeaa87 | 560 | uint8_t val = ReadDataByte(APDS9960_GCONF2); |
Grimmkey | 0:b8221deeaa87 | 561 | /* Read value from GCONF2 register */ |
Grimmkey | 0:b8221deeaa87 | 562 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 563 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 564 | } |
Grimmkey | 0:b8221deeaa87 | 565 | /* Shift and mask out GGAIN bits */ |
Grimmkey | 0:b8221deeaa87 | 566 | val = (val >> 5) & 0x03; |
Grimmkey | 0:b8221deeaa87 | 567 | return val; |
Grimmkey | 0:b8221deeaa87 | 568 | } |
Grimmkey | 0:b8221deeaa87 | 569 | |
Grimmkey | 0:b8221deeaa87 | 570 | bool APDS9960::setGestGain(uint8_t gain) |
Grimmkey | 0:b8221deeaa87 | 571 | { |
Grimmkey | 0:b8221deeaa87 | 572 | uint8_t val = ReadDataByte(APDS9960_GCONF2); |
Grimmkey | 0:b8221deeaa87 | 573 | /* Read value from GCONF2 register */ |
Grimmkey | 0:b8221deeaa87 | 574 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 575 | //printf("I'm over Here\r\n"); |
Grimmkey | 0:b8221deeaa87 | 576 | return false; |
Grimmkey | 0:b8221deeaa87 | 577 | } |
Grimmkey | 0:b8221deeaa87 | 578 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 579 | gain &= 0x03; |
Grimmkey | 0:b8221deeaa87 | 580 | gain = gain << 5; |
Grimmkey | 0:b8221deeaa87 | 581 | val &= 0x9F; |
Grimmkey | 0:b8221deeaa87 | 582 | val |= gain; |
Grimmkey | 0:b8221deeaa87 | 583 | /* Write register value back into GCONF2 register */ |
Grimmkey | 0:b8221deeaa87 | 584 | if( WriteDataByte(APDS9960_GCONF2, val) ) { |
Grimmkey | 0:b8221deeaa87 | 585 | //printf("Nope I'm over here!/r/n"); |
Grimmkey | 0:b8221deeaa87 | 586 | return false; |
Grimmkey | 0:b8221deeaa87 | 587 | |
Grimmkey | 0:b8221deeaa87 | 588 | } |
Grimmkey | 0:b8221deeaa87 | 589 | return true; |
Grimmkey | 0:b8221deeaa87 | 590 | } |
Grimmkey | 0:b8221deeaa87 | 591 | |
Grimmkey | 0:b8221deeaa87 | 592 | /* Get and set light interrupt thresholds */ |
Grimmkey | 0:b8221deeaa87 | 593 | bool APDS9960::getLightIntLowThreshold(uint16_t &threshold) |
Grimmkey | 0:b8221deeaa87 | 594 | { |
Grimmkey | 0:b8221deeaa87 | 595 | uint8_t val_byte = ReadDataByte(APDS9960_AILTL); |
Grimmkey | 0:b8221deeaa87 | 596 | threshold = 0; |
Grimmkey | 0:b8221deeaa87 | 597 | |
Grimmkey | 0:b8221deeaa87 | 598 | /* Read value from ambient light low threshold, low byte register */ |
Grimmkey | 0:b8221deeaa87 | 599 | if( val_byte == ERROR) { |
Grimmkey | 0:b8221deeaa87 | 600 | return false; |
Grimmkey | 0:b8221deeaa87 | 601 | } |
Grimmkey | 0:b8221deeaa87 | 602 | threshold = val_byte; |
Grimmkey | 0:b8221deeaa87 | 603 | |
Grimmkey | 0:b8221deeaa87 | 604 | /* Read value from ambient light low threshold, high byte register */ |
Grimmkey | 0:b8221deeaa87 | 605 | val_byte = ReadDataByte(APDS9960_AILTH); |
Grimmkey | 0:b8221deeaa87 | 606 | if( val_byte == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 607 | return false; |
Grimmkey | 0:b8221deeaa87 | 608 | } |
Grimmkey | 0:b8221deeaa87 | 609 | threshold = threshold + ((uint16_t)val_byte << 8); |
Grimmkey | 0:b8221deeaa87 | 610 | |
Grimmkey | 0:b8221deeaa87 | 611 | return true; |
Grimmkey | 0:b8221deeaa87 | 612 | } |
Grimmkey | 0:b8221deeaa87 | 613 | |
Grimmkey | 0:b8221deeaa87 | 614 | bool APDS9960::setLightIntLowThreshold(uint16_t threshold) |
Grimmkey | 0:b8221deeaa87 | 615 | { |
Grimmkey | 0:b8221deeaa87 | 616 | uint8_t val_low; |
Grimmkey | 0:b8221deeaa87 | 617 | uint8_t val_high; |
Grimmkey | 0:b8221deeaa87 | 618 | |
Grimmkey | 0:b8221deeaa87 | 619 | /* Break 16-bit threshold into 2 8-bit values */ |
Grimmkey | 0:b8221deeaa87 | 620 | val_low = threshold & 0x00FF; |
Grimmkey | 0:b8221deeaa87 | 621 | val_high = (threshold & 0xFF00) >> 8; |
Grimmkey | 0:b8221deeaa87 | 622 | |
Grimmkey | 0:b8221deeaa87 | 623 | /* Write low byte */ |
Grimmkey | 0:b8221deeaa87 | 624 | if( WriteDataByte(APDS9960_AILTL, val_low) ) { |
Grimmkey | 0:b8221deeaa87 | 625 | return false; |
Grimmkey | 0:b8221deeaa87 | 626 | } |
Grimmkey | 0:b8221deeaa87 | 627 | |
Grimmkey | 0:b8221deeaa87 | 628 | /* Write high byte */ |
Grimmkey | 0:b8221deeaa87 | 629 | if( WriteDataByte(APDS9960_AILTH, val_high) ) { |
Grimmkey | 0:b8221deeaa87 | 630 | return false; |
Grimmkey | 0:b8221deeaa87 | 631 | } |
Grimmkey | 0:b8221deeaa87 | 632 | |
Grimmkey | 0:b8221deeaa87 | 633 | return true; |
Grimmkey | 0:b8221deeaa87 | 634 | } |
Grimmkey | 0:b8221deeaa87 | 635 | |
Grimmkey | 0:b8221deeaa87 | 636 | bool APDS9960::getLightIntHighThreshold(uint16_t &threshold) |
Grimmkey | 0:b8221deeaa87 | 637 | { |
Grimmkey | 0:b8221deeaa87 | 638 | uint8_t val_byte = ReadDataByte(APDS9960_AIHTL); |
Grimmkey | 0:b8221deeaa87 | 639 | threshold = 0; |
Grimmkey | 0:b8221deeaa87 | 640 | |
Grimmkey | 0:b8221deeaa87 | 641 | /* Read value from ambient light high threshold, low byte register */ |
Grimmkey | 0:b8221deeaa87 | 642 | if( val_byte == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 643 | return false; |
Grimmkey | 0:b8221deeaa87 | 644 | } |
Grimmkey | 0:b8221deeaa87 | 645 | threshold = val_byte; |
Grimmkey | 0:b8221deeaa87 | 646 | |
Grimmkey | 0:b8221deeaa87 | 647 | /* Read value from ambient light high threshold, high byte register */ |
Grimmkey | 0:b8221deeaa87 | 648 | val_byte = ReadDataByte(APDS9960_AIHTH); |
Grimmkey | 0:b8221deeaa87 | 649 | if( val_byte == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 650 | return false; |
Grimmkey | 0:b8221deeaa87 | 651 | } |
Grimmkey | 0:b8221deeaa87 | 652 | threshold = threshold + ((uint16_t)val_byte << 8); |
Grimmkey | 0:b8221deeaa87 | 653 | |
Grimmkey | 0:b8221deeaa87 | 654 | return true; |
Grimmkey | 0:b8221deeaa87 | 655 | } |
Grimmkey | 0:b8221deeaa87 | 656 | |
Grimmkey | 0:b8221deeaa87 | 657 | bool APDS9960::setLightIntHighThreshold(uint16_t threshold) |
Grimmkey | 0:b8221deeaa87 | 658 | { |
Grimmkey | 0:b8221deeaa87 | 659 | uint8_t val_low; |
Grimmkey | 0:b8221deeaa87 | 660 | uint8_t val_high; |
Grimmkey | 0:b8221deeaa87 | 661 | |
Grimmkey | 0:b8221deeaa87 | 662 | /* Break 16-bit threshold into 2 8-bit values */ |
Grimmkey | 0:b8221deeaa87 | 663 | val_low = threshold & 0x00FF; |
Grimmkey | 0:b8221deeaa87 | 664 | val_high = (threshold & 0xFF00) >> 8; |
Grimmkey | 0:b8221deeaa87 | 665 | |
Grimmkey | 0:b8221deeaa87 | 666 | /* Write low byte */ |
Grimmkey | 0:b8221deeaa87 | 667 | if( WriteDataByte(APDS9960_AIHTL, val_low) ) { |
Grimmkey | 0:b8221deeaa87 | 668 | //printf("fail here\r\n"); |
Grimmkey | 0:b8221deeaa87 | 669 | return false; |
Grimmkey | 0:b8221deeaa87 | 670 | } |
Grimmkey | 0:b8221deeaa87 | 671 | |
Grimmkey | 0:b8221deeaa87 | 672 | /* Write high byte */ |
Grimmkey | 0:b8221deeaa87 | 673 | if( WriteDataByte(APDS9960_AIHTH, val_high) ) { |
Grimmkey | 0:b8221deeaa87 | 674 | //printf("fail over here\r\n"); |
Grimmkey | 0:b8221deeaa87 | 675 | return false; |
Grimmkey | 0:b8221deeaa87 | 676 | } |
Grimmkey | 0:b8221deeaa87 | 677 | |
Grimmkey | 0:b8221deeaa87 | 678 | return true; |
Grimmkey | 0:b8221deeaa87 | 679 | } |
Grimmkey | 0:b8221deeaa87 | 680 | |
Grimmkey | 0:b8221deeaa87 | 681 | /* Get and set proximity interrupt thresholds */ |
Grimmkey | 0:b8221deeaa87 | 682 | bool APDS9960::getProxIntLowThreshold(uint8_t &threshold) |
Grimmkey | 0:b8221deeaa87 | 683 | { |
Grimmkey | 0:b8221deeaa87 | 684 | |
Grimmkey | 0:b8221deeaa87 | 685 | |
Grimmkey | 0:b8221deeaa87 | 686 | /* Read value from proximity low threshold register */ |
Grimmkey | 0:b8221deeaa87 | 687 | threshold = ReadDataByte(APDS9960_PILT); |
Grimmkey | 0:b8221deeaa87 | 688 | if( threshold == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 689 | threshold = 0; |
Grimmkey | 0:b8221deeaa87 | 690 | return false; |
Grimmkey | 0:b8221deeaa87 | 691 | } |
Grimmkey | 0:b8221deeaa87 | 692 | |
Grimmkey | 0:b8221deeaa87 | 693 | return true; |
Grimmkey | 0:b8221deeaa87 | 694 | } |
Grimmkey | 0:b8221deeaa87 | 695 | |
Grimmkey | 0:b8221deeaa87 | 696 | bool APDS9960::setProxIntLowThreshold(uint8_t threshold) |
Grimmkey | 0:b8221deeaa87 | 697 | { |
Grimmkey | 0:b8221deeaa87 | 698 | /* Write threshold value to register */ |
Grimmkey | 0:b8221deeaa87 | 699 | if( WriteDataByte(APDS9960_PILT, threshold) ) { |
Grimmkey | 0:b8221deeaa87 | 700 | return false; |
Grimmkey | 0:b8221deeaa87 | 701 | } |
Grimmkey | 0:b8221deeaa87 | 702 | |
Grimmkey | 0:b8221deeaa87 | 703 | return true; |
Grimmkey | 0:b8221deeaa87 | 704 | } |
Grimmkey | 0:b8221deeaa87 | 705 | |
Grimmkey | 0:b8221deeaa87 | 706 | bool APDS9960::getProxIntHighThreshold(uint8_t &threshold) |
Grimmkey | 0:b8221deeaa87 | 707 | { |
Grimmkey | 0:b8221deeaa87 | 708 | threshold = 0; |
Grimmkey | 0:b8221deeaa87 | 709 | |
Grimmkey | 0:b8221deeaa87 | 710 | /* Read value from proximity low threshold register */ |
Grimmkey | 0:b8221deeaa87 | 711 | threshold = ReadDataByte(APDS9960_PIHT); |
Grimmkey | 0:b8221deeaa87 | 712 | if( threshold == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 713 | threshold = 0; |
Grimmkey | 0:b8221deeaa87 | 714 | return false; |
Grimmkey | 0:b8221deeaa87 | 715 | } |
Grimmkey | 0:b8221deeaa87 | 716 | |
Grimmkey | 0:b8221deeaa87 | 717 | return true; |
Grimmkey | 0:b8221deeaa87 | 718 | } |
Grimmkey | 0:b8221deeaa87 | 719 | |
Grimmkey | 0:b8221deeaa87 | 720 | bool APDS9960::setProxIntHighThreshold(uint8_t threshold) |
Grimmkey | 0:b8221deeaa87 | 721 | { |
Grimmkey | 0:b8221deeaa87 | 722 | /* Write threshold value to register */ |
Grimmkey | 0:b8221deeaa87 | 723 | if( WriteDataByte(APDS9960_PIHT, threshold) ) { |
Grimmkey | 0:b8221deeaa87 | 724 | return false; |
Grimmkey | 0:b8221deeaa87 | 725 | } |
Grimmkey | 0:b8221deeaa87 | 726 | |
Grimmkey | 0:b8221deeaa87 | 727 | return true; |
Grimmkey | 0:b8221deeaa87 | 728 | } |
Grimmkey | 0:b8221deeaa87 | 729 | |
Grimmkey | 0:b8221deeaa87 | 730 | /* Get and set interrupt enables */ |
Grimmkey | 0:b8221deeaa87 | 731 | uint8_t APDS9960::getAmbientLightIntEnable() |
Grimmkey | 0:b8221deeaa87 | 732 | { |
Grimmkey | 0:b8221deeaa87 | 733 | uint8_t val = ReadDataByte(APDS9960_ENABLE); |
Grimmkey | 0:b8221deeaa87 | 734 | |
Grimmkey | 0:b8221deeaa87 | 735 | /* Read value from ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 736 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 737 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 738 | } |
Grimmkey | 0:b8221deeaa87 | 739 | |
Grimmkey | 0:b8221deeaa87 | 740 | /* Shift and mask out AIEN bit */ |
Grimmkey | 0:b8221deeaa87 | 741 | val = (val >> 4) & 0x01; |
Grimmkey | 0:b8221deeaa87 | 742 | |
Grimmkey | 0:b8221deeaa87 | 743 | return val; |
Grimmkey | 0:b8221deeaa87 | 744 | } |
Grimmkey | 0:b8221deeaa87 | 745 | |
Grimmkey | 0:b8221deeaa87 | 746 | bool APDS9960::setAmbientLightIntEnable(uint8_t enable) |
Grimmkey | 0:b8221deeaa87 | 747 | { |
Grimmkey | 0:b8221deeaa87 | 748 | uint8_t val = ReadDataByte(APDS9960_ENABLE); |
Grimmkey | 0:b8221deeaa87 | 749 | |
Grimmkey | 0:b8221deeaa87 | 750 | /* Read value from ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 751 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 752 | return false; |
Grimmkey | 0:b8221deeaa87 | 753 | } |
Grimmkey | 0:b8221deeaa87 | 754 | |
Grimmkey | 0:b8221deeaa87 | 755 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 756 | enable &= 0x01; |
Grimmkey | 0:b8221deeaa87 | 757 | enable = enable << 4; |
Grimmkey | 0:b8221deeaa87 | 758 | val &= 0xEF; |
Grimmkey | 0:b8221deeaa87 | 759 | val |= enable; |
Grimmkey | 0:b8221deeaa87 | 760 | |
Grimmkey | 0:b8221deeaa87 | 761 | /* Write register value back into ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 762 | if( WriteDataByte(APDS9960_ENABLE, val) ) { |
Grimmkey | 0:b8221deeaa87 | 763 | return false; |
Grimmkey | 0:b8221deeaa87 | 764 | } |
Grimmkey | 0:b8221deeaa87 | 765 | |
Grimmkey | 0:b8221deeaa87 | 766 | return true; |
Grimmkey | 0:b8221deeaa87 | 767 | } |
Grimmkey | 0:b8221deeaa87 | 768 | |
Grimmkey | 0:b8221deeaa87 | 769 | uint8_t APDS9960::getProxIntEnable() |
Grimmkey | 0:b8221deeaa87 | 770 | { |
Grimmkey | 0:b8221deeaa87 | 771 | uint8_t val = ReadDataByte(APDS9960_ENABLE); |
Grimmkey | 0:b8221deeaa87 | 772 | |
Grimmkey | 0:b8221deeaa87 | 773 | /* Read value from ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 774 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 775 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 776 | } |
Grimmkey | 0:b8221deeaa87 | 777 | |
Grimmkey | 0:b8221deeaa87 | 778 | /* Shift and mask out PIEN bit */ |
Grimmkey | 0:b8221deeaa87 | 779 | val = (val >> 5) & 0x01; |
Grimmkey | 0:b8221deeaa87 | 780 | |
Grimmkey | 0:b8221deeaa87 | 781 | return val; |
Grimmkey | 0:b8221deeaa87 | 782 | } |
Grimmkey | 0:b8221deeaa87 | 783 | |
Grimmkey | 0:b8221deeaa87 | 784 | bool APDS9960::setProxIntEnable(uint8_t enable) |
Grimmkey | 0:b8221deeaa87 | 785 | { |
Grimmkey | 0:b8221deeaa87 | 786 | uint8_t val = ReadDataByte(APDS9960_ENABLE); |
Grimmkey | 0:b8221deeaa87 | 787 | |
Grimmkey | 0:b8221deeaa87 | 788 | /* Read value from ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 789 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 790 | return false; |
Grimmkey | 0:b8221deeaa87 | 791 | } |
Grimmkey | 0:b8221deeaa87 | 792 | |
Grimmkey | 0:b8221deeaa87 | 793 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 794 | enable &= 0x01; |
Grimmkey | 0:b8221deeaa87 | 795 | enable = enable << 5; |
Grimmkey | 0:b8221deeaa87 | 796 | val &= 0xDF; |
Grimmkey | 0:b8221deeaa87 | 797 | val |= enable; |
Grimmkey | 0:b8221deeaa87 | 798 | |
Grimmkey | 0:b8221deeaa87 | 799 | /* Write register value back into ENABLE register */ |
Grimmkey | 0:b8221deeaa87 | 800 | if( WriteDataByte(APDS9960_ENABLE, val) ) { |
Grimmkey | 0:b8221deeaa87 | 801 | return false; |
Grimmkey | 0:b8221deeaa87 | 802 | } |
Grimmkey | 0:b8221deeaa87 | 803 | |
Grimmkey | 0:b8221deeaa87 | 804 | return true; |
Grimmkey | 0:b8221deeaa87 | 805 | } |
Grimmkey | 0:b8221deeaa87 | 806 | |
Grimmkey | 0:b8221deeaa87 | 807 | uint8_t APDS9960::getGestIntEnable() |
Grimmkey | 0:b8221deeaa87 | 808 | { |
Grimmkey | 0:b8221deeaa87 | 809 | uint8_t val = ReadDataByte(APDS9960_ENABLE); |
Grimmkey | 0:b8221deeaa87 | 810 | /* Read value from GCONF4 register */ |
Grimmkey | 0:b8221deeaa87 | 811 | if( val ==ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 812 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 813 | } |
Grimmkey | 0:b8221deeaa87 | 814 | /* Shift and mask out GIEN bit */ |
Grimmkey | 0:b8221deeaa87 | 815 | val = (val >> 1) & 0x01; |
Grimmkey | 0:b8221deeaa87 | 816 | return val; |
Grimmkey | 0:b8221deeaa87 | 817 | } |
Grimmkey | 0:b8221deeaa87 | 818 | |
Grimmkey | 0:b8221deeaa87 | 819 | bool APDS9960::setGestIntEnable(uint8_t enable) |
Grimmkey | 0:b8221deeaa87 | 820 | { |
Grimmkey | 0:b8221deeaa87 | 821 | uint8_t val = ReadDataByte(APDS9960_GCONF4); |
Grimmkey | 0:b8221deeaa87 | 822 | /* Read value from GCONF4 register */ |
Grimmkey | 0:b8221deeaa87 | 823 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 824 | return false; |
Grimmkey | 0:b8221deeaa87 | 825 | } |
Grimmkey | 0:b8221deeaa87 | 826 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 827 | enable &= 0x01; |
Grimmkey | 0:b8221deeaa87 | 828 | enable = enable << 1; |
Grimmkey | 0:b8221deeaa87 | 829 | val &= 0xFD; |
Grimmkey | 0:b8221deeaa87 | 830 | val |= enable; |
Grimmkey | 0:b8221deeaa87 | 831 | /* Write register value back into GCONF4 register */ |
Grimmkey | 0:b8221deeaa87 | 832 | if( WriteDataByte(APDS9960_GCONF4, val) ) { |
Grimmkey | 0:b8221deeaa87 | 833 | return false; |
Grimmkey | 0:b8221deeaa87 | 834 | } |
Grimmkey | 0:b8221deeaa87 | 835 | return true; |
Grimmkey | 0:b8221deeaa87 | 836 | } |
Grimmkey | 0:b8221deeaa87 | 837 | |
Grimmkey | 0:b8221deeaa87 | 838 | /* Clear interrupts */ |
Grimmkey | 0:b8221deeaa87 | 839 | bool APDS9960::clrAmbientLightInt() |
Grimmkey | 0:b8221deeaa87 | 840 | { |
Grimmkey | 0:b8221deeaa87 | 841 | uint8_t throwaway = ReadDataByte(APDS9960_AICLEAR); |
Grimmkey | 0:b8221deeaa87 | 842 | if( throwaway == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 843 | return false; |
Grimmkey | 0:b8221deeaa87 | 844 | } |
Grimmkey | 0:b8221deeaa87 | 845 | |
Grimmkey | 0:b8221deeaa87 | 846 | return true; |
Grimmkey | 0:b8221deeaa87 | 847 | } |
Grimmkey | 0:b8221deeaa87 | 848 | |
Grimmkey | 0:b8221deeaa87 | 849 | bool APDS9960::clrProxInt() |
Grimmkey | 0:b8221deeaa87 | 850 | { |
Grimmkey | 0:b8221deeaa87 | 851 | uint8_t throwaway = ReadDataByte(APDS9960_PICLEAR); |
Grimmkey | 0:b8221deeaa87 | 852 | if( throwaway == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 853 | return false; |
Grimmkey | 0:b8221deeaa87 | 854 | } |
Grimmkey | 0:b8221deeaa87 | 855 | |
Grimmkey | 0:b8221deeaa87 | 856 | return true; |
Grimmkey | 0:b8221deeaa87 | 857 | } |
Grimmkey | 0:b8221deeaa87 | 858 | |
Grimmkey | 0:b8221deeaa87 | 859 | // Ambient light methods |
Grimmkey | 0:b8221deeaa87 | 860 | bool APDS9960::readAmbientLight(uint16_t &val) |
Grimmkey | 0:b8221deeaa87 | 861 | { |
Grimmkey | 0:b8221deeaa87 | 862 | uint8_t val_byte = ReadDataByte(APDS9960_CDATAL); |
Grimmkey | 0:b8221deeaa87 | 863 | val = 0; |
Grimmkey | 0:b8221deeaa87 | 864 | |
Grimmkey | 0:b8221deeaa87 | 865 | /* Read value from clear channel, low byte register */ |
Grimmkey | 0:b8221deeaa87 | 866 | if( val_byte == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 867 | return false; |
Grimmkey | 0:b8221deeaa87 | 868 | } |
Grimmkey | 0:b8221deeaa87 | 869 | val = val_byte; |
Grimmkey | 0:b8221deeaa87 | 870 | |
Grimmkey | 0:b8221deeaa87 | 871 | /* Read value from clear channel, high byte register */ |
Grimmkey | 0:b8221deeaa87 | 872 | val_byte = ReadDataByte(APDS9960_CDATAH); |
Grimmkey | 0:b8221deeaa87 | 873 | if( val_byte == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 874 | return false; |
Grimmkey | 0:b8221deeaa87 | 875 | } |
Grimmkey | 0:b8221deeaa87 | 876 | val = val + ((uint16_t)val_byte << 8); |
Grimmkey | 0:b8221deeaa87 | 877 | |
Grimmkey | 0:b8221deeaa87 | 878 | return true; |
Grimmkey | 0:b8221deeaa87 | 879 | } |
Grimmkey | 0:b8221deeaa87 | 880 | |
Grimmkey | 0:b8221deeaa87 | 881 | bool APDS9960::readRedLight(uint16_t &val) |
Grimmkey | 0:b8221deeaa87 | 882 | { |
Grimmkey | 0:b8221deeaa87 | 883 | uint8_t val_byte = ReadDataByte(APDS9960_RDATAL); |
Grimmkey | 0:b8221deeaa87 | 884 | val = 0; |
Grimmkey | 0:b8221deeaa87 | 885 | |
Grimmkey | 0:b8221deeaa87 | 886 | /* Read value from clear channel, low byte register */ |
Grimmkey | 0:b8221deeaa87 | 887 | if( val_byte == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 888 | return false; |
Grimmkey | 0:b8221deeaa87 | 889 | } |
Grimmkey | 0:b8221deeaa87 | 890 | val = val_byte; |
Grimmkey | 0:b8221deeaa87 | 891 | |
Grimmkey | 0:b8221deeaa87 | 892 | /* Read value from clear channel, high byte register */ |
Grimmkey | 0:b8221deeaa87 | 893 | val_byte = ReadDataByte(APDS9960_RDATAH); |
Grimmkey | 0:b8221deeaa87 | 894 | if( val_byte == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 895 | return false; |
Grimmkey | 0:b8221deeaa87 | 896 | } |
Grimmkey | 0:b8221deeaa87 | 897 | val = val + ((uint16_t)val_byte << 8); |
Grimmkey | 0:b8221deeaa87 | 898 | |
Grimmkey | 0:b8221deeaa87 | 899 | return true; |
Grimmkey | 0:b8221deeaa87 | 900 | } |
Grimmkey | 0:b8221deeaa87 | 901 | |
Grimmkey | 0:b8221deeaa87 | 902 | bool APDS9960::readGreenLight(uint16_t &val) |
Grimmkey | 0:b8221deeaa87 | 903 | { |
Grimmkey | 0:b8221deeaa87 | 904 | uint8_t val_byte = ReadDataByte(APDS9960_GDATAL); |
Grimmkey | 0:b8221deeaa87 | 905 | val = 0; |
Grimmkey | 0:b8221deeaa87 | 906 | |
Grimmkey | 0:b8221deeaa87 | 907 | /* Read value from clear channel, low byte register */ |
Grimmkey | 0:b8221deeaa87 | 908 | if( val_byte ==ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 909 | return false; |
Grimmkey | 0:b8221deeaa87 | 910 | } |
Grimmkey | 0:b8221deeaa87 | 911 | val = val_byte; |
Grimmkey | 0:b8221deeaa87 | 912 | |
Grimmkey | 0:b8221deeaa87 | 913 | /* Read value from clear channel, high byte register */ |
Grimmkey | 0:b8221deeaa87 | 914 | val_byte = ReadDataByte(APDS9960_GDATAH); |
Grimmkey | 0:b8221deeaa87 | 915 | if( val_byte == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 916 | return false; |
Grimmkey | 0:b8221deeaa87 | 917 | } |
Grimmkey | 0:b8221deeaa87 | 918 | val = val + ((uint16_t)val_byte << 8); |
Grimmkey | 0:b8221deeaa87 | 919 | |
Grimmkey | 0:b8221deeaa87 | 920 | return true; |
Grimmkey | 0:b8221deeaa87 | 921 | } |
Grimmkey | 0:b8221deeaa87 | 922 | |
Grimmkey | 0:b8221deeaa87 | 923 | bool APDS9960::readBlueLight(uint16_t &val) |
Grimmkey | 0:b8221deeaa87 | 924 | { |
Grimmkey | 0:b8221deeaa87 | 925 | uint8_t val_byte =ReadDataByte(APDS9960_BDATAL);; |
Grimmkey | 0:b8221deeaa87 | 926 | val = 0; |
Grimmkey | 0:b8221deeaa87 | 927 | |
Grimmkey | 0:b8221deeaa87 | 928 | /* Read value from clear channel, low byte register */ |
Grimmkey | 0:b8221deeaa87 | 929 | if( val_byte ==ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 930 | return false; |
Grimmkey | 0:b8221deeaa87 | 931 | } |
Grimmkey | 0:b8221deeaa87 | 932 | val = val_byte; |
Grimmkey | 0:b8221deeaa87 | 933 | |
Grimmkey | 0:b8221deeaa87 | 934 | /* Read value from clear channel, high byte register */ |
Grimmkey | 0:b8221deeaa87 | 935 | val_byte = ReadDataByte(APDS9960_BDATAH); |
Grimmkey | 0:b8221deeaa87 | 936 | if( val_byte == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 937 | return false; |
Grimmkey | 0:b8221deeaa87 | 938 | } |
Grimmkey | 0:b8221deeaa87 | 939 | val = val + ((uint16_t)val_byte << 8); |
Grimmkey | 0:b8221deeaa87 | 940 | |
Grimmkey | 0:b8221deeaa87 | 941 | return true; |
Grimmkey | 0:b8221deeaa87 | 942 | } |
Grimmkey | 0:b8221deeaa87 | 943 | |
Grimmkey | 0:b8221deeaa87 | 944 | // Proximity methods |
Grimmkey | 0:b8221deeaa87 | 945 | bool APDS9960::readProx(uint8_t &val) |
Grimmkey | 0:b8221deeaa87 | 946 | { |
Grimmkey | 0:b8221deeaa87 | 947 | val = ReadDataByte(APDS9960_PDATA); |
Grimmkey | 0:b8221deeaa87 | 948 | |
Grimmkey | 0:b8221deeaa87 | 949 | /* Read value from proximity data register */ |
Grimmkey | 0:b8221deeaa87 | 950 | if( val == ERROR) { |
Grimmkey | 0:b8221deeaa87 | 951 | return false; |
Grimmkey | 0:b8221deeaa87 | 952 | } |
Grimmkey | 0:b8221deeaa87 | 953 | |
Grimmkey | 0:b8221deeaa87 | 954 | return true; |
Grimmkey | 0:b8221deeaa87 | 955 | } |
Grimmkey | 0:b8221deeaa87 | 956 | |
Grimmkey | 0:b8221deeaa87 | 957 | // Gesture methods |
Grimmkey | 0:b8221deeaa87 | 958 | bool APDS9960::isGestAvailable() |
Grimmkey | 0:b8221deeaa87 | 959 | { |
Grimmkey | 0:b8221deeaa87 | 960 | uint8_t val = ReadDataByte(APDS9960_GSTATUS); |
Grimmkey | 0:b8221deeaa87 | 961 | |
Grimmkey | 0:b8221deeaa87 | 962 | /* Read value from GSTATUS register */ |
Grimmkey | 0:b8221deeaa87 | 963 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 964 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 965 | } |
Grimmkey | 0:b8221deeaa87 | 966 | //printf("val is %u\r\n", val); |
Grimmkey | 0:b8221deeaa87 | 967 | /* Shift and mask out GVALID bit */ |
Grimmkey | 0:b8221deeaa87 | 968 | val &= APDS9960_GVALID; |
Grimmkey | 0:b8221deeaa87 | 969 | |
Grimmkey | 0:b8221deeaa87 | 970 | //printf("val & with APDS9960_GVAILD=%u\r\n",val); |
Grimmkey | 0:b8221deeaa87 | 971 | /* Return true/false based on GVALID bit */ |
Grimmkey | 0:b8221deeaa87 | 972 | if( val == 1) { |
Grimmkey | 0:b8221deeaa87 | 973 | return true; |
Grimmkey | 0:b8221deeaa87 | 974 | } else { |
Grimmkey | 0:b8221deeaa87 | 975 | return false; |
Grimmkey | 0:b8221deeaa87 | 976 | } |
Grimmkey | 0:b8221deeaa87 | 977 | } |
Grimmkey | 0:b8221deeaa87 | 978 | |
Grimmkey | 0:b8221deeaa87 | 979 | int APDS9960::readGest() |
Grimmkey | 0:b8221deeaa87 | 980 | { |
Grimmkey | 0:b8221deeaa87 | 981 | uint8_t fifo_level = 0; |
Grimmkey | 0:b8221deeaa87 | 982 | int bytes_read = 0; |
Grimmkey | 0:b8221deeaa87 | 983 | uint8_t fifo_data[128]; |
Grimmkey | 0:b8221deeaa87 | 984 | uint8_t gstatus; |
Grimmkey | 0:b8221deeaa87 | 985 | int motion; |
Grimmkey | 0:b8221deeaa87 | 986 | int i; |
Grimmkey | 0:b8221deeaa87 | 987 | |
Grimmkey | 0:b8221deeaa87 | 988 | /* Make sure that power and gesture is on and data is valid */ |
Grimmkey | 0:b8221deeaa87 | 989 | if( !isGestAvailable() || !(getMode() & 0x41) ) { |
Grimmkey | 0:b8221deeaa87 | 990 | return DIR_NA; |
Grimmkey | 0:b8221deeaa87 | 991 | } |
Grimmkey | 0:b8221deeaa87 | 992 | |
Grimmkey | 0:b8221deeaa87 | 993 | /* Keep looping as long as gesture data is valid */ |
Grimmkey | 0:b8221deeaa87 | 994 | while(1) { |
Grimmkey | 0:b8221deeaa87 | 995 | |
Grimmkey | 0:b8221deeaa87 | 996 | /* Wait some time to collect next batch of FIFO data */ |
Grimmkey | 0:b8221deeaa87 | 997 | wait(FIFO_TIME); |
Grimmkey | 0:b8221deeaa87 | 998 | |
Grimmkey | 0:b8221deeaa87 | 999 | /* Get the contents of the STATUS register. Is data still valid? */ |
Grimmkey | 0:b8221deeaa87 | 1000 | gstatus = ReadDataByte(APDS9960_GSTATUS); |
Grimmkey | 0:b8221deeaa87 | 1001 | if( gstatus == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1002 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 1003 | } |
Grimmkey | 0:b8221deeaa87 | 1004 | |
Grimmkey | 0:b8221deeaa87 | 1005 | /* If we have valid data, read in FIFO */ |
Grimmkey | 0:b8221deeaa87 | 1006 | if( (gstatus & APDS9960_GVALID) == APDS9960_GVALID ) { |
Grimmkey | 0:b8221deeaa87 | 1007 | |
Grimmkey | 0:b8221deeaa87 | 1008 | /* Read the current FIFO level */ |
Grimmkey | 0:b8221deeaa87 | 1009 | fifo_level = ReadDataByte(APDS9960_GFLVL); |
Grimmkey | 0:b8221deeaa87 | 1010 | if( fifo_level == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1011 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 1012 | } |
Grimmkey | 0:b8221deeaa87 | 1013 | |
Grimmkey | 0:b8221deeaa87 | 1014 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1015 | Serial.print("FIFO Level: "); |
Grimmkey | 0:b8221deeaa87 | 1016 | Serial.println(fifo_level); |
Grimmkey | 0:b8221deeaa87 | 1017 | #endif |
Grimmkey | 0:b8221deeaa87 | 1018 | |
Grimmkey | 0:b8221deeaa87 | 1019 | /* If there's stuff in the FIFO, read it into our data block */ |
Grimmkey | 0:b8221deeaa87 | 1020 | if( fifo_level > 0) { |
Grimmkey | 0:b8221deeaa87 | 1021 | bytes_read = ReadDataBlock( APDS9960_GFIFO_U, |
Grimmkey | 0:b8221deeaa87 | 1022 | fifo_data, |
Grimmkey | 0:b8221deeaa87 | 1023 | (fifo_level * 4) ); |
Grimmkey | 0:b8221deeaa87 | 1024 | if( bytes_read == -1 ) { |
Grimmkey | 0:b8221deeaa87 | 1025 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 1026 | } |
Grimmkey | 0:b8221deeaa87 | 1027 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1028 | Serial.print("FIFO Dump: "); |
Grimmkey | 0:b8221deeaa87 | 1029 | for ( i = 0; i < bytes_read; i++ ) { |
Grimmkey | 0:b8221deeaa87 | 1030 | Serial.print(fifo_data[i]); |
Grimmkey | 0:b8221deeaa87 | 1031 | Serial.print(" "); |
Grimmkey | 0:b8221deeaa87 | 1032 | } |
Grimmkey | 0:b8221deeaa87 | 1033 | Serial.println(); |
Grimmkey | 0:b8221deeaa87 | 1034 | #endif |
Grimmkey | 0:b8221deeaa87 | 1035 | |
Grimmkey | 0:b8221deeaa87 | 1036 | /* If at least 1 set of data, sort the data into U/D/L/R */ |
Grimmkey | 0:b8221deeaa87 | 1037 | if( bytes_read >= 4 ) { |
Grimmkey | 0:b8221deeaa87 | 1038 | for( i = 0; i < bytes_read; i += 4 ) { |
Grimmkey | 0:b8221deeaa87 | 1039 | gest_data_.u_data[gest_data_.index_gest] = \ |
Grimmkey | 0:b8221deeaa87 | 1040 | fifo_data[i + 0]; |
Grimmkey | 0:b8221deeaa87 | 1041 | gest_data_.d_data[gest_data_.index_gest] = \ |
Grimmkey | 0:b8221deeaa87 | 1042 | fifo_data[i + 1]; |
Grimmkey | 0:b8221deeaa87 | 1043 | gest_data_.l_data[gest_data_.index_gest] = \ |
Grimmkey | 0:b8221deeaa87 | 1044 | fifo_data[i + 2]; |
Grimmkey | 0:b8221deeaa87 | 1045 | gest_data_.r_data[gest_data_.index_gest] = \ |
Grimmkey | 0:b8221deeaa87 | 1046 | fifo_data[i + 3]; |
Grimmkey | 0:b8221deeaa87 | 1047 | gest_data_.index_gest++; |
Grimmkey | 0:b8221deeaa87 | 1048 | gest_data_.total_gests++; |
Grimmkey | 0:b8221deeaa87 | 1049 | } |
Grimmkey | 0:b8221deeaa87 | 1050 | |
Grimmkey | 0:b8221deeaa87 | 1051 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1052 | Serial.print("Up Data: "); |
Grimmkey | 0:b8221deeaa87 | 1053 | for ( i = 0; i < gest_data_.total_gests; i++ ) { |
Grimmkey | 0:b8221deeaa87 | 1054 | Serial.print(gest_data_.u_data[i]); |
Grimmkey | 0:b8221deeaa87 | 1055 | Serial.print(" "); |
Grimmkey | 0:b8221deeaa87 | 1056 | } |
Grimmkey | 0:b8221deeaa87 | 1057 | Serial.println(); |
Grimmkey | 0:b8221deeaa87 | 1058 | #endif |
Grimmkey | 0:b8221deeaa87 | 1059 | |
Grimmkey | 0:b8221deeaa87 | 1060 | /* Filter and process gest data. Decode near/far state */ |
Grimmkey | 0:b8221deeaa87 | 1061 | if( procGestData() ) { |
Grimmkey | 0:b8221deeaa87 | 1062 | if( decodeGest() ) { |
Grimmkey | 0:b8221deeaa87 | 1063 | //***TODO: U-Turn Gestures |
Grimmkey | 0:b8221deeaa87 | 1064 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1065 | //Serial.println(gest_motion_); |
Grimmkey | 0:b8221deeaa87 | 1066 | #endif |
Grimmkey | 0:b8221deeaa87 | 1067 | } |
Grimmkey | 0:b8221deeaa87 | 1068 | } |
Grimmkey | 0:b8221deeaa87 | 1069 | |
Grimmkey | 0:b8221deeaa87 | 1070 | /* Reset data */ |
Grimmkey | 0:b8221deeaa87 | 1071 | gest_data_.index_gest = 0; |
Grimmkey | 0:b8221deeaa87 | 1072 | gest_data_.total_gests = 0; |
Grimmkey | 0:b8221deeaa87 | 1073 | } |
Grimmkey | 0:b8221deeaa87 | 1074 | } |
Grimmkey | 0:b8221deeaa87 | 1075 | } else { |
Grimmkey | 0:b8221deeaa87 | 1076 | |
Grimmkey | 0:b8221deeaa87 | 1077 | /* Determine best guessed gest and clean up */ |
Grimmkey | 0:b8221deeaa87 | 1078 | wait(FIFO_TIME); |
Grimmkey | 0:b8221deeaa87 | 1079 | decodeGest(); |
Grimmkey | 0:b8221deeaa87 | 1080 | motion = gest_motion_; |
Grimmkey | 0:b8221deeaa87 | 1081 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1082 | Serial.print("END: "); |
Grimmkey | 0:b8221deeaa87 | 1083 | Serial.println(gest_motion_); |
Grimmkey | 0:b8221deeaa87 | 1084 | #endif |
Grimmkey | 0:b8221deeaa87 | 1085 | rstGestParameters(); |
Grimmkey | 0:b8221deeaa87 | 1086 | return motion; |
Grimmkey | 0:b8221deeaa87 | 1087 | } |
Grimmkey | 0:b8221deeaa87 | 1088 | } |
Grimmkey | 0:b8221deeaa87 | 1089 | } |
Grimmkey | 0:b8221deeaa87 | 1090 | |
Grimmkey | 0:b8221deeaa87 | 1091 | // Gesture processing |
Grimmkey | 0:b8221deeaa87 | 1092 | void APDS9960::rstGestParameters() |
Grimmkey | 0:b8221deeaa87 | 1093 | { |
Grimmkey | 0:b8221deeaa87 | 1094 | gest_data_.index_gest = 0; |
Grimmkey | 0:b8221deeaa87 | 1095 | gest_data_.total_gests = 0; |
Grimmkey | 0:b8221deeaa87 | 1096 | |
Grimmkey | 0:b8221deeaa87 | 1097 | gest_ud_delta_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1098 | gest_lr_delta_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1099 | |
Grimmkey | 0:b8221deeaa87 | 1100 | gest_ud_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1101 | gest_lr_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1102 | |
Grimmkey | 0:b8221deeaa87 | 1103 | gest_near_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1104 | gest_far_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1105 | |
Grimmkey | 0:b8221deeaa87 | 1106 | gest_state_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1107 | gest_motion_ = DIR_NA; |
Grimmkey | 0:b8221deeaa87 | 1108 | } |
Grimmkey | 0:b8221deeaa87 | 1109 | |
Grimmkey | 0:b8221deeaa87 | 1110 | bool APDS9960::procGestData() |
Grimmkey | 0:b8221deeaa87 | 1111 | { |
Grimmkey | 0:b8221deeaa87 | 1112 | uint8_t u_first = 0; |
Grimmkey | 0:b8221deeaa87 | 1113 | uint8_t d_first = 0; |
Grimmkey | 0:b8221deeaa87 | 1114 | uint8_t l_first = 0; |
Grimmkey | 0:b8221deeaa87 | 1115 | uint8_t r_first = 0; |
Grimmkey | 0:b8221deeaa87 | 1116 | uint8_t u_last = 0; |
Grimmkey | 0:b8221deeaa87 | 1117 | uint8_t d_last = 0; |
Grimmkey | 0:b8221deeaa87 | 1118 | uint8_t l_last = 0; |
Grimmkey | 0:b8221deeaa87 | 1119 | uint8_t r_last = 0; |
Grimmkey | 0:b8221deeaa87 | 1120 | int ud_ratio_first; |
Grimmkey | 0:b8221deeaa87 | 1121 | int lr_ratio_first; |
Grimmkey | 0:b8221deeaa87 | 1122 | int ud_ratio_last; |
Grimmkey | 0:b8221deeaa87 | 1123 | int lr_ratio_last; |
Grimmkey | 0:b8221deeaa87 | 1124 | int ud_delta; |
Grimmkey | 0:b8221deeaa87 | 1125 | int lr_delta; |
Grimmkey | 0:b8221deeaa87 | 1126 | int i; |
Grimmkey | 0:b8221deeaa87 | 1127 | |
Grimmkey | 0:b8221deeaa87 | 1128 | /* If we have less than 4 total gestures, that's not enough */ |
Grimmkey | 0:b8221deeaa87 | 1129 | if( gest_data_.total_gests <= 4 ) { |
Grimmkey | 0:b8221deeaa87 | 1130 | return false; |
Grimmkey | 0:b8221deeaa87 | 1131 | } |
Grimmkey | 0:b8221deeaa87 | 1132 | |
Grimmkey | 0:b8221deeaa87 | 1133 | /* Check to make sure our data isn't out of bounds */ |
Grimmkey | 0:b8221deeaa87 | 1134 | if( (gest_data_.total_gests <= 32) && \ |
Grimmkey | 0:b8221deeaa87 | 1135 | (gest_data_.total_gests > 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1136 | |
Grimmkey | 0:b8221deeaa87 | 1137 | /* Find the first value in U/D/L/R above the threshold */ |
Grimmkey | 0:b8221deeaa87 | 1138 | for( i = 0; i < gest_data_.total_gests; i++ ) { |
Grimmkey | 0:b8221deeaa87 | 1139 | if( (gest_data_.u_data[i] > GEST_THRESHOLD_OUT) && |
Grimmkey | 0:b8221deeaa87 | 1140 | (gest_data_.d_data[i] > GEST_THRESHOLD_OUT) && |
Grimmkey | 0:b8221deeaa87 | 1141 | (gest_data_.l_data[i] > GEST_THRESHOLD_OUT) && |
Grimmkey | 0:b8221deeaa87 | 1142 | (gest_data_.r_data[i] > GEST_THRESHOLD_OUT) ) { |
Grimmkey | 0:b8221deeaa87 | 1143 | |
Grimmkey | 0:b8221deeaa87 | 1144 | u_first = gest_data_.u_data[i]; |
Grimmkey | 0:b8221deeaa87 | 1145 | d_first = gest_data_.d_data[i]; |
Grimmkey | 0:b8221deeaa87 | 1146 | l_first = gest_data_.l_data[i]; |
Grimmkey | 0:b8221deeaa87 | 1147 | r_first = gest_data_.r_data[i]; |
Grimmkey | 0:b8221deeaa87 | 1148 | break; |
Grimmkey | 0:b8221deeaa87 | 1149 | } |
Grimmkey | 0:b8221deeaa87 | 1150 | } |
Grimmkey | 0:b8221deeaa87 | 1151 | |
Grimmkey | 0:b8221deeaa87 | 1152 | /* If one of the _first values is 0, then there is no good data */ |
Grimmkey | 0:b8221deeaa87 | 1153 | if( (u_first == 0) || (d_first == 0) || \ |
Grimmkey | 0:b8221deeaa87 | 1154 | (l_first == 0) || (r_first == 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1155 | |
Grimmkey | 0:b8221deeaa87 | 1156 | return false; |
Grimmkey | 0:b8221deeaa87 | 1157 | } |
Grimmkey | 0:b8221deeaa87 | 1158 | /* Find the last value in U/D/L/R above the threshold */ |
Grimmkey | 0:b8221deeaa87 | 1159 | for( i = gest_data_.total_gests - 1; i >= 0; i-- ) { |
Grimmkey | 0:b8221deeaa87 | 1160 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1161 | Serial.print(F("Finding last: ")); |
Grimmkey | 0:b8221deeaa87 | 1162 | Serial.print(F("U:")); |
Grimmkey | 0:b8221deeaa87 | 1163 | Serial.print(gest_data_.u_data[i]); |
Grimmkey | 0:b8221deeaa87 | 1164 | Serial.print(F(" D:")); |
Grimmkey | 0:b8221deeaa87 | 1165 | Serial.print(gest_data_.d_data[i]); |
Grimmkey | 0:b8221deeaa87 | 1166 | Serial.print(F(" L:")); |
Grimmkey | 0:b8221deeaa87 | 1167 | Serial.print(gest_data_.l_data[i]); |
Grimmkey | 0:b8221deeaa87 | 1168 | Serial.print(F(" R:")); |
Grimmkey | 0:b8221deeaa87 | 1169 | Serial.println(gest_data_.r_data[i]); |
Grimmkey | 0:b8221deeaa87 | 1170 | #endif |
Grimmkey | 0:b8221deeaa87 | 1171 | if( (gest_data_.u_data[i] > GEST_THRESHOLD_OUT) && |
Grimmkey | 0:b8221deeaa87 | 1172 | (gest_data_.d_data[i] > GEST_THRESHOLD_OUT) && |
Grimmkey | 0:b8221deeaa87 | 1173 | (gest_data_.l_data[i] > GEST_THRESHOLD_OUT) && |
Grimmkey | 0:b8221deeaa87 | 1174 | (gest_data_.r_data[i] > GEST_THRESHOLD_OUT) ) { |
Grimmkey | 0:b8221deeaa87 | 1175 | |
Grimmkey | 0:b8221deeaa87 | 1176 | u_last = gest_data_.u_data[i]; |
Grimmkey | 0:b8221deeaa87 | 1177 | d_last = gest_data_.d_data[i]; |
Grimmkey | 0:b8221deeaa87 | 1178 | l_last = gest_data_.l_data[i]; |
Grimmkey | 0:b8221deeaa87 | 1179 | r_last = gest_data_.r_data[i]; |
Grimmkey | 0:b8221deeaa87 | 1180 | break; |
Grimmkey | 0:b8221deeaa87 | 1181 | } |
Grimmkey | 0:b8221deeaa87 | 1182 | } |
Grimmkey | 0:b8221deeaa87 | 1183 | } |
Grimmkey | 0:b8221deeaa87 | 1184 | |
Grimmkey | 0:b8221deeaa87 | 1185 | /* Calculate the first vs. last ratio of up/down and left/right */ |
Grimmkey | 0:b8221deeaa87 | 1186 | ud_ratio_first = ((u_first - d_first) * 100) / (u_first + d_first); |
Grimmkey | 0:b8221deeaa87 | 1187 | lr_ratio_first = ((l_first - r_first) * 100) / (l_first + r_first); |
Grimmkey | 0:b8221deeaa87 | 1188 | ud_ratio_last = ((u_last - d_last) * 100) / (u_last + d_last); |
Grimmkey | 0:b8221deeaa87 | 1189 | lr_ratio_last = ((l_last - r_last) * 100) / (l_last + r_last); |
Grimmkey | 0:b8221deeaa87 | 1190 | |
Grimmkey | 0:b8221deeaa87 | 1191 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1192 | Serial.print(F("Last Values: ")); |
Grimmkey | 0:b8221deeaa87 | 1193 | Serial.print(F("U:")); |
Grimmkey | 0:b8221deeaa87 | 1194 | Serial.print(u_last); |
Grimmkey | 0:b8221deeaa87 | 1195 | Serial.print(F(" D:")); |
Grimmkey | 0:b8221deeaa87 | 1196 | Serial.print(d_last); |
Grimmkey | 0:b8221deeaa87 | 1197 | Serial.print(F(" L:")); |
Grimmkey | 0:b8221deeaa87 | 1198 | Serial.print(l_last); |
Grimmkey | 0:b8221deeaa87 | 1199 | Serial.print(F(" R:")); |
Grimmkey | 0:b8221deeaa87 | 1200 | Serial.println(r_last); |
Grimmkey | 0:b8221deeaa87 | 1201 | |
Grimmkey | 0:b8221deeaa87 | 1202 | Serial.print(F("Ratios: ")); |
Grimmkey | 0:b8221deeaa87 | 1203 | Serial.print(F("UD Fi: ")); |
Grimmkey | 0:b8221deeaa87 | 1204 | Serial.print(ud_ratio_first); |
Grimmkey | 0:b8221deeaa87 | 1205 | Serial.print(F(" UD La: ")); |
Grimmkey | 0:b8221deeaa87 | 1206 | Serial.print(ud_ratio_last); |
Grimmkey | 0:b8221deeaa87 | 1207 | Serial.print(F(" LR Fi: ")); |
Grimmkey | 0:b8221deeaa87 | 1208 | Serial.print(lr_ratio_first); |
Grimmkey | 0:b8221deeaa87 | 1209 | Serial.print(F(" LR La: ")); |
Grimmkey | 0:b8221deeaa87 | 1210 | Serial.println(lr_ratio_last); |
Grimmkey | 0:b8221deeaa87 | 1211 | #endif |
Grimmkey | 0:b8221deeaa87 | 1212 | |
Grimmkey | 0:b8221deeaa87 | 1213 | /* Determine the difference between the first and last ratios */ |
Grimmkey | 0:b8221deeaa87 | 1214 | ud_delta = ud_ratio_last - ud_ratio_first; |
Grimmkey | 0:b8221deeaa87 | 1215 | lr_delta = lr_ratio_last - lr_ratio_first; |
Grimmkey | 0:b8221deeaa87 | 1216 | |
Grimmkey | 0:b8221deeaa87 | 1217 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1218 | Serial.print("Deltas: "); |
Grimmkey | 0:b8221deeaa87 | 1219 | Serial.print("UD: "); |
Grimmkey | 0:b8221deeaa87 | 1220 | Serial.print(ud_delta); |
Grimmkey | 0:b8221deeaa87 | 1221 | Serial.print(" LR: "); |
Grimmkey | 0:b8221deeaa87 | 1222 | Serial.println(lr_delta); |
Grimmkey | 0:b8221deeaa87 | 1223 | #endif |
Grimmkey | 0:b8221deeaa87 | 1224 | |
Grimmkey | 0:b8221deeaa87 | 1225 | /* Accumulate the UD and LR delta values */ |
Grimmkey | 0:b8221deeaa87 | 1226 | gest_ud_delta_ += ud_delta; |
Grimmkey | 0:b8221deeaa87 | 1227 | gest_lr_delta_ += lr_delta; |
Grimmkey | 0:b8221deeaa87 | 1228 | |
Grimmkey | 0:b8221deeaa87 | 1229 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1230 | Serial.print("Accumulations: "); |
Grimmkey | 0:b8221deeaa87 | 1231 | Serial.print("UD: "); |
Grimmkey | 0:b8221deeaa87 | 1232 | Serial.print(gest_ud_delta_); |
Grimmkey | 0:b8221deeaa87 | 1233 | Serial.print(" LR: "); |
Grimmkey | 0:b8221deeaa87 | 1234 | Serial.println(gest_lr_delta_); |
Grimmkey | 0:b8221deeaa87 | 1235 | #endif |
Grimmkey | 0:b8221deeaa87 | 1236 | |
Grimmkey | 0:b8221deeaa87 | 1237 | /* Determine U/D gesture */ |
Grimmkey | 0:b8221deeaa87 | 1238 | if( gest_ud_delta_ >= GEST_SENSITIVITY_1 ) { |
Grimmkey | 0:b8221deeaa87 | 1239 | gest_ud_count_ = 1; |
Grimmkey | 0:b8221deeaa87 | 1240 | } else if( gest_ud_delta_ <= -GEST_SENSITIVITY_1 ) { |
Grimmkey | 0:b8221deeaa87 | 1241 | gest_ud_count_ = -1; |
Grimmkey | 0:b8221deeaa87 | 1242 | } else { |
Grimmkey | 0:b8221deeaa87 | 1243 | gest_ud_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1244 | } |
Grimmkey | 0:b8221deeaa87 | 1245 | |
Grimmkey | 0:b8221deeaa87 | 1246 | /* Determine L/R gesture */ |
Grimmkey | 0:b8221deeaa87 | 1247 | if( gest_lr_delta_ >= GEST_SENSITIVITY_1 ) { |
Grimmkey | 0:b8221deeaa87 | 1248 | gest_lr_count_ = 1; |
Grimmkey | 0:b8221deeaa87 | 1249 | } else if( gest_lr_delta_ <= -GEST_SENSITIVITY_1 ) { |
Grimmkey | 0:b8221deeaa87 | 1250 | gest_lr_count_ = -1; |
Grimmkey | 0:b8221deeaa87 | 1251 | } else { |
Grimmkey | 0:b8221deeaa87 | 1252 | gest_lr_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1253 | } |
Grimmkey | 0:b8221deeaa87 | 1254 | |
Grimmkey | 0:b8221deeaa87 | 1255 | /* Determine Near/Far gesture */ |
Grimmkey | 0:b8221deeaa87 | 1256 | if( (gest_ud_count_ == 0) && (gest_lr_count_ == 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1257 | if( (abs(ud_delta) < GEST_SENSITIVITY_2) && \ |
Grimmkey | 0:b8221deeaa87 | 1258 | (abs(lr_delta) < GEST_SENSITIVITY_2) ) { |
Grimmkey | 0:b8221deeaa87 | 1259 | |
Grimmkey | 0:b8221deeaa87 | 1260 | if( (ud_delta == 0) && (lr_delta == 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1261 | // printf("increase near count\n\r"); |
Grimmkey | 0:b8221deeaa87 | 1262 | gest_near_count_++; |
Grimmkey | 0:b8221deeaa87 | 1263 | } else if( (ud_delta != 0) || (lr_delta != 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1264 | // printf("increase far count\r\n"); |
Grimmkey | 0:b8221deeaa87 | 1265 | gest_far_count_++; |
Grimmkey | 0:b8221deeaa87 | 1266 | } |
Grimmkey | 0:b8221deeaa87 | 1267 | |
Grimmkey | 0:b8221deeaa87 | 1268 | if( (gest_near_count_ >= 3) && (gest_far_count_ >= 2) ) { |
Grimmkey | 0:b8221deeaa87 | 1269 | if( (ud_delta == 0) && (lr_delta == 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1270 | gest_state_ = NEAR_STATE; |
Grimmkey | 0:b8221deeaa87 | 1271 | } else if( (ud_delta != 0) && (lr_delta != 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1272 | gest_state_ = FAR_STATE; |
Grimmkey | 0:b8221deeaa87 | 1273 | } |
Grimmkey | 0:b8221deeaa87 | 1274 | return true; |
Grimmkey | 0:b8221deeaa87 | 1275 | } |
Grimmkey | 0:b8221deeaa87 | 1276 | } |
Grimmkey | 0:b8221deeaa87 | 1277 | } else { |
Grimmkey | 0:b8221deeaa87 | 1278 | if( (abs(ud_delta) < GEST_SENSITIVITY_2) && \ |
Grimmkey | 0:b8221deeaa87 | 1279 | (abs(lr_delta) < GEST_SENSITIVITY_2) ) { |
Grimmkey | 0:b8221deeaa87 | 1280 | |
Grimmkey | 0:b8221deeaa87 | 1281 | if( (ud_delta == 0) && (lr_delta == 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1282 | gest_near_count_++; |
Grimmkey | 0:b8221deeaa87 | 1283 | } |
Grimmkey | 0:b8221deeaa87 | 1284 | |
Grimmkey | 0:b8221deeaa87 | 1285 | if( gest_near_count_ >= 5 ) { |
Grimmkey | 0:b8221deeaa87 | 1286 | gest_ud_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1287 | gest_lr_count_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1288 | gest_ud_delta_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1289 | gest_lr_delta_ = 0; |
Grimmkey | 0:b8221deeaa87 | 1290 | } |
Grimmkey | 0:b8221deeaa87 | 1291 | } |
Grimmkey | 0:b8221deeaa87 | 1292 | } |
Grimmkey | 0:b8221deeaa87 | 1293 | |
Grimmkey | 0:b8221deeaa87 | 1294 | #if DEBUG |
Grimmkey | 0:b8221deeaa87 | 1295 | Serial.print("UD_CT: "); |
Grimmkey | 0:b8221deeaa87 | 1296 | Serial.print(gest_ud_count_); |
Grimmkey | 0:b8221deeaa87 | 1297 | Serial.print(" LR_CT: "); |
Grimmkey | 0:b8221deeaa87 | 1298 | Serial.print(gest_lr_count_); |
Grimmkey | 0:b8221deeaa87 | 1299 | Serial.print(" NEAR_CT: "); |
Grimmkey | 0:b8221deeaa87 | 1300 | Serial.print(gest_near_count_); |
Grimmkey | 0:b8221deeaa87 | 1301 | Serial.print(" FAR_CT: "); |
Grimmkey | 0:b8221deeaa87 | 1302 | Serial.println(gest_far_count_); |
Grimmkey | 0:b8221deeaa87 | 1303 | Serial.println("----------"); |
Grimmkey | 0:b8221deeaa87 | 1304 | #endif |
Grimmkey | 0:b8221deeaa87 | 1305 | |
Grimmkey | 0:b8221deeaa87 | 1306 | return false; |
Grimmkey | 0:b8221deeaa87 | 1307 | } |
Grimmkey | 0:b8221deeaa87 | 1308 | |
Grimmkey | 0:b8221deeaa87 | 1309 | bool APDS9960::decodeGest() |
Grimmkey | 0:b8221deeaa87 | 1310 | { |
Grimmkey | 0:b8221deeaa87 | 1311 | /* Return if near or far event is detected */ |
Grimmkey | 0:b8221deeaa87 | 1312 | if( gest_state_ == NEAR_STATE ) { |
Grimmkey | 0:b8221deeaa87 | 1313 | gest_motion_ = DIR_I; |
Grimmkey | 0:b8221deeaa87 | 1314 | return true; |
Grimmkey | 0:b8221deeaa87 | 1315 | } else if ( gest_state_ == FAR_STATE ) { |
Grimmkey | 0:b8221deeaa87 | 1316 | gest_motion_ = DIR_O; |
Grimmkey | 0:b8221deeaa87 | 1317 | return true; |
Grimmkey | 0:b8221deeaa87 | 1318 | } |
Grimmkey | 0:b8221deeaa87 | 1319 | |
Grimmkey | 0:b8221deeaa87 | 1320 | /* Determine swipe direction */ |
Grimmkey | 0:b8221deeaa87 | 1321 | if( (gest_ud_count_ == -1) && (gest_lr_count_ == 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1322 | gest_motion_ = DIR_N; |
Grimmkey | 0:b8221deeaa87 | 1323 | } else if( (gest_ud_count_ == 1) && (gest_lr_count_ == 0) ) { |
Grimmkey | 0:b8221deeaa87 | 1324 | gest_motion_ = DIR_S; |
Grimmkey | 0:b8221deeaa87 | 1325 | } else if( (gest_ud_count_ == 0) && (gest_lr_count_ == 1) ) { |
Grimmkey | 0:b8221deeaa87 | 1326 | gest_motion_ = DIR_E; |
Grimmkey | 0:b8221deeaa87 | 1327 | } else if( (gest_ud_count_ == 0) && (gest_lr_count_ == -1) ) { |
Grimmkey | 0:b8221deeaa87 | 1328 | gest_motion_ = DIR_W; |
Grimmkey | 0:b8221deeaa87 | 1329 | } else if( (gest_ud_count_ == -1) && (gest_lr_count_ == 1) ) { |
Grimmkey | 0:b8221deeaa87 | 1330 | gest_motion_ = DIR_NE; |
Grimmkey | 0:b8221deeaa87 | 1331 | /*if( abs(gest_ud_delta_) > abs(gest_lr_delta_) ) { |
Grimmkey | 0:b8221deeaa87 | 1332 | gest_motion_ = DIR_N; |
Grimmkey | 0:b8221deeaa87 | 1333 | } else { |
Grimmkey | 0:b8221deeaa87 | 1334 | gest_motion_ = DIR_E; |
Grimmkey | 0:b8221deeaa87 | 1335 | }*/ |
Grimmkey | 0:b8221deeaa87 | 1336 | } else if( (gest_ud_count_ == 1) && (gest_lr_count_ == -1) ) { |
Grimmkey | 0:b8221deeaa87 | 1337 | if( abs(gest_ud_delta_) > abs(gest_lr_delta_) ) { |
Grimmkey | 0:b8221deeaa87 | 1338 | gest_motion_ = DIR_S; |
Grimmkey | 0:b8221deeaa87 | 1339 | } else { |
Grimmkey | 0:b8221deeaa87 | 1340 | gest_motion_ = DIR_W; |
Grimmkey | 0:b8221deeaa87 | 1341 | } |
Grimmkey | 0:b8221deeaa87 | 1342 | } else if( (gest_ud_count_ == -1) && (gest_lr_count_ == -1) ) { |
Grimmkey | 0:b8221deeaa87 | 1343 | if( abs(gest_ud_delta_) > abs(gest_lr_delta_) ) { |
Grimmkey | 0:b8221deeaa87 | 1344 | gest_motion_ = DIR_N; |
Grimmkey | 0:b8221deeaa87 | 1345 | } else { |
Grimmkey | 0:b8221deeaa87 | 1346 | gest_motion_ = DIR_W; |
Grimmkey | 0:b8221deeaa87 | 1347 | } |
Grimmkey | 0:b8221deeaa87 | 1348 | } else if( (gest_ud_count_ == 1) && (gest_lr_count_ == 1) ) { |
Grimmkey | 0:b8221deeaa87 | 1349 | if( abs(gest_ud_delta_) > abs(gest_lr_delta_) ) { |
Grimmkey | 0:b8221deeaa87 | 1350 | gest_motion_ = DIR_S; |
Grimmkey | 0:b8221deeaa87 | 1351 | } else { |
Grimmkey | 0:b8221deeaa87 | 1352 | gest_motion_ = DIR_E; |
Grimmkey | 0:b8221deeaa87 | 1353 | } |
Grimmkey | 0:b8221deeaa87 | 1354 | } else { |
Grimmkey | 0:b8221deeaa87 | 1355 | return false; |
Grimmkey | 0:b8221deeaa87 | 1356 | } |
Grimmkey | 0:b8221deeaa87 | 1357 | |
Grimmkey | 0:b8221deeaa87 | 1358 | return true; |
Grimmkey | 0:b8221deeaa87 | 1359 | } |
Grimmkey | 0:b8221deeaa87 | 1360 | // Proximity Interrupt Threshold |
Grimmkey | 0:b8221deeaa87 | 1361 | uint8_t APDS9960::getProxIntLowThresh() |
Grimmkey | 0:b8221deeaa87 | 1362 | { |
Grimmkey | 0:b8221deeaa87 | 1363 | uint8_t val = ReadDataByte(APDS9960_PILT); |
Grimmkey | 0:b8221deeaa87 | 1364 | |
Grimmkey | 0:b8221deeaa87 | 1365 | /* Read value from PILT register */ |
Grimmkey | 0:b8221deeaa87 | 1366 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1367 | val = 0; |
Grimmkey | 0:b8221deeaa87 | 1368 | } |
Grimmkey | 0:b8221deeaa87 | 1369 | |
Grimmkey | 0:b8221deeaa87 | 1370 | return val; |
Grimmkey | 0:b8221deeaa87 | 1371 | } |
Grimmkey | 0:b8221deeaa87 | 1372 | |
Grimmkey | 0:b8221deeaa87 | 1373 | bool APDS9960::setProxIntLowThresh(uint8_t threshold) |
Grimmkey | 0:b8221deeaa87 | 1374 | { |
Grimmkey | 0:b8221deeaa87 | 1375 | if( WriteDataByte(APDS9960_PILT, threshold) ) { |
Grimmkey | 0:b8221deeaa87 | 1376 | return false; |
Grimmkey | 0:b8221deeaa87 | 1377 | } |
Grimmkey | 0:b8221deeaa87 | 1378 | |
Grimmkey | 0:b8221deeaa87 | 1379 | return true; |
Grimmkey | 0:b8221deeaa87 | 1380 | } |
Grimmkey | 0:b8221deeaa87 | 1381 | |
Grimmkey | 0:b8221deeaa87 | 1382 | uint8_t APDS9960::getProxIntHighThresh() |
Grimmkey | 0:b8221deeaa87 | 1383 | { |
Grimmkey | 0:b8221deeaa87 | 1384 | uint8_t val = ReadDataByte(APDS9960_PIHT); |
Grimmkey | 0:b8221deeaa87 | 1385 | |
Grimmkey | 0:b8221deeaa87 | 1386 | /* Read value from PIHT register */ |
Grimmkey | 0:b8221deeaa87 | 1387 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1388 | val = 0; |
Grimmkey | 0:b8221deeaa87 | 1389 | } |
Grimmkey | 0:b8221deeaa87 | 1390 | |
Grimmkey | 0:b8221deeaa87 | 1391 | return val; |
Grimmkey | 0:b8221deeaa87 | 1392 | } |
Grimmkey | 0:b8221deeaa87 | 1393 | |
Grimmkey | 0:b8221deeaa87 | 1394 | bool APDS9960::setProxIntHighThresh(uint8_t threshold) |
Grimmkey | 0:b8221deeaa87 | 1395 | { |
Grimmkey | 0:b8221deeaa87 | 1396 | if( WriteDataByte(APDS9960_PIHT, threshold) ) { |
Grimmkey | 0:b8221deeaa87 | 1397 | return false; |
Grimmkey | 0:b8221deeaa87 | 1398 | } |
Grimmkey | 0:b8221deeaa87 | 1399 | |
Grimmkey | 0:b8221deeaa87 | 1400 | return true; |
Grimmkey | 0:b8221deeaa87 | 1401 | } |
Grimmkey | 0:b8221deeaa87 | 1402 | |
Grimmkey | 0:b8221deeaa87 | 1403 | // LED Boost Control |
Grimmkey | 0:b8221deeaa87 | 1404 | uint8_t APDS9960::getLEDBoost() |
Grimmkey | 0:b8221deeaa87 | 1405 | { |
Grimmkey | 0:b8221deeaa87 | 1406 | uint8_t val = ReadDataByte(APDS9960_CONFIG2); |
Grimmkey | 0:b8221deeaa87 | 1407 | |
Grimmkey | 0:b8221deeaa87 | 1408 | /* Read value from CONFIG2 register */ |
Grimmkey | 0:b8221deeaa87 | 1409 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1410 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 1411 | } |
Grimmkey | 0:b8221deeaa87 | 1412 | |
Grimmkey | 0:b8221deeaa87 | 1413 | /* Shift and mask out LED_BOOST bits */ |
Grimmkey | 0:b8221deeaa87 | 1414 | val = (val >> 4) & 0x03; |
Grimmkey | 0:b8221deeaa87 | 1415 | |
Grimmkey | 0:b8221deeaa87 | 1416 | return val; |
Grimmkey | 0:b8221deeaa87 | 1417 | } |
Grimmkey | 0:b8221deeaa87 | 1418 | |
Grimmkey | 0:b8221deeaa87 | 1419 | bool APDS9960::setLEDBoost(uint8_t boost) |
Grimmkey | 0:b8221deeaa87 | 1420 | { |
Grimmkey | 0:b8221deeaa87 | 1421 | uint8_t val = ReadDataByte(APDS9960_CONFIG2); |
Grimmkey | 0:b8221deeaa87 | 1422 | |
Grimmkey | 0:b8221deeaa87 | 1423 | /* Read value from CONFIG2 register */ |
Grimmkey | 0:b8221deeaa87 | 1424 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1425 | return false; |
Grimmkey | 0:b8221deeaa87 | 1426 | } |
Grimmkey | 0:b8221deeaa87 | 1427 | |
Grimmkey | 0:b8221deeaa87 | 1428 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 1429 | boost &= 0x03; |
Grimmkey | 0:b8221deeaa87 | 1430 | boost = boost << 4; |
Grimmkey | 0:b8221deeaa87 | 1431 | val &= 0xCF; |
Grimmkey | 0:b8221deeaa87 | 1432 | val |= boost; |
Grimmkey | 0:b8221deeaa87 | 1433 | |
Grimmkey | 0:b8221deeaa87 | 1434 | /* Write register value back into CONFIG2 register */ |
Grimmkey | 0:b8221deeaa87 | 1435 | if( WriteDataByte(APDS9960_CONFIG2, val) ) { |
Grimmkey | 0:b8221deeaa87 | 1436 | return false; |
Grimmkey | 0:b8221deeaa87 | 1437 | } |
Grimmkey | 0:b8221deeaa87 | 1438 | |
Grimmkey | 0:b8221deeaa87 | 1439 | return true; |
Grimmkey | 0:b8221deeaa87 | 1440 | } |
Grimmkey | 0:b8221deeaa87 | 1441 | |
Grimmkey | 0:b8221deeaa87 | 1442 | // Proximity photodiode select |
Grimmkey | 0:b8221deeaa87 | 1443 | uint8_t APDS9960::getProxGainCompEnable() |
Grimmkey | 0:b8221deeaa87 | 1444 | { |
Grimmkey | 0:b8221deeaa87 | 1445 | uint8_t val = ReadDataByte(APDS9960_CONFIG3); |
Grimmkey | 0:b8221deeaa87 | 1446 | |
Grimmkey | 0:b8221deeaa87 | 1447 | /* Read value from CONFIG3 register */ |
Grimmkey | 0:b8221deeaa87 | 1448 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1449 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 1450 | } |
Grimmkey | 0:b8221deeaa87 | 1451 | |
Grimmkey | 0:b8221deeaa87 | 1452 | /* Shift and mask out PCMP bits */ |
Grimmkey | 0:b8221deeaa87 | 1453 | val = (val >> 5) & 0x01; |
Grimmkey | 0:b8221deeaa87 | 1454 | |
Grimmkey | 0:b8221deeaa87 | 1455 | return val; |
Grimmkey | 0:b8221deeaa87 | 1456 | } |
Grimmkey | 0:b8221deeaa87 | 1457 | |
Grimmkey | 0:b8221deeaa87 | 1458 | bool APDS9960::setProxGainCompEnable(uint8_t enable) |
Grimmkey | 0:b8221deeaa87 | 1459 | { |
Grimmkey | 0:b8221deeaa87 | 1460 | uint8_t val = ReadDataByte(APDS9960_CONFIG3); |
Grimmkey | 0:b8221deeaa87 | 1461 | |
Grimmkey | 0:b8221deeaa87 | 1462 | /* Read value from CONFIG3 register */ |
Grimmkey | 0:b8221deeaa87 | 1463 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1464 | return false; |
Grimmkey | 0:b8221deeaa87 | 1465 | } |
Grimmkey | 0:b8221deeaa87 | 1466 | |
Grimmkey | 0:b8221deeaa87 | 1467 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 1468 | enable &= 0x01; |
Grimmkey | 0:b8221deeaa87 | 1469 | enable = enable << 5; |
Grimmkey | 0:b8221deeaa87 | 1470 | val &= 0xDF; |
Grimmkey | 0:b8221deeaa87 | 1471 | val |= enable; |
Grimmkey | 0:b8221deeaa87 | 1472 | |
Grimmkey | 0:b8221deeaa87 | 1473 | /* Write register value back into CONFIG3 register */ |
Grimmkey | 0:b8221deeaa87 | 1474 | if( WriteDataByte(APDS9960_CONFIG3, val) ) { |
Grimmkey | 0:b8221deeaa87 | 1475 | return false; |
Grimmkey | 0:b8221deeaa87 | 1476 | } |
Grimmkey | 0:b8221deeaa87 | 1477 | |
Grimmkey | 0:b8221deeaa87 | 1478 | return true; |
Grimmkey | 0:b8221deeaa87 | 1479 | } |
Grimmkey | 0:b8221deeaa87 | 1480 | |
Grimmkey | 0:b8221deeaa87 | 1481 | uint8_t APDS9960::getProxPhotoMask() |
Grimmkey | 0:b8221deeaa87 | 1482 | { |
Grimmkey | 0:b8221deeaa87 | 1483 | uint8_t val = ReadDataByte(APDS9960_CONFIG3); |
Grimmkey | 0:b8221deeaa87 | 1484 | |
Grimmkey | 0:b8221deeaa87 | 1485 | /* Read value from CONFIG3 register */ |
Grimmkey | 0:b8221deeaa87 | 1486 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1487 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 1488 | } |
Grimmkey | 0:b8221deeaa87 | 1489 | |
Grimmkey | 0:b8221deeaa87 | 1490 | /* Mask out photodiode enable mask bits */ |
Grimmkey | 0:b8221deeaa87 | 1491 | val &= 0x0F; |
Grimmkey | 0:b8221deeaa87 | 1492 | |
Grimmkey | 0:b8221deeaa87 | 1493 | return val; |
Grimmkey | 0:b8221deeaa87 | 1494 | } |
Grimmkey | 0:b8221deeaa87 | 1495 | |
Grimmkey | 0:b8221deeaa87 | 1496 | bool APDS9960::setProxPhotoMask(uint8_t mask) |
Grimmkey | 0:b8221deeaa87 | 1497 | { |
Grimmkey | 0:b8221deeaa87 | 1498 | uint8_t val = ReadDataByte(APDS9960_CONFIG3); |
Grimmkey | 0:b8221deeaa87 | 1499 | |
Grimmkey | 0:b8221deeaa87 | 1500 | /* Read value from CONFIG3 register */ |
Grimmkey | 0:b8221deeaa87 | 1501 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1502 | return false; |
Grimmkey | 0:b8221deeaa87 | 1503 | } |
Grimmkey | 0:b8221deeaa87 | 1504 | |
Grimmkey | 0:b8221deeaa87 | 1505 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 1506 | mask &= 0x0F; |
Grimmkey | 0:b8221deeaa87 | 1507 | val &= 0xF0; |
Grimmkey | 0:b8221deeaa87 | 1508 | val |= mask; |
Grimmkey | 0:b8221deeaa87 | 1509 | |
Grimmkey | 0:b8221deeaa87 | 1510 | /* Write register value back into CONFIG3 register */ |
Grimmkey | 0:b8221deeaa87 | 1511 | if( WriteDataByte(APDS9960_CONFIG3, val) ) { |
Grimmkey | 0:b8221deeaa87 | 1512 | return false; |
Grimmkey | 0:b8221deeaa87 | 1513 | } |
Grimmkey | 0:b8221deeaa87 | 1514 | |
Grimmkey | 0:b8221deeaa87 | 1515 | return true; |
Grimmkey | 0:b8221deeaa87 | 1516 | } |
Grimmkey | 0:b8221deeaa87 | 1517 | |
Grimmkey | 0:b8221deeaa87 | 1518 | // Gesture threshold control |
Grimmkey | 0:b8221deeaa87 | 1519 | uint8_t APDS9960::getGestEnterThresh() |
Grimmkey | 0:b8221deeaa87 | 1520 | { |
Grimmkey | 0:b8221deeaa87 | 1521 | uint8_t val = ReadDataByte(APDS9960_GPENTH); |
Grimmkey | 0:b8221deeaa87 | 1522 | /* Read value from GPENTH register */ |
Grimmkey | 0:b8221deeaa87 | 1523 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1524 | val = 0; |
Grimmkey | 0:b8221deeaa87 | 1525 | } |
Grimmkey | 0:b8221deeaa87 | 1526 | return val; |
Grimmkey | 0:b8221deeaa87 | 1527 | } |
Grimmkey | 0:b8221deeaa87 | 1528 | |
Grimmkey | 0:b8221deeaa87 | 1529 | bool APDS9960::setGestEnterThresh(uint8_t threshold) |
Grimmkey | 0:b8221deeaa87 | 1530 | { |
Grimmkey | 0:b8221deeaa87 | 1531 | if( WriteDataByte(APDS9960_GPENTH, threshold) ) { |
Grimmkey | 0:b8221deeaa87 | 1532 | return false; |
Grimmkey | 0:b8221deeaa87 | 1533 | } |
Grimmkey | 0:b8221deeaa87 | 1534 | return true; |
Grimmkey | 0:b8221deeaa87 | 1535 | } |
Grimmkey | 0:b8221deeaa87 | 1536 | |
Grimmkey | 0:b8221deeaa87 | 1537 | uint8_t APDS9960::getGestExitThresh() |
Grimmkey | 0:b8221deeaa87 | 1538 | { |
Grimmkey | 0:b8221deeaa87 | 1539 | uint8_t val = ReadDataByte(APDS9960_GEXTH); |
Grimmkey | 0:b8221deeaa87 | 1540 | /* Read value from GEXTH register */ |
Grimmkey | 0:b8221deeaa87 | 1541 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1542 | val = 0; |
Grimmkey | 0:b8221deeaa87 | 1543 | } |
Grimmkey | 0:b8221deeaa87 | 1544 | return val; |
Grimmkey | 0:b8221deeaa87 | 1545 | } |
Grimmkey | 0:b8221deeaa87 | 1546 | |
Grimmkey | 0:b8221deeaa87 | 1547 | bool APDS9960::setGestExitThresh(uint8_t threshold) |
Grimmkey | 0:b8221deeaa87 | 1548 | { |
Grimmkey | 0:b8221deeaa87 | 1549 | if( WriteDataByte(APDS9960_GEXTH, threshold) ) { |
Grimmkey | 0:b8221deeaa87 | 1550 | return false; |
Grimmkey | 0:b8221deeaa87 | 1551 | } |
Grimmkey | 0:b8221deeaa87 | 1552 | return true; |
Grimmkey | 0:b8221deeaa87 | 1553 | } |
Grimmkey | 0:b8221deeaa87 | 1554 | |
Grimmkey | 0:b8221deeaa87 | 1555 | // Gesture LED, gain, and time control |
Grimmkey | 0:b8221deeaa87 | 1556 | uint8_t APDS9960::getGestWaitTime() |
Grimmkey | 0:b8221deeaa87 | 1557 | { |
Grimmkey | 0:b8221deeaa87 | 1558 | uint8_t val = ReadDataByte(APDS9960_GCONF2); |
Grimmkey | 0:b8221deeaa87 | 1559 | /* Read value from GCONF2 register */ |
Grimmkey | 0:b8221deeaa87 | 1560 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1561 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 1562 | } |
Grimmkey | 0:b8221deeaa87 | 1563 | /* Mask out GWTIME bits */ |
Grimmkey | 0:b8221deeaa87 | 1564 | val &= 0x07; |
Grimmkey | 0:b8221deeaa87 | 1565 | return val; |
Grimmkey | 0:b8221deeaa87 | 1566 | } |
Grimmkey | 0:b8221deeaa87 | 1567 | |
Grimmkey | 0:b8221deeaa87 | 1568 | bool APDS9960::setGestWaitTime(uint8_t time) |
Grimmkey | 0:b8221deeaa87 | 1569 | { |
Grimmkey | 0:b8221deeaa87 | 1570 | uint8_t val = ReadDataByte(APDS9960_GCONF2); |
Grimmkey | 0:b8221deeaa87 | 1571 | /* Read value from GCONF2 register */ |
Grimmkey | 0:b8221deeaa87 | 1572 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1573 | return false; |
Grimmkey | 0:b8221deeaa87 | 1574 | } |
Grimmkey | 0:b8221deeaa87 | 1575 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 1576 | time &= 0x07; |
Grimmkey | 0:b8221deeaa87 | 1577 | val &= 0xF8; |
Grimmkey | 0:b8221deeaa87 | 1578 | val |= time; |
Grimmkey | 0:b8221deeaa87 | 1579 | /* Write register value back into GCONF2 register */ |
Grimmkey | 0:b8221deeaa87 | 1580 | if( WriteDataByte(APDS9960_GCONF2, val) ) { |
Grimmkey | 0:b8221deeaa87 | 1581 | return false; |
Grimmkey | 0:b8221deeaa87 | 1582 | } |
Grimmkey | 0:b8221deeaa87 | 1583 | return true; |
Grimmkey | 0:b8221deeaa87 | 1584 | } |
Grimmkey | 0:b8221deeaa87 | 1585 | |
Grimmkey | 0:b8221deeaa87 | 1586 | // Gesture mode |
Grimmkey | 0:b8221deeaa87 | 1587 | uint8_t APDS9960::getGestMode() |
Grimmkey | 0:b8221deeaa87 | 1588 | { |
Grimmkey | 0:b8221deeaa87 | 1589 | uint8_t val = ReadDataByte(APDS9960_GCONF4); |
Grimmkey | 0:b8221deeaa87 | 1590 | /* Read value from GCONF4 register */ |
Grimmkey | 0:b8221deeaa87 | 1591 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1592 | return ERROR; |
Grimmkey | 0:b8221deeaa87 | 1593 | } |
Grimmkey | 0:b8221deeaa87 | 1594 | /* Mask out GMODE bit */ |
Grimmkey | 0:b8221deeaa87 | 1595 | val &= 0x01; |
Grimmkey | 0:b8221deeaa87 | 1596 | return val; |
Grimmkey | 0:b8221deeaa87 | 1597 | } |
Grimmkey | 0:b8221deeaa87 | 1598 | |
Grimmkey | 0:b8221deeaa87 | 1599 | bool APDS9960::setGestMode(uint8_t mode) |
Grimmkey | 0:b8221deeaa87 | 1600 | { |
Grimmkey | 0:b8221deeaa87 | 1601 | uint8_t val = ReadDataByte(APDS9960_GCONF4); |
Grimmkey | 0:b8221deeaa87 | 1602 | /* Read value from GCONF4 register */ |
Grimmkey | 0:b8221deeaa87 | 1603 | if( val == ERROR ) { |
Grimmkey | 0:b8221deeaa87 | 1604 | return false; |
Grimmkey | 0:b8221deeaa87 | 1605 | } |
Grimmkey | 0:b8221deeaa87 | 1606 | /* Set bits in register to given value */ |
Grimmkey | 0:b8221deeaa87 | 1607 | mode &= 0x01; |
Grimmkey | 0:b8221deeaa87 | 1608 | val &= 0xFE; |
Grimmkey | 0:b8221deeaa87 | 1609 | val |= mode; |
Grimmkey | 0:b8221deeaa87 | 1610 | /* Write register value back into GCONF4 register */ |
Grimmkey | 0:b8221deeaa87 | 1611 | if( WriteDataByte(APDS9960_GCONF4, val) ) { |
Grimmkey | 0:b8221deeaa87 | 1612 | return false; |
Grimmkey | 0:b8221deeaa87 | 1613 | } |
Grimmkey | 0:b8221deeaa87 | 1614 | return true; |
Grimmkey | 0:b8221deeaa87 | 1615 | } |
Grimmkey | 0:b8221deeaa87 | 1616 | |
Grimmkey | 0:b8221deeaa87 | 1617 | // Raw I2C Commands |
Grimmkey | 0:b8221deeaa87 | 1618 | bool APDS9960::WriteByte(uint8_t val) |
Grimmkey | 0:b8221deeaa87 | 1619 | { |
Grimmkey | 0:b8221deeaa87 | 1620 | if(i2c_.write(val)) { |
Grimmkey | 0:b8221deeaa87 | 1621 | return false; |
Grimmkey | 0:b8221deeaa87 | 1622 | } |
Grimmkey | 0:b8221deeaa87 | 1623 | |
Grimmkey | 0:b8221deeaa87 | 1624 | return true; |
Grimmkey | 0:b8221deeaa87 | 1625 | } |
Grimmkey | 0:b8221deeaa87 | 1626 | |
Grimmkey | 0:b8221deeaa87 | 1627 | int APDS9960::WriteDataByte(char reg, char val) |
Grimmkey | 0:b8221deeaa87 | 1628 | { |
Grimmkey | 0:b8221deeaa87 | 1629 | /*Wire.beginTransmission(APDS9960_I2C_ADDR); |
Grimmkey | 0:b8221deeaa87 | 1630 | Wire.write(reg); |
Grimmkey | 0:b8221deeaa87 | 1631 | Wire.write(val); |
Grimmkey | 0:b8221deeaa87 | 1632 | if( Wire.endTransmission() != 0 ) { |
Grimmkey | 0:b8221deeaa87 | 1633 | return false; |
Grimmkey | 0:b8221deeaa87 | 1634 | }*/ |
Grimmkey | 0:b8221deeaa87 | 1635 | /*char regdata[1]; |
Grimmkey | 0:b8221deeaa87 | 1636 | regdata[0] = reg;*/ |
Grimmkey | 0:b8221deeaa87 | 1637 | // printf("reg is %u, val is %u\r\n", reg, val); |
Grimmkey | 0:b8221deeaa87 | 1638 | |
Grimmkey | 0:b8221deeaa87 | 1639 | char cmd[2] = {reg, val}; |
Grimmkey | 0:b8221deeaa87 | 1640 | uint8_t data = i2c_.write(APDS9960_I2C_ADDR, cmd, 2,true); |
Grimmkey | 0:b8221deeaa87 | 1641 | /* if(i2c_.write(APDS9960_I2C_ADDR, (char*) &val, 1) !=0) { |
Grimmkey | 0:b8221deeaa87 | 1642 | return false; |
Grimmkey | 0:b8221deeaa87 | 1643 | }*/ |
Grimmkey | 0:b8221deeaa87 | 1644 | |
Grimmkey | 0:b8221deeaa87 | 1645 | // uint8_t temp=i2c_.read(APDS9960_I2C_ADDR); |
Grimmkey | 0:b8221deeaa87 | 1646 | //printf("temp:%u\r\n"); |
Grimmkey | 0:b8221deeaa87 | 1647 | |
Grimmkey | 0:b8221deeaa87 | 1648 | return data; |
Grimmkey | 0:b8221deeaa87 | 1649 | |
Grimmkey | 0:b8221deeaa87 | 1650 | } |
Grimmkey | 0:b8221deeaa87 | 1651 | |
Grimmkey | 0:b8221deeaa87 | 1652 | /*bool APDS9960::WriteDataBlock(uint8_t reg, uint8_t *val, unsigned int len){ |
Grimmkey | 0:b8221deeaa87 | 1653 | unsigned int i; |
Grimmkey | 0:b8221deeaa87 | 1654 | char regdata[len]; |
Grimmkey | 0:b8221deeaa87 | 1655 | |
Grimmkey | 0:b8221deeaa87 | 1656 | //Wire.beginTransmission(APDS9960_I2C_ADDR); |
Grimmkey | 0:b8221deeaa87 | 1657 | //Wire.write(reg); |
Grimmkey | 0:b8221deeaa87 | 1658 | for(i = 0; i < len; i++) { |
Grimmkey | 0:b8221deeaa87 | 1659 | //Wire.beginTransmission(val[i]); |
Grimmkey | 0:b8221deeaa87 | 1660 | regdata[i]= reg; |
Grimmkey | 0:b8221deeaa87 | 1661 | |
Grimmkey | 0:b8221deeaa87 | 1662 | } |
Grimmkey | 0:b8221deeaa87 | 1663 | if( Wire.endTransmission() != 0 ) { |
Grimmkey | 0:b8221deeaa87 | 1664 | return false; |
Grimmkey | 0:b8221deeaa87 | 1665 | } |
Grimmkey | 0:b8221deeaa87 | 1666 | |
Grimmkey | 0:b8221deeaa87 | 1667 | return true; |
Grimmkey | 0:b8221deeaa87 | 1668 | }*/ |
Grimmkey | 0:b8221deeaa87 | 1669 | |
Grimmkey | 0:b8221deeaa87 | 1670 | uint8_t APDS9960::ReadDataByte(char reg) |
Grimmkey | 0:b8221deeaa87 | 1671 | { |
Grimmkey | 0:b8221deeaa87 | 1672 | char val; |
Grimmkey | 0:b8221deeaa87 | 1673 | /* Indicate which register we want to read from */ |
Grimmkey | 0:b8221deeaa87 | 1674 | if (i2c_.write(APDS9960_I2C_ADDR, ®, 1, true)) { |
Grimmkey | 0:b8221deeaa87 | 1675 | //printf("write failed\n\r"); |
Grimmkey | 0:b8221deeaa87 | 1676 | return false; |
Grimmkey | 0:b8221deeaa87 | 1677 | } |
Grimmkey | 0:b8221deeaa87 | 1678 | /* Read from register */ |
Grimmkey | 0:b8221deeaa87 | 1679 | if(i2c_.read(APDS9960_I2C_ADDR, &val, 1)) { |
Grimmkey | 0:b8221deeaa87 | 1680 | //printf("read failed\r\n"); |
Grimmkey | 0:b8221deeaa87 | 1681 | return false; |
Grimmkey | 0:b8221deeaa87 | 1682 | } |
Grimmkey | 0:b8221deeaa87 | 1683 | |
Grimmkey | 0:b8221deeaa87 | 1684 | /*while (Wire.available()) { |
Grimmkey | 0:b8221deeaa87 | 1685 | val = Wire.read(); |
Grimmkey | 0:b8221deeaa87 | 1686 | }*/ |
Grimmkey | 0:b8221deeaa87 | 1687 | // printf("The register we are reading from is %u\r\n",reg); |
Grimmkey | 0:b8221deeaa87 | 1688 | // printf("The read value is %u\r\n", *val); |
Grimmkey | 0:b8221deeaa87 | 1689 | |
Grimmkey | 0:b8221deeaa87 | 1690 | return val; |
Grimmkey | 0:b8221deeaa87 | 1691 | } |
Grimmkey | 0:b8221deeaa87 | 1692 | |
Grimmkey | 0:b8221deeaa87 | 1693 | int APDS9960::ReadDataBlock(uint8_t reg, uint8_t *val, unsigned int len) |
Grimmkey | 0:b8221deeaa87 | 1694 | { |
Grimmkey | 0:b8221deeaa87 | 1695 | |
Grimmkey | 0:b8221deeaa87 | 1696 | /*Indicate which register we want to read from */ |
Grimmkey | 0:b8221deeaa87 | 1697 | if (i2c_.write(APDS9960_I2C_ADDR,(char*) ®,1)) { |
Grimmkey | 0:b8221deeaa87 | 1698 | return -1; |
Grimmkey | 0:b8221deeaa87 | 1699 | } |
Grimmkey | 0:b8221deeaa87 | 1700 | if ( len == 0) { |
Grimmkey | 0:b8221deeaa87 | 1701 | return -1; |
Grimmkey | 0:b8221deeaa87 | 1702 | } |
Grimmkey | 0:b8221deeaa87 | 1703 | /*Read block data */ |
Grimmkey | 0:b8221deeaa87 | 1704 | //Wire.requestFrom(APDS9960_I2C_ADDR, len); |
Grimmkey | 0:b8221deeaa87 | 1705 | // while (i < len) { |
Grimmkey | 0:b8221deeaa87 | 1706 | if (i2c_.read(APDS9960_I2C_ADDR,(char*) val, len) != 0) { |
Grimmkey | 0:b8221deeaa87 | 1707 | return -1; |
Grimmkey | 0:b8221deeaa87 | 1708 | } |
Grimmkey | 0:b8221deeaa87 | 1709 | |
Grimmkey | 0:b8221deeaa87 | 1710 | // i++; |
Grimmkey | 0:b8221deeaa87 | 1711 | //} |
Grimmkey | 0:b8221deeaa87 | 1712 | /* if (i > len) { |
Grimmkey | 0:b8221deeaa87 | 1713 | return -1; |
Grimmkey | 0:b8221deeaa87 | 1714 | }*/ |
Grimmkey | 0:b8221deeaa87 | 1715 | |
Grimmkey | 0:b8221deeaa87 | 1716 | return len; |
Grimmkey | 0:b8221deeaa87 | 1717 | } |