HardwareSerial.h
Go to the documentation of this file.
1 /****
2  * Sming Framework Project - Open Source framework for high efficiency native ESP8266 development.
3  * Created 2015 by Skurydin Alexey
4  * http://github.com/SmingHub/Sming
5  * All files of the Sming Core are provided under the LGPL v3 license.
6  *
7  * HardwareSerial.h
8  *
9  ****/
10 
16 #pragma once
17 
18 #include <cstdint>
19 #include <Delegate.h>
21 #include <BitManipulations.h>
22 #include <driver/uart.h>
23 
24 #define UART_ID_0 0
25 #define UART_ID_1 1
26 
27 #define NUMBER_UARTS UART_COUNT
28 
29 #define SERIAL_PIN_DEFAULT UART_PIN_DEFAULT
30 
31 class HardwareSerial;
32 
47 
52 
53 class CommandExecutor;
54 
55 // clang-format off
56 #define SERIAL_CONFIG_MAP(XX) \
57  XX(5N1) XX(6N1) XX(7N1) XX(8N1) XX(5N2) XX(6N2) XX(7N2) XX(8N2) XX(5E1) XX(6E1) XX(7E1) XX(8E1) \
58  XX(5E2) XX(6E2) XX(7E2) XX(8E2) XX(5O1) XX(6O1) XX(7O1) XX(8O1) XX(5O2) XX(6O2) XX(7O2) XX(8O2)
59 // clang-format on
60 
61 enum class SerialFormat {
62 #define XX(x) Fmt##x = UART_##x,
64 #undef XX
65 };
66 
67 #define XX(x) static constexpr SerialFormat SERIAL_##x{SerialFormat::Fmt##x};
69 #undef XX
70 
72 enum class SerialMode {
73  Full = UART_FULL,
74  RxOnly = UART_RX_ONLY,
75  TxOnly = UART_TX_ONLY,
76 };
77 
81 
82 #ifndef DEFAULT_RX_BUFFER_SIZE
83 #define DEFAULT_RX_BUFFER_SIZE 256
84 #endif
85 
86 #ifndef DEFAULT_TX_BUFFER_SIZE
87 #define DEFAULT_TX_BUFFER_SIZE 0
88 #endif
89 
90 #define SERIAL_STATUS_MAP(XX) \
91  XX(BreakDetected, "Break condition detected on receive line") \
92  XX(Overflow, "Receive buffer overflowed") \
93  XX(FramingError, "Receive framing error") \
94  XX(ParityError, "Parity check failed on received data")
95 
97 enum class SerialStatus {
98 #define XX(tag, comment) tag,
100 #undef XX
101 };
102 
103 #define XX(tag, comment) static constexpr SerialStatus eSERS_##tag{SerialStatus::tag};
105 #undef XX
106 
109 {
110 public:
115  HardwareSerial(int uartPort) : uartNr(uartPort)
116  {
117  }
118 
119  ~HardwareSerial();
120 
121  void setPort(int uartPort)
122  {
123  end();
124  uartNr = uartPort;
125  }
126 
127  int getPort()
128  {
129  return uartNr;
130  }
131 
136  bool begin(uint32_t baud = 9600)
137  {
138  return begin(baud, SERIAL_8N1, SERIAL_FULL, SERIAL_PIN_DEFAULT);
139  }
140 
150  bool begin(uint32_t baud, SerialFormat format)
151  {
152  return begin(baud, format, SERIAL_FULL, SERIAL_PIN_DEFAULT);
153  }
154 
165  bool begin(uint32_t baud, SerialFormat format, SerialMode mode)
166  {
167  return begin(baud, format, mode, 1);
168  }
169 
179  bool begin(uint32_t baud, SerialFormat format, SerialMode mode, uint8_t txPin, uint8_t rxPin = SERIAL_PIN_DEFAULT);
180 
184  void end();
185 
191  size_t setRxBufferSize(size_t size);
192 
198  size_t setTxBufferSize(size_t size);
199 
206  void setTxWait(bool wait)
207  {
208  bitWrite(options, UART_OPT_TXWAIT, wait);
209  smg_uart_set_options(uart, options);
210  }
211 
217  void swap()
218  {
219  swap(1);
220  }
221 
226  void swap(uint8_t tx_pin)
227  {
228  smg_uart_swap(uart, tx_pin);
229  }
230 
239  void setTx(uint8_t tx_pin)
240  {
241  smg_uart_set_tx(uart, tx_pin);
242  }
243 
251  void pins(uint8_t tx, uint8_t rx)
252  {
253  smg_uart_set_pins(uart, tx, rx);
254  }
255 
259  int available() override
260  {
261  return (int)smg_uart_rx_available(uart);
262  }
263 
268  int read() override
269  {
270  return smg_uart_read_char(uart);
271  }
272 
280  uint16_t readMemoryBlock(char* buf, int max_len) override
281  {
282  return smg_uart_read(uart, buf, max_len);
283  }
284 
285  bool seek(int len) override
286  {
287  return false;
288  }
289 
290  bool isFinished() override
291  {
292  return false;
293  }
294 
299  int peek() override
300  {
301  return smg_uart_peek_char(uart);
302  }
303 
309  {
310  smg_uart_flush(uart, smg_uart_mode_t(mode));
311  }
312 
316  void flush() override // Stream
317  {
318  smg_uart_wait_tx_empty(uart);
319  }
320 
321  using Stream::write;
322 
328  size_t write(const uint8_t* buffer, size_t size) override
329  {
330  return smg_uart_write(uart, buffer, size);
331  }
332 
337  void systemDebugOutput(bool enabled);
338 
344  void commandProcessing(bool reqEnable);
345 
350  bool onDataReceived(StreamDataReceivedDelegate dataReceivedDelegate)
351  {
352  this->HWSDelegate = dataReceivedDelegate;
353  return updateUartCallback();
354  }
355 
360  bool onTransmitComplete(TransmitCompleteDelegate transmitCompleteDelegate)
361  {
362  this->transmitComplete = transmitCompleteDelegate;
363  return updateUartCallback();
364  }
365 
372  __forceinline void setUartCallback(smg_uart_callback_t callback, void* param = nullptr)
373  {
374  smg_uart_set_callback(uart, callback, param);
375  }
376 
381  bool isTxEnabled()
382  {
383  return smg_uart_tx_enabled(uart);
384  }
385 
390  bool isRxEnabled()
391  {
392  return smg_uart_rx_enabled(uart);
393  }
394 
399  uint32_t baudRate()
400  {
401  return smg_uart_get_baudrate(uart);
402  }
403 
409  uint32_t setBaudRate(uint32_t baudrate)
410  {
411  return smg_uart_set_baudrate(uart, baudrate);
412  }
413 
417  operator bool() const
418  {
419  return uart != nullptr;
420  }
421 
427  int indexOf(char c) override
428  {
429  return smg_uart_rx_find(uart, c);
430  }
431 
436  smg_uart_t* getUart()
437  {
438  return uart;
439  }
440 
446  unsigned getStatus();
447 
448 private:
449  int uartNr = UART_NO;
450  TransmitCompleteDelegate transmitComplete = nullptr;
451  StreamDataReceivedDelegate HWSDelegate = nullptr;
452  CommandExecutor* commandExecutor = nullptr;
453  smg_uart_t* uart = nullptr;
454  uart_options_t options = _BV(UART_OPT_TXWAIT);
455  size_t txSize = DEFAULT_TX_BUFFER_SIZE;
456  size_t rxSize = DEFAULT_RX_BUFFER_SIZE;
457  volatile uint16_t statusMask = 0;
458  volatile uint16_t callbackStatus = 0;
459  volatile bool callbackQueued = false;
460 
466  static void IRAM_ATTR staticCallbackHandler(smg_uart_t* uart, uint32_t status);
467  static void staticOnStatusChange(void* param);
468  void invokeCallbacks();
469 
474  bool updateUartCallback();
475 };
476 
486 extern HardwareSerial Serial;
487 
void flush() override
Flush all pending data to the serial port.
Definition: HardwareSerial.h:316
bool isFinished() override
Check if all data has been read.
Definition: HardwareSerial.h:290
void setTxWait(bool wait)
Governs write behaviour when UART transmit buffers are full.
Definition: HardwareSerial.h:206
void pins(uint8_t tx, uint8_t rx)
Sets the transmission and receiving PINS.
Definition: HardwareSerial.h:251
uint32_t baudRate()
Get the current baud rate.
Definition: HardwareSerial.h:399
void swap(uint8_t tx_pin)
Toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX.
Definition: HardwareSerial.h:226
SerialMode
values equivalent to uart_mode_t
Definition: HardwareSerial.h:72
bool begin(uint32_t baud, SerialFormat format, SerialMode mode)
Initialise, set its configuration and mode.
Definition: HardwareSerial.h:165
void clear(SerialMode mode=SERIAL_FULL)
Clear the serial port transmit/receive buffers.
Definition: HardwareSerial.h:308
smg_uart_t * getUart()
Returns a pointer to the internal uart object. Use with care.
Definition: HardwareSerial.h:436
#define SERIAL_PIN_DEFAULT
Definition: HardwareSerial.h:29
#define SERIAL_CONFIG_MAP(XX)
Definition: HardwareSerial.h:56
#define _BV(bit)
Definition: BitManipulations.h:10
static constexpr SerialMode SERIAL_FULL
Definition: HardwareSerial.h:78
void setTx(uint8_t tx_pin)
Toggle between use of GPIO1 and GPIO2 as TX on UART 0.
Definition: HardwareSerial.h:239
Definition: CommandExecutor.h:21
int read() override
Read a character from serial port.
Definition: HardwareSerial.h:268
static constexpr SerialMode SERIAL_TX_ONLY
Definition: HardwareSerial.h:80
#define bitWrite(value, bit, bitvalue)
Definition: BitManipulations.h:21
int getPort()
Definition: HardwareSerial.h:127
size_t write(const uint8_t *buffer, size_t size) override
write multiple characters to serial port
Definition: HardwareSerial.h:328
bool begin(uint32_t baud, SerialFormat format)
Initialise and set its configuration.
Definition: HardwareSerial.h:150
bool seek(int len) override
Move read cursor.
Definition: HardwareSerial.h:285
static constexpr SerialMode SERIAL_RX_ONLY
Definition: HardwareSerial.h:79
bool begin()
void swap()
Toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX.
Definition: HardwareSerial.h:217
uint16_t readMemoryBlock(char *buf, int max_len) override
Read a block of characters from serial port.
Definition: HardwareSerial.h:280
int available() override
Get quantity characters available from serial input.
Definition: HardwareSerial.h:259
SerialStatus
Notification and error status bits.
Definition: HardwareSerial.h:97
bool isTxEnabled()
Checks if the current UART can transmit(print) information.
Definition: HardwareSerial.h:381
bool begin(uint32_t baud=9600)
Initialise the serial port.
Definition: HardwareSerial.h:136
Hardware serial class.
Definition: HardwareSerial.h:108
bool isRxEnabled()
Checks if the current UART can receive information.
Definition: HardwareSerial.h:390
HardwareSerial Serial
Global instance of serial port UART0.
int indexOf(char c) override
Returns the location of the searched character.
Definition: HardwareSerial.h:427
int peek() override
Read a character from serial port without removing from input buffer.
Definition: HardwareSerial.h:299
SerialFormat
Definition: HardwareSerial.h:61
#define DEFAULT_RX_BUFFER_SIZE
Definition: HardwareSerial.h:83
HardwareSerial(int uartPort)
Create instance of a hardware serial port object.
Definition: HardwareSerial.h:115
virtual size_t write(uint8_t c)=0
Writes a single character to output stream.
bool onTransmitComplete(TransmitCompleteDelegate transmitCompleteDelegate)
Set handler for received data.
Definition: HardwareSerial.h:360
uint32_t setBaudRate(uint32_t baudrate)
Attempt to set the requested baud rate.
Definition: HardwareSerial.h:409
bool onDataReceived(StreamDataReceivedDelegate dataReceivedDelegate)
Set handler for received data.
Definition: HardwareSerial.h:350
void setUartCallback(smg_uart_callback_t callback, void *param=nullptr)
Set callback ISR for received data.
Definition: HardwareSerial.h:372
#define SERIAL_STATUS_MAP(XX)
Definition: HardwareSerial.h:90
Base class for read/write stream.
Definition: ReadWriteStream.h:19
#define DEFAULT_TX_BUFFER_SIZE
Definition: HardwareSerial.h:87
void setPort(int uartPort)
Definition: HardwareSerial.h:121