Class which provides functions to control a TAOS TCS3472 Color Light-to-Digital Converter with IR Filter via I2C. (Tidied up)

Dependents:   openwear-lifelogger-example

Fork of TCS3472_I2C by Karl Maxwell

Committer:
janekm
Date:
Mon Sep 08 23:16:40 2014 +0000
Revision:
8:2a240f6ca27a
Parent:
7:fbc4c6f3be5b
N/A

Who changed what in which revision?

UserRevisionLine numberNew contents of line
karlmaxwell67 1:70d7d9f1af01 1 #include "TCS3472_I2C.h"
karlmaxwell67 1:70d7d9f1af01 2
janekm 7:fbc4c6f3be5b 3 TCS3472_I2C::TCS3472_I2C( I2C *i2c, uint8_t deviceAddress ) : _i2c( i2c ){
janekm 7:fbc4c6f3be5b 4 _slaveAddress = deviceAddress;
janekm 7:fbc4c6f3be5b 5
karlmaxwell67 3:6a89ac4a1979 6 enablePowerAndRGBC();
karlmaxwell67 1:70d7d9f1af01 7 }
karlmaxwell67 1:70d7d9f1af01 8
karlmaxwell67 6:6d5bb4ad7d6e 9 TCS3472_I2C::~TCS3472_I2C(){
karlmaxwell67 6:6d5bb4ad7d6e 10
karlmaxwell67 6:6d5bb4ad7d6e 11 }
karlmaxwell67 6:6d5bb4ad7d6e 12
karlmaxwell67 1:70d7d9f1af01 13 int TCS3472_I2C::writeSingleRegister( char address, char data ){
karlmaxwell67 1:70d7d9f1af01 14 char tx[2] = { address | 160, data }; //0d160 = 0b10100000
janekm 7:fbc4c6f3be5b 15 int ack = _i2c->write( _slaveAddress << 1, tx, 2 );
karlmaxwell67 3:6a89ac4a1979 16 return ack;
karlmaxwell67 3:6a89ac4a1979 17 }
karlmaxwell67 3:6a89ac4a1979 18
karlmaxwell67 3:6a89ac4a1979 19 int TCS3472_I2C::writeMultipleRegisters( char address, char* data, int quantity ){
karlmaxwell67 3:6a89ac4a1979 20 char tx[ quantity + 1 ];
karlmaxwell67 3:6a89ac4a1979 21 tx[0] = address | 160;
karlmaxwell67 3:6a89ac4a1979 22 for ( int i = 1; i <= quantity; i++ ){
karlmaxwell67 3:6a89ac4a1979 23 tx[ i ] = data[ i - 1 ];
karlmaxwell67 3:6a89ac4a1979 24 }
janekm 7:fbc4c6f3be5b 25 int ack = _i2c->write( _slaveAddress << 1, tx, quantity + 1 );
karlmaxwell67 1:70d7d9f1af01 26 return ack;
karlmaxwell67 1:70d7d9f1af01 27 }
karlmaxwell67 1:70d7d9f1af01 28
karlmaxwell67 1:70d7d9f1af01 29 char TCS3472_I2C::readSingleRegister( char address ){
karlmaxwell67 1:70d7d9f1af01 30 char output = 255;
karlmaxwell67 1:70d7d9f1af01 31 char command = address | 160; //0d160 = 0b10100000
janekm 7:fbc4c6f3be5b 32 _i2c->write( _slaveAddress << 1, &command, 1, true );
janekm 7:fbc4c6f3be5b 33 _i2c->read( _slaveAddress << 1, &output, 1 );
karlmaxwell67 1:70d7d9f1af01 34 return output;
karlmaxwell67 1:70d7d9f1af01 35 }
karlmaxwell67 1:70d7d9f1af01 36
karlmaxwell67 1:70d7d9f1af01 37 int TCS3472_I2C::readMultipleRegisters( char address, char* output, int quantity ){
karlmaxwell67 1:70d7d9f1af01 38 char command = address | 160; //0d160 = 0b10100000
janekm 7:fbc4c6f3be5b 39 _i2c->write( _slaveAddress << 1, &command, 1, true );
janekm 7:fbc4c6f3be5b 40 int ack = _i2c->read( _slaveAddress << 1, output, quantity );
karlmaxwell67 1:70d7d9f1af01 41 return ack;
karlmaxwell67 1:70d7d9f1af01 42 }
karlmaxwell67 1:70d7d9f1af01 43
karlmaxwell67 6:6d5bb4ad7d6e 44 void TCS3472_I2C::getAllColors( int* readings ){
karlmaxwell67 1:70d7d9f1af01 45 char buffer[8] = { 0 };
karlmaxwell67 1:70d7d9f1af01 46
karlmaxwell67 1:70d7d9f1af01 47 readMultipleRegisters( CDATA, buffer, 8 );
karlmaxwell67 1:70d7d9f1af01 48
karlmaxwell67 1:70d7d9f1af01 49 readings[0] = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 50 readings[1] = (int)buffer[3] << 8 | (int)buffer[2];
karlmaxwell67 1:70d7d9f1af01 51 readings[2] = (int)buffer[5] << 8 | (int)buffer[4];
karlmaxwell67 1:70d7d9f1af01 52 readings[3] = (int)buffer[7] << 8 | (int)buffer[6];
karlmaxwell67 1:70d7d9f1af01 53 }
karlmaxwell67 1:70d7d9f1af01 54
karlmaxwell67 1:70d7d9f1af01 55 int TCS3472_I2C::getClearData(){
karlmaxwell67 1:70d7d9f1af01 56 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 57 readMultipleRegisters( CDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 58 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 59 return reading;
karlmaxwell67 1:70d7d9f1af01 60 }
karlmaxwell67 1:70d7d9f1af01 61
karlmaxwell67 1:70d7d9f1af01 62 int TCS3472_I2C::getRedData(){
karlmaxwell67 1:70d7d9f1af01 63 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 64 readMultipleRegisters( RDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 65 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 66 return reading;
karlmaxwell67 1:70d7d9f1af01 67 }
karlmaxwell67 1:70d7d9f1af01 68
karlmaxwell67 1:70d7d9f1af01 69 int TCS3472_I2C::getGreenData(){
karlmaxwell67 1:70d7d9f1af01 70 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 71 readMultipleRegisters( GDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 72 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 73 return reading;
karlmaxwell67 1:70d7d9f1af01 74 }
karlmaxwell67 1:70d7d9f1af01 75
karlmaxwell67 1:70d7d9f1af01 76 int TCS3472_I2C::getBlueData(){
karlmaxwell67 1:70d7d9f1af01 77 char buffer[2] = { 0 };
karlmaxwell67 1:70d7d9f1af01 78 readMultipleRegisters( BDATA, buffer, 2 );
karlmaxwell67 1:70d7d9f1af01 79 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 1:70d7d9f1af01 80 return reading;
karlmaxwell67 2:38d5187a4e7b 81 }
karlmaxwell67 2:38d5187a4e7b 82
karlmaxwell67 3:6a89ac4a1979 83 int TCS3472_I2C::enablePower(){
karlmaxwell67 3:6a89ac4a1979 84 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 85 char enable_new = enable_old | 1; // sets PON (bit 0) to 1
karlmaxwell67 3:6a89ac4a1979 86 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 87 return ack;
karlmaxwell67 3:6a89ac4a1979 88 }
karlmaxwell67 3:6a89ac4a1979 89
karlmaxwell67 3:6a89ac4a1979 90 int TCS3472_I2C::disablePower(){
karlmaxwell67 3:6a89ac4a1979 91 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 92 char enable_new = enable_old & 254; // sets PON (bit 0) to 0
karlmaxwell67 3:6a89ac4a1979 93 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 94 return ack;
karlmaxwell67 3:6a89ac4a1979 95 }
karlmaxwell67 3:6a89ac4a1979 96
karlmaxwell67 4:5d1f8d7d81ff 97 bool TCS3472_I2C::isPowerEnabled(){
karlmaxwell67 4:5d1f8d7d81ff 98 char enable = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 99 char pon = enable << 7;
karlmaxwell67 4:5d1f8d7d81ff 100 pon = pon >> 7; // gets PON (bit 0) from ENABLE register byte
karlmaxwell67 4:5d1f8d7d81ff 101 return (bool)pon;
karlmaxwell67 4:5d1f8d7d81ff 102 }
karlmaxwell67 4:5d1f8d7d81ff 103
karlmaxwell67 3:6a89ac4a1979 104 int TCS3472_I2C::enableRGBC(){
karlmaxwell67 3:6a89ac4a1979 105 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 106 char enable_new = enable_old | 2; // sets AEN (bit 1) to 1
karlmaxwell67 3:6a89ac4a1979 107 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 108 return ack;
karlmaxwell67 3:6a89ac4a1979 109 }
karlmaxwell67 3:6a89ac4a1979 110
karlmaxwell67 3:6a89ac4a1979 111 int TCS3472_I2C::disableRGBC(){
karlmaxwell67 3:6a89ac4a1979 112 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 113 char enable_new = enable_old & 253; // sets AEN (bit 1) to 0
karlmaxwell67 3:6a89ac4a1979 114 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 115 return ack;
karlmaxwell67 3:6a89ac4a1979 116 }
karlmaxwell67 3:6a89ac4a1979 117
karlmaxwell67 4:5d1f8d7d81ff 118 bool TCS3472_I2C::isRGBCEnabled(){
karlmaxwell67 4:5d1f8d7d81ff 119 char enable = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 120 char aen = enable << 6;
karlmaxwell67 4:5d1f8d7d81ff 121 aen = aen >> 7; // gets AEN (bit 1) from ENABLE register byte
karlmaxwell67 4:5d1f8d7d81ff 122 return (bool)aen;
karlmaxwell67 4:5d1f8d7d81ff 123 }
karlmaxwell67 4:5d1f8d7d81ff 124
karlmaxwell67 3:6a89ac4a1979 125 int TCS3472_I2C::enablePowerAndRGBC(){
karlmaxwell67 3:6a89ac4a1979 126 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 127 char enable_new = enable_old | 3; // sets PON (bit 0) and AEN (bit 1) to 1
karlmaxwell67 3:6a89ac4a1979 128 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 129 return ack;
karlmaxwell67 3:6a89ac4a1979 130 }
karlmaxwell67 3:6a89ac4a1979 131
karlmaxwell67 3:6a89ac4a1979 132 int TCS3472_I2C::disablePowerAndRGBC(){
karlmaxwell67 3:6a89ac4a1979 133 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 134 char enable_new = enable_old & 252; // sets PON (bit 0) and AEN (bit 1) to 0
karlmaxwell67 3:6a89ac4a1979 135 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 2:38d5187a4e7b 136 return ack;
karlmaxwell67 2:38d5187a4e7b 137 }
karlmaxwell67 2:38d5187a4e7b 138
karlmaxwell67 2:38d5187a4e7b 139 int TCS3472_I2C::enableWait(){
karlmaxwell67 3:6a89ac4a1979 140 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 141 char enable_new = enable_old | 8; // sets WEN (bit 3) to 1
karlmaxwell67 3:6a89ac4a1979 142 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 2:38d5187a4e7b 143 return ack;
karlmaxwell67 2:38d5187a4e7b 144 }
karlmaxwell67 2:38d5187a4e7b 145
karlmaxwell67 2:38d5187a4e7b 146 int TCS3472_I2C::disableWait(){
karlmaxwell67 3:6a89ac4a1979 147 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 148 char enable_new = enable_old & 247; // sets WEN (bit 3) to 0
karlmaxwell67 3:6a89ac4a1979 149 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 2:38d5187a4e7b 150 return ack;
karlmaxwell67 2:38d5187a4e7b 151 }
karlmaxwell67 2:38d5187a4e7b 152
karlmaxwell67 4:5d1f8d7d81ff 153 bool TCS3472_I2C::isWaitEnabled(){
karlmaxwell67 4:5d1f8d7d81ff 154 char enable = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 155 char wen = enable << 4;
karlmaxwell67 4:5d1f8d7d81ff 156 wen = wen >> 7; // gets WEN (bit 3) from ENABLE register byte
karlmaxwell67 4:5d1f8d7d81ff 157 return (bool)wen;
karlmaxwell67 4:5d1f8d7d81ff 158 }
karlmaxwell67 4:5d1f8d7d81ff 159
karlmaxwell67 2:38d5187a4e7b 160 int TCS3472_I2C::enableInterrupt(){
karlmaxwell67 3:6a89ac4a1979 161 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 162 char enable_new = enable_old | 16; // sets AIEN (bit 4) to 1
karlmaxwell67 3:6a89ac4a1979 163 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 2:38d5187a4e7b 164 return ack;
karlmaxwell67 2:38d5187a4e7b 165 }
karlmaxwell67 2:38d5187a4e7b 166
karlmaxwell67 2:38d5187a4e7b 167 int TCS3472_I2C::disableInterrupt(){
karlmaxwell67 3:6a89ac4a1979 168 char enable_old = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 169 char enable_new = enable_old & 239; // sets AIEN (bit 4) to 0
karlmaxwell67 3:6a89ac4a1979 170 int ack = writeSingleRegister( ENABLE, enable_new );
karlmaxwell67 3:6a89ac4a1979 171 return ack;
karlmaxwell67 3:6a89ac4a1979 172 }
karlmaxwell67 3:6a89ac4a1979 173
karlmaxwell67 4:5d1f8d7d81ff 174 bool TCS3472_I2C::isInterruptEnabled(){
karlmaxwell67 4:5d1f8d7d81ff 175 char enable = readSingleRegister( ENABLE );
karlmaxwell67 4:5d1f8d7d81ff 176 char aien = enable << 3;
karlmaxwell67 4:5d1f8d7d81ff 177 aien = aien >> 7; // gets AIEN (bit 4) from ENABLE register byte
karlmaxwell67 4:5d1f8d7d81ff 178 return (bool)aien;
karlmaxwell67 4:5d1f8d7d81ff 179 }
karlmaxwell67 4:5d1f8d7d81ff 180
karlmaxwell67 3:6a89ac4a1979 181 int TCS3472_I2C::setIntegrationTime( const float itime ){
karlmaxwell67 4:5d1f8d7d81ff 182 char atime = 256 - roundTowardsZero( itime / 2.4 ); // rounding ensures nearest value of atime is used
karlmaxwell67 3:6a89ac4a1979 183 int ack = writeSingleRegister( ATIME, atime );
karlmaxwell67 2:38d5187a4e7b 184 return ack;
karlmaxwell67 2:38d5187a4e7b 185 }
karlmaxwell67 2:38d5187a4e7b 186
karlmaxwell67 4:5d1f8d7d81ff 187 float TCS3472_I2C::readIntegrationTime(){
karlmaxwell67 4:5d1f8d7d81ff 188 float itime = 0;
karlmaxwell67 4:5d1f8d7d81ff 189 char atime = readSingleRegister( ATIME );
karlmaxwell67 4:5d1f8d7d81ff 190 itime = 2.4 * ( 256 - atime );
karlmaxwell67 4:5d1f8d7d81ff 191 return itime;
karlmaxwell67 4:5d1f8d7d81ff 192 }
karlmaxwell67 4:5d1f8d7d81ff 193
karlmaxwell67 2:38d5187a4e7b 194 int TCS3472_I2C::setWaitTime( const float time ){
karlmaxwell67 2:38d5187a4e7b 195 int ack = 1;
karlmaxwell67 2:38d5187a4e7b 196 char wtime = 0;
karlmaxwell67 4:5d1f8d7d81ff 197 if ( time >= 2.39 && time <= 614.4 ){ // 2.39 instead of 2.4 to allow for float accuracy errors
janekm 8:2a240f6ca27a 198 ack = writeSingleRegister( TCS_CONFIG, 0 ); // sets WLONG to 0
karlmaxwell67 4:5d1f8d7d81ff 199 wtime = 256 - roundTowardsZero( time / 2.4 );
karlmaxwell67 2:38d5187a4e7b 200 }
karlmaxwell67 4:5d1f8d7d81ff 201 else if ( time > 614.4 && time <= 7400.1 ){ // 7400.1 instead of 7400 to allow for float accuracy errors
janekm 8:2a240f6ca27a 202 ack = writeSingleRegister( TCS_CONFIG, 2 ); // sets WLONG to 1
karlmaxwell67 4:5d1f8d7d81ff 203 wtime = 256 - roundTowardsZero( time / 28.8 );
karlmaxwell67 2:38d5187a4e7b 204 }
karlmaxwell67 2:38d5187a4e7b 205 ack = ack || writeSingleRegister( WTIME, wtime );
karlmaxwell67 2:38d5187a4e7b 206 return ack;
karlmaxwell67 3:6a89ac4a1979 207 }
karlmaxwell67 3:6a89ac4a1979 208
karlmaxwell67 4:5d1f8d7d81ff 209 float TCS3472_I2C::readWaitTime(){
karlmaxwell67 4:5d1f8d7d81ff 210 float time = 0;
karlmaxwell67 4:5d1f8d7d81ff 211 char wtime = readSingleRegister( WTIME );
janekm 8:2a240f6ca27a 212 char config = readSingleRegister( TCS_CONFIG );
karlmaxwell67 4:5d1f8d7d81ff 213 int wlong = ( config << 6 ) >> 7; // gets WLONG (bit 1) from CONFIG register byte
karlmaxwell67 4:5d1f8d7d81ff 214 if ( wlong == 0 ){
karlmaxwell67 4:5d1f8d7d81ff 215 time = 2.4 * ( 256 - wtime );
karlmaxwell67 4:5d1f8d7d81ff 216 }
karlmaxwell67 4:5d1f8d7d81ff 217 else if ( wlong == 1 ){
karlmaxwell67 4:5d1f8d7d81ff 218 time = 28.8 * ( 256 - wtime ); // 28.8 = 2.4 * 12
karlmaxwell67 4:5d1f8d7d81ff 219 }
karlmaxwell67 4:5d1f8d7d81ff 220 return time;
karlmaxwell67 4:5d1f8d7d81ff 221 }
karlmaxwell67 4:5d1f8d7d81ff 222
karlmaxwell67 3:6a89ac4a1979 223 char TCS3472_I2C::readEnableRegister(){
karlmaxwell67 3:6a89ac4a1979 224 return readSingleRegister( ENABLE );
karlmaxwell67 3:6a89ac4a1979 225 }
karlmaxwell67 3:6a89ac4a1979 226
karlmaxwell67 3:6a89ac4a1979 227 int TCS3472_I2C::readLowInterruptThreshold(){
karlmaxwell67 3:6a89ac4a1979 228 char buffer[2] = { 0 };
karlmaxwell67 3:6a89ac4a1979 229 readMultipleRegisters( AILTL, buffer, 2 );
karlmaxwell67 3:6a89ac4a1979 230 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 3:6a89ac4a1979 231 return reading;
karlmaxwell67 3:6a89ac4a1979 232 }
karlmaxwell67 3:6a89ac4a1979 233
karlmaxwell67 3:6a89ac4a1979 234 int TCS3472_I2C::readHighInterruptThreshold(){
karlmaxwell67 3:6a89ac4a1979 235 char buffer[2] = { 0 };
karlmaxwell67 3:6a89ac4a1979 236 readMultipleRegisters( AIHTL, buffer, 2 );
karlmaxwell67 3:6a89ac4a1979 237 int reading = (int)buffer[1] << 8 | (int)buffer[0];
karlmaxwell67 3:6a89ac4a1979 238 return reading;
karlmaxwell67 3:6a89ac4a1979 239 }
karlmaxwell67 3:6a89ac4a1979 240
karlmaxwell67 3:6a89ac4a1979 241 int TCS3472_I2C::setLowInterruptThreshold( const int threshold ){
karlmaxwell67 3:6a89ac4a1979 242 char threshold_bytes[2];
karlmaxwell67 3:6a89ac4a1979 243 threshold_bytes[0] = threshold; // take lowest 8 bits of threshold
karlmaxwell67 3:6a89ac4a1979 244 threshold_bytes[1] = threshold >> 8; // take highest 8 bits of threshold
karlmaxwell67 3:6a89ac4a1979 245 int ack = writeMultipleRegisters( AILTL, threshold_bytes, 2 );
karlmaxwell67 3:6a89ac4a1979 246 return ack;
karlmaxwell67 3:6a89ac4a1979 247 }
karlmaxwell67 3:6a89ac4a1979 248
karlmaxwell67 3:6a89ac4a1979 249 int TCS3472_I2C::setHighInterruptThreshold( const int threshold ){
karlmaxwell67 3:6a89ac4a1979 250 char threshold_bytes[2];
karlmaxwell67 3:6a89ac4a1979 251 threshold_bytes[0] = threshold;
karlmaxwell67 3:6a89ac4a1979 252 threshold_bytes[1] = threshold >> 8;
karlmaxwell67 3:6a89ac4a1979 253 int ack = writeMultipleRegisters( AIHTL, threshold_bytes, 2 );
karlmaxwell67 3:6a89ac4a1979 254 return ack;
karlmaxwell67 3:6a89ac4a1979 255 }
karlmaxwell67 3:6a89ac4a1979 256
karlmaxwell67 3:6a89ac4a1979 257 int TCS3472_I2C::readInterruptPersistence(){
karlmaxwell67 3:6a89ac4a1979 258 char pers = readSingleRegister( PERS );
karlmaxwell67 3:6a89ac4a1979 259 char persistence_bits = ( pers << 4 ) >> 4; // discard bits 4 to 7, keep only bits 0 to 3
karlmaxwell67 3:6a89ac4a1979 260 int persistence = -1;
karlmaxwell67 3:6a89ac4a1979 261 switch (persistence_bits){
karlmaxwell67 3:6a89ac4a1979 262 case 0:
karlmaxwell67 3:6a89ac4a1979 263 persistence = 0;
karlmaxwell67 3:6a89ac4a1979 264 break;
karlmaxwell67 3:6a89ac4a1979 265 case 1:
karlmaxwell67 3:6a89ac4a1979 266 persistence = 1;
karlmaxwell67 3:6a89ac4a1979 267 break;
karlmaxwell67 3:6a89ac4a1979 268 case 2:
karlmaxwell67 3:6a89ac4a1979 269 persistence = 2;
karlmaxwell67 3:6a89ac4a1979 270 break;
karlmaxwell67 3:6a89ac4a1979 271 case 3:
karlmaxwell67 3:6a89ac4a1979 272 persistence = 3;
karlmaxwell67 3:6a89ac4a1979 273 break;
karlmaxwell67 3:6a89ac4a1979 274 case 4:
karlmaxwell67 3:6a89ac4a1979 275 persistence = 5;
karlmaxwell67 3:6a89ac4a1979 276 break;
karlmaxwell67 3:6a89ac4a1979 277 case 5:
karlmaxwell67 3:6a89ac4a1979 278 persistence = 10;
karlmaxwell67 3:6a89ac4a1979 279 break;
karlmaxwell67 3:6a89ac4a1979 280 case 6:
karlmaxwell67 3:6a89ac4a1979 281 persistence = 15;
karlmaxwell67 3:6a89ac4a1979 282 break;
karlmaxwell67 3:6a89ac4a1979 283 case 7:
karlmaxwell67 3:6a89ac4a1979 284 persistence = 20;
karlmaxwell67 3:6a89ac4a1979 285 break;
karlmaxwell67 3:6a89ac4a1979 286 case 8:
karlmaxwell67 3:6a89ac4a1979 287 persistence = 25;
karlmaxwell67 3:6a89ac4a1979 288 break;
karlmaxwell67 3:6a89ac4a1979 289 case 9:
karlmaxwell67 3:6a89ac4a1979 290 persistence = 30;
karlmaxwell67 3:6a89ac4a1979 291 break;
karlmaxwell67 3:6a89ac4a1979 292 case 10:
karlmaxwell67 3:6a89ac4a1979 293 persistence = 35;
karlmaxwell67 3:6a89ac4a1979 294 break;
karlmaxwell67 3:6a89ac4a1979 295 case 11:
karlmaxwell67 3:6a89ac4a1979 296 persistence = 40;
karlmaxwell67 3:6a89ac4a1979 297 break;
karlmaxwell67 3:6a89ac4a1979 298 case 12:
karlmaxwell67 3:6a89ac4a1979 299 persistence = 45;
karlmaxwell67 3:6a89ac4a1979 300 break;
karlmaxwell67 3:6a89ac4a1979 301 case 13:
karlmaxwell67 3:6a89ac4a1979 302 persistence = 50;
karlmaxwell67 3:6a89ac4a1979 303 break;
karlmaxwell67 3:6a89ac4a1979 304 case 14:
karlmaxwell67 3:6a89ac4a1979 305 persistence = 55;
karlmaxwell67 3:6a89ac4a1979 306 break;
karlmaxwell67 3:6a89ac4a1979 307 case 15:
karlmaxwell67 3:6a89ac4a1979 308 persistence = 60;
karlmaxwell67 3:6a89ac4a1979 309 break;
karlmaxwell67 3:6a89ac4a1979 310 default:
karlmaxwell67 3:6a89ac4a1979 311 break;
karlmaxwell67 3:6a89ac4a1979 312 }
karlmaxwell67 3:6a89ac4a1979 313 return persistence;
karlmaxwell67 3:6a89ac4a1979 314 }
karlmaxwell67 3:6a89ac4a1979 315
karlmaxwell67 3:6a89ac4a1979 316 int TCS3472_I2C::setInterruptPersistence( const int persistence ){
karlmaxwell67 3:6a89ac4a1979 317 char pers_byte;
karlmaxwell67 3:6a89ac4a1979 318 int ack = 0;
karlmaxwell67 3:6a89ac4a1979 319 switch (persistence){
karlmaxwell67 3:6a89ac4a1979 320 case 0:
karlmaxwell67 3:6a89ac4a1979 321 pers_byte = 0;
karlmaxwell67 3:6a89ac4a1979 322 break;
karlmaxwell67 3:6a89ac4a1979 323 case 1:
karlmaxwell67 3:6a89ac4a1979 324 pers_byte = 1;
karlmaxwell67 3:6a89ac4a1979 325 break;
karlmaxwell67 3:6a89ac4a1979 326 case 2:
karlmaxwell67 3:6a89ac4a1979 327 pers_byte = 2;
karlmaxwell67 3:6a89ac4a1979 328 break;
karlmaxwell67 3:6a89ac4a1979 329 case 3:
karlmaxwell67 3:6a89ac4a1979 330 pers_byte = 3;
karlmaxwell67 3:6a89ac4a1979 331 break;
karlmaxwell67 3:6a89ac4a1979 332 case 5:
karlmaxwell67 3:6a89ac4a1979 333 pers_byte = 4;
karlmaxwell67 3:6a89ac4a1979 334 break;
karlmaxwell67 3:6a89ac4a1979 335 case 10:
karlmaxwell67 3:6a89ac4a1979 336 pers_byte = 5;
karlmaxwell67 3:6a89ac4a1979 337 break;
karlmaxwell67 3:6a89ac4a1979 338 case 15:
karlmaxwell67 3:6a89ac4a1979 339 pers_byte = 6;
karlmaxwell67 3:6a89ac4a1979 340 break;
karlmaxwell67 3:6a89ac4a1979 341 case 20:
karlmaxwell67 3:6a89ac4a1979 342 pers_byte = 7;
karlmaxwell67 3:6a89ac4a1979 343 break;
karlmaxwell67 3:6a89ac4a1979 344 case 25:
karlmaxwell67 3:6a89ac4a1979 345 pers_byte = 8;
karlmaxwell67 3:6a89ac4a1979 346 break;
karlmaxwell67 3:6a89ac4a1979 347 case 30:
karlmaxwell67 3:6a89ac4a1979 348 pers_byte = 9;
karlmaxwell67 3:6a89ac4a1979 349 break;
karlmaxwell67 3:6a89ac4a1979 350 case 35:
karlmaxwell67 3:6a89ac4a1979 351 pers_byte = 10;
karlmaxwell67 3:6a89ac4a1979 352 break;
karlmaxwell67 3:6a89ac4a1979 353 case 40:
karlmaxwell67 3:6a89ac4a1979 354 pers_byte = 11;
karlmaxwell67 3:6a89ac4a1979 355 break;
karlmaxwell67 3:6a89ac4a1979 356 case 45:
karlmaxwell67 3:6a89ac4a1979 357 pers_byte = 12;
karlmaxwell67 3:6a89ac4a1979 358 break;
karlmaxwell67 3:6a89ac4a1979 359 case 50:
karlmaxwell67 3:6a89ac4a1979 360 pers_byte = 13;
karlmaxwell67 3:6a89ac4a1979 361 break;
karlmaxwell67 3:6a89ac4a1979 362 case 55:
karlmaxwell67 3:6a89ac4a1979 363 pers_byte = 14;
karlmaxwell67 3:6a89ac4a1979 364 break;
karlmaxwell67 3:6a89ac4a1979 365 case 60:
karlmaxwell67 3:6a89ac4a1979 366 pers_byte = 15;
karlmaxwell67 3:6a89ac4a1979 367 break;
karlmaxwell67 3:6a89ac4a1979 368 default:
karlmaxwell67 3:6a89ac4a1979 369 ack = 2; // 2 used to indicate invalid entry
karlmaxwell67 3:6a89ac4a1979 370 break;
karlmaxwell67 3:6a89ac4a1979 371 }
karlmaxwell67 3:6a89ac4a1979 372 if ( ack != 2 ){
karlmaxwell67 3:6a89ac4a1979 373 ack = writeSingleRegister( PERS, pers_byte );
karlmaxwell67 3:6a89ac4a1979 374 }
karlmaxwell67 3:6a89ac4a1979 375 return ack;
karlmaxwell67 3:6a89ac4a1979 376 }
karlmaxwell67 3:6a89ac4a1979 377
karlmaxwell67 3:6a89ac4a1979 378 int TCS3472_I2C::clearInterrupt(){
karlmaxwell67 3:6a89ac4a1979 379 char tx = 230;
janekm 7:fbc4c6f3be5b 380 int ack = _i2c->write( _slaveAddress << 1, &tx, 1 );
karlmaxwell67 3:6a89ac4a1979 381 return ack;
karlmaxwell67 3:6a89ac4a1979 382 }
karlmaxwell67 3:6a89ac4a1979 383
karlmaxwell67 3:6a89ac4a1979 384 int TCS3472_I2C::readRGBCGain(){
karlmaxwell67 3:6a89ac4a1979 385 char control = readSingleRegister( CONTROL );
karlmaxwell67 3:6a89ac4a1979 386 char gain_bits = ( control << 6 ) >> 6; // discard bits 2 to 7, keep only bits 0 & 1
karlmaxwell67 3:6a89ac4a1979 387 int gain;
karlmaxwell67 3:6a89ac4a1979 388 switch (gain_bits) {
karlmaxwell67 3:6a89ac4a1979 389 case 0:
karlmaxwell67 3:6a89ac4a1979 390 gain = 1;
karlmaxwell67 3:6a89ac4a1979 391 break;
karlmaxwell67 3:6a89ac4a1979 392 case 1:
karlmaxwell67 3:6a89ac4a1979 393 gain = 4;
karlmaxwell67 3:6a89ac4a1979 394 break;
karlmaxwell67 3:6a89ac4a1979 395 case 2:
karlmaxwell67 3:6a89ac4a1979 396 gain = 16;
karlmaxwell67 3:6a89ac4a1979 397 break;
karlmaxwell67 3:6a89ac4a1979 398 case 3:
karlmaxwell67 3:6a89ac4a1979 399 gain = 60;
karlmaxwell67 3:6a89ac4a1979 400 break;
karlmaxwell67 3:6a89ac4a1979 401 default:
karlmaxwell67 3:6a89ac4a1979 402 gain = 0;
karlmaxwell67 3:6a89ac4a1979 403 break;
karlmaxwell67 3:6a89ac4a1979 404 }
karlmaxwell67 3:6a89ac4a1979 405 return gain;
karlmaxwell67 3:6a89ac4a1979 406 }
karlmaxwell67 3:6a89ac4a1979 407
karlmaxwell67 3:6a89ac4a1979 408 int TCS3472_I2C::setRGBCGain( const int gain ){
karlmaxwell67 3:6a89ac4a1979 409 char control;
karlmaxwell67 3:6a89ac4a1979 410 int ack = 0;
karlmaxwell67 3:6a89ac4a1979 411 switch (gain){
karlmaxwell67 3:6a89ac4a1979 412 case 1:
karlmaxwell67 3:6a89ac4a1979 413 control = 0;
karlmaxwell67 3:6a89ac4a1979 414 break;
karlmaxwell67 3:6a89ac4a1979 415 case 4:
karlmaxwell67 3:6a89ac4a1979 416 control = 1;
karlmaxwell67 3:6a89ac4a1979 417 break;
karlmaxwell67 3:6a89ac4a1979 418 case 16:
karlmaxwell67 3:6a89ac4a1979 419 control = 2;
karlmaxwell67 3:6a89ac4a1979 420 break;
karlmaxwell67 3:6a89ac4a1979 421 case 60:
karlmaxwell67 3:6a89ac4a1979 422 control = 3;
karlmaxwell67 3:6a89ac4a1979 423 break;
karlmaxwell67 3:6a89ac4a1979 424 default:
karlmaxwell67 3:6a89ac4a1979 425 ack = 2; // 2 used to indicate invalid entry
karlmaxwell67 3:6a89ac4a1979 426 break;
karlmaxwell67 3:6a89ac4a1979 427 }
karlmaxwell67 3:6a89ac4a1979 428 if ( ack != 2 ){
karlmaxwell67 3:6a89ac4a1979 429 ack = writeSingleRegister( CONTROL, control );
karlmaxwell67 3:6a89ac4a1979 430 }
karlmaxwell67 3:6a89ac4a1979 431 return ack;
karlmaxwell67 3:6a89ac4a1979 432 }
karlmaxwell67 3:6a89ac4a1979 433
karlmaxwell67 3:6a89ac4a1979 434 char TCS3472_I2C::getDeviceID(){
karlmaxwell67 3:6a89ac4a1979 435 return readSingleRegister( ID );
karlmaxwell67 3:6a89ac4a1979 436 }
karlmaxwell67 3:6a89ac4a1979 437
karlmaxwell67 3:6a89ac4a1979 438 char TCS3472_I2C::readStatusRegister(){
karlmaxwell67 3:6a89ac4a1979 439 return readSingleRegister( STATUS );
karlmaxwell67 4:5d1f8d7d81ff 440 }
karlmaxwell67 4:5d1f8d7d81ff 441
karlmaxwell67 4:5d1f8d7d81ff 442 float TCS3472_I2C::roundTowardsZero( const float value ){
karlmaxwell67 4:5d1f8d7d81ff 443 float result = 0;
karlmaxwell67 4:5d1f8d7d81ff 444 if ( ( value >= 0 && ( value - (int)value ) < 0.5 ) || ( value < 0 && ( abs(value) - (int)abs(value) ) >= 0.5 ) ){
karlmaxwell67 4:5d1f8d7d81ff 445 result = floor(value);
karlmaxwell67 4:5d1f8d7d81ff 446 }
karlmaxwell67 4:5d1f8d7d81ff 447 else{
karlmaxwell67 4:5d1f8d7d81ff 448 result = ceil(value);
karlmaxwell67 4:5d1f8d7d81ff 449 }
karlmaxwell67 4:5d1f8d7d81ff 450 return result;
karlmaxwell67 0:453a43c8bf2b 451 }