/*
 * Spinaci_modul_IO.h
 *
 * Kniznica pre pracu s vystupmy/vstupmy zariadenia (posuvnymi reg. 4094)
 *
 * Created: 1.3.2012 17:07:57
 *  Author: JIRKO
 */ 


#ifndef SPINACI_MODUL_IO_H_
#define SPINACI_MODUL_IO_H_

	#define		cbi(sfr, bit)					(_SFR_BYTE(sfr) &= ~(1 << (bit)))         //Makro na vynulovanie jedneho bitu z registra
	#define    	sbi(sfr, bit)                   (_SFR_BYTE(sfr) |= (1 << (bit)))         //Makro na nastavenie jedneho bitu z registra
	
//****************   Definicia V/V   ****************************************************************
	#define STR_1				sbi(PORTD,5)
	#define STR_0				cbi(PORTD,5)
	
	#define D_1					sbi(PORTD,6)
	#define D_0					cbi(PORTD,6)
		
	#define CLK_1				sbi(PORTD,7)
	#define CLK_0				cbi(PORTD,7)
	
	#define OE_1				sbi(PORTB,0)
	#define OE_0				cbi(PORTB,0)
		
	#define IN0					bit_is_clear(PORTC,5) << 0
	#define IN1					bit_is_clear(PORTC,4) << 1
	#define IN2					bit_is_clear(PORTC,3) << 2
	#define IN3					bit_is_clear(PORTC,2) << 3
	#define IN4					bit_is_clear(PORTB,4) << 4
	#define IN5					bit_is_clear(PORTB,5) << 5
	#define IN6					bit_is_clear(PORTC,0) << 6
	#define IN7					bit_is_clear(PORTC,1) << 7
	
//****************   Definicia flags_2   ****************************************************************
	
	#define SET_CHECK_OUTPUTS		sbi(flags_2,0)
	#define CLR_CHECK_OUTPUTS		cbi(flags_2,0)
	#define IS_CHECK_OUTPUTS		bit_is_set(flags_2,0)	
		
	#define SET_RESET_BUTTON		sbi(flags_2,1)
	#define CLR_RESET_BUTTON		cbi(flags_2,1)
	#define IS_RESET_BUTTON			bit_is_set(flags_2,1)
	
//--------------------------------------------------------------------------------------------------
	
//****************   Definicie pre funkcie co nastavuju vystupi  ****************************************************************
	// cas= x*10ms
	//#define max_try_set_ouputs		5				// maximalny pocet pokusov zapnut vystupi
	#define TIME_TO_CHECK_OUTPUTS	50				// cas na kontrolu za 0.5s
	#define TIME_HOLD_BUTTON		10				// dlzka stlacenia tlacidla v 100ms
//--------------------------------------------------------------------------------------------------


///****************   Definicie funkcii   ***********************************************
	void	init_spinaci_modul_IO(void);				// inicializacia kniznice
	void	send_byte_4094(uint8_t data);				// zapise 1 bajt na vystup
	void	send_data_4094(const uint8_t *data);		// zapise 4 bajty na vystupy 
	void	set_ouputs(const uint8_t *data);			// nastavy vystupy do pozadovaneho stavu vratane simulacie tlacitiek
														// vipinanie stlaceneho tlacitka sa rob v maine po vyprsani stanoveneho casu 
	void	reset_ouputs_buttons(const uint8_t *data);		// reset tlacitiek s zacovani ostatnych vystupov v povodnom stave
	uint8_t read_inputs(void);							// vycita vstupy a rovno ich aj neguje log 1 je zapnute
	
// ****************   Definicie Inline funkcii   ****************************************	
	void I_check_Spininaci_modul(uint8_t *i_actual_settings);		// kontrola ci treba resetovat tlacitka alebo skontrolovat vystupy
	void I_Timer2_tResetButton(void);			// funkcia v casovaci TIMER2 pre casovanie resetu tlacitiek
	void I_Timer2_tCheckOutputs(void);			// funkcia v casovaci TIMER2 pre casovanie kontroly vystupov ci sa spravne nastavili


#endif /* SPINACI_MODUL_IO_H_ */