/ Feather_Holiday_Lights / Feather_32u4_Lights / Adafruit_VCNL4010.cpp
Adafruit_VCNL4010.cpp
  1  // SPDX-FileCopyrightText: 2019 Anne Barela for Adafruit Industries
  2  //
  3  // SPDX-License-Identifier: MIT
  4  
  5  #include "Arduino.h"
  6  #include "Wire.h"
  7  
  8  #include "Adafruit_VCNL4010.h"
  9  
 10  bool Adafruit_VCNL4010::begin(uint8_t addr) {
 11    _i2caddr = addr;
 12    Wire.begin();
 13  
 14    uint8_t rev = read8(VCNL4010_PRODUCTID);
 15    if ((rev & 0xF0) != 0x20) {
 16      return false;
 17    }
 18  
 19    write8(VCNL4010_IRLED, 20);
 20    uint8_t r =  read8(VCNL4010_MODTIMING);
 21    r &= ~(0b00011000);
 22    r |= VCNL4010_390K625 << 3;
 23    write8(VCNL4010_MODTIMING, r);
 24  
 25    write8(VCNL4010_INTCONTROL, 0x08);
 26    return true;
 27  }
 28  
 29  uint16_t Adafruit_VCNL4010::readProximity() {
 30    uint8_t i = read8(VCNL4010_INTSTAT);
 31    i &= ~0x80;
 32    write8(VCNL4010_INTSTAT, i);
 33  
 34    write8(VCNL4010_COMMAND, VCNL4010_MEASUREPROXIMITY);
 35    while (1) {
 36      //Serial.println(read8(VCNL4010_INTSTAT), HEX);
 37      uint8_t result = read8(VCNL4010_COMMAND);
 38      //Serial.print("Ready = 0x"); Serial.println(result, HEX);
 39      if (result & VCNL4010_PROXIMITYREADY) {
 40        return read16(VCNL4010_PROXIMITYDATA);
 41      }
 42      delay(1);
 43    }
 44  }
 45  
 46  // Read 1 byte from the VCNL4000 at 'address'
 47  uint8_t Adafruit_VCNL4010::read8(uint8_t address)
 48  {
 49    uint8_t data;
 50  
 51    Wire.beginTransmission(_i2caddr);
 52  #if ARDUINO >= 100
 53    Wire.write(address);
 54  #else
 55    Wire.send(address);
 56  #endif
 57    Wire.endTransmission();
 58  
 59    delayMicroseconds(170);  // delay required
 60  
 61    Wire.requestFrom(_i2caddr, (uint8_t)1);
 62    while(!Wire.available());
 63  
 64  #if ARDUINO >= 100
 65    return Wire.read();
 66  #else
 67    return Wire.receive();
 68  #endif
 69  }
 70  
 71  
 72  // Read 2 byte from the VCNL4000 at 'address'
 73  uint16_t Adafruit_VCNL4010::read16(uint8_t address)
 74  {
 75    uint16_t data;
 76  
 77    Wire.beginTransmission(_i2caddr);
 78  #if ARDUINO >= 100
 79    Wire.write(address);
 80  #else
 81    Wire.send(address);
 82  #endif
 83    Wire.endTransmission();
 84  
 85    Wire.requestFrom(_i2caddr, (uint8_t)2);
 86    while(!Wire.available());
 87  #if ARDUINO >= 100
 88    data = Wire.read();
 89    data <<= 8;
 90    while(!Wire.available());
 91    data |= Wire.read();
 92  #else
 93    data = Wire.receive();
 94    data <<= 8;
 95    while(!Wire.available());
 96    data |= Wire.receive();
 97  #endif
 98    
 99    return data;
100  }
101  
102  // write 1 byte
103  void Adafruit_VCNL4010::write8(uint8_t address, uint8_t data)
104  {
105    Wire.beginTransmission(_i2caddr);
106  #if ARDUINO >= 100
107    Wire.write(address);
108    Wire.write(data);  
109  #else
110    Wire.send(address);
111    Wire.send(data);  
112  #endif
113    Wire.endTransmission();
114  }