APDS-9130 library

Prox.cpp

Committer:
sleighton
Date:
2016-03-04
Revision:
2:9db88ca586db
Parent:
1:159407640167

File content as of revision 2:9db88ca586db:

#include "Prox.h"

Prox::Prox(PinName sda, PinName scl) { 
    _sda = sda;
    _scl = scl;

    WriteByte(0x72,0xE7); // Clear interrupt
    
    char PTIME;
    char WTIME;
    char PPULSE;

    WTIME = 0xff; // 2.7 ms - minimum Wait time
    PTIME = 0xff; // 2.7 ms - minimum Prox integration time
    PPULSE = 1; // Minimum prox pulse count
 
    WriteByte(0x72, 0, 0); //Disable and Powerdown
    WriteByte (0x72, 2, PTIME);
    WriteByte (0x72, 3, WTIME);
    WriteByte (0x72, 0xe, PPULSE);
    
    char PIHTL, PIHTH; //Upper interrupt threshold low and high bytes
    
    PIHTL = 0x01;
    PIHTH = 0x01; //trigger at 256
    
    WriteByte (0x72, 0x0A, PIHTL);
    WriteByte (0x72, 0x0B, PIHTH);
    
    char PDRIVE;
    char PDIODE;
    char PGAIN;
    
    PDRIVE = 0; //100mA of LED Power
    PDIODE = 0x20; // CH1 Diode
    PGAIN = 0x08; //4x Prox gain

    WriteByte (0x72, 0xf, PDRIVE | PDIODE | PGAIN );

    char WEN, PEN, PON, PIEN;
    WEN = 8; // Enable Wait
    PIEN = 32; //Enable interrupt
    PEN = 4; // Enable Prox
    PON = 1; // Enable Power On

    WriteByte (0x72, 0, WEN | PIEN | PEN | PON);
    
    wait(0.12); //Wait for 120 ms
}




uint16_t Prox::readProx(){
    WriteByte (0x72, 0xE7); //clear interrupt pin (untested)
    uint16_t prox;
    ReadWord(0x72, 0x18, &prox);
    return prox;
}
 




// Read a byte on the i2c interface

void Prox::ReadWord(char addr, char reg, uint16_t *data) {
  I2C i2c(_sda,_scl);
  char reg1 = 0xA0 | reg;
  char reading[2];
  i2c.write(addr,&reg1,1);
  i2c.read(addr,reading,2);
  *data = reading[0] | (reading[1]<<8);
  wait(0.07);
}

void Prox::ReadByte(char addr, char reg, char *bytedata) {
  I2C i2c(_sda,_scl);
  char tempdata;
  char reg1 = 0x80 | reg;
  i2c.write(addr,&reg1,1);
  i2c.read(addr,&tempdata,1);
  *bytedata = tempdata;
  wait(0.07);
}



// Write a byte on the i2c interface

void Prox::WriteByte(uint8_t addr, uint8_t reg, char data) {
    I2C i2c(_sda,_scl);
    char data1[2];
    data1[0] = 0x80 | reg;
    data1[1] = data;
    i2c.write(addr,data1,2);
    wait(0.07);

}

void Prox::WriteByte(uint8_t addr, uint8_t reg) {
    I2C i2c(_sda,_scl);
    char data1;
    data1 = 0x80 | reg;
    i2c.write(addr,&data1,1);
    wait(0.07);

}