/*****************************************************************************************************************
*	F u n c t i o n . h
*
*
*   Common HW Functions
*
*****************************************************************************************************************/
#ifndef __HW_FUNCTIONS_H
#define __HW_FUNCTIONS_H


 
/*******************************************************************************/
// prototypy funkci
/*******************************************************************************/
void EmptyFunc(void);
tUInt InitAPP(void);
void ResetService(void);
tUInt InitConfig(void);

tUChar WriteMAC( void );
tUChar system_Read( void );
tUInt SnIsInitialized(void);
tUChar InitConst(tUChar iflag);
tUInt CfgConstIsInitialized(void);
tUInt Write_CFG_DONE(void);


/*******************************************************************************/
void pushRxHeader(tUChar *_p, tUInt _l );
void pushRxData(tUChar *_p, tUInt _l );
void popRxData( void );



/*******************************************************************************/
tUChar read_Oper();
tUChar write_Oper();

/*******************************************************************************/
void Beep (tUChar preset, tUChar divider);
void InitTimerV(void);
void InitTimerZ0(void);
void InitTimerZ1(int value);

/*******************************************************************************/
void ClearWDT(void);
void ClearExtWDT(void);
void WDT_Init(unsigned char _mode);
int HW_Start (void);

/*******************************************************************************/
void createMAC( void );
void restoreMAC( void );
tUChar CheckAPP(void);

/*******************************************************************************/
void GpioService(void);

//void Error(void);

/*******************************************************************************/
void SwReset(void);
void LED_Init(void);
void ErrorLed(void);

/*******************************************************************************/
void AdcService(void);
tUInt ConvertToVolts(tUInt inputValue);

void EdkBusTimer(void);
void ReadTemperature(void);
tUInt Init_DigitalThermometer(void);
void AnalogThermo_Init(void);
void SendActiveBinaryIoPacket(void);
void SendActiveAnalogIoPacket(tUInt packet_type);
void ProcessSensors(void);


/*******************************************************************************/
// prototypy funkci pro jednotlive varianty zarizeni, definovany spolecne
/*******************************************************************************/
void Init_HW_Specific_Variables(void);
void GpioService(void);
void AdcService(void);
void DipService (void);
void ReadDIP(void);
void TimerA_Application(void);
//void SysChangeSciMessage(void);

// kvuli prekladu jsou zde uvedeny vsechny 
void ReadCardId(void);
void ReaderSciMessage(void);
//void CardSciMessage(void);
void ReadConfigJumpers(void);
void SetJumperFunction( tUInt *anvalue);

void SendWiegand(void);
unsigned char SendEdk(void);

char SendCharD0(unsigned char Data);
void SyncOutput(void);
void CheckOpto(void);
void FilterInput1(tUInt _state);
void FilterInput2(tUInt _state);
void FilterInput3(tUInt _state);
void FilterInput4(tUInt _state);
void FilterInput5(tUInt _state);
void FilterInput6(tUInt _state);
void FilterInput7(tUInt _state);
void FilterInput8(tUInt _state);


// fce teplomeru DALLAS
tUInt DS18B20_Init(void);
tUInt ds1820_read(void); 
void DS18B20_convert_temperature(tUChar low, tUChar hi);
void bin2dec( tUChar *buff, tUInt to_convert, tUChar fill );
void CheckPowerSupply(void);



signed int  getMAX(void);
signed int  getMIN(void);
tUInt getLastMIN(void);
tUInt getLastMAX(void);

signed int  getDELTA(void);
signed int  getLAST(void);
signed int getCOR(void);

void saveLAST(signed int val);

tUInt CHECK_MAX(signed int  val);
tUInt CHECK_MIN(signed int  val);

tUInt CHECK_APAR(signed int  old_value, signed int  new_value);
tUInt CHECK_APAR1(signed int  val);
tUInt CHECK_APAR2(signed int  val);
tUInt CHECK_DELTA_MIN(signed int  val);
tUInt CHECK_DELTA_UP(signed int  val);
tUInt CHECK_DELTA_DOWN(signed int  val);





/*******************************************************************************/
// definice reakce preruseni
/*******************************************************************************/
#define RISING_EDGE_INTERRUPT		1
#define FALLING_EDGE_INTERRUPT		0


/*******************************************************************************/
// definice  WDT
/*******************************************************************************/
#define WDT_HARD_RESET				1
#define WDT_SOFT_RESET				0

/*******************************************************************************/
// prednastaveni casovacu EDK
/*******************************************************************************/
/*#define EDK_PRESET_LED_TIME				5		// doba svitu LED po nacteni karty, [x100ms]
#define EDK_PRESET_BUZZER_TIME			5		// doba pipnuti x100ms
#define EDK_PRESET_RELAY_TIME			10		// doba sepnuti rele x100ms
#define EDK_PRESET_OPTOCOUPLER_TIME 	2		// potrebna doba aktivace optozavory [x100ms]
#define EDK_PRESET_INPUT1_TIME 			5		// potrebna doba aktivace vstupu IN1-odchodove tlac.[x10ms]
#define EDK_PRESET_INPUT2_TIME 			25		// potrebna doba aktivace vstupu IN2-dverni kontakt [x10ms]
*/


#define EHS_CARD_INSERTION_TIME			3		// pomale osahavani karty - jiz vlozena
#define EDK_PRESET_TEMPERATURE_TIME 	5		// interval osahavani teplomeru v sec [1-255]


/*******************************************************************************/
// definice pro optozavoru
/*******************************************************************************/
/*#define OPTO_UNDEFINED				0x00		// stav optozavory zatim neznamy
#define OPTO_OPEN					0x01		// optozavora detekuje otevreni
#define OPTO_CLOSED					0x02		// optozavora detekuje klidovy stav
*/

/*******************************************************************************/
// definice synchronizace v rezimu EDK
/*******************************************************************************/
/*#define SYNC_READER_1				1		// nabezna hrana SYNC=READER1
#define SYNC_READER_2				0		// sestupna hrana SYNC=READER2

#define READER1_WAIT_SYNC			100		// pausa pred odeslanim paketu po detekci sync READER1
#define READER2_WAIT_SYNC			1		// pausa pred odeslanim paketu po detekci sync READER2
*/
/*******************************************************************************/
// offset do pole adc[]
/*******************************************************************************/
//#define VOLTAGE				0x00
//#define CURRENT				0x01
//#define TEMPERATURE			0x02
//#define LUX					0x03
//#define WIND				0x04
//#define HUM					0x05

/*******************************************************************************/
// definice pro mereni ADC vstupu
// napetovy delic na vstupu je 15k/2k2 + vstupni dioda
/*******************************************************************************/
#define ADC_RESOLUTION		0x400	// 10 bitove rozliseni ADC
//#define ADC_VREF			5000E3	// 5V jako ADC max, pro lepsi presnost nasobeno x1000
#define ADC_VREF			4500E3	// 4.50V jako ADC max, pro lepsi presnost nasobeno x1000

#define VDIV_R1				15000E3	// horni odpor ve vstupnim delici, lepsi presnost x1000
#define VDIV_R2				2200E3	// spodni odpor ve vstupnim delici, lepsi presnost x1000
#define VDIV2_R2			2200	// spodni odpor ve vstupnim delici

// delici pomer delice
#define VDIV_RATIO			((VDIV_R1+VDIV_R2)/VDIV2_R2)
#define VDIV_CORR			600		// korekcni konstanta - ubytek na vstupni diode v mV
#define VDIV_CORR_VCC		400		// korekcni konstanta - ubytek na vstupni diode v mV 
									// pro mereni napajeciho napeti, netece proud, ubytek je mensi


/*******************************************************************************/
// definice kanalu ADC
/*******************************************************************************/
#define ADC_MASK			0x07
#define AN_CH0				0x00
#define AN_CH1				0x01
#define AN_CH2				0x02
#define AN_CH3				0x03
#define AN_CH4				0x04
#define AN_CH5				0x05
#define AN_CH6				0x06
#define AN_CH7				0x07


/*******************************************************************************/
// definice na kterem portu bude prepnut ADC MUX
/*******************************************************************************/
#define ADC_PORT_0			0x00
#define ADC_PORT_1  		0x01
#define ADC_PORT_OFF  		0x03


/*******************************************************************************/
// definice rezimu ADC podle datasheetu
/*******************************************************************************/
#define ADC_MODE_ONE_SHOT		0x00
#define ADC_MODE_REPEAT_0		0x02
#define ADC_MODE_REPEAT_1		0x03
#define ADC_MODE_SINGLE_SWEEP	0x04
#define ADC_MODE_REPEAT_SWEEP	0x06


/*******************************************************************************/
// definice SWEEP rezimu ADC
/*******************************************************************************/
#define ADC_NO_SWEEP			0x00		
#define ADC_SWEEP_2PIN			0x00
#define ADC_SWEEP_4PIN			0x01
#define ADC_SWEEP_6PIN			0x02
#define ADC_SWEEP_8PIN			0x03

#define ADC_NO_INT				0x00
#define ADC_INT					0x01


/*******************************************************************************/
// meze pro rozpoznani JUmperu JP1-JP4 pripojenych na ADC
/*******************************************************************************/
#define JP12_LOW_LIMIT 			400
#define JP1_LOW_LIMIT 			500
#define JP2_LOW_LIMIT 			700
#define JP_HI_LIMIT 			850


/*******************************************************************************/
// definice identifikace hwspec_low
/*******************************************************************************/
#define HWSPEC_LOW_READER_DALLAS		0x00	// technologie HW - mereni teploty bez ctecky nebo dallas
#define HWSPEC_LOW_READER_EMMARIN		0x01	// technologie HW ctecka Emmarin
#define HWSPEC_LOW_READER_MIFARE		0x02	// technologie HW ctecka Mifare
#define HWSPEC_LOW_FUTURE_NO_FUNCTION	0x04	// rezerva
#define HWSPEC_LOW_TEMPERATURE			0x08	// technologie HW - pouze mereni teploty, bez ctecky

#define HWSPEC_LOW_JP1					0x10	// jumper JP1
#define HWSPEC_LOW_JP2					0x20	// jumper JP2
#define HWSPEC_LOW_JP3					0x40	// jumper JP3
#define HWSPEC_LOW_JP4					0x80	// jumper JP4

/*******************************************************************************/
// definice pro inicializaci cipu - InitAPP(void)
/*******************************************************************************/
#define EE_NO_MAC_ADDR			0x00	// neinicializovana konfigurace - cisty cip
#define EE_MAC_ADDR_OK			0x01	// cip je inicializovan - je zapsano S/N

//#define DEFAULT_UNIT_ADDRESS		0x9999 // docasne pridelena adresa zarizeni nez se provede vygenerovani a zapis S/N
//#define DEFAULT_UNIT_ADDRESS		0x00ad // posledni generovana adresa
//#define DEFAULT_UNIT_ADDRESS		0x054b
#define DEFAULT_UNIT_ADDRESS		0xFFFF 



#endif 
