Enable callbacks and CR separator in UART library
This commit is contained in:
@@ -9,9 +9,15 @@
|
||||
#define RBUF_FORWARD(BUF_IDX, MOD_MASK) BUF_IDX = RBUF_NEXT(BUF_IDX, MOD_MASK)
|
||||
#define RBUF_EMPTY(BUFF) (BUFF.head == BUFF.tail)
|
||||
|
||||
#define CR 0x0D
|
||||
#define LF 0x0A
|
||||
|
||||
volatile RBUF(UART_RX_BUF_SIZE) rx_buffer;
|
||||
volatile RBUF(UART_TX_BUF_SIZE) tx_buffer;
|
||||
|
||||
volatile uint8_t lines = 0;
|
||||
void (*uart_handler)(char* line);
|
||||
|
||||
void uart_init(void)
|
||||
{
|
||||
UBRRH = (uint8_t) (__UBRR>>8);
|
||||
@@ -48,11 +54,45 @@ void uart_puti(int16_t value, int16_t radix)
|
||||
|
||||
char uart_getc(void)
|
||||
{
|
||||
if(RBUF_EMPTY(rx_buffer)) return 0;
|
||||
if(RBUF_EMPTY(rx_buffer)) return -1;
|
||||
RBUF_FORWARD(rx_buffer.tail, UART_RX_BUF_MASK);
|
||||
return rx_buffer.data[rx_buffer.tail];
|
||||
}
|
||||
|
||||
void uart_gets(char* buf)
|
||||
{
|
||||
char c;
|
||||
|
||||
if(lines)
|
||||
{
|
||||
while((c = uart_getc()))
|
||||
{
|
||||
if(c == CR || c < 0) break;
|
||||
*buf++ = c;
|
||||
}
|
||||
|
||||
*buf = 0;
|
||||
--lines;
|
||||
}
|
||||
}
|
||||
|
||||
void uart_bind_handler(void (*handler)(char* line))
|
||||
{
|
||||
uart_handler = handler;
|
||||
}
|
||||
|
||||
void uart_handle_event(char* buf)
|
||||
{
|
||||
if(lines)
|
||||
{
|
||||
if(uart_handler)
|
||||
{
|
||||
uart_gets(buf);
|
||||
(*uart_handler)(buf);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ISR(USART_UDRE_vect)
|
||||
{
|
||||
if(!RBUF_EMPTY(tx_buffer))
|
||||
@@ -67,8 +107,21 @@ ISR(USART_UDRE_vect)
|
||||
}
|
||||
|
||||
ISR(USART_RXC_vect)
|
||||
{
|
||||
RBUF_FORWARD(rx_buffer.head, UART_RX_BUF_MASK);
|
||||
rx_buffer.data[rx_buffer.head] = UDR;
|
||||
{
|
||||
register uint8_t head = RBUF_NEXT(rx_buffer.head, UART_RX_BUF_MASK);
|
||||
register char data = UDR;
|
||||
|
||||
if(head == rx_buffer.tail)
|
||||
{
|
||||
rx_buffer.head = rx_buffer.tail;
|
||||
}
|
||||
else switch(data)
|
||||
{
|
||||
case 0: case LF: break;
|
||||
case CR: ++lines;
|
||||
default:
|
||||
rx_buffer.head = head;
|
||||
rx_buffer.data[head] = data;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user