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