#ifndef _DRVUART_H
#define _DRVUART_H

/****************************************************************************
 *
 * Projekt			:	Glacier Batterieboxdeckel Prüfgerät
 * Dateiname		:	DrvUart.h
 * Autor			:	orginal MHoffmann, abgeändert für dieses Projekt Irene Saxer
 * Erstellungsdatum	:	17.04.2019
 * Beschreibung		:	"Treiber der asynchronen Schnittstellen des ATmega"
 *
 *
 * Versionsgeschichte
 * 	Revision 1.0	17.04.2019 SAI erste Version
 *
 ****************************************************************************/

/****************************************************************************/
/* COMPILER Direktiven */

/****************************************************************************/
/* INCLUDE Dateien */
#include "Common.h"

/****************************************************************************/
/* KONSTANTEN */

/****************************************************************************/
/* Globale Variablen */
#define UARTMAXRXBUFSIZE 		64
#define UARTMAXTXBUFSIZE 		250
#define DRVUART_MAXCHARS_PER_TX	32		//maxAnzahl von pro Handlerdurchlauf zu sendenden Zeichen fuer die Monitorschnittstelle

typedef struct
{
	uint8_t	u8_buffer[UARTMAXRXBUFSIZE];//der Buffer selbst
	uint8_t	u8_iwrite;           		//Schreibindex des Buffers
	uint8_t	u8_iread;					//Leseindex des Buffers
	uint8_t	u8_count;					//Anzahl der Zeichen im Buffer
} TUartRXBuffer, *PTUartRXBuffer;

typedef struct
{
	uint8_t	u8_buffer[UARTMAXTXBUFSIZE];//der Buffer selbst
	uint8_t	u8_iwrite;           		//Schreibindex des Buffers
	uint8_t	u8_iread;					//Leseindex des Buffers
	uint8_t	u8_count;					//Anzahl der Zeichen im Buffer
} TUartTXBuffer, *PTUartTXBuffer;

typedef struct
{
	TUartRXBuffer	udt_rxbuf;			//receive buffer
	TUartTXBuffer	udt_txbuf;			//transmit buffer
	uint8_t		u8_id;					//ID der UART (hier: 0 oder 1)
} TUartPara;


extern TUartPara	gudt_MoniIntf;

/****************************************************************************/
/* Funktionen */
void DrvUart_Init(void);
int16_t DrvUart_Transmit(TUartPara *pudt_uart);
int16_t DrvUart_Getchar(TUartPara *pudt_uart);
int16_t DrvUart_Putchar(TUartPara *pudt_uart, uint8_t u8_char);
int16_t DrvUart_Puts(TUartPara* pudt_uart, const char* pchr_char);
int16_t DrvUart_Putbyteh(TUartPara* pudt_uart, uint8_t u8_byte);
int16_t DrvUart_Putbyte(TUartPara* pudt_uart, uint8_t u8_byte);
int16_t DrvUart_Putu32(TUartPara* pudt_uart, uint32_t u32_int);
int16_t DrvUart_Putuint(TUartPara* pudt_uart, uint16_t u16_int);
int16_t DrvUart_Putint(TUartPara* pudt_uart, int16_t int_int);

// Makro fuer Zeilenumbruch
#define DrvUart_Newline(n)	DrvUart_Putchar(n, (uint8_t)CR);DrvUart_Putchar(n, (uint8_t)LF)

// Textfarben
#define ANSI_VT100_TEXT_SCHWARZ           "\x1B[30m"
#define ANSI_VT100_TEXT_ROT               "\x1B[31m"
#define ANSI_VT100_TEXT_GRUEN             "\x1B[32m"
#define ANSI_VT100_TEXT_BRAUN             "\x1B[33m"
#define ANSI_VT100_TEXT_BLAU              "\x1B[34m"
#define ANSI_VT100_TEXT_MAGENTA           "\x1B[35m"
#define ANSI_VT100_TEXT_ZYAN              "\x1B[36m"
#define ANSI_VT100_TEXT_GRAU              "\x1B[37m"

// Fehlercodes
#define ERROR_DRVUART_TRANSMIT_INVALID_UARTID	-200
#define ERROR_DRVUART_PUTCHAR_INVALID_UARTID	-201
#define ERROR_DRVUART_SIGNALRX0_RXBUF_OVF		-202
#define ERROR_DRVUART_SIGNALRX1_RXBUF_OVF		-203
#define ERROR_DRVUART_GETCHAR_EMPTYBUF			-204
#define ERROR_DRVUART_GETCHAR_INVALID_UARTID	-205
#define ERROR_DRVUART_PUTCHAR_BUFOVF			-206

#endif	// #define _DRVUART_H
