From 04d161a6a9c1904d6c222668ba42568d6cbe9b4f Mon Sep 17 00:00:00 2001 From: "S.J.R. van Schaik" Date: Tue, 18 Jul 2017 15:34:17 +0200 Subject: [PATCH] stm32f0: usart: add callback to process each fully received line --- source/drivers/usart_console.c | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/source/drivers/usart_console.c b/source/drivers/usart_console.c index 51c4458..07c2c28 100644 --- a/source/drivers/usart_console.c +++ b/source/drivers/usart_console.c @@ -18,6 +18,7 @@ struct usart_console { char recv_buf[RECV_BUF_LEN]; + void (* process_line)(void); volatile size_t cur, next; uint32_t dev; }; @@ -28,21 +29,25 @@ struct usart_console user_console; static void usart_isr(struct usart_console *console) { uint32_t reg; - size_t i; + size_t idx, next; if (!console) return; while (usart_get_flag(console->dev, USART_ISR_RXNE)) { - console->recv_buf[console->next] = usart_recv(console->dev); + idx = console->next; + console->recv_buf[idx] = usart_recv(console->dev); - if (console->recv_buf[console->next] == '\003') - scb_reset_system(); + next = (console->next + 1) % RECV_BUF_LEN; - i = (console->next + 1) % RECV_BUF_LEN; + if (next != console->cur) + console->next = next; - if (i != console->cur) - console->next = i; + switch (console->recv_buf[idx]) { + case '\003': scb_reset_system(); + case '\r': console->process_line(); + default: break; + } } }