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 class HardwareSerial;
30 
45 
50 
51 class CommandExecutor;
52 
53 // clang-format off
54 #define SERIAL_CONFIG_MAP(XX) \
55  XX(5N1) XX(6N1) XX(7N1) XX(8N1) XX(5N2) XX(6N2) XX(7N2) XX(8N2) XX(5E1) XX(6E1) XX(7E1) XX(8E1) \
56  XX(5E2) XX(6E2) XX(7E2) XX(8E2) XX(5O1) XX(6O1) XX(7O1) XX(8O1) XX(5O2) XX(6O2) XX(7O2) XX(8O2)
57 // clang-format on
58 
59 enum class SerialConfig {
60 #define XX(x) Cfg##x = UART_##x,
62 #undef XX
63 };
64 
65 #define XX(x) static constexpr SerialConfig SERIAL_##x{SerialConfig::Cfg##x};
67 #undef XX
68 
70 enum class SerialMode {
71  Full = UART_FULL,
72  RxOnly = UART_RX_ONLY,
73  TxOnly = UART_TX_ONLY,
74 };
75 
79 
80 #ifndef DEFAULT_RX_BUFFER_SIZE
81 #define DEFAULT_RX_BUFFER_SIZE 256
82 #endif
83 
84 #ifndef DEFAULT_TX_BUFFER_SIZE
85 #define DEFAULT_TX_BUFFER_SIZE 0
86 #endif
87 
88 #define SERIAL_STATUS_MAP(XX) \
89  XX(BreakDetected, "Break condition detected on receive line") \
90  XX(Overflow, "Receive buffer overflowed") \
91  XX(FramingError, "Receive framing error") \
92  XX(ParityError, "Parity check failed on received data")
93 
95 enum class SerialStatus {
96 #define XX(tag, comment) tag,
98 #undef XX
99 };
100 
101 #define XX(tag, comment) static constexpr SerialStatus eSERS_##tag{SerialStatus::tag};
103 #undef XX
104 
107 {
108 public:
113  HardwareSerial(int uartPort) : uartNr(uartPort)
114  {
115  }
116 
117  ~HardwareSerial();
118 
119  void setPort(int uartPort)
120  {
121  end();
122  uartNr = uartPort;
123  }
124 
125  int getPort()
126  {
127  return uartNr;
128  }
129 
133  void begin(uint32_t baud = 9600)
134  {
135  begin(baud, SERIAL_8N1, SERIAL_FULL, 1);
136  }
137 
146  void begin(uint32_t baud, SerialConfig config)
147  {
148  begin(baud, config, SERIAL_FULL, 1);
149  }
150 
160  void begin(uint32_t baud, SerialConfig config, SerialMode mode)
161  {
162  begin(baud, config, mode, 1);
163  }
164 
173  void begin(uint32_t baud, SerialConfig config, SerialMode mode, uint8_t txPin, uint8_t rxPin = UART_PIN_DEFAULT);
174 
178  void end();
179 
185  size_t setRxBufferSize(size_t size);
186 
192  size_t setTxBufferSize(size_t size);
193 
200  void setTxWait(bool wait)
201  {
202  bitWrite(options, UART_OPT_TXWAIT, wait);
203  smg_uart_set_options(uart, options);
204  }
205 
211  void swap()
212  {
213  swap(1);
214  }
215 
220  void swap(uint8_t tx_pin)
221  {
222  smg_uart_swap(uart, tx_pin);
223  }
224 
233  void setTx(uint8_t tx_pin)
234  {
235  smg_uart_set_tx(uart, tx_pin);
236  }
237 
245  void pins(uint8_t tx, uint8_t rx)
246  {
247  smg_uart_set_pins(uart, tx, rx);
248  }
249 
253  int available() override
254  {
255  return (int)smg_uart_rx_available(uart);
256  }
257 
262  int read() override
263  {
264  return smg_uart_read_char(uart);
265  }
266 
274  uint16_t readMemoryBlock(char* buf, int max_len) override
275  {
276  return smg_uart_read(uart, buf, max_len);
277  }
278 
279  bool seek(int len) override
280  {
281  return false;
282  }
283 
284  bool isFinished() override
285  {
286  return false;
287  }
288 
293  int peek() override
294  {
295  return smg_uart_peek_char(uart);
296  }
297 
303  {
304  smg_uart_flush(uart, smg_uart_mode_t(mode));
305  }
306 
310  void flush() override // Stream
311  {
312  smg_uart_wait_tx_empty(uart);
313  }
314 
315  using Stream::write;
316 
322  size_t write(const uint8_t* buffer, size_t size) override
323  {
324  return smg_uart_write(uart, buffer, size);
325  }
326 
331  void systemDebugOutput(bool enabled);
332 
338  void commandProcessing(bool reqEnable);
339 
346  {
347  return onDataReceived(dataReceivedDelegate);
348  }
349 
354  bool onDataReceived(StreamDataReceivedDelegate dataReceivedDelegate)
355  {
356  this->HWSDelegate = dataReceivedDelegate;
357  return updateUartCallback();
358  }
359 
364  bool onTransmitComplete(TransmitCompleteDelegate transmitCompleteDelegate)
365  {
366  this->transmitComplete = transmitCompleteDelegate;
367  return updateUartCallback();
368  }
369 
376  __forceinline void setUartCallback(smg_uart_callback_t callback, void* param = nullptr)
377  {
378  smg_uart_set_callback(uart, callback, param);
379  }
380 
385  bool isTxEnabled()
386  {
387  return smg_uart_tx_enabled(uart);
388  }
389 
394  bool isRxEnabled()
395  {
396  return smg_uart_rx_enabled(uart);
397  }
398 
403  uint32_t baudRate()
404  {
405  return smg_uart_get_baudrate(uart);
406  }
407 
413  uint32_t setBaudRate(uint32_t baudrate)
414  {
415  return smg_uart_set_baudrate(uart, baudrate);
416  }
417 
421  operator bool() const
422  {
423  return uart != nullptr;
424  }
425 
431  int indexOf(char c) override
432  {
433  return smg_uart_rx_find(uart, c);
434  }
435 
440  smg_uart_t* getUart()
441  {
442  return uart;
443  }
444 
450  unsigned getStatus();
451 
452 private:
453  int uartNr = UART_NO;
454  TransmitCompleteDelegate transmitComplete = nullptr;
455  StreamDataReceivedDelegate HWSDelegate = nullptr;
456  CommandExecutor* commandExecutor = nullptr;
457  smg_uart_t* uart = nullptr;
458  uart_options_t options = _BV(UART_OPT_TXWAIT);
459  size_t txSize = DEFAULT_TX_BUFFER_SIZE;
460  size_t rxSize = DEFAULT_RX_BUFFER_SIZE;
461  volatile uint16_t statusMask = 0;
462  volatile uint16_t callbackStatus = 0;
463  volatile bool callbackQueued = false;
464 
470  static void IRAM_ATTR staticCallbackHandler(smg_uart_t* uart, uint32_t status);
471  static void staticOnStatusChange(void* param);
472  void invokeCallbacks();
473 
478  bool updateUartCallback();
479 };
480 
490 extern HardwareSerial Serial;
491 
#define __forceinline
Definition: sming_attr.h:13
void begin(uint32_t baud, SerialConfig config)
Initialise and set its configuration.
Definition: HardwareSerial.h:146
void begin(uint32_t baud=9600)
Initialise the serial port.
Definition: HardwareSerial.h:133
void flush() override
Flush all pending data to the serial port.
Definition: HardwareSerial.h:310
bool isFinished() override
Check if all data has been read.
Definition: HardwareSerial.h:284
void setTxWait(bool wait)
Governs write behaviour when UART transmit buffers are full.
Definition: HardwareSerial.h:200
void pins(uint8_t tx, uint8_t rx)
Sets the transmission and receiving PINS.
Definition: HardwareSerial.h:245
uint32_t baudRate()
Get the current baud rate.
Definition: HardwareSerial.h:403
void swap(uint8_t tx_pin)
Toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX.
Definition: HardwareSerial.h:220
SerialMode
values equivalent to uart_mode_t
Definition: HardwareSerial.h:70
bool setCallback(StreamDataReceivedDelegate dataReceivedDelegate)
Set handler for received data.
Definition: HardwareSerial.h:345
void clear(SerialMode mode=SERIAL_FULL)
Clear the serial port transmit/receive buffers.
Definition: HardwareSerial.h:302
smg_uart_t * getUart()
Returns a pointer to the internal uart object. Use with care.
Definition: HardwareSerial.h:440
#define SERIAL_CONFIG_MAP(XX)
Definition: HardwareSerial.h:54
#define _BV(bit)
Definition: BitManipulations.h:10
static constexpr SerialMode SERIAL_FULL
Definition: HardwareSerial.h:76
void setTx(uint8_t tx_pin)
Toggle between use of GPIO1 and GPIO2 as TX on UART 0.
Definition: HardwareSerial.h:233
Definition: CommandExecutor.h:20
int read() override
Read a character from serial port.
Definition: HardwareSerial.h:262
static constexpr SerialMode SERIAL_TX_ONLY
Definition: HardwareSerial.h:78
#define SMING_DEPRECATED
Definition: sming_attr.h:30
#define bitWrite(value, bit, bitvalue)
Definition: BitManipulations.h:21
int getPort()
Definition: HardwareSerial.h:125
size_t write(const uint8_t *buffer, size_t size) override
write multiple characters to serial port
Definition: HardwareSerial.h:322
bool seek(int len) override
Move read cursor.
Definition: HardwareSerial.h:279
static constexpr SerialMode SERIAL_RX_ONLY
Definition: HardwareSerial.h:77
void swap()
Toggle between use of GPIO13/GPIO15 or GPIO3/GPIO(1/2) as RX and TX.
Definition: HardwareSerial.h:211
uint16_t readMemoryBlock(char *buf, int max_len) override
Read a block of characters from serial port.
Definition: HardwareSerial.h:274
int available() override
Get quantity characters available from serial input.
Definition: HardwareSerial.h:253
SerialStatus
Notification and error status bits.
Definition: HardwareSerial.h:95
bool isTxEnabled()
Checks if the current UART can transmit(print) information.
Definition: HardwareSerial.h:385
Hardware serial class.
Definition: HardwareSerial.h:106
bool isRxEnabled()
Checks if the current UART can receive information.
Definition: HardwareSerial.h:394
HardwareSerial Serial
Global instance of serial port UART0.
int indexOf(char c) override
Returns the location of the searched character.
Definition: HardwareSerial.h:431
int peek() override
Read a character from serial port without removing from input buffer.
Definition: HardwareSerial.h:293
void begin(uint32_t baud, SerialConfig config, SerialMode mode)
Initialise, set its configuration and mode.
Definition: HardwareSerial.h:160
#define DEFAULT_RX_BUFFER_SIZE
Definition: HardwareSerial.h:81
HardwareSerial(int uartPort)
Create instance of a hardware serial port object.
Definition: HardwareSerial.h:113
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:364
uint32_t setBaudRate(uint32_t baudrate)
Attempt to set the requested baud rate.
Definition: HardwareSerial.h:413
bool onDataReceived(StreamDataReceivedDelegate dataReceivedDelegate)
Set handler for received data.
Definition: HardwareSerial.h:354
SerialConfig
Definition: HardwareSerial.h:59
void setUartCallback(smg_uart_callback_t callback, void *param=nullptr)
Set callback ISR for received data.
Definition: HardwareSerial.h:376
#define SERIAL_STATUS_MAP(XX)
Definition: HardwareSerial.h:88
Base class for read/write stream.
Definition: ReadWriteStream.h:19
#define DEFAULT_TX_BUFFER_SIZE
Definition: HardwareSerial.h:85
void setPort(int uartPort)
Definition: HardwareSerial.h:119