La Suno / Mbed 2 deprecated afero_poc15_180216

Dependencies:   UniGraphic mbed vt100

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers VEML6040.cpp Source File

VEML6040.cpp

00001 /*
00002  * File description here
00003  */
00004 #include "VEML6040.h"
00005 #include "af_mgr.h"
00006 
00007 /* VEML6075 SLAVE ADDRESS AND FUNCTION DESCRIPTION */
00008 #define REG_COLOR_CONF  0x00
00009 #define REG_Reserved1  0x01
00010 #define REG_Reserved2  0x02
00011 #define REG_Reserved3  0x03
00012 #define REG_Reserved4  0x04
00013 #define REG_Reserved5  0x05
00014 #define REG_Reserved6  0x06
00015 #define REG_Reserved7  0x07
00016 #define REG_R_Data  0x08
00017 #define REG_G_Data  0x09
00018 #define REG_B_Data  0x0A
00019 #define REG_W_Data  0x0B
00020 
00021 // Following magic numbers are from 
00022 // VISHAY VEML6040 Application Note 84331
00023 // Page 4 
00024 #define LUX_RESOLUTION_0  (0.25168)
00025 #define LUX_RESOLUTION_1  (0.12584)
00026 #define LUX_RESOLUTION_2  (0.06292)
00027 #define LUX_RESOLUTION_3  (0.03146)
00028 #define LUX_RESOLUTION_4  (0.01573)
00029 #define LUX_RESOLUTION_5  (0.007865)
00030 
00031 // Following magic numbers are from 
00032 // VISHAY VEML6040 Application Note 84331
00033 // Page 9 
00034 #define CORR_COEFF_M0  (0.048403)
00035 #define CORR_COEFF_M1  (0.183633)
00036 #define CORR_COEFF_M2  (-0.253589)
00037 #define CORR_COEFF_M3  (0.022916)
00038 #define CORR_COEFF_M4  (0.176388)
00039 #define CORR_COEFF_M5  (-0.183205)
00040 #define CORR_COEFF_M6  (-0.077436)
00041 #define CORR_COEFF_M7  (0.124541)
00042 #define CORR_COEFF_M8  (0.032081)
00043 
00044 // Following magic numbers are from 
00045 // VISHAY VEML6040 Application Note 84331
00046 // Page 10
00047 #define CCT_CONST  (4278.6)
00048 #define OFFSET_OPEN_AIR  (0.5)
00049 
00050 VEML6040::VEML6040(I2C *i2c, int addr) : m_addr(addr<<1) {
00051     p_i2c = i2c ;
00052     p_i2c->frequency(100000); /* 100kHz */
00053     // activate the peripheral
00054 }
00055 
00056 VEML6040::~VEML6040() { }
00057 
00058 /**
00059  * set COLOR Config
00060  * @param colorconf uint8_t 8bit register value
00061  * @returns 0: success non-0: failure
00062  * @note Command Code 0x00 is used to access CONF register
00063  * @note bit[7] (reserved)
00064  * @note bit[6:4] = IT[2:0] Integration Time Selector
00065  * @note bit[3] (reserved)
00066  * @note bit[2] TRIG Proceed one detcting cycle at manual force mode
00067  * @note bit[1] AF 0: Auto mode 1: manual force mode
00068  * @note bit[0] SD 0: normal 1: chip shutdown setting
00069  *
00070  * @note IT[2:0] 0=40ms, 1=80ms, 2=160ms, 3=320ms, 4=640ms, 5=1280ms
00071  * @note as our WatchDog is set to 1sec, 1280ms is invalid
00072  * @note and 640ms may not be practical
00073  */
00074 int VEML6040::setCOLORConf(uint8_t colorconf)
00075 {
00076      int result ;
00077      uint8_t data[3] ;
00078      data[0] = REG_COLOR_CONF ;
00079      data[1] = colorconf ;
00080      data[2] = 0 ;
00081      result = writeRegs(data, 3) ;
00082      return( result ) ;
00083 }
00084 
00085 /**
00086  * get COLOR Config
00087  * @param *colorconf uint8_t refer to setCOLORConf for the value
00088  * @returns 0: success non-0: failure
00089  */
00090 int VEML6040::getCOLORConf(uint8_t *colorconf)
00091 {
00092     int result ;
00093     uint8_t data[2] ;
00094     result = readRegs(REG_COLOR_CONF, data, 2) ;
00095     if (result == 0) {
00096         *colorconf = data[0] ;
00097     }
00098     return( result ) ;
00099 }
00100 
00101 
00102 
00103 int VEML6040::getRData(uint16_t *rdata)
00104 {
00105     uint8_t data[2] ;
00106     int result ;
00107     result = readRegs(REG_R_Data, data, 2) ;
00108     *rdata = (data[1]<<8) | data[0] ;
00109     return( result ) ;
00110 }
00111 
00112 int VEML6040::getGData(uint16_t *gdata)
00113 {
00114     uint8_t data[2] ;
00115     int result ;
00116     result = readRegs(REG_G_Data, data, 2) ;
00117     *gdata = (data[1]<<8) | data[0] ;
00118     return( result ) ;
00119 }
00120 
00121 int VEML6040::getBData(uint16_t *bdata)
00122 {
00123     uint8_t data[2] ;
00124     int result ;
00125     result = readRegs(REG_B_Data, data, 2) ;
00126     *bdata = (data[1]<<8) | data[0] ;
00127     return( result ) ;
00128 }
00129 
00130 int VEML6040::getWData(uint16_t *wdata)
00131 {
00132     uint8_t data[2] ;
00133     int result ;
00134     result = readRegs(REG_W_Data, data, 2) ;
00135     *wdata = (data[1]<<8) | data[0] ;
00136     return( result ) ;
00137 }
00138 
00139 // usage
00140 // fvalue = veml->getUVA() ;
00141 // printf("%f", fvalue) ;
00142 float VEML6040::getR(void) 
00143 {
00144     uint16_t data ;
00145     float value ;
00146     getRData(&data) ;
00147     value = (float)LUX_RESOLUTION_0 * (float)data ;
00148     return( value ) ;
00149 }
00150 
00151 float VEML6040::getG(void) 
00152 {
00153     uint16_t data ;
00154     float value ;
00155     getGData(&data) ;
00156     value = (float)LUX_RESOLUTION_0 * (float)data ;
00157     return( value ) ;
00158 }
00159 
00160 float VEML6040::getB(void) 
00161 {
00162     uint16_t data ;
00163     float value ;
00164     getBData(&data) ;
00165     value = (float)LUX_RESOLUTION_0 * (float)data ;
00166     return( value ) ;
00167 }
00168 
00169 float VEML6040::getW(void) 
00170 {
00171     uint16_t data ;
00172     float value ;
00173     getWData(&data) ;
00174     value = (float)LUX_RESOLUTION_0 * (float)data ;
00175     return( value ) ;
00176 }
00177 
00178 float VEML6040::getX(void) 
00179 {
00180     uint16_t R ;
00181     uint16_t G ;
00182     uint16_t B ;
00183     float value ;
00184     getRData(&R) ;
00185     getGData(&G) ;
00186     getBData(&B) ;
00187     value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ;
00188     return( value ) ;
00189 }
00190 
00191 float VEML6040::getY(void) 
00192 {
00193     uint16_t R ;
00194     uint16_t G ;
00195     uint16_t B ;
00196     float value ;
00197     getRData(&R) ;
00198     getGData(&G) ;
00199     getBData(&B) ;
00200     value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ;
00201     return( value ) ;
00202 }
00203 
00204 float VEML6040::getZ(void) 
00205 {
00206     uint16_t R ;
00207     uint16_t G ;
00208     uint16_t B ;
00209     float value ;
00210     getRData(&R) ;
00211     getGData(&G) ;
00212     getBData(&B) ;
00213     value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ;
00214     return( value ) ;
00215 }
00216 
00217 float VEML6040::getCCTiData(void) 
00218 {
00219     uint16_t rdata ;
00220     uint16_t gdata ;
00221     uint16_t bdata ;
00222     float value ;
00223     getRData(&rdata) ;
00224     getGData(&gdata) ;
00225     getBData(&bdata) ;
00226     value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ;
00227     return( value ) ;
00228 }
00229 
00230 float VEML6040::getCCTData(void) 
00231 {
00232 //    uint16_t cctidata ;
00233     float cctidata ;
00234     float value ;
00235     cctidata = getCCTiData() ;
00236 //    getCCTiData(&cctidata) ;
00237     value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ;
00238     return( value ) ;
00239 }
00240 
00241 float VEML6040::getCIEX(void) 
00242 {
00243     float X ;
00244     float Y ;
00245     float Z ;
00246     float value ;
00247     X = getX() ;
00248     Y = getY() ;
00249     Z = getZ() ; 
00250     value = (float)X / ((float)X + (float)Y + (float)Z) ;
00251     return( value ) ;
00252 }
00253 
00254 float VEML6040::getCIEY(void) 
00255 {
00256     float X ;
00257     float Y ;
00258     float Z ;
00259     float value ;
00260     X = getX() ;
00261     Y = getY() ;
00262     Z = getZ() ; 
00263     value = (float)Y / ((float)X + (float)Y + (float)Z) ;
00264     return( value ) ;
00265 }
00266 
00267 int VEML6040::readRegs(int addr, uint8_t * data, int len) {
00268     char t[1] = {addr};
00269     int result ;
00270     __disable_irq() ; // Disable Interrupts
00271     result = p_i2c->write(m_addr, t, 1, true);
00272     if (result == 0) { // write success
00273         result = p_i2c->read(m_addr, (char *)data, len, false);
00274     }
00275     __enable_irq() ; // Enable Interrupts
00276     return(result) ;
00277 }
00278 
00279 int VEML6040::writeRegs(uint8_t * data, int len) {
00280     int result ;
00281     __disable_irq() ; // Disable Interrupts
00282     result = p_i2c->write(m_addr, (char *)data, len);
00283     __enable_irq() ; // Enable Interrupts
00284     return(result) ;
00285 }