#include <avr/io.h>
#include "lcd.h"
#include <avr/interrupt.h>
#include <util/delay.h>

int zUvodu, pocitadlo=0;
int stavA=0, stavB = 0;
char text[32]; //pole znaku pro vypis na displej

//***TLACITKA**************************************************************
void tlacUP()
{
	int A=0, B = 0;
		do
		{
			//precist stav pinu
			A = (PINA & (1<<PA0));
			//pockat
			_delay_ms(100);
			//precist znovu stav pinu
			B = (PINA & (1<<PA0));
			//porovnat
		}while(A!=B);

		if(A == 0)
		{
			lcd_gotoxy(16, 0);
			lcd_puts("UP");
		}
}
void tlacDOWN()
{
	int A=0, B = 0;
		do
		{
			//precist stav pinu
			A = (PINA & (1<<PA1));
			//pockat
			_delay_ms(100);
			//precist znovu stav pinu
			B = (PINA & (1<<PA1));
			//porovnat
		}while(A!=B);

		if(A == 0)
		{
			lcd_gotoxy(16, 0);
			lcd_puts("DOWN");
		}
}
//*************************************************************************
//Rotacni enkodery
ISR (INT0_vect)
{
	if ((PIND & (1<<PD2))==4 && (PINA & (1<<PA5))==32)
	{ 
		pocitadlo=pocitadlo-1;      //inc 4
		if(OCR1A>10)
			OCR1A -= 5; //ubrat stridu
	}
	if ((PIND & (1<<PD2))==4 && (PINA & (1<<PA5))==0) 
	{
		pocitadlo=pocitadlo+1;      //dec 32
		if(OCR1A<250)
			OCR1A += 5; //pridej stridu
	}
}
//OC1B spodni,deska, oboustrany
ISR (INT1_vect)
{
	if ((PIND & (1<<PD3))==8 && (PINA & (1<<PA4))==16) 
	{
		pocitadlo=pocitadlo-1;      //inc 8
		if(OCR1B>10)
			OCR1B -= 5; //ubrat stridu
	}
	if ((PIND & (1<<PD3))==8 && (PINA & (1<<PA4))==0) 
	{
		pocitadlo=pocitadlo+1;      //dec 16
		if(OCR1B<250)
			OCR1B += 5; //pridej stridu
	}
}
//*************************************************************************
//PWM
//preteceni registru TCNT1
ISR(TIMER1_OVF_vect)
{
	//nastaveni pocatecni hodnoty pocitadla ktery se porovnava s OCR1
	TCNT1 = 3036;
	//PORTD^=(1<<PD5); //neguj PD4
}
//preteceni registru TCNT0
ISR(TIMER0_OVF_vect)
{
	//nastaveni pocatecni hodnoty pocitadla ktery se porovnava s OCR0
	TCNT0 = 3036;
	//PORTD^=(1<<PD5); //neguj PD4
}
//*************************************************************************
int main(){
	//PWM1----------------------------
	OCR1A = 10;
	OCR1B = 170;

	DDRD|= (1<<PD4); //nastaveni PD4/OC1B jako vystupni 
	DDRD|= (1<<PD5); //nastaveni PD5/OC1A jako vystupni

	//Rezim 5 fast PWM 8bit  ****
	TCCR1A|=(1<<COM1A1)| (1<<COM1B1)|(1<<WGM10); //OC1A, OC1B

	//preddelicka 256
	TCCR1B = (1<<WGM12) | (1<<CS10);
	//TCCR1B|=(1<<CS12); 
	//-------------------------------

	//INT0 nabezna hrana na vstupu INT0/ INT1 generuje zadost o preruseni
	MCUCR|=(1<<ISC01)|(1<<ISC00)|(1<<ISC11)|(1<<ISC10);   

	//povoleni preruseni od INT0 a INT1
	GICR |= (1<<INT0) | (1<<INT1);
	
	//Nastaveni kalibracniho bajtu internihoi RC osc ****
	//OSCCAL = 0xA5;

	//povoleni preruseni
	sei();

	//inicializace Port B - vstup (tlacitka)
	DDRA=0x00;
	PORTA=0xff;

	lcd_init(LCD_DISP_ON); // inicializacia displeja

	while(1)
	{

		stavA = (PIND & (1<<PD2));
		stavB = (PINA & (1<<PA5));

		tlacUP();
		tlacDOWN();
/*
		if(stavA == 16 && stavB == 32)
			{
				lcd_gotoxy(0, 4);
				sprintf(text, "Test");
				lcd_puts(text);
			}
		else
			{
				lcd_gotoxy(0, 4);
				sprintf(text, "    ");
				lcd_puts(text);
			}

		if(stavA == 6 && stavB == 32)
			//_delay_us(10);
			//if(stavA == 6 && stavB == 2)
				//if(stavA == 16 && stavB == 2)
					pocitadlo += 1;
	//	if(stavA == 1 && stavB == 0)
	//		pocitadlo -=1;

*/


		lcd_gotoxy(0, 0);
		sprintf(text, "OCR1A: %d ", OCR1A); //pocitadlo);
		lcd_puts(text);

		lcd_gotoxy(0, 1);
		sprintf(text, "OCR1B: %d ", OCR1B); //pocitadlo);
		lcd_puts(text);
	}

	return 0;
}
