Vishay VEML6040 Color RGB sensor I2C driver library

Dependents:   test_VEML6040 testSensor

Revision:
1:5540b216acfc
Parent:
0:e6e6107c659e
Child:
2:239c3561d21a
--- a/VEML6040.cpp	Fri Feb 05 02:21:10 2016 +0000
+++ b/VEML6040.cpp	Wed Mar 08 04:45:35 2017 +0000
@@ -18,8 +18,8 @@
 #define REG_W_Data  0x0B
 
 // Following magic numbers are from 
-// VISHAY veml6075 Application Note 84339
-// Page 6 
+// VISHAY veml6040 Application Note 84331
+// Page 4 
 #define LUX_RESOLUTION_0  (0.25168)
 #define LUX_RESOLUTION_1  (0.12584)
 #define LUX_RESOLUTION_2  (0.06292)
@@ -27,6 +27,25 @@
 #define LUX_RESOLUTION_4  (0.01573)
 #define LUX_RESOLUTION_5  (0.007865)
 
+// Following magic numbers are from 
+// VISHAY veml6040 Application Note 84331
+// Page 9 
+#define CORR_COEFF_M0  (0.048403)
+#define CORR_COEFF_M1  (0.183633)
+#define CORR_COEFF_M2  (-0.253589)
+#define CORR_COEFF_M3  (0.022916)
+#define CORR_COEFF_M4  (0.176388)
+#define CORR_COEFF_M5  (-0.183205)
+#define CORR_COEFF_M6  (-0.077436)
+#define CORR_COEFF_M7  (0.124541)
+#define CORR_COEFF_M8  (0.032081)
+
+// Following magic numbers are from 
+// VISHAY veml6040 Application Note 84331
+// Page 10
+#define CCT_CONST  (4278.6)
+#define OFFSET_OPEN_AIR  (0.5)
+
 VEML6040::VEML6040(PinName sda, PinName scl, int addr) : m_i2c(sda, scl), m_addr(addr<<1) {
     // activate the peripheral
 }
@@ -144,6 +163,95 @@
     return( value ) ;
 }
 
+float VEML6040::getX(void) 
+{
+    uint16_t R ;
+    uint16_t G ;
+    uint16_t B ;
+    float value ;
+    getRData(&R) ;
+    getGData(&G) ;
+    getBData(&B) ;
+    value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ;
+    return( value ) ;
+}
+
+float VEML6040::getY(void) 
+{
+    uint16_t R ;
+    uint16_t G ;
+    uint16_t B ;
+    float value ;
+    getRData(&R) ;
+    getGData(&G) ;
+    getBData(&B) ;
+    value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ;
+    return( value ) ;
+}
+
+float VEML6040::getZ(void) 
+{
+    uint16_t R ;
+    uint16_t G ;
+    uint16_t B ;
+    float value ;
+    getRData(&R) ;
+    getGData(&G) ;
+    getBData(&B) ;
+    value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ;
+    return( value ) ;
+}
+
+float VEML6040::getCCTiData(void) 
+{
+    uint16_t rdata ;
+    uint16_t gdata ;
+    uint16_t bdata ;
+    float value ;
+    getRData(&rdata) ;
+    getGData(&gdata) ;
+    getBData(&bdata) ;
+    value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ;
+    return( value ) ;
+}
+
+float VEML6040::getCCTData(void) 
+{
+//    uint16_t cctidata ;
+    float cctidata ;
+    float value ;
+    cctidata = getCCTiData() ;
+//    getCCTiData(&cctidata) ;
+    value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ;
+    return( value ) ;
+}
+
+float VEML6040::getCIEX(void) 
+{
+    float X ;
+    float Y ;
+    float Z ;
+    float value ;
+    X = getX() ;
+    Y = getY() ;
+    Z = getZ() ; 
+    value = (float)X / ((float)X + (float)Y + (float)Z) ;
+    return( value ) ;
+}
+
+float VEML6040::getCIEY(void) 
+{
+    float X ;
+    float Y ;
+    float Z ;
+    float value ;
+    X = getX() ;
+    Y = getY() ;
+    Z = getZ() ; 
+    value = (float)Y / ((float)X + (float)Y + (float)Z) ;
+    return( value ) ;
+}
+
 void VEML6040::readRegs(int addr, uint8_t * data, int len) {
     char t[1] = {addr};
     m_i2c.write(m_addr, t, 1, true);