#include "serial.h"



#define RBUFLEN 8 //Pufferlänge für seriellen Empfang

volatile unsigned char rbuf[RBUFLEN]; //Ringpuffer 
volatile unsigned char rcnt, rpos, recbuf;

//volatile bit busy;
volatile unsigned char busy;

//Receive Interruptroutine
SIGNAL(SIG_UART_RECV)      /* signal handler for receive complete interrupt */
{
 recbuf= UDR; //Byte auf jeden Fall abholen, sonst Endlosinterrupt

 /* don't overwrite chars already in buffer */
 if(rcnt < RBUFLEN)  rbuf[(rpos+rcnt++) % RBUFLEN] = recbuf;
}

//Transmit Interruptroutine
SIGNAL(SIG_UART_TRANS)     /* signal handler for transmit complete interrupt */
{
 cbi(UCSRB,TXEN); //ATmega Disable Transmit complete interrupt löschen
 busy=0; //Byte gesendet Flag rücksetzen
}



unsigned char ser_getc (void)
{
 unsigned char c;

 while(!rcnt) { };   /* wait for character */
//   if(!rcnt) return 0; //Nix im Puffer, dann raus

// cbi(UCR,RXCIE); //AVR Disable Receiveinterrupt
 cbi(UCSRB,RXCIE); //ATMega Disable Receiveinterrupt

 rcnt--;
 c = rbuf [rpos++];
 if (rpos >= RBUFLEN)  rpos = 0;

// sbi(UCR,RXCIE); //AVR Enable Receiveinterrupt
 sbi(UCSRB,RXCIE); //ATmega Enable Receiveinterrupt
 return (c);
}



void ser_putc(unsigned char c)
{
//Nicht zu warten ist schlecht !
//Die Zeichenausgabe leidet dann !
  while(busy==1); //warten bis letztes Byte gesendet wurde
   
  sbi(UCSRB,TXEN); //ATmega Enable Transmit complete interrupt erlauben
  UDR=c;    //Byte in Sendepuffer
  busy = 1;        //Setze Flag Transmit gestartet
}




void ser_puts(unsigned char * s)
{
 unsigned char c;

   while((c=*s++))
    {
     if(c == '\n') //CR und LF senden bei \n
      {
       ser_putc(0x0D); //CR
       ser_putc(0x0A); //LF
      }
     else ser_putc(c);
    }
}




void ser_init(void)
{
   rcnt = rpos = 0;  /* init buffers */
   busy = 0;

  /* enable RxD/TxD and ints  */
// UCR=(1<<RXCIE) |(1<<TXCIE)|(1<<RXEN) |(1<<TXEN); //AVR
  UCSRB=(1<<RXCIE) |(1<<TXCIE)|(1<<RXEN) |(1<<TXEN); //ATMega
  UBRRL=UART_BAUD_SELECT_9600; // set baudrate ATMega32
  UCSRC=(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); //ATMega 8 Bit,1 Stop, no parity
}