/*
 * SerialRxTx.c
 *
 * Created: 27.10.2011 14:44:51
 * 
 */ 

#include<avr/io.h>
#include <avr/interrupt.h> 
#include "uart.h"

#define F_CPU 8000000UL
#define UART_BAUD_RATE 9600L
#define UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)(51)//(F_CPU/((UART_BAUD_RATE)*16L)-1)



#define UART_MAXSTRLEN 10
 
volatile uint8_t uart_str_complete = 0;     // 1 .. String komplett empfangen
volatile uint8_t uart_str_count = 0;
volatile char uart_string[UART_MAXSTRLEN + 1] = "";


void uart_puts (const char *s)
{
    do
    {
        uart_putc(*s);
    }
    while (*s++);
}

uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
        ;
    return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
}

ISR(USART_RXC_vect)
{
  unsigned char nextChar;
 
  // Daten aus dem Puffer lesen
  nextChar = UDR;
  if( uart_str_complete == 0 ) {	// wenn uart_string gerade in Verwendung, neues Zeichen verwerfen
 
    // Daten werden erst in uart_string geschrieben, wenn nicht String-Ende/max Zeichenlänge erreicht ist/string gerade verarbeitet wird
    if( nextChar != '\n' &&
        nextChar != '\r' &&
        uart_str_count < UART_MAXSTRLEN - 1 ) {
      uart_string[uart_str_count] = nextChar;
      uart_str_count++;
    }
    else {
      uart_string[uart_str_count] = '\0';
      uart_str_count = 0;
      uart_str_complete = 1;
    }
  }
}

int main (void)
{
	UBRRH = (uint8_t) (UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
	UBRRL = (uint8_t) UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
	UCSRB |= (1 << RXCIE); //RX Interrupt einschalten
	UCSRB |= (1 << RXEN);
	UCSRB |= (1 << TXEN);
	

	UCSRC |= (1 << URSEL) | (1<<UPM1)  | (0<<UPM0) | (1<<UCSZ1) | (0<<UCSZ0) ;
	
	DDRD |= (1 << DDD6);
	
	sei();
	

	
	while(1)
	{
		
		if(uart_str_complete==1)
		{
			uart_puts(uart_string);
			uart_str_complete = 0;
		}
		
		
		
		
	}
	
}


