From c843aaf33f83ee50a80b439fa0c9c8f87686a39d Mon Sep 17 00:00:00 2001 From: dario Date: Sat, 13 Apr 2024 17:45:53 +0200 Subject: [PATCH] Updated I2C for ESP32 and added mutex protection for printable serial --- include/sta/devices/arduino/bus/i2c.hpp | 5 +++++ include/sta/devices/arduino/mcu/esp32_s3.hpp | 5 +++++ .../sta/devices/arduino/printable_serial.hpp | 11 +++++++++-- src/devices/arduino/bus/i2c.cpp | 18 +++++++++++------- src/devices/arduino/printable_serial.cpp | 8 ++++++-- 5 files changed, 36 insertions(+), 11 deletions(-) diff --git a/include/sta/devices/arduino/bus/i2c.hpp b/include/sta/devices/arduino/bus/i2c.hpp index 44ac845..eda90c9 100644 --- a/include/sta/devices/arduino/bus/i2c.hpp +++ b/include/sta/devices/arduino/bus/i2c.hpp @@ -6,13 +6,18 @@ #include #include +#include namespace sta { class ArduinoI2C : public I2C { public: +#ifdef STA_PLATFORM_ARDUINO_DEVICE_ESP32 + ArduinoI2C(Mutex * mutex = nullptr, uint8_t sda = STA_ESP32_SDA_DEFAULT_PIN, uint8_t scl = STA_ESP32_SCL_DEFAULT_PIN, uint32_t frequency = 0U); +#else ArduinoI2C(Mutex * mutex = nullptr); +#endif // STA_PLATFORM_ARDUINO_DEVICE_ESP32 void transfer(uint8_t value) override; void transfer16(uint16_t value) override; diff --git a/include/sta/devices/arduino/mcu/esp32_s3.hpp b/include/sta/devices/arduino/mcu/esp32_s3.hpp index d05b505..94e4a5a 100644 --- a/include/sta/devices/arduino/mcu/esp32_s3.hpp +++ b/include/sta/devices/arduino/mcu/esp32_s3.hpp @@ -3,8 +3,13 @@ #include +#define STA_MCU_LITTLE_ENDIAN + #define STA_PLATFORM_ARDUINO_DEVICE_ESP32 #define STA_MCU_ESP32_S3 +#define STA_ESP32_SCL_DEFAULT_PIN 22 +#define STA_ESP32_SDA_DEFAULT_PIN 21 + #endif // STA_CORE_ARDUINO_MCU_ESP32_S3_HPP \ No newline at end of file diff --git a/include/sta/devices/arduino/printable_serial.hpp b/include/sta/devices/arduino/printable_serial.hpp index bbe713d..c17e0e8 100644 --- a/include/sta/devices/arduino/printable_serial.hpp +++ b/include/sta/devices/arduino/printable_serial.hpp @@ -4,15 +4,20 @@ #include #ifdef STA_PLATFORM_ARDUINO +#include + namespace sta { class PrintableSerial: public Printable { public: /** - * @brief Construct a new Printable Serial object + * @brief Printable implementation for Arduino Serial printing. + * + * @param baud The baud rate for serial printing. + * @param mutex An optional mutex to protect the serial bus. */ - PrintableSerial(unsigned long baud); + PrintableSerial(unsigned long baud, Mutex * mutex = nullptr); /** * @brief Print string. @@ -21,6 +26,8 @@ namespace sta * @param length String length */ void print(const char * str, size_t length) override; + private: + Mutex * mutex_; }; } // namespace sta diff --git a/src/devices/arduino/bus/i2c.cpp b/src/devices/arduino/bus/i2c.cpp index 1367782..afb866e 100644 --- a/src/devices/arduino/bus/i2c.cpp +++ b/src/devices/arduino/bus/i2c.cpp @@ -7,11 +7,19 @@ namespace sta { +#ifdef STA_PLATFORM_ARDUINO_DEVICE_ESP32 + ArduinoI2C::ArduinoI2C(Mutex * mutex /* = nullptr */, uint8_t sda /* = STA_ESP32_SDA_DEFAULT_PIN */, uint8_t scl /*= STA_ESP32_SCL_DEFAULT_PIN */, uint32_t frequency /* = 0U */) + : I2C{mutex} + { + Wire.begin(sda, scl, frequency); + } +#else ArduinoI2C::ArduinoI2C(Mutex * mutex /* = nullptr */) : I2C{mutex} { Wire.begin(); } +#endif // STA_PLATFORM_ARDUINO_DEVICE_ESP32 void ArduinoI2C::transfer(uint8_t value) { @@ -36,15 +44,11 @@ namespace sta void ArduinoI2C::receive(uint8_t * buffer, size_t size) { - Wire.requestFrom((uint8_t)address_, (uint8_t)size); - size_t index = 0; + size_t count = Wire.requestFrom((uint8_t)address_, (uint8_t)size, true); - while (index < size) + for (size_t i = 0; i < min(size, count); ++i) { - while (Wire.available()) - { - buffer[index++] = Wire.read(); - } + buffer[i] = Wire.read(); } } diff --git a/src/devices/arduino/printable_serial.cpp b/src/devices/arduino/printable_serial.cpp index 09a81ec..ee3acc0 100644 --- a/src/devices/arduino/printable_serial.cpp +++ b/src/devices/arduino/printable_serial.cpp @@ -3,18 +3,22 @@ #ifdef STA_PLATFORM_ARDUINO #include +#include namespace sta { - PrintableSerial::PrintableSerial(unsigned long baud) - : Printable{} + PrintableSerial::PrintableSerial(unsigned long baud, Mutex * mutex /* = nullptr */) + : Printable{}, + mutex_{mutex} { Serial.begin(baud); } void PrintableSerial::print(const char * str, size_t length) { + mutex_->acquire(); Serial.write(str); + mutex_->release(); } } // namespace sta