A library for the combined proximity, ambient light, RGB color and gesture sensor Avago APDS9960. Tested with corresponding breakout board from SparkFun.
Small test program that briefly shows the usage of the library (only gesture detection). It uses my SFE_MicroOLED Library for result output on a 64 x 48 pixel small 0.66" OLED screen. But it should be easy to change the output to the Serial interface. The platform used was a LPCXpresso11U68:
gesture detection Test-Program
#include "mbed.h" #include "SparkFun_APDS9960.h" #include "SFE_MicroOLED.h" // Constants // Global Variables and forward declarations InterruptIn apds_int(P1_24); SPI my_spi(P0_9, P0_8, P1_29); MicroOLED uView(my_spi, P2_3, P1_28, P1_25); I2C my_i2c(P0_5, P0_4); SparkFun_APDS9960 apds = SparkFun_APDS9960(my_i2c); volatile int isr_flag = 0; void interruptRoutine(); void handleGesture(); void drawArrowUp(); void drawArrowDown(); void drawArrowLeft(); void drawArrowRight(); void drawCircle(); void drawX(); int main() { // Initialize MicroView uView.init(0, 8000000); uView.clear(PAGE); // Initialize interrupt service routine apds_int.mode(PullUp); apds_int.fall(&interruptRoutine); apds_int.disable_irq(); uView.setFontType(0); wait_ms(500); // Initialize APDS-9960 (configure I2C and initial values) if ( apds.init(400000) ) { uView.puts("INIT OK!\n"); } else { uView.puts("I-ERROR!\n"); } // Start running the gesture sensor engine (with interrupts) if ( apds.enableGestureSensor(true) ) { uView.puts("Gest OK!"); } else { uView.puts("G-ERROR!"); } uView.display(); // Wait for initialization and calibration to finish wait_ms(2000); uView.clear(PAGE); // Draw title uView.setCursor(16, 0); uView.puts("Swipe!"); uView.display(); apds_int.enable_irq(); while(1) { // If interrupt, display gesture on MicroOLED if( isr_flag == 1 ) { apds_int.disable_irq(); handleGesture(); isr_flag = 0; wait_ms(500); uView.display(); apds_int.enable_irq(); } // Wait before next reading wait_ms(100); } } void interruptRoutine() { isr_flag = 1; } void handleGesture() { bool do_clear = true; // Draw symbol based on gesture if ( apds.isGestureAvailable() ) { switch ( apds.readGesture() ) { case DIR_UP: drawArrowUp(); break; case DIR_DOWN: drawArrowDown(); break; case DIR_LEFT: drawArrowLeft(); break; case DIR_RIGHT: drawArrowRight(); break; case DIR_NEAR: drawCircle(); break; case DIR_FAR: drawX(); break; default: do_clear = false; } } // Let symbol sit on screen for a while, then clear if ( do_clear ) { uView.clear(PAGE); uView.setCursor(16, 0); uView.puts("Swipe!"); } } void drawArrowUp() { uView.clear(PAGE); uView.line(27, 43, 37, 43); // Bottom: over 10 uView.line(27, 43, 27, 18); // Legs: Up 25 uView.line(37, 43, 37, 18); // Legs: Up 25 uView.line(27, 18, 17, 18); // Head: Over 10 uView.line(37, 18, 47, 18); // Head: Over 10 uView.line(17, 18, 32, 3); // Tip: Over 14, up 15 uView.line(47, 18, 32, 3); // Tip: Over 14, up 15 uView.display(); } void drawArrowDown() { uView.clear(PAGE); uView.line(27, 5, 37, 5); // Bottom: over 10 uView.line(27, 5, 27, 30); // Legs: Up 25 uView.line(37, 5, 37, 30); // Legs: Up 25 uView.line(27, 30, 17, 30); // Head: Over 10 uView.line(37, 30, 47, 30); // Head: Over 10 uView.line(17, 30, 32, 45); // Tip: Over 14, up 15 uView.line(47, 30, 32, 45); // Tip: Over 14, up 15 uView.display(); } void drawArrowLeft() { uView.clear(PAGE); uView.line(52, 19, 52, 29); // Bottom: up 10 uView.line(52, 19, 27, 19); // Legs: over 25 uView.line(52, 29, 27, 29); // Legs: over 25 uView.line(27, 19, 27, 9); // Head: up 10 uView.line(27, 29, 27, 39); // Head: down 10 uView.line(27, 9, 12, 24); // Tip: over 15, down 14 uView.line(27, 39, 12, 24); // Tip: over 15, down 14 uView.display(); } void drawArrowRight() { uView.clear(PAGE); uView.line(12, 19, 12, 29); // Bottom: up 10 uView.line(12, 19, 37, 19); // Legs: over 25 uView.line(12, 29, 37, 29); // Legs: over 25 uView.line(37, 19, 37, 9); // Head: up 10 uView.line(37, 29, 37, 39); // Head: down 10 uView.line(37, 9, 53, 25); // Tip: over 15, down 14 uView.line(37, 39, 52, 24); // Tip: over 15, down 14 uView.display(); } void drawCircle() { uView.clear(PAGE); uView.circle(32, 24, 20); uView.display(); } void drawX() { uView.clear(PAGE); uView.line(12, 4, 52, 44); uView.line(12, 44, 52, 4); uView.display(); }
Here is a video from Sparkfun showing all the implemented gestures:
SparkFun_APDS9960.h@0:c04b49e0a678, 2015-04-10 (annotated)
- Committer:
- synvox
- Date:
- Fri Apr 10 13:21:48 2015 +0000
- Revision:
- 0:c04b49e0a678
first working version
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
synvox | 0:c04b49e0a678 | 1 | /** |
synvox | 0:c04b49e0a678 | 2 | * @file SparkFun_APDS-9960.h |
synvox | 0:c04b49e0a678 | 3 | * @brief Library for the SparkFun APDS-9960 breakout board |
synvox | 0:c04b49e0a678 | 4 | * @author Shawn Hymel (SparkFun Electronics) |
synvox | 0:c04b49e0a678 | 5 | * |
synvox | 0:c04b49e0a678 | 6 | * @copyright This code is public domain but you buy me a beer if you use |
synvox | 0:c04b49e0a678 | 7 | * this and we meet someday (Beerware license). |
synvox | 0:c04b49e0a678 | 8 | * |
synvox | 0:c04b49e0a678 | 9 | * Adapted for mbed by Nenad Milosevic (synvox.ch) in April 2015. |
synvox | 0:c04b49e0a678 | 10 | * |
synvox | 0:c04b49e0a678 | 11 | * This library interfaces the Avago APDS-9960 to mbed over I2C. The library |
synvox | 0:c04b49e0a678 | 12 | * relies on the mbed I2C-library. To use the library, instantiate an |
synvox | 0:c04b49e0a678 | 13 | * APDS9960 object, call init(), and call the appropriate functions. |
synvox | 0:c04b49e0a678 | 14 | */ |
synvox | 0:c04b49e0a678 | 15 | |
synvox | 0:c04b49e0a678 | 16 | #ifndef SparkFun_APDS9960_H |
synvox | 0:c04b49e0a678 | 17 | #define SparkFun_APDS9960_H |
synvox | 0:c04b49e0a678 | 18 | |
synvox | 0:c04b49e0a678 | 19 | /* APDS-9960 I2C address */ |
synvox | 0:c04b49e0a678 | 20 | #define APDS9960_I2C_ADDR 0x39 |
synvox | 0:c04b49e0a678 | 21 | #define APDS9960_I2C_ADDR8 (APDS9960_I2C_ADDR << 1) |
synvox | 0:c04b49e0a678 | 22 | |
synvox | 0:c04b49e0a678 | 23 | /* Gesture parameters */ |
synvox | 0:c04b49e0a678 | 24 | #define GESTURE_THRESHOLD_OUT 10 |
synvox | 0:c04b49e0a678 | 25 | #define GESTURE_SENSITIVITY_1 50 |
synvox | 0:c04b49e0a678 | 26 | #define GESTURE_SENSITIVITY_2 20 |
synvox | 0:c04b49e0a678 | 27 | |
synvox | 0:c04b49e0a678 | 28 | /* Error code for returned values */ |
synvox | 0:c04b49e0a678 | 29 | #define ERROR 0xFF |
synvox | 0:c04b49e0a678 | 30 | |
synvox | 0:c04b49e0a678 | 31 | /* Acceptable device IDs */ |
synvox | 0:c04b49e0a678 | 32 | #define APDS9960_ID_1 0xAB |
synvox | 0:c04b49e0a678 | 33 | #define APDS9960_ID_2 0x9C |
synvox | 0:c04b49e0a678 | 34 | |
synvox | 0:c04b49e0a678 | 35 | /* Misc parameters */ |
synvox | 0:c04b49e0a678 | 36 | #define FIFO_PAUSE_TIME 30 // Wait period (ms) between FIFO reads |
synvox | 0:c04b49e0a678 | 37 | |
synvox | 0:c04b49e0a678 | 38 | /* APDS-9960 register addresses */ |
synvox | 0:c04b49e0a678 | 39 | #define APDS9960_ENABLE 0x80 |
synvox | 0:c04b49e0a678 | 40 | #define APDS9960_ATIME 0x81 |
synvox | 0:c04b49e0a678 | 41 | #define APDS9960_WTIME 0x83 |
synvox | 0:c04b49e0a678 | 42 | #define APDS9960_AILTL 0x84 |
synvox | 0:c04b49e0a678 | 43 | #define APDS9960_AILTH 0x85 |
synvox | 0:c04b49e0a678 | 44 | #define APDS9960_AIHTL 0x86 |
synvox | 0:c04b49e0a678 | 45 | #define APDS9960_AIHTH 0x87 |
synvox | 0:c04b49e0a678 | 46 | #define APDS9960_PILT 0x89 |
synvox | 0:c04b49e0a678 | 47 | #define APDS9960_PIHT 0x8B |
synvox | 0:c04b49e0a678 | 48 | #define APDS9960_PERS 0x8C |
synvox | 0:c04b49e0a678 | 49 | #define APDS9960_CONFIG1 0x8D |
synvox | 0:c04b49e0a678 | 50 | #define APDS9960_PPULSE 0x8E |
synvox | 0:c04b49e0a678 | 51 | #define APDS9960_CONTROL 0x8F |
synvox | 0:c04b49e0a678 | 52 | #define APDS9960_CONFIG2 0x90 |
synvox | 0:c04b49e0a678 | 53 | #define APDS9960_ID 0x92 |
synvox | 0:c04b49e0a678 | 54 | #define APDS9960_STATUS 0x93 |
synvox | 0:c04b49e0a678 | 55 | #define APDS9960_CDATAL 0x94 |
synvox | 0:c04b49e0a678 | 56 | #define APDS9960_CDATAH 0x95 |
synvox | 0:c04b49e0a678 | 57 | #define APDS9960_RDATAL 0x96 |
synvox | 0:c04b49e0a678 | 58 | #define APDS9960_RDATAH 0x97 |
synvox | 0:c04b49e0a678 | 59 | #define APDS9960_GDATAL 0x98 |
synvox | 0:c04b49e0a678 | 60 | #define APDS9960_GDATAH 0x99 |
synvox | 0:c04b49e0a678 | 61 | #define APDS9960_BDATAL 0x9A |
synvox | 0:c04b49e0a678 | 62 | #define APDS9960_BDATAH 0x9B |
synvox | 0:c04b49e0a678 | 63 | #define APDS9960_PDATA 0x9C |
synvox | 0:c04b49e0a678 | 64 | #define APDS9960_POFFSET_UR 0x9D |
synvox | 0:c04b49e0a678 | 65 | #define APDS9960_POFFSET_DL 0x9E |
synvox | 0:c04b49e0a678 | 66 | #define APDS9960_CONFIG3 0x9F |
synvox | 0:c04b49e0a678 | 67 | #define APDS9960_GPENTH 0xA0 |
synvox | 0:c04b49e0a678 | 68 | #define APDS9960_GEXTH 0xA1 |
synvox | 0:c04b49e0a678 | 69 | #define APDS9960_GCONF1 0xA2 |
synvox | 0:c04b49e0a678 | 70 | #define APDS9960_GCONF2 0xA3 |
synvox | 0:c04b49e0a678 | 71 | #define APDS9960_GOFFSET_U 0xA4 |
synvox | 0:c04b49e0a678 | 72 | #define APDS9960_GOFFSET_D 0xA5 |
synvox | 0:c04b49e0a678 | 73 | #define APDS9960_GOFFSET_L 0xA7 |
synvox | 0:c04b49e0a678 | 74 | #define APDS9960_GOFFSET_R 0xA9 |
synvox | 0:c04b49e0a678 | 75 | #define APDS9960_GPULSE 0xA6 |
synvox | 0:c04b49e0a678 | 76 | #define APDS9960_GCONF3 0xAA |
synvox | 0:c04b49e0a678 | 77 | #define APDS9960_GCONF4 0xAB |
synvox | 0:c04b49e0a678 | 78 | #define APDS9960_GFLVL 0xAE |
synvox | 0:c04b49e0a678 | 79 | #define APDS9960_GSTATUS 0xAF |
synvox | 0:c04b49e0a678 | 80 | #define APDS9960_IFORCE 0xE4 |
synvox | 0:c04b49e0a678 | 81 | #define APDS9960_PICLEAR 0xE5 |
synvox | 0:c04b49e0a678 | 82 | #define APDS9960_CICLEAR 0xE6 |
synvox | 0:c04b49e0a678 | 83 | #define APDS9960_AICLEAR 0xE7 |
synvox | 0:c04b49e0a678 | 84 | #define APDS9960_GFIFO_U 0xFC |
synvox | 0:c04b49e0a678 | 85 | #define APDS9960_GFIFO_D 0xFD |
synvox | 0:c04b49e0a678 | 86 | #define APDS9960_GFIFO_L 0xFE |
synvox | 0:c04b49e0a678 | 87 | #define APDS9960_GFIFO_R 0xFF |
synvox | 0:c04b49e0a678 | 88 | |
synvox | 0:c04b49e0a678 | 89 | /* Bit fields */ |
synvox | 0:c04b49e0a678 | 90 | #define APDS9960_PON 0x01 //0b00000001 |
synvox | 0:c04b49e0a678 | 91 | #define APDS9960_AEN 0x02 //0b00000010 |
synvox | 0:c04b49e0a678 | 92 | #define APDS9960_PEN 0x04 //0b00000100 |
synvox | 0:c04b49e0a678 | 93 | #define APDS9960_WEN 0x08 //0b00001000 |
synvox | 0:c04b49e0a678 | 94 | #define APSD9960_AIEN 0x10 //0b00010000 |
synvox | 0:c04b49e0a678 | 95 | #define APDS9960_PIEN 0x20 //0b00100000 |
synvox | 0:c04b49e0a678 | 96 | #define APDS9960_GEN 0x40 //0b01000000 |
synvox | 0:c04b49e0a678 | 97 | #define APDS9960_GVALID 0x01 //0b00000001 |
synvox | 0:c04b49e0a678 | 98 | |
synvox | 0:c04b49e0a678 | 99 | /* On/Off definitions */ |
synvox | 0:c04b49e0a678 | 100 | #define OFF 0 |
synvox | 0:c04b49e0a678 | 101 | #define ON 1 |
synvox | 0:c04b49e0a678 | 102 | |
synvox | 0:c04b49e0a678 | 103 | /* Acceptable parameters for setMode */ |
synvox | 0:c04b49e0a678 | 104 | #define POWER 0 |
synvox | 0:c04b49e0a678 | 105 | #define AMBIENT_LIGHT 1 |
synvox | 0:c04b49e0a678 | 106 | #define PROXIMITY 2 |
synvox | 0:c04b49e0a678 | 107 | #define WAIT 3 |
synvox | 0:c04b49e0a678 | 108 | #define AMBIENT_LIGHT_INT 4 |
synvox | 0:c04b49e0a678 | 109 | #define PROXIMITY_INT 5 |
synvox | 0:c04b49e0a678 | 110 | #define GESTURE 6 |
synvox | 0:c04b49e0a678 | 111 | #define ALL_MODES 7 |
synvox | 0:c04b49e0a678 | 112 | |
synvox | 0:c04b49e0a678 | 113 | /* LED Drive values */ |
synvox | 0:c04b49e0a678 | 114 | #define LED_DRIVE_100MA 0 |
synvox | 0:c04b49e0a678 | 115 | #define LED_DRIVE_50MA 1 |
synvox | 0:c04b49e0a678 | 116 | #define LED_DRIVE_25MA 2 |
synvox | 0:c04b49e0a678 | 117 | #define LED_DRIVE_12_5MA 3 |
synvox | 0:c04b49e0a678 | 118 | |
synvox | 0:c04b49e0a678 | 119 | /* Proximity Gain (PGAIN) values */ |
synvox | 0:c04b49e0a678 | 120 | #define PGAIN_1X 0 |
synvox | 0:c04b49e0a678 | 121 | #define PGAIN_2X 1 |
synvox | 0:c04b49e0a678 | 122 | #define PGAIN_4X 2 |
synvox | 0:c04b49e0a678 | 123 | #define PGAIN_8X 3 |
synvox | 0:c04b49e0a678 | 124 | |
synvox | 0:c04b49e0a678 | 125 | /* ALS Gain (AGAIN) values */ |
synvox | 0:c04b49e0a678 | 126 | #define AGAIN_1X 0 |
synvox | 0:c04b49e0a678 | 127 | #define AGAIN_4X 1 |
synvox | 0:c04b49e0a678 | 128 | #define AGAIN_16X 2 |
synvox | 0:c04b49e0a678 | 129 | #define AGAIN_64X 3 |
synvox | 0:c04b49e0a678 | 130 | |
synvox | 0:c04b49e0a678 | 131 | /* Gesture Gain (GGAIN) values */ |
synvox | 0:c04b49e0a678 | 132 | #define GGAIN_1X 0 |
synvox | 0:c04b49e0a678 | 133 | #define GGAIN_2X 1 |
synvox | 0:c04b49e0a678 | 134 | #define GGAIN_4X 2 |
synvox | 0:c04b49e0a678 | 135 | #define GGAIN_8X 3 |
synvox | 0:c04b49e0a678 | 136 | |
synvox | 0:c04b49e0a678 | 137 | /* LED Boost values */ |
synvox | 0:c04b49e0a678 | 138 | #define LED_BOOST_100 0 |
synvox | 0:c04b49e0a678 | 139 | #define LED_BOOST_150 1 |
synvox | 0:c04b49e0a678 | 140 | #define LED_BOOST_200 2 |
synvox | 0:c04b49e0a678 | 141 | #define LED_BOOST_300 3 |
synvox | 0:c04b49e0a678 | 142 | |
synvox | 0:c04b49e0a678 | 143 | /* Gesture wait time values */ |
synvox | 0:c04b49e0a678 | 144 | #define GWTIME_0MS 0 |
synvox | 0:c04b49e0a678 | 145 | #define GWTIME_2_8MS 1 |
synvox | 0:c04b49e0a678 | 146 | #define GWTIME_5_6MS 2 |
synvox | 0:c04b49e0a678 | 147 | #define GWTIME_8_4MS 3 |
synvox | 0:c04b49e0a678 | 148 | #define GWTIME_14_0MS 4 |
synvox | 0:c04b49e0a678 | 149 | #define GWTIME_22_4MS 5 |
synvox | 0:c04b49e0a678 | 150 | #define GWTIME_30_8MS 6 |
synvox | 0:c04b49e0a678 | 151 | #define GWTIME_39_2MS 7 |
synvox | 0:c04b49e0a678 | 152 | |
synvox | 0:c04b49e0a678 | 153 | /* Default values */ |
synvox | 0:c04b49e0a678 | 154 | #define DEFAULT_ATIME 219 // 103ms |
synvox | 0:c04b49e0a678 | 155 | #define DEFAULT_WTIME 246 // 27ms |
synvox | 0:c04b49e0a678 | 156 | #define DEFAULT_PROX_PPULSE 0x87 // 16us, 8 pulses |
synvox | 0:c04b49e0a678 | 157 | #define DEFAULT_GESTURE_PPULSE 0x89 // 16us, 10 pulses |
synvox | 0:c04b49e0a678 | 158 | #define DEFAULT_POFFSET_UR 0 // 0 offset |
synvox | 0:c04b49e0a678 | 159 | #define DEFAULT_POFFSET_DL 0 // 0 offset |
synvox | 0:c04b49e0a678 | 160 | #define DEFAULT_CONFIG1 0x60 // No 12x wait (WTIME) factor |
synvox | 0:c04b49e0a678 | 161 | #define DEFAULT_LDRIVE LED_DRIVE_100MA |
synvox | 0:c04b49e0a678 | 162 | #define DEFAULT_PGAIN PGAIN_4X |
synvox | 0:c04b49e0a678 | 163 | #define DEFAULT_AGAIN AGAIN_4X |
synvox | 0:c04b49e0a678 | 164 | #define DEFAULT_PILT 0 // Low proximity threshold |
synvox | 0:c04b49e0a678 | 165 | #define DEFAULT_PIHT 50 // High proximity threshold |
synvox | 0:c04b49e0a678 | 166 | #define DEFAULT_AILT 0xFFFF // Force interrupt for calibration |
synvox | 0:c04b49e0a678 | 167 | #define DEFAULT_AIHT 0 |
synvox | 0:c04b49e0a678 | 168 | #define DEFAULT_PERS 0x11 // 2 consecutive prox or ALS for int. |
synvox | 0:c04b49e0a678 | 169 | #define DEFAULT_CONFIG2 0x01 // No saturation interrupts or LED boost |
synvox | 0:c04b49e0a678 | 170 | #define DEFAULT_CONFIG3 0 // Enable all photodiodes, no SAI |
synvox | 0:c04b49e0a678 | 171 | #define DEFAULT_GPENTH 40 // Threshold for entering gesture mode |
synvox | 0:c04b49e0a678 | 172 | #define DEFAULT_GEXTH 30 // Threshold for exiting gesture mode |
synvox | 0:c04b49e0a678 | 173 | #define DEFAULT_GCONF1 0x40 // 4 gesture events for int., 1 for exit |
synvox | 0:c04b49e0a678 | 174 | #define DEFAULT_GGAIN GGAIN_4X |
synvox | 0:c04b49e0a678 | 175 | #define DEFAULT_GLDRIVE LED_DRIVE_100MA |
synvox | 0:c04b49e0a678 | 176 | #define DEFAULT_GWTIME GWTIME_2_8MS |
synvox | 0:c04b49e0a678 | 177 | #define DEFAULT_GOFFSET 0 // No offset scaling for gesture mode |
synvox | 0:c04b49e0a678 | 178 | #define DEFAULT_GPULSE 0xC9 // 32us, 10 pulses |
synvox | 0:c04b49e0a678 | 179 | #define DEFAULT_GCONF3 0 // All photodiodes active during gesture |
synvox | 0:c04b49e0a678 | 180 | #define DEFAULT_GIEN 0 // Disable gesture interrupts |
synvox | 0:c04b49e0a678 | 181 | |
synvox | 0:c04b49e0a678 | 182 | /* Direction definitions */ |
synvox | 0:c04b49e0a678 | 183 | enum { |
synvox | 0:c04b49e0a678 | 184 | DIR_NONE, |
synvox | 0:c04b49e0a678 | 185 | DIR_LEFT, |
synvox | 0:c04b49e0a678 | 186 | DIR_RIGHT, |
synvox | 0:c04b49e0a678 | 187 | DIR_UP, |
synvox | 0:c04b49e0a678 | 188 | DIR_DOWN, |
synvox | 0:c04b49e0a678 | 189 | DIR_NEAR, |
synvox | 0:c04b49e0a678 | 190 | DIR_FAR, |
synvox | 0:c04b49e0a678 | 191 | DIR_ALL |
synvox | 0:c04b49e0a678 | 192 | }; |
synvox | 0:c04b49e0a678 | 193 | |
synvox | 0:c04b49e0a678 | 194 | /* State definitions */ |
synvox | 0:c04b49e0a678 | 195 | enum { |
synvox | 0:c04b49e0a678 | 196 | NA_STATE, |
synvox | 0:c04b49e0a678 | 197 | NEAR_STATE, |
synvox | 0:c04b49e0a678 | 198 | FAR_STATE, |
synvox | 0:c04b49e0a678 | 199 | ALL_STATE |
synvox | 0:c04b49e0a678 | 200 | }; |
synvox | 0:c04b49e0a678 | 201 | |
synvox | 0:c04b49e0a678 | 202 | /* Container for gesture data */ |
synvox | 0:c04b49e0a678 | 203 | typedef struct gesture_data_type { |
synvox | 0:c04b49e0a678 | 204 | uint8_t u_data[32]; |
synvox | 0:c04b49e0a678 | 205 | uint8_t d_data[32]; |
synvox | 0:c04b49e0a678 | 206 | uint8_t l_data[32]; |
synvox | 0:c04b49e0a678 | 207 | uint8_t r_data[32]; |
synvox | 0:c04b49e0a678 | 208 | uint8_t index; |
synvox | 0:c04b49e0a678 | 209 | uint8_t total_gestures; |
synvox | 0:c04b49e0a678 | 210 | uint8_t in_threshold; |
synvox | 0:c04b49e0a678 | 211 | uint8_t out_threshold; |
synvox | 0:c04b49e0a678 | 212 | } gesture_data_type; |
synvox | 0:c04b49e0a678 | 213 | |
synvox | 0:c04b49e0a678 | 214 | /* APDS9960 Class */ |
synvox | 0:c04b49e0a678 | 215 | class SparkFun_APDS9960 { |
synvox | 0:c04b49e0a678 | 216 | public: |
synvox | 0:c04b49e0a678 | 217 | |
synvox | 0:c04b49e0a678 | 218 | /* Initialization methods */ |
synvox | 0:c04b49e0a678 | 219 | SparkFun_APDS9960(I2C &i2c); |
synvox | 0:c04b49e0a678 | 220 | ~SparkFun_APDS9960(); |
synvox | 0:c04b49e0a678 | 221 | bool init(int apds_i2c_freq); |
synvox | 0:c04b49e0a678 | 222 | uint8_t getMode(); |
synvox | 0:c04b49e0a678 | 223 | bool setMode(uint8_t mode, uint8_t enable); |
synvox | 0:c04b49e0a678 | 224 | |
synvox | 0:c04b49e0a678 | 225 | /* Turn the APDS-9960 on and off */ |
synvox | 0:c04b49e0a678 | 226 | bool enablePower(); |
synvox | 0:c04b49e0a678 | 227 | bool disablePower(); |
synvox | 0:c04b49e0a678 | 228 | |
synvox | 0:c04b49e0a678 | 229 | /* Enable or disable specific sensors */ |
synvox | 0:c04b49e0a678 | 230 | bool enableLightSensor(bool interrupts = false); |
synvox | 0:c04b49e0a678 | 231 | bool disableLightSensor(); |
synvox | 0:c04b49e0a678 | 232 | bool enableProximitySensor(bool interrupts = false); |
synvox | 0:c04b49e0a678 | 233 | bool disableProximitySensor(); |
synvox | 0:c04b49e0a678 | 234 | bool enableGestureSensor(bool interrupts = true); |
synvox | 0:c04b49e0a678 | 235 | bool disableGestureSensor(); |
synvox | 0:c04b49e0a678 | 236 | |
synvox | 0:c04b49e0a678 | 237 | /* LED drive strength control */ |
synvox | 0:c04b49e0a678 | 238 | uint8_t getLEDDrive(); |
synvox | 0:c04b49e0a678 | 239 | bool setLEDDrive(uint8_t drive); |
synvox | 0:c04b49e0a678 | 240 | uint8_t getGestureLEDDrive(); |
synvox | 0:c04b49e0a678 | 241 | bool setGestureLEDDrive(uint8_t drive); |
synvox | 0:c04b49e0a678 | 242 | |
synvox | 0:c04b49e0a678 | 243 | /* Gain control */ |
synvox | 0:c04b49e0a678 | 244 | uint8_t getAmbientLightGain(); |
synvox | 0:c04b49e0a678 | 245 | bool setAmbientLightGain(uint8_t gain); |
synvox | 0:c04b49e0a678 | 246 | uint8_t getProximityGain(); |
synvox | 0:c04b49e0a678 | 247 | bool setProximityGain(uint8_t gain); |
synvox | 0:c04b49e0a678 | 248 | uint8_t getGestureGain(); |
synvox | 0:c04b49e0a678 | 249 | bool setGestureGain(uint8_t gain); |
synvox | 0:c04b49e0a678 | 250 | |
synvox | 0:c04b49e0a678 | 251 | /* Get and set light interrupt thresholds */ |
synvox | 0:c04b49e0a678 | 252 | bool getLightIntLowThreshold(uint16_t &threshold); |
synvox | 0:c04b49e0a678 | 253 | bool setLightIntLowThreshold(uint16_t threshold); |
synvox | 0:c04b49e0a678 | 254 | bool getLightIntHighThreshold(uint16_t &threshold); |
synvox | 0:c04b49e0a678 | 255 | bool setLightIntHighThreshold(uint16_t threshold); |
synvox | 0:c04b49e0a678 | 256 | |
synvox | 0:c04b49e0a678 | 257 | /* Get and set proximity interrupt thresholds */ |
synvox | 0:c04b49e0a678 | 258 | bool getProximityIntLowThreshold(uint8_t &threshold); |
synvox | 0:c04b49e0a678 | 259 | bool setProximityIntLowThreshold(uint8_t threshold); |
synvox | 0:c04b49e0a678 | 260 | bool getProximityIntHighThreshold(uint8_t &threshold); |
synvox | 0:c04b49e0a678 | 261 | bool setProximityIntHighThreshold(uint8_t threshold); |
synvox | 0:c04b49e0a678 | 262 | |
synvox | 0:c04b49e0a678 | 263 | /* Get and set interrupt enables */ |
synvox | 0:c04b49e0a678 | 264 | uint8_t getAmbientLightIntEnable(); |
synvox | 0:c04b49e0a678 | 265 | bool setAmbientLightIntEnable(uint8_t enable); |
synvox | 0:c04b49e0a678 | 266 | uint8_t getProximityIntEnable(); |
synvox | 0:c04b49e0a678 | 267 | bool setProximityIntEnable(uint8_t enable); |
synvox | 0:c04b49e0a678 | 268 | uint8_t getGestureIntEnable(); |
synvox | 0:c04b49e0a678 | 269 | bool setGestureIntEnable(uint8_t enable); |
synvox | 0:c04b49e0a678 | 270 | |
synvox | 0:c04b49e0a678 | 271 | /* Clear interrupts */ |
synvox | 0:c04b49e0a678 | 272 | bool clearAmbientLightInt(); |
synvox | 0:c04b49e0a678 | 273 | bool clearProximityInt(); |
synvox | 0:c04b49e0a678 | 274 | |
synvox | 0:c04b49e0a678 | 275 | /* Ambient light methods */ |
synvox | 0:c04b49e0a678 | 276 | bool readAmbientLight(uint16_t &val); |
synvox | 0:c04b49e0a678 | 277 | bool readRedLight(uint16_t &val); |
synvox | 0:c04b49e0a678 | 278 | bool readGreenLight(uint16_t &val); |
synvox | 0:c04b49e0a678 | 279 | bool readBlueLight(uint16_t &val); |
synvox | 0:c04b49e0a678 | 280 | |
synvox | 0:c04b49e0a678 | 281 | /* Proximity methods */ |
synvox | 0:c04b49e0a678 | 282 | bool readProximity(uint8_t &val); |
synvox | 0:c04b49e0a678 | 283 | |
synvox | 0:c04b49e0a678 | 284 | /* Gesture methods */ |
synvox | 0:c04b49e0a678 | 285 | bool isGestureAvailable(); |
synvox | 0:c04b49e0a678 | 286 | int readGesture(); |
synvox | 0:c04b49e0a678 | 287 | |
synvox | 0:c04b49e0a678 | 288 | private: |
synvox | 0:c04b49e0a678 | 289 | |
synvox | 0:c04b49e0a678 | 290 | /* Gesture processing */ |
synvox | 0:c04b49e0a678 | 291 | void resetGestureParameters(); |
synvox | 0:c04b49e0a678 | 292 | bool processGestureData(); |
synvox | 0:c04b49e0a678 | 293 | bool decodeGesture(); |
synvox | 0:c04b49e0a678 | 294 | |
synvox | 0:c04b49e0a678 | 295 | /* Proximity Interrupt Threshold */ |
synvox | 0:c04b49e0a678 | 296 | uint8_t getProxIntLowThresh(); |
synvox | 0:c04b49e0a678 | 297 | bool setProxIntLowThresh(uint8_t threshold); |
synvox | 0:c04b49e0a678 | 298 | uint8_t getProxIntHighThresh(); |
synvox | 0:c04b49e0a678 | 299 | bool setProxIntHighThresh(uint8_t threshold); |
synvox | 0:c04b49e0a678 | 300 | |
synvox | 0:c04b49e0a678 | 301 | /* LED Boost Control */ |
synvox | 0:c04b49e0a678 | 302 | uint8_t getLEDBoost(); |
synvox | 0:c04b49e0a678 | 303 | bool setLEDBoost(uint8_t boost); |
synvox | 0:c04b49e0a678 | 304 | |
synvox | 0:c04b49e0a678 | 305 | /* Proximity photodiode select */ |
synvox | 0:c04b49e0a678 | 306 | uint8_t getProxGainCompEnable(); |
synvox | 0:c04b49e0a678 | 307 | bool setProxGainCompEnable(uint8_t enable); |
synvox | 0:c04b49e0a678 | 308 | uint8_t getProxPhotoMask(); |
synvox | 0:c04b49e0a678 | 309 | bool setProxPhotoMask(uint8_t mask); |
synvox | 0:c04b49e0a678 | 310 | |
synvox | 0:c04b49e0a678 | 311 | /* Gesture threshold control */ |
synvox | 0:c04b49e0a678 | 312 | uint8_t getGestureEnterThresh(); |
synvox | 0:c04b49e0a678 | 313 | bool setGestureEnterThresh(uint8_t threshold); |
synvox | 0:c04b49e0a678 | 314 | uint8_t getGestureExitThresh(); |
synvox | 0:c04b49e0a678 | 315 | bool setGestureExitThresh(uint8_t threshold); |
synvox | 0:c04b49e0a678 | 316 | |
synvox | 0:c04b49e0a678 | 317 | /* Gesture LED, gain, and time control */ |
synvox | 0:c04b49e0a678 | 318 | uint8_t getGestureWaitTime(); |
synvox | 0:c04b49e0a678 | 319 | bool setGestureWaitTime(uint8_t time); |
synvox | 0:c04b49e0a678 | 320 | |
synvox | 0:c04b49e0a678 | 321 | /* Gesture mode */ |
synvox | 0:c04b49e0a678 | 322 | uint8_t getGestureMode(); |
synvox | 0:c04b49e0a678 | 323 | bool setGestureMode(uint8_t mode); |
synvox | 0:c04b49e0a678 | 324 | |
synvox | 0:c04b49e0a678 | 325 | /* Raw I2C Commands */ |
synvox | 0:c04b49e0a678 | 326 | bool wireWriteByte(uint8_t val); |
synvox | 0:c04b49e0a678 | 327 | bool wireWriteDataByte(uint8_t reg, uint8_t val); |
synvox | 0:c04b49e0a678 | 328 | //bool wireWriteDataBlock(uint8_t reg, uint8_t *val, unsigned int len); |
synvox | 0:c04b49e0a678 | 329 | bool wireReadDataByte(uint8_t reg, uint8_t &val); |
synvox | 0:c04b49e0a678 | 330 | int wireReadDataBlock(uint8_t reg, uint8_t *val, unsigned int len); |
synvox | 0:c04b49e0a678 | 331 | |
synvox | 0:c04b49e0a678 | 332 | /* Members */ |
synvox | 0:c04b49e0a678 | 333 | I2C &apds_i2c; |
synvox | 0:c04b49e0a678 | 334 | gesture_data_type gesture_data_; |
synvox | 0:c04b49e0a678 | 335 | int gesture_ud_delta_; |
synvox | 0:c04b49e0a678 | 336 | int gesture_lr_delta_; |
synvox | 0:c04b49e0a678 | 337 | int gesture_ud_count_; |
synvox | 0:c04b49e0a678 | 338 | int gesture_lr_count_; |
synvox | 0:c04b49e0a678 | 339 | int gesture_near_count_; |
synvox | 0:c04b49e0a678 | 340 | int gesture_far_count_; |
synvox | 0:c04b49e0a678 | 341 | int gesture_state_; |
synvox | 0:c04b49e0a678 | 342 | int gesture_motion_; |
synvox | 0:c04b49e0a678 | 343 | }; |
synvox | 0:c04b49e0a678 | 344 | |
synvox | 0:c04b49e0a678 | 345 | #endif |