33#include "../SensorCommBase.hpp"
40 SensorCommI2C(TwoWire &wire, uint8_t addr,
int sda,
int scl,
SensorHal *hal =
nullptr)
41 : hal(hal), wire(wire), addr(addr), sda(sda), scl(scl), sendStopFlag(true) {}
58 wire.beginTransmission(addr);
63 uint8_t err = wire.endTransmission();
64 return getErrorCode(err);
67 int writeBuffer(uint8_t *buffer,
size_t len)
override
70 wire.beginTransmission(addr);
71 wire.write(buffer, len);
72 uint8_t err = wire.endTransmission();
73 return getErrorCode(err);
78 wire.requestFrom(addr,
static_cast<uint8_t
>(len));
84 wire.beginTransmission(addr);
86 uint8_t err = wire.endTransmission(sendStopFlag);
88 return getErrorCode(err);
90 wire.requestFrom(addr,
static_cast<uint8_t
>(len));
94 int writeThenRead(
const uint8_t *write_buffer,
size_t write_len, uint8_t *read_buffer,
size_t read_len)
override
96 wire.beginTransmission(addr);
97 wire.write(write_buffer, write_len);
98 uint8_t err = wire.endTransmission(sendStopFlag);
100 return getErrorCode(err);
102 wire.requestFrom(addr, read_len);
108#if defined(__cpp_rtti)
109 const auto pdat =
dynamic_cast<const I2CParam *
>(¶ms);
111 const auto pdat =
static_cast<const I2CParam *
>(¶ms);
113 uint8_t type = pdat->
getType();
116 addr = pdat->getParams();
119 sendStopFlag = pdat->getParams();
129 int inline getErrorCode(
int err)
145 if (sda != -1 && scl != -1) {
146#if defined(ARDUINO_ARCH_NRF52) || defined(ARDUINO_ARCH_ESP32)
147 wire.setPins(sda, scl);
148#elif (defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_STM32)) && !defined(ARDUINO_ARCH_MBED)
150#if !defined(ARDUINO_ARCH_MBED)
155#elif defined(ARDUINO_ARCH_MBED)
158#warning "Wire custom GPIO mapping function is not implemented"
@ SENSOR_ERR_COMM_TIMEOUT
@ SENSOR_ERR_COMM_DATA_TOO_LONG
Abstract base for all communication parameter objects.
I2C communication parameters.
uint8_t getType() const
Retrieve the parameter type.
@ I2C_SET_ADDR
Set device address.
@ I2C_SET_FLAG
Set a generic flag (interpretation depends on driver)
Abstract base class for low‑level sensor communication.
virtual int writeThenRead(const uint8_t *write_buffer, size_t write_len, uint8_t *read_buffer, size_t read_len)=0
Perform a write followed by a read (e.g., for register‑based sensors).
virtual int readBuffer(uint8_t *buf, size_t len)=0
Read bytes directly from the device (no register address sent).
virtual int writeBuffer(uint8_t *buffer, size_t len)=0
Write a buffer directly to the device (no register address).
virtual void setParams(const CommParamsBase ¶ms)=0
Apply communication parameters (e.g., I2C address, SPI settings).
virtual int readRegister(const uint8_t reg)
Read a single byte from a register.
virtual void deinit()=0
Deinitialise the communication interface (close device, etc.).
virtual bool init()=0
Initialise the communication interface (open device, etc.).
virtual int writeRegister(const uint8_t reg, uint8_t val)
Write a single byte to a register.
Abstract hardware abstraction layer.