diff --git a/developpment/interfacer/bh1750.cpp b/developpment/interfacer/bh1750.cpp index 02dacfc..536514c 100644 --- a/developpment/interfacer/bh1750.cpp +++ b/developpment/interfacer/bh1750.cpp @@ -1,7 +1,7 @@ #include "bh1750.h" -I2C_Driver i2c(1,1); +i2c_ch1_pImpL i2c(1); Bh1750::Bh1750() { diff --git a/developpment/interfacer/bh1750.h b/developpment/interfacer/bh1750.h index 65f4921..b02bcc4 100644 --- a/developpment/interfacer/bh1750.h +++ b/developpment/interfacer/bh1750.h @@ -5,7 +5,7 @@ #include #include #include -#include "i2c_driver.h" +#include "i2c_ch1_pImpL.hpp" //Start measurement at 4lx resolution. Time typically 16ms. diff --git a/developpment/interfacer/i2c.hpp b/developpment/interfacer/i2c.hpp new file mode 100644 index 0000000..be49920 --- /dev/null +++ b/developpment/interfacer/i2c.hpp @@ -0,0 +1,96 @@ +#ifndef _I2C_H_ +#define _I2C_H_ + +namespace serial +{ + enum i2c_id + { + i2c_ch0, + i2c_ch1 + }; + + // + // Base template class + // + + template + class I2C + { + public: + I2C(const uint8_t& mode); // Mode : Master or Slave + uint8_t readByte(const uint8_t& address, const uint8_t& reg); + uint16_t readWord(const uint8_t& address, const uint8_t& reg); + uint8_t writeByte(const uint8_t& address, const uint8_t& data); + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data); + + private: + }; + + // + // Template for channel 0 + // + template<> + class I2C + { + public: + I2C(const uint8_t& mode):pImpL(mode) + { + } + uint8_t readByte(const uint8_t& address, const uint8_t& reg) + { + return pImpL -> readByte(address, reg); + } + uint16_t readWord(const uint8_t& address, const uint8_t& reg) + { + return pImpL -> readWord(address,reg); + } + uint8_t writeByte(const uint8_t& address, const uint8_t& data) + { + return pImpL -> writeByte(address, data); + } + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) + { + return pImpL -> writeWord(address, reg, data); + } + + private: + class i2c_ch0_pImpL; + std::unique_ptr pImpL; + }; + + // + // Template for channel 1 + // + template<> + class I2C + { + public: + I2C(const uint8_t& mode):pImpL(mode) + { + } + uint8_t readByte(const uint8_t& address, const uint8_t& reg) + { + return pImpL -> readByte(address, reg); + } + uint16_t readWord(const uint8_t& address, const uint8_t& reg) + { + return pImpL -> readWord(address,reg); + } + uint8_t writeByte(const uint8_t& address, const uint8_t& data) + { + return pImpL -> writeByte(address, data); + } + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) + { + return pImpL -> writeWord(address, reg, data); + } + + private: + class i2c_ch1_pImpL; + std::unique_ptr pImpL; + }; + +}// Namespace serial + + +#endif // _I2C_H_ diff --git a/developpment/interfacer/i2c_ch0_pImpL.cpp b/developpment/interfacer/i2c_ch0_pImpL.cpp new file mode 100644 index 0000000..3b34f6e --- /dev/null +++ b/developpment/interfacer/i2c_ch0_pImpL.cpp @@ -0,0 +1,107 @@ +#include "i2c_ch0_pImpL.h" +#include "systemCall.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define PORT_I2C "/dev/i2c-1" + +// some curious things https://www.john.geek.nz/2012/12/update-reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/ + + +i2c_ch0_pImpL::i2c_ch0_pImpL(const uint8_t& mode) +{ + char filename[20]; + snprintf(filename, 19, "/dev/i2c-%d", 0); + + deviceDescriptor = open(filename, O_RDWR); + if (deviceDescriptor < 0) { + std::cout << "unable to open : "<< deviceDescriptor << " ! quiting" << std::endl; + exit(1); + } +} + +uint8_t i2c_ch0_pImpL::writeByte(const uint8_t& address, const uint8_t& data) // retuns 0 when a sucsessful transation ocures +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = data; + + if ((write(deviceDescriptor, send_buffer, 1)) != 1) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint8_t i2c_ch0_pImpL::readByte(const uint8_t& address, const uint8_t& reg) +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 1) != 1) // An then initare a read request of 1 byte + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + return recieve_buffer[0] ; +} + + +uint8_t i2c_ch0_pImpL::writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) // retuns 0 when a sucsessful transation ocures +{ + + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = reg; + send_buffer[1] = data; + + if ((write(deviceDescriptor, send_buffer, 2)) != 2) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint16_t i2c_ch0_pImpL::readWord(const uint8_t& address, const uint8_t& reg) +{ + uint16_t result = 0 ; + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 2) != 2) // An then initare a read request of 2 bytes + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + result = (recieve_buffer[0] << 8) + recieve_buffer[1] ; + return result ; +} diff --git a/developpment/interfacer/i2c_ch0_pImpL.h b/developpment/interfacer/i2c_ch0_pImpL.h new file mode 100644 index 0000000..c91299c --- /dev/null +++ b/developpment/interfacer/i2c_ch0_pImpL.h @@ -0,0 +1,31 @@ +#ifndef _I2C_CH0_PIMPL_H_ +#define _I2C_CH0_PIMPL_H_ + +#include +#include +#include +#include "errorHandling.h" + +class i2c_ch0_pImpL +{ + public: + i2c_ch0_pImpL(const uint8_t& mode); // Mode : Master or Slave + uint8_t readByte(const uint8_t& address, const uint8_t& reg); + uint16_t readWord(const uint8_t& address, const uint8_t& reg); + uint8_t writeByte(const uint8_t& address, const uint8_t& data); + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data); + + + private: + int16_t deviceDescriptor; + uint8_t device_address; + uint8_t device_reg; + uint8_t send_buffer[32]; + uint8_t recieve_buffer[32]; + uint8_t blocks; + uint8_t channel; + uint8_t mode; +}; + + +#endif // _I2C_CH0_PIMPL_H_ diff --git a/developpment/interfacer/i2c_ch1_pImpL.cpp b/developpment/interfacer/i2c_ch1_pImpL.cpp new file mode 100644 index 0000000..a498ea2 --- /dev/null +++ b/developpment/interfacer/i2c_ch1_pImpL.cpp @@ -0,0 +1,107 @@ +#include "i2c_ch1_pImpL.hpp" +#include "systemCall.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define PORT_I2C "/dev/i2c-1" + +// some curious things https://www.john.geek.nz/2012/12/update-reading-data-from-a-bosch-bmp085-with-a-raspberry-pi/ + + +i2c_ch1_pImpL::i2c_ch1_pImpL(const uint8_t& mode) +{ + char filename[20]; + snprintf(filename, 19, "/dev/i2c-%d", 1); + + deviceDescriptor = open(filename, O_RDWR); + if (deviceDescriptor < 0) { + std::cout << "unable to open : "<< deviceDescriptor << " ! quiting" << std::endl; + exit(1); + } +} + +uint8_t i2c_ch1_pImpL::writeByte(const uint8_t& address, const uint8_t& data) // retuns 0 when a sucsessful transation ocures +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = data; + + if ((write(deviceDescriptor, send_buffer, 1)) != 1) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint8_t i2c_ch1_pImpL::readByte(const uint8_t& address, const uint8_t& reg) +{ + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 1) != 1) // An then initare a read request of 1 byte + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + return recieve_buffer[0] ; +} + + +uint8_t i2c_ch1_pImpL::writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data) // retuns 0 when a sucsessful transation ocures +{ + + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + send_buffer[0] = reg; + send_buffer[1] = data; + + if ((write(deviceDescriptor, send_buffer, 2)) != 2) + { + std::cout << "Unable to write quiting" << std::endl; + exit(0); + } + return 0; +} + +uint16_t i2c_ch1_pImpL::readWord(const uint8_t& address, const uint8_t& reg) +{ + uint16_t result = 0 ; + if (ioctl(deviceDescriptor, I2C_SLAVE, address) < 0) + { + std::cout << "Unable to reach device : "<< address << " ! quiting" << std::endl; + exit(1); + } + + writeByte(address,reg); //Initiate a write to indicate the desired register to read + + if (read(deviceDescriptor, recieve_buffer, 2) != 2) // An then initare a read request of 2 bytes + { + std::cout << "Unable to read quiting" << std::endl; + exit(1); + } + result = (recieve_buffer[0] << 8) + recieve_buffer[1] ; + return result ; +} diff --git a/developpment/interfacer/i2c_ch1_pImpL.hpp b/developpment/interfacer/i2c_ch1_pImpL.hpp new file mode 100644 index 0000000..4c5d5fd --- /dev/null +++ b/developpment/interfacer/i2c_ch1_pImpL.hpp @@ -0,0 +1,31 @@ +#ifndef _I2C_CH1_PIMPL_H_ +#define _I2C_CH1_PIMPL_H_ + +#include +#include +#include +#include "errorHandling.h" + +class i2c_ch1_pImpL +{ + public: + i2c_ch1_pImpL(const uint8_t& mode); // Mode : Master or Slave + uint8_t readByte(const uint8_t& address, const uint8_t& reg); + uint16_t readWord(const uint8_t& address, const uint8_t& reg); + uint8_t writeByte(const uint8_t& address, const uint8_t& data); + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data); + + + private: + int16_t deviceDescriptor; + uint8_t device_address; + uint8_t device_reg; + uint8_t send_buffer[32]; + uint8_t recieve_buffer[32]; + uint8_t blocks; + uint8_t channel; + uint8_t mode; +}; + + +#endif // _I2C_CH1_PIMPL_H_ diff --git a/developpment/interfacer/i2c_driver.h b/developpment/interfacer/i2c_driver.h index 26396c7..dbbc361 100644 --- a/developpment/interfacer/i2c_driver.h +++ b/developpment/interfacer/i2c_driver.h @@ -9,9 +9,8 @@ class I2C_Driver I2C_Driver(const uint8_t& channel, const uint8_t& mode); uint8_t readByte(const uint8_t& address, const uint8_t& reg); uint16_t readWord(const uint8_t& address, const uint8_t& reg); - - uint8_t writeByte(const uint8_t& address, const uint8_t& data); // retuns 0 when a sucsessful transation ocures - uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data); // retuns 0 when a sucsessful transation ocures + uint8_t writeByte(const uint8_t& address, const uint8_t& data); + uint8_t writeWord(const uint8_t& address, const uint8_t& reg, const uint16_t& data); private: diff --git a/developpment/interfacer/interfacer.cpp b/developpment/interfacer/interfacer.cpp index 3807fe6..33911e6 100644 --- a/developpment/interfacer/interfacer.cpp +++ b/developpment/interfacer/interfacer.cpp @@ -13,6 +13,7 @@ #include "commandManager.h" #include "systemCall.h" #include "bh1750.h" +//#include "i2c_ch1_pImpL.cpp" #include