Library for SparkFun APDS9960 Only gesture sensor checked for now.

Dependents:   SparkFun_APDS9960_Sample IoT-Polytech-Upmc

Fork of SparkFun_APDS9960 by devsar devsar

Ported SparkFun APDS9960 breakout board Arduino Library to mbed platform. Tested for gesture sensor using HRM1017.

SparkFun APDS9960: https://www.sparkfun.com/products/12787

Distributor (Japan): https://www.switch-science.com/catalog/2085/

Credits: Shawn Hymel (SparkFun Electronics) for original Arduino Library.

PS. I'm not affiliated with any of the above company.

Committer:
devsar
Date:
Sun Apr 05 13:48:45 2015 +0000
Revision:
0:830ac1db5bf7
Initial Release.; Use Interrupt to detect.; Only check gesture sensor. (will test other sensor later)

Who changed what in which revision?

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