From 7652ab77efdd7ba4d5a49d6db006cdbd73dfc3b7 Mon Sep 17 00:00:00 2001
From: Damien George <damien.p.george@gmail.com>
Date: Thu, 21 Apr 2016 15:19:00 +0100
Subject: [PATCH] esp8266: Add uart_rx_wait and uart_rx_char functions.

---
 esp8266/uart.c | 20 ++++++++++++++++++++
 esp8266/uart.h |  2 ++
 2 files changed, 22 insertions(+)

diff --git a/esp8266/uart.c b/esp8266/uart.c
index f37193539..3207029fd 100644
--- a/esp8266/uart.c
+++ b/esp8266/uart.c
@@ -222,6 +222,26 @@ int uart0_rx(void) {
 }
 */
 
+// Waits at most timeout microseconds for at least 1 char to become ready for reading.
+// Returns true if something available, false if not.
+bool uart_rx_wait(uint32_t timeout_us) {
+    uint32_t start = system_get_time();
+    for (;;) {
+        if (input_buf.iget != input_buf.iput) {
+            return true; // have at least 1 char ready for reading
+        }
+        if (system_get_time() - start >= timeout_us) {
+            return false; // timeout
+        }
+        ets_event_poll();
+    }
+}
+
+// Returns char from the input buffer, else -1 if buffer is empty.
+int uart_rx_char(void) {
+    return ringbuf_get(&input_buf);
+}
+
 int uart_rx_one_char(uint8 uart_no) {
     if (READ_PERI_REG(UART_STATUS(uart_no)) & (UART_RXFIFO_CNT << UART_RXFIFO_CNT_S)) {
         return READ_PERI_REG(UART_FIFO(uart_no)) & 0xff;
diff --git a/esp8266/uart.h b/esp8266/uart.h
index 2f762db5a..8e09beea5 100644
--- a/esp8266/uart.h
+++ b/esp8266/uart.h
@@ -91,6 +91,8 @@ typedef struct {
 
 void uart_init(UartBautRate uart0_br, UartBautRate uart1_br);
 int uart0_rx(void);
+bool uart_rx_wait(uint32_t timeout_us);
+int uart_rx_char(void);
 void uart_tx_one_char(uint8 uart, uint8 TxChar);
 void uart_flush(uint8 uart);
 void uart_os_config(int uart);
-- 
GitLab