X-Git-Url: https://defiant.homedns.org/gitweb/?p=ros_wild_thumper.git;a=blobdiff_plain;f=avr%2Fnano%2Fuart.c;fp=avr%2Fnano%2Fuart.c;h=1a3707a781ba3dcab4d28c1df79b214207489ace;hp=0000000000000000000000000000000000000000;hb=4053424236542640b1cb23624877725d5ae8e50f;hpb=34bae39fabd9b44e1d169087e8d18d542f4f1525 diff --git a/avr/nano/uart.c b/avr/nano/uart.c new file mode 100644 index 0000000..1a3707a --- /dev/null +++ b/avr/nano/uart.c @@ -0,0 +1,97 @@ +#include +#include "uart.h" +#include + +#define UART_UBRR_CALC(BAUD_,FREQ_) ((FREQ_)/((BAUD_)*16L)-1) + +static volatile char read[RINGBUFFER_LEN]; +static volatile char *in_read_ptr; +static volatile char *out_read_ptr; + +ISR(USART_RX_vect) { + // update read from uart + if (UCSR0A & (1<> 8); + UBRR0L = (uint8_t)UART_UBRR_CALC(rate, F_CPU); + + in_read_ptr = out_read_ptr = read; +} + + +void uart_putc(char *c) { + while (!(UCSR0A & (1<out_write_ptr != buffer->in_write_ptr) { + if (UCSR0A & (1<out_write_ptr; + if (buffer->out_write_ptr < buffer->write + RINGBUFFER_LEN - 1) buffer->out_write_ptr++; + else buffer->out_write_ptr = buffer->write; + } + } + + // update read from uart + if (in_read_ptr != out_read_ptr) { + *buffer->in_read_ptr = *out_read_ptr; + + // update newline chars + if (buffer->block_read == *buffer->in_read_ptr) buffer->newlines++; + + if (buffer->in_read_ptr < buffer->read + RINGBUFFER_LEN - 1) buffer->in_read_ptr++; + else buffer->in_read_ptr = buffer->read; + + // move pointer + if (out_read_ptr < read + RINGBUFFER_LEN - 1) out_read_ptr++; + else out_read_ptr = read; + } +} +