Georgia Institute of Technology ECE 4180 Spring 2015 Jazz Hands project, Nordic nRF51822 half

Dependencies:   mbed

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?

UserRevisionLine numberNew 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, &reg, 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*) &reg,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 }