Uses the APDS_9960 Digital Proximity, Ambient Light, RGB and Gesture Sensor library to play detected gesture sounds on a speaker from the SDcard
Dependencies: mbed SDFileSystem wave_player
Revision 4:84545b0e63a9, committed 2015-03-05
- Comitter:
- kbhagat6
- Date:
- Thu Mar 05 22:42:17 2015 +0000
- Parent:
- 3:26146a08bb22
- Child:
- 5:3eb4f3091bd8
- Commit message:
- more functions added
Changed in this revision
glibr.cpp | Show annotated file Show diff for this revision Revisions of this file |
glibr.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/glibr.cpp Thu Mar 05 22:23:50 2015 +0000 +++ b/glibr.cpp Thu Mar 05 22:42:17 2015 +0000 @@ -374,7 +374,8 @@ uint8_t val; /* Read value from GSTATUS register */ - if( !wireReadDataByte(APDS9960_GSTATUS, val) ) { + val=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GSTATUS); + if( val==ERROR) ) { return ERROR; } @@ -389,6 +390,118 @@ } } +int glibr::readGesture() +{ + uint8_t fifo_level = 0; + uint8_t bytes_read = 0; + uint8_t fifo_data[128]; + uint8_t gstatus; + int motion; + int i; + + /* Make sure that power and gesture is on and data is valid */ + if( !isGestureAvailable() || !(getMode() & 0x41) ) { + return DIR_NONE; + } + + /* Keep looping as long as gesture data is valid */ + while(1) { + + /* Wait some time to collect next batch of FIFO data */ + delay(FIFO_PAUSE_TIME); + + /* Get the contents of the STATUS register. Is data still valid? */ + + gstatus=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GSTATUS); + if( gstatus==ERROR ) { + return ERROR; + } + /* If we have valid data, read in FIFO */ + if( (gstatus & APDS9960_GVALID) == APDS9960_GVALID ) { + + /* Read the current FIFO level */ + fifolevel=I2CreadByte(APDS9960_I2C_ADDR,APDS9960_GFLVL); + if( fifolevel==ERROR ) { + return ERROR; + } + +//#if DEBUG +// Serial.print("FIFO Level: "); +// Serial.println(fifo_level); +//#endif + + /* If there's stuff in the FIFO, read it into our data block */ //NEED TO FIGURE OUT WHAT THIS IS DOING. + if( fifo_level > 0) { + bytes_read = wireReadDataBlock( APDS9960_GFIFO_U, + (uint8_t*)fifo_data, + (fifo_level * 4) ); + if( bytes_read == -1 ) { + return ERROR; + } +#if DEBUG + Serial.print("FIFO Dump: "); + for ( i = 0; i < bytes_read; i++ ) { + Serial.print(fifo_data[i]); + Serial.print(" "); + } + Serial.println(); +#endif + + /* If at least 1 set of data, sort the data into U/D/L/R */ + if( bytes_read >= 4 ) { + for( i = 0; i < bytes_read; i += 4 ) { + gesture_data_.u_data[gesture_data_.index] = \ + fifo_data[i + 0]; + gesture_data_.d_data[gesture_data_.index] = \ + fifo_data[i + 1]; + gesture_data_.l_data[gesture_data_.index] = \ + fifo_data[i + 2]; + gesture_data_.r_data[gesture_data_.index] = \ + fifo_data[i + 3]; + gesture_data_.index++; + gesture_data_.total_gestures++; + } + +#if DEBUG + Serial.print("Up Data: "); + for ( i = 0; i < gesture_data_.total_gestures; i++ ) { + Serial.print(gesture_data_.u_data[i]); + Serial.print(" "); + } + Serial.println(); +#endif + + /* Filter and process gesture data. Decode near/far state */ + if( processGestureData() ) { + if( decodeGesture() ) { + //***TODO: U-Turn Gestures +#if DEBUG + //Serial.println(gesture_motion_); +#endif + } + } + + /* Reset data */ + gesture_data_.index = 0; + gesture_data_.total_gestures = 0; + } + } + } else { + + /* Determine best guessed gesture and clean up */ + delay(FIFO_PAUSE_TIME); + decodeGesture(); + motion = gesture_motion_; +#if DEBUG + Serial.print("END: "); + Serial.println(gesture_motion_); +#endif + resetGestureParameters(); + return motion; + } + } +} + bool glibr::setProximityGain(uint8_t drive) { uint8_t val;
--- a/glibr.h Thu Mar 05 22:23:50 2015 +0000 +++ b/glibr.h Thu Mar 05 22:42:17 2015 +0000 @@ -195,8 +195,8 @@ bool enableGestureSensor(bool interrupts); bool disableGestureSensor(); bool isGestureAvailable(); - - + int readGesture(); + private: uint8_t I2CreadByte(char address, char subAddress); int I2CwriteByte(char address, char subAddress, char data);