PCA9555

Dependents:   Telliskivi2_2014 PowerManagementBoard_Rev_A_2017

PCA9555.cpp

Committer:
Reiko
Date:
2013-09-14
Revision:
3:bcda053645e2
Parent:
2:fae93e0841f6
Child:
5:73884f49ed97

File content as of revision 3:bcda053645e2:

#include "PCA9555.h"
 
PCA9555::PCA9555(PinName sda, PinName scl, PinName interrupPin, int address)
        : _irqpin(interrupPin), _i2c(sda, scl) {
    _address = address;    
    _irqpin.rise(this, &PCA9555::callChange);
    _irqpin.fall(this, &PCA9555::callChange);
    _i2c.frequency(400000);
}

void PCA9555::setDirection(int data) {
    char foo[2];
    foo[0]=0x06;
    foo[1]=data;
    _i2c.write(_address, foo, 2);
    foo[0]=0x07;
    foo[1]=data>>8;
    _i2c.write(_address, foo, 2);
}
 
int PCA9555::read() {
    char rx_array[2] = {0x00, 0x00};
    char tx_array[1] = {0x00};
        
    _i2c.write(_address, tx_array, 1);
        
    _i2c.read(_address, rx_array, 2);
    return (rx_array[1] << 8) | rx_array[0];
}
 
void PCA9555::write(int data) {
    /*char foo[3];
    foo[0]=0x02;
    foo[1]=data;
    foo[2]=data>>8;
    _i2c.write(_address, foo, 3);*/
    char foo[2];
    foo[0]=0x02;
    foo[1]=data;
    _i2c.write(_address, foo, 2);
    foo[0]=0x03;
    foo[1]=data>>8;
    _i2c.write(_address, foo, 2);
}

void PCA9555::setPin(unsigned int pinNumber) {
    currentWriteState |= ((unsigned int)1 << pinNumber);
    write(currentWriteState);
}

void PCA9555::clearPin(unsigned int pinNumber) {
    currentWriteState &= ~((unsigned int)1 << pinNumber);
    write(currentWriteState);
}

void PCA9555::togglePin(unsigned int pinNumber) {
    currentWriteState ^= ((unsigned int)1 << pinNumber);
    write(currentWriteState);
}

bool PCA9555::getPin(unsigned int pinNumber) {
    //return ballState;
    return (read() & ((unsigned int)1 << pinNumber)) > 0;
}

void PCA9555::change(void (*function)(void)) { 
    _callbackChange.attach(function);
}
/*
template<typename T>
void PCA9555::change(T *object, void (T::*member)(void)) { 
    _callbackChange.attach(object, member); 
}
*/
void PCA9555::callChange(void) {
    _callbackChange.call();
}