diff --git a/.github/workflows/compile-sketch.yml b/.github/workflows/compile-sketch.yml index 8d482f5..eee9338 100644 --- a/.github/workflows/compile-sketch.yml +++ b/.github/workflows/compile-sketch.yml @@ -4,7 +4,10 @@ on: push: branches: - main - #- pull_request + pull_request: + branches: + - main + workflow_dispatch: jobs: @@ -108,4 +111,3 @@ jobs: # outputs: # report-artifact-name: ${{ steps.report-artifact-name.outputs.report-artifact-name }} - diff --git a/src/sfTk/sfTkISerial.h b/src/sfTk/sfTkISerial.h index e972b6c..e84c966 100644 --- a/src/sfTk/sfTkISerial.h +++ b/src/sfTk/sfTkISerial.h @@ -15,7 +15,6 @@ // clang-format off #include "sfTkError.h" -#include // clang-format on /** diff --git a/src/sfTk/sfTkISerialBus.h b/src/sfTk/sfTkISerialBus.h index 0923519..0ece81d 100644 --- a/src/sfTk/sfTkISerialBus.h +++ b/src/sfTk/sfTkISerialBus.h @@ -17,7 +17,6 @@ #include "sfTkError.h" #include "sfTkIBus.h" #include "sfTkISerial.h" -#include // clang-format on const uint8_t ksfTkBusTypeSerialBus = 0x03; diff --git a/src/sfTk/sfTkIUART.h b/src/sfTk/sfTkIUART.h index 6434408..9ce5c15 100644 --- a/src/sfTk/sfTkIUART.h +++ b/src/sfTk/sfTkIUART.h @@ -16,7 +16,6 @@ // clang-format off #include "sfTkError.h" #include "sfTkISerial.h" -#include // clang-format on // Enums follow the Arduino Serial API constants. diff --git a/src/sfTkArdUART.cpp b/src/sfTkArdUART.cpp index 79373fb..7e63721 100644 --- a/src/sfTkArdUART.cpp +++ b/src/sfTkArdUART.cpp @@ -13,7 +13,7 @@ #include #include -#include +#include // clang-format off #include "sfTkArdUART.h" @@ -22,7 +22,7 @@ #include "sfTk/sfTkIUART.h" // clang-format on -sfTkError_t sfTkArdUART::init(arduino::HardwareSerial &hwSerial, sfTkIUART::UARTConfig_t &config, bool bInit) +sfTkError_t sfTkArdUART::init(HardwareSerial &hwSerial, sfTkIUART::UARTConfig_t &config, bool bInit) { _hwSerial = &hwSerial; // set the serial port @@ -34,7 +34,7 @@ sfTkError_t sfTkArdUART::init(arduino::HardwareSerial &hwSerial, sfTkIUART::UART return ksfTkErrOk; } -sfTkError_t sfTkArdUART::init(arduino::HardwareSerial &hwSerial, uint32_t baudRate, bool bInit) +sfTkError_t sfTkArdUART::init(HardwareSerial &hwSerial, uint32_t baudRate, bool bInit) { _hwSerial = &hwSerial; // set the serial port @@ -103,7 +103,11 @@ sfTkError_t sfTkArdUART::read(uint8_t *data, size_t length, size_t &bytesRead) bytesRead = 0; // zero out value - bytesRead = readBytes(data, length); +// #ifdef ARDUINO_ARCH_AVR + bytesRead = _hwSerial->readBytes(data, length); +// #else +// bytesRead = readBytes(data, length); +// #endif if (bytesRead == 0) return ksfTkErrFail; @@ -179,7 +183,12 @@ sfTkError_t sfTkArdUART::_start(void) if (_running) end(); // close the port if already running // set the config +#ifdef ARDUINO_ARCH_ESP8266 + // ESP8266 does not support setting stop bits, parity, and data bits in a stanard manner. + _hwSerial->begin(_config.baudRate); +#else _hwSerial->begin(_config.baudRate, _config.stopBits | _config.parity | _config.dataBits); +#endif if (!availableForWrite()) return ksfTkErrSerialNotInit; // check if the port is available // set the running flag to true @@ -241,7 +250,8 @@ unsigned long sfTkArdUART::getTimeout() return _hwSerial->getTimeout(); } -bool sfTkArdUART::find(const char *target) +#if !defined(ARDUINO_ARCH_AVR) && !defined(ARDUINO_ARCH_ESP8266) +bool sfTkArdUART::find(CONSTVAR char *target) { if (!_hwSerial) return false; @@ -249,7 +259,7 @@ bool sfTkArdUART::find(const char *target) return _hwSerial->find(target); } -bool sfTkArdUART::find(const uint8_t *target) +bool sfTkArdUART::find(CONSTVAR uint8_t *target) { if (!_hwSerial) return false; @@ -257,7 +267,7 @@ bool sfTkArdUART::find(const uint8_t *target) return _hwSerial->find(target); } -bool sfTkArdUART::find(const char *target, size_t length) +bool sfTkArdUART::find(CONSTVAR char *target, size_t length) { if (!_hwSerial) return false; @@ -265,7 +275,7 @@ bool sfTkArdUART::find(const char *target, size_t length) return _hwSerial->find(target, length); } -bool sfTkArdUART::find(const uint8_t *target, size_t length) +bool sfTkArdUART::find(CONSTVAR uint8_t *target, size_t length) { if (!_hwSerial) return false; @@ -281,7 +291,7 @@ bool sfTkArdUART::find(char target) return _hwSerial->find(target); } -bool sfTkArdUART::findUntil(const char *target, const char *terminator) +bool sfTkArdUART::findUntil(CONSTVAR char *target, CONSTVAR char *terminator) { if (!_hwSerial) return false; @@ -289,7 +299,7 @@ bool sfTkArdUART::findUntil(const char *target, const char *terminator) return _hwSerial->findUntil(target, terminator); } -bool sfTkArdUART::findUntil(const uint8_t *target, const char *terminator) +bool sfTkArdUART::findUntil(CONSTVAR uint8_t *target, CONSTVAR char *terminator) { if (!_hwSerial) return false; @@ -297,7 +307,7 @@ bool sfTkArdUART::findUntil(const uint8_t *target, const char *terminator) return _hwSerial->findUntil(target, terminator); } -bool sfTkArdUART::findUntil(const char *target, size_t targetLen, const char *terminate, size_t termLen) +bool sfTkArdUART::findUntil(CONSTVAR char *target, size_t targetLen, CONSTVAR char *terminate, size_t termLen) { if (!_hwSerial) return false; @@ -305,7 +315,7 @@ bool sfTkArdUART::findUntil(const char *target, size_t targetLen, const char *te return _hwSerial->findUntil(target, targetLen, terminate, termLen); } -bool sfTkArdUART::findUntil(const uint8_t *target, size_t targetLen, const char *terminate, size_t termLen) +bool sfTkArdUART::findUntil(CONSTVAR uint8_t *target, size_t targetLen, CONSTVAR char *terminate, size_t termLen) { if (!_hwSerial) return false; @@ -313,7 +323,24 @@ bool sfTkArdUART::findUntil(const uint8_t *target, size_t targetLen, const char return _hwSerial->findUntil(target, targetLen, terminate, termLen); } -long sfTkArdUART::parseInt(arduino::LookaheadMode lookahead, char ignore) +#ifdef ARDUINO_ARCH_ESP8266 +long sfTkArdUART::parseInt() +{ + if (!_hwSerial) + return 0; + + return _hwSerial->parseInt(); +} + +float sfTkArdUART::parseFloat() +{ + if (!_hwSerial) + return 0.0f; + + return _hwSerial->parseFloat(); +} +#else +long sfTkArdUART::parseInt(LookaheadMode lookahead, char ignore) { if (!_hwSerial) return 0; @@ -321,13 +348,14 @@ long sfTkArdUART::parseInt(arduino::LookaheadMode lookahead, char ignore) return _hwSerial->parseInt(lookahead, ignore); } -float sfTkArdUART::parseFloat(arduino::LookaheadMode lookahead, char ignore) +float sfTkArdUART::parseFloat(LookaheadMode lookahead, char ignore) { if (!_hwSerial) return 0.0f; return _hwSerial->parseFloat(lookahead, ignore); } +#endif size_t sfTkArdUART::readBytes(char *buffer, size_t length) { @@ -361,18 +389,18 @@ size_t sfTkArdUART::readBytesUntil(char terminator, uint8_t *buffer, size_t leng return _hwSerial->readBytesUntil(terminator, buffer, length); } -arduino::String sfTkArdUART::readString() +String sfTkArdUART::readString() { if (!_hwSerial) - return arduino::String(""); + return String(""); return _hwSerial->readString(); } -arduino::String sfTkArdUART::readStringUntil(char terminator) +String sfTkArdUART::readStringUntil(char terminator) { if (!_hwSerial) - return arduino::String(""); + return String(""); return _hwSerial->readStringUntil(terminator); } @@ -381,7 +409,7 @@ arduino::String sfTkArdUART::readStringUntil(char terminator) * @brief Print mappings * */ -size_t sfTkArdUART::print(const arduino::__FlashStringHelper *ifsh) +size_t sfTkArdUART::print(const __FlashStringHelper *ifsh) { if (!_hwSerial) return 0; @@ -389,7 +417,7 @@ size_t sfTkArdUART::print(const arduino::__FlashStringHelper *ifsh) return _hwSerial->print(ifsh); } -size_t sfTkArdUART::print(const arduino::String &s) +size_t sfTkArdUART::print(const String &s) { if (!_hwSerial) return 0; @@ -477,7 +505,7 @@ size_t sfTkArdUART::print(double n, int digits) return _hwSerial->print(n, digits); } -size_t sfTkArdUART::print(const arduino::Printable &x) +size_t sfTkArdUART::print(const Printable &x) { if (!_hwSerial) return 0; @@ -485,7 +513,7 @@ size_t sfTkArdUART::print(const arduino::Printable &x) return _hwSerial->print(x); } -size_t sfTkArdUART::println(const arduino::__FlashStringHelper *ifsh) +size_t sfTkArdUART::println(const __FlashStringHelper *ifsh) { if (!_hwSerial) return 0; @@ -493,7 +521,7 @@ size_t sfTkArdUART::println(const arduino::__FlashStringHelper *ifsh) return _hwSerial->println(ifsh); } -size_t sfTkArdUART::println(const arduino::String &s) +size_t sfTkArdUART::println(const String &s) { if (!_hwSerial) return 0; @@ -581,7 +609,7 @@ size_t sfTkArdUART::println(double n, int digits) return _hwSerial->println(n, digits); } -size_t sfTkArdUART::println(const arduino::Printable &x) +size_t sfTkArdUART::println(const Printable &x) { if (!_hwSerial) return 0; @@ -596,27 +624,4 @@ size_t sfTkArdUART::println(void) return _hwSerial->println(); } - -size_t sfTkArdUART::printf(const char *format, ...) -{ - if (!_hwSerial) - return 0; - - va_list argptr; - va_start(argptr, format); - size_t retVal = _hwSerial->printf(format, argptr); - va_end(argptr); - return retVal; -} - -size_t sfTkArdUART::printf_P(const char *format, ...) -{ - if (!_hwSerial) - return 0; - - va_list argptr; - va_start(argptr, format); - size_t retVal = _hwSerial->printf_P(format, argptr); - va_end(argptr); - return retVal; -} +#endif diff --git a/src/sfTkArdUART.h b/src/sfTkArdUART.h index 9f9657c..927809c 100644 --- a/src/sfTkArdUART.h +++ b/src/sfTkArdUART.h @@ -13,13 +13,11 @@ #pragma once -#include - #include -#include -#include -#include -#include +#include +#include +#include +#include // clang-format off // Include our platform UART interface definitions. @@ -32,6 +30,12 @@ #define NO_IGNORE_CHAR '\x01' // a char not found in a valid ASCII numeric field +#ifdef ARDUINO_ARCH_AVR +#define CONSTVAR +#else +#define CONSTVAR const +#endif + /** * @brief The sfTkArdUART implements an sfTkIUART interface, defining the Arduino implementation for UART in the Toolkit */ @@ -68,7 +72,7 @@ class sfTkArdUART : public sfTkIUART * * @param uartPort Port for UART communication. */ - sfTkArdUART(arduino::HardwareSerial &hwSerial) : sfTkIUART(), _hwSerial{&hwSerial} + sfTkArdUART(HardwareSerial &hwSerial) : sfTkIUART(), _hwSerial{&hwSerial} { } @@ -126,7 +130,7 @@ class sfTkArdUART : public sfTkIUART * * @retval ksfTkErrOk on successful execution. */ - sfTkError_t init(arduino::HardwareSerial &hwSerial, uint32_t baudRate, bool bInit = false); + sfTkError_t init(HardwareSerial &hwSerial, uint32_t baudRate, bool bInit = false); /** * @brief Method sets up the required UART settings. @@ -137,7 +141,7 @@ class sfTkArdUART : public sfTkIUART * * @retval ksftkErrOk on successful execution. */ - sfTkError_t init(arduino::HardwareSerial &hwSerial, sfTkIUART::UARTConfig_t &config, bool bInit = false); + sfTkError_t init(HardwareSerial &hwSerial, sfTkIUART::UARTConfig_t &config, bool bInit = false); /** * @brief Write `len` bytes to the UART TX buffer. @@ -240,24 +244,29 @@ class sfTkArdUART : public sfTkIUART * */ void setTimeout(unsigned long timeout); - unsigned long getTimeout(); + unsigned long getTimeout(void); - bool find(const char *target); - bool find(const uint8_t *target); + bool find(CONSTVAR char *target); + bool find(CONSTVAR uint8_t *target); - bool find(const char *target, size_t length); - bool find(const uint8_t *target, size_t length); + bool find(CONSTVAR char *target, size_t length); + bool find(CONSTVAR uint8_t *target, size_t length); bool find(char target); - bool findUntil(const char *target, const char *terminator); - bool findUntil(const uint8_t *target, const char *terminator); + bool findUntil(CONSTVAR char *target, CONSTVAR char *terminator); + bool findUntil(CONSTVAR uint8_t *target, CONSTVAR char *terminator); - bool findUntil(const char *target, size_t targetLen, const char *terminate, size_t termLen); - bool findUntil(const uint8_t *target, size_t targetLen, const char *terminate, size_t termLen); + bool findUntil(CONSTVAR char *target, size_t targetLen, CONSTVAR char *terminate, size_t termLen); + bool findUntil(CONSTVAR uint8_t *target, size_t targetLen, CONSTVAR char *terminate, size_t termLen); - long parseInt(arduino::LookaheadMode lookahead = arduino::LookaheadMode::SKIP_ALL, char ignore = NO_IGNORE_CHAR); - float parseFloat(arduino::LookaheadMode lookahead = arduino::LookaheadMode::SKIP_ALL, char ignore = NO_IGNORE_CHAR); +#ifdef ARDUINO_ARCH_ESP8266 + long parseInt(); + float parseFloat(); +#else + long parseInt(LookaheadMode lookahead = LookaheadMode::SKIP_ALL, char ignore = NO_IGNORE_CHAR); + float parseFloat(LookaheadMode lookahead = LookaheadMode::SKIP_ALL, char ignore = NO_IGNORE_CHAR); +#endif size_t readBytes(char *buffer, size_t length); size_t readBytes(uint8_t *buffer, size_t length); @@ -265,15 +274,15 @@ class sfTkArdUART : public sfTkIUART size_t readBytesUntil(char terminator, char *buffer, size_t length); size_t readBytesUntil(char terminator, uint8_t *buffer, size_t length); - arduino::String readString(); - arduino::String readStringUntil(char terminator); + String readString(void); + String readStringUntil(char terminator); /** * @brief Arduino Print functionality mappings. * */ - size_t print(const arduino::__FlashStringHelper *); - size_t print(const arduino::String &); + size_t print(const __FlashStringHelper *); + size_t print(const String &); size_t print(const char[]); size_t print(char); size_t print(unsigned char, int = DEC); @@ -284,10 +293,10 @@ class sfTkArdUART : public sfTkIUART size_t print(long long, int = DEC); size_t print(unsigned long long, int = DEC); size_t print(double, int = 2); - size_t print(const arduino::Printable &); + size_t print(const Printable &); - size_t println(const arduino::__FlashStringHelper *); - size_t println(const arduino::String &s); + size_t println(const __FlashStringHelper *); + size_t println(const String &s); size_t println(const char[]); size_t println(char); size_t println(unsigned char, int = DEC); @@ -298,15 +307,13 @@ class sfTkArdUART : public sfTkIUART size_t println(long long, int = DEC); size_t println(unsigned long long, int = DEC); size_t println(double, int = 2); - size_t println(const arduino::Printable &); + size_t println(const Printable &); size_t println(void); - size_t printf(const char *format, ...); - size_t printf_P(const char *format, ...); protected: /** The actual Arduino hardware port */ - arduino::HardwareSerial *_hwSerial; + HardwareSerial *_hwSerial; private: bool _running = false; // Flag to track if the bus is running @@ -334,7 +341,7 @@ class sfTkArdUARTBus : public sfTkISerialBus * * @param uartPort UART port to use */ - sfTkArdUARTBus(sfTkArdUART &uartPort) : sfTkISerialBus(), _uartPort{std::make_unique(uartPort)} + sfTkArdUARTBus(sfTkArdUART &uartPort) : sfTkISerialBus(), _uartPort{&uartPort} { } @@ -343,19 +350,27 @@ class sfTkArdUARTBus : public sfTkISerialBus * * @param hwSerial Pass in an underlying hardware serial port */ - sfTkArdUARTBus(arduino::HardwareSerial &hwSerial) - : sfTkISerialBus(), _uartPort{std::make_unique(hwSerial)} + sfTkArdUARTBus(HardwareSerial &hwSerial) : sfTkISerialBus() { + _uartPort = new sfTkArdUART(hwSerial); } /** - * @brief Copy constructer + * @brief Copy constructor * * @param rhs Bus object to be copied */ - sfTkArdUARTBus(sfTkArdUARTBus const &rhs) - : sfTkISerialBus(), _uartPort{std::make_unique(*rhs._uartPort)} + sfTkArdUARTBus(sfTkArdUARTBus const &rhs) : sfTkISerialBus() + { + _uartPort = rhs._uartPort ? new sfTkArdUART(*rhs._uartPort) : nullptr; + } + + /** + * @brief Destructor + */ + ~sfTkArdUARTBus() { + delete _uartPort; } /** @@ -368,14 +383,8 @@ class sfTkArdUARTBus : public sfTkISerialBus { if (this != &rhs) { - if (rhs._uartPort) - { - _uartPort = std::make_unique(*rhs._uartPort); - } - else - { - _uartPort.reset(); - } + delete _uartPort; + _uartPort = rhs._uartPort ? new sfTkArdUART(*rhs._uartPort) : nullptr; } return *this; } @@ -389,7 +398,7 @@ class sfTkArdUARTBus : public sfTkISerialBus sfTkError_t init(void) { if (!_uartPort) - _uartPort = std::make_unique(); + _uartPort = new sfTkArdUART(); return _uartPort->init(); } @@ -401,7 +410,7 @@ class sfTkArdUARTBus : public sfTkISerialBus sfTkError_t init(uint32_t baudRate, bool bInit = false) { if (!_uartPort) - _uartPort = std::make_unique(); + _uartPort = new sfTkArdUART(); return _uartPort->init(baudRate, bInit); } @@ -413,7 +422,7 @@ class sfTkArdUARTBus : public sfTkISerialBus sfTkError_t init(sfTkIUART::UARTConfig_t config, bool bInit = false) { if (!_uartPort) - _uartPort = std::make_unique(); + _uartPort = new sfTkArdUART(); return _uartPort->init(config, bInit); } @@ -427,7 +436,8 @@ class sfTkArdUARTBus : public sfTkISerialBus */ sfTkError_t init(sfTkArdUART &uartPort, uint32_t baudRate, bool bInit = false) { - _uartPort = std::make_unique(uartPort); + delete _uartPort; // Delete existing reference to port. + _uartPort = new sfTkArdUART(uartPort); return _uartPort->init(baudRate, bInit); } @@ -441,7 +451,8 @@ class sfTkArdUARTBus : public sfTkISerialBus */ sfTkError_t init(sfTkArdUART &uartPort, sfTkIUART::UARTConfig_t config, bool bInit = false) { - _uartPort = std::make_unique(uartPort); + delete _uartPort; // Delete existing reference to port. + _uartPort = new sfTkArdUART(uartPort); return _uartPort->init(config, bInit); } @@ -454,7 +465,8 @@ class sfTkArdUARTBus : public sfTkISerialBus */ sfTkError_t init(sfTkArdUART &uartPort, bool bInit = false) { - _uartPort = std::make_unique(uartPort); + delete _uartPort; // Delete existing reference to port. + _uartPort = new sfTkArdUART(uartPort); return _uartPort->init(sfTkIUART::kDefaultBaudRate, bInit); } @@ -466,9 +478,10 @@ class sfTkArdUARTBus : public sfTkISerialBus * @param bInit This flag tracks whether the bus has been initialized. * @return sfTkError_t ksfTkErrOk on successful execution. */ - sfTkError_t init(arduino::HardwareSerial &hwSerial, uint32_t baudRate, bool bInit = false) + sfTkError_t init(HardwareSerial &hwSerial, uint32_t baudRate, bool bInit = false) { - _uartPort = std::make_unique(hwSerial); + delete _uartPort; // Delete existing reference to port. + _uartPort = new sfTkArdUART(hwSerial); return _uartPort->init(baudRate, bInit); } @@ -480,9 +493,10 @@ class sfTkArdUARTBus : public sfTkISerialBus * @param bInit This flag tracks whether the bus has been initialized. * @return sfTkError_t ksfTkErrOk on successful execution. */ - sfTkError_t init(arduino::HardwareSerial &hwSerial, sfTkIUART::UARTConfig_t config, bool bInit = false) + sfTkError_t init(HardwareSerial &hwSerial, sfTkIUART::UARTConfig_t config, bool bInit = false) { - _uartPort = std::make_unique(hwSerial); + delete _uartPort; // Delete existing reference to port. + _uartPort = new sfTkArdUART(hwSerial); return _uartPort->init(config, bInit); } @@ -493,9 +507,10 @@ class sfTkArdUARTBus : public sfTkISerialBus * @param bInit This flag tracks whether the bus has been initialized. * @return sfTkError_t ksfTkErrOk on successful execution. */ - sfTkError_t init(arduino::HardwareSerial &hwSerial, bool bInit = false) + sfTkError_t init(HardwareSerial &hwSerial, bool bInit = false) { - _uartPort = std::make_unique(hwSerial); + delete _uartPort; // Delete existing reference to port. + _uartPort = new sfTkArdUART(hwSerial); return _uartPort->init(sfTkIUART::kDefaultBaudRate, bInit); } @@ -533,5 +548,5 @@ class sfTkArdUARTBus : public sfTkISerialBus protected: /** The actual UART port */ - std::unique_ptr _uartPort; + sfTkArdUART* _uartPort; };