virtua pinnnn / VCNL4000

Fork of VCNL4000 by Benigno Gobbo

Committer:
joshvaldes
Date:
Thu Jul 28 02:57:17 2016 +0000
Revision:
3:8f8caebe76cc
Parent:
2:397b1b9266a9
Child:
4:3c57a6048f2d
yay

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bengo 0:1720792a6e28 1 #include "VCNL4000.h"
bengo 0:1720792a6e28 2
bengo 0:1720792a6e28 3 const int VCNL4000::VCNL4000address = 0x13;
bengo 0:1720792a6e28 4 const int VCNL4000::VCNL4000regAddr = 0x80;
bengo 0:1720792a6e28 5 const int VCNL4000::Command = 0x0;
bengo 0:1720792a6e28 6 const int VCNL4000::ProdIdRevision = 0x1;
bengo 0:1720792a6e28 7 const int VCNL4000::IRLedCurrent = 0x3;
bengo 0:1720792a6e28 8 const int VCNL4000::AmbientLightParam = 0x4;
bengo 0:1720792a6e28 9 const int VCNL4000::AmbientLightMsb = 0x5;
bengo 0:1720792a6e28 10 const int VCNL4000::AmbientLightLsb = 0x6;
bengo 0:1720792a6e28 11 const int VCNL4000::ProximityMsb = 0x7;
bengo 0:1720792a6e28 12 const int VCNL4000::ProximityLsb = 0x8;
bengo 0:1720792a6e28 13 const int VCNL4000::ProximitySigFreq = 0x9;
bengo 0:1720792a6e28 14 const int VCNL4000::ProxymityModulationTime = 0xa;
bengo 0:1720792a6e28 15
joshvaldes 3:8f8caebe76cc 16 int proxExistCount = 0;
joshvaldes 3:8f8caebe76cc 17 const int maxProxExistCount = 100;
joshvaldes 3:8f8caebe76cc 18
bengo 0:1720792a6e28 19 // ---------------------------------------------------
bengo 0:1720792a6e28 20 VCNL4000::VCNL4000( PinName sda, PinName scl ) : _i2c( sda, scl ) {
joshvaldes 3:8f8caebe76cc 21
bengo 0:1720792a6e28 22 int prodId = getProductId();
bengo 0:1720792a6e28 23 int prodRev = getProductRevision();
bengo 0:1720792a6e28 24
bengo 0:1720792a6e28 25 if( prodId == 1 && prodRev == 1 ) {
bengo 0:1720792a6e28 26 _status = 0;
bengo 0:1720792a6e28 27 }
bengo 0:1720792a6e28 28 else {
bengo 0:1720792a6e28 29 _status = 1;
bengo 0:1720792a6e28 30 }
joshvaldes 3:8f8caebe76cc 31
bengo 0:1720792a6e28 32 }
bengo 0:1720792a6e28 33
bengo 0:1720792a6e28 34 // ---------------------------------------------------
bengo 0:1720792a6e28 35 VCNL4000::~VCNL4000( void ) {
bengo 0:1720792a6e28 36 }
bengo 0:1720792a6e28 37
bengo 0:1720792a6e28 38 // ---------------------------------------------------
bengo 0:1720792a6e28 39 int VCNL4000::registerRead( int reg ) {
bengo 0:1720792a6e28 40
bengo 0:1720792a6e28 41 _bytes[0] = ( reg & 0xff );
bengo 0:1720792a6e28 42 _status = _i2c.write( ( VCNL4000address << 1 ), _bytes, 1 );
bengo 0:1720792a6e28 43 if( _status == 0 ) {
bengo 0:1720792a6e28 44 _status = _i2c.read( ( ( VCNL4000address << 1 ) + 1 ), _bytes, 1 );
bengo 0:1720792a6e28 45 return( _bytes[0] );
bengo 0:1720792a6e28 46 }
bengo 0:1720792a6e28 47 return( 0 );
bengo 0:1720792a6e28 48 }
bengo 0:1720792a6e28 49
bengo 0:1720792a6e28 50 // ---------------------------------------------------
bengo 0:1720792a6e28 51 void VCNL4000::registerWrite( int reg, unsigned char data ) {
bengo 0:1720792a6e28 52
bengo 0:1720792a6e28 53 _bytes[0] = reg & 0xff;
bengo 0:1720792a6e28 54 _bytes[1] = data & 0xff;
bengo 0:1720792a6e28 55 _status = _i2c.write( VCNL4000address << 1, _bytes, 2 );
bengo 0:1720792a6e28 56
bengo 0:1720792a6e28 57 }
bengo 0:1720792a6e28 58
bengo 0:1720792a6e28 59 // ---------------------------------------------------
bengo 0:1720792a6e28 60 int VCNL4000::getProximity( void ) {
bengo 0:1720792a6e28 61
bengo 0:1720792a6e28 62 startProximityMeasurement();
bengo 0:1720792a6e28 63 while( !proximityDataReady() ) {
joshvaldes 1:73ff30fa5ee0 64 wait(0.01);//was 0.1
bengo 0:1720792a6e28 65 }
joshvaldes 3:8f8caebe76cc 66 proxExistCount = 0;
bengo 0:1720792a6e28 67 _data = registerRead( VCNL4000regAddr + ProximityMsb ) << 8;
bengo 0:1720792a6e28 68 int status = _status;
bengo 0:1720792a6e28 69 _data += registerRead( VCNL4000regAddr + ProximityLsb );
bengo 0:1720792a6e28 70 _status = _status | status;
bengo 0:1720792a6e28 71 return( _data );
bengo 0:1720792a6e28 72 }
bengo 0:1720792a6e28 73
bengo 0:1720792a6e28 74 // ---------------------------------------------------
bengo 0:1720792a6e28 75 int VCNL4000::getAmbientLight( void ) {
bengo 0:1720792a6e28 76 startAmbientLightMeasurement();
bengo 0:1720792a6e28 77 while( !ambientLightDataReady() ) {
joshvaldes 1:73ff30fa5ee0 78 wait(0.01); //was 0.1
bengo 0:1720792a6e28 79 }
bengo 0:1720792a6e28 80 _data = registerRead( VCNL4000regAddr + AmbientLightMsb ) << 8;
bengo 0:1720792a6e28 81 int status = _status;
bengo 0:1720792a6e28 82 _data += registerRead( VCNL4000regAddr + AmbientLightLsb );
bengo 0:1720792a6e28 83 _status = _status | status;
bengo 0:1720792a6e28 84 return( _data );
bengo 0:1720792a6e28 85 }
bengo 0:1720792a6e28 86
bengo 0:1720792a6e28 87 // ---------------------------------------------------
bengo 0:1720792a6e28 88 int VCNL4000::getProductId( void ) {
joshvaldes 2:397b1b9266a9 89 return(registerRead(0x81));
bengo 0:1720792a6e28 90 }
bengo 0:1720792a6e28 91
bengo 0:1720792a6e28 92 // ---------------------------------------------------
bengo 0:1720792a6e28 93 int VCNL4000::getProductRevision( void ) {
bengo 0:1720792a6e28 94 return( registerRead( VCNL4000regAddr + ProdIdRevision ) & 0x0f ) ;
bengo 0:1720792a6e28 95 }
bengo 0:1720792a6e28 96
bengo 0:1720792a6e28 97 // ---------------------------------------------------
bengo 0:1720792a6e28 98 bool VCNL4000::proximityDataReady( void ) {
bengo 0:1720792a6e28 99 return( ( registerRead( VCNL4000regAddr + Command ) & 0x20 ) >> 5 );
bengo 0:1720792a6e28 100 }
bengo 0:1720792a6e28 101
bengo 0:1720792a6e28 102 // ---------------------------------------------------
bengo 0:1720792a6e28 103 bool VCNL4000::ambientLightDataReady( void ) {
bengo 0:1720792a6e28 104 return( ( registerRead( VCNL4000regAddr + Command ) & 0x40 ) >> 6 );
bengo 0:1720792a6e28 105 }
bengo 0:1720792a6e28 106
bengo 0:1720792a6e28 107 // ---------------------------------------------------
bengo 0:1720792a6e28 108 void VCNL4000::startProximityMeasurement( void ) {
bengo 0:1720792a6e28 109 _data = registerRead( VCNL4000regAddr + Command );
bengo 0:1720792a6e28 110 if( _status == 0 ) {
bengo 0:1720792a6e28 111 _data = _data | 0x08;
bengo 0:1720792a6e28 112 registerWrite( VCNL4000regAddr + Command, _data );
bengo 0:1720792a6e28 113 }
bengo 0:1720792a6e28 114 }
bengo 0:1720792a6e28 115
bengo 0:1720792a6e28 116 // ---------------------------------------------------
bengo 0:1720792a6e28 117 void VCNL4000::startAmbientLightMeasurement( void ) {
bengo 0:1720792a6e28 118 _data = registerRead( VCNL4000regAddr + Command );
bengo 0:1720792a6e28 119 if( _status == 0 ) {
bengo 0:1720792a6e28 120 _data = _data | 0x10;
bengo 0:1720792a6e28 121 registerWrite( VCNL4000regAddr + Command, _data );
bengo 0:1720792a6e28 122 }
bengo 0:1720792a6e28 123 }
bengo 0:1720792a6e28 124
bengo 0:1720792a6e28 125 // ---------------------------------------------------
bengo 0:1720792a6e28 126 void VCNL4000::setIRLedCurrent( int milliAmps ) {
bengo 0:1720792a6e28 127 milliAmps /= 10;
bengo 0:1720792a6e28 128 if( milliAmps > 20 ) {
bengo 0:1720792a6e28 129 _status = 1;
bengo 0:1720792a6e28 130 return;
bengo 0:1720792a6e28 131 }
bengo 0:1720792a6e28 132 _data = registerRead( VCNL4000regAddr + IRLedCurrent );
bengo 0:1720792a6e28 133 if( _status == 0 ) {
bengo 0:1720792a6e28 134 _data = ( _data & 0xc0 ) | milliAmps;
bengo 0:1720792a6e28 135 registerWrite( VCNL4000regAddr + IRLedCurrent, _data );
bengo 0:1720792a6e28 136 }
bengo 0:1720792a6e28 137 }
bengo 0:1720792a6e28 138
bengo 0:1720792a6e28 139 // ---------------------------------------------------
bengo 0:1720792a6e28 140 void VCNL4000::enableALContinuousConversionMode( void ) {
bengo 0:1720792a6e28 141 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 142 if( _status == 0 ) {
bengo 0:1720792a6e28 143 _data = _data | 0x80;
bengo 0:1720792a6e28 144 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 145 }
bengo 0:1720792a6e28 146 }
bengo 0:1720792a6e28 147
bengo 0:1720792a6e28 148 // ---------------------------------------------------
bengo 0:1720792a6e28 149 void VCNL4000::disableALContinuousConversionMode( void ) {
bengo 0:1720792a6e28 150 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 151 if( _status == 0 ) {
bengo 0:1720792a6e28 152 _data = _data & 0x7f;
bengo 0:1720792a6e28 153 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 154 }
bengo 0:1720792a6e28 155 }
bengo 0:1720792a6e28 156
bengo 0:1720792a6e28 157 // ---------------------------------------------------
bengo 0:1720792a6e28 158 bool VCNL4000::isALContinuousConversionMode( void ) {
bengo 0:1720792a6e28 159 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 160 if( ( ( _data >> 7 ) & 1 ) == 1 ) {
bengo 0:1720792a6e28 161 return( true );
bengo 0:1720792a6e28 162 }
bengo 0:1720792a6e28 163 else {
bengo 0:1720792a6e28 164 return( false );
bengo 0:1720792a6e28 165 }
bengo 0:1720792a6e28 166 }
bengo 0:1720792a6e28 167
bengo 0:1720792a6e28 168 // ---------------------------------------------------
bengo 0:1720792a6e28 169 void VCNL4000::enableALAutoOffsetCompensation( void ) {
bengo 0:1720792a6e28 170 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 171 if( _status == 0 ) {
bengo 0:1720792a6e28 172 _data = _data | 0x08;
bengo 0:1720792a6e28 173 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 174 }
bengo 0:1720792a6e28 175 }
bengo 0:1720792a6e28 176
bengo 0:1720792a6e28 177 // ---------------------------------------------------
bengo 0:1720792a6e28 178 void VCNL4000::disableALAutoOffsetCompensation( void ) {
bengo 0:1720792a6e28 179 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 180 if( _status == 0 ) {
bengo 0:1720792a6e28 181 _data = _data & 0xf7;
bengo 0:1720792a6e28 182 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 183 }
bengo 0:1720792a6e28 184 }
bengo 0:1720792a6e28 185
bengo 0:1720792a6e28 186 // ---------------------------------------------------
bengo 0:1720792a6e28 187 bool VCNL4000::iseALAutoOffsetCompensation( void ) {
bengo 0:1720792a6e28 188 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 189 if( ( ( _data >> 3 ) & 1 ) == 1 ) {
bengo 0:1720792a6e28 190 return( true );
bengo 0:1720792a6e28 191 }
bengo 0:1720792a6e28 192 else {
bengo 0:1720792a6e28 193 return( false );
bengo 0:1720792a6e28 194 }
bengo 0:1720792a6e28 195 }
bengo 0:1720792a6e28 196
bengo 0:1720792a6e28 197 // ---------------------------------------------------
bengo 0:1720792a6e28 198 void VCNL4000::setALAveragingFunction( int measurements ) {
bengo 0:1720792a6e28 199 if( measurements > 7 ) {
bengo 0:1720792a6e28 200 _status = 1;
bengo 0:1720792a6e28 201 return;
bengo 0:1720792a6e28 202 }
bengo 0:1720792a6e28 203 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 204 if( _status == 0 ) {
bengo 0:1720792a6e28 205 _data = ( _data & 0xf8 ) | measurements;
bengo 0:1720792a6e28 206 registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
bengo 0:1720792a6e28 207 }
bengo 0:1720792a6e28 208 }
bengo 0:1720792a6e28 209
bengo 0:1720792a6e28 210 // ---------------------------------------------------
bengo 0:1720792a6e28 211 int VCNL4000::gettALAveragingFunction( void ) {
bengo 0:1720792a6e28 212 _data = registerRead( VCNL4000regAddr + AmbientLightParam );
bengo 0:1720792a6e28 213 if( _status == 0 ) {
bengo 0:1720792a6e28 214 return( _data & 0xf );
bengo 0:1720792a6e28 215 }
bengo 0:1720792a6e28 216 else {
bengo 0:1720792a6e28 217 return( 0 );
bengo 0:1720792a6e28 218 }
bengo 0:1720792a6e28 219 }
bengo 0:1720792a6e28 220
bengo 0:1720792a6e28 221 // ---------------------------------------------------
bengo 0:1720792a6e28 222 void VCNL4000::setProximityMeasurementSigFreq( int frequency ) {
bengo 0:1720792a6e28 223 if( frequency > 3 ) {
bengo 0:1720792a6e28 224 _status = 1;
bengo 0:1720792a6e28 225 return;
bengo 0:1720792a6e28 226 }
bengo 0:1720792a6e28 227 _data = registerRead( VCNL4000regAddr + ProximitySigFreq );
bengo 0:1720792a6e28 228 if( _status == 0 ) {
bengo 0:1720792a6e28 229 _data = ( _data & 0xfc ) | frequency;
bengo 0:1720792a6e28 230 registerWrite( VCNL4000regAddr + ProximitySigFreq, _data );
bengo 0:1720792a6e28 231 }
bengo 0:1720792a6e28 232 }
bengo 0:1720792a6e28 233
bengo 0:1720792a6e28 234 // ---------------------------------------------------
bengo 0:1720792a6e28 235 int VCNL4000::getProximityMeasurementSigFreq( void ) {
bengo 0:1720792a6e28 236 _data = registerRead( VCNL4000regAddr + ProximitySigFreq );
bengo 0:1720792a6e28 237 if( _status == 0 ) {
bengo 0:1720792a6e28 238 return( _data & 0x3 );
bengo 0:1720792a6e28 239 }
bengo 0:1720792a6e28 240 else {
bengo 0:1720792a6e28 241 return( 0 );
bengo 0:1720792a6e28 242 }
bengo 0:1720792a6e28 243 }
bengo 0:1720792a6e28 244
bengo 0:1720792a6e28 245 // ---------------------------------------------------
bengo 0:1720792a6e28 246 void VCNL4000::setProxiModulatorDelayTime( int delayTime ) {
bengo 0:1720792a6e28 247 if( delayTime > 7 ) {
bengo 0:1720792a6e28 248 _status = 1;
bengo 0:1720792a6e28 249 return;
bengo 0:1720792a6e28 250 }
bengo 0:1720792a6e28 251 _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
bengo 0:1720792a6e28 252 if( _status == 0 ) {
bengo 0:1720792a6e28 253 _data = ( _data & 0x1f ) | ( delayTime << 5 );
bengo 0:1720792a6e28 254 registerWrite( VCNL4000regAddr + ProxymityModulationTime, _data );
bengo 0:1720792a6e28 255 }
bengo 0:1720792a6e28 256 }
bengo 0:1720792a6e28 257
bengo 0:1720792a6e28 258 // ---------------------------------------------------
bengo 0:1720792a6e28 259 int VCNL4000::getProxiModulatorDelayTime( void ) {
bengo 0:1720792a6e28 260 _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
bengo 0:1720792a6e28 261 if( _status == 0 ) {
bengo 0:1720792a6e28 262 return( ( _data >> 5 ) & 0x7 );
bengo 0:1720792a6e28 263 }
bengo 0:1720792a6e28 264 else {
bengo 0:1720792a6e28 265 return( 0 );
bengo 0:1720792a6e28 266 }
bengo 0:1720792a6e28 267 }
bengo 0:1720792a6e28 268
bengo 0:1720792a6e28 269 // ---------------------------------------------------
bengo 0:1720792a6e28 270 void VCNL4000::setProxiModulatorDeadTime( int deadTime ) {
bengo 0:1720792a6e28 271 if( deadTime > 7 ) {
bengo 0:1720792a6e28 272 _status = 1;
bengo 0:1720792a6e28 273 return;
bengo 0:1720792a6e28 274 }
bengo 0:1720792a6e28 275 _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
bengo 0:1720792a6e28 276 if( _status == 0 ) {
bengo 0:1720792a6e28 277 _data = ( _data & 0x07 ) | deadTime;
bengo 0:1720792a6e28 278 registerWrite( VCNL4000regAddr + ProxymityModulationTime, _data );
bengo 0:1720792a6e28 279 }
bengo 0:1720792a6e28 280 }
bengo 0:1720792a6e28 281
bengo 0:1720792a6e28 282 // ---------------------------------------------------
bengo 0:1720792a6e28 283 int VCNL4000::getProxiModulatorDeadTime( void ) {
bengo 0:1720792a6e28 284 _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
bengo 0:1720792a6e28 285 if( _status == 0 ) {
bengo 0:1720792a6e28 286 return( _data & 0x7 );
bengo 0:1720792a6e28 287 }
bengo 0:1720792a6e28 288 else {
bengo 0:1720792a6e28 289 return( 0 );
bengo 0:1720792a6e28 290 }
bengo 0:1720792a6e28 291 }
bengo 0:1720792a6e28 292
bengo 0:1720792a6e28 293 // ---------------------------------------------------
bengo 0:1720792a6e28 294