stm32f0: usart: add callback to process each fully received line

tags/0.1.0
S.J.R. van Schaik 7 years ago
parent 2610c11a3d
commit 04d161a6a9
  1. 19
      source/drivers/usart_console.c

@ -18,6 +18,7 @@
struct usart_console { struct usart_console {
char recv_buf[RECV_BUF_LEN]; char recv_buf[RECV_BUF_LEN];
void (* process_line)(void);
volatile size_t cur, next; volatile size_t cur, next;
uint32_t dev; uint32_t dev;
}; };
@ -28,21 +29,25 @@ struct usart_console user_console;
static void usart_isr(struct usart_console *console) static void usart_isr(struct usart_console *console)
{ {
uint32_t reg; uint32_t reg;
size_t i; size_t idx, next;
if (!console) if (!console)
return; return;
while (usart_get_flag(console->dev, USART_ISR_RXNE)) { 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') next = (console->next + 1) % RECV_BUF_LEN;
scb_reset_system();
i = (console->next + 1) % RECV_BUF_LEN; if (next != console->cur)
console->next = next;
if (i != console->cur) switch (console->recv_buf[idx]) {
console->next = i; case '\003': scb_reset_system();
case '\r': console->process_line();
default: break;
}
} }
} }

Loading…
Cancel
Save