33#include "../SensorCommBase.hpp"
38#if (defined(ARDUINO_ARCH_RP2040) || defined(ARDUINO_ARCH_STM32)) && !defined(ARDUINO_ARCH_MBED)
39#define __writeBytes(txBuf,size) spi.transfer(txBuf,nullptr,size)
40#elif defined(ARDUINO_ARCH_NRF52)
41#define __writeBytes(txBuf,size) spi.transfer(txBuf,nullptr,size)
42#elif defined(ARDUINO_ARCH_MBED) || defined(ARDUINO_ARCH_ZEPHYR)
43#define __writeBytes(txBuf,size) spi.transfer((void*)txBuf,size)
45#define __writeBytes(txBuf,size) spi.writeBytes(txBuf,size)
52 SensorCommSPI(SPIClass &spi, uint8_t csPin,
SensorHal *hal) : spi(spi), csPin(csPin), hal(hal) {}
53 SensorCommSPI(SPIClass &spi, uint8_t csPin,
int mosi,
int miso,
int sck,
SensorHal *hal) : spi(spi),
54 csPin(csPin), hal(hal), mosi(mosi), miso(miso), sck(sck) {}
62 if (mosi != -1 && miso != -1 && sck != -1) {
63#if defined(ARDUINO_ARCH_NRF52)
64 spi.setPins(miso, sck, mosi);
66#elif defined(ARDUINO_ARCH_ESP32)
67 spi.begin(sck, miso, mosi);
68#elif defined(ARDUINO_ARCH_RP2040)
69#if !defined(ARDUINO_ARCH_MBED)
75#elif defined(ARDUINO_ARCH_STM32)
81#warning "SPI custom GPIO mapping function is not implemented"
87 hal->pinMode(csPin, OUTPUT);
88 hal->digitalWrite(csPin, HIGH);
100 if (hal ==
nullptr) {
103 hal->digitalWrite(csPin, LOW);
104 spi.beginTransaction(setting);
106 for (
size_t i = 0;
i < len; ++
i) {
107 spi.transfer(
buf[
i]);
109 spi.endTransaction();
110 hal->digitalWrite(csPin, HIGH);
116 if (hal ==
nullptr) {
119 hal->digitalWrite(csPin, LOW);
120 spi.beginTransaction(setting);
122 for (
size_t i = 0;
i < len; ++
i) {
123 buf[
i] = spi.transfer(0x00);
125 spi.endTransaction();
126 hal->digitalWrite(csPin, HIGH);
130 int writeBuffer(uint8_t *buffer,
size_t len)
override
132 if (hal ==
nullptr) {
135 hal->digitalWrite(csPin, LOW);
136 spi.beginTransaction(setting);
137 if (buffer && len > 0) {
139 __writeBytes(buffer, len);
141 spi.endTransaction();
142 hal->digitalWrite(csPin, HIGH);
148 if (hal ==
nullptr) {
151 hal->digitalWrite(csPin, LOW);
152 spi.beginTransaction(setting);
153 spi.transfer(reg | 0x80);
154#if defined(ARDUINO_ARCH_ESP32)
155 spi.transferBytes(NULL,
buf, len);
157 for (
size_t i = 0;
i < len;
i++) {
158 buf[
i] = spi.transfer(0x00);
161 spi.endTransaction();
162 hal->digitalWrite(csPin, HIGH);
166 int writeThenRead(
const uint8_t *write_buffer,
size_t write_len, uint8_t *read_buffer,
size_t read_len)
override
168 if (hal ==
nullptr) {
171 hal->digitalWrite(csPin, LOW);
172 spi.beginTransaction(setting);
175 __writeBytes(write_buffer, write_len);
177 spi.endTransaction();
179 spi.beginTransaction(setting);
180 for (
size_t i = 0;
i < read_len; ++
i) {
181 read_buffer[
i] = spi.transfer(0x00);
183 spi.endTransaction();
184 hal->digitalWrite(csPin, HIGH);
190#if defined(__cpp_rtti)
191 const auto pdat =
dynamic_cast<const SPIParam *
>(¶ms);
193 const auto pdat =
static_cast<const SPIParam *
>(¶ms);
Abstract base for all communication parameter objects.
SPI communication parameters.
SPISettings getSetting() const
Retrieve the stored SPI settings.
Emulation of Arduino's SPISettings class.
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.
void setError(SENSOR_ERROR_CODE e)
Abstract hardware abstraction layer.