Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of VCNL4000 by
VCNL4000.cpp@3:8f8caebe76cc, 2016-07-28 (annotated)
- 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?
User | Revision | Line number | New 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 |