test

Dependencies:   ESP8266 HCSR04 PID

Fork of car_test_v1 by 涂 桂旺

Committer:
tgw
Date:
Sat Nov 25 03:36:58 2017 +0000
Revision:
3:9e51de1050a1
test

Who changed what in which revision?

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