A library for the combined proximity, ambient light, RGB color and gesture sensor Avago APDS9960. Tested with corresponding breakout board from SparkFun.

Dependents:   mbed_blinky

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:

Committer:
synvox
Date:
Fri Apr 10 13:21:48 2015 +0000
Revision:
0:c04b49e0a678
first working version

Who changed what in which revision?

UserRevisionLine numberNew 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