SensorLib 0.5.0
Multi-platform sensor driver library for Arduino, PlatformIO, and ESP-IDF
Loading...
Searching...
No Matches
SensorCommArduino_I2C.hpp
Go to the documentation of this file.
1
31#pragma once
32
33#include "../SensorCommBase.hpp"
34
35#ifdef ARDUINO
36
37class SensorCommI2C : public SensorCommBase
38{
39public:
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) {}
42
43 bool init() override
44 {
45 setPins();
46 wire.begin();
47 return true;
48 }
49
50 void deinit() override
51 {
52 // Do not destroy wire bus
53 // wire.end();
54 }
55
56 int writeRegister(const uint8_t reg, uint8_t *buf, size_t len) override
57 {
58 wire.beginTransmission(addr);
59 wire.write(reg);
60 if (buf && len > 0) {
61 wire.write(buf, len);
62 }
63 uint8_t err = wire.endTransmission();
64 return getErrorCode(err);
65 }
66
67 int writeBuffer(uint8_t *buffer, size_t len) override
68 {
69 if (!buffer || len == 0) return SENSOR_ERR_INVALID_ARG;
70 wire.beginTransmission(addr);
71 wire.write(buffer, len);
72 uint8_t err = wire.endTransmission();
73 return getErrorCode(err);
74 }
75
76 int readBuffer(uint8_t *buf, size_t len) override
77 {
78 wire.requestFrom(addr, static_cast<uint8_t>(len));
79 return wire.readBytes(buf, len) == len ? SENSOR_OK : SENSOR_ERR_COMM_NACK;
80 }
81
82 int readRegister(const uint8_t reg, uint8_t *buf, size_t len) override
83 {
84 wire.beginTransmission(addr);
85 wire.write(reg);
86 uint8_t err = wire.endTransmission(sendStopFlag);
87 if (err != 0) {
88 return getErrorCode(err);
89 }
90 wire.requestFrom(addr, static_cast<uint8_t>(len));
91 return wire.readBytes(buf, len) == len ? SENSOR_OK : SENSOR_ERR_COMM_NACK;
92 }
93
94 int writeThenRead(const uint8_t *write_buffer, size_t write_len, uint8_t *read_buffer, size_t read_len) override
95 {
96 wire.beginTransmission(addr);
97 wire.write(write_buffer, write_len);
98 uint8_t err = wire.endTransmission(sendStopFlag);
99 if (err != 0) {
100 return getErrorCode(err);
101 }
102 wire.requestFrom(addr, read_len);
103 return wire.readBytes(read_buffer, read_len) == read_len ? SENSOR_OK : SENSOR_ERR_COMM_NACK;
104 }
105
106 void setParams(const CommParamsBase &params) override
107 {
108#if defined(__cpp_rtti)
109 const auto pdat = dynamic_cast<const I2CParam *>(&params);
110#else
111 const auto pdat = static_cast<const I2CParam *>(&params);
112#endif
113 uint8_t type = pdat->getType();
114 switch (type) {
116 addr = pdat->getParams();
117 break;
119 sendStopFlag = pdat->getParams();
120 break;
121 default:
122 break;
123 }
124 }
125
126private:
127
128 // https://docs.arduino.cc/language-reference/en/functions/communication/wire/endTransmission/
129 int inline getErrorCode(int err)
130 {
131 switch (err) {
132 case 0: break;
133 case 1: return SENSOR_ERR_COMM_DATA_TOO_LONG;
134 case 2: return SENSOR_ERR_COMM_NACK;
135 case 3: return SENSOR_ERR_COMM_NACK;
136 case 4: return SENSOR_ERR_COMM_BUS;
137 case 5: return SENSOR_ERR_COMM_TIMEOUT;
138 default: return SENSOR_ERR_UNKNOWN;
139 }
140 return SENSOR_OK;
141 }
142
143 void setPins()
144 {
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)
149 wire.end();
150#if !defined(ARDUINO_ARCH_MBED)
151 wire.setSDA(sda);
152 wire.setSCL(scl);
153#endif /*ARDUINO_ARCH_MBED*/
154
155#elif defined(ARDUINO_ARCH_MBED)
156 //No thing.
157#else
158#warning "Wire custom GPIO mapping function is not implemented"
159#endif
160 }
161 }
162 SensorHal *hal;
163 TwoWire &wire;
164 uint8_t addr;
165 int sda;
166 int scl;
167 bool sendStopFlag;
168};
169
170#endif //*ARDUINO
@ SENSOR_ERR_UNKNOWN
Definition SensorErr.hpp:49
@ SENSOR_ERR_COMM_BUS
Definition SensorErr.hpp:57
@ SENSOR_ERR_COMM_TIMEOUT
Definition SensorErr.hpp:54
@ SENSOR_OK
Definition SensorErr.hpp:37
@ SENSOR_ERR_COMM_NACK
Definition SensorErr.hpp:55
@ SENSOR_ERR_INVALID_ARG
Definition SensorErr.hpp:43
@ SENSOR_ERR_COMM_DATA_TOO_LONG
Definition SensorErr.hpp:61
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 &params)=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.
char buf[64]