You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
KED/ked/oldDevFiles/developpment/drivers/pca9555/pca9555.cpp

157 lines
3.1 KiB

#include "pca9555.h"
Pca9555::Pca9555(I2C *i2c)
{
i2c_pca9555 = i2c;
setAllIn();
}
uint8_t Pca9555::readPin(uint8_t bank, uint8_t pin)
{
if(bank == 0)
{
pinIo0State = i2c_pca9555->readByte(PCA9555_ADDR,PCA9555_INPUT_PORT_0_REG);
return getBitUint8(&pinIo0State, pin);
}
else if(bank == 1)
{
pinIo1State = i2c_pca9555->readByte(PCA9555_ADDR,PCA9555_INPUT_PORT_1_REG);
return getBitUint8(&pinIo1State, pin);
}
else
{
throwError(bankInvalid);
}
throwError(oufOfLoop);
return 2;
}
void Pca9555::writePin(uint8_t bank, uint8_t pin, uint8_t value)
{
if(bank == 0)
{
pinIo0State = i2c_pca9555->readByte(PCA9555_ADDR,PCA9555_OUTPUT_PORT_0_REG);
if(value == 0)
{
unsetBitUint8(&pinIo0State, pin);
}
else if (value == 1)
{
setBitUint8(&pinIo0State, pin);
}
else
{
throwError(invalidOut);
}
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_OUTPUT_PORT_0_REG,pinIo0State);
}
else if(bank == 1)
{
pinIo1State = i2c_pca9555->readByte(PCA9555_ADDR,PCA9555_INPUT_PORT_1_REG);
if(value == 0)
{
unsetBitUint8(&pinIo1State, pin);
}
else if (value == 1)
{
setBitUint8(&pinIo1State, pin);
}
else
{
throwError(invalidOut);
}
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_OUTPUT_PORT_1_REG,pinIo1State);
}
else
{
throwError(bankInvalid);
}
}
void Pca9555::setPin(uint8_t bank, uint8_t pin, uint8_t direction)
{
if(bank == 0)
{
pinIo0Direction = i2c_pca9555->readByte(PCA9555_ADDR,PCA9555_CONFIG_0_REG);
if(direction == 0)
{
unsetBitUint8(&pinIo0Direction, pin);
}
else if (direction == 1)
{
setBitUint8(&pinIo0Direction, pin);
}
else
{
throwError(invalidDir);
}
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_CONFIG_0_REG,pinIo0Direction);
}
else if(bank == 1)
{
pinIo1Direction = i2c_pca9555->readByte(PCA9555_ADDR,PCA9555_CONFIG_1_REG);
if(direction == 0)
{
unsetBitUint8(&pinIo1Direction, pin);
}
else if (direction == 1)
{
setBitUint8(&pinIo1Direction, pin);
}
else
{
throwError(invalidDir);
}
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_CONFIG_1_REG,pinIo1Direction);
}
else
{
throwError(bankInvalid);
}
}
void Pca9555::setPinPolarity(uint8_t bank, uint8_t pin, uint8_t polarity)
{
}
uint8_t Pca9555::getInterrupt()
{
return 0;
}
void Pca9555::setAllOut()
{
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_CONFIG_0_REG,0x00);
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_CONFIG_1_REG,0x00);
}
void Pca9555::setAllIn()
{
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_CONFIG_0_REG,0xFF);
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_CONFIG_1_REG,0xFF);
}
void Pca9555::setAllHigh()
{
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_OUTPUT_PORT_0_REG,0xFF);
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_OUTPUT_PORT_1_REG,0xFF);
}
void Pca9555::setAllLow()
{
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_OUTPUT_PORT_0_REG,0x00);
i2c_pca9555->writeWord(PCA9555_ADDR,PCA9555_OUTPUT_PORT_1_REG,0x00);
}
void Pca9555::throwError(Pca9555::errors error)
{
#ifdef LINUX
std::cout << "Linux Pca9555 Error No:" << error << std::endl;
exit(1);
#endif
}