virtua pinnnn / VCNL4000

Fork of VCNL4000 by Benigno Gobbo

Committer:
joshvaldes
Date:
Thu Jul 28 03:07:48 2016 +0000
Revision:
4:3c57a6048f2d
Parent:
3:8f8caebe76cc
plunger jumper eliminated;

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