/*
 * Spinaci_modil_IO.c
 *
 * Created: 1.3.2012 17:13:49
 *  Author: JIRKO
 */ 
#include <avr/io.h>
#include <string.h>				// praca so stringom
#include <stdio.h>
#include "Spinaci_modul_IO.h"
#include "deff_packet_lib.h"
#include "RS485_lib.h"


#include "deff_spinaci_modul_lib.h"	
//****************   Definicia globalnych premennych   ***********************************************

	volatile	uint8_t		flags_2;				// flagi pre pracu s vystupmy spinacieho modulu
	volatile	uint8_t		t_reset_button;			// cas za kolko sa ma "pustit tlacitko"
	volatile	uint8_t		t_check_outputs;		// cas za kolko od nastavenia vystupov ma skontrolovat adekvatne vstupy	
	
	
void init_spinaci_modul_IO(void)			// inicializacia kniznice
{
		t_reset_button= 0xff;	// aby hend necasovalo 
		t_check_outputs= 0xff;	// aby hend necasovalo 
}		
void send_byte_4094(uint8_t data)
{	
	uint8_t i;
	STR_0;
	OE_1;
	D_0;
	CLK_0;
	for (i = 0 ; i < 8 ; i++ )
	{	
		if ( 0x80 & data) D_1;
		else D_0;
		CLK_1;
		data= data<<1;
		CLK_0;
	}
}

void send_data_4094(const uint8_t *data)
{
	send_byte_4094(data[3]);
	send_byte_4094(data[2]);
	send_byte_4094(data[1]);
	send_byte_4094(data[0]);
	STR_1;						// dam data na vystup posuvnych reg
	STR_0;
}

uint8_t read_inputs(void)			// nacitanei aktualnych stavou log 1 je ze zariadenie je zapnute
{
	uint8_t temp;
	temp= ~( IN0 | IN1 | IN2 | IN3 | IN4 | IN5 | IN6 | IN7 );
	return temp;
}

	// nastavy vystupy do pozadovaneho stavu vratane simulacie tlacitiek
	// vipinanie stlaceneho tlacitka sa rob v maine po vyprsani stanoveneho casu 
void set_ouputs(const uint8_t *data)
{
// 	uint8_t inputs_state;
// 	uint8_t temp_data[4];
// 	
// 	inputs_state= read_inputs();				// naciatam aktualny stav
// 	memcpy(temp_data, data, LENGHT_OUTPUTS_DATA);	
// 	
// 	temp_data[0]= inputs_state ^ data[0];		// zapinam len tie tlacitka ktore sa lisia v aktalnom a pozadovanom stave
// 	send_data_4094(temp_data);
send_data_4094(data);
	t_reset_button= 0;							// spusti casovac za kokoko sa maju tlacitka vypnut	
}

	// reset tlacitiek s zacovani ostatnych vystupov v povodnom stave
void reset_ouputs_buttons(const uint8_t *data)
{
	uint8_t temp_data[4];
	memcpy(temp_data, data, LENGHT_OUTPUTS_DATA);
	
	temp_data[0]= 0;							// vypnem tlacitka
	send_data_4094(temp_data);
	t_check_outputs= 0;							// spustim casovanei na kontrolu 
}

void I_check_Spininaci_modul(uint8_t *i_actual_settings)		// kontrola ci treba resetovat tlacitka alebo skontrolovat vystupy
{
	if (IS_RESET_BUTTON)		// treba resetovat tlacitka
	{
		CLR_RESET_BUTTON;
		reset_ouputs_buttons(i_actual_settings);		// funkcia pusti casovac na kontrolu vystupov
	}
// 	if (IS_CHECK_OUTPUTS)
// 	{
// 		CLR_CHECK_OUTPUTS;
// 		if(i_actual_settings[0] != read_inputs())		// kontrola ci vystupy nesedia ak hej odosli chybove hlasenie
// 		{										// chyba nesedia vystupy odosli chybove hlasenie alebo skus este raz
// 			
// 			uint8_t		temp_buff_out_packet[MAX_PACKET_LENGHT];	// tu sa vytvara TX packet 
// 			t_packet	*temp_out_packet;
// 			uint8_t		temp;
// 			temp_buff_out_packet[0]= 0;				// aby si kompilator myslel ze ho pouzivam
// 			temp_out_packet= (t_packet *)temp_buff_out_packet;
// 			temp= snprintf((char *)temp_out_packet->data, PACKET_DATA_MAX_LENGHT, "Chybne nastavenie vystupov");	///! upravit chybove hlasenie									
// 			fill_out_packet( temp_out_packet, master_ID(), my_ID(), (PACKET_LENGHT_WITHAUT_DATA + temp), gen_packet_n(), C_ERR_PACKET, 0);						
// 			send_packet(temp_out_packet);			//odosielam packet ako odpoved packet c_err_packet
// 			//SET_CHECK_OUTPUTS;				///! aby kontrolovalo dalej ?
// 		}
// 	}
}

void I_Timer2_tResetButton(void)
{
	if ( TIME_HOLD_BUTTON >= t_reset_button )			// casovasnie pre resetovnie tlacitiek
	{
		t_reset_button++;
		if ( TIME_HOLD_BUTTON == t_reset_button)
		{
			SET_RESET_BUTTON;
		}
	}	
}

void I_Timer2_tCheckOutputs(void)
{
	if ( TIME_TO_CHECK_OUTPUTS >= t_check_outputs )		// casovanie pre kontrolu vystupov
	{
		t_check_outputs++;
		if ( t_check_outputs == TIME_TO_CHECK_OUTPUTS )
		{  
			SET_CHECK_OUTPUTS;							// priznakk na vykonanie kontroly
		}			
	}
}