/****************************************************************************
 *
 * Projekt			:	Magnetfeldmessgerät
 * Dateiname		:	drvGpio.c
 * Autor			:	orginal MHoffmann, abgeändert für dieses Projekt Eros Schatzmayer
 * Erstellungsdatum	:	17.04.2019
 * Beschreibung		:	"Treiber fuer die verwendeten IO-Leitungen des ATmega"
 *
 *
 * Versionsgeschichte
 * 	Revision 1.0   03.06.2020 SAI erste Version
 *
 ****************************************************************************/

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

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

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


/****************************************************************************/
/* Globale Variablen */
TGpioIntf gudt_GpioIntf;
uint8_t	gu8_Tmp;

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


void DrvGpio_Init(void)
/*============================================================================
 *
 *  Funktion:		DRVGPIOinit
 *  Ü-Parameter:	-
 *  R-Parameter:	Fehlercode
 *  Beschreibung:	Initialisierung aller Port-Pins
 *
 *==========================================================================*/
{
	//PORT A
	DDRA   = BM_EE_CS;						//Output, wenn Bit gesetzt
	PORTA  = 0x00 | BM_EE_CS| BM_ENDSCHALTER; //Pullups aktiv, wenn Bit gesetzt

	//PORT B
	DDRB   = 0x00 | BM_EE_SI | BM_EE_SCK;	//Output, wenn Bit gesetzt
	PORTB  = 0x00;							//Pullups aktiv, wenn Bit gesetzt

	//PORT C
	DDRC   = BM_RTC_CS | BM_LCD_RW;			//Output, wenn Bit gesetzt
	PORTC  = 0x00;							//Pullups aktiv, wenn Bit gesetzt und Input
	//DDRC &= ~(1 << PC0);	// PC0 wird input
	//PORTC &= ~(1 << PC0);	// PC0 als Tristate

	//PORT D
	DDRD   = BM_TXD | BM_LCD_ENABLE | BM_LCD_INSTSEL | BM_PWM_LED1 | BM_PWM_LED2;	//Output, wenn Bit gesetzt
	PORTD  = 0x00;							//Pullups aktiv, wenn Bit gesetzt

	//Externe INTs konfigurieren
	EICRA = (0<<ISC21) | (0<<ISC20) | (0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);
	EIMSK = (0<<INT2) | (0<<INT1) | (0<<INT0);
	EIFR = 0x07;							//alle XINT-Flags loeschen
	//PCICR = (0<<PCIE3) | (0<<PCIE2) | (0<<PCIE1) | (0<<PCIE0);
	PCICR = (1<<PCIE3) | (1<<PCIE2) | (0<<PCIE1) | (1<<PCIE0);
	PCIFR = 0x0f;							//alle PinChange-INT-Flags loeschen
	PCMSK3 |= (1 << PCINT24);
	PCMSK2 |= (1 << PCINT16);
	PCMSK1 = 0;
	PCMSK0 |= (1 << PCINT2) | (1 << PCINT3);
	

	//Parameter- und Schnittstelenstruktur initialisieren
	gudt_GpioIntf.u8_Key = KEY_STATE;
	gudt_GpioIntf.u8_Endschlater = ENDSCHALTER_STATE;
}


int16_t	DrvGpio_Handler(void)
{
	uint8_t u8_Key_Counter = 0;

	if (KEY_STATE == 0)				//Taster gedrückt
	{
		gudt_GpioIntf.u8_Key = 1; 
	}
	else
	{
		gudt_GpioIntf.u8_Key = 0;
	}	

	if(gudt_GpioIntf.u8_Key == 1)
	{
		if (gudt_GpioIntf.u8_LastKey == 0)
			gudt_GpioIntf.u16_TS = DrvTim_StartTimer();
		else
		{
			//warten, ob Resetdauer erreicht wurde
			if (DrvTim_ReadTimer(gudt_GpioIntf.u16_TS) >= CALIBRATION)
			{
				u8_Key_Counter = 1;
			}
		}
	}//kein else

	//Tasterzustand fuer naechsten Handlerdurchlauf merken
	gudt_GpioIntf.u8_LastKey = gudt_GpioIntf.u8_Key;

	return u8_Key_Counter;
}



