Uses the APDS_9960 Digital Proximity, Ambient Light, RGB and Gesture Sensor library to play detected gesture sounds on a speaker from the SDcard

Dependencies:   mbed SDFileSystem wave_player

Committer:
kbhagat6
Date:
Fri Mar 06 19:35:24 2015 +0000
Revision:
7:0564c6faf8aa
Parent:
6:687dff16904e
Child:
8:6fa15d4e31fb
added more functions and reorgnanized

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kbhagat6 0:437ae08befe3 1 #include "glibr.h"
kbhagat6 0:437ae08befe3 2 #include "mbed.h"
kbhagat6 0:437ae08befe3 3
kbhagat6 0:437ae08befe3 4
kbhagat6 0:437ae08befe3 5
kbhagat6 0:437ae08befe3 6
kbhagat6 0:437ae08befe3 7 glibr::glibr(PinName sda, PinName scl):i2c(sda, scl){
kbhagat6 6:687dff16904e 8 gesture_ud_delta_ = 0;
kbhagat6 6:687dff16904e 9 gesture_lr_delta_ = 0;
kbhagat6 6:687dff16904e 10
kbhagat6 6:687dff16904e 11 gesture_ud_count_ = 0;
kbhagat6 6:687dff16904e 12 gesture_lr_count_ = 0;
kbhagat6 6:687dff16904e 13
kbhagat6 6:687dff16904e 14 gesture_near_count_ = 0;
kbhagat6 6:687dff16904e 15 gesture_far_count_ = 0;
kbhagat6 6:687dff16904e 16
kbhagat6 6:687dff16904e 17 gesture_state_ = 0;
kbhagat6 6:687dff16904e 18 gesture_motion_ = DIR_NONE;
kbhagat6 0:437ae08befe3 19 }
kbhagat6 0:437ae08befe3 20
kbhagat6 0:437ae08befe3 21 glibr::~glibr(){
kbhagat6 0:437ae08befe3 22
kbhagat6 0:437ae08befe3 23 }
kbhagat6 0:437ae08befe3 24
kbhagat6 0:437ae08befe3 25 uint8_t glibr::ginit(){
kbhagat6 0:437ae08befe3 26 uint8_t id;
kbhagat6 0:437ae08befe3 27
kbhagat6 0:437ae08befe3 28 // if( !wireReadDataByte(APDS9960_ID, id) ) {
kbhagat6 0:437ae08befe3 29
kbhagat6 0:437ae08befe3 30 id=I2CreadByte(APDS9960_I2C_ADDR, APDS9960_ID);
kbhagat6 0:437ae08befe3 31
kbhagat6 0:437ae08befe3 32 if( (!(id == APDS9960_ID_1 || id == APDS9960_ID_2))||id==ERROR) {
kbhagat6 0:437ae08befe3 33 return false;
kbhagat6 0:437ae08befe3 34 }
kbhagat6 0:437ae08befe3 35
kbhagat6 0:437ae08befe3 36 if(!setMode(ALL, OFF)) {
kbhagat6 0:437ae08befe3 37 return false;
kbhagat6 0:437ae08befe3 38 }
kbhagat6 0:437ae08befe3 39 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_ATIME, DEFAULT_ATIME)){
kbhagat6 0:437ae08befe3 40 return false;
kbhagat6 0:437ae08befe3 41 }
kbhagat6 0:437ae08befe3 42 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_WTIME, DEFAULT_WTIME)){
kbhagat6 0:437ae08befe3 43 return false;
kbhagat6 0:437ae08befe3 44 }
kbhagat6 0:437ae08befe3 45 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PPULSE, DEFAULT_PROX_PPULSE)){
kbhagat6 0:437ae08befe3 46 return false;
kbhagat6 0:437ae08befe3 47 }
kbhagat6 0:437ae08befe3 48 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_POFFSET_UR, DEFAULT_POFFSET_UR)){
kbhagat6 0:437ae08befe3 49 return false;
kbhagat6 0:437ae08befe3 50 }
kbhagat6 0:437ae08befe3 51 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_POFFSET_DL, DEFAULT_POFFSET_DL)){
kbhagat6 0:437ae08befe3 52 return false;
kbhagat6 0:437ae08befe3 53 }
kbhagat6 0:437ae08befe3 54 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONFIG1, DEFAULT_CONFIG1)){
kbhagat6 0:437ae08befe3 55 return false;
kbhagat6 0:437ae08befe3 56 }
kbhagat6 0:437ae08befe3 57
kbhagat6 0:437ae08befe3 58 if( !setLEDDrive(DEFAULT_LDRIVE) ) {
kbhagat6 0:437ae08befe3 59 return false;
kbhagat6 0:437ae08befe3 60 }
kbhagat6 0:437ae08befe3 61
kbhagat6 0:437ae08befe3 62 if( !setProximityGain(DEFAULT_PGAIN) ) {
kbhagat6 0:437ae08befe3 63 return false;
kbhagat6 0:437ae08befe3 64 }
kbhagat6 0:437ae08befe3 65 if( !setAmbientLightGain(DEFAULT_AGAIN) ) {
kbhagat6 0:437ae08befe3 66 return false;
kbhagat6 0:437ae08befe3 67 }
kbhagat6 0:437ae08befe3 68 if( !setProxIntLowThresh(DEFAULT_PILT) ) {
kbhagat6 0:437ae08befe3 69 return false;
kbhagat6 0:437ae08befe3 70 }
kbhagat6 1:c7215f5f9a72 71 if( !setProxIntHighThresh(DEFAULT_PIHT) ) {
kbhagat6 1:c7215f5f9a72 72 return false;
kbhagat6 1:c7215f5f9a72 73 }
kbhagat6 1:c7215f5f9a72 74 if( !setLightIntLowThreshold(DEFAULT_AILT) ) {
kbhagat6 1:c7215f5f9a72 75 return false;
kbhagat6 1:c7215f5f9a72 76 }
kbhagat6 1:c7215f5f9a72 77 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONFIG2, DEFAULT_CONFIG2) ) {
kbhagat6 1:c7215f5f9a72 78 return false;
kbhagat6 1:c7215f5f9a72 79 }
kbhagat6 1:c7215f5f9a72 80 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONFIG3, DEFAULT_CONFIG3) ) {
kbhagat6 1:c7215f5f9a72 81 return false;
kbhagat6 1:c7215f5f9a72 82 }
kbhagat6 1:c7215f5f9a72 83
kbhagat6 1:c7215f5f9a72 84 if( !setGestureEnterThresh(DEFAULT_GPENTH) ) {
kbhagat6 1:c7215f5f9a72 85 return false;
kbhagat6 1:c7215f5f9a72 86 }
kbhagat6 1:c7215f5f9a72 87 if( !setGestureExitThresh(DEFAULT_GEXTH) ) {
kbhagat6 1:c7215f5f9a72 88 return false;
kbhagat6 1:c7215f5f9a72 89 }
kbhagat6 1:c7215f5f9a72 90 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GCONF1, DEFAULT_GCONF1) ) {
kbhagat6 1:c7215f5f9a72 91 return false;
kbhagat6 1:c7215f5f9a72 92 }
kbhagat6 1:c7215f5f9a72 93 if( !setGestureGain(DEFAULT_GGAIN) ) {
kbhagat6 1:c7215f5f9a72 94 return false;
kbhagat6 1:c7215f5f9a72 95 }
kbhagat6 1:c7215f5f9a72 96 if( !setGestureLEDDrive(DEFAULT_GLDRIVE) ) {
kbhagat6 1:c7215f5f9a72 97 return false;
kbhagat6 1:c7215f5f9a72 98 }
kbhagat6 1:c7215f5f9a72 99 if( !setGestureWaitTime(DEFAULT_GWTIME) ) {
kbhagat6 1:c7215f5f9a72 100 return false;
kbhagat6 1:c7215f5f9a72 101 }
kbhagat6 1:c7215f5f9a72 102 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GOFFSET_U, DEFAULT_GOFFSET) ) {
kbhagat6 1:c7215f5f9a72 103 return false;
kbhagat6 1:c7215f5f9a72 104 }
kbhagat6 1:c7215f5f9a72 105 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GOFFSET_D, DEFAULT_GOFFSET) ) {
kbhagat6 1:c7215f5f9a72 106 return false;
kbhagat6 1:c7215f5f9a72 107 }
kbhagat6 1:c7215f5f9a72 108 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GOFFSET_L, DEFAULT_GOFFSET) ) {
kbhagat6 1:c7215f5f9a72 109 return false;
kbhagat6 1:c7215f5f9a72 110 }
kbhagat6 1:c7215f5f9a72 111 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GOFFSET_R, DEFAULT_GOFFSET) ) {
kbhagat6 1:c7215f5f9a72 112 return false;
kbhagat6 1:c7215f5f9a72 113 }
kbhagat6 1:c7215f5f9a72 114 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GPULSE, DEFAULT_GPULSE) ) {
kbhagat6 1:c7215f5f9a72 115 return false;
kbhagat6 1:c7215f5f9a72 116 }
kbhagat6 1:c7215f5f9a72 117 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GCONF3, DEFAULT_GCONF3) ) {
kbhagat6 1:c7215f5f9a72 118 return false;
kbhagat6 1:c7215f5f9a72 119 }
kbhagat6 1:c7215f5f9a72 120 if( !setGestureIntEnable(DEFAULT_GIEN) ) {
kbhagat6 1:c7215f5f9a72 121 return false;
kbhagat6 1:c7215f5f9a72 122 }
kbhagat6 0:437ae08befe3 123
kbhagat6 0:437ae08befe3 124
kbhagat6 0:437ae08befe3 125
kbhagat6 0:437ae08befe3 126 return id;
kbhagat6 0:437ae08befe3 127 }
kbhagat6 7:0564c6faf8aa 128 #if 0
kbhagat6 7:0564c6faf8aa 129 /* Gesture config register dump */
kbhagat6 7:0564c6faf8aa 130 uint8_t reg;
kbhagat6 7:0564c6faf8aa 131 uint8_t val;
kbhagat6 7:0564c6faf8aa 132
kbhagat6 7:0564c6faf8aa 133 for(reg = 0x80; reg <= 0xAF; reg++) {
kbhagat6 7:0564c6faf8aa 134 if( (reg != 0x82) && \
kbhagat6 7:0564c6faf8aa 135 (reg != 0x8A) && \
kbhagat6 7:0564c6faf8aa 136 (reg != 0x91) && \
kbhagat6 7:0564c6faf8aa 137 (reg != 0xA8) && \
kbhagat6 7:0564c6faf8aa 138 (reg != 0xAC) && \
kbhagat6 7:0564c6faf8aa 139 (reg != 0xAD) )
kbhagat6 7:0564c6faf8aa 140 {
kbhagat6 7:0564c6faf8aa 141 val= I2CreadByte(APDS9960_I2C_ADDR, reg);
kbhagat6 7:0564c6faf8aa 142 if(val==ERROR){
kbhagat6 7:0564c6faf8aa 143 printf("ERROR");
kbhagat6 7:0564c6faf8aa 144 }
kbhagat6 7:0564c6faf8aa 145 /*
kbhagat6 7:0564c6faf8aa 146 print(reg, HEX);
kbhagat6 7:0564c6faf8aa 147 print(": 0x");
kbhagat6 7:0564c6faf8aa 148 println(val, HEX);*/
kbhagat6 7:0564c6faf8aa 149 }
kbhagat6 7:0564c6faf8aa 150 }
kbhagat6 0:437ae08befe3 151
kbhagat6 7:0564c6faf8aa 152 for(reg = 0xE4; reg <= 0xE7; reg++) {
kbhagat6 7:0564c6faf8aa 153 val= I2CreadByte(APDS9960_I2C_ADDR, reg);
kbhagat6 7:0564c6faf8aa 154 Serial.print(reg, HEX);
kbhagat6 7:0564c6faf8aa 155 Serial.print(": 0x");
kbhagat6 7:0564c6faf8aa 156 Serial.println(val, HEX);
kbhagat6 7:0564c6faf8aa 157 }
kbhagat6 7:0564c6faf8aa 158 #endif
kbhagat6 7:0564c6faf8aa 159
kbhagat6 7:0564c6faf8aa 160 return true;
kbhagat6 7:0564c6faf8aa 161 }
kbhagat6 0:437ae08befe3 162
kbhagat6 0:437ae08befe3 163
kbhagat6 0:437ae08befe3 164
kbhagat6 0:437ae08befe3 165 /**
kbhagat6 0:437ae08befe3 166 * @brief Enables or disables a feature in the APDS-9960
kbhagat6 0:437ae08befe3 167 *
kbhagat6 0:437ae08befe3 168 * @param[in] mode which feature to enable
kbhagat6 0:437ae08befe3 169 * @param[in] enable ON (1) or OFF (0)
kbhagat6 0:437ae08befe3 170 * @return True if operation success. False otherwise.
kbhagat6 0:437ae08befe3 171 */
kbhagat6 0:437ae08befe3 172 bool glibr::setMode(uint8_t mode, uint8_t enable)
kbhagat6 0:437ae08befe3 173 {
kbhagat6 0:437ae08befe3 174 uint8_t reg_val;
kbhagat6 0:437ae08befe3 175
kbhagat6 0:437ae08befe3 176 /* Read current ENABLE register */
kbhagat6 0:437ae08befe3 177 reg_val = getMode();
kbhagat6 0:437ae08befe3 178 if( reg_val == ERROR ) {
kbhagat6 0:437ae08befe3 179 return false;
kbhagat6 0:437ae08befe3 180 }
kbhagat6 0:437ae08befe3 181
kbhagat6 0:437ae08befe3 182 /* Change bit(s) in ENABLE register */
kbhagat6 0:437ae08befe3 183 enable = enable & 0x01;
kbhagat6 0:437ae08befe3 184 if( mode >= 0 && mode <= 6 ) {
kbhagat6 0:437ae08befe3 185 if (enable) {
kbhagat6 0:437ae08befe3 186 reg_val |= (1 << mode);
kbhagat6 0:437ae08befe3 187 } else {
kbhagat6 0:437ae08befe3 188 reg_val &= ~(1 << mode);
kbhagat6 0:437ae08befe3 189 }
kbhagat6 0:437ae08befe3 190 } else if( mode == ALL ) {
kbhagat6 0:437ae08befe3 191 if (enable) {
kbhagat6 0:437ae08befe3 192 reg_val = 0x7F;
kbhagat6 0:437ae08befe3 193 } else {
kbhagat6 0:437ae08befe3 194 reg_val = 0x00;
kbhagat6 0:437ae08befe3 195 }
kbhagat6 0:437ae08befe3 196 }
kbhagat6 0:437ae08befe3 197
kbhagat6 0:437ae08befe3 198 /* Write value back to ENABLE register */
kbhagat6 0:437ae08befe3 199 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_ENABLE, reg_val)){
kbhagat6 0:437ae08befe3 200 return false;
kbhagat6 0:437ae08befe3 201 }
kbhagat6 0:437ae08befe3 202
kbhagat6 0:437ae08befe3 203
kbhagat6 0:437ae08befe3 204
kbhagat6 0:437ae08befe3 205 return true;
kbhagat6 0:437ae08befe3 206 }
kbhagat6 0:437ae08befe3 207
kbhagat6 0:437ae08befe3 208 uint8_t glibr::getMode()
kbhagat6 0:437ae08befe3 209 {
kbhagat6 6:687dff16904e 210 uint8_t val;
kbhagat6 6:687dff16904e 211 val= I2CreadByte(APDS9960_I2C_ADDR, APDS9960_ENABLE);
kbhagat6 6:687dff16904e 212 if(val==ERROR){
kbhagat6 6:687dff16904e 213 return ERROR;
kbhagat6 6:687dff16904e 214 }
kbhagat6 6:687dff16904e 215 return val;
kbhagat6 0:437ae08befe3 216 }
kbhagat6 0:437ae08befe3 217
kbhagat6 0:437ae08befe3 218
kbhagat6 0:437ae08befe3 219
kbhagat6 3:26146a08bb22 220 bool glibr::enableLightSensor(bool interrupts)
kbhagat6 3:26146a08bb22 221 {
kbhagat6 3:26146a08bb22 222
kbhagat6 3:26146a08bb22 223 /* Set default gain, interrupts, enable power, and enable sensor */
kbhagat6 3:26146a08bb22 224 if( !setAmbientLightGain(DEFAULT_AGAIN) ) {
kbhagat6 3:26146a08bb22 225 return false;
kbhagat6 3:26146a08bb22 226 }
kbhagat6 3:26146a08bb22 227 if( interrupts ) {
kbhagat6 3:26146a08bb22 228 if( !setAmbientLightIntEnable(1) ) {
kbhagat6 3:26146a08bb22 229 return false;
kbhagat6 3:26146a08bb22 230 }
kbhagat6 3:26146a08bb22 231 } else {
kbhagat6 3:26146a08bb22 232 if( !setAmbientLightIntEnable(0) ) {
kbhagat6 3:26146a08bb22 233 return false;
kbhagat6 3:26146a08bb22 234 }
kbhagat6 3:26146a08bb22 235 }
kbhagat6 3:26146a08bb22 236 if( !enablePower() ){
kbhagat6 3:26146a08bb22 237 return false;
kbhagat6 3:26146a08bb22 238 }
kbhagat6 3:26146a08bb22 239 if( !setMode(AMBIENT_LIGHT, 1) ) {
kbhagat6 3:26146a08bb22 240 return false;
kbhagat6 3:26146a08bb22 241 }
kbhagat6 3:26146a08bb22 242
kbhagat6 3:26146a08bb22 243 return true;
kbhagat6 3:26146a08bb22 244
kbhagat6 3:26146a08bb22 245 }
kbhagat6 3:26146a08bb22 246
kbhagat6 3:26146a08bb22 247 /**
kbhagat6 3:26146a08bb22 248 * @brief Ends the light sensor on the APDS-9960
kbhagat6 3:26146a08bb22 249 *
kbhagat6 3:26146a08bb22 250 * @return True if sensor disabled correctly. False on error.
kbhagat6 3:26146a08bb22 251 */
kbhagat6 3:26146a08bb22 252 bool glibr::disableLightSensor()
kbhagat6 3:26146a08bb22 253 {
kbhagat6 3:26146a08bb22 254 if( !setAmbientLightIntEnable(0) ) {
kbhagat6 3:26146a08bb22 255 return false;
kbhagat6 3:26146a08bb22 256 }
kbhagat6 3:26146a08bb22 257 if( !setMode(AMBIENT_LIGHT, 0) ) {
kbhagat6 3:26146a08bb22 258 return false;
kbhagat6 3:26146a08bb22 259 }
kbhagat6 3:26146a08bb22 260
kbhagat6 3:26146a08bb22 261 return true;
kbhagat6 3:26146a08bb22 262 }
kbhagat6 3:26146a08bb22 263
kbhagat6 3:26146a08bb22 264 /**
kbhagat6 3:26146a08bb22 265 * @brief Starts the proximity sensor on the APDS-9960
kbhagat6 3:26146a08bb22 266 *
kbhagat6 3:26146a08bb22 267 * @param[in] interrupts true to enable hardware external interrupt on proximity
kbhagat6 3:26146a08bb22 268 * @return True if sensor enabled correctly. False on error.
kbhagat6 3:26146a08bb22 269 */
kbhagat6 3:26146a08bb22 270 bool glibr::enableProximitySensor(bool interrupts)
kbhagat6 3:26146a08bb22 271 {
kbhagat6 3:26146a08bb22 272 /* Set default gain, LED, interrupts, enable power, and enable sensor */
kbhagat6 3:26146a08bb22 273 if( !setProximityGain(DEFAULT_PGAIN) ) {
kbhagat6 3:26146a08bb22 274 return false;
kbhagat6 3:26146a08bb22 275 }
kbhagat6 3:26146a08bb22 276 if( !setLEDDrive(DEFAULT_LDRIVE) ) {
kbhagat6 3:26146a08bb22 277 return false;
kbhagat6 3:26146a08bb22 278 }
kbhagat6 3:26146a08bb22 279 if( interrupts ) {
kbhagat6 3:26146a08bb22 280 if( !setProximityIntEnable(1) ) {
kbhagat6 3:26146a08bb22 281 return false;
kbhagat6 3:26146a08bb22 282 }
kbhagat6 3:26146a08bb22 283 } else {
kbhagat6 3:26146a08bb22 284 if( !setProximityIntEnable(0) ) {
kbhagat6 3:26146a08bb22 285 return false;
kbhagat6 3:26146a08bb22 286 }
kbhagat6 3:26146a08bb22 287 }
kbhagat6 3:26146a08bb22 288 if( !enablePower() ){
kbhagat6 3:26146a08bb22 289 return false;
kbhagat6 3:26146a08bb22 290 }
kbhagat6 3:26146a08bb22 291 if( !setMode(PROXIMITY, 1) ) {
kbhagat6 3:26146a08bb22 292 return false;
kbhagat6 3:26146a08bb22 293 }
kbhagat6 3:26146a08bb22 294
kbhagat6 3:26146a08bb22 295 return true;
kbhagat6 3:26146a08bb22 296 }
kbhagat6 3:26146a08bb22 297
kbhagat6 3:26146a08bb22 298 /**
kbhagat6 3:26146a08bb22 299 * @brief Ends the proximity sensor on the APDS-9960
kbhagat6 3:26146a08bb22 300 *
kbhagat6 3:26146a08bb22 301 * @return True if sensor disabled correctly. False on error.
kbhagat6 3:26146a08bb22 302 */
kbhagat6 3:26146a08bb22 303 bool glibr::disableProximitySensor()
kbhagat6 3:26146a08bb22 304 {
kbhagat6 3:26146a08bb22 305 if( !setProximityIntEnable(0) ) {
kbhagat6 3:26146a08bb22 306 return false;
kbhagat6 3:26146a08bb22 307 }
kbhagat6 3:26146a08bb22 308 if( !setMode(PROXIMITY, 0) ) {
kbhagat6 3:26146a08bb22 309 return false;
kbhagat6 3:26146a08bb22 310 }
kbhagat6 3:26146a08bb22 311
kbhagat6 3:26146a08bb22 312 return true;
kbhagat6 3:26146a08bb22 313 }
kbhagat6 3:26146a08bb22 314
kbhagat6 3:26146a08bb22 315
kbhagat6 3:26146a08bb22 316 /**
kbhagat6 3:26146a08bb22 317 * @brief Starts the gesture recognition engine on the APDS-9960
kbhagat6 3:26146a08bb22 318 *
kbhagat6 3:26146a08bb22 319 * @param[in] interrupts true to enable hardware external interrupt on gesture
kbhagat6 3:26146a08bb22 320 * @return True if engine enabled correctly. False on error.
kbhagat6 3:26146a08bb22 321 */
kbhagat6 3:26146a08bb22 322 bool glibr::enableGestureSensor(bool interrupts)
kbhagat6 3:26146a08bb22 323 {
kbhagat6 3:26146a08bb22 324
kbhagat6 3:26146a08bb22 325 /* Enable gesture mode
kbhagat6 3:26146a08bb22 326 Set ENABLE to 0 (power off)
kbhagat6 3:26146a08bb22 327 Set WTIME to 0xFF
kbhagat6 3:26146a08bb22 328 Set AUX to LED_BOOST_300
kbhagat6 3:26146a08bb22 329 Enable PON, WEN, PEN, GEN in ENABLE
kbhagat6 3:26146a08bb22 330 */
kbhagat6 3:26146a08bb22 331
kbhagat6 3:26146a08bb22 332 resetGestureParameters();
kbhagat6 3:26146a08bb22 333 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_WTIME, 0xFF) ) {
kbhagat6 3:26146a08bb22 334 return false;
kbhagat6 3:26146a08bb22 335 }
kbhagat6 3:26146a08bb22 336 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PPULSE, DEFAULT_GESTURE_PPULSE) ) {
kbhagat6 3:26146a08bb22 337 return false;
kbhagat6 3:26146a08bb22 338 }
kbhagat6 3:26146a08bb22 339 if( !setLEDBoost(LED_BOOST_300) ) {
kbhagat6 3:26146a08bb22 340 return false;
kbhagat6 3:26146a08bb22 341 }
kbhagat6 3:26146a08bb22 342 if( interrupts ) {
kbhagat6 3:26146a08bb22 343 if( !setGestureIntEnable(1) ) {
kbhagat6 3:26146a08bb22 344 return false;
kbhagat6 3:26146a08bb22 345 }
kbhagat6 3:26146a08bb22 346 } else {
kbhagat6 3:26146a08bb22 347 if( !setGestureIntEnable(0) ) {
kbhagat6 3:26146a08bb22 348 return false;
kbhagat6 3:26146a08bb22 349 }
kbhagat6 3:26146a08bb22 350 }
kbhagat6 3:26146a08bb22 351 if( !setGestureMode(1) ) {
kbhagat6 3:26146a08bb22 352 return false;
kbhagat6 3:26146a08bb22 353 }
kbhagat6 3:26146a08bb22 354 if( !enablePower() ){
kbhagat6 3:26146a08bb22 355 return false;
kbhagat6 3:26146a08bb22 356 }
kbhagat6 3:26146a08bb22 357 if( !setMode(WAIT, 1) ) {
kbhagat6 3:26146a08bb22 358 return false;
kbhagat6 3:26146a08bb22 359 }
kbhagat6 3:26146a08bb22 360 if( !setMode(PROXIMITY, 1) ) {
kbhagat6 3:26146a08bb22 361 return false;
kbhagat6 3:26146a08bb22 362 }
kbhagat6 3:26146a08bb22 363 if( !setMode(GESTURE, 1) ) {
kbhagat6 3:26146a08bb22 364 return false;
kbhagat6 3:26146a08bb22 365 }
kbhagat6 3:26146a08bb22 366
kbhagat6 3:26146a08bb22 367 return true;
kbhagat6 3:26146a08bb22 368 }
kbhagat6 3:26146a08bb22 369
kbhagat6 3:26146a08bb22 370 /**
kbhagat6 3:26146a08bb22 371 * @brief Ends the gesture recognition engine on the APDS-9960
kbhagat6 3:26146a08bb22 372 *
kbhagat6 3:26146a08bb22 373 * @return True if engine disabled correctly. False on error.
kbhagat6 3:26146a08bb22 374 */
kbhagat6 3:26146a08bb22 375 bool glibr::disableGestureSensor()
kbhagat6 3:26146a08bb22 376 {
kbhagat6 3:26146a08bb22 377 resetGestureParameters();
kbhagat6 3:26146a08bb22 378 if( !setGestureIntEnable(0) ) {
kbhagat6 3:26146a08bb22 379 return false;
kbhagat6 3:26146a08bb22 380 }
kbhagat6 3:26146a08bb22 381 if( !setGestureMode(0) ) {
kbhagat6 3:26146a08bb22 382 return false;
kbhagat6 3:26146a08bb22 383 }
kbhagat6 3:26146a08bb22 384 if( !setMode(GESTURE, 0) ) {
kbhagat6 3:26146a08bb22 385 return false;
kbhagat6 3:26146a08bb22 386 }
kbhagat6 3:26146a08bb22 387
kbhagat6 3:26146a08bb22 388 return true;
kbhagat6 3:26146a08bb22 389 }
kbhagat6 3:26146a08bb22 390
kbhagat6 3:26146a08bb22 391
kbhagat6 3:26146a08bb22 392 /**
kbhagat6 3:26146a08bb22 393 * @brief Determines if there is a gesture available for reading
kbhagat6 3:26146a08bb22 394 *
kbhagat6 3:26146a08bb22 395 * @return True if gesture available. False otherwise.
kbhagat6 3:26146a08bb22 396 */
kbhagat6 3:26146a08bb22 397 bool glibr::isGestureAvailable()
kbhagat6 3:26146a08bb22 398 {
kbhagat6 3:26146a08bb22 399 uint8_t val;
kbhagat6 3:26146a08bb22 400
kbhagat6 3:26146a08bb22 401 /* Read value from GSTATUS register */
kbhagat6 4:84545b0e63a9 402 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GSTATUS);
kbhagat6 5:3eb4f3091bd8 403 if( val==ERROR) {
kbhagat6 3:26146a08bb22 404 return ERROR;
kbhagat6 3:26146a08bb22 405 }
kbhagat6 3:26146a08bb22 406
kbhagat6 3:26146a08bb22 407 /* Shift and mask out GVALID bit */
kbhagat6 3:26146a08bb22 408 val &= APDS9960_GVALID;
kbhagat6 3:26146a08bb22 409
kbhagat6 3:26146a08bb22 410 /* Return true/false based on GVALID bit */
kbhagat6 3:26146a08bb22 411 if( val == 1) {
kbhagat6 3:26146a08bb22 412 return true;
kbhagat6 3:26146a08bb22 413 } else {
kbhagat6 3:26146a08bb22 414 return false;
kbhagat6 3:26146a08bb22 415 }
kbhagat6 3:26146a08bb22 416 }
kbhagat6 3:26146a08bb22 417
kbhagat6 4:84545b0e63a9 418 int glibr::readGesture()
kbhagat6 4:84545b0e63a9 419 {
kbhagat6 4:84545b0e63a9 420 uint8_t fifo_level = 0;
kbhagat6 4:84545b0e63a9 421 uint8_t bytes_read = 0;
kbhagat6 4:84545b0e63a9 422 uint8_t fifo_data[128];
kbhagat6 4:84545b0e63a9 423 uint8_t gstatus;
kbhagat6 4:84545b0e63a9 424 int motion;
kbhagat6 4:84545b0e63a9 425 int i;
kbhagat6 4:84545b0e63a9 426
kbhagat6 4:84545b0e63a9 427 /* Make sure that power and gesture is on and data is valid */
kbhagat6 4:84545b0e63a9 428 if( !isGestureAvailable() || !(getMode() & 0x41) ) {
kbhagat6 4:84545b0e63a9 429 return DIR_NONE;
kbhagat6 4:84545b0e63a9 430 }
kbhagat6 4:84545b0e63a9 431
kbhagat6 4:84545b0e63a9 432 /* Keep looping as long as gesture data is valid */
kbhagat6 4:84545b0e63a9 433 while(1) {
kbhagat6 4:84545b0e63a9 434
kbhagat6 4:84545b0e63a9 435 /* Wait some time to collect next batch of FIFO data */
kbhagat6 5:3eb4f3091bd8 436 wait(FIFO_PAUSE_TIME);
kbhagat6 4:84545b0e63a9 437
kbhagat6 4:84545b0e63a9 438 /* Get the contents of the STATUS register. Is data still valid? */
kbhagat6 4:84545b0e63a9 439
kbhagat6 4:84545b0e63a9 440 gstatus=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GSTATUS);
kbhagat6 4:84545b0e63a9 441 if( gstatus==ERROR ) {
kbhagat6 4:84545b0e63a9 442 return ERROR;
kbhagat6 4:84545b0e63a9 443 }
kbhagat6 4:84545b0e63a9 444 /* If we have valid data, read in FIFO */
kbhagat6 4:84545b0e63a9 445 if( (gstatus & APDS9960_GVALID) == APDS9960_GVALID ) {
kbhagat6 4:84545b0e63a9 446
kbhagat6 4:84545b0e63a9 447 /* Read the current FIFO level */
kbhagat6 4:84545b0e63a9 448 fifolevel=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GFLVL);
kbhagat6 4:84545b0e63a9 449 if( fifolevel==ERROR ) {
kbhagat6 4:84545b0e63a9 450 return ERROR;
kbhagat6 4:84545b0e63a9 451 }
kbhagat6 4:84545b0e63a9 452
kbhagat6 4:84545b0e63a9 453 //#if DEBUG
kbhagat6 4:84545b0e63a9 454 // Serial.print("FIFO Level: ");
kbhagat6 4:84545b0e63a9 455 // Serial.println(fifo_level);
kbhagat6 4:84545b0e63a9 456 //#endif
kbhagat6 4:84545b0e63a9 457
kbhagat6 4:84545b0e63a9 458 /* If there's stuff in the FIFO, read it into our data block */ //NEED TO FIGURE OUT WHAT THIS IS DOING.
kbhagat6 5:3eb4f3091bd8 459
kbhagat6 4:84545b0e63a9 460 if( fifo_level > 0) {
kbhagat6 5:3eb4f3091bd8 461 bytes_read = I2CReadDataBlock(APDS9960_I2C_ADDR,APDS9960_GFIFO_U,
kbhagat6 4:84545b0e63a9 462 (uint8_t*)fifo_data,
kbhagat6 4:84545b0e63a9 463 (fifo_level * 4) );
kbhagat6 4:84545b0e63a9 464 if( bytes_read == -1 ) {
kbhagat6 4:84545b0e63a9 465 return ERROR;
kbhagat6 4:84545b0e63a9 466 }
kbhagat6 4:84545b0e63a9 467 #if DEBUG
kbhagat6 4:84545b0e63a9 468 Serial.print("FIFO Dump: ");
kbhagat6 4:84545b0e63a9 469 for ( i = 0; i < bytes_read; i++ ) {
kbhagat6 4:84545b0e63a9 470 Serial.print(fifo_data[i]);
kbhagat6 4:84545b0e63a9 471 Serial.print(" ");
kbhagat6 4:84545b0e63a9 472 }
kbhagat6 4:84545b0e63a9 473 Serial.println();
kbhagat6 4:84545b0e63a9 474 #endif
kbhagat6 4:84545b0e63a9 475
kbhagat6 4:84545b0e63a9 476 /* If at least 1 set of data, sort the data into U/D/L/R */
kbhagat6 4:84545b0e63a9 477 if( bytes_read >= 4 ) {
kbhagat6 4:84545b0e63a9 478 for( i = 0; i < bytes_read; i += 4 ) {
kbhagat6 4:84545b0e63a9 479 gesture_data_.u_data[gesture_data_.index] = \
kbhagat6 4:84545b0e63a9 480 fifo_data[i + 0];
kbhagat6 4:84545b0e63a9 481 gesture_data_.d_data[gesture_data_.index] = \
kbhagat6 4:84545b0e63a9 482 fifo_data[i + 1];
kbhagat6 4:84545b0e63a9 483 gesture_data_.l_data[gesture_data_.index] = \
kbhagat6 4:84545b0e63a9 484 fifo_data[i + 2];
kbhagat6 4:84545b0e63a9 485 gesture_data_.r_data[gesture_data_.index] = \
kbhagat6 4:84545b0e63a9 486 fifo_data[i + 3];
kbhagat6 4:84545b0e63a9 487 gesture_data_.index++;
kbhagat6 4:84545b0e63a9 488 gesture_data_.total_gestures++;
kbhagat6 4:84545b0e63a9 489 }
kbhagat6 4:84545b0e63a9 490
kbhagat6 4:84545b0e63a9 491 #if DEBUG
kbhagat6 5:3eb4f3091bd8 492 // Serial.print("Up Data: ");
kbhagat6 4:84545b0e63a9 493 for ( i = 0; i < gesture_data_.total_gestures; i++ ) {
kbhagat6 5:3eb4f3091bd8 494 // Serial.print(gesture_data_.u_data[i]);
kbhagat6 5:3eb4f3091bd8 495 // Serial.print(" ");
kbhagat6 4:84545b0e63a9 496 }
kbhagat6 5:3eb4f3091bd8 497 // Serial.println();
kbhagat6 4:84545b0e63a9 498 #endif
kbhagat6 4:84545b0e63a9 499
kbhagat6 4:84545b0e63a9 500 /* Filter and process gesture data. Decode near/far state */
kbhagat6 4:84545b0e63a9 501 if( processGestureData() ) {
kbhagat6 4:84545b0e63a9 502 if( decodeGesture() ) {
kbhagat6 4:84545b0e63a9 503 //***TODO: U-Turn Gestures
kbhagat6 4:84545b0e63a9 504 #if DEBUG
kbhagat6 4:84545b0e63a9 505 //Serial.println(gesture_motion_);
kbhagat6 4:84545b0e63a9 506 #endif
kbhagat6 4:84545b0e63a9 507 }
kbhagat6 4:84545b0e63a9 508 }
kbhagat6 4:84545b0e63a9 509
kbhagat6 4:84545b0e63a9 510 /* Reset data */
kbhagat6 4:84545b0e63a9 511 gesture_data_.index = 0;
kbhagat6 4:84545b0e63a9 512 gesture_data_.total_gestures = 0;
kbhagat6 4:84545b0e63a9 513 }
kbhagat6 4:84545b0e63a9 514 }
kbhagat6 4:84545b0e63a9 515 } else {
kbhagat6 4:84545b0e63a9 516
kbhagat6 4:84545b0e63a9 517 /* Determine best guessed gesture and clean up */
kbhagat6 5:3eb4f3091bd8 518 wait(FIFO_PAUSE_TIME);
kbhagat6 4:84545b0e63a9 519 decodeGesture();
kbhagat6 4:84545b0e63a9 520 motion = gesture_motion_;
kbhagat6 4:84545b0e63a9 521 #if DEBUG
kbhagat6 5:3eb4f3091bd8 522 // Serial.print("END: ");
kbhagat6 5:3eb4f3091bd8 523 // Serial.println(gesture_motion_);
kbhagat6 4:84545b0e63a9 524 #endif
kbhagat6 4:84545b0e63a9 525 resetGestureParameters();
kbhagat6 4:84545b0e63a9 526 return motion;
kbhagat6 4:84545b0e63a9 527 }
kbhagat6 4:84545b0e63a9 528 }
kbhagat6 4:84545b0e63a9 529 }
kbhagat6 6:687dff16904e 530 /**
kbhagat6 6:687dff16904e 531 * Turn the APDS-9960 on
kbhagat6 6:687dff16904e 532 *
kbhagat6 6:687dff16904e 533 * @return True if operation successful. False otherwise.
kbhagat6 6:687dff16904e 534 */
kbhagat6 6:687dff16904e 535 bool glibr::enablePower()
kbhagat6 6:687dff16904e 536 {
kbhagat6 6:687dff16904e 537 if( !setMode(POWER, 1) ) {
kbhagat6 6:687dff16904e 538 return false;
kbhagat6 6:687dff16904e 539 }
kbhagat6 6:687dff16904e 540
kbhagat6 6:687dff16904e 541 return true;
kbhagat6 6:687dff16904e 542 }
kbhagat6 6:687dff16904e 543
kbhagat6 6:687dff16904e 544 /**
kbhagat6 6:687dff16904e 545 * Turn the APDS-9960 off
kbhagat6 6:687dff16904e 546 *
kbhagat6 6:687dff16904e 547 * @return True if operation successful. False otherwise.
kbhagat6 6:687dff16904e 548 */
kbhagat6 6:687dff16904e 549 bool glibr::disablePower()
kbhagat6 6:687dff16904e 550 {
kbhagat6 6:687dff16904e 551 if( !setMode(POWER, 0) ) {
kbhagat6 6:687dff16904e 552 return false;
kbhagat6 6:687dff16904e 553 }
kbhagat6 6:687dff16904e 554
kbhagat6 6:687dff16904e 555 return true;
kbhagat6 6:687dff16904e 556 }
kbhagat6 6:687dff16904e 557
kbhagat6 6:687dff16904e 558 /*******************************************************************************
kbhagat6 6:687dff16904e 559 * Ambient light and color sensor controls
kbhagat6 6:687dff16904e 560 ******************************************************************************/
kbhagat6 6:687dff16904e 561
kbhagat6 6:687dff16904e 562 /**
kbhagat6 6:687dff16904e 563 * @brief Reads the ambient (clear) light level as a 16-bit value
kbhagat6 6:687dff16904e 564 *
kbhagat6 6:687dff16904e 565 * @param[out] val value of the light sensor.
kbhagat6 6:687dff16904e 566 * @return True if operation successful. False otherwise.
kbhagat6 6:687dff16904e 567 */
kbhagat6 6:687dff16904e 568 bool glibr::readAmbientLight(uint16_t &val)
kbhagat6 6:687dff16904e 569 {
kbhagat6 6:687dff16904e 570 uint8_t val_byte;
kbhagat6 6:687dff16904e 571 val = 0;
kbhagat6 6:687dff16904e 572
kbhagat6 6:687dff16904e 573 /* Read value from clear channel, low byte register */
kbhagat6 6:687dff16904e 574 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CDATAL);
kbhagat6 6:687dff16904e 575 if( valbyte==ERROR) {
kbhagat6 6:687dff16904e 576 return false;
kbhagat6 6:687dff16904e 577 }
kbhagat6 6:687dff16904e 578 val = val_byte;
kbhagat6 6:687dff16904e 579
kbhagat6 6:687dff16904e 580 /* Read value from clear channel, high byte register */
kbhagat6 6:687dff16904e 581
kbhagat6 6:687dff16904e 582 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CDATAH);
kbhagat6 6:687dff16904e 583 if( valbyte==ERROR) {
kbhagat6 6:687dff16904e 584 return false;
kbhagat6 6:687dff16904e 585 }
kbhagat6 6:687dff16904e 586 val = val + ((uint16_t)val_byte << 8);
kbhagat6 6:687dff16904e 587
kbhagat6 6:687dff16904e 588 return true;
kbhagat6 6:687dff16904e 589 }
kbhagat6 6:687dff16904e 590
kbhagat6 6:687dff16904e 591 /**
kbhagat6 6:687dff16904e 592 * @brief Reads the red light level as a 16-bit value
kbhagat6 6:687dff16904e 593 *
kbhagat6 6:687dff16904e 594 * @param[out] val value of the light sensor.
kbhagat6 6:687dff16904e 595 * @return True if operation successful. False otherwise.
kbhagat6 6:687dff16904e 596 */
kbhagat6 6:687dff16904e 597 bool glibr::readRedLight(uint16_t &val)
kbhagat6 6:687dff16904e 598 {
kbhagat6 6:687dff16904e 599 uint8_t val_byte;
kbhagat6 6:687dff16904e 600 val = 0;
kbhagat6 6:687dff16904e 601
kbhagat6 6:687dff16904e 602 /* Read value from clear channel, low byte register */
kbhagat6 6:687dff16904e 603 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_RDATAL);
kbhagat6 6:687dff16904e 604 if( valbyte==ERROR) {
kbhagat6 6:687dff16904e 605 return false;
kbhagat6 6:687dff16904e 606 }
kbhagat6 6:687dff16904e 607
kbhagat6 6:687dff16904e 608 val = val_byte;
kbhagat6 6:687dff16904e 609
kbhagat6 6:687dff16904e 610 /* Read value from clear channel, high byte register */
kbhagat6 6:687dff16904e 611 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_RDATAH);
kbhagat6 6:687dff16904e 612 if( valbyte==ERROR) {
kbhagat6 6:687dff16904e 613 return false;
kbhagat6 6:687dff16904e 614 }
kbhagat6 6:687dff16904e 615 val = val + ((uint16_t)val_byte << 8);
kbhagat6 6:687dff16904e 616
kbhagat6 6:687dff16904e 617 return true;
kbhagat6 6:687dff16904e 618 }
kbhagat6 6:687dff16904e 619
kbhagat6 6:687dff16904e 620 /**
kbhagat6 6:687dff16904e 621 * @brief Reads the green light level as a 16-bit value
kbhagat6 6:687dff16904e 622 *
kbhagat6 6:687dff16904e 623 * @param[out] val value of the light sensor.
kbhagat6 6:687dff16904e 624 * @return True if operation successful. False otherwise.
kbhagat6 6:687dff16904e 625 */
kbhagat6 6:687dff16904e 626
kbhagat6 6:687dff16904e 627 bool glibr::readGreenLight(uint16_t &val)
kbhagat6 6:687dff16904e 628 {
kbhagat6 6:687dff16904e 629 uint8_t val_byte;
kbhagat6 6:687dff16904e 630 val = 0;
kbhagat6 6:687dff16904e 631
kbhagat6 6:687dff16904e 632 /* Read value from clear channel, low byte register */
kbhagat6 6:687dff16904e 633 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GDATAL);
kbhagat6 6:687dff16904e 634 if( valbyte==ERROR) {
kbhagat6 6:687dff16904e 635 return false;
kbhagat6 6:687dff16904e 636 }
kbhagat6 6:687dff16904e 637
kbhagat6 6:687dff16904e 638 val = val_byte;
kbhagat6 6:687dff16904e 639
kbhagat6 6:687dff16904e 640 /* Read value from clear channel, high byte register */
kbhagat6 6:687dff16904e 641 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GDATAH);
kbhagat6 6:687dff16904e 642 if( valbyte==ERROR) {
kbhagat6 6:687dff16904e 643 return false;
kbhagat6 6:687dff16904e 644 }
kbhagat6 6:687dff16904e 645 val = val + ((uint16_t)val_byte << 8);
kbhagat6 6:687dff16904e 646
kbhagat6 6:687dff16904e 647 return true;
kbhagat6 6:687dff16904e 648 }
kbhagat6 6:687dff16904e 649
kbhagat6 6:687dff16904e 650 /**
kbhagat6 6:687dff16904e 651 * @brief Reads the red light level as a 16-bit value
kbhagat6 6:687dff16904e 652 *
kbhagat6 6:687dff16904e 653 * @param[out] val value of the light sensor.
kbhagat6 6:687dff16904e 654 * @return True if operation successful. False otherwise.
kbhagat6 6:687dff16904e 655 */
kbhagat6 6:687dff16904e 656
kbhagat6 6:687dff16904e 657 bool glibr::readBlueLight(uint16_t &val)
kbhagat6 6:687dff16904e 658 {
kbhagat6 6:687dff16904e 659 uint8_t val_byte;
kbhagat6 6:687dff16904e 660 val = 0;
kbhagat6 6:687dff16904e 661
kbhagat6 6:687dff16904e 662 /* Read value from clear channel, low byte register */
kbhagat6 6:687dff16904e 663 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_BDATAL);
kbhagat6 6:687dff16904e 664 if( valbyte==ERROR) {
kbhagat6 6:687dff16904e 665 return false;
kbhagat6 6:687dff16904e 666 }
kbhagat6 6:687dff16904e 667
kbhagat6 6:687dff16904e 668 val = val_byte;
kbhagat6 6:687dff16904e 669
kbhagat6 6:687dff16904e 670 /* Read value from clear channel, high byte register */
kbhagat6 6:687dff16904e 671 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_BDATAH);
kbhagat6 6:687dff16904e 672 if( valbyte==ERROR) {
kbhagat6 6:687dff16904e 673 return false;
kbhagat6 6:687dff16904e 674 }
kbhagat6 6:687dff16904e 675 val = val + ((uint16_t)val_byte << 8);
kbhagat6 6:687dff16904e 676
kbhagat6 6:687dff16904e 677 return true;
kbhagat6 6:687dff16904e 678 }
kbhagat6 6:687dff16904e 679
kbhagat6 6:687dff16904e 680 /*******************************************************************************
kbhagat6 6:687dff16904e 681 * Proximity sensor controls
kbhagat6 6:687dff16904e 682 ******************************************************************************/
kbhagat6 6:687dff16904e 683
kbhagat6 6:687dff16904e 684 /**
kbhagat6 6:687dff16904e 685 * @brief Reads the proximity level as an 8-bit value
kbhagat6 6:687dff16904e 686 *
kbhagat6 6:687dff16904e 687 * @param[out] val value of the proximity sensor.
kbhagat6 6:687dff16904e 688 * @return True if operation successful. False otherwise.
kbhagat6 6:687dff16904e 689 */
kbhagat6 6:687dff16904e 690 bool glibr::readProximity(uint8_t &val)
kbhagat6 6:687dff16904e 691 {
kbhagat6 6:687dff16904e 692 val = 0;
kbhagat6 6:687dff16904e 693
kbhagat6 6:687dff16904e 694 /* Read value from proximity data register */
kbhagat6 6:687dff16904e 695 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_PDATA);
kbhagat6 6:687dff16904e 696
kbhagat6 6:687dff16904e 697 if(val==ERROR){
kbhagat6 6:687dff16904e 698 return false;
kbhagat6 6:687dff16904e 699 }
kbhagat6 6:687dff16904e 700
kbhagat6 6:687dff16904e 701 return true;
kbhagat6 6:687dff16904e 702 }
kbhagat6 6:687dff16904e 703
kbhagat6 6:687dff16904e 704 /*******************************************************************************
kbhagat6 6:687dff16904e 705 * High-level gesture controls
kbhagat6 6:687dff16904e 706 ******************************************************************************/
kbhagat6 6:687dff16904e 707
kbhagat6 6:687dff16904e 708 /**
kbhagat6 6:687dff16904e 709 * @brief Resets all the parameters in the gesture data member
kbhagat6 6:687dff16904e 710 */
kbhagat6 6:687dff16904e 711 void glibr::resetGestureParameters()
kbhagat6 6:687dff16904e 712 {
kbhagat6 6:687dff16904e 713 gesture_data_.index = 0;
kbhagat6 6:687dff16904e 714 gesture_data_.total_gestures = 0;
kbhagat6 6:687dff16904e 715
kbhagat6 6:687dff16904e 716 gesture_ud_delta_ = 0;
kbhagat6 6:687dff16904e 717 gesture_lr_delta_ = 0;
kbhagat6 6:687dff16904e 718
kbhagat6 6:687dff16904e 719 gesture_ud_count_ = 0;
kbhagat6 6:687dff16904e 720 gesture_lr_count_ = 0;
kbhagat6 6:687dff16904e 721
kbhagat6 6:687dff16904e 722 gesture_near_count_ = 0;
kbhagat6 6:687dff16904e 723 gesture_far_count_ = 0;
kbhagat6 6:687dff16904e 724
kbhagat6 6:687dff16904e 725 gesture_state_ = 0;
kbhagat6 6:687dff16904e 726 gesture_motion_ = DIR_NONE;
kbhagat6 6:687dff16904e 727 }
kbhagat6 6:687dff16904e 728
kbhagat6 7:0564c6faf8aa 729 bool glibr::processGestureData()
kbhagat6 7:0564c6faf8aa 730 {
kbhagat6 7:0564c6faf8aa 731 uint8_t u_first = 0;
kbhagat6 7:0564c6faf8aa 732 uint8_t d_first = 0;
kbhagat6 7:0564c6faf8aa 733 uint8_t l_first = 0;
kbhagat6 7:0564c6faf8aa 734 uint8_t r_first = 0;
kbhagat6 7:0564c6faf8aa 735 uint8_t u_last = 0;
kbhagat6 7:0564c6faf8aa 736 uint8_t d_last = 0;
kbhagat6 7:0564c6faf8aa 737 uint8_t l_last = 0;
kbhagat6 7:0564c6faf8aa 738 uint8_t r_last = 0;
kbhagat6 7:0564c6faf8aa 739 int ud_ratio_first;
kbhagat6 7:0564c6faf8aa 740 int lr_ratio_first;
kbhagat6 7:0564c6faf8aa 741 int ud_ratio_last;
kbhagat6 7:0564c6faf8aa 742 int lr_ratio_last;
kbhagat6 7:0564c6faf8aa 743 int ud_delta;
kbhagat6 7:0564c6faf8aa 744 int lr_delta;
kbhagat6 7:0564c6faf8aa 745 int i;
kbhagat6 7:0564c6faf8aa 746
kbhagat6 7:0564c6faf8aa 747 /* If we have less than 4 total gestures, that's not enough */
kbhagat6 7:0564c6faf8aa 748 if( gesture_data_.total_gestures <= 4 ) {
kbhagat6 7:0564c6faf8aa 749 return false;
kbhagat6 7:0564c6faf8aa 750 }
kbhagat6 7:0564c6faf8aa 751
kbhagat6 7:0564c6faf8aa 752 /* Check to make sure our data isn't out of bounds */
kbhagat6 7:0564c6faf8aa 753 if( (gesture_data_.total_gestures <= 32) && \
kbhagat6 7:0564c6faf8aa 754 (gesture_data_.total_gestures > 0) ) {
kbhagat6 7:0564c6faf8aa 755
kbhagat6 7:0564c6faf8aa 756 /* Find the first value in U/D/L/R above the threshold */
kbhagat6 7:0564c6faf8aa 757 for( i = 0; i < gesture_data_.total_gestures; i++ ) {
kbhagat6 7:0564c6faf8aa 758 if( (gesture_data_.u_data[i] > GESTURE_THRESHOLD_OUT) &&
kbhagat6 7:0564c6faf8aa 759 (gesture_data_.d_data[i] > GESTURE_THRESHOLD_OUT) &&
kbhagat6 7:0564c6faf8aa 760 (gesture_data_.l_data[i] > GESTURE_THRESHOLD_OUT) &&
kbhagat6 7:0564c6faf8aa 761 (gesture_data_.r_data[i] > GESTURE_THRESHOLD_OUT) ) {
kbhagat6 7:0564c6faf8aa 762
kbhagat6 7:0564c6faf8aa 763 u_first = gesture_data_.u_data[i];
kbhagat6 7:0564c6faf8aa 764 d_first = gesture_data_.d_data[i];
kbhagat6 7:0564c6faf8aa 765 l_first = gesture_data_.l_data[i];
kbhagat6 7:0564c6faf8aa 766 r_first = gesture_data_.r_data[i];
kbhagat6 7:0564c6faf8aa 767 break;
kbhagat6 7:0564c6faf8aa 768 }
kbhagat6 7:0564c6faf8aa 769 }
kbhagat6 7:0564c6faf8aa 770
kbhagat6 7:0564c6faf8aa 771 /* If one of the _first values is 0, then there is no good data */
kbhagat6 7:0564c6faf8aa 772 if( (u_first == 0) || (d_first == 0) || \
kbhagat6 7:0564c6faf8aa 773 (l_first == 0) || (r_first == 0) ) {
kbhagat6 7:0564c6faf8aa 774
kbhagat6 7:0564c6faf8aa 775 return false;
kbhagat6 7:0564c6faf8aa 776 }
kbhagat6 7:0564c6faf8aa 777 /* Find the last value in U/D/L/R above the threshold */
kbhagat6 7:0564c6faf8aa 778 for( i = gesture_data_.total_gestures - 1; i >= 0; i-- ) {
kbhagat6 7:0564c6faf8aa 779 /* #if DEBUG
kbhagat6 7:0564c6faf8aa 780 Serial.print(F("Finding last: "));
kbhagat6 7:0564c6faf8aa 781 Serial.print(F("U:"));
kbhagat6 7:0564c6faf8aa 782 Serial.print(gesture_data_.u_data[i]);
kbhagat6 7:0564c6faf8aa 783 Serial.print(F(" D:"));
kbhagat6 7:0564c6faf8aa 784 Serial.print(gesture_data_.d_data[i]);
kbhagat6 7:0564c6faf8aa 785 Serial.print(F(" L:"));
kbhagat6 7:0564c6faf8aa 786 Serial.print(gesture_data_.l_data[i]);
kbhagat6 7:0564c6faf8aa 787 Serial.print(F(" R:"));
kbhagat6 7:0564c6faf8aa 788 Serial.println(gesture_data_.r_data[i]);
kbhagat6 7:0564c6faf8aa 789 #endif */
kbhagat6 7:0564c6faf8aa 790 if( (gesture_data_.u_data[i] > GESTURE_THRESHOLD_OUT) &&
kbhagat6 7:0564c6faf8aa 791 (gesture_data_.d_data[i] > GESTURE_THRESHOLD_OUT) &&
kbhagat6 7:0564c6faf8aa 792 (gesture_data_.l_data[i] > GESTURE_THRESHOLD_OUT) &&
kbhagat6 7:0564c6faf8aa 793 (gesture_data_.r_data[i] > GESTURE_THRESHOLD_OUT) ) {
kbhagat6 7:0564c6faf8aa 794
kbhagat6 7:0564c6faf8aa 795 u_last = gesture_data_.u_data[i];
kbhagat6 7:0564c6faf8aa 796 d_last = gesture_data_.d_data[i];
kbhagat6 7:0564c6faf8aa 797 l_last = gesture_data_.l_data[i];
kbhagat6 7:0564c6faf8aa 798 r_last = gesture_data_.r_data[i];
kbhagat6 7:0564c6faf8aa 799 break;
kbhagat6 7:0564c6faf8aa 800 }
kbhagat6 7:0564c6faf8aa 801 }
kbhagat6 7:0564c6faf8aa 802 }
kbhagat6 7:0564c6faf8aa 803
kbhagat6 7:0564c6faf8aa 804 /* Calculate the first vs. last ratio of up/down and left/right */
kbhagat6 7:0564c6faf8aa 805 ud_ratio_first = ((u_first - d_first) * 100) / (u_first + d_first);
kbhagat6 7:0564c6faf8aa 806 lr_ratio_first = ((l_first - r_first) * 100) / (l_first + r_first);
kbhagat6 7:0564c6faf8aa 807 ud_ratio_last = ((u_last - d_last) * 100) / (u_last + d_last);
kbhagat6 7:0564c6faf8aa 808 lr_ratio_last = ((l_last - r_last) * 100) / (l_last + r_last);
kbhagat6 7:0564c6faf8aa 809
kbhagat6 7:0564c6faf8aa 810 /* #if DEBUG
kbhagat6 7:0564c6faf8aa 811 Serial.print(F("Last Values: "));
kbhagat6 7:0564c6faf8aa 812 Serial.print(F("U:"));
kbhagat6 7:0564c6faf8aa 813 Serial.print(u_last);
kbhagat6 7:0564c6faf8aa 814 Serial.print(F(" D:"));
kbhagat6 7:0564c6faf8aa 815 Serial.print(d_last);
kbhagat6 7:0564c6faf8aa 816 Serial.print(F(" L:"));
kbhagat6 7:0564c6faf8aa 817 Serial.print(l_last);
kbhagat6 7:0564c6faf8aa 818 Serial.print(F(" R:"));
kbhagat6 7:0564c6faf8aa 819 Serial.println(r_last);
kbhagat6 7:0564c6faf8aa 820
kbhagat6 7:0564c6faf8aa 821 Serial.print(F("Ratios: "));
kbhagat6 7:0564c6faf8aa 822 Serial.print(F("UD Fi: "));
kbhagat6 7:0564c6faf8aa 823 Serial.print(ud_ratio_first);
kbhagat6 7:0564c6faf8aa 824 Serial.print(F(" UD La: "));
kbhagat6 7:0564c6faf8aa 825 Serial.print(ud_ratio_last);
kbhagat6 7:0564c6faf8aa 826 Serial.print(F(" LR Fi: "));
kbhagat6 7:0564c6faf8aa 827 Serial.print(lr_ratio_first);
kbhagat6 7:0564c6faf8aa 828 Serial.print(F(" LR La: "));
kbhagat6 7:0564c6faf8aa 829 Serial.println(lr_ratio_last);
kbhagat6 7:0564c6faf8aa 830 #endif */
kbhagat6 7:0564c6faf8aa 831
kbhagat6 7:0564c6faf8aa 832 /* Determine the difference between the first and last ratios */
kbhagat6 7:0564c6faf8aa 833 ud_delta = ud_ratio_last - ud_ratio_first;
kbhagat6 7:0564c6faf8aa 834 lr_delta = lr_ratio_last - lr_ratio_first;
kbhagat6 7:0564c6faf8aa 835
kbhagat6 7:0564c6faf8aa 836 /* #if DEBUG
kbhagat6 7:0564c6faf8aa 837 Serial.print("Deltas: ");
kbhagat6 7:0564c6faf8aa 838 Serial.print("UD: ");
kbhagat6 7:0564c6faf8aa 839 Serial.print(ud_delta);
kbhagat6 7:0564c6faf8aa 840 Serial.print(" LR: ");
kbhagat6 7:0564c6faf8aa 841 Serial.println(lr_delta);
kbhagat6 7:0564c6faf8aa 842 #endif */
kbhagat6 7:0564c6faf8aa 843
kbhagat6 7:0564c6faf8aa 844 /* Accumulate the UD and LR delta values */
kbhagat6 7:0564c6faf8aa 845 gesture_ud_delta_ += ud_delta;
kbhagat6 7:0564c6faf8aa 846 gesture_lr_delta_ += lr_delta;
kbhagat6 7:0564c6faf8aa 847
kbhagat6 7:0564c6faf8aa 848 /* #if DEBUG
kbhagat6 7:0564c6faf8aa 849 Serial.print("Accumulations: ");
kbhagat6 7:0564c6faf8aa 850 Serial.print("UD: ");
kbhagat6 7:0564c6faf8aa 851 Serial.print(gesture_ud_delta_);
kbhagat6 7:0564c6faf8aa 852 Serial.print(" LR: ");
kbhagat6 7:0564c6faf8aa 853 Serial.println(gesture_lr_delta_);
kbhagat6 7:0564c6faf8aa 854 #endif */
kbhagat6 7:0564c6faf8aa 855
kbhagat6 7:0564c6faf8aa 856 /* Determine U/D gesture */
kbhagat6 7:0564c6faf8aa 857 if( gesture_ud_delta_ >= GESTURE_SENSITIVITY_1 ) {
kbhagat6 7:0564c6faf8aa 858 gesture_ud_count_ = 1;
kbhagat6 7:0564c6faf8aa 859 } else if( gesture_ud_delta_ <= -GESTURE_SENSITIVITY_1 ) {
kbhagat6 7:0564c6faf8aa 860 gesture_ud_count_ = -1;
kbhagat6 7:0564c6faf8aa 861 } else {
kbhagat6 7:0564c6faf8aa 862 gesture_ud_count_ = 0;
kbhagat6 7:0564c6faf8aa 863 }
kbhagat6 7:0564c6faf8aa 864
kbhagat6 7:0564c6faf8aa 865 /* Determine L/R gesture */
kbhagat6 7:0564c6faf8aa 866 if( gesture_lr_delta_ >= GESTURE_SENSITIVITY_1 ) {
kbhagat6 7:0564c6faf8aa 867 gesture_lr_count_ = 1;
kbhagat6 7:0564c6faf8aa 868 } else if( gesture_lr_delta_ <= -GESTURE_SENSITIVITY_1 ) {
kbhagat6 7:0564c6faf8aa 869 gesture_lr_count_ = -1;
kbhagat6 7:0564c6faf8aa 870 } else {
kbhagat6 7:0564c6faf8aa 871 gesture_lr_count_ = 0;
kbhagat6 7:0564c6faf8aa 872 }
kbhagat6 7:0564c6faf8aa 873
kbhagat6 7:0564c6faf8aa 874 /* Determine Near/Far gesture */
kbhagat6 7:0564c6faf8aa 875 if( (gesture_ud_count_ == 0) && (gesture_lr_count_ == 0) ) {
kbhagat6 7:0564c6faf8aa 876 if( (abs(ud_delta) < GESTURE_SENSITIVITY_2) && \
kbhagat6 7:0564c6faf8aa 877 (abs(lr_delta) < GESTURE_SENSITIVITY_2) ) {
kbhagat6 7:0564c6faf8aa 878
kbhagat6 7:0564c6faf8aa 879 if( (ud_delta == 0) && (lr_delta == 0) ) {
kbhagat6 7:0564c6faf8aa 880 gesture_near_count_++;
kbhagat6 7:0564c6faf8aa 881 } else if( (ud_delta != 0) || (lr_delta != 0) ) {
kbhagat6 7:0564c6faf8aa 882 gesture_far_count_++;
kbhagat6 7:0564c6faf8aa 883 }
kbhagat6 7:0564c6faf8aa 884
kbhagat6 7:0564c6faf8aa 885 if( (gesture_near_count_ >= 10) && (gesture_far_count_ >= 2) ) {
kbhagat6 7:0564c6faf8aa 886 if( (ud_delta == 0) && (lr_delta == 0) ) {
kbhagat6 7:0564c6faf8aa 887 gesture_state_ = NEAR_STATE;
kbhagat6 7:0564c6faf8aa 888 } else if( (ud_delta != 0) && (lr_delta != 0) ) {
kbhagat6 7:0564c6faf8aa 889 gesture_state_ = FAR_STATE;
kbhagat6 7:0564c6faf8aa 890 }
kbhagat6 7:0564c6faf8aa 891 return true;
kbhagat6 7:0564c6faf8aa 892 }
kbhagat6 7:0564c6faf8aa 893 }
kbhagat6 7:0564c6faf8aa 894 } else {
kbhagat6 7:0564c6faf8aa 895 if( (abs(ud_delta) < GESTURE_SENSITIVITY_2) && \
kbhagat6 7:0564c6faf8aa 896 (abs(lr_delta) < GESTURE_SENSITIVITY_2) ) {
kbhagat6 7:0564c6faf8aa 897
kbhagat6 7:0564c6faf8aa 898 if( (ud_delta == 0) && (lr_delta == 0) ) {
kbhagat6 7:0564c6faf8aa 899 gesture_near_count_++;
kbhagat6 7:0564c6faf8aa 900 }
kbhagat6 7:0564c6faf8aa 901
kbhagat6 7:0564c6faf8aa 902 if( gesture_near_count_ >= 10 ) {
kbhagat6 7:0564c6faf8aa 903 gesture_ud_count_ = 0;
kbhagat6 7:0564c6faf8aa 904 gesture_lr_count_ = 0;
kbhagat6 7:0564c6faf8aa 905 gesture_ud_delta_ = 0;
kbhagat6 7:0564c6faf8aa 906 gesture_lr_delta_ = 0;
kbhagat6 7:0564c6faf8aa 907 }
kbhagat6 7:0564c6faf8aa 908 }
kbhagat6 7:0564c6faf8aa 909 }
kbhagat6 7:0564c6faf8aa 910
kbhagat6 7:0564c6faf8aa 911 /* #if DEBUG
kbhagat6 7:0564c6faf8aa 912 Serial.print("UD_CT: ");
kbhagat6 7:0564c6faf8aa 913 Serial.print(gesture_ud_count_);
kbhagat6 7:0564c6faf8aa 914 Serial.print(" LR_CT: ");
kbhagat6 7:0564c6faf8aa 915 Serial.print(gesture_lr_count_);
kbhagat6 7:0564c6faf8aa 916 Serial.print(" NEAR_CT: ");
kbhagat6 7:0564c6faf8aa 917 Serial.print(gesture_near_count_);
kbhagat6 7:0564c6faf8aa 918 Serial.print(" FAR_CT: ");
kbhagat6 7:0564c6faf8aa 919 Serial.println(gesture_far_count_);
kbhagat6 7:0564c6faf8aa 920 Serial.println("----------");
kbhagat6 7:0564c6faf8aa 921 #endif */
kbhagat6 7:0564c6faf8aa 922
kbhagat6 7:0564c6faf8aa 923 return false;
kbhagat6 7:0564c6faf8aa 924 }
kbhagat6 7:0564c6faf8aa 925
kbhagat6 7:0564c6faf8aa 926 /**
kbhagat6 7:0564c6faf8aa 927 * @brief Determines swipe direction or near/far state
kbhagat6 7:0564c6faf8aa 928 *
kbhagat6 7:0564c6faf8aa 929 * @return True if near/far event. False otherwise.
kbhagat6 7:0564c6faf8aa 930 */
kbhagat6 7:0564c6faf8aa 931 bool APDS9960::decodeGesture()
kbhagat6 7:0564c6faf8aa 932 {
kbhagat6 7:0564c6faf8aa 933 /* Return if near or far event is detected */
kbhagat6 7:0564c6faf8aa 934 if( gesture_state_ == NEAR_STATE ) {
kbhagat6 7:0564c6faf8aa 935 gesture_motion_ = DIR_NEAR;
kbhagat6 7:0564c6faf8aa 936 return true;
kbhagat6 7:0564c6faf8aa 937 } else if ( gesture_state_ == FAR_STATE ) {
kbhagat6 7:0564c6faf8aa 938 gesture_motion_ = DIR_FAR;
kbhagat6 7:0564c6faf8aa 939 return true;
kbhagat6 7:0564c6faf8aa 940 }
kbhagat6 7:0564c6faf8aa 941
kbhagat6 7:0564c6faf8aa 942 /* Determine swipe direction */
kbhagat6 7:0564c6faf8aa 943 if( (gesture_ud_count_ == -1) && (gesture_lr_count_ == 0) ) {
kbhagat6 7:0564c6faf8aa 944 gesture_motion_ = DIR_UP;
kbhagat6 7:0564c6faf8aa 945 } else if( (gesture_ud_count_ == 1) && (gesture_lr_count_ == 0) ) {
kbhagat6 7:0564c6faf8aa 946 gesture_motion_ = DIR_DOWN;
kbhagat6 7:0564c6faf8aa 947 } else if( (gesture_ud_count_ == 0) && (gesture_lr_count_ == 1) ) {
kbhagat6 7:0564c6faf8aa 948 gesture_motion_ = DIR_RIGHT;
kbhagat6 7:0564c6faf8aa 949 } else if( (gesture_ud_count_ == 0) && (gesture_lr_count_ == -1) ) {
kbhagat6 7:0564c6faf8aa 950 gesture_motion_ = DIR_LEFT;
kbhagat6 7:0564c6faf8aa 951 } else if( (gesture_ud_count_ == -1) && (gesture_lr_count_ == 1) ) {
kbhagat6 7:0564c6faf8aa 952 if( abs(gesture_ud_delta_) > abs(gesture_lr_delta_) ) {
kbhagat6 7:0564c6faf8aa 953 gesture_motion_ = DIR_UP;
kbhagat6 7:0564c6faf8aa 954 } else {
kbhagat6 7:0564c6faf8aa 955 gesture_motion_ = DIR_RIGHT;
kbhagat6 7:0564c6faf8aa 956 }
kbhagat6 7:0564c6faf8aa 957 } else if( (gesture_ud_count_ == 1) && (gesture_lr_count_ == -1) ) {
kbhagat6 7:0564c6faf8aa 958 if( abs(gesture_ud_delta_) > abs(gesture_lr_delta_) ) {
kbhagat6 7:0564c6faf8aa 959 gesture_motion_ = DIR_DOWN;
kbhagat6 7:0564c6faf8aa 960 } else {
kbhagat6 7:0564c6faf8aa 961 gesture_motion_ = DIR_LEFT;
kbhagat6 7:0564c6faf8aa 962 }
kbhagat6 7:0564c6faf8aa 963 } else if( (gesture_ud_count_ == -1) && (gesture_lr_count_ == -1) ) {
kbhagat6 7:0564c6faf8aa 964 if( abs(gesture_ud_delta_) > abs(gesture_lr_delta_) ) {
kbhagat6 7:0564c6faf8aa 965 gesture_motion_ = DIR_UP;
kbhagat6 7:0564c6faf8aa 966 } else {
kbhagat6 7:0564c6faf8aa 967 gesture_motion_ = DIR_LEFT;
kbhagat6 7:0564c6faf8aa 968 }
kbhagat6 7:0564c6faf8aa 969 } else if( (gesture_ud_count_ == 1) && (gesture_lr_count_ == 1) ) {
kbhagat6 7:0564c6faf8aa 970 if( abs(gesture_ud_delta_) > abs(gesture_lr_delta_) ) {
kbhagat6 7:0564c6faf8aa 971 gesture_motion_ = DIR_DOWN;
kbhagat6 7:0564c6faf8aa 972 } else {
kbhagat6 7:0564c6faf8aa 973 gesture_motion_ = DIR_RIGHT;
kbhagat6 7:0564c6faf8aa 974 }
kbhagat6 7:0564c6faf8aa 975 } else {
kbhagat6 7:0564c6faf8aa 976 return false;
kbhagat6 7:0564c6faf8aa 977 }
kbhagat6 7:0564c6faf8aa 978
kbhagat6 7:0564c6faf8aa 979 return true;
kbhagat6 7:0564c6faf8aa 980 }
kbhagat6 7:0564c6faf8aa 981
kbhagat6 7:0564c6faf8aa 982 /*******************************************************************************
kbhagat6 7:0564c6faf8aa 983 * Getters and setters for register values
kbhagat6 7:0564c6faf8aa 984 ******************************************************************************/
kbhagat6 7:0564c6faf8aa 985
kbhagat6 7:0564c6faf8aa 986 /**
kbhagat6 7:0564c6faf8aa 987 * @brief Returns the lower threshold for proximity detection
kbhagat6 7:0564c6faf8aa 988 *
kbhagat6 7:0564c6faf8aa 989 * @return lower threshold
kbhagat6 7:0564c6faf8aa 990 */
kbhagat6 7:0564c6faf8aa 991
kbhagat6 7:0564c6faf8aa 992 uint8_t glibr::getProxIntLowThresh()
kbhagat6 7:0564c6faf8aa 993 {
kbhagat6 7:0564c6faf8aa 994 uint8_t val;
kbhagat6 7:0564c6faf8aa 995
kbhagat6 7:0564c6faf8aa 996 /* Read value from PILT register */
kbhagat6 7:0564c6faf8aa 997 /* if( !wireReadDataByte(APDS9960_PILT, val) ) {
kbhagat6 7:0564c6faf8aa 998 val = 0;
kbhagat6 7:0564c6faf8aa 999 }*/
kbhagat6 7:0564c6faf8aa 1000 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_PILT);
kbhagat6 7:0564c6faf8aa 1001 if(val==ERROR){
kbhagat6 7:0564c6faf8aa 1002 val=0;
kbhagat6 7:0564c6faf8aa 1003 }
kbhagat6 7:0564c6faf8aa 1004
kbhagat6 7:0564c6faf8aa 1005 return val;
kbhagat6 7:0564c6faf8aa 1006 }
kbhagat6 7:0564c6faf8aa 1007
kbhagat6 7:0564c6faf8aa 1008 bool glibr::setProxIntLowThresh(uint8_t threshold)
kbhagat6 7:0564c6faf8aa 1009 {
kbhagat6 7:0564c6faf8aa 1010 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PILT, threshold) ) {
kbhagat6 7:0564c6faf8aa 1011 return false;
kbhagat6 7:0564c6faf8aa 1012 }
kbhagat6 7:0564c6faf8aa 1013
kbhagat6 7:0564c6faf8aa 1014 return true;
kbhagat6 7:0564c6faf8aa 1015 }
kbhagat6 7:0564c6faf8aa 1016
kbhagat6 7:0564c6faf8aa 1017 bool glibr::setProxIntHighThresh(uint8_t threshold)
kbhagat6 7:0564c6faf8aa 1018 {
kbhagat6 7:0564c6faf8aa 1019
kbhagat6 7:0564c6faf8aa 1020 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PIHT, threshold) ) {
kbhagat6 7:0564c6faf8aa 1021 return false;
kbhagat6 7:0564c6faf8aa 1022 }
kbhagat6 7:0564c6faf8aa 1023
kbhagat6 7:0564c6faf8aa 1024 return true;
kbhagat6 7:0564c6faf8aa 1025 }
kbhagat6 7:0564c6faf8aa 1026
kbhagat6 7:0564c6faf8aa 1027
kbhagat6 7:0564c6faf8aa 1028
kbhagat6 7:0564c6faf8aa 1029 bool glibr::setLEDDrive(uint8_t drive)
kbhagat6 7:0564c6faf8aa 1030 {
kbhagat6 7:0564c6faf8aa 1031 uint8_t val;
kbhagat6 7:0564c6faf8aa 1032
kbhagat6 7:0564c6faf8aa 1033 /* Read value from CONTROL register */
kbhagat6 7:0564c6faf8aa 1034
kbhagat6 7:0564c6faf8aa 1035 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CONTROL);
kbhagat6 7:0564c6faf8aa 1036 if(val==ERROR){
kbhagat6 7:0564c6faf8aa 1037 return false;
kbhagat6 7:0564c6faf8aa 1038 }
kbhagat6 7:0564c6faf8aa 1039 /* Set bits in register to given value */
kbhagat6 7:0564c6faf8aa 1040 drive &= 0x03;
kbhagat6 7:0564c6faf8aa 1041 drive = drive << 6;
kbhagat6 7:0564c6faf8aa 1042 //val &= 0b00111111;
kbhagat6 7:0564c6faf8aa 1043 val &= 0x3F;
kbhagat6 7:0564c6faf8aa 1044 val |= drive;
kbhagat6 7:0564c6faf8aa 1045
kbhagat6 7:0564c6faf8aa 1046 /* Write register value back into CONTROL register */
kbhagat6 7:0564c6faf8aa 1047 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONTROL, val) ) {
kbhagat6 7:0564c6faf8aa 1048 return false;
kbhagat6 7:0564c6faf8aa 1049 }
kbhagat6 7:0564c6faf8aa 1050
kbhagat6 7:0564c6faf8aa 1051 return true;
kbhagat6 7:0564c6faf8aa 1052 }
kbhagat6 7:0564c6faf8aa 1053
kbhagat6 6:687dff16904e 1054
kbhagat6 4:84545b0e63a9 1055
kbhagat6 0:437ae08befe3 1056 bool glibr::setProximityGain(uint8_t drive)
kbhagat6 0:437ae08befe3 1057 {
kbhagat6 0:437ae08befe3 1058 uint8_t val;
kbhagat6 0:437ae08befe3 1059
kbhagat6 0:437ae08befe3 1060 /* Read value from CONTROL register */
kbhagat6 1:c7215f5f9a72 1061
kbhagat6 5:3eb4f3091bd8 1062 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CONTROL);
kbhagat6 0:437ae08befe3 1063
kbhagat6 1:c7215f5f9a72 1064 if(val==ERROR){
kbhagat6 1:c7215f5f9a72 1065 return false;
kbhagat6 1:c7215f5f9a72 1066 }
kbhagat6 0:437ae08befe3 1067 /* Set bits in register to given value */
kbhagat6 1:c7215f5f9a72 1068 //drive &= 0b00000011;
kbhagat6 1:c7215f5f9a72 1069 drive &=0x03;
kbhagat6 0:437ae08befe3 1070 drive = drive << 2;
kbhagat6 1:c7215f5f9a72 1071 val &= 0xF3;
kbhagat6 0:437ae08befe3 1072 val |= drive;
kbhagat6 0:437ae08befe3 1073
kbhagat6 0:437ae08befe3 1074 /* Write register value back into CONTROL register */
kbhagat6 1:c7215f5f9a72 1075 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONTROL, val) ) {
kbhagat6 1:c7215f5f9a72 1076 return false;
kbhagat6 1:c7215f5f9a72 1077 }
kbhagat6 1:c7215f5f9a72 1078 return true;
kbhagat6 1:c7215f5f9a72 1079 }
kbhagat6 1:c7215f5f9a72 1080
kbhagat6 1:c7215f5f9a72 1081
kbhagat6 1:c7215f5f9a72 1082 bool glibr::setAmbientLightGain(uint8_t drive){
kbhagat6 1:c7215f5f9a72 1083 {
kbhagat6 1:c7215f5f9a72 1084 uint8_t val;
kbhagat6 1:c7215f5f9a72 1085
kbhagat6 1:c7215f5f9a72 1086 /* Read value from CONTROL register */
kbhagat6 1:c7215f5f9a72 1087
kbhagat6 5:3eb4f3091bd8 1088 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CONTROL);
kbhagat6 1:c7215f5f9a72 1089
kbhagat6 1:c7215f5f9a72 1090 if(val==ERROR){
kbhagat6 1:c7215f5f9a72 1091 return false;
kbhagat6 1:c7215f5f9a72 1092 }
kbhagat6 1:c7215f5f9a72 1093 /* Set bits in register to given value */
kbhagat6 1:c7215f5f9a72 1094 //drive &= 0b00000011;
kbhagat6 1:c7215f5f9a72 1095 drive &=0x03;
kbhagat6 1:c7215f5f9a72 1096 drive = drive << 2;
kbhagat6 1:c7215f5f9a72 1097 val &= 0xF3;
kbhagat6 1:c7215f5f9a72 1098 val |= drive;
kbhagat6 1:c7215f5f9a72 1099
kbhagat6 1:c7215f5f9a72 1100 /* Write register value back into CONTROL register */
kbhagat6 1:c7215f5f9a72 1101 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONTROL, val) ) {
kbhagat6 1:c7215f5f9a72 1102 return false;
kbhagat6 1:c7215f5f9a72 1103 }
kbhagat6 1:c7215f5f9a72 1104 return true;
kbhagat6 1:c7215f5f9a72 1105 }
kbhagat6 1:c7215f5f9a72 1106
kbhagat6 1:c7215f5f9a72 1107
kbhagat6 3:26146a08bb22 1108
kbhagat6 3:26146a08bb22 1109
kbhagat6 3:26146a08bb22 1110
kbhagat6 1:c7215f5f9a72 1111 bool glibr::setLightIntLowThreshold(uint16_t threshold)
kbhagat6 1:c7215f5f9a72 1112 {
kbhagat6 1:c7215f5f9a72 1113 uint8_t val_low;
kbhagat6 1:c7215f5f9a72 1114 uint8_t val_high;
kbhagat6 1:c7215f5f9a72 1115
kbhagat6 1:c7215f5f9a72 1116 /* Break 16-bit threshold into 2 8-bit values */
kbhagat6 1:c7215f5f9a72 1117 val_low = threshold & 0x00FF;
kbhagat6 1:c7215f5f9a72 1118 val_high = (threshold & 0xFF00) >> 8;
kbhagat6 1:c7215f5f9a72 1119
kbhagat6 1:c7215f5f9a72 1120 /* Write low byte */
kbhagat6 1:c7215f5f9a72 1121 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_AILTL, val_low) ) {
kbhagat6 1:c7215f5f9a72 1122 return false;
kbhagat6 1:c7215f5f9a72 1123 }
kbhagat6 1:c7215f5f9a72 1124
kbhagat6 1:c7215f5f9a72 1125 /* Write high byte */
kbhagat6 1:c7215f5f9a72 1126 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_AILTH, val_high) ) {
kbhagat6 1:c7215f5f9a72 1127 return false;
kbhagat6 1:c7215f5f9a72 1128 }
kbhagat6 1:c7215f5f9a72 1129
kbhagat6 1:c7215f5f9a72 1130 return true;
kbhagat6 1:c7215f5f9a72 1131 }
kbhagat6 1:c7215f5f9a72 1132
kbhagat6 5:3eb4f3091bd8 1133
kbhagat6 5:3eb4f3091bd8 1134
kbhagat6 5:3eb4f3091bd8 1135
kbhagat6 5:3eb4f3091bd8 1136
kbhagat6 5:3eb4f3091bd8 1137 int glibr::I2CwriteByte(char address, char subAddress, char data)
kbhagat6 5:3eb4f3091bd8 1138 {
kbhagat6 5:3eb4f3091bd8 1139 int ret;
kbhagat6 5:3eb4f3091bd8 1140 char cmd[2] = {subAddress, data};
kbhagat6 5:3eb4f3091bd8 1141 ret=i2c.write(address<<1, cmd, 2); //if ret is 1, then not acked.
kbhagat6 5:3eb4f3091bd8 1142 return ret;
kbhagat6 5:3eb4f3091bd8 1143 }
kbhagat6 5:3eb4f3091bd8 1144
kbhagat6 5:3eb4f3091bd8 1145
kbhagat6 5:3eb4f3091bd8 1146
kbhagat6 0:437ae08befe3 1147 uint8_t glibr::I2CreadByte(char address, char subAddress)
kbhagat6 0:437ae08befe3 1148 {
kbhagat6 0:437ae08befe3 1149 char data; // store the register data
kbhagat6 0:437ae08befe3 1150
kbhagat6 0:437ae08befe3 1151 if(i2c.write(address<<1, &subAddress, 1, true)){
kbhagat6 0:437ae08befe3 1152 return ERROR; //7 bit //not acked
kbhagat6 0:437ae08befe3 1153 }
kbhagat6 0:437ae08befe3 1154 i2c.read(address<<1, &data, 1);
kbhagat6 0:437ae08befe3 1155 return data;
kbhagat6 0:437ae08befe3 1156
kbhagat6 0:437ae08befe3 1157 }
kbhagat6 5:3eb4f3091bd8 1158
kbhagat6 5:3eb4f3091bd8 1159 /**
kbhagat6 5:3eb4f3091bd8 1160 * @brief Reads a block (array) of bytes from the I2C device and register
kbhagat6 5:3eb4f3091bd8 1161 *
kbhagat6 5:3eb4f3091bd8 1162 * @param[in] reg the register to read from
kbhagat6 5:3eb4f3091bd8 1163 * @param[out] val pointer to the beginning of the data
kbhagat6 5:3eb4f3091bd8 1164 * @param[in] len number of bytes to read
kbhagat6 5:3eb4f3091bd8 1165 * @return Number of bytes read. -1 on read error.
kbhagat6 5:3eb4f3091bd8 1166 */
kbhagat6 5:3eb4f3091bd8 1167 int glibr::I2CReadDataBlock(char address, char subAddress, unsigned int len)
kbhagat6 5:3eb4f3091bd8 1168 {
kbhagat6 5:3eb4f3091bd8 1169 // unsigned char i = 0;
kbhagat6 5:3eb4f3091bd8 1170 char *data
kbhagat6 5:3eb4f3091bd8 1171 /* Indicate which register we want to read from */
kbhagat6 5:3eb4f3091bd8 1172
kbhagat6 5:3eb4f3091bd8 1173 if(i2c.write(address<<1, subAddress, 1, true)){
kbhagat6 5:3eb4f3091bd8 1174 return -1; //7 bit //not acked
kbhagat6 5:3eb4f3091bd8 1175 }
kbhagat6 5:3eb4f3091bd8 1176
kbhagat6 5:3eb4f3091bd8 1177 /* Read block data */
kbhagat6 5:3eb4f3091bd8 1178 i2c.read(address<<1, &data, len);
kbhagat6 5:3eb4f3091bd8 1179
kbhagat6 5:3eb4f3091bd8 1180 //Wire.requestFrom(APDS9960_I2C_ADDR, len);
kbhagat6 5:3eb4f3091bd8 1181 /*while (Wire.available()) {
kbhagat6 5:3eb4f3091bd8 1182 if (i >= len) {
kbhagat6 5:3eb4f3091bd8 1183 return -1;
kbhagat6 5:3eb4f3091bd8 1184 }
kbhagat6 5:3eb4f3091bd8 1185 val[i] = Wire.read();
kbhagat6 5:3eb4f3091bd8 1186 i++;
kbhagat6 5:3eb4f3091bd8 1187 }*/
kbhagat6 5:3eb4f3091bd8 1188
kbhagat6 5:3eb4f3091bd8 1189 return data;
kbhagat6 5:3eb4f3091bd8 1190 }