Elliot Heisenberg / APDS_9960

Dependents:   MoveYourTetris

Fork of APDS_9960 by Krishan Bhagat

Committer:
Willheisen
Date:
Sun Apr 24 21:38:02 2016 +0000
Revision:
5:edeac466a3b7
fre

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Willheisen 5:edeac466a3b7 1 #include "glibr.h"
Willheisen 5:edeac466a3b7 2 #include "mbed.h"
Willheisen 5:edeac466a3b7 3
Willheisen 5:edeac466a3b7 4 //Classe du capteur de mouvement APDS_9960
Willheisen 5:edeac466a3b7 5
Willheisen 5:edeac466a3b7 6
Willheisen 5:edeac466a3b7 7 glibr::glibr(PinName sda, PinName scl):i2c(sda, scl){
Willheisen 5:edeac466a3b7 8 gesture_ud_delta_ = 0;
Willheisen 5:edeac466a3b7 9 gesture_lr_delta_ = 0;
Willheisen 5:edeac466a3b7 10
Willheisen 5:edeac466a3b7 11 gesture_ud_count_ = 0;
Willheisen 5:edeac466a3b7 12 gesture_lr_count_ = 0;
Willheisen 5:edeac466a3b7 13
Willheisen 5:edeac466a3b7 14 gesture_near_count_ = 0;
Willheisen 5:edeac466a3b7 15 gesture_far_count_ = 0;
Willheisen 5:edeac466a3b7 16
Willheisen 5:edeac466a3b7 17 gesture_state_ = 0;
Willheisen 5:edeac466a3b7 18 gesture_motion_ = DIR_NONE;
Willheisen 5:edeac466a3b7 19 }
Willheisen 5:edeac466a3b7 20
Willheisen 5:edeac466a3b7 21 glibr::~glibr(){
Willheisen 5:edeac466a3b7 22
Willheisen 5:edeac466a3b7 23 }
Willheisen 5:edeac466a3b7 24
Willheisen 5:edeac466a3b7 25 bool glibr::ginit(){
Willheisen 5:edeac466a3b7 26 uint8_t id;
Willheisen 5:edeac466a3b7 27
Willheisen 5:edeac466a3b7 28 id=I2CreadByte(APDS9960_I2C_ADDR, APDS9960_ID);
Willheisen 5:edeac466a3b7 29
Willheisen 5:edeac466a3b7 30 if( (!(id == APDS9960_ID_1 || id == APDS9960_ID_2))||id==ERROR) {
Willheisen 5:edeac466a3b7 31 return false;
Willheisen 5:edeac466a3b7 32 }
Willheisen 5:edeac466a3b7 33
Willheisen 5:edeac466a3b7 34 if(!setMode(ALL, Off)) {
Willheisen 5:edeac466a3b7 35 return false;
Willheisen 5:edeac466a3b7 36 }
Willheisen 5:edeac466a3b7 37 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_ATIME, DEFAULT_ATIME)){
Willheisen 5:edeac466a3b7 38 return false;
Willheisen 5:edeac466a3b7 39 }
Willheisen 5:edeac466a3b7 40 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_WTIME, DEFAULT_WTIME)){
Willheisen 5:edeac466a3b7 41 return false;
Willheisen 5:edeac466a3b7 42 }
Willheisen 5:edeac466a3b7 43 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PPULSE, DEFAULT_PROX_PPULSE)){
Willheisen 5:edeac466a3b7 44 return false;
Willheisen 5:edeac466a3b7 45 }
Willheisen 5:edeac466a3b7 46 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_POFFSET_UR, DEFAULT_POFFSET_UR)){
Willheisen 5:edeac466a3b7 47 return false;
Willheisen 5:edeac466a3b7 48 }
Willheisen 5:edeac466a3b7 49 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_POFFSET_DL, DEFAULT_POFFSET_DL)){
Willheisen 5:edeac466a3b7 50 return false;
Willheisen 5:edeac466a3b7 51 }
Willheisen 5:edeac466a3b7 52 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONFIG1, DEFAULT_CONFIG1)){
Willheisen 5:edeac466a3b7 53 return false;
Willheisen 5:edeac466a3b7 54 }
Willheisen 5:edeac466a3b7 55
Willheisen 5:edeac466a3b7 56 if( !setLEDDrive(DEFAULT_LDRIVE) ) {
Willheisen 5:edeac466a3b7 57 return false;
Willheisen 5:edeac466a3b7 58 }
Willheisen 5:edeac466a3b7 59
Willheisen 5:edeac466a3b7 60 if( !setProximityGain(DEFAULT_PGAIN) ) {
Willheisen 5:edeac466a3b7 61 return false;
Willheisen 5:edeac466a3b7 62 }
Willheisen 5:edeac466a3b7 63 if( !setAmbientLightGain(DEFAULT_AGAIN) ) {
Willheisen 5:edeac466a3b7 64 return false;
Willheisen 5:edeac466a3b7 65 }
Willheisen 5:edeac466a3b7 66 if( !setProxIntLowThresh(DEFAULT_PILT) ) {
Willheisen 5:edeac466a3b7 67 return false;
Willheisen 5:edeac466a3b7 68 }
Willheisen 5:edeac466a3b7 69 if( !setProxIntHighThresh(DEFAULT_PIHT) ) {
Willheisen 5:edeac466a3b7 70 return false;
Willheisen 5:edeac466a3b7 71 }
Willheisen 5:edeac466a3b7 72 if( !setLightIntLowThreshold(DEFAULT_AILT) ) {
Willheisen 5:edeac466a3b7 73 return false;
Willheisen 5:edeac466a3b7 74 }
Willheisen 5:edeac466a3b7 75 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONFIG2, DEFAULT_CONFIG2) ) {
Willheisen 5:edeac466a3b7 76 return false;
Willheisen 5:edeac466a3b7 77 }
Willheisen 5:edeac466a3b7 78 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONFIG3, DEFAULT_CONFIG3) ) {
Willheisen 5:edeac466a3b7 79 return false;
Willheisen 5:edeac466a3b7 80 }
Willheisen 5:edeac466a3b7 81
Willheisen 5:edeac466a3b7 82 if( !setGestureEnterThresh(DEFAULT_GPENTH) ) {
Willheisen 5:edeac466a3b7 83 return false;
Willheisen 5:edeac466a3b7 84 }
Willheisen 5:edeac466a3b7 85 if( !setGestureExitThresh(DEFAULT_GEXTH) ) {
Willheisen 5:edeac466a3b7 86 return false;
Willheisen 5:edeac466a3b7 87 }
Willheisen 5:edeac466a3b7 88 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GCONF1, DEFAULT_GCONF1) ) {
Willheisen 5:edeac466a3b7 89 return false;
Willheisen 5:edeac466a3b7 90 }
Willheisen 5:edeac466a3b7 91 if( !setGestureGain(DEFAULT_GGAIN) ) {
Willheisen 5:edeac466a3b7 92 return false;
Willheisen 5:edeac466a3b7 93 }
Willheisen 5:edeac466a3b7 94 if( !setGestureLEDDrive(DEFAULT_GLDRIVE) ) {
Willheisen 5:edeac466a3b7 95 return false;
Willheisen 5:edeac466a3b7 96 }
Willheisen 5:edeac466a3b7 97 if( !setGestureWaitTime(DEFAULT_GWTIME) ) {
Willheisen 5:edeac466a3b7 98 return false;
Willheisen 5:edeac466a3b7 99 }
Willheisen 5:edeac466a3b7 100 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GOFFSET_U, DEFAULT_GOFFSET) ) {
Willheisen 5:edeac466a3b7 101 return false;
Willheisen 5:edeac466a3b7 102 }
Willheisen 5:edeac466a3b7 103 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GOFFSET_D, DEFAULT_GOFFSET) ) {
Willheisen 5:edeac466a3b7 104 return false;
Willheisen 5:edeac466a3b7 105 }
Willheisen 5:edeac466a3b7 106 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GOFFSET_L, DEFAULT_GOFFSET) ) {
Willheisen 5:edeac466a3b7 107 return false;
Willheisen 5:edeac466a3b7 108 }
Willheisen 5:edeac466a3b7 109 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GOFFSET_R, DEFAULT_GOFFSET) ) {
Willheisen 5:edeac466a3b7 110 return false;
Willheisen 5:edeac466a3b7 111 }
Willheisen 5:edeac466a3b7 112 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GPULSE, DEFAULT_GPULSE) ) {
Willheisen 5:edeac466a3b7 113 return false;
Willheisen 5:edeac466a3b7 114 }
Willheisen 5:edeac466a3b7 115 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GCONF3, DEFAULT_GCONF3) ) {
Willheisen 5:edeac466a3b7 116 return false;
Willheisen 5:edeac466a3b7 117 }
Willheisen 5:edeac466a3b7 118 if( !setGestureIntEnable(DEFAULT_GIEN) ) {
Willheisen 5:edeac466a3b7 119 return false;
Willheisen 5:edeac466a3b7 120 }
Willheisen 5:edeac466a3b7 121
Willheisen 5:edeac466a3b7 122 return true;
Willheisen 5:edeac466a3b7 123
Willheisen 5:edeac466a3b7 124 }
Willheisen 5:edeac466a3b7 125
Willheisen 5:edeac466a3b7 126 //#if 0
Willheisen 5:edeac466a3b7 127 // /* Gesture config register dump */
Willheisen 5:edeac466a3b7 128 // uint8_t reg;
Willheisen 5:edeac466a3b7 129 // uint8_t val;
Willheisen 5:edeac466a3b7 130 //
Willheisen 5:edeac466a3b7 131 // for(reg = 0x80; reg <= 0xAF; reg++) {
Willheisen 5:edeac466a3b7 132 // if( (reg != 0x82) && \
Willheisen 5:edeac466a3b7 133 // (reg != 0x8A) && \
Willheisen 5:edeac466a3b7 134 // (reg != 0x91) && \
Willheisen 5:edeac466a3b7 135 // (reg != 0xA8) && \
Willheisen 5:edeac466a3b7 136 // (reg != 0xAC) && \
Willheisen 5:edeac466a3b7 137 // (reg != 0xAD) )
Willheisen 5:edeac466a3b7 138 // {
Willheisen 5:edeac466a3b7 139 // val= I2CreadByte(APDS9960_I2C_ADDR, reg);
Willheisen 5:edeac466a3b7 140 // if(val==ERROR){
Willheisen 5:edeac466a3b7 141 // printf("ERROR");
Willheisen 5:edeac466a3b7 142 // }
Willheisen 5:edeac466a3b7 143 // /*
Willheisen 5:edeac466a3b7 144 // print(reg, HEX);
Willheisen 5:edeac466a3b7 145 // print(": 0x");
Willheisen 5:edeac466a3b7 146 // println(val, HEX);*/
Willheisen 5:edeac466a3b7 147 // }
Willheisen 5:edeac466a3b7 148 // }
Willheisen 5:edeac466a3b7 149 //
Willheisen 5:edeac466a3b7 150 // for(reg = 0xE4; reg <= 0xE7; reg++) {
Willheisen 5:edeac466a3b7 151 // val= I2CreadByte(APDS9960_I2C_ADDR, reg);
Willheisen 5:edeac466a3b7 152 // /* Serial.print(reg, HEX);
Willheisen 5:edeac466a3b7 153 // Serial.print(": 0x");
Willheisen 5:edeac466a3b7 154 // Serial.println(val, HEX);*/
Willheisen 5:edeac466a3b7 155 // }
Willheisen 5:edeac466a3b7 156 //#endif
Willheisen 5:edeac466a3b7 157
Willheisen 5:edeac466a3b7 158 // return true;
Willheisen 5:edeac466a3b7 159
Willheisen 5:edeac466a3b7 160
Willheisen 5:edeac466a3b7 161
Willheisen 5:edeac466a3b7 162
Willheisen 5:edeac466a3b7 163 /**
Willheisen 5:edeac466a3b7 164 * @brief Enables or disables a feature in the APDS-9960
Willheisen 5:edeac466a3b7 165 *
Willheisen 5:edeac466a3b7 166 * @param[in] mode which feature to enable
Willheisen 5:edeac466a3b7 167 * @param[in] enable On (1) or Off (0)
Willheisen 5:edeac466a3b7 168 * @return True if operation success. False otherwise.
Willheisen 5:edeac466a3b7 169 */
Willheisen 5:edeac466a3b7 170 bool glibr::setMode(uint8_t mode, uint8_t enable)
Willheisen 5:edeac466a3b7 171 {
Willheisen 5:edeac466a3b7 172 uint8_t reg_val;
Willheisen 5:edeac466a3b7 173
Willheisen 5:edeac466a3b7 174 /* Read current ENABLE register */
Willheisen 5:edeac466a3b7 175 reg_val = getMode();
Willheisen 5:edeac466a3b7 176 if( reg_val == ERROR ) {
Willheisen 5:edeac466a3b7 177 return false;
Willheisen 5:edeac466a3b7 178 }
Willheisen 5:edeac466a3b7 179
Willheisen 5:edeac466a3b7 180 /* Change bit(s) in ENABLE register */
Willheisen 5:edeac466a3b7 181 enable = enable & 0x01;
Willheisen 5:edeac466a3b7 182 if( mode >= 0 && mode <= 6 ) {
Willheisen 5:edeac466a3b7 183 if (enable) {
Willheisen 5:edeac466a3b7 184 reg_val |= (1 << mode);
Willheisen 5:edeac466a3b7 185 } else {
Willheisen 5:edeac466a3b7 186 reg_val &= ~(1 << mode);
Willheisen 5:edeac466a3b7 187 }
Willheisen 5:edeac466a3b7 188 } else if( mode == ALL ) {
Willheisen 5:edeac466a3b7 189 if (enable) {
Willheisen 5:edeac466a3b7 190 reg_val = 0x7F;
Willheisen 5:edeac466a3b7 191 } else {
Willheisen 5:edeac466a3b7 192 reg_val = 0x00;
Willheisen 5:edeac466a3b7 193 }
Willheisen 5:edeac466a3b7 194 }
Willheisen 5:edeac466a3b7 195
Willheisen 5:edeac466a3b7 196 /* Write value back to ENABLE register */
Willheisen 5:edeac466a3b7 197 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_ENABLE, reg_val)){
Willheisen 5:edeac466a3b7 198 return false;
Willheisen 5:edeac466a3b7 199 }
Willheisen 5:edeac466a3b7 200
Willheisen 5:edeac466a3b7 201
Willheisen 5:edeac466a3b7 202
Willheisen 5:edeac466a3b7 203 return true;
Willheisen 5:edeac466a3b7 204 }
Willheisen 5:edeac466a3b7 205
Willheisen 5:edeac466a3b7 206 uint8_t glibr::getMode()
Willheisen 5:edeac466a3b7 207 {
Willheisen 5:edeac466a3b7 208 uint8_t val;
Willheisen 5:edeac466a3b7 209 val= I2CreadByte(APDS9960_I2C_ADDR, APDS9960_ENABLE);
Willheisen 5:edeac466a3b7 210 if(val==ERROR){
Willheisen 5:edeac466a3b7 211 return ERROR;
Willheisen 5:edeac466a3b7 212 }
Willheisen 5:edeac466a3b7 213 return val;
Willheisen 5:edeac466a3b7 214 }
Willheisen 5:edeac466a3b7 215
Willheisen 5:edeac466a3b7 216
Willheisen 5:edeac466a3b7 217
Willheisen 5:edeac466a3b7 218 bool glibr::enableLightSensor(bool interrupts)
Willheisen 5:edeac466a3b7 219 {
Willheisen 5:edeac466a3b7 220
Willheisen 5:edeac466a3b7 221 /* Set default gain, interrupts, enable power, and enable sensor */
Willheisen 5:edeac466a3b7 222 if( !setAmbientLightGain(DEFAULT_AGAIN) ) {
Willheisen 5:edeac466a3b7 223 return false;
Willheisen 5:edeac466a3b7 224 }
Willheisen 5:edeac466a3b7 225 if( interrupts ) {
Willheisen 5:edeac466a3b7 226 if( !setAmbientLightIntEnable(1) ) {
Willheisen 5:edeac466a3b7 227 return false;
Willheisen 5:edeac466a3b7 228 }
Willheisen 5:edeac466a3b7 229 } else {
Willheisen 5:edeac466a3b7 230 if( !setAmbientLightIntEnable(0) ) {
Willheisen 5:edeac466a3b7 231 return false;
Willheisen 5:edeac466a3b7 232 }
Willheisen 5:edeac466a3b7 233 }
Willheisen 5:edeac466a3b7 234 if( !enablePower() ){
Willheisen 5:edeac466a3b7 235 return false;
Willheisen 5:edeac466a3b7 236 }
Willheisen 5:edeac466a3b7 237 if( !setMode(AMBIENT_LIGHT, 1) ) {
Willheisen 5:edeac466a3b7 238 return false;
Willheisen 5:edeac466a3b7 239 }
Willheisen 5:edeac466a3b7 240
Willheisen 5:edeac466a3b7 241 return true;
Willheisen 5:edeac466a3b7 242
Willheisen 5:edeac466a3b7 243 }
Willheisen 5:edeac466a3b7 244
Willheisen 5:edeac466a3b7 245 /**
Willheisen 5:edeac466a3b7 246 * @brief Ends the light sensor on the APDS-9960
Willheisen 5:edeac466a3b7 247 *
Willheisen 5:edeac466a3b7 248 * @return True if sensor disabled correctly. False on error.
Willheisen 5:edeac466a3b7 249 */
Willheisen 5:edeac466a3b7 250 bool glibr::disableLightSensor()
Willheisen 5:edeac466a3b7 251 {
Willheisen 5:edeac466a3b7 252 if( !setAmbientLightIntEnable(0) ) {
Willheisen 5:edeac466a3b7 253 return false;
Willheisen 5:edeac466a3b7 254 }
Willheisen 5:edeac466a3b7 255 if( !setMode(AMBIENT_LIGHT, 0) ) {
Willheisen 5:edeac466a3b7 256 return false;
Willheisen 5:edeac466a3b7 257 }
Willheisen 5:edeac466a3b7 258
Willheisen 5:edeac466a3b7 259 return true;
Willheisen 5:edeac466a3b7 260 }
Willheisen 5:edeac466a3b7 261
Willheisen 5:edeac466a3b7 262 /**
Willheisen 5:edeac466a3b7 263 * @brief Starts the proximity sensor on the APDS-9960
Willheisen 5:edeac466a3b7 264 *
Willheisen 5:edeac466a3b7 265 * @param[in] interrupts true to enable hardware external interrupt on proximity
Willheisen 5:edeac466a3b7 266 * @return True if sensor enabled correctly. False on error.
Willheisen 5:edeac466a3b7 267 */
Willheisen 5:edeac466a3b7 268 bool glibr::enableProximitySensor(bool interrupts)
Willheisen 5:edeac466a3b7 269 {
Willheisen 5:edeac466a3b7 270 /* Set default gain, LED, interrupts, enable power, and enable sensor */
Willheisen 5:edeac466a3b7 271 if( !setProximityGain(DEFAULT_PGAIN) ) {
Willheisen 5:edeac466a3b7 272 return false;
Willheisen 5:edeac466a3b7 273 }
Willheisen 5:edeac466a3b7 274 if( !setLEDDrive(DEFAULT_LDRIVE) ) {
Willheisen 5:edeac466a3b7 275 return false;
Willheisen 5:edeac466a3b7 276 }
Willheisen 5:edeac466a3b7 277 if( interrupts ) {
Willheisen 5:edeac466a3b7 278 if( !setProximityIntEnable(1) ) {
Willheisen 5:edeac466a3b7 279 return false;
Willheisen 5:edeac466a3b7 280 }
Willheisen 5:edeac466a3b7 281 } else {
Willheisen 5:edeac466a3b7 282 if( !setProximityIntEnable(0) ) {
Willheisen 5:edeac466a3b7 283 return false;
Willheisen 5:edeac466a3b7 284 }
Willheisen 5:edeac466a3b7 285 }
Willheisen 5:edeac466a3b7 286 if( !enablePower() ){
Willheisen 5:edeac466a3b7 287 return false;
Willheisen 5:edeac466a3b7 288 }
Willheisen 5:edeac466a3b7 289 if( !setMode(PROXIMITY, 1) ) {
Willheisen 5:edeac466a3b7 290 return false;
Willheisen 5:edeac466a3b7 291 }
Willheisen 5:edeac466a3b7 292
Willheisen 5:edeac466a3b7 293 return true;
Willheisen 5:edeac466a3b7 294 }
Willheisen 5:edeac466a3b7 295
Willheisen 5:edeac466a3b7 296 /**
Willheisen 5:edeac466a3b7 297 * @brief Ends the proximity sensor on the APDS-9960
Willheisen 5:edeac466a3b7 298 *
Willheisen 5:edeac466a3b7 299 * @return True if sensor disabled correctly. False on error.
Willheisen 5:edeac466a3b7 300 */
Willheisen 5:edeac466a3b7 301 bool glibr::disableProximitySensor()
Willheisen 5:edeac466a3b7 302 {
Willheisen 5:edeac466a3b7 303 if( !setProximityIntEnable(0) ) {
Willheisen 5:edeac466a3b7 304 return false;
Willheisen 5:edeac466a3b7 305 }
Willheisen 5:edeac466a3b7 306 if( !setMode(PROXIMITY, 0) ) {
Willheisen 5:edeac466a3b7 307 return false;
Willheisen 5:edeac466a3b7 308 }
Willheisen 5:edeac466a3b7 309
Willheisen 5:edeac466a3b7 310 return true;
Willheisen 5:edeac466a3b7 311 }
Willheisen 5:edeac466a3b7 312
Willheisen 5:edeac466a3b7 313
Willheisen 5:edeac466a3b7 314 /**
Willheisen 5:edeac466a3b7 315 * @brief Starts the gesture recognition engine on the APDS-9960
Willheisen 5:edeac466a3b7 316 *
Willheisen 5:edeac466a3b7 317 * @param[in] interrupts true to enable hardware external interrupt on gesture
Willheisen 5:edeac466a3b7 318 * @return True if engine enabled correctly. False on error.
Willheisen 5:edeac466a3b7 319 */
Willheisen 5:edeac466a3b7 320 bool glibr::enableGestureSensor(bool interrupts)
Willheisen 5:edeac466a3b7 321 {
Willheisen 5:edeac466a3b7 322
Willheisen 5:edeac466a3b7 323 /* Enable gesture mode
Willheisen 5:edeac466a3b7 324 Set ENABLE to 0 (power off)
Willheisen 5:edeac466a3b7 325 Set WTIME to 0xFF
Willheisen 5:edeac466a3b7 326 Set AUX to LED_BOOST_300
Willheisen 5:edeac466a3b7 327 Enable PON, WEN, PEN, GEN in ENABLE
Willheisen 5:edeac466a3b7 328 */
Willheisen 5:edeac466a3b7 329
Willheisen 5:edeac466a3b7 330 resetGestureParameters();
Willheisen 5:edeac466a3b7 331 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_WTIME, 0xFF) ) {
Willheisen 5:edeac466a3b7 332 return false;
Willheisen 5:edeac466a3b7 333 }
Willheisen 5:edeac466a3b7 334 if(I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PPULSE, DEFAULT_GESTURE_PPULSE) ) {
Willheisen 5:edeac466a3b7 335 return false;
Willheisen 5:edeac466a3b7 336 }
Willheisen 5:edeac466a3b7 337 if( !setLEDBoost(LED_BOOST_300) ) {
Willheisen 5:edeac466a3b7 338 return false;
Willheisen 5:edeac466a3b7 339 }
Willheisen 5:edeac466a3b7 340 if( interrupts ) {
Willheisen 5:edeac466a3b7 341 if( !setGestureIntEnable(1) ) {
Willheisen 5:edeac466a3b7 342 return false;
Willheisen 5:edeac466a3b7 343 }
Willheisen 5:edeac466a3b7 344 } else {
Willheisen 5:edeac466a3b7 345 if( !setGestureIntEnable(0) ) {
Willheisen 5:edeac466a3b7 346 return false;
Willheisen 5:edeac466a3b7 347 }
Willheisen 5:edeac466a3b7 348 }
Willheisen 5:edeac466a3b7 349 if( !setGestureMode(1) ) {
Willheisen 5:edeac466a3b7 350 return false;
Willheisen 5:edeac466a3b7 351 }
Willheisen 5:edeac466a3b7 352 if( !enablePower() ){
Willheisen 5:edeac466a3b7 353 return false;
Willheisen 5:edeac466a3b7 354 }
Willheisen 5:edeac466a3b7 355 if( !setMode(WAIT, 1) ) {
Willheisen 5:edeac466a3b7 356 return false;
Willheisen 5:edeac466a3b7 357 }
Willheisen 5:edeac466a3b7 358 if( !setMode(PROXIMITY, 1) ) {
Willheisen 5:edeac466a3b7 359 return false;
Willheisen 5:edeac466a3b7 360 }
Willheisen 5:edeac466a3b7 361 if( !setMode(GESTURE, 1) ) {
Willheisen 5:edeac466a3b7 362 return false;
Willheisen 5:edeac466a3b7 363 }
Willheisen 5:edeac466a3b7 364
Willheisen 5:edeac466a3b7 365 return true;
Willheisen 5:edeac466a3b7 366 }
Willheisen 5:edeac466a3b7 367
Willheisen 5:edeac466a3b7 368 /**
Willheisen 5:edeac466a3b7 369 * @brief Ends the gesture recognition engine on the APDS-9960
Willheisen 5:edeac466a3b7 370 *
Willheisen 5:edeac466a3b7 371 * @return True if engine disabled correctly. False on error.
Willheisen 5:edeac466a3b7 372 */
Willheisen 5:edeac466a3b7 373 bool glibr::disableGestureSensor()
Willheisen 5:edeac466a3b7 374 {
Willheisen 5:edeac466a3b7 375 resetGestureParameters();
Willheisen 5:edeac466a3b7 376 if( !setGestureIntEnable(0) ) {
Willheisen 5:edeac466a3b7 377 return false;
Willheisen 5:edeac466a3b7 378 }
Willheisen 5:edeac466a3b7 379 if( !setGestureMode(0) ) {
Willheisen 5:edeac466a3b7 380 return false;
Willheisen 5:edeac466a3b7 381 }
Willheisen 5:edeac466a3b7 382 if( !setMode(GESTURE, 0) ) {
Willheisen 5:edeac466a3b7 383 return false;
Willheisen 5:edeac466a3b7 384 }
Willheisen 5:edeac466a3b7 385
Willheisen 5:edeac466a3b7 386 return true;
Willheisen 5:edeac466a3b7 387 }
Willheisen 5:edeac466a3b7 388
Willheisen 5:edeac466a3b7 389
Willheisen 5:edeac466a3b7 390 /**
Willheisen 5:edeac466a3b7 391 * @brief Determines if there is a gesture available for reading
Willheisen 5:edeac466a3b7 392 *
Willheisen 5:edeac466a3b7 393 * @return True if gesture available. False otherwise.
Willheisen 5:edeac466a3b7 394 */
Willheisen 5:edeac466a3b7 395 bool glibr::isGestureAvailable()
Willheisen 5:edeac466a3b7 396 {
Willheisen 5:edeac466a3b7 397 uint8_t val;
Willheisen 5:edeac466a3b7 398
Willheisen 5:edeac466a3b7 399 /* Read value from GSTATUS register */
Willheisen 5:edeac466a3b7 400 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GSTATUS);
Willheisen 5:edeac466a3b7 401 if( val==ERROR) {
Willheisen 5:edeac466a3b7 402 return ERROR;
Willheisen 5:edeac466a3b7 403 }
Willheisen 5:edeac466a3b7 404
Willheisen 5:edeac466a3b7 405 /* Shift and mask out GVALID bit */
Willheisen 5:edeac466a3b7 406 val &= APDS9960_GVALID;
Willheisen 5:edeac466a3b7 407
Willheisen 5:edeac466a3b7 408 /* Return true/false based on GVALID bit */
Willheisen 5:edeac466a3b7 409 if( val == 1) {
Willheisen 5:edeac466a3b7 410 return true;
Willheisen 5:edeac466a3b7 411 } else {
Willheisen 5:edeac466a3b7 412 return false;
Willheisen 5:edeac466a3b7 413 }
Willheisen 5:edeac466a3b7 414 }
Willheisen 5:edeac466a3b7 415
Willheisen 5:edeac466a3b7 416 int glibr::readGesture()
Willheisen 5:edeac466a3b7 417 {
Willheisen 5:edeac466a3b7 418 uint8_t fifo_level = 0;
Willheisen 5:edeac466a3b7 419 // uint8_t bytes_expected= 0;
Willheisen 5:edeac466a3b7 420 int check;
Willheisen 5:edeac466a3b7 421 //char fifo_data[128];
Willheisen 5:edeac466a3b7 422 char fifo_data[128];
Willheisen 5:edeac466a3b7 423 char *fptr;
Willheisen 5:edeac466a3b7 424 fptr= fifo_data;
Willheisen 5:edeac466a3b7 425
Willheisen 5:edeac466a3b7 426 uint8_t gstatus;
Willheisen 5:edeac466a3b7 427 int motion;
Willheisen 5:edeac466a3b7 428 int i;
Willheisen 5:edeac466a3b7 429
Willheisen 5:edeac466a3b7 430 /* Make sure that power and gesture is on and data is valid */
Willheisen 5:edeac466a3b7 431 if( !isGestureAvailable() || !(getMode() & 0x41) ) {
Willheisen 5:edeac466a3b7 432 return DIR_NONE;
Willheisen 5:edeac466a3b7 433 }
Willheisen 5:edeac466a3b7 434
Willheisen 5:edeac466a3b7 435
Willheisen 5:edeac466a3b7 436 /* Keep looping as long as gesture data is valid */
Willheisen 5:edeac466a3b7 437 while(1) {
Willheisen 5:edeac466a3b7 438
Willheisen 5:edeac466a3b7 439 /* Wait some time to collect next batch of FIFO data */
Willheisen 5:edeac466a3b7 440 wait(FIFO_PAUSE_TIME);
Willheisen 5:edeac466a3b7 441
Willheisen 5:edeac466a3b7 442 /* Get the contents of the STATUS register. Is data still valid? */
Willheisen 5:edeac466a3b7 443
Willheisen 5:edeac466a3b7 444 gstatus=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GSTATUS);
Willheisen 5:edeac466a3b7 445 if( gstatus==ERROR ) {
Willheisen 5:edeac466a3b7 446 return ERROR;
Willheisen 5:edeac466a3b7 447 }
Willheisen 5:edeac466a3b7 448 /* If we have valid data, read in FIFO */
Willheisen 5:edeac466a3b7 449 if( (gstatus & APDS9960_GVALID) == APDS9960_GVALID ) {
Willheisen 5:edeac466a3b7 450
Willheisen 5:edeac466a3b7 451 /* Read the current FIFO level */
Willheisen 5:edeac466a3b7 452 fifo_level=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GFLVL);
Willheisen 5:edeac466a3b7 453 if( fifo_level==ERROR ) {
Willheisen 5:edeac466a3b7 454 return ERROR;
Willheisen 5:edeac466a3b7 455 }
Willheisen 5:edeac466a3b7 456
Willheisen 5:edeac466a3b7 457 //#if DEBUG
Willheisen 5:edeac466a3b7 458 // Serial.print("FIFO Level: ");
Willheisen 5:edeac466a3b7 459 // Serial.println(fifo_level);
Willheisen 5:edeac466a3b7 460 //#endif
Willheisen 5:edeac466a3b7 461
Willheisen 5:edeac466a3b7 462 /* If there's stuff in the FIFO, read it into our data block */ //NEED TO FIGURE OUT WHAT THIS IS DOING.
Willheisen 5:edeac466a3b7 463
Willheisen 5:edeac466a3b7 464 if( fifo_level > 0) {
Willheisen 5:edeac466a3b7 465 check = I2CReadDataBlock(APDS9960_I2C_ADDR,APDS9960_GFIFO_U,
Willheisen 5:edeac466a3b7 466 fptr,
Willheisen 5:edeac466a3b7 467 (fifo_level * 4) );
Willheisen 5:edeac466a3b7 468
Willheisen 5:edeac466a3b7 469 if( check == -1 ) {
Willheisen 5:edeac466a3b7 470 return ERROR;
Willheisen 5:edeac466a3b7 471 }
Willheisen 5:edeac466a3b7 472
Willheisen 5:edeac466a3b7 473 #if DEBUG
Willheisen 5:edeac466a3b7 474 //Serial.print("FIFO Dump: ");
Willheisen 5:edeac466a3b7 475 for ( i = 0; i < (fifo_level * 4); i++ ) {
Willheisen 5:edeac466a3b7 476 // Serial.print(fifo_data[i]);
Willheisen 5:edeac466a3b7 477 // Serial.print(" ");
Willheisen 5:edeac466a3b7 478 }
Willheisen 5:edeac466a3b7 479 //Serial.println();
Willheisen 5:edeac466a3b7 480 #endif
Willheisen 5:edeac466a3b7 481
Willheisen 5:edeac466a3b7 482 /* If at least 1 set of data, sort the data into U/D/L/R */
Willheisen 5:edeac466a3b7 483 if((fifo_level * 4) >= 4 ) {
Willheisen 5:edeac466a3b7 484 for( i = 0; i < (fifo_level * 4); i += 4 ) {
Willheisen 5:edeac466a3b7 485 gesture_data_.u_data[gesture_data_.sindex] = \
Willheisen 5:edeac466a3b7 486 fifo_data[i + 0];
Willheisen 5:edeac466a3b7 487 gesture_data_.d_data[gesture_data_.sindex] = \
Willheisen 5:edeac466a3b7 488 fifo_data[i + 1];
Willheisen 5:edeac466a3b7 489 gesture_data_.l_data[gesture_data_.sindex] = \
Willheisen 5:edeac466a3b7 490 fifo_data[i + 2];
Willheisen 5:edeac466a3b7 491 gesture_data_.r_data[gesture_data_.sindex] = \
Willheisen 5:edeac466a3b7 492 fifo_data[i + 3];
Willheisen 5:edeac466a3b7 493 gesture_data_.sindex++;
Willheisen 5:edeac466a3b7 494 gesture_data_.total_gestures++;
Willheisen 5:edeac466a3b7 495 }
Willheisen 5:edeac466a3b7 496
Willheisen 5:edeac466a3b7 497 #if DEBUG
Willheisen 5:edeac466a3b7 498 // Serial.print("Up Data: ");
Willheisen 5:edeac466a3b7 499 for ( i = 0; i < gesture_data_.total_gestures; i++ ) {
Willheisen 5:edeac466a3b7 500 // Serial.print(gesture_data_.u_data[i]);
Willheisen 5:edeac466a3b7 501 // Serial.print(" ");
Willheisen 5:edeac466a3b7 502 }
Willheisen 5:edeac466a3b7 503 // Serial.println();
Willheisen 5:edeac466a3b7 504 #endif
Willheisen 5:edeac466a3b7 505
Willheisen 5:edeac466a3b7 506 /* Filter and process gesture data. Decode near/far state */
Willheisen 5:edeac466a3b7 507 if( processGestureData() ) {
Willheisen 5:edeac466a3b7 508 if( decodeGesture() ) {
Willheisen 5:edeac466a3b7 509 //***TODO: U-Turn Gestures
Willheisen 5:edeac466a3b7 510 #if DEBUG
Willheisen 5:edeac466a3b7 511 //Serial.println(gesture_motion_);
Willheisen 5:edeac466a3b7 512 #endif
Willheisen 5:edeac466a3b7 513 }
Willheisen 5:edeac466a3b7 514 }
Willheisen 5:edeac466a3b7 515
Willheisen 5:edeac466a3b7 516 /* Reset data */
Willheisen 5:edeac466a3b7 517 gesture_data_.sindex = 0;
Willheisen 5:edeac466a3b7 518 gesture_data_.total_gestures = 0;
Willheisen 5:edeac466a3b7 519 }
Willheisen 5:edeac466a3b7 520 }
Willheisen 5:edeac466a3b7 521 } else {
Willheisen 5:edeac466a3b7 522
Willheisen 5:edeac466a3b7 523 /* Determine best guessed gesture and clean up */
Willheisen 5:edeac466a3b7 524 wait(FIFO_PAUSE_TIME);
Willheisen 5:edeac466a3b7 525 decodeGesture();
Willheisen 5:edeac466a3b7 526 motion = gesture_motion_;
Willheisen 5:edeac466a3b7 527 #if DEBUG
Willheisen 5:edeac466a3b7 528 // Serial.print("END: ");
Willheisen 5:edeac466a3b7 529 // Serial.println(gesture_motion_);
Willheisen 5:edeac466a3b7 530 #endif
Willheisen 5:edeac466a3b7 531 resetGestureParameters();
Willheisen 5:edeac466a3b7 532 return motion;
Willheisen 5:edeac466a3b7 533 }
Willheisen 5:edeac466a3b7 534 }
Willheisen 5:edeac466a3b7 535 // delete fptr;
Willheisen 5:edeac466a3b7 536 }
Willheisen 5:edeac466a3b7 537 /**
Willheisen 5:edeac466a3b7 538 * Turn the APDS-9960 on
Willheisen 5:edeac466a3b7 539 *
Willheisen 5:edeac466a3b7 540 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 541 */
Willheisen 5:edeac466a3b7 542 bool glibr::enablePower()
Willheisen 5:edeac466a3b7 543 {
Willheisen 5:edeac466a3b7 544 if( !setMode(Power, 1) ) {
Willheisen 5:edeac466a3b7 545 return false;
Willheisen 5:edeac466a3b7 546 }
Willheisen 5:edeac466a3b7 547
Willheisen 5:edeac466a3b7 548 return true;
Willheisen 5:edeac466a3b7 549 }
Willheisen 5:edeac466a3b7 550
Willheisen 5:edeac466a3b7 551 /**
Willheisen 5:edeac466a3b7 552 * Turn the APDS-9960 off
Willheisen 5:edeac466a3b7 553 *
Willheisen 5:edeac466a3b7 554 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 555 */
Willheisen 5:edeac466a3b7 556 bool glibr::disablePower()
Willheisen 5:edeac466a3b7 557 {
Willheisen 5:edeac466a3b7 558 if( !setMode(Power, 0) ) {
Willheisen 5:edeac466a3b7 559 return false;
Willheisen 5:edeac466a3b7 560 }
Willheisen 5:edeac466a3b7 561
Willheisen 5:edeac466a3b7 562 return true;
Willheisen 5:edeac466a3b7 563 }
Willheisen 5:edeac466a3b7 564
Willheisen 5:edeac466a3b7 565 /*******************************************************************************
Willheisen 5:edeac466a3b7 566 * Ambient light and color sensor controls
Willheisen 5:edeac466a3b7 567 ******************************************************************************/
Willheisen 5:edeac466a3b7 568
Willheisen 5:edeac466a3b7 569 /**
Willheisen 5:edeac466a3b7 570 * @brief Reads the ambient (clear) light level as a 16-bit value
Willheisen 5:edeac466a3b7 571 *
Willheisen 5:edeac466a3b7 572 * @param[out] val value of the light sensor.
Willheisen 5:edeac466a3b7 573 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 574 */
Willheisen 5:edeac466a3b7 575 bool glibr::readAmbientLight(uint16_t &val)
Willheisen 5:edeac466a3b7 576 {
Willheisen 5:edeac466a3b7 577 uint8_t val_byte;
Willheisen 5:edeac466a3b7 578 val = 0;
Willheisen 5:edeac466a3b7 579
Willheisen 5:edeac466a3b7 580 /* Read value from clear channel, low byte register */
Willheisen 5:edeac466a3b7 581 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CDATAL);
Willheisen 5:edeac466a3b7 582 if( val_byte==ERROR) {
Willheisen 5:edeac466a3b7 583 return false;
Willheisen 5:edeac466a3b7 584 }
Willheisen 5:edeac466a3b7 585 val = val_byte;
Willheisen 5:edeac466a3b7 586
Willheisen 5:edeac466a3b7 587 /* Read value from clear channel, high byte register */
Willheisen 5:edeac466a3b7 588
Willheisen 5:edeac466a3b7 589 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CDATAH);
Willheisen 5:edeac466a3b7 590 if( val_byte==ERROR) {
Willheisen 5:edeac466a3b7 591 return false;
Willheisen 5:edeac466a3b7 592 }
Willheisen 5:edeac466a3b7 593 val = val + ((uint16_t)val_byte << 8);
Willheisen 5:edeac466a3b7 594 return true;
Willheisen 5:edeac466a3b7 595 }
Willheisen 5:edeac466a3b7 596
Willheisen 5:edeac466a3b7 597 /**
Willheisen 5:edeac466a3b7 598 * @brief Reads the red light level as a 16-bit value
Willheisen 5:edeac466a3b7 599 *
Willheisen 5:edeac466a3b7 600 * @param[out] val value of the light sensor.
Willheisen 5:edeac466a3b7 601 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 602 */
Willheisen 5:edeac466a3b7 603 bool glibr::readRedLight(uint16_t &val)
Willheisen 5:edeac466a3b7 604 {
Willheisen 5:edeac466a3b7 605 uint8_t val_byte;
Willheisen 5:edeac466a3b7 606 val = 0;
Willheisen 5:edeac466a3b7 607
Willheisen 5:edeac466a3b7 608 /* Read value from clear channel, low byte register */
Willheisen 5:edeac466a3b7 609 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_RDATAL);
Willheisen 5:edeac466a3b7 610 if( val_byte==ERROR) {
Willheisen 5:edeac466a3b7 611 return false;
Willheisen 5:edeac466a3b7 612 }
Willheisen 5:edeac466a3b7 613
Willheisen 5:edeac466a3b7 614 val = val_byte;
Willheisen 5:edeac466a3b7 615
Willheisen 5:edeac466a3b7 616 /* Read value from clear channel, high byte register */
Willheisen 5:edeac466a3b7 617 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_RDATAH);
Willheisen 5:edeac466a3b7 618 if( val_byte==ERROR) {
Willheisen 5:edeac466a3b7 619 return false;
Willheisen 5:edeac466a3b7 620 }
Willheisen 5:edeac466a3b7 621 val = val + ((uint16_t)val_byte << 8);
Willheisen 5:edeac466a3b7 622
Willheisen 5:edeac466a3b7 623 return true;
Willheisen 5:edeac466a3b7 624 }
Willheisen 5:edeac466a3b7 625
Willheisen 5:edeac466a3b7 626 /**
Willheisen 5:edeac466a3b7 627 * @brief Reads the green light level as a 16-bit value
Willheisen 5:edeac466a3b7 628 *
Willheisen 5:edeac466a3b7 629 * @param[out] val value of the light sensor.
Willheisen 5:edeac466a3b7 630 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 631 */
Willheisen 5:edeac466a3b7 632
Willheisen 5:edeac466a3b7 633 bool glibr::readGreenLight(uint16_t &val)
Willheisen 5:edeac466a3b7 634 {
Willheisen 5:edeac466a3b7 635 uint8_t val_byte;
Willheisen 5:edeac466a3b7 636 val = 0;
Willheisen 5:edeac466a3b7 637
Willheisen 5:edeac466a3b7 638 /* Read value from clear channel, low byte register */
Willheisen 5:edeac466a3b7 639 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GDATAL);
Willheisen 5:edeac466a3b7 640 if( val_byte==ERROR) {
Willheisen 5:edeac466a3b7 641 return false;
Willheisen 5:edeac466a3b7 642 }
Willheisen 5:edeac466a3b7 643
Willheisen 5:edeac466a3b7 644 val = val_byte;
Willheisen 5:edeac466a3b7 645
Willheisen 5:edeac466a3b7 646 /* Read value from clear channel, high byte register */
Willheisen 5:edeac466a3b7 647 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GDATAH);
Willheisen 5:edeac466a3b7 648 if( val_byte==ERROR) {
Willheisen 5:edeac466a3b7 649 return false;
Willheisen 5:edeac466a3b7 650 }
Willheisen 5:edeac466a3b7 651 val = val + ((uint16_t)val_byte << 8);
Willheisen 5:edeac466a3b7 652
Willheisen 5:edeac466a3b7 653 return true;
Willheisen 5:edeac466a3b7 654 }
Willheisen 5:edeac466a3b7 655
Willheisen 5:edeac466a3b7 656 /**
Willheisen 5:edeac466a3b7 657 * @brief Reads the red light level as a 16-bit value
Willheisen 5:edeac466a3b7 658 *
Willheisen 5:edeac466a3b7 659 * @param[out] val value of the light sensor.
Willheisen 5:edeac466a3b7 660 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 661 */
Willheisen 5:edeac466a3b7 662
Willheisen 5:edeac466a3b7 663 bool glibr::readBlueLight(uint16_t &val)
Willheisen 5:edeac466a3b7 664 {
Willheisen 5:edeac466a3b7 665 uint8_t val_byte;
Willheisen 5:edeac466a3b7 666 val = 0;
Willheisen 5:edeac466a3b7 667
Willheisen 5:edeac466a3b7 668 /* Read value from clear channel, low byte register */
Willheisen 5:edeac466a3b7 669 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_BDATAL);
Willheisen 5:edeac466a3b7 670 if( val_byte==ERROR) {
Willheisen 5:edeac466a3b7 671 return false;
Willheisen 5:edeac466a3b7 672 }
Willheisen 5:edeac466a3b7 673
Willheisen 5:edeac466a3b7 674 val = val_byte;
Willheisen 5:edeac466a3b7 675
Willheisen 5:edeac466a3b7 676 /* Read value from clear channel, high byte register */
Willheisen 5:edeac466a3b7 677 val_byte=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_BDATAH);
Willheisen 5:edeac466a3b7 678 if( val_byte==ERROR) {
Willheisen 5:edeac466a3b7 679 return false;
Willheisen 5:edeac466a3b7 680 }
Willheisen 5:edeac466a3b7 681 val = val + ((uint16_t)val_byte << 8);
Willheisen 5:edeac466a3b7 682
Willheisen 5:edeac466a3b7 683 return true;
Willheisen 5:edeac466a3b7 684 }
Willheisen 5:edeac466a3b7 685
Willheisen 5:edeac466a3b7 686 /*******************************************************************************
Willheisen 5:edeac466a3b7 687 * Proximity sensor controls
Willheisen 5:edeac466a3b7 688 ******************************************************************************/
Willheisen 5:edeac466a3b7 689
Willheisen 5:edeac466a3b7 690 /**
Willheisen 5:edeac466a3b7 691 * @brief Reads the proximity level as an 8-bit value
Willheisen 5:edeac466a3b7 692 *
Willheisen 5:edeac466a3b7 693 * @param[out] val value of the proximity sensor.
Willheisen 5:edeac466a3b7 694 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 695 */
Willheisen 5:edeac466a3b7 696 bool glibr::readProximity(uint8_t &val)
Willheisen 5:edeac466a3b7 697 {
Willheisen 5:edeac466a3b7 698 val = 0;
Willheisen 5:edeac466a3b7 699
Willheisen 5:edeac466a3b7 700 /* Read value from proximity data register */
Willheisen 5:edeac466a3b7 701 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_PDATA);
Willheisen 5:edeac466a3b7 702
Willheisen 5:edeac466a3b7 703 if(val==ERROR){
Willheisen 5:edeac466a3b7 704 return false;
Willheisen 5:edeac466a3b7 705 }
Willheisen 5:edeac466a3b7 706
Willheisen 5:edeac466a3b7 707 return true;
Willheisen 5:edeac466a3b7 708 }
Willheisen 5:edeac466a3b7 709
Willheisen 5:edeac466a3b7 710 /*******************************************************************************
Willheisen 5:edeac466a3b7 711 * High-level gesture controls
Willheisen 5:edeac466a3b7 712 ******************************************************************************/
Willheisen 5:edeac466a3b7 713
Willheisen 5:edeac466a3b7 714 /**
Willheisen 5:edeac466a3b7 715 * @brief Resets all the parameters in the gesture data member
Willheisen 5:edeac466a3b7 716 */
Willheisen 5:edeac466a3b7 717 void glibr::resetGestureParameters()
Willheisen 5:edeac466a3b7 718 {
Willheisen 5:edeac466a3b7 719 gesture_data_.sindex = 0;
Willheisen 5:edeac466a3b7 720 gesture_data_.total_gestures = 0;
Willheisen 5:edeac466a3b7 721
Willheisen 5:edeac466a3b7 722 gesture_ud_delta_ = 0;
Willheisen 5:edeac466a3b7 723 gesture_lr_delta_ = 0;
Willheisen 5:edeac466a3b7 724
Willheisen 5:edeac466a3b7 725 gesture_ud_count_ = 0;
Willheisen 5:edeac466a3b7 726 gesture_lr_count_ = 0;
Willheisen 5:edeac466a3b7 727
Willheisen 5:edeac466a3b7 728 gesture_near_count_ = 0;
Willheisen 5:edeac466a3b7 729 gesture_far_count_ = 0;
Willheisen 5:edeac466a3b7 730
Willheisen 5:edeac466a3b7 731 gesture_state_ = 0;
Willheisen 5:edeac466a3b7 732 gesture_motion_ = DIR_NONE;
Willheisen 5:edeac466a3b7 733 }
Willheisen 5:edeac466a3b7 734
Willheisen 5:edeac466a3b7 735 bool glibr::processGestureData()
Willheisen 5:edeac466a3b7 736 {
Willheisen 5:edeac466a3b7 737 uint8_t u_first = 0;
Willheisen 5:edeac466a3b7 738 uint8_t d_first = 0;
Willheisen 5:edeac466a3b7 739 uint8_t l_first = 0;
Willheisen 5:edeac466a3b7 740 uint8_t r_first = 0;
Willheisen 5:edeac466a3b7 741 uint8_t u_last = 0;
Willheisen 5:edeac466a3b7 742 uint8_t d_last = 0;
Willheisen 5:edeac466a3b7 743 uint8_t l_last = 0;
Willheisen 5:edeac466a3b7 744 uint8_t r_last = 0;
Willheisen 5:edeac466a3b7 745 int ud_ratio_first;
Willheisen 5:edeac466a3b7 746 int lr_ratio_first;
Willheisen 5:edeac466a3b7 747 int ud_ratio_last;
Willheisen 5:edeac466a3b7 748 int lr_ratio_last;
Willheisen 5:edeac466a3b7 749 int ud_delta;
Willheisen 5:edeac466a3b7 750 int lr_delta;
Willheisen 5:edeac466a3b7 751 int i;
Willheisen 5:edeac466a3b7 752
Willheisen 5:edeac466a3b7 753 /* If we have less than 4 total gestures, that's not enough */
Willheisen 5:edeac466a3b7 754 if( gesture_data_.total_gestures <= 4 ) {
Willheisen 5:edeac466a3b7 755 return false;
Willheisen 5:edeac466a3b7 756 }
Willheisen 5:edeac466a3b7 757
Willheisen 5:edeac466a3b7 758 /* Check to make sure our data isn't out of bounds */
Willheisen 5:edeac466a3b7 759 if( (gesture_data_.total_gestures <= 32) && \
Willheisen 5:edeac466a3b7 760 (gesture_data_.total_gestures > 0) ) {
Willheisen 5:edeac466a3b7 761
Willheisen 5:edeac466a3b7 762 /* Find the first value in U/D/L/R above the threshold */
Willheisen 5:edeac466a3b7 763 for( i = 0; i < gesture_data_.total_gestures; i++ ) {
Willheisen 5:edeac466a3b7 764 if( (gesture_data_.u_data[i] > GESTURE_THRESHOLD_OUT) &&
Willheisen 5:edeac466a3b7 765 (gesture_data_.d_data[i] > GESTURE_THRESHOLD_OUT) &&
Willheisen 5:edeac466a3b7 766 (gesture_data_.l_data[i] > GESTURE_THRESHOLD_OUT) &&
Willheisen 5:edeac466a3b7 767 (gesture_data_.r_data[i] > GESTURE_THRESHOLD_OUT) ) {
Willheisen 5:edeac466a3b7 768
Willheisen 5:edeac466a3b7 769 u_first = gesture_data_.u_data[i];
Willheisen 5:edeac466a3b7 770 d_first = gesture_data_.d_data[i];
Willheisen 5:edeac466a3b7 771 l_first = gesture_data_.l_data[i];
Willheisen 5:edeac466a3b7 772 r_first = gesture_data_.r_data[i];
Willheisen 5:edeac466a3b7 773 break;
Willheisen 5:edeac466a3b7 774 }
Willheisen 5:edeac466a3b7 775 }
Willheisen 5:edeac466a3b7 776
Willheisen 5:edeac466a3b7 777 /* If one of the _first values is 0, then there is no good data */
Willheisen 5:edeac466a3b7 778 if( (u_first == 0) || (d_first == 0) || \
Willheisen 5:edeac466a3b7 779 (l_first == 0) || (r_first == 0) ) {
Willheisen 5:edeac466a3b7 780
Willheisen 5:edeac466a3b7 781 return false;
Willheisen 5:edeac466a3b7 782 }
Willheisen 5:edeac466a3b7 783 /* Find the last value in U/D/L/R above the threshold */
Willheisen 5:edeac466a3b7 784 for( i = gesture_data_.total_gestures - 1; i >= 0; i-- ) {
Willheisen 5:edeac466a3b7 785 /* #if DEBUG
Willheisen 5:edeac466a3b7 786 Serial.print(F("Finding last: "));
Willheisen 5:edeac466a3b7 787 Serial.print(F("U:"));
Willheisen 5:edeac466a3b7 788 Serial.print(gesture_data_.u_data[i]);
Willheisen 5:edeac466a3b7 789 Serial.print(F(" D:"));
Willheisen 5:edeac466a3b7 790 Serial.print(gesture_data_.d_data[i]);
Willheisen 5:edeac466a3b7 791 Serial.print(F(" L:"));
Willheisen 5:edeac466a3b7 792 Serial.print(gesture_data_.l_data[i]);
Willheisen 5:edeac466a3b7 793 Serial.print(F(" R:"));
Willheisen 5:edeac466a3b7 794 Serial.println(gesture_data_.r_data[i]);
Willheisen 5:edeac466a3b7 795 #endif */
Willheisen 5:edeac466a3b7 796 if( (gesture_data_.u_data[i] > GESTURE_THRESHOLD_OUT) &&
Willheisen 5:edeac466a3b7 797 (gesture_data_.d_data[i] > GESTURE_THRESHOLD_OUT) &&
Willheisen 5:edeac466a3b7 798 (gesture_data_.l_data[i] > GESTURE_THRESHOLD_OUT) &&
Willheisen 5:edeac466a3b7 799 (gesture_data_.r_data[i] > GESTURE_THRESHOLD_OUT) ) {
Willheisen 5:edeac466a3b7 800
Willheisen 5:edeac466a3b7 801 u_last = gesture_data_.u_data[i];
Willheisen 5:edeac466a3b7 802 d_last = gesture_data_.d_data[i];
Willheisen 5:edeac466a3b7 803 l_last = gesture_data_.l_data[i];
Willheisen 5:edeac466a3b7 804 r_last = gesture_data_.r_data[i];
Willheisen 5:edeac466a3b7 805 break;
Willheisen 5:edeac466a3b7 806 }
Willheisen 5:edeac466a3b7 807 }
Willheisen 5:edeac466a3b7 808 }
Willheisen 5:edeac466a3b7 809
Willheisen 5:edeac466a3b7 810 /* Calculate the first vs. last ratio of up/down and left/right */
Willheisen 5:edeac466a3b7 811 ud_ratio_first = ((u_first - d_first) * 100) / (u_first + d_first);
Willheisen 5:edeac466a3b7 812 lr_ratio_first = ((l_first - r_first) * 100) / (l_first + r_first);
Willheisen 5:edeac466a3b7 813 ud_ratio_last = ((u_last - d_last) * 100) / (u_last + d_last);
Willheisen 5:edeac466a3b7 814 lr_ratio_last = ((l_last - r_last) * 100) / (l_last + r_last);
Willheisen 5:edeac466a3b7 815
Willheisen 5:edeac466a3b7 816 /* #if DEBUG
Willheisen 5:edeac466a3b7 817 Serial.print(F("Last Values: "));
Willheisen 5:edeac466a3b7 818 Serial.print(F("U:"));
Willheisen 5:edeac466a3b7 819 Serial.print(u_last);
Willheisen 5:edeac466a3b7 820 Serial.print(F(" D:"));
Willheisen 5:edeac466a3b7 821 Serial.print(d_last);
Willheisen 5:edeac466a3b7 822 Serial.print(F(" L:"));
Willheisen 5:edeac466a3b7 823 Serial.print(l_last);
Willheisen 5:edeac466a3b7 824 Serial.print(F(" R:"));
Willheisen 5:edeac466a3b7 825 Serial.println(r_last);
Willheisen 5:edeac466a3b7 826
Willheisen 5:edeac466a3b7 827 Serial.print(F("Ratios: "));
Willheisen 5:edeac466a3b7 828 Serial.print(F("UD Fi: "));
Willheisen 5:edeac466a3b7 829 Serial.print(ud_ratio_first);
Willheisen 5:edeac466a3b7 830 Serial.print(F(" UD La: "));
Willheisen 5:edeac466a3b7 831 Serial.print(ud_ratio_last);
Willheisen 5:edeac466a3b7 832 Serial.print(F(" LR Fi: "));
Willheisen 5:edeac466a3b7 833 Serial.print(lr_ratio_first);
Willheisen 5:edeac466a3b7 834 Serial.print(F(" LR La: "));
Willheisen 5:edeac466a3b7 835 Serial.println(lr_ratio_last);
Willheisen 5:edeac466a3b7 836 #endif */
Willheisen 5:edeac466a3b7 837
Willheisen 5:edeac466a3b7 838 /* Determine the difference between the first and last ratios */
Willheisen 5:edeac466a3b7 839 ud_delta = ud_ratio_last - ud_ratio_first;
Willheisen 5:edeac466a3b7 840 lr_delta = lr_ratio_last - lr_ratio_first;
Willheisen 5:edeac466a3b7 841
Willheisen 5:edeac466a3b7 842 /* #if DEBUG
Willheisen 5:edeac466a3b7 843 Serial.print("Deltas: ");
Willheisen 5:edeac466a3b7 844 Serial.print("UD: ");
Willheisen 5:edeac466a3b7 845 Serial.print(ud_delta);
Willheisen 5:edeac466a3b7 846 Serial.print(" LR: ");
Willheisen 5:edeac466a3b7 847 Serial.println(lr_delta);
Willheisen 5:edeac466a3b7 848 #endif */
Willheisen 5:edeac466a3b7 849
Willheisen 5:edeac466a3b7 850 /* Accumulate the UD and LR delta values */
Willheisen 5:edeac466a3b7 851 gesture_ud_delta_ += ud_delta;
Willheisen 5:edeac466a3b7 852 gesture_lr_delta_ += lr_delta;
Willheisen 5:edeac466a3b7 853
Willheisen 5:edeac466a3b7 854 /* #if DEBUG
Willheisen 5:edeac466a3b7 855 Serial.print("Accumulations: ");
Willheisen 5:edeac466a3b7 856 Serial.print("UD: ");
Willheisen 5:edeac466a3b7 857 Serial.print(gesture_ud_delta_);
Willheisen 5:edeac466a3b7 858 Serial.print(" LR: ");
Willheisen 5:edeac466a3b7 859 Serial.println(gesture_lr_delta_);
Willheisen 5:edeac466a3b7 860 #endif */
Willheisen 5:edeac466a3b7 861
Willheisen 5:edeac466a3b7 862 /* Determine U/D gesture */
Willheisen 5:edeac466a3b7 863 if( gesture_ud_delta_ >= GESTURE_SENSITIVITY_1 ) {
Willheisen 5:edeac466a3b7 864 gesture_ud_count_ = 1;
Willheisen 5:edeac466a3b7 865 } else if( gesture_ud_delta_ <= -GESTURE_SENSITIVITY_1 ) {
Willheisen 5:edeac466a3b7 866 gesture_ud_count_ = -1;
Willheisen 5:edeac466a3b7 867 } else {
Willheisen 5:edeac466a3b7 868 gesture_ud_count_ = 0;
Willheisen 5:edeac466a3b7 869 }
Willheisen 5:edeac466a3b7 870
Willheisen 5:edeac466a3b7 871 /* Determine L/R gesture */
Willheisen 5:edeac466a3b7 872 if( gesture_lr_delta_ >= GESTURE_SENSITIVITY_1 ) {
Willheisen 5:edeac466a3b7 873 gesture_lr_count_ = 1;
Willheisen 5:edeac466a3b7 874 } else if( gesture_lr_delta_ <= -GESTURE_SENSITIVITY_1 ) {
Willheisen 5:edeac466a3b7 875 gesture_lr_count_ = -1;
Willheisen 5:edeac466a3b7 876 } else {
Willheisen 5:edeac466a3b7 877 gesture_lr_count_ = 0;
Willheisen 5:edeac466a3b7 878 }
Willheisen 5:edeac466a3b7 879
Willheisen 5:edeac466a3b7 880 /* Determine Near/Far gesture */
Willheisen 5:edeac466a3b7 881 if( (gesture_ud_count_ == 0) && (gesture_lr_count_ == 0) ) {
Willheisen 5:edeac466a3b7 882 if( (abs(ud_delta) < GESTURE_SENSITIVITY_2) && \
Willheisen 5:edeac466a3b7 883 (abs(lr_delta) < GESTURE_SENSITIVITY_2) ) {
Willheisen 5:edeac466a3b7 884
Willheisen 5:edeac466a3b7 885 if( (ud_delta == 0) && (lr_delta == 0) ) {
Willheisen 5:edeac466a3b7 886 gesture_near_count_++;
Willheisen 5:edeac466a3b7 887 } else if( (ud_delta != 0) || (lr_delta != 0) ) {
Willheisen 5:edeac466a3b7 888 gesture_far_count_++;
Willheisen 5:edeac466a3b7 889 }
Willheisen 5:edeac466a3b7 890
Willheisen 5:edeac466a3b7 891 if( (gesture_near_count_ >= 10) && (gesture_far_count_ >= 2) ) {
Willheisen 5:edeac466a3b7 892 if( (ud_delta == 0) && (lr_delta == 0) ) {
Willheisen 5:edeac466a3b7 893 gesture_state_ = NEAR_STATE;
Willheisen 5:edeac466a3b7 894 } else if( (ud_delta != 0) && (lr_delta != 0) ) {
Willheisen 5:edeac466a3b7 895 gesture_state_ = FAR_STATE;
Willheisen 5:edeac466a3b7 896 }
Willheisen 5:edeac466a3b7 897 return true;
Willheisen 5:edeac466a3b7 898 }
Willheisen 5:edeac466a3b7 899 }
Willheisen 5:edeac466a3b7 900 } else {
Willheisen 5:edeac466a3b7 901 if( (abs(ud_delta) < GESTURE_SENSITIVITY_2) && \
Willheisen 5:edeac466a3b7 902 (abs(lr_delta) < GESTURE_SENSITIVITY_2) ) {
Willheisen 5:edeac466a3b7 903
Willheisen 5:edeac466a3b7 904 if( (ud_delta == 0) && (lr_delta == 0) ) {
Willheisen 5:edeac466a3b7 905 gesture_near_count_++;
Willheisen 5:edeac466a3b7 906 }
Willheisen 5:edeac466a3b7 907
Willheisen 5:edeac466a3b7 908 if( gesture_near_count_ >= 5 ) {
Willheisen 5:edeac466a3b7 909 gesture_ud_count_ = 0;
Willheisen 5:edeac466a3b7 910 gesture_lr_count_ = 0;
Willheisen 5:edeac466a3b7 911 gesture_ud_delta_ = 0;
Willheisen 5:edeac466a3b7 912 gesture_lr_delta_ = 0;
Willheisen 5:edeac466a3b7 913 }
Willheisen 5:edeac466a3b7 914 }
Willheisen 5:edeac466a3b7 915 }
Willheisen 5:edeac466a3b7 916
Willheisen 5:edeac466a3b7 917 // #if DEBUG
Willheisen 5:edeac466a3b7 918 /* printf("UD_CT: %d\n",gesture_ud_count_);
Willheisen 5:edeac466a3b7 919 printf("LR_CT: %d\n",gesture_lr_count_);
Willheisen 5:edeac466a3b7 920 printf("NEAR_CT: %d\n",gesture_near_count_);
Willheisen 5:edeac466a3b7 921 printf(" FAR_CT: %d\n",gesture_far_count_);
Willheisen 5:edeac466a3b7 922 printf("----------"); */
Willheisen 5:edeac466a3b7 923 //#endif */
Willheisen 5:edeac466a3b7 924
Willheisen 5:edeac466a3b7 925 return false;
Willheisen 5:edeac466a3b7 926 }
Willheisen 5:edeac466a3b7 927
Willheisen 5:edeac466a3b7 928 /**
Willheisen 5:edeac466a3b7 929 * @brief Determines swipe direction or near/far state
Willheisen 5:edeac466a3b7 930 *
Willheisen 5:edeac466a3b7 931 * @return True if near/far event. False otherwise.
Willheisen 5:edeac466a3b7 932 */
Willheisen 5:edeac466a3b7 933 bool glibr::decodeGesture()
Willheisen 5:edeac466a3b7 934 {
Willheisen 5:edeac466a3b7 935 /* Return if near or far event is detected */
Willheisen 5:edeac466a3b7 936 if( gesture_state_ == NEAR_STATE ) {
Willheisen 5:edeac466a3b7 937 gesture_motion_ = DIR_NEAR;
Willheisen 5:edeac466a3b7 938 return true;
Willheisen 5:edeac466a3b7 939 } else if ( gesture_state_ == FAR_STATE ) {
Willheisen 5:edeac466a3b7 940 gesture_motion_ = DIR_FAR;
Willheisen 5:edeac466a3b7 941 return true;
Willheisen 5:edeac466a3b7 942 }
Willheisen 5:edeac466a3b7 943
Willheisen 5:edeac466a3b7 944 /* Determine swipe direction */
Willheisen 5:edeac466a3b7 945 if( (gesture_ud_count_ == -1) && (gesture_lr_count_ == 0) ) {
Willheisen 5:edeac466a3b7 946 gesture_motion_ = DIR_UP;
Willheisen 5:edeac466a3b7 947 } else if( (gesture_ud_count_ == 1) && (gesture_lr_count_ == 0) ) {
Willheisen 5:edeac466a3b7 948 gesture_motion_ = DIR_DOWN;
Willheisen 5:edeac466a3b7 949 } else if( (gesture_ud_count_ == 0) && (gesture_lr_count_ == 1) ) {
Willheisen 5:edeac466a3b7 950 gesture_motion_ = DIR_RIGHT;
Willheisen 5:edeac466a3b7 951 } else if( (gesture_ud_count_ == 0) && (gesture_lr_count_ == -1) ) {
Willheisen 5:edeac466a3b7 952 gesture_motion_ = DIR_LEFT;
Willheisen 5:edeac466a3b7 953 } else if( (gesture_ud_count_ == -1) && (gesture_lr_count_ == 1) ) {
Willheisen 5:edeac466a3b7 954 if( abs(gesture_ud_delta_) > abs(gesture_lr_delta_) ) {
Willheisen 5:edeac466a3b7 955 gesture_motion_ = DIR_UP;
Willheisen 5:edeac466a3b7 956 } else {
Willheisen 5:edeac466a3b7 957 gesture_motion_ = DIR_RIGHT;
Willheisen 5:edeac466a3b7 958 }
Willheisen 5:edeac466a3b7 959 } else if( (gesture_ud_count_ == 1) && (gesture_lr_count_ == -1) ) {
Willheisen 5:edeac466a3b7 960 if( abs(gesture_ud_delta_) > abs(gesture_lr_delta_) ) {
Willheisen 5:edeac466a3b7 961 gesture_motion_ = DIR_DOWN;
Willheisen 5:edeac466a3b7 962 } else {
Willheisen 5:edeac466a3b7 963 gesture_motion_ = DIR_LEFT;
Willheisen 5:edeac466a3b7 964 }
Willheisen 5:edeac466a3b7 965 } else if( (gesture_ud_count_ == -1) && (gesture_lr_count_ == -1) ) {
Willheisen 5:edeac466a3b7 966 if( abs(gesture_ud_delta_) > abs(gesture_lr_delta_) ) {
Willheisen 5:edeac466a3b7 967 gesture_motion_ = DIR_UP;
Willheisen 5:edeac466a3b7 968 } else {
Willheisen 5:edeac466a3b7 969 gesture_motion_ = DIR_LEFT;
Willheisen 5:edeac466a3b7 970 }
Willheisen 5:edeac466a3b7 971 } else if( (gesture_ud_count_ == 1) && (gesture_lr_count_ == 1) ) {
Willheisen 5:edeac466a3b7 972 if( abs(gesture_ud_delta_) > abs(gesture_lr_delta_) ) {
Willheisen 5:edeac466a3b7 973 gesture_motion_ = DIR_DOWN;
Willheisen 5:edeac466a3b7 974 } else {
Willheisen 5:edeac466a3b7 975 gesture_motion_ = DIR_RIGHT;
Willheisen 5:edeac466a3b7 976 }
Willheisen 5:edeac466a3b7 977 } else {
Willheisen 5:edeac466a3b7 978 return false;
Willheisen 5:edeac466a3b7 979 }
Willheisen 5:edeac466a3b7 980
Willheisen 5:edeac466a3b7 981 return true;
Willheisen 5:edeac466a3b7 982 }
Willheisen 5:edeac466a3b7 983
Willheisen 5:edeac466a3b7 984 /*******************************************************************************
Willheisen 5:edeac466a3b7 985 * Getters and setters for register values
Willheisen 5:edeac466a3b7 986 ******************************************************************************/
Willheisen 5:edeac466a3b7 987
Willheisen 5:edeac466a3b7 988 /**
Willheisen 5:edeac466a3b7 989 * @brief Returns the lower threshold for proximity detection
Willheisen 5:edeac466a3b7 990 *
Willheisen 5:edeac466a3b7 991 * @return lower threshold
Willheisen 5:edeac466a3b7 992 */
Willheisen 5:edeac466a3b7 993
Willheisen 5:edeac466a3b7 994 uint8_t glibr::getProxIntLowThresh()
Willheisen 5:edeac466a3b7 995 {
Willheisen 5:edeac466a3b7 996 uint8_t val;
Willheisen 5:edeac466a3b7 997
Willheisen 5:edeac466a3b7 998 /* Read value from PILT register */
Willheisen 5:edeac466a3b7 999 /* if( !wireReadDataByte(APDS9960_PILT, val) ) {
Willheisen 5:edeac466a3b7 1000 val = 0;
Willheisen 5:edeac466a3b7 1001 }*/
Willheisen 5:edeac466a3b7 1002 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_PILT);
Willheisen 5:edeac466a3b7 1003 if(val==ERROR){
Willheisen 5:edeac466a3b7 1004 val=0;
Willheisen 5:edeac466a3b7 1005 }
Willheisen 5:edeac466a3b7 1006
Willheisen 5:edeac466a3b7 1007 return val;
Willheisen 5:edeac466a3b7 1008 }
Willheisen 5:edeac466a3b7 1009
Willheisen 5:edeac466a3b7 1010 /**
Willheisen 5:edeac466a3b7 1011 * @brief Sets the lower threshold for proximity detection
Willheisen 5:edeac466a3b7 1012 *
Willheisen 5:edeac466a3b7 1013 * @param[in] threshold the lower proximity threshold
Willheisen 5:edeac466a3b7 1014 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1015 */
Willheisen 5:edeac466a3b7 1016 bool glibr::setProxIntLowThresh(uint8_t threshold)
Willheisen 5:edeac466a3b7 1017 {
Willheisen 5:edeac466a3b7 1018 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PILT, threshold) ) {
Willheisen 5:edeac466a3b7 1019 return false;
Willheisen 5:edeac466a3b7 1020 }
Willheisen 5:edeac466a3b7 1021
Willheisen 5:edeac466a3b7 1022 return true;
Willheisen 5:edeac466a3b7 1023 }
Willheisen 5:edeac466a3b7 1024
Willheisen 5:edeac466a3b7 1025 /**
Willheisen 5:edeac466a3b7 1026 * @brief Returns the high threshold for proximity detection
Willheisen 5:edeac466a3b7 1027 *
Willheisen 5:edeac466a3b7 1028 * @return high threshold
Willheisen 5:edeac466a3b7 1029 */
Willheisen 5:edeac466a3b7 1030 uint8_t glibr::getProxIntHighThresh()
Willheisen 5:edeac466a3b7 1031 {
Willheisen 5:edeac466a3b7 1032 uint8_t val;
Willheisen 5:edeac466a3b7 1033
Willheisen 5:edeac466a3b7 1034 /* Read value from PIHT register */
Willheisen 5:edeac466a3b7 1035 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_PILT);
Willheisen 5:edeac466a3b7 1036 if( val==ERROR ) {
Willheisen 5:edeac466a3b7 1037 val = 0;
Willheisen 5:edeac466a3b7 1038 }
Willheisen 5:edeac466a3b7 1039
Willheisen 5:edeac466a3b7 1040 return val;
Willheisen 5:edeac466a3b7 1041 }
Willheisen 5:edeac466a3b7 1042
Willheisen 5:edeac466a3b7 1043 /**
Willheisen 5:edeac466a3b7 1044 * @brief Sets the high threshold for proximity detection
Willheisen 5:edeac466a3b7 1045 *
Willheisen 5:edeac466a3b7 1046 * @param[in] threshold the high proximity threshold
Willheisen 5:edeac466a3b7 1047 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1048 */
Willheisen 5:edeac466a3b7 1049 bool glibr::setProxIntHighThresh(uint8_t threshold)
Willheisen 5:edeac466a3b7 1050 {
Willheisen 5:edeac466a3b7 1051
Willheisen 5:edeac466a3b7 1052 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PIHT, threshold) ) {
Willheisen 5:edeac466a3b7 1053 return false;
Willheisen 5:edeac466a3b7 1054 }
Willheisen 5:edeac466a3b7 1055
Willheisen 5:edeac466a3b7 1056 return true;
Willheisen 5:edeac466a3b7 1057 }
Willheisen 5:edeac466a3b7 1058
Willheisen 5:edeac466a3b7 1059 /**
Willheisen 5:edeac466a3b7 1060 * @brief Returns LED drive strength for proximity and ALS
Willheisen 5:edeac466a3b7 1061 *
Willheisen 5:edeac466a3b7 1062 * Value LED Current
Willheisen 5:edeac466a3b7 1063 * 0 100 mA
Willheisen 5:edeac466a3b7 1064 * 1 50 mA
Willheisen 5:edeac466a3b7 1065 * 2 25 mA
Willheisen 5:edeac466a3b7 1066 * 3 12.5 mA
Willheisen 5:edeac466a3b7 1067 *
Willheisen 5:edeac466a3b7 1068 * @return the value of the LED drive strength. 0xFF on failure.
Willheisen 5:edeac466a3b7 1069 */
Willheisen 5:edeac466a3b7 1070 uint8_t glibr::getLEDDrive()
Willheisen 5:edeac466a3b7 1071 {
Willheisen 5:edeac466a3b7 1072 uint8_t val;
Willheisen 5:edeac466a3b7 1073
Willheisen 5:edeac466a3b7 1074 /* Read value from CONTROL register */
Willheisen 5:edeac466a3b7 1075 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CONTROL);
Willheisen 5:edeac466a3b7 1076 if( val == ERROR ){//!wireReadDataByte(APDS9960_CONTROL, val) ) {
Willheisen 5:edeac466a3b7 1077 return ERROR;
Willheisen 5:edeac466a3b7 1078 }
Willheisen 5:edeac466a3b7 1079
Willheisen 5:edeac466a3b7 1080 /* Shift and mask out LED drive bits */
Willheisen 5:edeac466a3b7 1081 val = (val >> 6) & 0x03;//0b00000011;
Willheisen 5:edeac466a3b7 1082
Willheisen 5:edeac466a3b7 1083 return val;
Willheisen 5:edeac466a3b7 1084 }
Willheisen 5:edeac466a3b7 1085
Willheisen 5:edeac466a3b7 1086 /**
Willheisen 5:edeac466a3b7 1087 * @brief Sets the LED drive strength for proximity and ALS
Willheisen 5:edeac466a3b7 1088 *
Willheisen 5:edeac466a3b7 1089 * Value LED Current
Willheisen 5:edeac466a3b7 1090 * 0 100 mA
Willheisen 5:edeac466a3b7 1091 * 1 50 mA
Willheisen 5:edeac466a3b7 1092 * 2 25 mA
Willheisen 5:edeac466a3b7 1093 * 3 12.5 mA
Willheisen 5:edeac466a3b7 1094 *
Willheisen 5:edeac466a3b7 1095 * @param[in] drive the value (0-3) for the LED drive strength
Willheisen 5:edeac466a3b7 1096 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1097 */
Willheisen 5:edeac466a3b7 1098
Willheisen 5:edeac466a3b7 1099 bool glibr::setLEDDrive(uint8_t drive)
Willheisen 5:edeac466a3b7 1100 {
Willheisen 5:edeac466a3b7 1101 uint8_t val;
Willheisen 5:edeac466a3b7 1102
Willheisen 5:edeac466a3b7 1103 /* Read value from CONTROL register */
Willheisen 5:edeac466a3b7 1104 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CONTROL);
Willheisen 5:edeac466a3b7 1105 if(val==ERROR){
Willheisen 5:edeac466a3b7 1106 return false;
Willheisen 5:edeac466a3b7 1107 }
Willheisen 5:edeac466a3b7 1108 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1109 //drive &= 0b00000011
Willheisen 5:edeac466a3b7 1110 drive &= 0x03;
Willheisen 5:edeac466a3b7 1111 drive = drive << 6;
Willheisen 5:edeac466a3b7 1112 //val &= 0b00111111;
Willheisen 5:edeac466a3b7 1113 val &= 0x3F;
Willheisen 5:edeac466a3b7 1114 val |= drive;
Willheisen 5:edeac466a3b7 1115
Willheisen 5:edeac466a3b7 1116 /* Write register value back into CONTROL register */
Willheisen 5:edeac466a3b7 1117 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONTROL, val) ) {
Willheisen 5:edeac466a3b7 1118 return false;
Willheisen 5:edeac466a3b7 1119 }
Willheisen 5:edeac466a3b7 1120
Willheisen 5:edeac466a3b7 1121 return true;
Willheisen 5:edeac466a3b7 1122 }
Willheisen 5:edeac466a3b7 1123
Willheisen 5:edeac466a3b7 1124 /**
Willheisen 5:edeac466a3b7 1125 * @brief Returns receiver gain for proximity detection
Willheisen 5:edeac466a3b7 1126 *
Willheisen 5:edeac466a3b7 1127 * Value Gain
Willheisen 5:edeac466a3b7 1128 * 0 1x
Willheisen 5:edeac466a3b7 1129 * 1 2x
Willheisen 5:edeac466a3b7 1130 * 2 4x
Willheisen 5:edeac466a3b7 1131 * 3 8x
Willheisen 5:edeac466a3b7 1132 *
Willheisen 5:edeac466a3b7 1133 * @return the value of the proximity gain. 0xFF on failure.
Willheisen 5:edeac466a3b7 1134 */
Willheisen 5:edeac466a3b7 1135 uint8_t glibr::getProximityGain()
Willheisen 5:edeac466a3b7 1136 {
Willheisen 5:edeac466a3b7 1137 uint8_t val;
Willheisen 5:edeac466a3b7 1138
Willheisen 5:edeac466a3b7 1139 /* Read value from CONTROL register */
Willheisen 5:edeac466a3b7 1140 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CONTROL);
Willheisen 5:edeac466a3b7 1141 if( val == ERROR){//!wireReadDataByte(APDS9960_CONTROL, val) ) {
Willheisen 5:edeac466a3b7 1142 return ERROR;
Willheisen 5:edeac466a3b7 1143 }
Willheisen 5:edeac466a3b7 1144
Willheisen 5:edeac466a3b7 1145 /* Shift and mask out PDRIVE bits */
Willheisen 5:edeac466a3b7 1146 val = (val >> 2) & 0x03;//0b00000011;
Willheisen 5:edeac466a3b7 1147
Willheisen 5:edeac466a3b7 1148 return val;
Willheisen 5:edeac466a3b7 1149 }
Willheisen 5:edeac466a3b7 1150
Willheisen 5:edeac466a3b7 1151 /**
Willheisen 5:edeac466a3b7 1152 * @brief Sets the receiver gain for proximity detection
Willheisen 5:edeac466a3b7 1153 *
Willheisen 5:edeac466a3b7 1154 * Value Gain
Willheisen 5:edeac466a3b7 1155 * 0 1x
Willheisen 5:edeac466a3b7 1156 * 1 2x
Willheisen 5:edeac466a3b7 1157 * 2 4x
Willheisen 5:edeac466a3b7 1158 * 3 8x
Willheisen 5:edeac466a3b7 1159 *
Willheisen 5:edeac466a3b7 1160 * @param[in] drive the value (0-3) for the gain
Willheisen 5:edeac466a3b7 1161 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1162 */
Willheisen 5:edeac466a3b7 1163 bool glibr::setProximityGain(uint8_t drive)
Willheisen 5:edeac466a3b7 1164 {
Willheisen 5:edeac466a3b7 1165 uint8_t val;
Willheisen 5:edeac466a3b7 1166
Willheisen 5:edeac466a3b7 1167 /* Read value from CONTROL register */
Willheisen 5:edeac466a3b7 1168
Willheisen 5:edeac466a3b7 1169 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CONTROL);
Willheisen 5:edeac466a3b7 1170
Willheisen 5:edeac466a3b7 1171 if(val==ERROR){
Willheisen 5:edeac466a3b7 1172 return false;
Willheisen 5:edeac466a3b7 1173 }
Willheisen 5:edeac466a3b7 1174 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1175 //drive &= 0b00000011;
Willheisen 5:edeac466a3b7 1176 drive &=0x03;
Willheisen 5:edeac466a3b7 1177 drive = drive << 2;
Willheisen 5:edeac466a3b7 1178 //val &= 0b11110011
Willheisen 5:edeac466a3b7 1179 val &= 0xF3;
Willheisen 5:edeac466a3b7 1180 val |= drive;
Willheisen 5:edeac466a3b7 1181
Willheisen 5:edeac466a3b7 1182 /* Write register value back into CONTROL register */
Willheisen 5:edeac466a3b7 1183 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONTROL, val) ) {
Willheisen 5:edeac466a3b7 1184 return false;
Willheisen 5:edeac466a3b7 1185 }
Willheisen 5:edeac466a3b7 1186 return true;
Willheisen 5:edeac466a3b7 1187 }
Willheisen 5:edeac466a3b7 1188
Willheisen 5:edeac466a3b7 1189 /**
Willheisen 5:edeac466a3b7 1190 * @brief Returns receiver gain for the ambient light sensor (ALS)
Willheisen 5:edeac466a3b7 1191 *
Willheisen 5:edeac466a3b7 1192 * Value Gain
Willheisen 5:edeac466a3b7 1193 * 0 1x
Willheisen 5:edeac466a3b7 1194 * 1 4x
Willheisen 5:edeac466a3b7 1195 * 2 16x
Willheisen 5:edeac466a3b7 1196 * 3 64x
Willheisen 5:edeac466a3b7 1197 *
Willheisen 5:edeac466a3b7 1198 * @return the value of the ALS gain. 0xFF on failure.
Willheisen 5:edeac466a3b7 1199 */
Willheisen 5:edeac466a3b7 1200 uint8_t glibr::getAmbientLightGain()
Willheisen 5:edeac466a3b7 1201 {
Willheisen 5:edeac466a3b7 1202 uint8_t val;
Willheisen 5:edeac466a3b7 1203
Willheisen 5:edeac466a3b7 1204 /* Read value from CONTROL register */
Willheisen 5:edeac466a3b7 1205 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CONTROL);
Willheisen 5:edeac466a3b7 1206 if( val == ERROR){//!wireReadDataByte(APDS9960_CONTROL, val) ) {
Willheisen 5:edeac466a3b7 1207 return ERROR;
Willheisen 5:edeac466a3b7 1208 }
Willheisen 5:edeac466a3b7 1209
Willheisen 5:edeac466a3b7 1210 /* Shift and mask out ADRIVE bits */
Willheisen 5:edeac466a3b7 1211 val &= 0x03;//0b00000011;
Willheisen 5:edeac466a3b7 1212
Willheisen 5:edeac466a3b7 1213 return val;
Willheisen 5:edeac466a3b7 1214 }
Willheisen 5:edeac466a3b7 1215
Willheisen 5:edeac466a3b7 1216 /**
Willheisen 5:edeac466a3b7 1217 * @brief Sets the receiver gain for the ambient light sensor (ALS)
Willheisen 5:edeac466a3b7 1218 *
Willheisen 5:edeac466a3b7 1219 * Value Gain
Willheisen 5:edeac466a3b7 1220 * 0 1x
Willheisen 5:edeac466a3b7 1221 * 1 4x
Willheisen 5:edeac466a3b7 1222 * 2 16x
Willheisen 5:edeac466a3b7 1223 * 3 64x
Willheisen 5:edeac466a3b7 1224 *
Willheisen 5:edeac466a3b7 1225 * @param[in] drive the value (0-3) for the gain
Willheisen 5:edeac466a3b7 1226 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1227 */
Willheisen 5:edeac466a3b7 1228 bool glibr::setAmbientLightGain(uint8_t drive){
Willheisen 5:edeac466a3b7 1229
Willheisen 5:edeac466a3b7 1230 uint8_t val;
Willheisen 5:edeac466a3b7 1231
Willheisen 5:edeac466a3b7 1232 /* Read value from CONTROL register */
Willheisen 5:edeac466a3b7 1233
Willheisen 5:edeac466a3b7 1234 val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_CONTROL);
Willheisen 5:edeac466a3b7 1235
Willheisen 5:edeac466a3b7 1236 if(val==ERROR){
Willheisen 5:edeac466a3b7 1237 return false;
Willheisen 5:edeac466a3b7 1238 }
Willheisen 5:edeac466a3b7 1239 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1240 //drive &= 0b00000011;
Willheisen 5:edeac466a3b7 1241 drive &=0x03;
Willheisen 5:edeac466a3b7 1242 drive = drive << 2;
Willheisen 5:edeac466a3b7 1243 //val &=0b11111100
Willheisen 5:edeac466a3b7 1244 val &= 0xF3;
Willheisen 5:edeac466a3b7 1245 val |= drive;
Willheisen 5:edeac466a3b7 1246
Willheisen 5:edeac466a3b7 1247 /* Write register value back into CONTROL register */
Willheisen 5:edeac466a3b7 1248 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONTROL, val) ) {
Willheisen 5:edeac466a3b7 1249 return false;
Willheisen 5:edeac466a3b7 1250 }
Willheisen 5:edeac466a3b7 1251 return true;
Willheisen 5:edeac466a3b7 1252 }
Willheisen 5:edeac466a3b7 1253
Willheisen 5:edeac466a3b7 1254 /**
Willheisen 5:edeac466a3b7 1255 * @brief Get the current LED boost value
Willheisen 5:edeac466a3b7 1256 *
Willheisen 5:edeac466a3b7 1257 * Value Boost Current
Willheisen 5:edeac466a3b7 1258 * 0 100%
Willheisen 5:edeac466a3b7 1259 * 1 150%
Willheisen 5:edeac466a3b7 1260 * 2 200%
Willheisen 5:edeac466a3b7 1261 * 3 300%
Willheisen 5:edeac466a3b7 1262 *
Willheisen 5:edeac466a3b7 1263 * @return The LED boost value. 0xFF on failure.
Willheisen 5:edeac466a3b7 1264 */
Willheisen 5:edeac466a3b7 1265 uint8_t glibr::getLEDBoost() {
Willheisen 5:edeac466a3b7 1266 uint8_t val;
Willheisen 5:edeac466a3b7 1267
Willheisen 5:edeac466a3b7 1268 /* Read value from CONFIG2 register */
Willheisen 5:edeac466a3b7 1269 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_CONFIG2);
Willheisen 5:edeac466a3b7 1270 if( val == ERROR){//!wireReadDataByte(APDS9960_CONFIG2, val) ) {
Willheisen 5:edeac466a3b7 1271 return ERROR;
Willheisen 5:edeac466a3b7 1272 }
Willheisen 5:edeac466a3b7 1273
Willheisen 5:edeac466a3b7 1274 /* Shift and mask out LED_BOOST bits */
Willheisen 5:edeac466a3b7 1275 val = (val >> 4) & 0x03;//0b00000011;
Willheisen 5:edeac466a3b7 1276
Willheisen 5:edeac466a3b7 1277 return val;
Willheisen 5:edeac466a3b7 1278 }
Willheisen 5:edeac466a3b7 1279
Willheisen 5:edeac466a3b7 1280 /**
Willheisen 5:edeac466a3b7 1281 * @brief Sets the LED current boost value
Willheisen 5:edeac466a3b7 1282 *
Willheisen 5:edeac466a3b7 1283 * Value Boost Current
Willheisen 5:edeac466a3b7 1284 * 0 100%
Willheisen 5:edeac466a3b7 1285 * 1 150%
Willheisen 5:edeac466a3b7 1286 * 2 200%
Willheisen 5:edeac466a3b7 1287 * 3 300%
Willheisen 5:edeac466a3b7 1288 *
Willheisen 5:edeac466a3b7 1289 * @param[in] drive the value (0-3) for current boost (100-300%)
Willheisen 5:edeac466a3b7 1290 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1291 */
Willheisen 5:edeac466a3b7 1292 bool glibr::setLEDBoost(uint8_t boost)
Willheisen 5:edeac466a3b7 1293 {
Willheisen 5:edeac466a3b7 1294 uint8_t val;
Willheisen 5:edeac466a3b7 1295
Willheisen 5:edeac466a3b7 1296 /* Read value from CONFIG2 register */
Willheisen 5:edeac466a3b7 1297 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_CONFIG2);
Willheisen 5:edeac466a3b7 1298 if( val == ERROR){//!wireReadDataByte(APDS9960_CONFIG2, val) ) {
Willheisen 5:edeac466a3b7 1299 return false;
Willheisen 5:edeac466a3b7 1300 }
Willheisen 5:edeac466a3b7 1301
Willheisen 5:edeac466a3b7 1302 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1303 boost &= 0x03;//0b00000011;
Willheisen 5:edeac466a3b7 1304 boost = boost << 4;
Willheisen 5:edeac466a3b7 1305 val &= 0xCF;//0b11001111;
Willheisen 5:edeac466a3b7 1306 val |= boost;
Willheisen 5:edeac466a3b7 1307
Willheisen 5:edeac466a3b7 1308 /* Write register value back into CONFIG2 register */
Willheisen 5:edeac466a3b7 1309
Willheisen 5:edeac466a3b7 1310 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONFIG2, val)){//!wireWriteDataByte(APDS9960_CONFIG2, val) ) {
Willheisen 5:edeac466a3b7 1311 return false;
Willheisen 5:edeac466a3b7 1312 }
Willheisen 5:edeac466a3b7 1313
Willheisen 5:edeac466a3b7 1314 return true;
Willheisen 5:edeac466a3b7 1315 }
Willheisen 5:edeac466a3b7 1316
Willheisen 5:edeac466a3b7 1317 /**
Willheisen 5:edeac466a3b7 1318 * @brief Gets proximity gain compensation enable
Willheisen 5:edeac466a3b7 1319 *
Willheisen 5:edeac466a3b7 1320 * @return 1 if compensation is enabled. 0 if not. 0xFF on error.
Willheisen 5:edeac466a3b7 1321 */
Willheisen 5:edeac466a3b7 1322 uint8_t glibr::getProxGainCompEnable()
Willheisen 5:edeac466a3b7 1323 {
Willheisen 5:edeac466a3b7 1324 uint8_t val;
Willheisen 5:edeac466a3b7 1325
Willheisen 5:edeac466a3b7 1326 /* Read value from CONFIG3 register */
Willheisen 5:edeac466a3b7 1327 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_CONFIG3);
Willheisen 5:edeac466a3b7 1328 if( val == ERROR){//!wireReadDataByte(APDS9960_CONFIG3, val) ) {
Willheisen 5:edeac466a3b7 1329 return ERROR;
Willheisen 5:edeac466a3b7 1330 }
Willheisen 5:edeac466a3b7 1331
Willheisen 5:edeac466a3b7 1332 /* Shift and mask out PCMP bits */
Willheisen 5:edeac466a3b7 1333 val = (val >> 5) & 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 1334
Willheisen 5:edeac466a3b7 1335 return val;
Willheisen 5:edeac466a3b7 1336 }
Willheisen 5:edeac466a3b7 1337
Willheisen 5:edeac466a3b7 1338 /**
Willheisen 5:edeac466a3b7 1339 * @brief Sets the proximity gain compensation enable
Willheisen 5:edeac466a3b7 1340 *
Willheisen 5:edeac466a3b7 1341 * @param[in] enable 1 to enable compensation. 0 to disable compensation.
Willheisen 5:edeac466a3b7 1342 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1343 */
Willheisen 5:edeac466a3b7 1344 bool glibr::setProxGainCompEnable(uint8_t enable)
Willheisen 5:edeac466a3b7 1345 {
Willheisen 5:edeac466a3b7 1346 uint8_t val;
Willheisen 5:edeac466a3b7 1347
Willheisen 5:edeac466a3b7 1348 /* Read value from CONFIG3 register */
Willheisen 5:edeac466a3b7 1349 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_CONFIG3);
Willheisen 5:edeac466a3b7 1350 if( val == ERROR){//!wireReadDataByte(APDS9960_CONFIG3, val) ) {
Willheisen 5:edeac466a3b7 1351 return false;
Willheisen 5:edeac466a3b7 1352 }
Willheisen 5:edeac466a3b7 1353
Willheisen 5:edeac466a3b7 1354 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1355 enable &= 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 1356 enable = enable << 5;
Willheisen 5:edeac466a3b7 1357 val &= 0xCF;//0b11011111;
Willheisen 5:edeac466a3b7 1358 val |= enable;
Willheisen 5:edeac466a3b7 1359
Willheisen 5:edeac466a3b7 1360 /* Write register value back into CONFIG3 register */
Willheisen 5:edeac466a3b7 1361
Willheisen 5:edeac466a3b7 1362 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_CONFIG3, val)){//!wireWriteDataByte(APDS9960_CONFIG3, val) ) {
Willheisen 5:edeac466a3b7 1363 return false;
Willheisen 5:edeac466a3b7 1364 }
Willheisen 5:edeac466a3b7 1365
Willheisen 5:edeac466a3b7 1366 return true;
Willheisen 5:edeac466a3b7 1367 }
Willheisen 5:edeac466a3b7 1368
Willheisen 5:edeac466a3b7 1369 /**
Willheisen 5:edeac466a3b7 1370 * @brief Gets the current mask for enabled/disabled proximity photodiodes
Willheisen 5:edeac466a3b7 1371 *
Willheisen 5:edeac466a3b7 1372 * 1 = disabled, 0 = enabled
Willheisen 5:edeac466a3b7 1373 * Bit Photodiode
Willheisen 5:edeac466a3b7 1374 * 3 UP
Willheisen 5:edeac466a3b7 1375 * 2 DOWN
Willheisen 5:edeac466a3b7 1376 * 1 LEFT
Willheisen 5:edeac466a3b7 1377 * 0 RIGHT
Willheisen 5:edeac466a3b7 1378 *
Willheisen 5:edeac466a3b7 1379 * @return Current proximity mask for photodiodes. 0xFF on error.
Willheisen 5:edeac466a3b7 1380 */
Willheisen 5:edeac466a3b7 1381 uint8_t glibr::getProxPhotoMask()
Willheisen 5:edeac466a3b7 1382 {
Willheisen 5:edeac466a3b7 1383 uint8_t val;
Willheisen 5:edeac466a3b7 1384
Willheisen 5:edeac466a3b7 1385 /* Read value from CONFIG3 register */
Willheisen 5:edeac466a3b7 1386 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_CONFIG3);
Willheisen 5:edeac466a3b7 1387 if( val == ERROR){//!wireReadDataByte(APDS9960_CONFIG3, val) ) {
Willheisen 5:edeac466a3b7 1388 return ERROR;
Willheisen 5:edeac466a3b7 1389 }
Willheisen 5:edeac466a3b7 1390
Willheisen 5:edeac466a3b7 1391 /* Mask out photodiode enable mask bits */
Willheisen 5:edeac466a3b7 1392 val &= 0x0F;//0b00001111;
Willheisen 5:edeac466a3b7 1393
Willheisen 5:edeac466a3b7 1394 return val;
Willheisen 5:edeac466a3b7 1395 }
Willheisen 5:edeac466a3b7 1396
Willheisen 5:edeac466a3b7 1397 /**
Willheisen 5:edeac466a3b7 1398 * @brief Sets the mask for enabling/disabling proximity photodiodes
Willheisen 5:edeac466a3b7 1399 *
Willheisen 5:edeac466a3b7 1400 * 1 = disabled, 0 = enabled
Willheisen 5:edeac466a3b7 1401 * Bit Photodiode
Willheisen 5:edeac466a3b7 1402 * 3 UP
Willheisen 5:edeac466a3b7 1403 * 2 DOWN
Willheisen 5:edeac466a3b7 1404 * 1 LEFT
Willheisen 5:edeac466a3b7 1405 * 0 RIGHT
Willheisen 5:edeac466a3b7 1406 *
Willheisen 5:edeac466a3b7 1407 * @param[in] mask 4-bit mask value
Willheisen 5:edeac466a3b7 1408 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1409 */
Willheisen 5:edeac466a3b7 1410 bool glibr::setProxPhotoMask(uint8_t mask)
Willheisen 5:edeac466a3b7 1411 {
Willheisen 5:edeac466a3b7 1412 uint8_t val;
Willheisen 5:edeac466a3b7 1413
Willheisen 5:edeac466a3b7 1414 /* Read value from CONFIG3 register */
Willheisen 5:edeac466a3b7 1415 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_CONFIG3);
Willheisen 5:edeac466a3b7 1416 if( val == ERROR){//!wireReadDataByte(APDS9960_CONFIG3, val) ) {
Willheisen 5:edeac466a3b7 1417 return false;
Willheisen 5:edeac466a3b7 1418 }
Willheisen 5:edeac466a3b7 1419
Willheisen 5:edeac466a3b7 1420 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1421 mask &= 0x0F;//0b00001111;
Willheisen 5:edeac466a3b7 1422 val &= 0xF0;//0b11110000;
Willheisen 5:edeac466a3b7 1423 val |= mask;
Willheisen 5:edeac466a3b7 1424
Willheisen 5:edeac466a3b7 1425 /* Write register value back into CONFIG3 register */
Willheisen 5:edeac466a3b7 1426 I2CwriteByte(APDS9960_I2C_ADDR, APDS9960_CONFIG3, val);
Willheisen 5:edeac466a3b7 1427 if( val == ERROR){//!wireWriteDataByte(APDS9960_CONFIG3, val) ) {
Willheisen 5:edeac466a3b7 1428 return false;
Willheisen 5:edeac466a3b7 1429 }
Willheisen 5:edeac466a3b7 1430
Willheisen 5:edeac466a3b7 1431 return true;
Willheisen 5:edeac466a3b7 1432 }
Willheisen 5:edeac466a3b7 1433
Willheisen 5:edeac466a3b7 1434 /**
Willheisen 5:edeac466a3b7 1435 * @brief Gets the entry proximity threshold for gesture sensing
Willheisen 5:edeac466a3b7 1436 *
Willheisen 5:edeac466a3b7 1437 * @return Current entry proximity threshold.
Willheisen 5:edeac466a3b7 1438 */
Willheisen 5:edeac466a3b7 1439 uint8_t glibr::getGestureEnterThresh()
Willheisen 5:edeac466a3b7 1440 {
Willheisen 5:edeac466a3b7 1441 uint8_t val;
Willheisen 5:edeac466a3b7 1442
Willheisen 5:edeac466a3b7 1443 /* Read value from GPENTH register */
Willheisen 5:edeac466a3b7 1444 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GPENTH);
Willheisen 5:edeac466a3b7 1445 if( val == ERROR){//!wireReadDataByte(APDS9960_GPENTH, val) ) {
Willheisen 5:edeac466a3b7 1446 val = 0;
Willheisen 5:edeac466a3b7 1447 }
Willheisen 5:edeac466a3b7 1448
Willheisen 5:edeac466a3b7 1449 return val;
Willheisen 5:edeac466a3b7 1450 }
Willheisen 5:edeac466a3b7 1451
Willheisen 5:edeac466a3b7 1452 /**
Willheisen 5:edeac466a3b7 1453 * @brief Sets the entry proximity threshold for gesture sensing
Willheisen 5:edeac466a3b7 1454 *
Willheisen 5:edeac466a3b7 1455 * @param[in] threshold proximity value needed to start gesture mode
Willheisen 5:edeac466a3b7 1456 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1457 */
Willheisen 5:edeac466a3b7 1458 bool glibr::setGestureEnterThresh(uint8_t threshold)
Willheisen 5:edeac466a3b7 1459 {
Willheisen 5:edeac466a3b7 1460
Willheisen 5:edeac466a3b7 1461 if( I2CwriteByte(APDS9960_I2C_ADDR, APDS9960_GPENTH, threshold)){;//!wireWriteDataByte(APDS9960_GPENTH, threshold) ) {
Willheisen 5:edeac466a3b7 1462 return false;
Willheisen 5:edeac466a3b7 1463 }
Willheisen 5:edeac466a3b7 1464
Willheisen 5:edeac466a3b7 1465 return true;
Willheisen 5:edeac466a3b7 1466 }
Willheisen 5:edeac466a3b7 1467
Willheisen 5:edeac466a3b7 1468 /**
Willheisen 5:edeac466a3b7 1469 * @brief Gets the exit proximity threshold for gesture sensing
Willheisen 5:edeac466a3b7 1470 *
Willheisen 5:edeac466a3b7 1471 * @return Current exit proximity threshold.
Willheisen 5:edeac466a3b7 1472 */
Willheisen 5:edeac466a3b7 1473 uint8_t glibr::getGestureExitThresh()
Willheisen 5:edeac466a3b7 1474 {
Willheisen 5:edeac466a3b7 1475 uint8_t val;
Willheisen 5:edeac466a3b7 1476
Willheisen 5:edeac466a3b7 1477 /* Read value from GEXTH register */
Willheisen 5:edeac466a3b7 1478 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GEXTH);
Willheisen 5:edeac466a3b7 1479 if( val == ERROR){//!wireReadDataByte(APDS9960_GEXTH, val) ) {
Willheisen 5:edeac466a3b7 1480 val = 0;
Willheisen 5:edeac466a3b7 1481 }
Willheisen 5:edeac466a3b7 1482
Willheisen 5:edeac466a3b7 1483 return val;
Willheisen 5:edeac466a3b7 1484 }
Willheisen 5:edeac466a3b7 1485
Willheisen 5:edeac466a3b7 1486 /**
Willheisen 5:edeac466a3b7 1487 * @brief Sets the exit proximity threshold for gesture sensing
Willheisen 5:edeac466a3b7 1488 *
Willheisen 5:edeac466a3b7 1489 * @param[in] threshold proximity value needed to end gesture mode
Willheisen 5:edeac466a3b7 1490 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1491 */
Willheisen 5:edeac466a3b7 1492 bool glibr::setGestureExitThresh(uint8_t threshold)
Willheisen 5:edeac466a3b7 1493 {
Willheisen 5:edeac466a3b7 1494 if( I2CwriteByte(APDS9960_I2C_ADDR, APDS9960_GEXTH, threshold)){//!wireWriteDataByte(APDS9960_GEXTH, threshold) ) {
Willheisen 5:edeac466a3b7 1495 return false;
Willheisen 5:edeac466a3b7 1496 }
Willheisen 5:edeac466a3b7 1497
Willheisen 5:edeac466a3b7 1498 return true;
Willheisen 5:edeac466a3b7 1499 }
Willheisen 5:edeac466a3b7 1500
Willheisen 5:edeac466a3b7 1501 /**
Willheisen 5:edeac466a3b7 1502 * @brief Gets the gain of the photodiode during gesture mode
Willheisen 5:edeac466a3b7 1503 *
Willheisen 5:edeac466a3b7 1504 * Value Gain
Willheisen 5:edeac466a3b7 1505 * 0 1x
Willheisen 5:edeac466a3b7 1506 * 1 2x
Willheisen 5:edeac466a3b7 1507 * 2 4x
Willheisen 5:edeac466a3b7 1508 * 3 8x
Willheisen 5:edeac466a3b7 1509 *
Willheisen 5:edeac466a3b7 1510 * @return the current photodiode gain. 0xFF on error.
Willheisen 5:edeac466a3b7 1511 */
Willheisen 5:edeac466a3b7 1512 uint8_t glibr::getGestureGain()
Willheisen 5:edeac466a3b7 1513 {
Willheisen 5:edeac466a3b7 1514 uint8_t val;
Willheisen 5:edeac466a3b7 1515
Willheisen 5:edeac466a3b7 1516 /* Read value from GCONF2 register */
Willheisen 5:edeac466a3b7 1517 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF2);
Willheisen 5:edeac466a3b7 1518 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1519 return ERROR;
Willheisen 5:edeac466a3b7 1520 }
Willheisen 5:edeac466a3b7 1521
Willheisen 5:edeac466a3b7 1522 /* Shift and mask out GGAIN bits */
Willheisen 5:edeac466a3b7 1523 val = (val >> 5) & 0x03;//0b00000011;
Willheisen 5:edeac466a3b7 1524
Willheisen 5:edeac466a3b7 1525 return val;
Willheisen 5:edeac466a3b7 1526 }
Willheisen 5:edeac466a3b7 1527
Willheisen 5:edeac466a3b7 1528 /**
Willheisen 5:edeac466a3b7 1529 * @brief Sets the gain of the photodiode during gesture mode
Willheisen 5:edeac466a3b7 1530 *
Willheisen 5:edeac466a3b7 1531 * Value Gain
Willheisen 5:edeac466a3b7 1532 * 0 1x
Willheisen 5:edeac466a3b7 1533 * 1 2x
Willheisen 5:edeac466a3b7 1534 * 2 4x
Willheisen 5:edeac466a3b7 1535 * 3 8x
Willheisen 5:edeac466a3b7 1536 *
Willheisen 5:edeac466a3b7 1537 * @param[in] gain the value for the photodiode gain
Willheisen 5:edeac466a3b7 1538 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1539 */
Willheisen 5:edeac466a3b7 1540 bool glibr::setGestureGain(uint8_t gain)
Willheisen 5:edeac466a3b7 1541 {
Willheisen 5:edeac466a3b7 1542 uint8_t val;
Willheisen 5:edeac466a3b7 1543
Willheisen 5:edeac466a3b7 1544 /* Read value from GCONF2 register */
Willheisen 5:edeac466a3b7 1545 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF2);
Willheisen 5:edeac466a3b7 1546 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1547 return false;
Willheisen 5:edeac466a3b7 1548 }
Willheisen 5:edeac466a3b7 1549
Willheisen 5:edeac466a3b7 1550 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1551 gain &= 0x03;//0b00000011;
Willheisen 5:edeac466a3b7 1552 gain = gain << 5;
Willheisen 5:edeac466a3b7 1553 val &= 0x9F;//0b10011111;
Willheisen 5:edeac466a3b7 1554 val |= gain;
Willheisen 5:edeac466a3b7 1555
Willheisen 5:edeac466a3b7 1556 /* Write register value back into GCONF2 register */
Willheisen 5:edeac466a3b7 1557 if( I2CwriteByte(APDS9960_I2C_ADDR, APDS9960_GCONF2, val)){//!wireWriteDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1558 return false;
Willheisen 5:edeac466a3b7 1559 }
Willheisen 5:edeac466a3b7 1560
Willheisen 5:edeac466a3b7 1561 return true;
Willheisen 5:edeac466a3b7 1562 }
Willheisen 5:edeac466a3b7 1563
Willheisen 5:edeac466a3b7 1564 /**
Willheisen 5:edeac466a3b7 1565 * @brief Gets the drive current of the LED during gesture mode
Willheisen 5:edeac466a3b7 1566 *
Willheisen 5:edeac466a3b7 1567 * Value LED Current
Willheisen 5:edeac466a3b7 1568 * 0 100 mA
Willheisen 5:edeac466a3b7 1569 * 1 50 mA
Willheisen 5:edeac466a3b7 1570 * 2 25 mA
Willheisen 5:edeac466a3b7 1571 * 3 12.5 mA
Willheisen 5:edeac466a3b7 1572 *
Willheisen 5:edeac466a3b7 1573 * @return the LED drive current value. 0xFF on error.
Willheisen 5:edeac466a3b7 1574 */
Willheisen 5:edeac466a3b7 1575 uint8_t glibr::getGestureLEDDrive()
Willheisen 5:edeac466a3b7 1576 {
Willheisen 5:edeac466a3b7 1577 uint8_t val;
Willheisen 5:edeac466a3b7 1578
Willheisen 5:edeac466a3b7 1579 /* Read value from GCONF2 register */
Willheisen 5:edeac466a3b7 1580 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF2);
Willheisen 5:edeac466a3b7 1581 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1582 return ERROR;
Willheisen 5:edeac466a3b7 1583 }
Willheisen 5:edeac466a3b7 1584
Willheisen 5:edeac466a3b7 1585 /* Shift and mask out GLDRIVE bits */
Willheisen 5:edeac466a3b7 1586 val = (val >> 3) & 0x03;//0b00000011;
Willheisen 5:edeac466a3b7 1587
Willheisen 5:edeac466a3b7 1588 return val;
Willheisen 5:edeac466a3b7 1589 }
Willheisen 5:edeac466a3b7 1590
Willheisen 5:edeac466a3b7 1591 /**
Willheisen 5:edeac466a3b7 1592 * @brief Sets the LED drive current during gesture mode
Willheisen 5:edeac466a3b7 1593 *
Willheisen 5:edeac466a3b7 1594 * Value LED Current
Willheisen 5:edeac466a3b7 1595 * 0 100 mA
Willheisen 5:edeac466a3b7 1596 * 1 50 mA
Willheisen 5:edeac466a3b7 1597 * 2 25 mA
Willheisen 5:edeac466a3b7 1598 * 3 12.5 mA
Willheisen 5:edeac466a3b7 1599 *
Willheisen 5:edeac466a3b7 1600 * @param[in] drive the value for the LED drive current
Willheisen 5:edeac466a3b7 1601 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1602 */
Willheisen 5:edeac466a3b7 1603 bool glibr::setGestureLEDDrive(uint8_t drive)
Willheisen 5:edeac466a3b7 1604 {
Willheisen 5:edeac466a3b7 1605 uint8_t val;
Willheisen 5:edeac466a3b7 1606
Willheisen 5:edeac466a3b7 1607 /* Read value from GCONF2 register */
Willheisen 5:edeac466a3b7 1608 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF2);
Willheisen 5:edeac466a3b7 1609 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1610 return false;
Willheisen 5:edeac466a3b7 1611 }
Willheisen 5:edeac466a3b7 1612
Willheisen 5:edeac466a3b7 1613 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1614 drive &= 0x03;//0b00000011;
Willheisen 5:edeac466a3b7 1615 drive = drive << 3;
Willheisen 5:edeac466a3b7 1616 val &= 0xE7;//0b11100111;
Willheisen 5:edeac466a3b7 1617 val |= drive;
Willheisen 5:edeac466a3b7 1618
Willheisen 5:edeac466a3b7 1619 /* Write register value back into GCONF2 register */
Willheisen 5:edeac466a3b7 1620 if( I2CwriteByte(APDS9960_I2C_ADDR, APDS9960_GCONF2, val)){//!wireWriteDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1621 return false;
Willheisen 5:edeac466a3b7 1622 }
Willheisen 5:edeac466a3b7 1623
Willheisen 5:edeac466a3b7 1624 return true;
Willheisen 5:edeac466a3b7 1625 }
Willheisen 5:edeac466a3b7 1626
Willheisen 5:edeac466a3b7 1627 /**
Willheisen 5:edeac466a3b7 1628 * @brief Gets the time in low power mode between gesture detections
Willheisen 5:edeac466a3b7 1629 *
Willheisen 5:edeac466a3b7 1630 * Value Wait time
Willheisen 5:edeac466a3b7 1631 * 0 0 ms
Willheisen 5:edeac466a3b7 1632 * 1 2.8 ms
Willheisen 5:edeac466a3b7 1633 * 2 5.6 ms
Willheisen 5:edeac466a3b7 1634 * 3 8.4 ms
Willheisen 5:edeac466a3b7 1635 * 4 14.0 ms
Willheisen 5:edeac466a3b7 1636 * 5 22.4 ms
Willheisen 5:edeac466a3b7 1637 * 6 30.8 ms
Willheisen 5:edeac466a3b7 1638 * 7 39.2 ms
Willheisen 5:edeac466a3b7 1639 *
Willheisen 5:edeac466a3b7 1640 * @return the current wait time between gestures. 0xFF on error.
Willheisen 5:edeac466a3b7 1641 */
Willheisen 5:edeac466a3b7 1642 uint8_t glibr::getGestureWaitTime()
Willheisen 5:edeac466a3b7 1643 {
Willheisen 5:edeac466a3b7 1644 uint8_t val;
Willheisen 5:edeac466a3b7 1645
Willheisen 5:edeac466a3b7 1646 /* Read value from GCONF2 register */
Willheisen 5:edeac466a3b7 1647 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF2);
Willheisen 5:edeac466a3b7 1648 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1649 return ERROR;
Willheisen 5:edeac466a3b7 1650 }
Willheisen 5:edeac466a3b7 1651
Willheisen 5:edeac466a3b7 1652 /* Mask out GWTIME bits */
Willheisen 5:edeac466a3b7 1653 val &= 0x07;//0b00000111;
Willheisen 5:edeac466a3b7 1654
Willheisen 5:edeac466a3b7 1655 return val;
Willheisen 5:edeac466a3b7 1656 }
Willheisen 5:edeac466a3b7 1657
Willheisen 5:edeac466a3b7 1658 /*
Willheisen 5:edeac466a3b7 1659 *
Willheisen 5:edeac466a3b7 1660 *
Willheisen 5:edeac466a3b7 1661 *
Willheisen 5:edeac466a3b7 1662 *LEFT Off HERE AT 3:47PM On 3/6/15
Willheisen 5:edeac466a3b7 1663 *
Willheisen 5:edeac466a3b7 1664 *
Willheisen 5:edeac466a3b7 1665 *
Willheisen 5:edeac466a3b7 1666 *
Willheisen 5:edeac466a3b7 1667 */
Willheisen 5:edeac466a3b7 1668
Willheisen 5:edeac466a3b7 1669
Willheisen 5:edeac466a3b7 1670 /**
Willheisen 5:edeac466a3b7 1671 * @brief Sets the time in low power mode between gesture detections
Willheisen 5:edeac466a3b7 1672 *
Willheisen 5:edeac466a3b7 1673 * Value Wait time
Willheisen 5:edeac466a3b7 1674 * 0 0 ms
Willheisen 5:edeac466a3b7 1675 * 1 2.8 ms
Willheisen 5:edeac466a3b7 1676 * 2 5.6 ms
Willheisen 5:edeac466a3b7 1677 * 3 8.4 ms
Willheisen 5:edeac466a3b7 1678 * 4 14.0 ms
Willheisen 5:edeac466a3b7 1679 * 5 22.4 ms
Willheisen 5:edeac466a3b7 1680 * 6 30.8 ms
Willheisen 5:edeac466a3b7 1681 * 7 39.2 ms
Willheisen 5:edeac466a3b7 1682 *
Willheisen 5:edeac466a3b7 1683 * @param[in] the value for the wait time
Willheisen 5:edeac466a3b7 1684 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1685 */
Willheisen 5:edeac466a3b7 1686 bool glibr::setGestureWaitTime(uint8_t time)
Willheisen 5:edeac466a3b7 1687 {
Willheisen 5:edeac466a3b7 1688 uint8_t val;
Willheisen 5:edeac466a3b7 1689
Willheisen 5:edeac466a3b7 1690 /* Read value from GCONF2 register */
Willheisen 5:edeac466a3b7 1691 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF2);
Willheisen 5:edeac466a3b7 1692 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1693 return false;
Willheisen 5:edeac466a3b7 1694 }
Willheisen 5:edeac466a3b7 1695 /* if( !wireReadDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1696 return false;
Willheisen 5:edeac466a3b7 1697 } */
Willheisen 5:edeac466a3b7 1698
Willheisen 5:edeac466a3b7 1699 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1700 time &= 0x07;//0b00000111;
Willheisen 5:edeac466a3b7 1701 val &= 0xF8;//0b11111000;
Willheisen 5:edeac466a3b7 1702 val |= time;
Willheisen 5:edeac466a3b7 1703
Willheisen 5:edeac466a3b7 1704 /* Write register value back into GCONF2 register */
Willheisen 5:edeac466a3b7 1705 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GCONF2,val)){//!wireWriteDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1706 return false;
Willheisen 5:edeac466a3b7 1707 }
Willheisen 5:edeac466a3b7 1708 /*if( !wireWriteDataByte(APDS9960_GCONF2, val) ) {
Willheisen 5:edeac466a3b7 1709 return false;
Willheisen 5:edeac466a3b7 1710 }*/
Willheisen 5:edeac466a3b7 1711 return true;
Willheisen 5:edeac466a3b7 1712 }
Willheisen 5:edeac466a3b7 1713
Willheisen 5:edeac466a3b7 1714 /**
Willheisen 5:edeac466a3b7 1715 * @brief Gets the low threshold for ambient light interrupts
Willheisen 5:edeac466a3b7 1716 *
Willheisen 5:edeac466a3b7 1717 * @param[out] threshold current low threshold stored on the APDS-9960
Willheisen 5:edeac466a3b7 1718 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1719 */
Willheisen 5:edeac466a3b7 1720 bool glibr::getLightIntLowThreshold(uint16_t &threshold)
Willheisen 5:edeac466a3b7 1721 {
Willheisen 5:edeac466a3b7 1722 uint8_t val_byte;
Willheisen 5:edeac466a3b7 1723 threshold = 0;
Willheisen 5:edeac466a3b7 1724
Willheisen 5:edeac466a3b7 1725 /* Read value from ambient light low threshold, low byte register */
Willheisen 5:edeac466a3b7 1726 val_byte = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_AILTL);
Willheisen 5:edeac466a3b7 1727 if( val_byte == ERROR){//!wireReadDataByte(APDS9960_AILTL, val_byte) ) {
Willheisen 5:edeac466a3b7 1728 return false;
Willheisen 5:edeac466a3b7 1729 }
Willheisen 5:edeac466a3b7 1730 threshold = val_byte;
Willheisen 5:edeac466a3b7 1731
Willheisen 5:edeac466a3b7 1732 /* Read value from ambient light low threshold, high byte register */
Willheisen 5:edeac466a3b7 1733 val_byte = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_AILTH);
Willheisen 5:edeac466a3b7 1734 if( val_byte == ERROR){//!wireReadDataByte(APDS9960_AILTH, val_byte) ) {
Willheisen 5:edeac466a3b7 1735 return false;
Willheisen 5:edeac466a3b7 1736 }
Willheisen 5:edeac466a3b7 1737 threshold = threshold + ((uint16_t)val_byte << 8);
Willheisen 5:edeac466a3b7 1738
Willheisen 5:edeac466a3b7 1739 return true;
Willheisen 5:edeac466a3b7 1740 }
Willheisen 5:edeac466a3b7 1741
Willheisen 5:edeac466a3b7 1742 /**
Willheisen 5:edeac466a3b7 1743 * @brief Sets the low threshold for ambient light interrupts
Willheisen 5:edeac466a3b7 1744 *
Willheisen 5:edeac466a3b7 1745 * @param[in] threshold low threshold value for interrupt to trigger
Willheisen 5:edeac466a3b7 1746 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1747 */
Willheisen 5:edeac466a3b7 1748 bool glibr::setLightIntLowThreshold(uint16_t threshold)
Willheisen 5:edeac466a3b7 1749 {
Willheisen 5:edeac466a3b7 1750 uint8_t val_low;
Willheisen 5:edeac466a3b7 1751 uint8_t val_high;
Willheisen 5:edeac466a3b7 1752
Willheisen 5:edeac466a3b7 1753 /* Break 16-bit threshold into 2 8-bit values */
Willheisen 5:edeac466a3b7 1754 val_low = threshold & 0x00FF;
Willheisen 5:edeac466a3b7 1755 val_high = (threshold & 0xFF00) >> 8;
Willheisen 5:edeac466a3b7 1756
Willheisen 5:edeac466a3b7 1757 /* Write low byte */
Willheisen 5:edeac466a3b7 1758 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_AILTL,val_low)){//!wireWriteDataByte(APDS9960_AILTL, val_low) ) {
Willheisen 5:edeac466a3b7 1759 return false;
Willheisen 5:edeac466a3b7 1760 }
Willheisen 5:edeac466a3b7 1761
Willheisen 5:edeac466a3b7 1762 /* Write high byte */
Willheisen 5:edeac466a3b7 1763 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_AILTH,val_high)){//!wireWriteDataByte(APDS9960_AILTH, val_high) ) {
Willheisen 5:edeac466a3b7 1764 return false;
Willheisen 5:edeac466a3b7 1765 }
Willheisen 5:edeac466a3b7 1766
Willheisen 5:edeac466a3b7 1767 return true;
Willheisen 5:edeac466a3b7 1768 }
Willheisen 5:edeac466a3b7 1769
Willheisen 5:edeac466a3b7 1770 /**
Willheisen 5:edeac466a3b7 1771 * @brief Gets the high threshold for ambient light interrupts
Willheisen 5:edeac466a3b7 1772 *
Willheisen 5:edeac466a3b7 1773 * @param[out] threshold current low threshold stored on the APDS-9960
Willheisen 5:edeac466a3b7 1774 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1775 */
Willheisen 5:edeac466a3b7 1776 bool glibr::getLightIntHighThreshold(uint16_t &threshold)
Willheisen 5:edeac466a3b7 1777 {
Willheisen 5:edeac466a3b7 1778 uint8_t val_byte;
Willheisen 5:edeac466a3b7 1779 threshold = 0;
Willheisen 5:edeac466a3b7 1780
Willheisen 5:edeac466a3b7 1781 /* Read value from ambient light high threshold, low byte register */
Willheisen 5:edeac466a3b7 1782 val_byte = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_AIHTL);
Willheisen 5:edeac466a3b7 1783 if( val_byte == ERROR){//!wireReadDataByte(APDS9960_AIHTL, val_byte) ) {
Willheisen 5:edeac466a3b7 1784 return false;
Willheisen 5:edeac466a3b7 1785 }
Willheisen 5:edeac466a3b7 1786 threshold = val_byte;
Willheisen 5:edeac466a3b7 1787
Willheisen 5:edeac466a3b7 1788 /* Read value from ambient light high threshold, high byte register */
Willheisen 5:edeac466a3b7 1789 val_byte = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_AIHTH);
Willheisen 5:edeac466a3b7 1790 if( val_byte == ERROR){//!wireReadDataByte(APDS9960_AIHTH, val_byte) ) {
Willheisen 5:edeac466a3b7 1791 return false;
Willheisen 5:edeac466a3b7 1792 }
Willheisen 5:edeac466a3b7 1793 threshold = threshold + ((uint16_t)val_byte << 8);
Willheisen 5:edeac466a3b7 1794
Willheisen 5:edeac466a3b7 1795 return true;
Willheisen 5:edeac466a3b7 1796 }
Willheisen 5:edeac466a3b7 1797
Willheisen 5:edeac466a3b7 1798 /**
Willheisen 5:edeac466a3b7 1799 * @brief Sets the high threshold for ambient light interrupts
Willheisen 5:edeac466a3b7 1800 *
Willheisen 5:edeac466a3b7 1801 * @param[in] threshold high threshold value for interrupt to trigger
Willheisen 5:edeac466a3b7 1802 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1803 */
Willheisen 5:edeac466a3b7 1804 bool glibr::setLightIntHighThreshold(uint16_t threshold)
Willheisen 5:edeac466a3b7 1805 {
Willheisen 5:edeac466a3b7 1806 uint8_t val_low;
Willheisen 5:edeac466a3b7 1807 uint8_t val_high;
Willheisen 5:edeac466a3b7 1808
Willheisen 5:edeac466a3b7 1809 /* Break 16-bit threshold into 2 8-bit values */
Willheisen 5:edeac466a3b7 1810 val_low = threshold & 0x00FF;
Willheisen 5:edeac466a3b7 1811 val_high = (threshold & 0xFF00) >> 8;
Willheisen 5:edeac466a3b7 1812
Willheisen 5:edeac466a3b7 1813 /* Write low byte */
Willheisen 5:edeac466a3b7 1814 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_AIHTL,val_low)){//!wireWriteDataByte(APDS9960_AIHTL, val_low) ) {
Willheisen 5:edeac466a3b7 1815 return false;
Willheisen 5:edeac466a3b7 1816 }
Willheisen 5:edeac466a3b7 1817
Willheisen 5:edeac466a3b7 1818 /* Write high byte */
Willheisen 5:edeac466a3b7 1819 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_AIHTH,val_high)){//!wireWriteDataByte(APDS9960_AIHTH, val_high) ) {
Willheisen 5:edeac466a3b7 1820 return false;
Willheisen 5:edeac466a3b7 1821 }
Willheisen 5:edeac466a3b7 1822
Willheisen 5:edeac466a3b7 1823 return true;
Willheisen 5:edeac466a3b7 1824 }
Willheisen 5:edeac466a3b7 1825
Willheisen 5:edeac466a3b7 1826 /**
Willheisen 5:edeac466a3b7 1827 * @brief Gets the low threshold for proximity interrupts
Willheisen 5:edeac466a3b7 1828 *
Willheisen 5:edeac466a3b7 1829 * @param[out] threshold current low threshold stored on the APDS-9960
Willheisen 5:edeac466a3b7 1830 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1831 */
Willheisen 5:edeac466a3b7 1832 bool glibr::getProximityIntLowThreshold(uint8_t &threshold)
Willheisen 5:edeac466a3b7 1833 {
Willheisen 5:edeac466a3b7 1834 threshold = 0;
Willheisen 5:edeac466a3b7 1835
Willheisen 5:edeac466a3b7 1836 /* Read value from proximity low threshold register */
Willheisen 5:edeac466a3b7 1837 threshold = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_PILT);
Willheisen 5:edeac466a3b7 1838 if( threshold == ERROR){//!wireReadDataByte(APDS9960_PILT, threshold) ) {
Willheisen 5:edeac466a3b7 1839 return false;
Willheisen 5:edeac466a3b7 1840 }
Willheisen 5:edeac466a3b7 1841
Willheisen 5:edeac466a3b7 1842 return true;
Willheisen 5:edeac466a3b7 1843 }
Willheisen 5:edeac466a3b7 1844
Willheisen 5:edeac466a3b7 1845 /**
Willheisen 5:edeac466a3b7 1846 * @brief Sets the low threshold for proximity interrupts
Willheisen 5:edeac466a3b7 1847 *
Willheisen 5:edeac466a3b7 1848 * @param[in] threshold low threshold value for interrupt to trigger
Willheisen 5:edeac466a3b7 1849 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1850 */
Willheisen 5:edeac466a3b7 1851 bool glibr::setProximityIntLowThreshold(uint8_t threshold)
Willheisen 5:edeac466a3b7 1852 {
Willheisen 5:edeac466a3b7 1853
Willheisen 5:edeac466a3b7 1854 /* Write threshold value to register */
Willheisen 5:edeac466a3b7 1855 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PILT,threshold)){//!wireWriteDataByte(APDS9960_PILT, threshold) ) {
Willheisen 5:edeac466a3b7 1856 return false;
Willheisen 5:edeac466a3b7 1857 }
Willheisen 5:edeac466a3b7 1858
Willheisen 5:edeac466a3b7 1859 return true;
Willheisen 5:edeac466a3b7 1860 }
Willheisen 5:edeac466a3b7 1861
Willheisen 5:edeac466a3b7 1862 /**
Willheisen 5:edeac466a3b7 1863 * @brief Gets the high threshold for proximity interrupts
Willheisen 5:edeac466a3b7 1864 *
Willheisen 5:edeac466a3b7 1865 * @param[out] threshold current low threshold stored on the APDS-9960
Willheisen 5:edeac466a3b7 1866 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1867 */
Willheisen 5:edeac466a3b7 1868 bool glibr::getProximityIntHighThreshold(uint8_t &threshold)
Willheisen 5:edeac466a3b7 1869 {
Willheisen 5:edeac466a3b7 1870 threshold = 0;
Willheisen 5:edeac466a3b7 1871
Willheisen 5:edeac466a3b7 1872 /* Read value from proximity low threshold register */
Willheisen 5:edeac466a3b7 1873 threshold = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_PIHT);
Willheisen 5:edeac466a3b7 1874 if( threshold == ERROR){//!wireReadDataByte(APDS9960_PIHT, threshold) ) {
Willheisen 5:edeac466a3b7 1875 return false;
Willheisen 5:edeac466a3b7 1876 }
Willheisen 5:edeac466a3b7 1877
Willheisen 5:edeac466a3b7 1878 return true;
Willheisen 5:edeac466a3b7 1879 }
Willheisen 5:edeac466a3b7 1880
Willheisen 5:edeac466a3b7 1881 /**
Willheisen 5:edeac466a3b7 1882 * @brief Sets the high threshold for proximity interrupts
Willheisen 5:edeac466a3b7 1883 *
Willheisen 5:edeac466a3b7 1884 * @param[in] threshold high threshold value for interrupt to trigger
Willheisen 5:edeac466a3b7 1885 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1886 */
Willheisen 5:edeac466a3b7 1887 bool glibr::setProximityIntHighThreshold(uint8_t threshold)
Willheisen 5:edeac466a3b7 1888 {
Willheisen 5:edeac466a3b7 1889
Willheisen 5:edeac466a3b7 1890 /* Write threshold value to register */
Willheisen 5:edeac466a3b7 1891 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_PIHT,threshold)){//!wireWriteDataByte(APDS9960_PIHT, threshold) ) {
Willheisen 5:edeac466a3b7 1892 return false;
Willheisen 5:edeac466a3b7 1893 }
Willheisen 5:edeac466a3b7 1894
Willheisen 5:edeac466a3b7 1895 return true;
Willheisen 5:edeac466a3b7 1896 }
Willheisen 5:edeac466a3b7 1897
Willheisen 5:edeac466a3b7 1898 /**
Willheisen 5:edeac466a3b7 1899 * @brief Gets if ambient light interrupts are enabled or not
Willheisen 5:edeac466a3b7 1900 *
Willheisen 5:edeac466a3b7 1901 * @return 1 if interrupts are enabled, 0 if not. 0xFF on error.
Willheisen 5:edeac466a3b7 1902 */
Willheisen 5:edeac466a3b7 1903 uint8_t glibr::getAmbientLightIntEnable()
Willheisen 5:edeac466a3b7 1904 {
Willheisen 5:edeac466a3b7 1905 uint8_t val;
Willheisen 5:edeac466a3b7 1906
Willheisen 5:edeac466a3b7 1907 /* Read value from ENABLE register */
Willheisen 5:edeac466a3b7 1908 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_ENABLE);
Willheisen 5:edeac466a3b7 1909 if( val == ERROR){//!wireReadDataByte(APDS9960_ENABLE, val) ) {
Willheisen 5:edeac466a3b7 1910 return ERROR;
Willheisen 5:edeac466a3b7 1911 }
Willheisen 5:edeac466a3b7 1912
Willheisen 5:edeac466a3b7 1913 /* Shift and mask out AIEN bit */
Willheisen 5:edeac466a3b7 1914 val = (val >> 4) & 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 1915
Willheisen 5:edeac466a3b7 1916 return val;
Willheisen 5:edeac466a3b7 1917 }
Willheisen 5:edeac466a3b7 1918
Willheisen 5:edeac466a3b7 1919 /**
Willheisen 5:edeac466a3b7 1920 * @brief Turns ambient light interrupts on or off
Willheisen 5:edeac466a3b7 1921 *
Willheisen 5:edeac466a3b7 1922 * @param[in] enable 1 to enable interrupts, 0 to turn them off
Willheisen 5:edeac466a3b7 1923 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1924 */
Willheisen 5:edeac466a3b7 1925 bool glibr::setAmbientLightIntEnable(uint8_t enable)
Willheisen 5:edeac466a3b7 1926 {
Willheisen 5:edeac466a3b7 1927 uint8_t val;
Willheisen 5:edeac466a3b7 1928
Willheisen 5:edeac466a3b7 1929 /* Read value from ENABLE register */
Willheisen 5:edeac466a3b7 1930 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_ENABLE);
Willheisen 5:edeac466a3b7 1931 if( val == ERROR){//!wireReadDataByte(APDS9960_ENABLE, val) ) {
Willheisen 5:edeac466a3b7 1932 return false;
Willheisen 5:edeac466a3b7 1933 }
Willheisen 5:edeac466a3b7 1934
Willheisen 5:edeac466a3b7 1935 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1936 enable &= 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 1937 enable = enable << 4;
Willheisen 5:edeac466a3b7 1938 val &= 0xEF;//0b11101111;
Willheisen 5:edeac466a3b7 1939 val |= enable;
Willheisen 5:edeac466a3b7 1940
Willheisen 5:edeac466a3b7 1941 /* Write register value back into ENABLE register */
Willheisen 5:edeac466a3b7 1942 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_ENABLE,val)){//!wireWriteDataByte(APDS9960_ENABLE, val) ) {
Willheisen 5:edeac466a3b7 1943 return false;
Willheisen 5:edeac466a3b7 1944 }
Willheisen 5:edeac466a3b7 1945
Willheisen 5:edeac466a3b7 1946 return true;
Willheisen 5:edeac466a3b7 1947 }
Willheisen 5:edeac466a3b7 1948
Willheisen 5:edeac466a3b7 1949 /**
Willheisen 5:edeac466a3b7 1950 * @brief Gets if proximity interrupts are enabled or not
Willheisen 5:edeac466a3b7 1951 *
Willheisen 5:edeac466a3b7 1952 * @return 1 if interrupts are enabled, 0 if not. 0xFF on error.
Willheisen 5:edeac466a3b7 1953 */
Willheisen 5:edeac466a3b7 1954 uint8_t glibr::getProximityIntEnable()
Willheisen 5:edeac466a3b7 1955 {
Willheisen 5:edeac466a3b7 1956 uint8_t val;
Willheisen 5:edeac466a3b7 1957
Willheisen 5:edeac466a3b7 1958 /* Read value from ENABLE register */
Willheisen 5:edeac466a3b7 1959 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_ENABLE);
Willheisen 5:edeac466a3b7 1960 if( val == ERROR){//!wireReadDataByte(APDS9960_ENABLE, val) ) {
Willheisen 5:edeac466a3b7 1961 return ERROR;
Willheisen 5:edeac466a3b7 1962 }
Willheisen 5:edeac466a3b7 1963
Willheisen 5:edeac466a3b7 1964 /* Shift and mask out PIEN bit */
Willheisen 5:edeac466a3b7 1965 val = (val >> 5) & 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 1966
Willheisen 5:edeac466a3b7 1967 return val;
Willheisen 5:edeac466a3b7 1968 }
Willheisen 5:edeac466a3b7 1969
Willheisen 5:edeac466a3b7 1970 /**
Willheisen 5:edeac466a3b7 1971 * @brief Turns proximity interrupts on or off
Willheisen 5:edeac466a3b7 1972 *
Willheisen 5:edeac466a3b7 1973 * @param[in] enable 1 to enable interrupts, 0 to turn them off
Willheisen 5:edeac466a3b7 1974 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 1975 */
Willheisen 5:edeac466a3b7 1976 bool glibr::setProximityIntEnable(uint8_t enable)
Willheisen 5:edeac466a3b7 1977 {
Willheisen 5:edeac466a3b7 1978 uint8_t val;
Willheisen 5:edeac466a3b7 1979
Willheisen 5:edeac466a3b7 1980 /* Read value from ENABLE register */
Willheisen 5:edeac466a3b7 1981 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_ENABLE);
Willheisen 5:edeac466a3b7 1982 if( val == ERROR){//!wireReadDataByte(APDS9960_ENABLE, val) ) {
Willheisen 5:edeac466a3b7 1983 return false;
Willheisen 5:edeac466a3b7 1984 }
Willheisen 5:edeac466a3b7 1985
Willheisen 5:edeac466a3b7 1986 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 1987 enable &= 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 1988 enable = enable << 5;
Willheisen 5:edeac466a3b7 1989 val &= 0xDF;//0b11011111;
Willheisen 5:edeac466a3b7 1990 val |= enable;
Willheisen 5:edeac466a3b7 1991
Willheisen 5:edeac466a3b7 1992 /* Write register value back into ENABLE register */
Willheisen 5:edeac466a3b7 1993 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_ENABLE,val)){//!wireWriteDataByte(APDS9960_ENABLE, val) ) {
Willheisen 5:edeac466a3b7 1994 return false;
Willheisen 5:edeac466a3b7 1995 }
Willheisen 5:edeac466a3b7 1996
Willheisen 5:edeac466a3b7 1997 return true;
Willheisen 5:edeac466a3b7 1998 }
Willheisen 5:edeac466a3b7 1999
Willheisen 5:edeac466a3b7 2000 /**
Willheisen 5:edeac466a3b7 2001 * @brief Gets if gesture interrupts are enabled or not
Willheisen 5:edeac466a3b7 2002 *
Willheisen 5:edeac466a3b7 2003 * @return 1 if interrupts are enabled, 0 if not. 0xFF on error.
Willheisen 5:edeac466a3b7 2004 */
Willheisen 5:edeac466a3b7 2005 uint8_t glibr::getGestureIntEnable()
Willheisen 5:edeac466a3b7 2006 {
Willheisen 5:edeac466a3b7 2007 uint8_t val;
Willheisen 5:edeac466a3b7 2008
Willheisen 5:edeac466a3b7 2009 /* Read value from GCONF4 register */
Willheisen 5:edeac466a3b7 2010 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF4);
Willheisen 5:edeac466a3b7 2011 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF4, val) ) {
Willheisen 5:edeac466a3b7 2012 return ERROR;
Willheisen 5:edeac466a3b7 2013 }
Willheisen 5:edeac466a3b7 2014
Willheisen 5:edeac466a3b7 2015 /* Shift and mask out GIEN bit */
Willheisen 5:edeac466a3b7 2016 val = (val >> 1) & 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 2017
Willheisen 5:edeac466a3b7 2018 return val;
Willheisen 5:edeac466a3b7 2019 }
Willheisen 5:edeac466a3b7 2020
Willheisen 5:edeac466a3b7 2021 /**
Willheisen 5:edeac466a3b7 2022 * @brief Turns gesture-related interrupts on or off
Willheisen 5:edeac466a3b7 2023 *
Willheisen 5:edeac466a3b7 2024 * @param[in] enable 1 to enable interrupts, 0 to turn them off
Willheisen 5:edeac466a3b7 2025 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 2026 */
Willheisen 5:edeac466a3b7 2027 bool glibr::setGestureIntEnable(uint8_t enable)
Willheisen 5:edeac466a3b7 2028 {
Willheisen 5:edeac466a3b7 2029 uint8_t val;
Willheisen 5:edeac466a3b7 2030
Willheisen 5:edeac466a3b7 2031 /* Read value from GCONF4 register */
Willheisen 5:edeac466a3b7 2032 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF4);
Willheisen 5:edeac466a3b7 2033 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF4, val) ) {
Willheisen 5:edeac466a3b7 2034 return false;
Willheisen 5:edeac466a3b7 2035 }
Willheisen 5:edeac466a3b7 2036
Willheisen 5:edeac466a3b7 2037 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 2038 enable &= 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 2039 enable = enable << 1;
Willheisen 5:edeac466a3b7 2040 val &= 0xFD;//0b11111101;
Willheisen 5:edeac466a3b7 2041 val |= enable;
Willheisen 5:edeac466a3b7 2042
Willheisen 5:edeac466a3b7 2043 /* Write register value back into GCONF4 register */
Willheisen 5:edeac466a3b7 2044 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GCONF4,val)){//!wireWriteDataByte(APDS9960_GCONF4, val) ) {
Willheisen 5:edeac466a3b7 2045 return false;
Willheisen 5:edeac466a3b7 2046 }
Willheisen 5:edeac466a3b7 2047
Willheisen 5:edeac466a3b7 2048 return true;
Willheisen 5:edeac466a3b7 2049 }
Willheisen 5:edeac466a3b7 2050
Willheisen 5:edeac466a3b7 2051 /**
Willheisen 5:edeac466a3b7 2052 * @brief Clears the ambient light interrupt
Willheisen 5:edeac466a3b7 2053 *
Willheisen 5:edeac466a3b7 2054 * @return True if operation completed successfully. False otherwise.
Willheisen 5:edeac466a3b7 2055 */
Willheisen 5:edeac466a3b7 2056 bool glibr::clearAmbientLightInt()
Willheisen 5:edeac466a3b7 2057 {
Willheisen 5:edeac466a3b7 2058 uint8_t throwaway;
Willheisen 5:edeac466a3b7 2059 throwaway = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_AICLEAR);
Willheisen 5:edeac466a3b7 2060 if( throwaway == ERROR){//!wireReadDataByte(APDS9960_AICLEAR, throwaway) ) {
Willheisen 5:edeac466a3b7 2061 return false;
Willheisen 5:edeac466a3b7 2062 }
Willheisen 5:edeac466a3b7 2063
Willheisen 5:edeac466a3b7 2064 return true;
Willheisen 5:edeac466a3b7 2065 }
Willheisen 5:edeac466a3b7 2066
Willheisen 5:edeac466a3b7 2067 /**
Willheisen 5:edeac466a3b7 2068 * @brief Clears the proximity interrupt
Willheisen 5:edeac466a3b7 2069 *
Willheisen 5:edeac466a3b7 2070 * @return True if operation completed successfully. False otherwise.
Willheisen 5:edeac466a3b7 2071 */
Willheisen 5:edeac466a3b7 2072 bool glibr::clearProximityInt()
Willheisen 5:edeac466a3b7 2073 {
Willheisen 5:edeac466a3b7 2074 uint8_t throwaway;
Willheisen 5:edeac466a3b7 2075 throwaway = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_PICLEAR);
Willheisen 5:edeac466a3b7 2076 if( throwaway == ERROR){//!wireReadDataByte(APDS9960_PICLEAR, throwaway) ) {
Willheisen 5:edeac466a3b7 2077 return false;
Willheisen 5:edeac466a3b7 2078 }
Willheisen 5:edeac466a3b7 2079
Willheisen 5:edeac466a3b7 2080 return true;
Willheisen 5:edeac466a3b7 2081 }
Willheisen 5:edeac466a3b7 2082
Willheisen 5:edeac466a3b7 2083 /**
Willheisen 5:edeac466a3b7 2084 * @brief Tells if the gesture state machine is currently running
Willheisen 5:edeac466a3b7 2085 *
Willheisen 5:edeac466a3b7 2086 * @return 1 if gesture state machine is running, 0 if not. 0xFF on error.
Willheisen 5:edeac466a3b7 2087 */
Willheisen 5:edeac466a3b7 2088 uint8_t glibr::getGestureMode()
Willheisen 5:edeac466a3b7 2089 {
Willheisen 5:edeac466a3b7 2090 uint8_t val;
Willheisen 5:edeac466a3b7 2091
Willheisen 5:edeac466a3b7 2092 /* Read value from GCONF4 register */
Willheisen 5:edeac466a3b7 2093 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF4);
Willheisen 5:edeac466a3b7 2094 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF4, val) ) {
Willheisen 5:edeac466a3b7 2095 return ERROR;
Willheisen 5:edeac466a3b7 2096 }
Willheisen 5:edeac466a3b7 2097
Willheisen 5:edeac466a3b7 2098 /* Mask out GMODE bit */
Willheisen 5:edeac466a3b7 2099 val &= 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 2100
Willheisen 5:edeac466a3b7 2101 return val;
Willheisen 5:edeac466a3b7 2102 }
Willheisen 5:edeac466a3b7 2103
Willheisen 5:edeac466a3b7 2104 /**
Willheisen 5:edeac466a3b7 2105 * @brief Tells the state machine to either enter or exit gesture state machine
Willheisen 5:edeac466a3b7 2106 *
Willheisen 5:edeac466a3b7 2107 * @param[in] mode 1 to enter gesture state machine, 0 to exit.
Willheisen 5:edeac466a3b7 2108 * @return True if operation successful. False otherwise.
Willheisen 5:edeac466a3b7 2109 */
Willheisen 5:edeac466a3b7 2110 bool glibr::setGestureMode(uint8_t mode)
Willheisen 5:edeac466a3b7 2111 {
Willheisen 5:edeac466a3b7 2112 uint8_t val;
Willheisen 5:edeac466a3b7 2113
Willheisen 5:edeac466a3b7 2114 /* Read value from GCONF4 register */
Willheisen 5:edeac466a3b7 2115 val = I2CreadByte(APDS9960_I2C_ADDR, APDS9960_GCONF4);
Willheisen 5:edeac466a3b7 2116 if( val == ERROR){//!wireReadDataByte(APDS9960_GCONF4, val) ) {
Willheisen 5:edeac466a3b7 2117 return false;
Willheisen 5:edeac466a3b7 2118 }
Willheisen 5:edeac466a3b7 2119
Willheisen 5:edeac466a3b7 2120 /* Set bits in register to given value */
Willheisen 5:edeac466a3b7 2121 mode &= 0x01;//0b00000001;
Willheisen 5:edeac466a3b7 2122 val &= 0xFE;//0b11111110;
Willheisen 5:edeac466a3b7 2123 val |= mode;
Willheisen 5:edeac466a3b7 2124
Willheisen 5:edeac466a3b7 2125 /* Write register value back into GCONF4 register */
Willheisen 5:edeac466a3b7 2126 if( I2CwriteByte(APDS9960_I2C_ADDR,APDS9960_GCONF4,val)){//!wireWriteDataByte(APDS9960_GCONF4, val) ) {
Willheisen 5:edeac466a3b7 2127 return false;
Willheisen 5:edeac466a3b7 2128 }
Willheisen 5:edeac466a3b7 2129
Willheisen 5:edeac466a3b7 2130 return true;
Willheisen 5:edeac466a3b7 2131 }
Willheisen 5:edeac466a3b7 2132
Willheisen 5:edeac466a3b7 2133
Willheisen 5:edeac466a3b7 2134
Willheisen 5:edeac466a3b7 2135
Willheisen 5:edeac466a3b7 2136
Willheisen 5:edeac466a3b7 2137 int glibr::I2CwriteByte(char address, char subAddress, char data)
Willheisen 5:edeac466a3b7 2138 {
Willheisen 5:edeac466a3b7 2139 int ret;
Willheisen 5:edeac466a3b7 2140 char cmd[2] = {subAddress, data};
Willheisen 5:edeac466a3b7 2141 ret=i2c.write(address<<1, cmd, 2); //if ret is 1, then not acked.
Willheisen 5:edeac466a3b7 2142 return ret;
Willheisen 5:edeac466a3b7 2143 }
Willheisen 5:edeac466a3b7 2144
Willheisen 5:edeac466a3b7 2145
Willheisen 5:edeac466a3b7 2146
Willheisen 5:edeac466a3b7 2147 uint8_t glibr::I2CreadByte(char address, char subAddress)
Willheisen 5:edeac466a3b7 2148 {
Willheisen 5:edeac466a3b7 2149 char data; // store the register data
Willheisen 5:edeac466a3b7 2150
Willheisen 5:edeac466a3b7 2151 if(i2c.write(address<<1, &subAddress, 1, true)){
Willheisen 5:edeac466a3b7 2152 return ERROR; //7 bit //not acked
Willheisen 5:edeac466a3b7 2153 }
Willheisen 5:edeac466a3b7 2154 if(i2c.read(address<<1, &data, 1)){ /////CHANGED THIS NEED TO TEST.
Willheisen 5:edeac466a3b7 2155 return ERROR;
Willheisen 5:edeac466a3b7 2156 }
Willheisen 5:edeac466a3b7 2157
Willheisen 5:edeac466a3b7 2158
Willheisen 5:edeac466a3b7 2159 //i2c.read(address<<1, &data, 1);
Willheisen 5:edeac466a3b7 2160 return data;
Willheisen 5:edeac466a3b7 2161
Willheisen 5:edeac466a3b7 2162 }
Willheisen 5:edeac466a3b7 2163
Willheisen 5:edeac466a3b7 2164
Willheisen 5:edeac466a3b7 2165 // * @brief Reads a block (array) of bytes from the I2C device and register
Willheisen 5:edeac466a3b7 2166 // *
Willheisen 5:edeac466a3b7 2167 // * @param[in] reg the register to read from
Willheisen 5:edeac466a3b7 2168 // * @param[out] val pointer to the beginning of the data
Willheisen 5:edeac466a3b7 2169 // * @param[in] len number of bytes to read
Willheisen 5:edeac466a3b7 2170 // * @return Number of bytes read. -1 on read error.
Willheisen 5:edeac466a3b7 2171 // */
Willheisen 5:edeac466a3b7 2172 int glibr::I2CReadDataBlock(char address, char subAddress, char *data, unsigned int len)
Willheisen 5:edeac466a3b7 2173 {
Willheisen 5:edeac466a3b7 2174 // unsigned char i = 0;
Willheisen 5:edeac466a3b7 2175
Willheisen 5:edeac466a3b7 2176 /* Indicate which register we want to read from */
Willheisen 5:edeac466a3b7 2177
Willheisen 5:edeac466a3b7 2178 if(i2c.write(address<<1, &subAddress, 1, true)){
Willheisen 5:edeac466a3b7 2179 return -1; //7 bit //not acked
Willheisen 5:edeac466a3b7 2180 }
Willheisen 5:edeac466a3b7 2181
Willheisen 5:edeac466a3b7 2182 /* Read block data */
Willheisen 5:edeac466a3b7 2183
Willheisen 5:edeac466a3b7 2184 if(i2c.read(address<<1, data, len)){
Willheisen 5:edeac466a3b7 2185 return -1;
Willheisen 5:edeac466a3b7 2186 }
Willheisen 5:edeac466a3b7 2187
Willheisen 5:edeac466a3b7 2188 return 1;
Willheisen 5:edeac466a3b7 2189 //Wire.requestFrom(APDS9960_I2C_ADDR, len);
Willheisen 5:edeac466a3b7 2190 /*while (Wire.available()) {
Willheisen 5:edeac466a3b7 2191 if (i >= len) {
Willheisen 5:edeac466a3b7 2192 return -1;
Willheisen 5:edeac466a3b7 2193 }
Willheisen 5:edeac466a3b7 2194 val[i] = Wire.read();
Willheisen 5:edeac466a3b7 2195 i++;
Willheisen 5:edeac466a3b7 2196 }*/
Willheisen 5:edeac466a3b7 2197 }