1ab1327c3SLei YU #pragma once 2ab1327c3SLei YU 3ab1327c3SLei YU #include "i2c_interface.hpp" 4ab1327c3SLei YU 5ab1327c3SLei YU namespace i2c 6ab1327c3SLei YU { 7ab1327c3SLei YU 8ab1327c3SLei YU class I2CDevice : public I2CInterface 9ab1327c3SLei YU { 10ab1327c3SLei YU private: 11ab1327c3SLei YU I2CDevice() = delete; 12ab1327c3SLei YU 13*9af82a5cSLei YU /** @brief Constructor 14*9af82a5cSLei YU * 15*9af82a5cSLei YU * Construct I2CDevice object from the bus id and device address 16*9af82a5cSLei YU * 17*9af82a5cSLei YU * @param[in] busId - The i2c bus ID 18*9af82a5cSLei YU * @param[in] devAddr - The device address of the I2C device 19*9af82a5cSLei YU */ 20*9af82a5cSLei YU explicit I2CDevice(uint8_t busId, uint8_t devAddr) : 21*9af82a5cSLei YU busId(busId), devAddr(devAddr) 22ab1327c3SLei YU { 23*9af82a5cSLei YU busStr = "/dev/i2c-" + std::to_string(busId); 24*9af82a5cSLei YU open(); 25ab1327c3SLei YU } 26ab1327c3SLei YU 27*9af82a5cSLei YU /** @brief Open the i2c device */ 28*9af82a5cSLei YU void open(); 29*9af82a5cSLei YU 30*9af82a5cSLei YU /** @brief Close the i2c device */ 31*9af82a5cSLei YU void close(); 32*9af82a5cSLei YU 33*9af82a5cSLei YU /** @brief The I2C bus ID */ 34*9af82a5cSLei YU uint8_t busId; 35*9af82a5cSLei YU 36*9af82a5cSLei YU /** @brief The i2c device address in the bus */ 37*9af82a5cSLei YU uint8_t devAddr; 38*9af82a5cSLei YU 39*9af82a5cSLei YU /** @brief The file descriptor of the opened i2c device */ 40*9af82a5cSLei YU int fd; 41*9af82a5cSLei YU 42*9af82a5cSLei YU /** @brief The i2c bus path in /dev */ 43*9af82a5cSLei YU std::string busStr; 44*9af82a5cSLei YU 45ab1327c3SLei YU public: 46*9af82a5cSLei YU ~I2CDevice() 47*9af82a5cSLei YU { 48*9af82a5cSLei YU close(); 49*9af82a5cSLei YU } 50ab1327c3SLei YU 51ab1327c3SLei YU /** @copydoc I2CInterface::read(uint8_t&) */ 52ab1327c3SLei YU void read(uint8_t& data) override; 53ab1327c3SLei YU 54ab1327c3SLei YU /** @copydoc I2CInterface::read(uint8_t,uint8_t&) */ 55ab1327c3SLei YU void read(uint8_t addr, uint8_t& data) override; 56ab1327c3SLei YU 57ab1327c3SLei YU /** @copydoc I2CInterface::read(uint8_t,uint16_t&) */ 58ab1327c3SLei YU void read(uint8_t addr, uint16_t& data) override; 59ab1327c3SLei YU 60ab1327c3SLei YU /** @copydoc I2CInterface::read(uint8_t,uint8_t&,uint8_t*) */ 61ab1327c3SLei YU void read(uint8_t addr, uint8_t& size, uint8_t* data) override; 62ab1327c3SLei YU 63ab1327c3SLei YU /** @copydoc I2CInterface::write(uint8_t) */ 64ab1327c3SLei YU void write(uint8_t data) override; 65ab1327c3SLei YU 66ab1327c3SLei YU /** @copydoc I2CInterface::write(uint8_t,uint8_t) */ 67ab1327c3SLei YU void write(uint8_t addr, uint8_t data) override; 68ab1327c3SLei YU 69ab1327c3SLei YU /** @copydoc I2CInterface::write(uint8_t,uint16_t) */ 70ab1327c3SLei YU void write(uint8_t addr, uint16_t data) override; 71ab1327c3SLei YU 72ab1327c3SLei YU /** @copydoc I2CInterface::write(uint8_t,uint8_t,const uint8_t*) */ 73ab1327c3SLei YU void write(uint8_t addr, uint8_t size, const uint8_t* data) override; 74ab1327c3SLei YU 75ab1327c3SLei YU /** @brief Create an I2CInterface instance 76ab1327c3SLei YU * 77ab1327c3SLei YU * @param[in] busId - The i2c bus ID 78ab1327c3SLei YU * @param[in] devAddr - The device address of the i2c 79ab1327c3SLei YU * 80ab1327c3SLei YU * @return The unique_ptr holding the I2CInterface 81ab1327c3SLei YU */ 82ab1327c3SLei YU static std::unique_ptr<I2CInterface> create(uint8_t busId, uint8_t devAddr); 83ab1327c3SLei YU }; 84ab1327c3SLei YU 85ab1327c3SLei YU } // namespace i2c 86