#ifndef _OBJLCD_H
#define _OBJLCD_H

/****************************************************************************
 *
 * Projekt			:	Glacier Batterieboxdeckel Prüfgerät
 * Dateiname		:	ObjLCD.h
 * Autor			:	orginal MHoffmann, abgeändert für dieses Projekt Irene Saxer
 * Erstellungsdatum	:	17.04.20190
 * Beschreibung		:	"Modul zur 8-bit-Ansteuerung eines Charakterdisplays"
 *
 *
 * Versionsgeschichte
 * 	Revision 1.0	17.04.2019 SAI erste Version
 *
 ****************************************************************************/

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

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

/****************************************************************************/
/* KONSTANTEN */
#define OBJLCD_CHARACTER_PATTERN_LINES		8	//Anzahl der Pixelzeilen eines LCD-Zeichens
#define OBJLCD_CHARS_PER_LINE			   20	//Wieviele Zeichen pro Zeile
#define OBJLCD_NR_OF_LINES					2	//Wieviele Zeilen hat das Display

#define OBJLCD_READY_TO					   50	//ms 
#define OBJLCD_BLANK					 0x20	//Leerzeichen

/****************************************************************************/
/* Globale Variablen */
typedef struct
{
	uint8_t	char_Zeile1[OBJLCD_CHARS_PER_LINE];		//Puffer fuer Zeile1
	uint8_t	char_Zeile2[OBJLCD_CHARS_PER_LINE];		//Puffer fuer Zeile2
	uint8_t	u8_iSpalte;								//Spaltenindex
	uint8_t	u8_iZeile;								//Zeilenindex
	uint8_t	u8_DirtyFlag;							//Flag, welches von 0 verschieden ist, wenn der Zeichenbuffer nicht mehr mit dem Display identisch ist
}TObjLcdPara;

/****************************************************************************/
/* Funktionen */

int16_t ObjLcd_Init(void);
int16_t	ObjLcd_Handler(void);
int16_t	ObjLcd_ShowAction(uint8_t	u8_TextId);
int16_t ObjLcd_Reset(void);
int16_t ObjLcd_ClearDispBuf(void);
int16_t ObjLcd_SetBufPos(uint8_t u8_Zeile, uint8_t u8_Spalte);
int16_t	ObjLcd_PutUByte(uint8_t u8_X);
int16_t ObjLcd_PutBuf(uint8_t u8_Char);
int16_t ObjLcd_Puts(char* pchr_char);
int16_t ObjLcd_TransmitBuffer(void);
int16_t ObjLcd_ClearDisplay(void);
int16_t ObjLcd_DisplayControl(uint8_t u8_D, uint8_t u8_C, uint8_t u8_B);
int16_t ObjLcd_EntryModeSet(uint8_t	u8_InD, uint8_t u8_shift);
int16_t ObjLcd_SetDDaddr(uint8_t u8_DDaddr);
int16_t ObjLcd_PutChar(uint8_t u8_Char);

extern TObjLcdPara gudt_ObjLcdPara;

// Fehlercodes
#define ERROR_OBJLCD_SETDDADDRESS_INVALID_ADDR		-1201
#define ERROR_OBJLCD_UNICONV_UNKNOWN_CHARACTER		-1202
#define ERROR_OBJLCD_PUTBUF_LINEINDEX_OVF			-1203
#define ERROR_OBJLCD_READY_TIMEOUT					-1204
#define ERROR_OBJLCD_SETPOS_INVALID_ADDR			-1205


#endif	// #define _OBJLCD_H
