Files
ESPEasy/lib/ESPEasySerial/ESPEasySerial.cpp
T

276 lines
5.5 KiB
C++

#include "ESPeasySerial.h"
#include "Port_ESPEasySerial_HardwareSerial.h"
#if USES_I2C_SC16IS752
# include "Port_ESPEasySerial_I2C_SC16IS752.h"
#endif // if USES_I2C_SC16IS752
#if USES_SW_SERIAL
# include "Port_ESPEasySerial_SW_Serial.h"
#endif // if USES_SW_SERIAL
#if USES_HWCDC
# include "Port_ESPEasySerial_USB_HWCDC.h"
#endif // if USES_HWCDC
#if USES_USBCDC
# include "Port_ESPEasySerial_USBCDC.h"
#endif // if USES_USBCDC
Port_ESPEasySerial_base * ESPeasySerial::ESPEasySerial_Port_factory(const ESPEasySerialConfig& config)
{
switch (config.port) {
#if USES_SW_SERIAL
case ESPEasySerialPort::software:
{
return new (std::nothrow) Port_ESPEasySerial_SW_Serial_t(config);
}
#endif // if USES_SW_SERIAL
#if USES_I2C_SC16IS752
case ESPEasySerialPort::sc16is752:
{
return new (std::nothrow) Port_ESPEasySerial_I2C_SC16IS752_t(config);
}
#endif // if USES_I2C_SC16IS752
#if USES_HWCDC
case ESPEasySerialPort::usb_hw_cdc:
{
return new (std::nothrow) Port_ESPEasySerial_USB_HWCDC_t(config);
}
#endif // if USES_HWCDC
#if USES_USBCDC
case ESPEasySerialPort::usb_cdc_0:
// case ESPEasySerialPort::usb_cdc_1:
{
return new (std::nothrow) Port_ESPEasySerial_USBCDC_t(config);
}
#endif // if USES_USBCDC
default:
if (isHWserial(config.port)) {
Port_ESPEasySerial_HardwareSerial_t *hw = new (std::nothrow) Port_ESPEasySerial_HardwareSerial_t();
if (hw != nullptr) {
hw->resetConfig(config);
return hw;
}
}
break;
}
return nullptr;
}
ESPeasySerial::ESPeasySerial(ESPEasySerialPort port,
int receivePin,
int transmitPin,
bool inverse_logic,
unsigned int buffSize,
bool forceSWserial)
: Stream()
{
ESPEasySerialConfig config;
config.port = port;
config.receivePin = receivePin;
config.transmitPin = transmitPin;
config.inverse_logic = inverse_logic;
config.rxBuffSize = buffSize;
config.txBuffSize = buffSize;
config.forceSWserial = forceSWserial;
config.validate();
_serialPort = ESPEasySerial_Port_factory(config);
// FIXME TD-er: Should it call begin() ???
if (_serialPort != nullptr) {
// _serialPort->begin(_baud);
}
}
ESPeasySerial::ESPeasySerial(ESPEasySerialConfig config)
: Stream()
{
config.validate();
_serialPort = ESPEasySerial_Port_factory(config);
}
ESPeasySerial::~ESPeasySerial() {
flush();
end();
if (_serialPort != nullptr) {
delete _serialPort;
}
}
void ESPeasySerial::begin(unsigned long baud)
{
if (isValid()) {
_serialPort->begin(baud);
}
}
#ifdef ESP8266
void ESPeasySerial::begin(unsigned long baud,
SerialConfig config,
SerialMode mode)
{
if (isValid()) {
_serialPort->setPortConfig(baud, config, mode);
_serialPort->begin(baud);
}
}
#endif // ifdef ESP8266
#ifdef ESP32
void ESPeasySerial::begin(unsigned long baud, uint32_t config)
{
if (isValid()) {
_serialPort->setPortConfig(baud, config);
_serialPort->begin(baud);
}
}
#endif // ifdef ESP32
void ESPeasySerial::end() {
if (isValid()) {
flush();
_serialPort->end();
}
}
int ESPeasySerial::peek(void)
{
if (!isValid()) {
return -1;
}
return _serialPort->peek();
}
size_t ESPeasySerial::write(uint8_t val)
{
if (!isValid()) {
return 0;
}
return _serialPort->write(val);
}
size_t ESPeasySerial::write(const uint8_t *buffer, size_t size)
{
if (!isValid() || !buffer) {
return 0;
}
return _serialPort->write(buffer, size);
}
size_t ESPeasySerial::write(const char *buffer)
{
if (!buffer) { return 0; }
return write(buffer, strlen_P(buffer));
}
int ESPeasySerial::read(void)
{
if (!isValid()) {
return -1;
}
return _serialPort->read();
}
int ESPeasySerial::available(void)
{
if (!isValid()) {
return 0;
}
return _serialPort->available();
}
int ESPeasySerial::availableForWrite(void)
{
if (!isValid()) {
return 0;
}
return _serialPort->availableForWrite();
}
void ESPeasySerial::flush(void)
{
if (isValid()) {
_serialPort->flush();
}
}
int ESPeasySerial::getBaudRate() const
{
if (!isValid()) {
return 0;
}
return _serialPort->getBaudRate();
}
ESPeasySerial::operator bool() const
{
if (isValid()) {
const bool res = (*_serialPort);
return res;
}
return false;
}
bool ESPeasySerial::connected() const
{
if (isValid()) {
const bool res = (*_serialPort);
return res;
}
return false;
}
void ESPeasySerial::setDebugOutput(bool enable)
{
if (isValid()) {
_serialPort->setDebugOutput(enable);
}
}
bool ESPeasySerial::isTxEnabled(void)
{
return getTxPin() != -1;
}
bool ESPeasySerial::isRxEnabled(void)
{
return getRxPin() != -1;
}
// Not supported in ESP32, since only HW serial is used.
// Function included since it is used in some libraries.
bool ESPeasySerial::listen() {
return true;
}
String ESPeasySerial::getLogString() const {
return getSerialConfig().getLogString();
}
bool ESPeasySerial::setRS485Mode(int8_t rtsPin, bool enableCollisionDetection) {
if (_serialPort != nullptr) {
#ifdef ESP32
return _serialPort->setRS485Mode(rtsPin, enableCollisionDetection);
#else
return _serialPort->setRS485Mode(rtsPin, false);
#endif
}
return false;
}
bool ESPeasySerial::isValid() const {
// FIXME TD-er: Must call isValid() on the individual _serialPort types
return _serialPort != nullptr;
}