summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2016-04-21 15:19:00 +0100
committerDamien George <damien.p.george@gmail.com>2016-04-21 15:19:00 +0100
commit7652ab77efdd7ba4d5a49d6db006cdbd73dfc3b7 (patch)
treee6240b37773fe5d31bc1c70ee3aa0e16074f8cff
parent495da1561149d63b6caa061517c7dee7df2c1929 (diff)
esp8266: Add uart_rx_wait and uart_rx_char functions.
-rw-r--r--esp8266/uart.c20
-rw-r--r--esp8266/uart.h2
2 files changed, 22 insertions, 0 deletions
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);