diff --git a/examples/Example_01_TestCompile/Example_01_TestCompile.ino b/examples/Example_01_TestCompile/Example_01_TestCompile.ino index f214ffc..a25dec6 100644 --- a/examples/Example_01_TestCompile/Example_01_TestCompile.ino +++ b/examples/Example_01_TestCompile/Example_01_TestCompile.ino @@ -6,8 +6,6 @@ sfTkArdI2C myI2C; sfTkArdSPI mySPI; -sfTkArdUART myUART; -sfTkArdUARTBus myUARTBus(myUART); void setup() { diff --git a/library.properties b/library.properties index 92a6802..a5370c4 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=SparkFun Toolkit -version=1.0.5 +version=1.0.6 author=SparkFun Electronics maintainer=SparkFun Electronics sentence=A utility library that other SparkFun libraries can take advantage of. diff --git a/src/SparkFun_Toolkit.h b/src/SparkFun_Toolkit.h index 4d88ef4..597c739 100644 --- a/src/SparkFun_Toolkit.h +++ b/src/SparkFun_Toolkit.h @@ -1,6 +1,6 @@ /** * @file SparkFun_Toolkit.h - * @brief Arduino style header file for the SparkFun Toolkit + * @brief Arduino style header file for the SparkFun Toolkit * * This file contains the Arduino style header for the SparkFun Toolkit library * @@ -21,5 +21,4 @@ // Just include the toolkit headers #include "sfTkArdI2C.h" #include "sfTkArdSPI.h" -#include "sfTkArdUART.h" #include "sfTkArduino.h" diff --git a/src/sfTk/sfTkISerialBus.h b/src/sfTk/sfTkISerialBus.h deleted file mode 100644 index 085e41a..0000000 --- a/src/sfTk/sfTkISerialBus.h +++ /dev/null @@ -1,124 +0,0 @@ -/** - * @file sfTkISerialBus.h - * @brief Header file for the SparkFun Toolkit Base Serial Bus Interface Definition. - * - * This file contains the interface declaration for connecting sfTkISerial to the sfTkIBus. - * - * @author SparkFun Electronics - * @date 2025 - * @copyright Copyright (c) 2025, SparkFun Electronics Inc. This project is released under the MIT License. - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -// clang-format off -#include "sfTkError.h" -#include "sfTkIBus.h" -#include "sfTkISerial.h" -#include "sfToolkit.h" -// clang-format on - -const uint8_t ksfTkBusTypeSerialBus = 0x03; - -class sfTkISerialBus : sfTkIBus -{ - public: - /** - * @brief Constructor for the serial bus - * - */ - sfTkISerialBus() - { - } - - virtual ~sfTkISerialBus() = default; - - /** - * @brief Writes an array of bytes to the serial interface. - * - * @param data The data to write - * @param length The length of the data buffer - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - virtual sfTkError_t write(const uint8_t *data, size_t length) = 0; - - /** - * @brief Writes an array of bytes to a register on the target address. Supports any address size - * - * @param devReg The device's register's address - can be any size, If nullptr, address is not sent - * @param regLength The length of the register address. If 0, address is not sent - * @param data The data to write - * @param length The length of the data buffer - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - virtual sfTkError_t writeRegister(uint8_t *devReg, size_t regLength, const uint8_t *data, size_t length) override - { - - // Do we have a register? If so write it, else skip. - if (devReg != nullptr && regLength > 0) - write(devReg, regLength); - - // Write the data. - return write(data, length); - } - - /** - * @brief Read an array of bytes from the serial interface - * - * @param data The data buffer to read into - * @param length The length of the data buffer - * @param readBytes[out] The number of bytes read - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - virtual sfTkError_t read(uint8_t *data, size_t length, size_t &readBytes) = 0; - - /** - * @brief Reads an array of bytes to a register on the target address. Supports any address size - * - * @param devReg The device's register's address - can be any size - * @param regLength The length of the register address - * @param data The data to buffer to read into - * @param numBytes The length of the data buffer - * @param readBytes[out] The number of bytes read - * @param read_delay After sending the address, delay in milliseconds before reading the data - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - virtual sfTkError_t readRegister(uint8_t *devReg, size_t regLength, uint8_t *data, size_t numBytes, - size_t &readBytes, uint32_t read_delay = 0) override - { - // Buffer valid? - if (!data) - return ksfTkErrBusNullBuffer; - - if (devReg == nullptr || regLength == 0) - return ksfTkErrInvalidParam; - - sfTkError_t retVal = ksfTkErrOk; - - // Do we have a register? If so, write it, else skip. - retVal = write(devReg, regLength); - - if (retVal != ksfTkErrOk) - return retVal; - - if (read_delay) - sftk_delay_ms(read_delay); - - // Read the data. - retVal = read(data, numBytes, readBytes); - - return retVal; - } - - /** - * @brief Get the type of the object - * - * @return uint8_t The type of the object - */ - virtual uint8_t type(void) override - { - return ksfTkBusTypeSerialBus; - } -}; diff --git a/src/sfTk/sfTkIUART.h b/src/sfTk/sfTkIUART.h deleted file mode 100644 index 8d517c4..0000000 --- a/src/sfTk/sfTkIUART.h +++ /dev/null @@ -1,274 +0,0 @@ -/** - * @file sfTkIUART.h - * @brief Header file for the SparkFun Toolkit UART Interface Definition. - * - * This file contains the interface declaration for UART configuration. - * - * @author SparkFun Electronics - * @date 2025 - * @copyright Copyright (c) 2025, SparkFun Electronics Inc. This project is released under the MIT License. - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -// clang-format off -#include "sfTkError.h" -#include "sfTkISerial.h" -// clang-format on - -// Enums follow the Arduino Serial API constants. - -typedef enum _sfTkUARTParity -{ - kUARTParityEven = 0x1ul, - kUARTParityOdd = 0x2ul, - kUARTParityNone = 0x3ul, - kUARTParityMark = 0x4ul, - kUARTParitySpace = 0x5ul -} sfTkUARTParity_t; - -inline const char *parityToString(sfTkUARTParity_t parity) -{ - static const char *parityArray[] = {"Even", "Odd", "None", "Mark", "Space"}; - - // if the parity is out of bounds, return "Unknown" - if (parity < kUARTParityEven || parity > kUARTParitySpace) - return "Unknown"; - - // return the parity string - return parityArray[((uint8_t)parity) - 1]; -} - -typedef enum _sfTkUARTStopBits -{ - kUARTStopBitsOne = 0x10ul, - kUARTStopBitsOneAndHalf = 0x20ul, - kUARTStopBitsTwo = 0x30ul -} sfTkUARTStopBits_t; - -inline const char *stopBitsToString(sfTkUARTStopBits_t stopBits) -{ - static const char *stopBitsArray[] = {"One", "OneAndHalf", "Two"}; - - // Return "Unknown" if index is out of bounds (less than 0 or greater than 2) - if (stopBits < kUARTStopBitsOne || stopBits > kUARTStopBitsTwo) - return "Unknown"; - - // Return the stop bits string - return stopBitsArray[(((uint8_t)stopBits) >> 4) - 1]; -} - -typedef enum _sfTkUARTDataBits -{ - kUARTDataBitsFive = 0x100ul, - kUARTDataBitsSix = 0x200ul, - kUARTDataBitsSeven = 0x300ul, - kUARTDataBitsEight = 0x400ul, -} sfTkUARTDataBits_t; - -inline uint8_t dataBitsToValue(sfTkUARTDataBits_t dataBits) -{ - static const uint8_t dataBitsArray[] = {5, 6, 7, 8}; - - // Check if data bits are within valid range - if (dataBits < kUARTDataBitsFive || dataBits > kUARTDataBitsEight) - return 0; - - // Extract index using bit shift (removing first 8 bits) and subtract 1 - return dataBitsArray[(((uint16_t)dataBits) >> 8) - 1]; -} - -class sfTkIUART : public sfTkISerial -{ - public: - typedef struct _UARTConfig - { - uint32_t baudRate; - sfTkUARTDataBits_t dataBits; - sfTkUARTParity_t parity; - sfTkUARTStopBits_t stopBits; - } UARTConfig_t; - /** - * @brief Default constructor for the UART bus - * - * @param baudRate - */ - sfTkIUART(uint32_t baudRate = kDefaultBaudRate) - : _config{kDefaultBaudRate, kUARTDataBitsEight, kUARTParityNone, kUARTStopBitsOne} - { - } - - /** - * @brief Constructor for the UART bus with a configuration passed in - * - * @param config - */ - sfTkIUART(UARTConfig_t config) : _config(config) - { - } - - /** - * @brief setter for UART baud rate - * - * @param baudRate The baud rate to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - virtual sfTkError_t setBaudRate(const uint32_t baudRate) - { - if (_config.baudRate != baudRate) - _config.baudRate = baudRate; // set the baud rate - - return ksfTkErrOk; - } - - /** - * @brief getter for the baud rate - * - * @retval uint32_t returns the baud rate - */ - virtual uint32_t baudRate(void) const - { - return _config.baudRate; - } - - /** - * @brief setter for the stop bits - * - * @param stopBits The stop bits to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - virtual sfTkError_t setStopBits(const sfTkUARTStopBits_t stopBits) - { - if (_config.stopBits != stopBits) - _config.stopBits = stopBits; - - return ksfTkErrOk; - } - - /** - * @brief getter for the stop bits - * - * @retval sfTkUARTStopBits_t returns the stop bits - */ - virtual sfTkUARTStopBits_t stopBits(void) const - { - return _config.stopBits; - } - - /** - * @brief setter for the parity - * - * @param parity The parity to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - virtual sfTkError_t setParity(const sfTkUARTParity_t parity) - { - if (_config.parity != parity) - _config.parity = parity; - - return ksfTkErrOk; - } - - /** - * @brief getter for the parity - * - * @retval sfTkUARTParity_t returns the parity - */ - virtual sfTkUARTParity_t parity(void) const - { - return _config.parity; - } - - /** - * @brief setter for the data bits - * - * @param dataBits The data bits to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - virtual sfTkError_t setDataBits(const sfTkUARTDataBits_t dataBits) - { - if (_config.dataBits != dataBits) - _config.dataBits = dataBits; - - return ksfTkErrOk; - } - - /** - * @brief getter for the data bits - * - * @retval uint8_t returns the data bits - */ - virtual sfTkUARTDataBits_t dataBits(void) const - { - return _config.dataBits; - } - - /** - * @brief setter for the internal config object - * - * @param baudRate The baud rate to set - * @param dataBits The data bits to set - * @param parity The parity to set - * @param stopBits The stop bits to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - virtual sfTkError_t setConfig(const uint32_t baudRate = kDefaultBaudRate, - const sfTkUARTDataBits_t dataBits = kDefaultDataBits, - const sfTkUARTParity_t parity = kDefaultParity, - const sfTkUARTStopBits_t stopBits = kDefaultStopBits) - { - if (_config.baudRate != baudRate) - _config.baudRate = baudRate; - - if (_config.dataBits != dataBits) - _config.dataBits = dataBits; - - if (_config.parity != parity) - _config.parity = parity; - - if (_config.stopBits != stopBits) - _config.stopBits = stopBits; - - return ksfTkErrOk; - } - - /** - * @brief getter for the internal config object - * - * @return sfTkUARTConfig_t - */ - virtual UARTConfig_t config(void) const - { - return _config; - } - - /** - * @brief kDefaultBaudRate - Default baud rate for the UART bus - * - */ - static constexpr uint32_t kDefaultBaudRate = 115200; - - /** - * @brief kDefaultStopBits - Default stop bits for the UART bus - * - */ - static constexpr sfTkUARTStopBits_t kDefaultStopBits = kUARTStopBitsOne; - - /** - * @brief kDefaultParity - Default parity for the UART bus - * - */ - static constexpr sfTkUARTParity_t kDefaultParity = kUARTParityNone; - - /** - * @brief kDefaultDataBits - Default data bits for the UART bus - * - */ - static constexpr sfTkUARTDataBits_t kDefaultDataBits = kUARTDataBitsEight; - - protected: - /** The internal storage of the UART config */ - UARTConfig_t _config; -}; diff --git a/src/sfTkArdUART.cpp b/src/sfTkArdUART.cpp deleted file mode 100644 index 6c82262..0000000 --- a/src/sfTkArdUART.cpp +++ /dev/null @@ -1,638 +0,0 @@ -/** - * @file sfTkArdUART.cpp - * @brief Implementation file for the SparkFun Toolkit Arduino UART driver. - * - * This file contains the Arduino UART driver for the SparkFun Toolkit library. - * - * @author SparkFun Electronics - * @date 2025 - * @copyright Copyright (c) 2025, SparkFun Electronics Inc. This project is released under the MIT License. - * - * SPDX-License-Identifier: MIT - */ -#include - -#include -#include - -// clang-format off -#include "sfTkArdUART.h" -#include "sfTk/sfTkError.h" -#include "sfTk/sfTkISerial.h" -#include "sfTk/sfTkIUART.h" -// clang-format on - -sfTkError_t sfTkArdUART::init(HardwareSerial &hwSerial, sfTkIUART::UARTConfig_t &config, bool bInit) -{ - _hwSerial = &hwSerial; // set the serial port - - _config = config; // set the config - - if (bInit) - return _start(); // start the port - - return ksfTkErrOk; -} - -sfTkError_t sfTkArdUART::init(HardwareSerial &hwSerial, uint32_t baudRate, bool bInit) -{ - _hwSerial = &hwSerial; // set the serial port - - _config.baudRate = baudRate; // set the baud rate - - if (bInit) - return _start(); // start the port - - return ksfTkErrOk; -} - -sfTkError_t sfTkArdUART::init(uint32_t baudRate, bool bInit) -{ - // issues here on some devices - $defineing out for now -#ifdef _THIS_IS_BROKEN - // if we don't have a port already, use the default Arduino Serial. - if (!_hwSerial) - return init(Serial, baudRate, bInit); - - // We already have a UART setup, so it's already initialized. Change the baud rate. - return setBaudRate(baudRate); // set the baud rate -#else - return ksfTkErrFail; -#endif -} - -sfTkError_t sfTkArdUART::init(sfTkIUART::UARTConfig_t config, bool bInit) -{ -// issues here on some devices - $defineing out for now -#ifdef _THIS_IS_BROKEN - // if we don't have a port already, use the default Arduino Serial. - if (!_hwSerial) - return init(Serial, config, bInit); - - if (bInit) - return _start(); // start the port - - // We already have a UART setup, so it's already initialized. - return ksfTkErrOk; -#else - return ksfTkErrFail; -#endif -} - -sfTkError_t sfTkArdUART::init() -{ - return init(kDefaultBaudRate, true); -} - -sfTkError_t sfTkArdUART::write(const uint8_t *data, size_t len) -{ - if (!_hwSerial) - return ksfTkErrSerialNotInit; - - return (_hwSerial->write(data, len) == len ? ksfTkErrOk : ksfTkErrSerialUnderRead); -} - -sfTkError_t sfTkArdUART::write(const uint8_t data) -{ - if (!_hwSerial) - return ksfTkErrSerialNotInit; - - return (_hwSerial->write(data) ? ksfTkErrOk : ksfTkErrFail); -} - -sfTkError_t sfTkArdUART::read(uint8_t *data, size_t length, size_t &bytesRead) -{ - if (!_hwSerial) - return ksfTkErrSerialNotInit; - - if (!data) - return ksfTkErrSerialNullBuffer; - - if (length == 0) - return ksfTkErrSerialDataTooLong; // nothing to read - - bytesRead = 0; // zero out value - - // #ifdef ARDUINO_ARCH_AVR - bytesRead = _hwSerial->readBytes(data, length); - // #else - // bytesRead = readBytes(data, length); - // #endif - - if (bytesRead == 0) - return ksfTkErrFail; - - return (bytesRead == length) ? ksfTkErrOk : ksfTkErrSerialUnderRead; // return success if all bytes read -} - -sfTkError_t sfTkArdUART::read(uint8_t &data) -{ - size_t nRead; - return read(&data, 1, nRead); -} - -sfTkArdUART::operator bool() -{ - return (bool)*_hwSerial; -} - -sfTkError_t sfTkArdUART::setBaudRate(const uint32_t baudRate) -{ - if (_config.baudRate != baudRate) - _config.baudRate = baudRate; // set the baud rate - - return _start(); // start the port again -} - -sfTkError_t sfTkArdUART::setStopBits(const sfTkUARTStopBits_t stopBits) -{ - if (_config.stopBits != stopBits) - _config.stopBits = stopBits; // set the stop bits - - return _start(); // start the port again -} - -sfTkError_t sfTkArdUART::setParity(const sfTkUARTParity_t parity) -{ - if (_config.parity != parity) - _config.parity = parity; // set the baud rate - - return _start(); // start the port again -} - -sfTkError_t sfTkArdUART::setDataBits(const sfTkUARTDataBits_t dataBits) -{ - if (_config.dataBits != dataBits) - _config.dataBits = dataBits; // set the baud rate - - return _start(); // start the port again -} - -sfTkError_t sfTkArdUART::setConfig(const uint32_t baudRate, const sfTkUARTDataBits_t dataBits, - const sfTkUARTParity_t parity, const sfTkUARTStopBits_t stopBits) -{ - if (_config.baudRate != baudRate) - _config.baudRate = baudRate; - - if (_config.dataBits != dataBits) - _config.dataBits = dataBits; - - if (_config.parity != parity) - _config.parity = parity; - - if (_config.stopBits != stopBits) - _config.stopBits = stopBits; - - return _start(); // start the port again -} - -sfTkError_t sfTkArdUART::_start(void) -{ - if (!_hwSerial) - return ksfTkErrSerialNotInit; - 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, - (uint32_t)_config.stopBits | (uint32_t)_config.parity | (uint32_t)_config.dataBits); -#endif - if (!availableForWrite()) - return ksfTkErrSerialNotInit; // check if the port is available - // set the running flag to true - _running = true; - - return ksfTkErrOk; -} - -void sfTkArdUART::end(void) -{ - _running = false; // set the running flag to false - _hwSerial->end(); -} - -int sfTkArdUART::available(void) -{ - if (!_hwSerial) - return 0; - return _hwSerial->available(); -} - -int sfTkArdUART::availableForWrite(void) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->availableForWrite(); -} - -int sfTkArdUART::peek(void) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->peek(); -} - -void sfTkArdUART::flush(void) -{ - if (!_hwSerial) - return; - - _hwSerial->flush(); -} - -void sfTkArdUART::setTimeout(unsigned long timeout) -{ - if (!_hwSerial) - return; - - _hwSerial->setTimeout(timeout); -} - -unsigned long sfTkArdUART::getTimeout() -{ - if (!_hwSerial) - return 0; - - return _hwSerial->getTimeout(); -} - -#if !defined(ARDUINO_ARCH_AVR) && !defined(ARDUINO_ARCH_ESP8266) -bool sfTkArdUART::find(CONSTVAR char *target) -{ - if (!_hwSerial) - return false; - - return _hwSerial->find(target); -} - -bool sfTkArdUART::find(CONSTVAR uint8_t *target) -{ - if (!_hwSerial) - return false; - - return _hwSerial->find(target); -} - -bool sfTkArdUART::find(CONSTVAR char *target, size_t length) -{ - if (!_hwSerial) - return false; - - return _hwSerial->find(target, length); -} - -bool sfTkArdUART::find(CONSTVAR uint8_t *target, size_t length) -{ - if (!_hwSerial) - return false; - - return _hwSerial->find(target, length); -} - -bool sfTkArdUART::find(char target) -{ - if (!_hwSerial) - return false; - - return _hwSerial->find(target); -} - -bool sfTkArdUART::findUntil(CONSTVAR char *target, CONSTVAR char *terminator) -{ - if (!_hwSerial) - return false; - - return _hwSerial->findUntil(target, terminator); -} - -bool sfTkArdUART::findUntil(CONSTVAR uint8_t *target, CONSTVAR char *terminator) -{ - if (!_hwSerial) - return false; - - return _hwSerial->findUntil(target, terminator); -} - -bool sfTkArdUART::findUntil(CONSTVAR char *target, size_t targetLen, CONSTVAR char *terminate, size_t termLen) -{ - if (!_hwSerial) - return false; - - return _hwSerial->findUntil(target, targetLen, terminate, termLen); -} - -bool sfTkArdUART::findUntil(CONSTVAR uint8_t *target, size_t targetLen, CONSTVAR char *terminate, size_t termLen) -{ - if (!_hwSerial) - return false; - - return _hwSerial->findUntil(target, targetLen, terminate, termLen); -} - -#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; - - return _hwSerial->parseInt(lookahead, 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) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->readBytes(buffer, length); -} - -size_t sfTkArdUART::readBytes(uint8_t *buffer, size_t length) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->readBytes(buffer, length); -} - -size_t sfTkArdUART::readBytesUntil(char terminator, char *buffer, size_t length) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->readBytesUntil(terminator, buffer, length); -} - -size_t sfTkArdUART::readBytesUntil(char terminator, uint8_t *buffer, size_t length) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->readBytesUntil(terminator, buffer, length); -} - -String sfTkArdUART::readString() -{ - if (!_hwSerial) - return String(""); - - return _hwSerial->readString(); -} - -String sfTkArdUART::readStringUntil(char terminator) -{ - if (!_hwSerial) - return String(""); - - return _hwSerial->readStringUntil(terminator); -} - -/** - * @brief Print mappings - * - */ -size_t sfTkArdUART::print(const __FlashStringHelper *ifsh) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(ifsh); -} - -size_t sfTkArdUART::print(const String &s) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(s); -} - -size_t sfTkArdUART::print(const char str[]) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(str); -} - -size_t sfTkArdUART::print(char c) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(c); -} - -size_t sfTkArdUART::print(unsigned char b, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(b, base); -} - -size_t sfTkArdUART::print(int n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(n, base); -} - -size_t sfTkArdUART::print(unsigned int n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(n, base); -} - -size_t sfTkArdUART::print(long n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(n, base); -} - -size_t sfTkArdUART::print(unsigned long n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(n, base); -} - -size_t sfTkArdUART::print(long long n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(n, base); -} - -size_t sfTkArdUART::print(unsigned long long n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(n, base); -} - -size_t sfTkArdUART::print(double n, int digits) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(n, digits); -} - -size_t sfTkArdUART::print(const Printable &x) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->print(x); -} - -size_t sfTkArdUART::println(const __FlashStringHelper *ifsh) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(ifsh); -} - -size_t sfTkArdUART::println(const String &s) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(s); -} - -size_t sfTkArdUART::println(const char c[]) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(c); -} - -size_t sfTkArdUART::println(char c) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(c); -} - -size_t sfTkArdUART::println(unsigned char b, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(b, base); -} - -size_t sfTkArdUART::println(int n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(n, base); -} - -size_t sfTkArdUART::println(unsigned int n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(n, base); -} - -size_t sfTkArdUART::println(long n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(n, base); -} - -size_t sfTkArdUART::println(unsigned long n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(n, base); -} - -size_t sfTkArdUART::println(long long n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(n, base); -} - -size_t sfTkArdUART::println(unsigned long long n, int base) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(n, base); -} - -size_t sfTkArdUART::println(double n, int digits) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(n, digits); -} - -size_t sfTkArdUART::println(const Printable &x) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(x); -} - -size_t sfTkArdUART::println(void) -{ - if (!_hwSerial) - return 0; - - return _hwSerial->println(); -} -#endif diff --git a/src/sfTkArdUART.h b/src/sfTkArdUART.h deleted file mode 100644 index 833587c..0000000 --- a/src/sfTkArdUART.h +++ /dev/null @@ -1,551 +0,0 @@ -/** - * @file sfTkArdUART.h - * @brief header file for the SparkFun Toolkit Arduino UART driver. - * - * This file contains the Arduino UART header for the SparkFun Toolkit library. - * - * @author SparkFun Electronics - * @date 2025 - * @copyright Copyright (c) 2025, SparkFun Electronics Inc. This project is released under the MIT License. - * - * SPDX-License-Identifier: MIT - */ - -#pragma once - -#include -#include -#include -#include - -// clang-format off -// Include our platform UART interface definitions. -#include "sfTk/sfTkError.h" -#include "sfTk/sfTkISerial.h" -#include "sfTkArduino.h" -#include -#include -// clang-format on - -#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 - */ -class sfTkArdUART : public sfTkIUART -{ - public: - /** - * @brief Constructor - */ - sfTkArdUART(void) : sfTkIUART(), _hwSerial{nullptr} - { - } - - /** - * @brief Constructor - * - * @param baudRate The baud rate to set - */ - sfTkArdUART(uint32_t baudRate) : sfTkIUART(baudRate), _hwSerial{nullptr} - { - } - - /** - * @brief Constructor - * - * @param config The UART configuration settings. - */ - sfTkArdUART(UARTConfig_t config) : sfTkIUART(config), _hwSerial{nullptr} - { - } - - /** - * @brief Constructor - * - * @param uartPort Port for UART communication. - */ - sfTkArdUART(HardwareSerial &hwSerial) : sfTkIUART(), _hwSerial{&hwSerial} - { - } - - /** - * @brief Copy Constructor - */ - sfTkArdUART(sfTkArdUART const &rhs) : sfTkIUART(rhs._config), _hwSerial{rhs._hwSerial} - { - } - - /** - * @brief Copy assignment - * - * @param rhs right hand side of the assignment - * @return value of the left hand side of the assignment - */ - sfTkArdUART &operator=(const sfTkArdUART &rhs) - { - if (this != &rhs) - { - sfTkIUART::operator=(rhs); - _hwSerial = rhs._hwSerial; - } - return *this; - } - - /** - * @brief Method sets up the required UART settings. - * @note This function provides a default UART Port. - * - * @retval ksfTkErrOk on successful execution. - */ - sfTkError_t init(void); - - /** - * @brief - address version of the init method - * - * @param baudRate The baud rate to set - */ - sfTkError_t init(uint32_t baudRate, bool bInit = false); - - /** - * @brief config version of the init method - * - * @param config The UART configuration settings. - */ - sfTkError_t init(UARTConfig_t config, bool bInit = false); - - /** - * @brief Method sets up the required UART settings. - * - * @param uartPort Port for UART communication. - * @param baudRate The baud rate to set. - * @param bInit This flag tracks whether the bus has been initialized. - * - * @retval ksfTkErrOk on successful execution. - */ - sfTkError_t init(HardwareSerial &hwSerial, uint32_t baudRate, bool bInit = false); - - /** - * @brief Method sets up the required UART settings. - * - * @param uartPort Port for UART communication. - * @param config The UART configuration settings. - * @param bInit This flag tracks whether the bus has been initialized. - * - * @retval ksftkErrOk on successful execution. - */ - sfTkError_t init(HardwareSerial &hwSerial, sfTkIUART::UARTConfig_t &config, bool bInit = false); - - /** - * @brief Write `len` bytes to the UART TX buffer. - * - * @param data Data buffer to write. - * @param len Number of bytes to write. - * @return sfTkError_t - Returns ksfTkErrOk on success, or ksfTkErrFail code. - */ - sfTkError_t write(const uint8_t *data, size_t len) override; - - /** - * @brief Write one byte to the UART TX buffer. - * - * @param data Byte to write. - * @return sfTkError_t - Returns ksfTkErrOk on success, or ksfTkErrFail code. - */ - sfTkError_t write(const uint8_t data) override; - - /** - * @brief Reads an array of bytes from the serial interface - * - * @param data The data buffer to read into - * @param length The length of the data buffer - * @param bytesRead[out] The number of bytes read - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - sfTkError_t read(uint8_t *data, size_t length, size_t &bytesRead) override; - - /** - * @brief Reads a single byte from the serial interface - * - * @param data[out] Byte to be read - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - sfTkError_t read(uint8_t &data) override; - - /** - * @brief Checks if UART is running. - * - * @return true - UART is running. - * @return false - UART is not running. - */ - operator bool(); - - /** - * @brief setter for UART baud rate - * - * @param baudRate The baud rate to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - sfTkError_t setBaudRate(const uint32_t baudRate) override; - - /** - * @brief setter for the stop bits - * - * @param stopBits The stop bits to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - sfTkError_t setStopBits(const sfTkUARTStopBits_t stopBits) override; - - /** - * @brief setter for the parity - * - * @param parity The parity to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - sfTkError_t setParity(const sfTkUARTParity_t parity) override; - - /** - * @brief setter for the data bits - * - * @param dataBits The data bits to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - sfTkError_t setDataBits(const sfTkUARTDataBits_t dataBits) override; - - /** - * @brief setter for the internal config object - * - * @param config The config struct to set - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - sfTkError_t setConfig(const uint32_t baudRate = kDefaultBaudRate, - const sfTkUARTDataBits_t dataBits = kDefaultDataBits, - const sfTkUARTParity_t parity = kDefaultParity, - const sfTkUARTStopBits_t stopBits = kDefaultStopBits) override; - - /** - * @brief Arduino HardwareSerial functionality mappings. - * - */ - void end(void); - int available(void); - int availableForWrite(void); - int peek(void); - void flush(void); - - /** - * @brief Arduino Stream functionality mappings. - * - */ - void setTimeout(unsigned long timeout); - unsigned long getTimeout(void); - - bool find(CONSTVAR char *target); - bool find(CONSTVAR uint8_t *target); - - bool find(CONSTVAR char *target, size_t length); - bool find(CONSTVAR uint8_t *target, size_t length); - - bool find(char target); - - bool findUntil(CONSTVAR char *target, CONSTVAR char *terminator); - bool findUntil(CONSTVAR uint8_t *target, CONSTVAR char *terminator); - - 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); - -#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); - - size_t readBytesUntil(char terminator, char *buffer, size_t length); - size_t readBytesUntil(char terminator, uint8_t *buffer, size_t length); - - String readString(void); - String readStringUntil(char terminator); - - /** - * @brief Arduino Print functionality mappings. - * - */ - 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); - size_t print(int, int = DEC); - size_t print(unsigned int, int = DEC); - size_t print(long, int = DEC); - size_t print(unsigned long, int = DEC); - 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 Printable &); - - 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); - size_t println(int, int = DEC); - size_t println(unsigned int, int = DEC); - size_t println(long, int = DEC); - size_t println(unsigned long, int = DEC); - 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 Printable &); - size_t println(void); - - - protected: - /** The actual Arduino hardware port */ - HardwareSerial *_hwSerial; - - private: - bool _running = false; // Flag to track if the bus is running - sfTkError_t _start(void); // Start the connection to the UART port -}; - -/** - * @brief The sfTkArdUARTBus class implements an sfTkIUARTBus interface, connecting Arduino UART to the sfTkIBus - * interface. - * - */ -class sfTkArdUARTBus : public sfTkISerialBus -{ - public: - /** - * @brief Constructor for the UART bus - * - */ - sfTkArdUARTBus(void) : sfTkISerialBus(), _uartPort{nullptr} - { - } - - /** - * @brief Construct a new sfTkArdUARTBus object - * - * @param uartPort UART port to use - */ - sfTkArdUARTBus(sfTkArdUART &uartPort) : sfTkISerialBus(), _uartPort{&uartPort} - { - } - - /** - * @brief Construct a new sfTkArdUARTBus object - * - * @param hwSerial Pass in an underlying hardware serial port - */ - sfTkArdUARTBus(HardwareSerial &hwSerial) : sfTkISerialBus() - { - _uartPort = new sfTkArdUART(hwSerial); - } - - /** - * @brief Copy constructor - * - * @param rhs Bus object to be copied - */ - sfTkArdUARTBus(sfTkArdUARTBus const &rhs) : sfTkISerialBus() - { - _uartPort = rhs._uartPort ? new sfTkArdUART(*rhs._uartPort) : nullptr; - } - - /** - * @brief Destructor - */ - ~sfTkArdUARTBus() - { - delete _uartPort; - } - - /** - * @brief Copy assignment - * - * @param rhs right hand side of the assignment - * @return value of the left hand side of the assignment - */ - sfTkArdUARTBus &operator=(const sfTkArdUARTBus &rhs) - { - if (this != &rhs) - { - delete _uartPort; - _uartPort = rhs._uartPort ? new sfTkArdUART(*rhs._uartPort) : nullptr; - } - return *this; - } - - /** - * @brief Method sets up the required UART settings. - * @note This function provides a default UART Port. - * - * @retval ksfTkErrOk on successful execution. - */ - sfTkError_t init(void) - { - if (!_uartPort) - _uartPort = new sfTkArdUART(); - return _uartPort->init(); - } - - /** - * @brief - address version of the init method - * - * @param baudRate The baud rate to set - */ - sfTkError_t init(uint32_t baudRate, bool bInit = false) - { - if (!_uartPort) - _uartPort = new sfTkArdUART(); - return _uartPort->init(baudRate, bInit); - } - - /** - * @brief - config version of the init method - * - * @param config The configuration to set - */ - sfTkError_t init(sfTkIUART::UARTConfig_t config, bool bInit = false) - { - if (!_uartPort) - _uartPort = new sfTkArdUART(); - return _uartPort->init(config, bInit); - } - - /** - * @brief Method sets up the required UART settings using the provided UART port. - * - * @param uartPort Port for communication - * @param baudRate The baud rate to set - * @param bInit This flag tracks whether the bus has been initialized. - * @return sfTkError_t ksfTkErrOk on successful execution. - */ - sfTkError_t init(sfTkArdUART &uartPort, uint32_t baudRate, bool bInit = false) - { - delete _uartPort; // Delete existing reference to port. - _uartPort = new sfTkArdUART(uartPort); - return _uartPort->init(baudRate, bInit); - } - - /** - * @brief Method sets up the required UART settings using the provided UART port. - * - * @param uartPort Port for communication - * @param config The configuration to set - * @param bInit This flag tracks whether the bus has been initialized. - * @return sfTkError_t ksfTkErrOk on successful execution. - */ - sfTkError_t init(sfTkArdUART &uartPort, sfTkIUART::UARTConfig_t config, bool bInit = false) - { - delete _uartPort; // Delete existing reference to port. - _uartPort = new sfTkArdUART(uartPort); - return _uartPort->init(config, bInit); - } - - /** - * @brief Method sets up the required UART settings using the provided UART port. - * - * @param uartPort Port for communication - * @param bInit This flag tracks whether the bus has been initialized. - * @return sfTkError_t ksfTkErrOk on successful execution. - */ - sfTkError_t init(sfTkArdUART &uartPort, bool bInit = false) - { - delete _uartPort; // Delete existing reference to port. - _uartPort = new sfTkArdUART(uartPort); - return _uartPort->init(sfTkIUART::kDefaultBaudRate, bInit); - } - - /** - * @brief Method sets up the required UART settings using the provided HardwareSerial port. - * - * @param hwSerial The hardware serial port to use - * @param baudRate The baud rate to set - * @param bInit This flag tracks whether the bus has been initialized. - * @return sfTkError_t ksfTkErrOk on successful execution. - */ - sfTkError_t init(HardwareSerial &hwSerial, uint32_t baudRate, bool bInit = false) - { - delete _uartPort; // Delete existing reference to port. - _uartPort = new sfTkArdUART(hwSerial); - return _uartPort->init(baudRate, bInit); - } - - /** - * @brief Method sets up the required UART settings using the provided HardwareSerial port. - * - * @param hwSerial The hardware serial port to use - * @param config The configuration to set - * @param bInit This flag tracks whether the bus has been initialized. - * @return sfTkError_t ksfTkErrOk on successful execution. - */ - sfTkError_t init(HardwareSerial &hwSerial, sfTkIUART::UARTConfig_t config, bool bInit = false) - { - delete _uartPort; // Delete existing reference to port. - _uartPort = new sfTkArdUART(hwSerial); - return _uartPort->init(config, bInit); - } - - /** - * @brief Method sets up the required UART settings using the provided HardwareSerial port. - * - * @param hwSerial The hardware serial port to use - * @param bInit This flag tracks whether the bus has been initialized. - * @return sfTkError_t ksfTkErrOk on successful execution. - */ - sfTkError_t init(HardwareSerial &hwSerial, bool bInit = false) - { - delete _uartPort; // Delete existing reference to port. - _uartPort = new sfTkArdUART(hwSerial); - return _uartPort->init(sfTkIUART::kDefaultBaudRate, bInit); - } - - /** - * @brief Write `len` bytes to the UART TX buffer. - * - * @param data Data buffer to write. - * @param len Number of bytes to write. - * @return sfTkError_t - Returns ksfTkErrOk on success, or ksfTkErrFail code. - */ - sfTkError_t write(const uint8_t *data, size_t length) override - { - if (!_uartPort) - return ksfTkErrBusNotInit; - - sfTkError_t retVal = _uartPort->write(data, length); - - return retVal; - } - - /** - * @brief Reads an array of bytes from the serial interface - * - * @param data The data buffer to read into - * @param length The length of the data buffer - * @param bytesRead[out] The number of bytes read - * @return sfTkError_t Returns ksfTkErrOk on success, or ksfTkErrFail code - */ - sfTkError_t read(uint8_t *data, size_t length, size_t &readBytes) override - { - if (!_uartPort) - return ksfTkErrBusNotInit; - return _uartPort->read(data, length, readBytes); - } - - protected: - /** The actual UART port */ - sfTkArdUART* _uartPort; -};