#include <avr/io.h>				//Szenzor + Ado	vcc	PD5
#include <util/delay.h>				//LCD vcc			PD0
#include <avr/interrupt.h>			//LCD E				PD6
#include <avr/sleep.h>				//LCD R/S			PD7
#include <i2c.h>				//LCD data			PC0..3
#include <lcd.h>				//Ado jel			PD1
#include <stdlib.h>				//gomb Menu			PD2
						//gomb Ok			PB0
#define LM75W 		0x90			//gomb het			PD4
#define LM75R		0x91			//gomb ora			PB1
#define SCL_CLOCK	50000			//gomb perc			PB2

struct progadat
{char min;
 char hr;
 char het;
 char temp_cel; 
};

unsigned char progs=1;

struct progadat bazis[30];

volatile unsigned char temp_lm;
//volatile unsigned int S;
volatile unsigned char F;
volatile unsigned char menu=0;
char K[10];
char *kp=&K[0];

void beam_action(void);
void wake(void);
void suspend(void);
void hetkiiro(struct progadat z);
void main_menu(void);
void ido_beall(void);
void ido_beall_action(void);
void temp_temp(void);
void temp_temp_action(void);
void temp_refresh(void);
unsigned long int konvert (struct progadat s);
void fagyelh(void);
void fagyelh_action(void);
void progging(void);
void progging_action(void);

SIGNAL(SIG_OVERFLOW2)
{static unsigned char sec=0;
 //TIFR &= ~(1<<TOV2);
 //TCNT2 = (0-0x20);

// PORTD &= ~(1<<PD0);
// lcd_setpos(0x00);
// myputchar(sec);
 ++sec;
 if (sec ==60) 			 {++bazis[0].min; sec =0;}
 if (bazis[0].min == 60) {bazis[0].min =0; ++bazis[0].hr; }
 if (bazis[0].hr == 24)  {bazis[0].hr=0; bazis[0].het++;}
 if (bazis[0].het == 8)	 {bazis[0].het = 1;} 

 if (progs != 29)
 	{if (progs == 28)
 		{if (konvert(bazis[1]) == konvert(bazis[0]))
			{progs=1; bazis[0].temp_cel = bazis[progs].temp_cel;}
 		}
 	 else 
 		{if (konvert(bazis[progs+1]) == konvert(bazis[0]))
			{++progs; bazis[0].temp_cel = bazis[progs].temp_cel;}
 		}
	}

 
 wake();
 temp_refresh();

 if (temp_lm < (bazis[0].temp_cel))
 	{F=1; beam_action();}
 
 if (temp_lm > (bazis[0].temp_cel+1))
	 F=0;

}

/*SIGNAL(SIG_OVERFLOW0)
{
}
*/
SIGNAL (SIG_INTERRUPT0)
{
 menu=1;
/* 
 if ((PIND & (1<<PD4)) == 0)
 { 
 	PORTD &= ~(1<<PD0);
 	menu = 0;
 } 
 else 
 {	if ((PORTD & (1<<PD0)) == 0)
 	{	PORTD |= (1<<PD0);
		_delay_ms(150);
		lcd_init();
		menu = 0;
	}
 }
*/
}



int main ()
{cli();
 _delay_ms(1000);

TIMSK &= ~((1<<OCIE2)|(1<<TOIE2));


 //timer2 init
 ASSR |= (1<<AS2);
// while ((ASSR & 0x07) !=0);
 TCNT2 = 0;//(0-0x20);
 TCCR2 |= (1<<CS20) | (1<<CS22) ;
// OCR2 = 0x20;
 while(ASSR & 0x07);
// while ((ASSR & 0x07) !=0);
 TIFR |= ((1<<OCF2)|(1<<TOV2));
// TIFR &= 0x3F;
 TIMSK |= (1<<TOIE2);


 bazis[0].min = 0; bazis[0].hr=0; bazis[0].het = 1; bazis[0].temp_cel =(20<<1);

 set_sleep_mode(SLEEP_MODE_PWR_SAVE);
 
//port data direction init
 DDRD |= (1<<PD5) | (1<<PD0) | (1<<PD6) | (1<<PD7) | (1<<PD1);
 DDRC |= (1<<PC0) | (1<<PC1) | (1<<PC2) | (1<<PC3);

//gombok pullup
 PORTD |= (1<<PD4) | (1<<PD2);
 PORTB |= (1<<PB0) | (1<<PB1) | (1<<PB2);

 //i2c init
 TWSR = 0;                         /* no prescaler */
 TWBR = ((F_CPU/SCL_CLOCK)-16)/2;  /* must be > 10 for stable operation */


//INT0 interrupt
 GICR = (1<<INT0);
// MCUCR = 0;

 sei();	//set global interrups enable

// PORTB |= (1<<PB0) | (1<<PB3);
 PORTC &= 0xF0;
 PORTD |= (1<<PD5) | (1<<PD0);

 wake();
 lcd_init();
 temp_refresh();

 bazis[1].het=1;
 bazis[1].hr=6;
 bazis[1].min=00;
 bazis[1].temp_cel=(22<<1);

 bazis[2].het=1;
 bazis[2].hr=10;
 bazis[2].min=00;
 bazis[2].temp_cel=(14<<1);

 bazis[3].het=1;
 bazis[3].hr=15;
 bazis[3].min=00;
 bazis[3].temp_cel=(22<<1);

 bazis[4].het=1;
 bazis[4].hr=22;
 bazis[4].min=00;
 bazis[4].temp_cel=(14<<1);
 

 bazis[5].het=2;
 bazis[5].hr=6;
 bazis[5].min=00;
 bazis[5].temp_cel=(22<<1);

 bazis[6].het=2;
 bazis[6].hr=10;
 bazis[6].min=00;
 bazis[6].temp_cel=(14<<1);

 bazis[7].het=2;
 bazis[7].hr=15;
 bazis[7].min=00;
 bazis[7].temp_cel=(22<<1);

 bazis[8].het=2;
 bazis[8].hr=22;
 bazis[8].min=00;
 bazis[8].temp_cel=(14<<1);


 bazis[9].het=3;
 bazis[9].hr=6;
 bazis[9].min=00;
 bazis[9].temp_cel=(22<<1);

 bazis[10].het=3;
 bazis[10].hr=10;
 bazis[10].min=00;
 bazis[10].temp_cel=(14<<1);

 bazis[11].het=3;
 bazis[11].hr=15;
 bazis[11].min=00;
 bazis[11].temp_cel=(22<<1);

 bazis[12].het=3;
 bazis[12].hr=22;
 bazis[12].min=00;
 bazis[12].temp_cel=(14<<1);


 bazis[13].het=4;
 bazis[13].hr=6;
 bazis[13].min=00;
 bazis[13].temp_cel=(22<<1);

 bazis[14].het=4;
 bazis[14].hr=10;
 bazis[14].min=00;
 bazis[14].temp_cel=(14<<1);

 bazis[15].het=4;
 bazis[15].hr=15;
 bazis[15].min=00;
 bazis[15].temp_cel=(22<<1);

 bazis[16].het=4;
 bazis[16].hr=22;
 bazis[16].min=00;
 bazis[16].temp_cel=(14<<1);


 bazis[17].het=5;
 bazis[17].hr=6;
 bazis[17].min=00;
 bazis[17].temp_cel=(22<<1);

 bazis[18].het=5;
 bazis[18].hr=10;
 bazis[18].min=00;
 bazis[18].temp_cel=(14<<1);

 bazis[19].het=5;
 bazis[19].hr=15;
 bazis[19].min=00;
 bazis[19].temp_cel=(22<<1);

 bazis[20].het=5;
 bazis[20].hr=22;
 bazis[20].min=00;
 bazis[20].temp_cel=(14<<1);


 bazis[21].het=6;
 bazis[21].hr=6;
 bazis[21].min=00;
 bazis[21].temp_cel=(22<<1);

 bazis[22].het=6;
 bazis[22].hr=10;
 bazis[22].min=00;
 bazis[22].temp_cel=(14<<1);

 bazis[23].het=6;
 bazis[23].hr=15;
 bazis[23].min=00;
 bazis[23].temp_cel=(22<<1);

 bazis[24].het=6;
 bazis[24].hr=22;
 bazis[24].min=00;
 bazis[24].temp_cel=(14<<1);


 bazis[25].het=7;
 bazis[25].hr=6;
 bazis[25].min=00;
 bazis[25].temp_cel=(22<<1);

 bazis[26].het=7;
 bazis[26].hr=10;
 bazis[26].min=00;
 bazis[26].temp_cel=(14<<1);

 bazis[27].het=7;
 bazis[27].hr=15;
 bazis[27].min=00;
 bazis[27].temp_cel=(22<<1);

 bazis[28].het=7;
 bazis[28].hr=22;
 bazis[28].min=00;
 bazis[28].temp_cel=(14<<1);

 bazis[29].temp_cel=(5<<1);

 while (1) 
 {switch (menu)
  {case 0: _delay_ms (200); main_menu(); suspend(); break;
   case 1: _delay_ms (200); 
   				/*	PORTD |= (1<<PD4);
 					PORTB |= (1<<PB0) | (1<<PB1) | (1<<PB2);*/
		   ido_beall(); break;
   case 2: _delay_ms (200); temp_temp(); break;
   case 3: _delay_ms (200); fagyelh();   break;
   case 4: _delay_ms (200); progging();  break;
   default: menu= 0; break;
  }
 
 }
 
}

void main_menu(void)
{
// wake_lcd();
// lcd_clear();
 lcd_setpos(0x00);

 hetkiiro (bazis[0]);
 myprintf (", ");

 lcd_setpos(0x0B);
 if (bazis[0].hr <10)
 	myprintf ("0");
 myprintf (itoa(bazis[0].hr,kp,10));
 myprintf (":");
 if (bazis[0].min <10)
 	myprintf ("0");
 myprintf (itoa(bazis[0].min,kp,10));

// myprintf (" P");
// myprintf (itoa(progs,kp,10));
 
 lcd_nline();
 
 myprintf (itoa((temp_lm>>1),kp,10));
 myprintf (".");
 myprintf (itoa(((temp_lm & 0x01)*5),kp,10));
 myputchar (0xDF);
 myprintf ("C ");

 myputchar (0x7F);

 myprintf (itoa((bazis[0].temp_cel>>1),kp,10));
 myprintf (".");
 myprintf (itoa(((bazis[0].temp_cel & 0x01)*5),kp,10)); 
 myputchar (0xDF);
 myprintf ("C");
 
  if (F==1)
	{lcd_setpos(0x4F); myprintf("F");}
  else
 	{lcd_setpos(0x4F); myprintf(" ");}
}


void ido_beall(void)
{myprintf("%cIdo beallitasa?");
// _delay_ms(200);
 while (1)
 {if ((PINB & (1<<PB0)) == 0) {_delay_ms (200); ido_beall_action(); break;}
  if ((PIND & (1<<PD2)) == 0) {_delay_ms (200); menu =2; break; }
 }

}

void ido_beall_action(void)
{TCCR1B = 0x00;
 
 while(1)
 {lcd_clear ();
  hetkiiro (bazis[0]);
  myprintf (", ");
   if (bazis[0].hr <10)
 	myprintf ("0");
  myprintf (itoa(bazis[0].hr,kp,10));
  myprintf (":");
   if (bazis[0].min <10)
 	myprintf ("0");
  myprintf (itoa(bazis[0].min,kp,10));
  lcd_nline();
  
  	while(1)
  	{if ((PIND & (1<<PD4)) == 0) {_delay_ms (200); ++bazis[0].het; if (bazis[0].het == 8) bazis[0].het = 1; break;}
     if ((PINB & (1<<PB1)) == 0) {_delay_ms (200); ++bazis[0].hr;  if (bazis[0].hr == 24) bazis[0].hr  = 0; break;}
	 if ((PINB & (1<<PB2)) == 0) {_delay_ms (200); ++bazis[0].min; if (bazis[0].min ==60) bazis[0].min = 0; break;}
	 if ((PINB & (1<<PB0)) == 0) {break;}
  	}
  if ((PINB & (1<<PB0)) == 0) {break;}
 }
 progs =1;
 
 while (konvert(bazis[progs]) <= konvert(bazis[0])) progs++;
 --progs;

 bazis[0].temp_cel = bazis[progs].temp_cel;
 
 TCNT1 = 0x1B1D;
 TCCR1B = 0x05;

 menu = 0;
 lcd_clear();
}



void temp_temp(void)
{
 myprintf("%cHomerseklet%n%tatallitasa?");
 while(1)
 {
  if ((PINB & (1<<PB0)) == 0) {_delay_ms (200); temp_temp_action(); break;}
  if ((PIND & (1<<PD2)) == 0) {_delay_ms (200); menu =3; break; }
 
 }
}

void temp_temp_action(void)
{while(1)
 {myprintf ("%cKivant ho:%n");
  myprintf (itoa((bazis[0].temp_cel>>1),kp,10));
  myprintf (".");
  myprintf (itoa(((bazis[0].temp_cel & 0x01)*5),kp,10)); 
  myputchar (0xDF);
  myprintf ("C");
  
  	while(1)
  	{if ((PINB & (1<<PB1)) == 0) {_delay_ms (200); ++bazis[0].temp_cel;  if (bazis[0].temp_cel > (30<<1)) bazis[0].temp_cel =(30<<1); break;}
	 if ((PINB & (1<<PB2)) == 0) {_delay_ms (200); --bazis[0].temp_cel;  if (bazis[0].temp_cel < (3 <<1)) bazis[0].temp_cel =(3<<1); break;}
	 if ((PINB & (1<<PB0)) == 0) {break;}
  	}
  if ((PINB & (1<<PB0)) == 0) {break;}
 }
 menu = 0;
 lcd_clear();
}

unsigned long int konvert (struct progadat s)
{
	return (s.het*10000+s.hr*100+s.min);
}


void wake(void)
{//gombok pullup
// PORTD |= (1<<PD4);
// PORTB |= (1<<PB0) | (1<<PB1) | (1<<PB2);

 PORTD |= (1<<PD5);		//szenzor es ado bekapcsolasa
 _delay_ms(100);
  
}

void suspend(void)
{
 PORTD &= ~(1<<PD5);	//szenzor es ado kikapcs
/* PORTD &= ((1<<PD0) | (1<<PD2));
 PORTC &= 0;
 PORTB &= ((1<<PB6)|(1<<PB7));
*/
 sleep_mode();
/* MCUCR &= 0x0F;
 MCUCR |= 0x30;
 MCUCR |= 0x80;
 MCUCR |= 0x80;
 MCUCR |= 0x80;
 MCUCR |= 0x80;//sleep_enable ();
 MCUCR |= 0x30;		//powe save mode
sleep_cpu ();
 MCUCR &= ~0x80;//sleep_disable ();
*/
}

void hetkiiro(struct progadat z)
{switch (z.het)
 {case 1: myprintf ("Hetfo"); break;
  case 2: myprintf ("Kedd"); break;
  case 3: myprintf ("Szerda"); break;
  case 4: myprintf ("Csutortok"); break;
  case 5: myprintf ("Pentek"); break;
  case 6: myprintf ("Szombat"); break;
  case 7: myprintf ("Vasarnap"); break;
 }
}

void beam_action (void)
{unsigned char out= 0xA5;
 for (unsigned char i = 0; i<6; i++)
 {
  	PORTD |=  (1<<PD1);
	_delay_ms(2);
	PORTD &= ~(1<<PD1);
	_delay_us(970);

	for (unsigned char i=0; i<8; i++)
	{PORTD |= (((out >> i)&0x01) << PD1);
  	 _delay_us(970);
	 PORTD &= ~(1<<PD1);
  	}
  _delay_ms(12);
 
 }


}

void temp_refresh(void)
{i2c_start(LM75W);
 i2c_write(0x00);
 i2c_start_rep(LM75R);
 temp_lm  = (i2c_read_ack()<<1);
 temp_lm |= (i2c_read_nack()>>7);
 i2c_stop();
}

void fagyelh(void)
{myprintf ("%cCsak%nfagyvedelem?");

	while (1)
	{if ((PINB & (1<<PB0)) == 0) {_delay_ms (200); fagyelh_action(); break;}
  	 if ((PIND & (1<<PD2)) == 0) {_delay_ms (200); menu =4; break; }
 	}

}

void fagyelh_action(void)
{myprintf ("%cCsak fagyvedelem%n   ");
 progs = 29;

 bazis[0].temp_cel = bazis[progs].temp_cel;

 myprintf (itoa((bazis[0].temp_cel>>1),kp,10));
 myprintf (".");
 myprintf (itoa(((bazis[0].temp_cel & 0x01)*5),kp,10)); 
 myputchar (0xDF);
 myprintf ("C");

 suspend();

 
 menu =7;
 lcd_clear();
}

void progging(void)
{myprintf ("%cProgramozas?");

	while (1)
	{if ((PINB & (1<<PB0)) == 0) {_delay_ms (200); progging_action(); break;}
  	 if ((PIND & (1<<PD2)) == 0) {_delay_ms (200); menu =5; lcd_clear(); break; }
 	}

}

void progging_action(void)
{unsigned char i=1,j=0;
 
 while(1)
 {lcd_clear();
  hetkiiro (bazis[i]);
  myprintf (", ");
  lcd_setpos (0x0A);
  if (bazis[i].hr <10)
 	myprintf ("0");
  myprintf (itoa(bazis[i].hr,kp,10));
  myprintf (":");
  if (bazis[i].min <10)
 	myprintf ("0");
  myprintf (itoa(bazis[i].min,kp,10));

  lcd_nline();

  lcd_setpos (0x4A);
  myprintf (itoa((bazis[i].temp_cel>>1),kp,10));
  myprintf (".");
  myprintf (itoa(((bazis[i].temp_cel & 0x01)*5),kp,10)); 
  myputchar (0xDF);
//  myprintf ("C");

  if (!j)	{lcd_setpos(0x09);}
  else		{lcd_setpos(0x49);}

  myputchar (0x7E);

  while (1)
  	{if ((PIND & (1<<PD4)) == 0) {_delay_ms (200); j= (~j&0x01); break;}
     if (!j)
	 	{if ((PINB & (1<<PB1)) == 0) {_delay_ms (200); ++bazis[i].hr;  //if (bazis[i].hr == 24) bazis[i].hr  = 0; 
									  if (bazis[i].het == bazis[i+1].het)
									  {if (bazis[i].hr == bazis[i+1].hr) 
									  	{if (bazis[i].het == bazis[i-1].het)
										  {bazis[i].hr= (bazis[i-1].hr+1); 
										   
										  }
									     else
										  {bazis[i].hr = 0;
										   
										  }
									    }
									  }
									  else
									  {if (bazis[i].hr == 24)
									    {bazis[i].hr = (bazis [i-1].hr + 1);
										 
										}
									  }
									  break;
									 }
	 	 if ((PINB & (1<<PB2)) == 0) {_delay_ms (200); ++bazis[i].min; if (bazis[i].min ==60) bazis[i].min = 0; break;}
	 	}
	 else
	 	{if ((PINB & (1<<PB1)) == 0) {_delay_ms (200); ++bazis[i].temp_cel;  if (bazis[i].temp_cel > (30<<1)) bazis[i].temp_cel =(30<<1); break;}
     	 if ((PINB & (1<<PB2)) == 0) {_delay_ms (200); --bazis[i].temp_cel;  if (bazis[i].temp_cel < (3 <<1)) bazis[i].temp_cel =(3<<1);  break;}
		}
	 
	 if ((PIND & (1<<PD2)) == 0) {_delay_ms (200); ++i; if (i==29) i=1; break;}
	 if ((PINB & (1<<PB0)) == 0) {break;}
	}
  if ((PINB & (1<<PB0)) == 0) {break;}
 }

 bazis[0].temp_cel = bazis[progs].temp_cel;
 menu = 5;

 lcd_clear();
}

