mirror of
https://github.com/letscontrolit/ESPEasy.git
synced 2026-07-28 04:07:47 +00:00
180 lines
4.3 KiB
C++
180 lines
4.3 KiB
C++
#include "Port_ESPEasySerial_SW_Serial.h"
|
|
|
|
|
|
#if USES_SW_SERIAL
|
|
|
|
|
|
Port_ESPEasySerial_SW_Serial_t::Port_ESPEasySerial_SW_Serial_t(const ESPEasySerialConfig& config)
|
|
{
|
|
if (config.port == ESPEasySerialPort::software) {
|
|
_config = config;
|
|
# if USES_LATEST_SOFTWARE_SERIAL_LIBRARY
|
|
_swserial = new (std::nothrow) SoftwareSerial(
|
|
config.receivePin,
|
|
config.transmitPin,
|
|
config.inverse_logic);
|
|
# else // if USES_LATEST_SOFTWARE_SERIAL_LIBRARY
|
|
_swserial = new (std::nothrow) Driver_ESPEasySoftwareSerial_t(
|
|
config.receivePin,
|
|
config.transmitPin,
|
|
config.inverse_logic);
|
|
# endif // if USES_LATEST_SOFTWARE_SERIAL_LIBRARY
|
|
}
|
|
}
|
|
|
|
Port_ESPEasySerial_SW_Serial_t::~Port_ESPEasySerial_SW_Serial_t()
|
|
{
|
|
if (_swserial != nullptr) {
|
|
delete _swserial;
|
|
_swserial = nullptr;
|
|
}
|
|
}
|
|
|
|
void Port_ESPEasySerial_SW_Serial_t::begin(unsigned long baud)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
_config.baud = baud;
|
|
# if USES_LATEST_SOFTWARE_SERIAL_LIBRARY
|
|
|
|
// Except at high bitrates, depending on other ongoing activity, interrupts in particular, this software serial adapter supports full
|
|
// duplex receive and send. At high bitrates (115200bps) send bit timing can be improved at the expense of blocking concurrent full
|
|
// duplex receives, with the EspSoftwareSerial::UART::enableIntTx(false) function call.
|
|
|
|
_swserial->enableIntTx(baud < 57600);
|
|
# endif // if USES_LATEST_SOFTWARE_SERIAL_LIBRARY
|
|
_swserial->begin(
|
|
_config.baud); /*,
|
|
3, // SoftwareSerialConfig::SWSERIAL_8N1 // static_cast<SoftwareSerialConfig>(_config.config),
|
|
_config.receivePin,
|
|
_config.transmitPin,
|
|
_config.inverse_logic,
|
|
_config.rxBuffSize);
|
|
*/
|
|
}
|
|
}
|
|
|
|
void Port_ESPEasySerial_SW_Serial_t::end() {
|
|
if (_swserial != nullptr) {
|
|
_swserial->end();
|
|
}
|
|
}
|
|
|
|
int Port_ESPEasySerial_SW_Serial_t::available(void)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
return _swserial->available();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int Port_ESPEasySerial_SW_Serial_t::availableForWrite(void)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
// FIXME TD-er: Implement availableForWrite
|
|
// return _swserial->availableForWrite();
|
|
if (_config.baud >= 9600) {
|
|
// Sending data is blocking
|
|
// Allow to send as many bytes as can be sent in roughly 1 msec.
|
|
return _config.baud / 9600;
|
|
}
|
|
return 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int Port_ESPEasySerial_SW_Serial_t::peek(void)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
return _swserial->peek();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int Port_ESPEasySerial_SW_Serial_t::read(void)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
return _swserial->read();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
size_t Port_ESPEasySerial_SW_Serial_t::read(uint8_t *buffer,
|
|
size_t size)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
return _swserial->readBytes((char *)buffer, size);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void Port_ESPEasySerial_SW_Serial_t::flush(void)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
return _swserial->flush();
|
|
}
|
|
}
|
|
|
|
void Port_ESPEasySerial_SW_Serial_t::flush(bool txOnly)
|
|
{
|
|
flush();
|
|
}
|
|
|
|
size_t Port_ESPEasySerial_SW_Serial_t::write(uint8_t value)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
return _swserial->write(value);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
size_t Port_ESPEasySerial_SW_Serial_t::write(const uint8_t *buffer,
|
|
size_t size)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
return _swserial->write(buffer, size);
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int Port_ESPEasySerial_SW_Serial_t::getBaudRate() const
|
|
{
|
|
if (_swserial != nullptr) {
|
|
return _swserial->baudRate();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
Port_ESPEasySerial_SW_Serial_t::operator bool() const
|
|
{
|
|
return _swserial != nullptr;
|
|
}
|
|
|
|
void Port_ESPEasySerial_SW_Serial_t::setDebugOutput(bool) {}
|
|
|
|
size_t Port_ESPEasySerial_SW_Serial_t::setRxBufferSize(size_t new_size)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
_config.rxBuffSize = new_size;
|
|
return new_size;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
size_t Port_ESPEasySerial_SW_Serial_t::setTxBufferSize(size_t new_size)
|
|
{
|
|
if (_swserial != nullptr) {
|
|
_config.txBuffSize = new_size;
|
|
return new_size;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
bool Port_ESPEasySerial_SW_Serial_t::setRS485Mode(int8_t rtsPin, bool enableCollisionDetection)
|
|
{
|
|
// TODO TD-er: Check if we can include toggling this pin in the SW serial lib
|
|
return false;
|
|
}
|
|
|
|
|
|
#endif // if USES_SW_SERIAL
|