This lib allows control of VISHAY VCNL4000 distance/ambient light sensor via I2C bus.

Dependents:   Major_dHome

VCNL4000.cpp

Committer:
bengo
Date:
2012-02-14
Revision:
0:1720792a6e28

File content as of revision 0:1720792a6e28:

#include "VCNL4000.h"

const int VCNL4000::VCNL4000address = 0x13;
const int VCNL4000::VCNL4000regAddr = 0x80;
const int VCNL4000::Command                 = 0x0;
const int VCNL4000::ProdIdRevision          = 0x1;
const int VCNL4000::IRLedCurrent            = 0x3;
const int VCNL4000::AmbientLightParam       = 0x4;
const int VCNL4000::AmbientLightMsb         = 0x5;
const int VCNL4000::AmbientLightLsb         = 0x6;
const int VCNL4000::ProximityMsb            = 0x7;
const int VCNL4000::ProximityLsb            = 0x8;
const int VCNL4000::ProximitySigFreq        = 0x9;
const int VCNL4000::ProxymityModulationTime = 0xa;

// ---------------------------------------------------
VCNL4000::VCNL4000( PinName sda, PinName scl ) : _i2c( sda, scl ) {
      
    int prodId = getProductId();
    int prodRev = getProductRevision();
      
    if( prodId == 1 && prodRev == 1 ) {
       _status = 0;
    }
    else {
       _status = 1;
    }  
}
   
// ---------------------------------------------------   
VCNL4000::~VCNL4000( void ) {
} 

// ---------------------------------------------------   
int VCNL4000::registerRead( int reg ) {

   _bytes[0] = ( reg & 0xff );
   _status = _i2c.write( ( VCNL4000address << 1 ), _bytes, 1 );
   if( _status == 0 ) {
      _status = _i2c.read( ( ( VCNL4000address << 1 ) + 1 ), _bytes, 1 );
      return( _bytes[0] );
   }
   return( 0 ); 
}

// ---------------------------------------------------      
void VCNL4000::registerWrite( int reg, unsigned char data ) {
    
    _bytes[0] = reg & 0xff;
    _bytes[1] = data & 0xff;
    _status = _i2c.write(  VCNL4000address << 1, _bytes, 2 );
    
}

// ---------------------------------------------------        
int VCNL4000::getProximity( void ) {

    startProximityMeasurement();
    while( !proximityDataReady() ) { 
      wait(0.1);
    }
    _data = registerRead( VCNL4000regAddr + ProximityMsb ) << 8;
    int status = _status;
    _data +=  registerRead( VCNL4000regAddr + ProximityLsb );
    _status = _status | status;
    return( _data );    
}   
   
// ---------------------------------------------------        
int VCNL4000::getAmbientLight( void ) {
    startAmbientLightMeasurement();
    while( !ambientLightDataReady() ) { 
      wait(0.1);
    }
    _data = registerRead( VCNL4000regAddr + AmbientLightMsb ) << 8;
    int status = _status;
    _data +=  registerRead( VCNL4000regAddr + AmbientLightLsb );
    _status = _status | status;
    return( _data );    
}   

// ---------------------------------------------------        
int VCNL4000::getProductId( void ) {
   return( ( registerRead(  VCNL4000regAddr + ProdIdRevision ) & 0xf0 ) >> 4 );
}

// ---------------------------------------------------        
int VCNL4000::getProductRevision( void ) {
   return( registerRead(  VCNL4000regAddr + ProdIdRevision ) & 0x0f ) ;
}  

// ---------------------------------------------------       
bool VCNL4000::proximityDataReady( void ) {
   return( ( registerRead( VCNL4000regAddr + Command ) & 0x20 ) >> 5 );     
}
   
// ---------------------------------------------------     
bool VCNL4000::ambientLightDataReady( void ) {
   return( ( registerRead( VCNL4000regAddr + Command )  & 0x40 ) >> 6 );     
}

// ---------------------------------------------------     
void VCNL4000::startProximityMeasurement( void ) {
   _data = registerRead( VCNL4000regAddr + Command );
   if( _status == 0 ) {
      _data = _data | 0x08;
      registerWrite( VCNL4000regAddr + Command, _data );
   }
}

// ---------------------------------------------------        
void VCNL4000::startAmbientLightMeasurement( void ) {
   _data = registerRead( VCNL4000regAddr + Command );
   if( _status == 0 ) {
      _data = _data | 0x10;
      registerWrite( VCNL4000regAddr + Command, _data );
   }
}

// ---------------------------------------------------     
void VCNL4000::setIRLedCurrent( int milliAmps ) {
   milliAmps /= 10;
   if( milliAmps > 20 ) {
      _status = 1;
      return;
   }
   _data = registerRead( VCNL4000regAddr + IRLedCurrent );
   if( _status == 0 ) {
      _data = ( _data & 0xc0 ) | milliAmps;
      registerWrite( VCNL4000regAddr + IRLedCurrent, _data );
   }   
}
   
// ---------------------------------------------------     
void VCNL4000::enableALContinuousConversionMode( void ) {
   _data = registerRead( VCNL4000regAddr + AmbientLightParam );
   if( _status == 0 ) {
      _data = _data | 0x80;
      registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
   }   
}

// ---------------------------------------------------     
void VCNL4000::disableALContinuousConversionMode( void ) {
   _data = registerRead( VCNL4000regAddr + AmbientLightParam );
   if( _status == 0 ) {
      _data = _data & 0x7f;
      registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
   }   
}

// ---------------------------------------------------     
bool VCNL4000::isALContinuousConversionMode( void ) {
   _data = registerRead( VCNL4000regAddr + AmbientLightParam );
   if( ( ( _data >> 7 ) & 1 ) == 1 ) {
      return( true );
   }
   else {
      return( false );
   }
}

// ---------------------------------------------------     
void VCNL4000::enableALAutoOffsetCompensation( void ) {
   _data = registerRead( VCNL4000regAddr + AmbientLightParam );
   if( _status == 0 ) {
      _data = _data | 0x08;
      registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
   }   
}

// ---------------------------------------------------     
void VCNL4000::disableALAutoOffsetCompensation( void ) {
   _data = registerRead( VCNL4000regAddr + AmbientLightParam );
   if( _status == 0 ) {
      _data = _data & 0xf7;
      registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
   }   
}
   
// ---------------------------------------------------        
bool VCNL4000::iseALAutoOffsetCompensation( void ) {
   _data = registerRead( VCNL4000regAddr + AmbientLightParam );
   if( ( ( _data >> 3 ) & 1 ) == 1 ) {
      return( true );
   }
   else {
      return( false );
   }
}

// ---------------------------------------------------     
void VCNL4000::setALAveragingFunction( int measurements ) {
   if( measurements > 7 ) {
      _status = 1;
      return;
   }
   _data = registerRead( VCNL4000regAddr + AmbientLightParam );
   if( _status == 0 ) {
      _data = ( _data & 0xf8 ) | measurements;
      registerWrite( VCNL4000regAddr + AmbientLightParam, _data );
   }   
}

// ---------------------------------------------------     
int VCNL4000::gettALAveragingFunction( void ) {
   _data = registerRead( VCNL4000regAddr + AmbientLightParam );
   if( _status ==  0 ) {
      return( _data & 0xf );
   }
   else {
      return( 0 );
   }
}

// ---------------------------------------------------     
void VCNL4000::setProximityMeasurementSigFreq( int frequency ) {
   if( frequency > 3 ) {
      _status = 1;
      return;
   }
   _data = registerRead( VCNL4000regAddr + ProximitySigFreq );
   if( _status == 0 ) {
      _data = ( _data & 0xfc ) | frequency;
      registerWrite( VCNL4000regAddr + ProximitySigFreq, _data );
   }   
}

// ---------------------------------------------------     
int VCNL4000::getProximityMeasurementSigFreq( void ) {
   _data = registerRead( VCNL4000regAddr + ProximitySigFreq );
   if( _status == 0 ) {
      return( _data & 0x3 );
   }
   else {
      return( 0 );
   }
}

// ---------------------------------------------------     
void VCNL4000::setProxiModulatorDelayTime( int delayTime ) {
   if( delayTime > 7 ) {
      _status = 1;
      return;
   }
   _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
   if( _status == 0 ) {
      _data = ( _data & 0x1f ) | ( delayTime << 5 );
      registerWrite( VCNL4000regAddr + ProxymityModulationTime, _data );
   }   
}   

// ---------------------------------------------------     
int VCNL4000::getProxiModulatorDelayTime( void ) {
   _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
   if( _status ==  0 ) {
      return( ( _data >> 5 ) & 0x7 );
   }
   else {
      return( 0 );
   }
}

// ---------------------------------------------------     
void VCNL4000::setProxiModulatorDeadTime( int deadTime ) {
   if( deadTime > 7 ) {
      _status = 1;
      return;
   }
   _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
   if( _status == 0 ) {
      _data = ( _data & 0x07 ) | deadTime;
      registerWrite( VCNL4000regAddr + ProxymityModulationTime, _data );
   }   
}   

// ---------------------------------------------------     
int VCNL4000::getProxiModulatorDeadTime( void ) {
   _data = registerRead( VCNL4000regAddr + ProxymityModulationTime );
   if( _status ==  0 ) {
      return( _data & 0x7 );
   }
   else {
      return( 0 );
   }
}

// ---------------------------------------------------