Release candidate version. The pointer in GAS Pressure display is changed to a triangle.

Dependencies:   UniGraphic mbed vt100

Please note, at 2-Mar-2018 the current version of mbed-lib has a defect in Ticker.
https://os.mbed.com/forum/bugs-suggestions/topic/29287/

So, mbed lib version 157 is intentionally being used.
Please do not update mbed library until the problem in the above URL is fixed.

In this version, format of GAS Pressure Display has been changed.
/media/uploads/Rhyme/low.jpg

/media/uploads/Rhyme/good.jpg

/media/uploads/Rhyme/high.jpg

moto

Committer:
Rhyme
Date:
Fri Mar 02 07:56:09 2018 +0000
Revision:
0:774324cbc5a6
Release candidate version. GAS Pressure pointer is now a triangle.; Some source file clean-up was done.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:774324cbc5a6 1 /*
Rhyme 0:774324cbc5a6 2 * File description here
Rhyme 0:774324cbc5a6 3 */
Rhyme 0:774324cbc5a6 4 #include "VEML6040.h"
Rhyme 0:774324cbc5a6 5 #include "af_mgr.h"
Rhyme 0:774324cbc5a6 6
Rhyme 0:774324cbc5a6 7 /* VEML6075 SLAVE ADDRESS AND FUNCTION DESCRIPTION */
Rhyme 0:774324cbc5a6 8 #define REG_COLOR_CONF 0x00
Rhyme 0:774324cbc5a6 9 #define REG_Reserved1 0x01
Rhyme 0:774324cbc5a6 10 #define REG_Reserved2 0x02
Rhyme 0:774324cbc5a6 11 #define REG_Reserved3 0x03
Rhyme 0:774324cbc5a6 12 #define REG_Reserved4 0x04
Rhyme 0:774324cbc5a6 13 #define REG_Reserved5 0x05
Rhyme 0:774324cbc5a6 14 #define REG_Reserved6 0x06
Rhyme 0:774324cbc5a6 15 #define REG_Reserved7 0x07
Rhyme 0:774324cbc5a6 16 #define REG_R_Data 0x08
Rhyme 0:774324cbc5a6 17 #define REG_G_Data 0x09
Rhyme 0:774324cbc5a6 18 #define REG_B_Data 0x0A
Rhyme 0:774324cbc5a6 19 #define REG_W_Data 0x0B
Rhyme 0:774324cbc5a6 20
Rhyme 0:774324cbc5a6 21 // Following magic numbers are from
Rhyme 0:774324cbc5a6 22 // VISHAY VEML6040 Application Note 84331
Rhyme 0:774324cbc5a6 23 // Page 4
Rhyme 0:774324cbc5a6 24 #define LUX_RESOLUTION_0 (0.25168)
Rhyme 0:774324cbc5a6 25 #define LUX_RESOLUTION_1 (0.12584)
Rhyme 0:774324cbc5a6 26 #define LUX_RESOLUTION_2 (0.06292)
Rhyme 0:774324cbc5a6 27 #define LUX_RESOLUTION_3 (0.03146)
Rhyme 0:774324cbc5a6 28 #define LUX_RESOLUTION_4 (0.01573)
Rhyme 0:774324cbc5a6 29 #define LUX_RESOLUTION_5 (0.007865)
Rhyme 0:774324cbc5a6 30
Rhyme 0:774324cbc5a6 31 // Following magic numbers are from
Rhyme 0:774324cbc5a6 32 // VISHAY VEML6040 Application Note 84331
Rhyme 0:774324cbc5a6 33 // Page 9
Rhyme 0:774324cbc5a6 34 #define CORR_COEFF_M0 (0.048403)
Rhyme 0:774324cbc5a6 35 #define CORR_COEFF_M1 (0.183633)
Rhyme 0:774324cbc5a6 36 #define CORR_COEFF_M2 (-0.253589)
Rhyme 0:774324cbc5a6 37 #define CORR_COEFF_M3 (0.022916)
Rhyme 0:774324cbc5a6 38 #define CORR_COEFF_M4 (0.176388)
Rhyme 0:774324cbc5a6 39 #define CORR_COEFF_M5 (-0.183205)
Rhyme 0:774324cbc5a6 40 #define CORR_COEFF_M6 (-0.077436)
Rhyme 0:774324cbc5a6 41 #define CORR_COEFF_M7 (0.124541)
Rhyme 0:774324cbc5a6 42 #define CORR_COEFF_M8 (0.032081)
Rhyme 0:774324cbc5a6 43
Rhyme 0:774324cbc5a6 44 // Following magic numbers are from
Rhyme 0:774324cbc5a6 45 // VISHAY VEML6040 Application Note 84331
Rhyme 0:774324cbc5a6 46 // Page 10
Rhyme 0:774324cbc5a6 47 #define CCT_CONST (4278.6)
Rhyme 0:774324cbc5a6 48 #define OFFSET_OPEN_AIR (0.5)
Rhyme 0:774324cbc5a6 49
Rhyme 0:774324cbc5a6 50 VEML6040::VEML6040(I2C *i2c, int addr) : m_addr(addr<<1) {
Rhyme 0:774324cbc5a6 51 p_i2c = i2c ;
Rhyme 0:774324cbc5a6 52 p_i2c->frequency(100000); /* 100kHz */
Rhyme 0:774324cbc5a6 53 // activate the peripheral
Rhyme 0:774324cbc5a6 54 }
Rhyme 0:774324cbc5a6 55
Rhyme 0:774324cbc5a6 56 VEML6040::~VEML6040() { }
Rhyme 0:774324cbc5a6 57
Rhyme 0:774324cbc5a6 58 /**
Rhyme 0:774324cbc5a6 59 * set COLOR Config
Rhyme 0:774324cbc5a6 60 * @param colorconf uint8_t 8bit register value
Rhyme 0:774324cbc5a6 61 * @returns 0: success non-0: failure
Rhyme 0:774324cbc5a6 62 * @note Command Code 0x00 is used to access CONF register
Rhyme 0:774324cbc5a6 63 * @note bit[7] (reserved)
Rhyme 0:774324cbc5a6 64 * @note bit[6:4] = IT[2:0] Integration Time Selector
Rhyme 0:774324cbc5a6 65 * @note bit[3] (reserved)
Rhyme 0:774324cbc5a6 66 * @note bit[2] TRIG Proceed one detcting cycle at manual force mode
Rhyme 0:774324cbc5a6 67 * @note bit[1] AF 0: Auto mode 1: manual force mode
Rhyme 0:774324cbc5a6 68 * @note bit[0] SD 0: normal 1: chip shutdown setting
Rhyme 0:774324cbc5a6 69 *
Rhyme 0:774324cbc5a6 70 * @note IT[2:0] 0=40ms, 1=80ms, 2=160ms, 3=320ms, 4=640ms, 5=1280ms
Rhyme 0:774324cbc5a6 71 * @note as our WatchDog is set to 1sec, 1280ms is invalid
Rhyme 0:774324cbc5a6 72 * @note and 640ms may not be practical
Rhyme 0:774324cbc5a6 73 */
Rhyme 0:774324cbc5a6 74 int VEML6040::setCOLORConf(uint8_t colorconf)
Rhyme 0:774324cbc5a6 75 {
Rhyme 0:774324cbc5a6 76 int result ;
Rhyme 0:774324cbc5a6 77 uint8_t data[3] ;
Rhyme 0:774324cbc5a6 78 data[0] = REG_COLOR_CONF ;
Rhyme 0:774324cbc5a6 79 data[1] = colorconf ;
Rhyme 0:774324cbc5a6 80 data[2] = 0 ;
Rhyme 0:774324cbc5a6 81 result = writeRegs(data, 3) ;
Rhyme 0:774324cbc5a6 82 return( result ) ;
Rhyme 0:774324cbc5a6 83 }
Rhyme 0:774324cbc5a6 84
Rhyme 0:774324cbc5a6 85 /**
Rhyme 0:774324cbc5a6 86 * get COLOR Config
Rhyme 0:774324cbc5a6 87 * @param *colorconf uint8_t refer to setCOLORConf for the value
Rhyme 0:774324cbc5a6 88 * @returns 0: success non-0: failure
Rhyme 0:774324cbc5a6 89 */
Rhyme 0:774324cbc5a6 90 int VEML6040::getCOLORConf(uint8_t *colorconf)
Rhyme 0:774324cbc5a6 91 {
Rhyme 0:774324cbc5a6 92 int result ;
Rhyme 0:774324cbc5a6 93 uint8_t data[2] ;
Rhyme 0:774324cbc5a6 94 result = readRegs(REG_COLOR_CONF, data, 2) ;
Rhyme 0:774324cbc5a6 95 if (result == 0) {
Rhyme 0:774324cbc5a6 96 *colorconf = data[0] ;
Rhyme 0:774324cbc5a6 97 }
Rhyme 0:774324cbc5a6 98 return( result ) ;
Rhyme 0:774324cbc5a6 99 }
Rhyme 0:774324cbc5a6 100
Rhyme 0:774324cbc5a6 101
Rhyme 0:774324cbc5a6 102
Rhyme 0:774324cbc5a6 103 int VEML6040::getRData(uint16_t *rdata)
Rhyme 0:774324cbc5a6 104 {
Rhyme 0:774324cbc5a6 105 uint8_t data[2] ;
Rhyme 0:774324cbc5a6 106 int result ;
Rhyme 0:774324cbc5a6 107 result = readRegs(REG_R_Data, data, 2) ;
Rhyme 0:774324cbc5a6 108 *rdata = (data[1]<<8) | data[0] ;
Rhyme 0:774324cbc5a6 109 return( result ) ;
Rhyme 0:774324cbc5a6 110 }
Rhyme 0:774324cbc5a6 111
Rhyme 0:774324cbc5a6 112 int VEML6040::getGData(uint16_t *gdata)
Rhyme 0:774324cbc5a6 113 {
Rhyme 0:774324cbc5a6 114 uint8_t data[2] ;
Rhyme 0:774324cbc5a6 115 int result ;
Rhyme 0:774324cbc5a6 116 result = readRegs(REG_G_Data, data, 2) ;
Rhyme 0:774324cbc5a6 117 *gdata = (data[1]<<8) | data[0] ;
Rhyme 0:774324cbc5a6 118 return( result ) ;
Rhyme 0:774324cbc5a6 119 }
Rhyme 0:774324cbc5a6 120
Rhyme 0:774324cbc5a6 121 int VEML6040::getBData(uint16_t *bdata)
Rhyme 0:774324cbc5a6 122 {
Rhyme 0:774324cbc5a6 123 uint8_t data[2] ;
Rhyme 0:774324cbc5a6 124 int result ;
Rhyme 0:774324cbc5a6 125 result = readRegs(REG_B_Data, data, 2) ;
Rhyme 0:774324cbc5a6 126 *bdata = (data[1]<<8) | data[0] ;
Rhyme 0:774324cbc5a6 127 return( result ) ;
Rhyme 0:774324cbc5a6 128 }
Rhyme 0:774324cbc5a6 129
Rhyme 0:774324cbc5a6 130 int VEML6040::getWData(uint16_t *wdata)
Rhyme 0:774324cbc5a6 131 {
Rhyme 0:774324cbc5a6 132 uint8_t data[2] ;
Rhyme 0:774324cbc5a6 133 int result ;
Rhyme 0:774324cbc5a6 134 result = readRegs(REG_W_Data, data, 2) ;
Rhyme 0:774324cbc5a6 135 *wdata = (data[1]<<8) | data[0] ;
Rhyme 0:774324cbc5a6 136 return( result ) ;
Rhyme 0:774324cbc5a6 137 }
Rhyme 0:774324cbc5a6 138
Rhyme 0:774324cbc5a6 139 // usage
Rhyme 0:774324cbc5a6 140 // fvalue = veml->getUVA() ;
Rhyme 0:774324cbc5a6 141 // printf("%f", fvalue) ;
Rhyme 0:774324cbc5a6 142 float VEML6040::getR(void)
Rhyme 0:774324cbc5a6 143 {
Rhyme 0:774324cbc5a6 144 uint16_t data ;
Rhyme 0:774324cbc5a6 145 float value ;
Rhyme 0:774324cbc5a6 146 getRData(&data) ;
Rhyme 0:774324cbc5a6 147 value = (float)LUX_RESOLUTION_0 * (float)data ;
Rhyme 0:774324cbc5a6 148 return( value ) ;
Rhyme 0:774324cbc5a6 149 }
Rhyme 0:774324cbc5a6 150
Rhyme 0:774324cbc5a6 151 float VEML6040::getG(void)
Rhyme 0:774324cbc5a6 152 {
Rhyme 0:774324cbc5a6 153 uint16_t data ;
Rhyme 0:774324cbc5a6 154 float value ;
Rhyme 0:774324cbc5a6 155 getGData(&data) ;
Rhyme 0:774324cbc5a6 156 value = (float)LUX_RESOLUTION_0 * (float)data ;
Rhyme 0:774324cbc5a6 157 return( value ) ;
Rhyme 0:774324cbc5a6 158 }
Rhyme 0:774324cbc5a6 159
Rhyme 0:774324cbc5a6 160 float VEML6040::getB(void)
Rhyme 0:774324cbc5a6 161 {
Rhyme 0:774324cbc5a6 162 uint16_t data ;
Rhyme 0:774324cbc5a6 163 float value ;
Rhyme 0:774324cbc5a6 164 getBData(&data) ;
Rhyme 0:774324cbc5a6 165 value = (float)LUX_RESOLUTION_0 * (float)data ;
Rhyme 0:774324cbc5a6 166 return( value ) ;
Rhyme 0:774324cbc5a6 167 }
Rhyme 0:774324cbc5a6 168
Rhyme 0:774324cbc5a6 169 float VEML6040::getW(void)
Rhyme 0:774324cbc5a6 170 {
Rhyme 0:774324cbc5a6 171 uint16_t data ;
Rhyme 0:774324cbc5a6 172 float value ;
Rhyme 0:774324cbc5a6 173 getWData(&data) ;
Rhyme 0:774324cbc5a6 174 value = (float)LUX_RESOLUTION_0 * (float)data ;
Rhyme 0:774324cbc5a6 175 return( value ) ;
Rhyme 0:774324cbc5a6 176 }
Rhyme 0:774324cbc5a6 177
Rhyme 0:774324cbc5a6 178 float VEML6040::getX(void)
Rhyme 0:774324cbc5a6 179 {
Rhyme 0:774324cbc5a6 180 uint16_t R ;
Rhyme 0:774324cbc5a6 181 uint16_t G ;
Rhyme 0:774324cbc5a6 182 uint16_t B ;
Rhyme 0:774324cbc5a6 183 float value ;
Rhyme 0:774324cbc5a6 184 getRData(&R) ;
Rhyme 0:774324cbc5a6 185 getGData(&G) ;
Rhyme 0:774324cbc5a6 186 getBData(&B) ;
Rhyme 0:774324cbc5a6 187 value = (float)CORR_COEFF_M0 * (float)R + (float)CORR_COEFF_M1 * (float)G + (float)CORR_COEFF_M2 * (float)B ;
Rhyme 0:774324cbc5a6 188 return( value ) ;
Rhyme 0:774324cbc5a6 189 }
Rhyme 0:774324cbc5a6 190
Rhyme 0:774324cbc5a6 191 float VEML6040::getY(void)
Rhyme 0:774324cbc5a6 192 {
Rhyme 0:774324cbc5a6 193 uint16_t R ;
Rhyme 0:774324cbc5a6 194 uint16_t G ;
Rhyme 0:774324cbc5a6 195 uint16_t B ;
Rhyme 0:774324cbc5a6 196 float value ;
Rhyme 0:774324cbc5a6 197 getRData(&R) ;
Rhyme 0:774324cbc5a6 198 getGData(&G) ;
Rhyme 0:774324cbc5a6 199 getBData(&B) ;
Rhyme 0:774324cbc5a6 200 value = (float)CORR_COEFF_M3 * (float)R + (float)CORR_COEFF_M4 * (float)G + (float)CORR_COEFF_M5 * (float)B ;
Rhyme 0:774324cbc5a6 201 return( value ) ;
Rhyme 0:774324cbc5a6 202 }
Rhyme 0:774324cbc5a6 203
Rhyme 0:774324cbc5a6 204 float VEML6040::getZ(void)
Rhyme 0:774324cbc5a6 205 {
Rhyme 0:774324cbc5a6 206 uint16_t R ;
Rhyme 0:774324cbc5a6 207 uint16_t G ;
Rhyme 0:774324cbc5a6 208 uint16_t B ;
Rhyme 0:774324cbc5a6 209 float value ;
Rhyme 0:774324cbc5a6 210 getRData(&R) ;
Rhyme 0:774324cbc5a6 211 getGData(&G) ;
Rhyme 0:774324cbc5a6 212 getBData(&B) ;
Rhyme 0:774324cbc5a6 213 value = (float)CORR_COEFF_M6 * (float)R + (float)CORR_COEFF_M7 * (float)G + (float)CORR_COEFF_M8 * (float)B ;
Rhyme 0:774324cbc5a6 214 return( value ) ;
Rhyme 0:774324cbc5a6 215 }
Rhyme 0:774324cbc5a6 216
Rhyme 0:774324cbc5a6 217 float VEML6040::getCCTiData(void)
Rhyme 0:774324cbc5a6 218 {
Rhyme 0:774324cbc5a6 219 uint16_t rdata ;
Rhyme 0:774324cbc5a6 220 uint16_t gdata ;
Rhyme 0:774324cbc5a6 221 uint16_t bdata ;
Rhyme 0:774324cbc5a6 222 float value ;
Rhyme 0:774324cbc5a6 223 getRData(&rdata) ;
Rhyme 0:774324cbc5a6 224 getGData(&gdata) ;
Rhyme 0:774324cbc5a6 225 getBData(&bdata) ;
Rhyme 0:774324cbc5a6 226 value = ((float)rdata - (float)bdata) / (float)gdata + (float)OFFSET_OPEN_AIR ;
Rhyme 0:774324cbc5a6 227 return( value ) ;
Rhyme 0:774324cbc5a6 228 }
Rhyme 0:774324cbc5a6 229
Rhyme 0:774324cbc5a6 230 float VEML6040::getCCTData(void)
Rhyme 0:774324cbc5a6 231 {
Rhyme 0:774324cbc5a6 232 // uint16_t cctidata ;
Rhyme 0:774324cbc5a6 233 float cctidata ;
Rhyme 0:774324cbc5a6 234 float value ;
Rhyme 0:774324cbc5a6 235 cctidata = getCCTiData() ;
Rhyme 0:774324cbc5a6 236 // getCCTiData(&cctidata) ;
Rhyme 0:774324cbc5a6 237 value = (float)CCT_CONST * powf( cctidata, -1.2455 ) ;
Rhyme 0:774324cbc5a6 238 return( value ) ;
Rhyme 0:774324cbc5a6 239 }
Rhyme 0:774324cbc5a6 240
Rhyme 0:774324cbc5a6 241 float VEML6040::getCIEX(void)
Rhyme 0:774324cbc5a6 242 {
Rhyme 0:774324cbc5a6 243 float X ;
Rhyme 0:774324cbc5a6 244 float Y ;
Rhyme 0:774324cbc5a6 245 float Z ;
Rhyme 0:774324cbc5a6 246 float value ;
Rhyme 0:774324cbc5a6 247 X = getX() ;
Rhyme 0:774324cbc5a6 248 Y = getY() ;
Rhyme 0:774324cbc5a6 249 Z = getZ() ;
Rhyme 0:774324cbc5a6 250 value = (float)X / ((float)X + (float)Y + (float)Z) ;
Rhyme 0:774324cbc5a6 251 return( value ) ;
Rhyme 0:774324cbc5a6 252 }
Rhyme 0:774324cbc5a6 253
Rhyme 0:774324cbc5a6 254 float VEML6040::getCIEY(void)
Rhyme 0:774324cbc5a6 255 {
Rhyme 0:774324cbc5a6 256 float X ;
Rhyme 0:774324cbc5a6 257 float Y ;
Rhyme 0:774324cbc5a6 258 float Z ;
Rhyme 0:774324cbc5a6 259 float value ;
Rhyme 0:774324cbc5a6 260 X = getX() ;
Rhyme 0:774324cbc5a6 261 Y = getY() ;
Rhyme 0:774324cbc5a6 262 Z = getZ() ;
Rhyme 0:774324cbc5a6 263 value = (float)Y / ((float)X + (float)Y + (float)Z) ;
Rhyme 0:774324cbc5a6 264 return( value ) ;
Rhyme 0:774324cbc5a6 265 }
Rhyme 0:774324cbc5a6 266
Rhyme 0:774324cbc5a6 267 int VEML6040::readRegs(int addr, uint8_t * data, int len) {
Rhyme 0:774324cbc5a6 268 char t[1] = {addr};
Rhyme 0:774324cbc5a6 269 int result ;
Rhyme 0:774324cbc5a6 270 __disable_irq() ; // Disable Interrupts
Rhyme 0:774324cbc5a6 271 result = p_i2c->write(m_addr, t, 1, true);
Rhyme 0:774324cbc5a6 272 if (result == 0) { // write success
Rhyme 0:774324cbc5a6 273 result = p_i2c->read(m_addr, (char *)data, len, false);
Rhyme 0:774324cbc5a6 274 }
Rhyme 0:774324cbc5a6 275 __enable_irq() ; // Enable Interrupts
Rhyme 0:774324cbc5a6 276 return(result) ;
Rhyme 0:774324cbc5a6 277 }
Rhyme 0:774324cbc5a6 278
Rhyme 0:774324cbc5a6 279 int VEML6040::writeRegs(uint8_t * data, int len) {
Rhyme 0:774324cbc5a6 280 int result ;
Rhyme 0:774324cbc5a6 281 __disable_irq() ; // Disable Interrupts
Rhyme 0:774324cbc5a6 282 result = p_i2c->write(m_addr, (char *)data, len);
Rhyme 0:774324cbc5a6 283 __enable_irq() ; // Enable Interrupts
Rhyme 0:774324cbc5a6 284 return(result) ;
Rhyme 0:774324cbc5a6 285 }