/*
 * Copyright 2015 Mario Richter, Peter Stephan
 * This file is part of NeMo.
 *
 * NeMo is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * NeMo is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with NeMo.  If not, see <http://www.gnu.org/licenses/>.
 */

/*!
 * \file usart.h
 * \ingroup	usart
 * \brief	Headerfile für Routinen der seriellen Kommunikation über RS232
 */

#ifndef __USART_H__
#define __USART_H__


/*! Größe der Sende- und Empfangsbuffer in Zeichen */
#define BUFLEN						256

/*! Makro zur Überprüfung, ob USART-Sender bereit für neues Zeichen ist */
#define USART_TX_READY				(UCSR0A & (1<<UDRE0))

/*! Makro zur Übergabe eines Zeichens an den USART-Sender */
#define USART_SEND_CHAR(x)		(UDR0 = x)

/*! Makro zur Übernahme eines Zeichens aus dem USART-Empfänger */
#define USART_RECV_CHAR()			UDR0

/*! Makro zur Überprüfung, ob neue Zeichen im Empfangsbuffer enthalten sind */
#define USART_NEW_CHAR()			(recv_buf.writ != recv_buf.read)


/**
 * \ingroup usart
 * \brief Struktur für einen Ringbuffer für die USART-Schnittstelle.
 * 
 * Diese Struktur bildet einen Ringbuffer ab, mit dem die Sende- und Empfangsbuffer aufgebaut
 * werden. Die Struktur enthält als eigentlichen Buffer ein Array der Größe \ref BUFLEN sowie
 * zwei Variablen, die die Lese- und Schreibposition enthalten. Beim Eintrag von Zeichen wird
 * das Zeichen an die Position des Schreibzeigers in den Buffer eingetragen und der Schreibzeiger
 * erhöht; ist der Zeiger am Bufferende angekommen, wird er auf den Bufferanfang (0) zurückgesetzt.
 * Genauso wird beim Lesen eines Zeichens verfahren, das Zeichen an der Leseposition wird gelesen
 * und der Lesezeiger erhöht bzw. zurückgesetzt. Der Buffer enthält neue Zeichen, wenn die
 * Leseposition ungleich der Schreibposition ist.
 */

typedef struct
{
	char 			buf[BUFLEN];										/*!< Der eigentliche Buffer mit der Länge \ref BUFLEN. */
	uint8_t		read;														/*!< Die Leseposition innerhalb des Buffers. */
	uint8_t 	writ;														/*!< Die Schreibposition innerhalb des Buffers. */
}ringbuf;


extern ringbuf send_buf;										/*!< USART-Sendebuffer */
extern ringbuf recv_buf;										/*!< USART-Empfangbuffer */


void usart_init(void);
void usart_new_char(void);
void usart_scheduler(void);

void usart_send_char(char);
void usart_send_string(char *);
void usart_send_line(char *);
void usart_send_string_P(const char *);
void usart_send_line_P(const char *);
void usart_send_hexnumber(uint8_t, uint8_t uper);
void usart_send_big_hexnumberLF(uint8_t ,uint8_t , uint8_t);
void usart_wait_send(void);
char usart_get_char(void);



#endif
