Vishay VEML6040 Color RGB sensor I2C driver library

Dependents:   test_VEML6040 testSensor

Revision:
0:e6e6107c659e
Child:
1:5540b216acfc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VEML6040.cpp	Fri Feb 05 02:21:10 2016 +0000
@@ -0,0 +1,155 @@
+/*
+ * File description here
+ */
+#include "VEML6040.h"
+
+/* VEML6075 SLAVE ADDRESS AND FUNCTION DESCRIPTION */
+#define REG_COLOR_CONF  0x00
+#define REG_Reserved1  0x01
+#define REG_Reserved2  0x02
+#define REG_Reserved3  0x03
+#define REG_Reserved4  0x04
+#define REG_Reserved5  0x05
+#define REG_Reserved6  0x06
+#define REG_Reserved7  0x07
+#define REG_R_Data  0x08
+#define REG_G_Data  0x09
+#define REG_B_Data  0x0A
+#define REG_W_Data  0x0B
+
+// Following magic numbers are from 
+// VISHAY veml6075 Application Note 84339
+// Page 6 
+#define LUX_RESOLUTION_0  (0.25168)
+#define LUX_RESOLUTION_1  (0.12584)
+#define LUX_RESOLUTION_2  (0.06292)
+#define LUX_RESOLUTION_3  (0.03146)
+#define LUX_RESOLUTION_4  (0.01573)
+#define LUX_RESOLUTION_5  (0.007865)
+
+VEML6040::VEML6040(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
+    // activate the peripheral
+}
+
+VEML6040::~VEML6040() { }
+
+#if 0
+//
+// numdata is supposed to be 2
+//
+void VEML6040::cmdWrite(uint8_t cmd, uint8_t *data, uint8_t numdata)
+{
+   uint8_t buf[3] ;
+
+    buf[0] = cmd ;
+    buf[1] = data[0] ;
+    buf[2] = data[1] ;
+    writeRegs(data, 3) ;
+}
+
+//
+// numdata is supposed to be 2
+//
+
+void VEML6040::cmdRead(uint8_t cmd, uint8_t *data, uint8_t numdata)
+{
+    uint8_t buf[1] ;
+    buf[0] = cmd ;
+    m_i2c.write(m_addr, buf, 1, true) ; // writing command 
+    m_i2c.read(m_addr, (char*)data, numdata) ;
+}
+#endif 
+
+void VEML6040::getCOLORConf(uint8_t *colorconf)
+{
+    uint8_t data[2] ;
+    readRegs(REG_COLOR_CONF, data, 2) ;
+    *colorconf = data[1] ;
+}
+
+void VEML6040::setCOLORConf(uint8_t colorconf)
+{
+     uint8_t data[3] ;
+     data[0] = REG_COLOR_CONF ;
+     data[1] = colorconf ;
+     data[2] = 0 ;
+     writeRegs(data, 3) ;
+}
+
+
+void VEML6040::getRData(uint16_t *rdata)
+{
+    uint8_t data[2] ;
+    readRegs(REG_R_Data, data, 2) ;
+    *rdata = (data[1]<<8) | data[0] ;
+}
+
+void VEML6040::getGData(uint16_t *gdata)
+{
+    uint8_t data[2] ;
+    readRegs(REG_G_Data, data, 2) ;
+    *gdata = (data[1]<<8) | data[0] ;
+}
+
+void VEML6040::getBData(uint16_t *bdata)
+{
+    uint8_t data[2] ;
+    readRegs(REG_B_Data, data, 2) ;
+    *bdata = (data[1]<<8) | data[0] ;
+}
+
+void VEML6040::getWData(uint16_t *wdata)
+{
+    uint8_t data[2] ;
+    readRegs(REG_W_Data, data, 2) ;
+    *wdata = (data[1]<<8) | data[0] ;
+}
+
+// usage
+// fvalue = veml->getUVA() ;
+// printf("%f", fvalue) ;
+float VEML6040::getR(void) 
+{
+    uint16_t data ;
+    float value ;
+    getRData(&data) ;
+    value = (float)LUX_RESOLUTION_0 * (float)data ;
+    return( value ) ;
+}
+
+float VEML6040::getG(void) 
+{
+    uint16_t data ;
+    float value ;
+    getGData(&data) ;
+    value = (float)LUX_RESOLUTION_0 * (float)data ;
+    return( value ) ;
+}
+
+float VEML6040::getB(void) 
+{
+    uint16_t data ;
+    float value ;
+    getBData(&data) ;
+    value = (float)LUX_RESOLUTION_0 * (float)data ;
+    return( value ) ;
+}
+
+float VEML6040::getW(void) 
+{
+    uint16_t data ;
+    float value ;
+    getWData(&data) ;
+    value = (float)LUX_RESOLUTION_0 * (float)data ;
+    return( value ) ;
+}
+
+void VEML6040::readRegs(int addr, uint8_t * data, int len) {
+    char t[1] = {addr};
+    m_i2c.write(m_addr, t, 1, true);
+    m_i2c.read(m_addr, (char *)data, len);
+}
+
+void VEML6040::writeRegs(uint8_t * data, int len) {
+    m_i2c.write(m_addr, (char *)data, len);
+}
\ No newline at end of file