#include "funkce.h"

unsigned volatile int znak=0;
static volatile unsigned int poc_pretec_c1=0;
static volatile unsigned char poc_pretec_c2=0;

static volatile unsigned char pause13=202;		//kodovaci prodleva do skutecne nap. nuly pro 50Hz
static volatile unsigned char timeout13=110;	//kodovaci timeout pro cekani na proudove a napetove nuly pro 50Hz

static volatile unsigned char pause24=202;		//signalni, 50Hz
static volatile unsigned char timeout24=110;	//signalni
//*************************************************************************************
void nastav_citac2(void)
{
	//******************************************************************************
	//               Nastavení čítače 2 , f=5494Hz
	//******************************************************************************
	//AS2   - přepne zdroj signálu přímo na krystal
	//sbi(ASSR,AS2)
	//WGM2x - režim čítače
	//COM2x - generování signálu OCR
	//CS2x  - vstupní frekvence čítače
	TCCR2=((0<<WGM20)|(0<<COM21)|(0<<COM20)|(1<<WGM21)|(0<<CS22)|(1<<CS21)|(1<<CS20));
	OCR2=90;
	//OCIE2 - povolí přeručení pro komparaci
	sbi(TIMSK,OCIE2);
	//TOIE2 - povolí přeručení při přetečení
	//sbi(TIMSK,TOIE2);

	sei();
}
//***********************************************************************************
void zap_k_nap(void)
{
	nastav_citac2();

	if(s24)								//pokud je sepnut spinac s24, tak ho vypni
	{	
		poc_pretec_c2=0;
		while(poc_pretec_c2<timeout24)	//timeot pro cekani na proudovou nulu
		{
			if(i24) break;				//cekani na nulovy proud I24
		}
		
		
		
		rs24;							//vypni sig. spinac
		_delay_us(50);					//prepinaci prodleva
	}
	poc_pretec_c2=0;
	while(poc_pretec_c2<timeout13)
	{
		if(!u13) break;					//dokud tam neni napětí u13 tak čekej
	}
	 
	poc_pretec_c2=0;
	while(poc_pretec_c2<timeout13)
	{
		
		if(u13) break;					//dokud neklesne napeti u13 na nulu tak cekej
		
	}
	_delay_us(pause13);					//zpozdeni do skutecne napetove nuly
	ss13;								//sepni s13
		
	}

//********************************************************************************************************
void zap_s_nap(void)
	{
		nastav_citac2();

	if(s13)	
	{	
		poc_pretec_c2=0;
		while(poc_pretec_c2<timeout13)
		{
			if(i13) break;
		}
		
		
		
		rs13;							//vypni kodovaci napeti
		_delay_us(50);
	}
	poc_pretec_c2=0;
	while(poc_pretec_c2<timeout24)
	{
		if(!u24) break;
	}
	 
	poc_pretec_c2=0;
	while(poc_pretec_c2<timeout24)
	{
		
		if(u24) break;
		
	}
	_delay_us(pause24);
	ss24;								//zapni sig. napeti
	
}
//****************************************************************************************************************

void vypni_vse(void)
{
	nastav_citac2();

	if(s13)						//sepnuty kodovaci spinac?
	{	
		poc_pretec_c2=0;
		while(poc_pretec_c2<timeout13)//timeout
		{
			if(i13) break;		//cekani na proudovou nulu
		}
		
		
		
		rs13;					//vypni k. spinac
		
	}
		
	if(s24)						//sepnuty signalni spinac?
	{	
		poc_pretec_c2=0;
		while(poc_pretec_c2<timeout24)
		{
			if(i24) break;
		}
		
		
		
		rs24;					//vypni sig. spinac
		
	}
	
}

//************************************************************************************
void init (void)
{
	DDRC=0;
	PORTC=0xff;//nastaveni brany C, jako vstupni, zap. pull-up rezistoru
	
	DDRD=(0<<PD2)|(0<<PD3)|(1<<PD4)|(0<<PD5)|(1<<PD6)|(0<<PD7);//nastaveni brany D
	PORTD=(1<<PD2)|(1<<PD3)|(1<<PD5)|(1<<PD7);


	unsigned char pomoc=0;
	unsigned int impulsy=0;
	for(unsigned int i=0;i<50000;i++) {_delay_ms(0.05);}
	//******************************************************************************
	//               Nastavení čítače 1 f=2Hz
	//******************************************************************************
	//COM1Ax - generování signálu OC1A
	//COM1Bx - generování signálu OC1B
	//WGM1x  - režim čítače
	TCCR1A=((0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(0<<WGM10));
	TCNT1=0;
	OCR1A=0;
	OCR1B=0;
	ICR1=31249;
	//ICNC1 - povolí sejmutí
	//ICES1 - vybírá hranu sejmutí
	//WGM1x - režim čítače
	//CS2x  - vstupní frekvence čítače
	TCCR1B=((0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(1<<CS12)|(0<<CS11)|(0<<CS10));
	//TOIE1  - povolí přerušení při přetečení
	//sbi(TIMSK,TOIE1);
	//TICIE2 - povolí přerušení při sejmutí čítače
	//sbi(TIMSK,TICIE1);
	//OCIE1A - povolí přerušení při komparaci s registrem A
	sbi(TIMSK,OCIE1A);
	//OCIE1B - povolí přerušení při komparaci s registrem B
	//sbi(TIMSK,OCIE1B);
	sei();


	poc_pretec_c1=0;
	while(poc_pretec_c1<=2)		//mereni frekvence sig. napeti
	{
		if(u24)
		{
			_delay_us(5);		//opakovane nacitani
			if(u24)
			{
				_delay_us(5);
				if(u24)
				{
					if(pomoc){impulsy++;pomoc=0;}
				}
				
				
				
			}
		}	
	
		else
		{
			_delay_us(5);
			if(!u24)
			{
				_delay_us(5);
				if(!u24)
				{
					pomoc=1;
				}
			
			}
		}
		
	}
	cli();
	for(unsigned int i=0;i<50000;i++) {_delay_ms(0.05);}

	if (impulsy>120)			//podle zmerene frekvence sig. napeti nastav prodlevy a timeouty
	{
		pause24=130;			//75Hz
		timeout24=74;
		
		pause13=130;
		timeout24=74;
	}
	if(impulsy>400)
	{
		pause24=28;				//275Hz
		timeout24=20;
	}
	
		
	}
//*************************************************************************************************************
void test_vstupu (void)
{
	unsigned char brana_C=0;
	
	brana_C=PINC;
	_delay_us(200);
	if(brana_C!=PINC) return;			//ochrana proti ruseni
	
	switch (brana_C)
	{
		case 0b111110:znak=240;break;		//cervena
		case 0b111101:znak=120;break;		//zlute mezikruzi
		case 0b111011:znak=60;break;		//zluta
		case 0b110111:znak=40;break;		//zelena
		case 0b101111:znak=440;break;		//test
		case 0b011111:znak=330;break;		//signalni napeti
		default: znak=660;					//zakaz
	}
		
}
//****************************************************************************************************************
ISR(TIMER1_COMPA_vect)//preruseni od citace1
{
	poc_pretec_c1++;
}
//****************************************************************************************************************
ISR(TIMER2_COMP_vect)//preruseni od citace2
{
	poc_pretec_c2++;
}
//****************************************************************************************************************
void koduj(void)
{
	unsigned int barva=0;
	
	//******************************************************************************
	//               Nastavení čítače 1 16MHz- 432 hz
	//******************************************************************************
	//COM1Ax - generování signálu OC1A
	//COM1Bx - generování signálu OC1B
	//WGM1x  - režim čítače
	TCCR1A=((0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<WGM11)|(0<<WGM10));
	TCNT1=0;
	OCR1A=0;
	OCR1B=0;
	ICR1=37036;
	//ICNC1 - povolí sejmutí
	//ICES1 - vybírá hranu sejmutí
	//WGM1x - režim čítače
	//CS2x  - vstupní frekvence čítače
	TCCR1B=((0<<ICNC1)|(0<<ICES1)|(1<<WGM13)|(1<<WGM12)|(0<<CS12)|(0<<CS11)|(1<<CS10));
	//TOIE1  - povolí přerušení při přetečení
	//sbi(TIMSK,TOIE1);
	//TICIE2 - povolí přerušení při sejmutí čítače
	//sbi(TIMSK,TICIE1);
	//OCIE1A - povolí přerušení při komparaci s registrem A
	sbi(TIMSK,OCIE1A);
	//OCIE1B - povolí přerušení při komparaci s registrem B
	//sbi(TIMSK,OCIE1B);
	sei();	
	
	barva=znak;
	for(;;)
	{
		zap_k_nap();									//prepni kodovaci napeti
		poc_pretec_c1=0;
		while(poc_pretec_c1<=(barva)){}				//cekej pulperiodu
		zap_s_nap();									//prepni na sig. napeti
		poc_pretec_c1=0;
		while(poc_pretec_c1<=(barva)){test_vstupu();}	//cekej pulperiodu behem ktere otestuj vstupy
		if(barva!=znak)									//pokud nastala zmena prac. rezimu ukonci kodovani
		{
			cli();
			vypni_vse();
			return;
		}
	}
}





