Program Listing for File i2c.cpp
↰ Return to documentation for file (src/i2c.cpp
)
#include <cstdint>
#include <cstdio>
#include <cstdlib>
extern "C" {
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#ifdef __linux__
#include <i2c/smbus.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#endif
};
#include "i2c_bus/i2c.hh"
using iplo::I2C;
I2C::I2C(const char* fileName) : _fileName(fileName) {
if ((_fd = ::open(_fileName, O_RDWR | O_NONBLOCK)) < 0) {
std::perror("Error opening I2C bus");
std::exit(-1);
}
}
void I2C::selectDevice(std::uint8_t address) {
#ifdef __linux__ // Mockup Code for development on other platforms.
if (::ioctl(_fd, I2C_SLAVE, address) < 0) {
std::perror("Error selecting device on I2C bus");
std::exit(-1);
}
#endif
}
std::int32_t I2C::readByte() {
#ifdef __linux__ // Mockup Code for development on other platforms.
return i2c_smbus_read_byte(_fd);
#else
return _fd;
#endif
}
std::int32_t I2C::readByteData(std::uint8_t reg) {
#ifdef __linux__ // Mockup Code for development on other platforms.
return i2c_smbus_read_byte_data(_fd, reg);
#else
return _fd;
#endif
}
std::int32_t I2C::readWordData(std::uint16_t reg) {
#ifdef __linux__ // Mockup Code for development on other platforms.
return i2c_smbus_read_word_data(_fd, reg);
#else
return _fd;
#endif
}
std::int32_t I2C::writeByte(std::uint8_t val) {
#ifdef __linux__ // Mockup Code for development on other platforms.
return i2c_smbus_write_byte(_fd, val);
#else
return _fd;
#endif
}
std::int32_t I2C::writeByteData(std::uint8_t reg, std::uint8_t val) {
#ifdef __linux__ // Mockup Code for development on other platforms.
return i2c_smbus_write_byte_data(_fd, reg, val);
#else
return _fd;
#endif
}
std::int32_t I2C::writeWordData(std::uint8_t reg, std::uint16_t val) {
#ifdef __linux__ // Mockup Code for development on other platforms.
return i2c_smbus_write_word_data(_fd, reg, val);
#else
return _fd;
#endif
}
I2C::~I2C() {
if (::close(_fd) < 0) {
std::perror("Error closing I2C bus");
std::exit(-1);
}
}