Vishay VCNL4010 Fully Integrated Proximity and Ambient Light Sensor with Infrared Emitter, I2C Interface, and Interrupt Function

Dependents:   test_VCNL4010

VCNL4010.h

Committer:
Rhyme
Date:
2017-04-26
Revision:
1:238c76a37054
Parent:
0:cf922a073b7f

File content as of revision 1:238c76a37054:

#ifndef _VCNL4010_H_
#define _VCNL4010_H_
/**
 * VCNL4010 Fully Integrated Proximity and Ambient Light Sensor with
 * Infrared Emitter, I2C Interface, and Interrupt Function
 */
  
class VCNL4010
{
public:
  /**
  * VCNL4010 constructor
  *
  * @param sda SDA pin
  * @param sdl SCL pin
  * @param addr addr of the I2C peripheral
  */
  VCNL4010(PinName sda, PinName scl, int addr);

  /**
  * VCNL4010 destructor
  */
  ~VCNL4010();

/**
 * Get Command Register
 * @param none
 * @returns uint8_t command register value (Register #0)
 * @note Register #0 Command Register (0x80)
 * @note bit[7] config_lock
 * @note bit[6] als_data_rdy
 * @note bit[5] prox_data_rdy
 * @note bit[4] als_od
 * @note bit[3] prox_od
 * @note bit[2] als_en
 * @note bit[1] prox_en
 * @note bit[0] selftimed_en
 */
uint8_t  getCommandReg(void) ;

/**
 * Set Command Register
 * @param uint8_t value to set
 * @returns none
 */
void     setCommandReg(uint8_t cmd) ;

/**
 * Get Prodcut ID (and Revision)
 * @param none
 * @returns Product ID and Revision Register (Register #1)
 * @note Register #1 Product ID Revision Register (0x81)
 * @note bit[7:4] Product ID
 * @note bit[3:0] Revision ID
 */
uint8_t  getProductID(void) ;

/**
 * Get Rate of Proximity Measurement
 * @param none
 * @returns Rate of Proximity Measurement (Register #2)
 * @note Register #2 Rate of Proximity Measurement (0x82)
 * @note bit[7:3] (n/a)
 * @note bit[2:0] Rate of Proximity Measurement
 * @note 000 -  1.95     measurements/s (DEFAULT)
 * @note 001 -  3.960625 measurements/s
 * @note 010 -  7.8125   measurements/s
 * @note 011 - 16.625    measurements/s
 * @note 100 - 31.25     measurements/s
 * @note 101 - 62.5      measurements/s
 * @note 110 - 125       measurements/s
 * @note 111 - 250       measurements/s
 */
uint8_t  getProxRate(void) ;

/**
 * Set Rate of Proximity Measurement
 * @param Rate of Proximity Measurement
 * @returns none
 */
void     setProxRate(uint8_t rate) ;

/**
 * Get IR LED Current Setting for Proximity Mode
 * @param none
 * @returns IR LED Current Settings (Register #3)
 * @note bit[7:6] Fuse prog ID
 * @note bit[5:0] IR LED current value
 * @note IR LED current = value(dec.) x 10mA
 * @note Valid Range = 0 to 20d.
 * @note 0 = 0mA, 1 = 10mA .. 20 = 200mA ((DEFAULT: 2 = 20mA)
 */ 
uint8_t  getIrLedCurrent(void) ;

/**
 * Set IR LED Current Setting for Proximity Mode
 * @param value to set
 * @returns none
 */
void     setIrLedCurrent(uint8_t IrLedCur) ;

/**
 * Get Ambient Light Parameter 
 * @param none
 * @returns Ambient Light Parameter (Register #4)
 * @note Register #4 Ambient Light Parameter Register (0x84)
 * @note bit[7]   Continuous conversion mode 0: Disable = DEFAULT 1: Enable
 * @note bit[6:4] als_rate
 * @note bit[3]   Auto offset compensation 0: Disable 1: Enable = DEFAULT
 * @note bit[2:0] Averaging function (number of measurements per run)
 * @note als_rate Ambient light measurement rate
 * @note 000 - 1 samples/s
 * @note 001 - 2 samples/s = DEFUAULT
 * @note 010 - 3 samples/s
 * @note 011 - 4 samples/s
 * @note 100 - 5 samples/s
 * @note 101 - 6 samples/s
 * @note 110 - 8 samples/s
 * @note 111 - 10 samples/s
 * @note Averaging function
 * @note Number of conversions = 2^decimal_value
 * @note 0 = 1 conv, 1 = 2 conv, 2 = 4 conv, .. t = 32 conv (DEFAULT) .. 7 = 128 conv
 */ 
uint8_t  getAlsParam(void) ;

/** 
 * Set Ambient Light Parameter
 * @param uint8_t value to set
 * @returns none
 */
void     setAlsParam(uint8_t param) ;

/** 
 * Get Ambient Light Result
 * @param none
 * @returns uint16_t the value of Ambient Light Result (Register #5, #6)
 * @note Register #5 and #6 Ambient Light Result Register (0x85, 0x86)
 * @note bit[15:8] MSB (address 0x85)
 * @note bit[7:0]  LSB (address 0x86)
 */
uint16_t getAls(void) ;

/** 
 * Get Proximity Measurement Result 
 * @param none
 * @returns uint16_t the value of Proximity Measurement Result (Register #7, #8)
 * @note Register #7 and #8 Proximity Measurement Result Register (0x87, 0x88)
 * @note bit[15:8] MSB (address 0x87)
 * @note bit[7:0]  LSB (address 0x88)
 */
uint16_t getProx(void) ;

/**
 * Get Interrupt Control Register value
 * @param none
 * @returns uint8_t the value of Interraupt Control (Register #9)
 * @note Register #9 Interrupt Control Register (0x89)
 * @note bit[7:5] Interrupt Count Exceed
 * @note bit[4] (n/a)
 * @note bit[3] INT_PROX_ready_EN Eneables interrupt generation at proximity data ready
 * @note bit[2] INT_ALS_ready_EN Enables interrupt generation at ambient data ready
 * @note bit[1] INT_THRES_EN Enables interrupt generation when high or low threshold is exceeded
 * @note bit[0] INT_THRES_SEL Thresholds are applied to 0:proximity 1:als measurement
 * @note Interrupt Count Exceed
 * @note 000 -   1 count = DEFAULT
 * @note 001 -   2 count
 * @note 010 -   4 count
 * @note 011 -   8 count
 * @note 100 -  16 count
 * @note 101 -  32 count
 * @note 110 -  64 count 
 * @note 111 - 128 count
 */ 
uint8_t  getIntCtrl(void) ;

/**
 * Set Interrupt Control Register
 * @param uint8_t the value to set
 * @returns none
 */
void     setIntCtrl(uint8_t ctrl) ;

/**
 * Get Low Threshold
 * @param none
 * @returns uint16_t Low Threshold (Register #10, #11)
 * @note Register #10 and #11 Low Threshold (0x8A, 0x8B)
 * @note bit[15:8] MSB (address 0x8A)
 * @note bit[7:0]  LSB (address 0x8B)
 */ 
uint16_t getLowThreshold(void) ;

/**
 * Set Low Threshold
 * @param uint16_t value to set
 * @returns none
 */
void     setLowThreshold(uint16_t thr) ;

/**
 * Get High Threshold
 * @param none
 * @returns uint16_t High Threshold (Register #12, #13)
 * @note Register #12 and #13 High Threshold (0x8C, 0x8D)
 * @note bit[15:8] MSB (address 0x8C)
 * @note bit[7:0]  LSB (address 0x8D)
 */
uint16_t getHighThreshold(void) ;

/**
 * Set High Threshold
 * @param uint16_t value to set
 * @returns none
 */
void     setHighThreshold(uint16_t thr) ;

/**
 * Get Interrupt Status
 * @param none
 * @returns uint8_t Interrupt Status (Register #14)
 * @note Register #14 Interrupt Status (0x8E)
 * @note bit[7:4] (n/a)
 * @note bit[3] int_prox_ready
 * @note bit[2] int_als_ready
 * @note bit[1] int_th_low
 * @note bit[0] int_th_hi
 * @note Once an interrupt is generated the corresponding status bit
 * @note goes to 1 and stays there unless it is cleared by writing a 1
 * @note in the corresponding bit.
 */
uint8_t  getIntStatus(void) ;

/**
 * Set Interrupt Status
 * @param uint8_t value to set
 * @returns none
 */
void     setIntStatus(uint8_t status) ;

/**
 * Get Proximity Modulator Timing Adjustment
 * @param none
 * @returns Proximity Modulator Timing Adjustment (Register #15)
 * @note Register #15 Proximity Modulator Timing Adjustment (0x8F) 
 * @note bit[7:5] Modulation delay time
 * @note bit[4:3] Proximity frequency
 * @note bit[2:0] Modulation deat time
 * @note The settings for best performance will be provided by Vishay.
 * @note With first samples this is evaluated to:
 * @note delay time = 0
 * @note frequency = 0 
 * @note deat time = 1 
 * @note With that Register #15 should be programmed with 1 (= default value).
 */ 
uint8_t  getProxModTiming(void) ;

/**
 * Set Proximity Modulator Timing Adjustment
 * @param uint8_t value to set
 * @returns none
 */
void     setProxModTiming(uint8_t timing) ;

private:
  I2C m_i2c;
  int m_addr;
  void readRegs(int addr, uint8_t * data, int len);
  void writeRegs(uint8_t * data, int len);
}; 

#endif /* _VCNL4010_H_ */