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 
30 
45 
50 
51 class CommandExecutor;
52 
78 };
79 
82 
83 #ifndef DEFAULT_RX_BUFFER_SIZE
84 #define DEFAULT_RX_BUFFER_SIZE 256
85 #endif
86 
87 #ifndef DEFAULT_TX_BUFFER_SIZE
88 #define DEFAULT_TX_BUFFER_SIZE 0
89 #endif
90 
97 };
98 
101 {
102 public:
107  HardwareSerial(int uartPort) : uartNr(uartPort)
108  {
109  }
110 
111  ~HardwareSerial();
112 
113  void setPort(int uartPort)
114  {
115  end();
116  uartNr = uartPort;
117  }
118 
119  int getPort()
120  {
121  return uartNr;
122  }
123 
127  void begin(uint32_t baud = 9600)
128  {
129  begin(baud, SERIAL_8N1, SERIAL_FULL, 1);
130  }
131 
140  void begin(uint32_t baud, SerialConfig config)
141  {
142  begin(baud, config, SERIAL_FULL, 1);
143  }
144 
154  void begin(uint32_t baud, SerialConfig config, SerialMode mode)
155  {
156  begin(baud, config, mode, 1);
157  }
158 
166  void begin(uint32_t baud, SerialConfig config, SerialMode mode, uint8_t txPin);
167 
171  void end();
172 
178  size_t setRxBufferSize(size_t size);
179 
185  size_t setTxBufferSize(size_t size);
186 
193  void setTxWait(bool wait)
194  {
195  bitWrite(options, UART_OPT_TXWAIT, wait);
196  uart_set_options(uart, options);
197  }
198 
204  void swap()
205  {
206  swap(1);
207  }
208 
213  void swap(uint8_t tx_pin)
214  {
215  uart_swap(uart, tx_pin);
216  }
217 
226  void setTx(uint8_t tx_pin)
227  {
228  uart_set_tx(uart, tx_pin);
229  }
230 
238  void pins(uint8_t tx, uint8_t rx)
239  {
240  uart_set_pins(uart, tx, rx);
241  }
242 
246  int available() override
247  {
248  return (int)uart_rx_available(uart);
249  }
250 
255  int read() override
256  {
257  return uart_read_char(uart);
258  }
259 
267  uint16_t readMemoryBlock(char* buf, int max_len) override
268  {
269  return uart_read(uart, buf, max_len);
270  }
271 
272  bool seek(int len) override
273  {
274  return false;
275  }
276 
277  bool isFinished() override
278  {
279  return false;
280  }
281 
286  int peek() override
287  {
288  return uart_peek_char(uart);
289  }
290 
296  {
297  uart_flush(uart, uart_mode_t(mode));
298  }
299 
303  void flush() override // Stream
304  {
305  uart_wait_tx_empty(uart);
306  }
307 
308  using Stream::write;
309 
315  size_t write(const uint8_t* buffer, size_t size) override
316  {
317  return uart_write(uart, buffer, size);
318  }
319 
324  void systemDebugOutput(bool enabled);
325 
331  void commandProcessing(bool reqEnable);
332 
339  {
340  return onDataReceived(dataReceivedDelegate);
341  }
342 
347  bool onDataReceived(StreamDataReceivedDelegate dataReceivedDelegate)
348  {
349  this->HWSDelegate = dataReceivedDelegate;
350  return updateUartCallback();
351  }
352 
357  bool onTransmitComplete(TransmitCompleteDelegate transmitCompleteDelegate)
358  {
359  this->transmitComplete = transmitCompleteDelegate;
360  return updateUartCallback();
361  }
362 
369  __forceinline void setUartCallback(uart_callback_t callback, void* param = nullptr)
370  {
371  uart_set_callback(uart, callback, param);
372  }
373 
378  bool isTxEnabled()
379  {
380  return uart_tx_enabled(uart);
381  }
382 
387  bool isRxEnabled()
388  {
389  return uart_rx_enabled(uart);
390  }
391 
396  uint32_t baudRate()
397  {
398  return uart_get_baudrate(uart);
399  }
400 
406  uint32_t setBaudRate(uint32_t baudrate)
407  {
408  return uart_set_baudrate(uart, baudrate);
409  }
410 
414  operator bool() const
415  {
416  return uart != nullptr;
417  }
418 
424  int indexOf(char c) override
425  {
426  return uart_rx_find(uart, c);
427  }
428 
434  {
435  return uart;
436  }
437 
443  unsigned getStatus();
444 
445 private:
446  int uartNr = -1;
447  TransmitCompleteDelegate transmitComplete = nullptr;
448  StreamDataReceivedDelegate HWSDelegate = nullptr;
449  CommandExecutor* commandExecutor = nullptr;
450  uart_t* uart = nullptr;
452  size_t txSize = DEFAULT_TX_BUFFER_SIZE;
453  size_t rxSize = DEFAULT_RX_BUFFER_SIZE;
454  volatile uint16_t statusMask = 0;
455  volatile uint16_t callbackStatus = 0;
456  volatile bool callbackQueued = false;
457 
463  static void IRAM_ATTR staticCallbackHandler(uart_t* uart, uint32_t status);
464  static void staticOnStatusChange(void* param);
465  void invokeCallbacks();
466 
471  bool updateUartCallback();
472 };
473 
483 extern HardwareSerial Serial;
484 
Break condition detected on receive line.
Definition: HardwareSerial.h:93
void(* uart_callback_t)(uart_t *uart, uint32_t status)
callback invoked directly from ISR
Definition: uart.h:135
#define __forceinline
Definition: sming_attr.h:13
#define UART_7E1
Definition: uart.h:86
void begin(uint32_t baud, SerialConfig config)
Initialise and set its configuration.
Definition: HardwareSerial.h:140
size_t uart_rx_available(uart_t *uart)
determine available data which can be read
void begin(uint32_t baud=9600)
Initialise the serial port.
Definition: HardwareSerial.h:127
If buffers are full then uart_write() will wait for free space.
Definition: uart.h:114
void flush() override
Flush all pending data to the serial port.
Definition: HardwareSerial.h:303
bool isFinished() override
Check if all data has been read.
Definition: HardwareSerial.h:277
bool uart_rx_enabled(uart_t *uart)
Definition: uart.h:275
virtual size_t write(uint8_t)=0
Writes a single character to output stream.
void setTxWait(bool wait)
Governs write behaviour when UART transmit buffers are full.
Definition: HardwareSerial.h:193
Definition: HardwareSerial.h:73
#define UART_8O2
Definition: uart.h:99
Definition: HardwareSerial.h:70
uint32_t uart_set_baudrate(uart_t *uart, uint32_t baud_rate)
set UART baud rate
#define UART_8O1
Definition: uart.h:95
void pins(uint8_t tx, uint8_t rx)
Sets the transmission and receiving PINS.
Definition: HardwareSerial.h:238
#define UART_5N2
Definition: uart.h:80
uint32_t baudRate()
Get the current baud rate.
Definition: HardwareSerial.h:396
void swap(uint8_t tx_pin)
Toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX.
Definition: HardwareSerial.h:213
#define UART_8E2
Definition: uart.h:91
SerialMode
values equivalent to uart_mode_t
Definition: HardwareSerial.h:81
uart_t * getUart()
Returns a pointer to the internal uart object. Use with care.
Definition: HardwareSerial.h:433
#define UART_6N1
Definition: uart.h:77
bool setCallback(StreamDataReceivedDelegate dataReceivedDelegate)
Set handler for received data.
Definition: HardwareSerial.h:338
void end()
De-inits the current UART if it is already used.
void clear(SerialMode mode=SERIAL_FULL)
Clear the serial port transmit/receive buffers.
Definition: HardwareSerial.h:295
uint32_t uart_get_baudrate(uart_t *uart)
get the actual baud rate in use
Definition: HardwareSerial.h:62
#define UART_5E2
Definition: uart.h:88
#define UART_5N1
Definition: uart.h:76
Both receive and transmit - will revert to TX only if RX not supported.
Definition: uart.h:103
size_t setTxBufferSize(size_t size)
Sets transmit buffer size.
#define UART_8N1
Definition: uart.h:79
int uart_rx_find(uart_t *uart, char c)
Definition: HardwareSerial.h:69
void uart_swap(uart_t *uart, int tx_pin)
enum uart_mode_ uart_mode_t
Definition: uart.h:107
#define UART_8N2
Definition: uart.h:83
Definition: HardwareSerial.h:57
#define _BV(bit)
Definition: BitManipulations.h:10
#define UART_7O2
Definition: uart.h:98
Definition: HardwareSerial.h:67
Definition: HardwareSerial.h:72
void setTx(uint8_t tx_pin)
Toggle between use of GPIO1 and GPIO2 as TX on UART 0.
Definition: HardwareSerial.h:226
#define UART_7O1
Definition: uart.h:94
Definition: HardwareSerial.h:63
Definition: HardwareSerial.h:55
#define UART_7N2
Definition: uart.h:82
Receive buffer overflowed.
Definition: HardwareSerial.h:94
static int uart_read_char(uart_t *uart)
read a received character
Definition: uart.h:336
Definition: HardwareSerial.h:58
Definition: CommandExecutor.h:17
size_t setRxBufferSize(size_t size)
Sets receiving buffer size.
int uart_peek_char(uart_t *uart)
see what the next character in the rx buffer is
#define UART_6E1
Definition: uart.h:85
int read() override
Read a character from serial port.
Definition: HardwareSerial.h:255
Definition: HardwareSerial.h:68
Definition: HardwareSerial.h:65
Receive framing error.
Definition: HardwareSerial.h:95
Definition: HardwareSerial.h:74
#define SMING_DEPRECATED
Definition: sming_attr.h:30
#define bitWrite(value, bit, bitvalue)
Definition: BitManipulations.h:21
int getPort()
Definition: HardwareSerial.h:119
size_t uart_write(uart_t *uart, const void *buffer, size_t size)
write a block of data
#define UART_8E1
Definition: uart.h:87
size_t write(const uint8_t *buffer, size_t size) override
write multiple characters to serial port
Definition: HardwareSerial.h:315
size_t uart_read(uart_t *uart, void *buffer, size_t size)
read a block of data
bool seek(int len) override
Move read cursor.
Definition: HardwareSerial.h:272
bool uart_tx_enabled(uart_t *uart)
Definition: uart.h:270
void swap()
Toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX.
Definition: HardwareSerial.h:204
Transmit only.
Definition: uart.h:105
void commandProcessing(bool reqEnable)
Configure serial port for command processing.
uint16_t readMemoryBlock(char *buf, int max_len) override
Read a block of characters from serial port.
Definition: HardwareSerial.h:267
Delegate< void(HardwareSerial &serial)> TransmitCompleteDelegate
Delegate callback type for serial data transmit completion.
Definition: HardwareSerial.h:49
int available() override
Get quantity characters available from serial input.
Definition: HardwareSerial.h:246
SerialStatus
Notification and error status bits.
Definition: HardwareSerial.h:92
Parity check failed on received data.
Definition: HardwareSerial.h:96
bool isTxEnabled()
Checks if the current UART can transmit(print) information.
Definition: HardwareSerial.h:378
unsigned getStatus()
Get status error flags and clear them.
Delegate< void(Stream &source, char arrivedChar, uint16_t availableCharsCount)> StreamDataReceivedDelegate
Delegate callback type for serial data reception.
Definition: HardwareSerial.h:29
void uart_set_pins(uart_t *uart, int tx, int rx)
Definition: HardwareSerial.h:61
Definition: HardwareSerial.h:64
#define UART_5O2
Definition: uart.h:96
Definition: uart.h:177
Hardware serial class.
Definition: HardwareSerial.h:100
void systemDebugOutput(bool enabled)
Configure serial port for system debug output and redirect output from debugf.
static void uart_set_options(uart_t *uart, uart_options_t options)
Set option flags.
Definition: uart.h:242
bool isRxEnabled()
Checks if the current UART can receive information.
Definition: HardwareSerial.h:387
HardwareSerial Serial
Global instance of serial port UART0.
#define UART_5E1
Definition: uart.h:84
Definition: HardwareSerial.h:81
int indexOf(char c) override
Returns the location of the searched character.
Definition: HardwareSerial.h:424
Definition: HardwareSerial.h:76
int peek() override
Read a character from serial port without removing from input buffer.
Definition: HardwareSerial.h:286
void begin(uint32_t baud, SerialConfig config, SerialMode mode)
Initialise, set its configuration and mode.
Definition: HardwareSerial.h:154
#define DEFAULT_RX_BUFFER_SIZE
Definition: HardwareSerial.h:84
HardwareSerial(int uartPort)
Create instance of a hardware serial port object.
Definition: HardwareSerial.h:107
void uart_wait_tx_empty(uart_t *uart)
#define UART_7N1
Definition: uart.h:78
bool onTransmitComplete(TransmitCompleteDelegate transmitCompleteDelegate)
Set handler for received data.
Definition: HardwareSerial.h:357
void setUartCallback(uart_callback_t callback, void *param=nullptr)
Set callback ISR for received data.
Definition: HardwareSerial.h:369
uint32_t setBaudRate(uint32_t baudrate)
Attempt to set the requested baud rate.
Definition: HardwareSerial.h:406
#define UART_5O1
Definition: uart.h:92
void uart_set_tx(uart_t *uart, int tx_pin)
bool onDataReceived(StreamDataReceivedDelegate dataReceivedDelegate)
Set handler for received data.
Definition: HardwareSerial.h:347
SerialConfig
Definition: HardwareSerial.h:53
uint8_t uart_options_t
Definition: uart.h:109
Definition: HardwareSerial.h:66
Definition: HardwareSerial.h:59
#define UART_6O1
Definition: uart.h:93
Base class for read/write stream.
Definition: ReadWriteStream.h:22
Definition: HardwareSerial.h:71
void uart_set_callback(uart_t *uart, uart_callback_t callback, void *param)
Set callback handler for serial port.
Definition: HardwareSerial.h:75
Definition: HardwareSerial.h:56
#define UART_6O2
Definition: uart.h:97
#define UART_6E2
Definition: uart.h:89
Definition: HardwareSerial.h:60
Definition: HardwareSerial.h:77
#define UART_6N2
Definition: uart.h:81
Receive only.
Definition: uart.h:104
#define DEFAULT_TX_BUFFER_SIZE
Definition: HardwareSerial.h:88
void setPort(int uartPort)
Definition: HardwareSerial.h:113
#define UART_7E2
Definition: uart.h:90
void uart_flush(uart_t *uart, uart_mode_t mode=UART_FULL)
discard any buffered data and reset hardware FIFOs
Definition: HardwareSerial.h:81
Definition: HardwareSerial.h:81
Definition: HardwareSerial.h:54