/*
 * Test_Key___LCD.c
 *
 * Created: 18.11.2011 20:11:00
 *  Author: Jan Kristel
 *
 */ 



#define AVR_ATmega16A
#define F_CPU 16000000UL

#include <avr/io.h>
#include <stdlib.h>
#include <avr/interrupt.h> 
#include <stdio.h>
#include <util/delay.h>
#include <avr/eeprom.h>


#include "lcd_h.h" 


char buffer[16];
volatile uint8_t temp ;
volatile uint8_t tlac;//unsigned char tlac; 
volatile uint8_t klavesa;  //unsigned  char  klavesa;
volatile uint8_t priznak; // priznakz zastrez ....
volatile uint8_t cas;   // odlozene zastrezeni
volatile uint8_t buff; // eeprom - PIN
volatile uint8_t pin_count = 0; // pocet spatne zadany PIN


volatile uint8_t kod[4];            // po startu PIN z EEPROM
volatile uint8_t kod_new[4];       // buffer PIN	
volatile uint8_t kod_m[4];         // Master PIN
volatile uint8_t kod_zadany[4];      // pole pro porovnani pinu
volatile uint8_t uk = 0x00;       //ukazatel pole

volatile uint8_t xy;


#define KLIN  PINA    //vstupy klavesnice na pinu D
#define KLOUT PORTA

#define LED 0      
#define TLAC 7

#define LED_r PORTB  // vystupy led a PIEZO
#define TLAC PIND
#define PIEZO PORTB
#define PIEZO_prot PORTB1
#define RE PORTD4  // set bit RX/TX RS485  
#define DE PORTD3

//******** priznakove bity****
#define strez 1 // prinak zastrez/odstrez - zastrezeno log 0




void beep() //Pipne
{
 _delay_ms(50);
   PIEZO |= (1<<PIEZO_prot); // pipni  
 _delay_ms(50) ;
   PIEZO &= ~(1<<PIEZO_prot);
}




int read_keypad()
	{
	 uint8_t a;
     uint8_t button;
	 button = 0;
	 KLOUT = 0xff;
	 
	 
	 	// button=0x00; 
KLOUT = 0b11110111;   // sloupec 1
asm("nop");
	a = KLIN;
	if (a==0b01110111) {button=1; goto fin;}
	if (a==0b10110111) {button=4; goto fin;}
	if (a==0b11010111) {button=7; goto fin;}
	if (a==0b11100111) {button=11; goto fin;}
	// button=0x00; 
	
	
 
KLOUT = 0b11111011; // sloupec 2
asm("nop");
	a = KLIN;
	if (a==0b01111011) {button=2; goto fin;}
	if (a==0b10111011) {button=5; goto fin;}
	if (a==0b11011011) {button=8; goto fin;}
	if (a==0b11101011) {button=10;goto fin;} //klavesa 0 (10)

	
KLOUT = 0b11111101;  // sloupec 3
asm("nop");
	a = KLIN;
	if (a==0b01111101) {button=3; goto fin;}
	if (a==0b10111101) {button=6; goto fin;}
	if (a==0b11011101) {button=9; goto fin;}
	if (a==0b11101101) {button=22;goto fin;} // klavesa enter	 

	
	
KLOUT = 0b11111110;   // sloupec 4(uplne na pravo)
asm("nop");
	a = KLIN;
	if (a==0b01111110) {button=14; goto fin;} // asi B
	if (a==0b10111110) {button=15; goto fin;}
	if (a==0b11011110) {button=16; goto fin;}
	if (a==0b11101110) {button=33; goto fin;} //klavesa clr
	 



KLOUT = 0b11111111;  // sloupec x
asm("nop");
	a = KLIN;
	
	fin:

	_delay_ms(30); //proti zakmitum
	a = KLIN | 0x0f;
	if(a != 0xff){
	 beep( );	
	 }
	while (a < 0xff )
	{
		
     a = KLIN | 0x0f; 
	}
	
	return(button);
} 



void init()
{
	



//******inicializace USART*********
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
//UCSRB=0x18;
UCSRB=0x00;
UCSRB |= (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;
//**************************** /

    	 
//TCCR0  |= (1<<CS02); //nastavi preddelicku na 256
//TIMSK  |= (1<<TOIE0); // povoli preruseni pri preteceni 

DDRA = 0x0f; // Pripojení klavesníce       PC0-3 --- sloupce (vystupy) , PC4-7 radky (vstupy) ------
DDRB = 0b00000011;

DDRD =  0b00011000; //tlacitko vstup PD7 a povoleni RS485 PD3 a PD4
PORTD = 0b10000000;
priznak &= ~(1<<strez); // nastavi priznak zastrezeno
//sei();

}


void init_ram ()
{
	//nacte promene z eeprom
  cas = eeprom_read_byte(0x09); // cas odlozeneho zastrezeni
 
 kod[0] = eeprom_read_byte(0x01); // Pin se nachazi na adrese 1 - 4
 kod[1] = eeprom_read_byte(0x02);
 kod[2] = eeprom_read_byte(0x03);
 kod[3] = eeprom_read_byte(0x04);
 
 
 kod_m[0] = eeprom_read_byte(0x05); // Master PIN se nachazi na adrese 5 - 8
 kod_m[1] = eeprom_read_byte(0x06);
 kod_m[2] = eeprom_read_byte(0x07);
 kod_m[3] = eeprom_read_byte(0x08);
 
}


void USART_send( unsigned char data){
	 
 while(!(UCSRA & (1<<UDRE)));
	 UDR = data;
	 
}

unsigned char USART_receive(void){
  	while(1)
	{
	  if(bit_is_set(UCSRA,RXC)) //je li RXC plny zkopiruj data do temp   
	    {
		 return(UDR);
	    }
	return(0);
	}

}

void USART_putstring(volatile char* StringPtr){
	 PORTD |= (1<<DE); // nastavi vysilani na RS485
	 PORTD |= (1<<RE); 
	 
    _delay_us(300);
	  
	while(*StringPtr != 0x00){
	 USART_send(*StringPtr);
	 StringPtr++;}
	
    _delay_ms(800);	
	 PORTD &= ~(1<<DE); 
	 PORTD &= ~(1<<RE);
	 
}



void CLR_EEPR ()
{
	 _delay_ms(100);
	if (!(PIND & (1<<TLAC))) // je li tl stisknuto vykonej
  {
   for (volatile uint8_t i = 0; i<8 ;i++)
   {
    if (!(PIND & (1<<TLAC)))// casuje dokut se drzi tlac
	 {                        
     PORTB |= (1<<LED);
	_delay_ms(1000);
    PORTB  &= ~(1<<LED);
	_delay_ms(1000);
    }
	else{ i =7;}
    }
   // cas dosel overi stale stik tl  a vzkona fci
   if (!(PIND & (1<<TLAC))) 
   {
	  
   eeprom_write_byte(0x09,0); // casove spozdeni
  
 // reset PIN
   eeprom_write_byte(0x01,1); //adr. v EEPR 1-4
   eeprom_write_byte(0x02,2);
   eeprom_write_byte(0x03,3);
   eeprom_write_byte(0x04,4);


// master PIN
   eeprom_write_byte(0x05,4); //adr. v EEPR 1-4
   eeprom_write_byte(0x06,3);
   eeprom_write_byte(0x07,2);
   eeprom_write_byte(0x08,1);
	
	_delay_ms(500);
	sprintf ( buffer , "#" ); //potvrdi informuje vydalenou jed. o resetu
    _delay_ms(100);
	USART_putstring(buffer);

  beep();
  beep();
  _delay_ms(900);
  beep();
   }
 }    
}


int init_vzd_jed(){
  
  volatile uint8_t i;
  unsigned char temp = 0;
 for (i = 0 ; i < 50 ; i++ )  //smyska ceka 5 sec na prichozi znak kdyz ne - vdal jed problem
 {
  _delay_ms(100);  
  temp = USART_receive();
    if (temp > 0)// jestli se temp nerovna nule prisel znak tedy vyskoc ze smicky
    {
	  i = 220;
    }
 }

   if (temp == 'a') //jestli prijal tento znak komunikuje
     {
	 lcd_clrscr();
     lcd_gotoxy( 4,0 );
	 lcd_puts( "Komunikace OK");
    beep(); //INIT OK - pipne    
    _delay_ms(1000);
	// odesli znak do vzdalene jednotky pro overeni komunikace
    } 
    else
    {
	 lcd_clrscr();
     lcd_gotoxy( 4,0 );
	 lcd_puts( " Vzdal jedn.");
	 lcd_gotoxy( 5,1 );
	 lcd_puts( "!! CHYBA !!");
	 beep(); //INIT - vzdalene  KO - pipne 3x 
	 beep();
	 beep();
    }
}

int init_status()
 { 
  unsigned char temp = 0;

 temp = USART_receive();

  switch (temp)
  {
     case 'n': // na LCD
	 lcd_secondline();
	 lcd_gotoxy( 3,1 );
	 lcd_puts( "Dalk. ovladani");
	 beep();
	 _delay_ms(1500);
	 lcd_secondline();
  	break;
	
    case 'p':
	lcd_clrscr();
 	 lcd_gotoxy( 5,1 );
	 lcd_puts( "Dalk. Ovladani");
	 beep();
  	break;
	
    
	    
      
   case '!':
   lcd_clrscr();
   lcd_gotoxy( 6,0 );
   lcd_puts( " CHyba");
   lcd_gotoxy( 4,1 );
   lcd_puts( "SIM karty");
   beep();
   break;
   
   case 'z':
   lcd_clrscr();
   lcd_gotoxy( 5,0 );
   lcd_puts( "ZASTREZENO");
   priznak &= ~(1<<strez);
   break;
   
   case 'd':
   lcd_clrscr();
   lcd_gotoxy( 5,0 );
   lcd_puts( "ODSTREZENO");
   priznak |= (1<<strez);
   break;
   
    case 'W':
	_delay_ms(200);
	sprintf ( buffer , "Q" ); //potvrdi funcnost komunikaci
    _delay_ms(100);
	USART_putstring(buffer);
   break;
  }
  	
}
void lcdp_ok()
{
   lcd_secondline (); 
   lcd_gotoxy( 0,1 );     
   lcd_puts( "OK");
   _delay_ms(1500);
}
int menu () 
{ 
  //****************************************MENU Nastaveni**********************  
   // podminka jestli se stiskne tl AUX skoci se o nastavovacho rezimu (menu) 
  if(klavesa == 11)
  { 
    lcd_clrscr();
    lcd_gotoxy( 2,0 );
    lcd_puts("zadej MASTER PIN");
    klavesa = 0x00 ; // vynuluj posledni stisk !!
    uk = 0x00;
	 
	for (klavesa = 0; (klavesa != 22) ;klavesa = read_keypad()) // cte PIN
	   {
	     if (klavesa > 0x00 )
	     {
	      kod_zadany[uk] = klavesa; // uklada  hodnotu tl. do pole (max 4 znaky)
	      uk = uk +1;
	      lcd_gotoxy( uk,1 );   //tohle vypise na LCD hvezdicky uk posunuje kurzor
	      lcd_puts("*");
	      klavesa = 0x00;
	      }		    
	    }		  
		
	 if ((kod_zadany[0] == kod_m[0]) && (kod_zadany[1] == kod_m[1]) &&(kod_zadany[2] == kod_m[2]) && (kod_zadany[3] == kod_m[3]))
	  {

		// PIN nastaveni OK pokracuj 				
	lcd_clrscr();
	lcd_gotoxy( 2,0 );
	lcd_puts("MENU - nastaveni");
	klavesa = 0x00 ; // vynuluj posledni stisk "!!
	for(;(klavesa != 22) && (klavesa != 33);klavesa = read_keypad()) // smycka menu
	   	{
		  switch ( klavesa )
			 { 
			    case 1:   // TL 1 nastaveni RELE3
				lcd_gotoxy( 0,1 );
				lcd_secondline (); 
				lcd_puts( "Nastaveni RELE3");
           		 
				for (klavesa = 0 ; klavesa < 1;	klavesa = read_keypad()) // ceka na stisk tl  napr 1 - povoli, 2 - zakaze, clr - ukonci prog,  entret - potvrdi
			     {
         	  	 }
		         if (klavesa == 22)
		         {
				   lcd_clrscr();
				   lcd_gotoxy( 1,0 );        
				   lcd_puts( "sepn. RELE3 pri popl");	 
		           lcd_gotoxy( 0,1 );
				   lcd_puts( "1 - Pov. 2 - zak.");
		           for (klavesa = 0;(klavesa != 22) && (klavesa != 33) && (klavesa != 1) && (klavesa != 2);	klavesa = read_keypad())
			       {
         	  	   }
				   if (klavesa == 1)
				    {
					sprintf ( buffer , "j"  ) ; // odesle datagram - probehlo odstreuzeni spravne
		            _delay_ms(100);
			        USART_putstring(buffer); 	
			  		lcdp_ok();			    
					}
				   if (klavesa == 2)
				   { 
		           sprintf ( buffer , "v"  ) ; // odesle datagram - probehlo odstreuzeni spravne
		           _delay_ms(100);
			       USART_putstring(buffer);  
				   lcdp_ok();
				    }
				    klavesa = 0;
				   	lcd_clrscr();
	                lcd_gotoxy( 2,0 );
	                lcd_puts("MENU - nastaveni");
				   }
	          //**-
		  	    break ;

                case 2:   // stisk tl 2 // *** volba poplachove SMS**
       			lcd_secondline (); 
	            lcd_gotoxy( 0,1 );
				lcd_puts( "Poplachova SMS");
                 // pozor vdy je poteba klavesu vynulovat 
				 
			    for (klavesa = 0 ; klavesa < 1;	klavesa = read_keypad()) // ceka na stisk tl  napr 1 - povoli, 2 - zakaze, clr - ukonci prog,  entret - potvrdi
			     {
         	     }
		       if (klavesa == 22)
		       {
				 lcd_clrscr();
				 lcd_gotoxy( 1,0 );       
				 lcd_puts( "Poslat ploplach. SMS");	 
		         lcd_gotoxy( 0,1 );
				 lcd_puts( "1 - Pov. 2 - Zak.");
		         for (klavesa = 0;(klavesa != 22) && (klavesa != 33) && (klavesa != 1) && (klavesa != 2);	klavesa = read_keypad())
			     { }
				 if (klavesa == 1)
				 {
		          sprintf ( buffer , "d"  ) ; // odesle datagram - probehlo odstreuzeni spravne
		          _delay_ms(100);
			      USART_putstring(buffer);  
			      lcdp_ok();
				 }
				 if (klavesa == 2)
				 { 
	 	          sprintf ( buffer , "x" ); // zakaze poplacgh SMS
 	              _delay_ms(100);
	              USART_putstring(buffer);  
				  lcdp_ok();		    		
				  }
		         _delay_ms(1000);
	             klavesa = 0;
			     lcd_clrscr();
	             lcd_gotoxy( 2,0 );
	             lcd_puts("MENU - nastaveni");
		       }
	             //**-
			   
				break ;	
			    case 3: 
                lcd_secondline ();  //********volba prozvaneni na vic tel cisel******
	            lcd_gotoxy( 0,1 );
				lcd_puts( "Poplachovy hovor");
                 // pozor vdy je poteba klavesu vynulovat 
				 
			    for (klavesa = 0 ; klavesa < 1;	klavesa = read_keypad()) // ceka na stisk tl  napr 1 - povoli, 2 - zakaze, clr - ukonci prog,  entret - potvrdi
			     {
         	     }
		       if (klavesa == 22)
		       {
				 lcd_clrscr();
				 lcd_gotoxy( 1,0 );       
				 lcd_puts( "Prozv. na tel. 2-4");	 
		         lcd_gotoxy( 0,1 );
				 lcd_puts( "1 - Pov. 2 - Zak.");
		         for (klavesa = 0;(klavesa != 22) && (klavesa != 33) && (klavesa != 1) && (klavesa != 2);	klavesa = read_keypad())
			     { }
				 if (klavesa == 1)
				 {
		          sprintf ( buffer , "l"  ) ; // odesle datagram - probehlo odstreuzeni spravne
		          _delay_ms(100);
			      USART_putstring(buffer);  
                  lcdp_ok();
				 }
				 if (klavesa == 2)
				 { 
	 	          sprintf ( buffer , "b" ); // zakaze poplacgh SMS
 	              _delay_ms(100);
	              USART_putstring(buffer);  
				  
                  lcdp_ok();   		
				  }
		         _delay_ms(1000);
	             klavesa = 0;
			     lcd_clrscr();
	             lcd_gotoxy( 2,0 );
	             lcd_puts("MENU - nastaveni");
		       }
	             //**-
			     break ;	
			
				 case 4: 
 				 lcd_secondline (); 
				 lcd_gotoxy( 0,1 );
				 lcd_puts( "Novy PIN");
				 //***************
				 for (klavesa = 0 ; klavesa < 1;	klavesa = read_keypad()) // ceka na stisk TL na KL
			     {
         	  	 }
		         if (klavesa == 22)
		         {
				   lcd_clrscr();
				   lcd_gotoxy( 1,0 );        
				   lcd_puts( "zadejte novy PIN");
				   uk =0x00;	 

                 for (klavesa = 0; (klavesa != 22) && (klavesa != 33) ;klavesa = read_keypad()) // cte klavesy
	             {
	               if (klavesa > 0x00 )
	                 {
	                  kod_new[uk] = klavesa; // uklada  hodnotu tl. do pole (max 4 znaky)
	                  lcd_gotoxy( uk,1 );   // vypis stisku na LCD 
	                  sprintf ( buffer ,"\%d", klavesa ) ;
			          lcd_puts ( buffer ) ;
	                  klavesa = 0x00;
	                  uk ++;
					  }		    
	              }      
		           
				   if (klavesa == 22)
				   {
				
				   eeprom_write_byte(0x01,kod_new[0]); //adr. v EEPR 1-4
				   eeprom_write_byte(0x02,kod_new[1]);
				   eeprom_write_byte(0x03,kod_new[2]);
			       eeprom_write_byte(0x04,kod_new[3]);
				    
				   kod[0] = kod_new[0];    // take do RAM
				   kod[1] = kod_new[1];
				   kod[2] = kod_new[2];
				   kod[3] = kod_new[3];

                   lcdp_ok();
				   } 
                   
				   if (klavesa == 33)
				   {
			       lcd_secondline (); 
					lcd_gotoxy( 0,1 );
				   lcd_puts("STORNO");   
				   }
				     
			      _delay_ms(1000);
						   
				    klavesa = 0;
				   	lcd_clrscr();
	                lcd_gotoxy( 2,0 );
	                lcd_puts("MENU - nastaveni");
				 }
	         				
				//*****
				 			 
				 break ; 
				 case 5:
 				 lcd_secondline (); // zmena master PINU***
				 lcd_gotoxy( 0,1 );
				 lcd_puts( "Novy MASTR PIN");
				 //***************
				 for (klavesa = 0 ; klavesa < 1;	klavesa = read_keypad()) // ceka na stisk TL na KL
			     {
         	  	 }
		         if (klavesa == 22)
		         {
				   lcd_clrscr();
				   lcd_gotoxy( 1,0 );        
				   lcd_puts( "zadejte novy PIN");
				   uk =0x00;	 

                 for (klavesa = 0; (klavesa != 22) && (klavesa != 33) ;klavesa = read_keypad()) // cte klavesy
	             {
	               if (klavesa > 0x00 )
	                 {
	                  kod_new[uk] = klavesa; // uklada  hodnotu tl. do pole (max 4 znaky)
	                  lcd_gotoxy( uk,1 );   // vypis stisku na LCD 
	                  sprintf ( buffer ,"\%d", klavesa ) ;
			          lcd_puts ( buffer ) ;
	                  klavesa = 0x00;
	                  uk ++;
					  }		    
	              }      
		           
				   if (klavesa == 22)
				   {
				
				   eeprom_write_byte(0x05,kod_new[0]); //adr. v EEPR 5-8
				   eeprom_write_byte(0x06,kod_new[1]);
				   eeprom_write_byte(0x07,kod_new[2]);
			       eeprom_write_byte(0x08,kod_new[3]);
				    
				   kod_m[0] = kod_new[0];    // take do RAM
				   kod_m[1] = kod_new[1];
				   kod_m[2] = kod_new[2];
				   kod_m[3] = kod_new[3];

                   lcdp_ok();
				   } 
                   
				   if (klavesa == 33)
				   {
		            lcd_secondline (); 
					lcd_gotoxy( 0,1 );
				   lcd_puts("STORNO");   
				   }
				     
			      _delay_ms(1000);
						   
				    klavesa = 0;
				   	lcd_clrscr();
	                lcd_gotoxy( 2,0 );
	                lcd_puts("MENU - nastaveni");
				 }		 
				 
				 break ; 
				 case 6:
                lcd_secondline ();  //********volba prozvaneni na vic tel cisel******
	            lcd_gotoxy( 0,1 );
				lcd_puts( "ovladani RELE1");
             				 
			    for (klavesa = 0 ; klavesa < 1;	klavesa = read_keypad()) // ceka na stisk tl  napr 1 - povoli, 2 - zakaze, clr - ukonci prog,  entret - potvrdi
			     {
         	     }
		       if (klavesa == 22)
		       {
				 lcd_clrscr();
				 lcd_gotoxy( 1,0 );       
				 lcd_puts( "ovl. REL1 prozvon.");	 
		         lcd_gotoxy( 0,1 );
				 lcd_puts( "1 - Pov. 2 - Zak.");
		         for (klavesa = 0;(klavesa != 22) && (klavesa != 33) && (klavesa != 1) && (klavesa != 2);	klavesa = read_keypad())
			     { }
				 if (klavesa == 1)
				 {
		          sprintf ( buffer , "r"  ) ; // odesle datagram - probehlo odstreuzeni spravne
		          _delay_ms(100);
			      USART_putstring(buffer);  
                  lcdp_ok();
				 }
				 if (klavesa == 2)
				 { 
	 	          sprintf ( buffer , "m" ); // zakaze poplacgh SMS
 	              _delay_ms(100);
	              USART_putstring(buffer);  
				  
                  lcdp_ok();   		
				  }
		         _delay_ms(1000);
	             klavesa = 0;
			     lcd_clrscr();
	             lcd_gotoxy( 2,0 );
	             lcd_puts("MENU - nastaveni");
		       }
	             //**-
				 break ; 
							
				 //**********Nastaveni Odlozeneho zastrezeni********
				case 7: 
				lcd_secondline ();
 				lcd_gotoxy( 0,1 );
				lcd_puts( "odloz. zastrezeni");
				
				//*****
				for (klavesa = 0 ; klavesa < 1;	klavesa = read_keypad()) // ceka na stisk TL na KL
			     {
         	  	 }
		         if (klavesa == 22)
		         {
				   lcd_clrscr();
				   lcd_gotoxy( 1,0 );        
				   lcd_puts( "Odlozene zastrez.");	 
		           lcd_gotoxy( 0,1 );
				   lcd_puts( "1-0s, 2-10s, 3-40s");
		           for (klavesa = 0;(klavesa != 22) && (klavesa != 33) && (klavesa != 1) && (klavesa != 2) && (klavesa != 3);	klavesa = read_keypad())
			       {
         	  	   }
				  if (klavesa == 1)
				    {
					  eeprom_write_byte(0x09,0);
					  cas = 0; // kvuli okamzitemu uplatneni	
					  lcdp_ok();		    
					}
				  if (klavesa == 2)
				   { 
                    eeprom_write_byte(0x09,10);
					cas = 10;
					lcdp_ok();	 
				   }
				  if (klavesa == 3)
				   { 
	               eeprom_write_byte(0x09,40);
				   cas = 40;
				   lcdp_ok();
				   }
				   	lcd_clrscr();
	                lcd_gotoxy( 2,0 );
	                lcd_puts("MENU - nastaveni");
				   }
	         				
				//*****
				break ; 
											
				case 8: 
				lcd_secondline ();
 				lcd_gotoxy( 0,1 );
				lcd_puts( "odlozen. poplach.");
		    	break ; 
			   }
            }			 		
	
			lcd_clrscr();
		  	lcd_gotoxy( 5,0 );
            lcd_puts( "ODSTREZENO");
							
		    lcd_gotoxy( 0,1 );
            lcd_puts( "exit");
			_delay_ms(1000);
			lcd_secondline();				

	       uk = 0x00; 	
		   klavesa = 0x00; 	
           priznak |= (1<<strez);
           return(0);
	}		   
	//****
		lcd_clrscr();
	    lcd_gotoxy( 5,0 );
		lcd_puts("ODSTREZENO");
		lcd_gotoxy( 0,1 );
		lcd_secondline (); 	  
        lcd_puts( "Spatny PIN");
		 uk =0x00;
		beep();	
	    beep();	
	    beep();	   			  
		_delay_ms(1500);
		lcd_secondline();
		priznak |= (1<<strez);	
		return(0); //spatny PIN vyskoc
	  		   
  }  
//***************************konec fce menu**********
} 
 
int main(void)
{
   
	init();
	CLR_EEPR ();
	init_ram();                  // inicialicace hodnot z EEPROM
	lcd_init(); 			     //Inicializace LCD displeje
	lcd_clrscr(); 			     //Smazani obsahu LCD displeje
	lcd_gotoxy( 3,0 ); 	         //Presun kurzoru na pozici (0,0)
	lcd_puts( "GSM Alarm V1.0");


	 init_vzd_jed(); // testuje komunikaci vzdalene jed.
	_delay_ms(1000);
	lcd_clrscr();
	lcd_gotoxy( 5,0 ); 
	lcd_puts( "ZASTREZENO"); 
	

 
   while(1)
  {
	  
     init_status(); // cyklicky cte seriak 
	 klavesa = read_keypad(); //cte klavesnici
        
		  
//----------------------tohle zjistuje stav stisk klavesy-----------------
	if (klavesa > 0x00 )	
	 {
		if (!(priznak & (1<<strez))) // vykonava je-li zastrezeno
		{
					
		 kod_zadany[uk] = klavesa; // uklada  hodnotu tl. do pole (max 4 znaky)
//---------------jen pro kontrolu stavu a funkce----------------	
		   lcd_gotoxy( uk,1 );   //hvezdicky na LCD
           lcd_puts("*");
           uk ++;
//-**********************************************
	 if(klavesa == 33)// stiskne li se klacese clr vzmaze zadavani
	 {  	   
	    lcd_secondline (); 
	    lcd_gotoxy( 0,1 );
	    lcd_puts( "Smazno");
	    uk =0x00;
	    beep();	
	    beep();	
	    beep();
	   _delay_ms(1500);  
 	    lcd_secondline();	
	 }
      //************************	
      if (klavesa == 22)  //testtuje stisk entru (overi zadane klavesy - PIN)
         {
		 if ((kod_zadany[0] == kod[0]) && (kod_zadany[1] == kod[1]) &&(kod_zadany[2] == kod[2]) && (kod_zadany[3] == kod[3]))//jestli se kody shoduji vykone ..
		   {
			 lcd_clrscr();
			 lcd_gotoxy( 5,0 );
			 lcd_puts( "ODSTREZENO");   
		   
		    lcd_gotoxy( 0,1 );
			lcd_secondline (); 	  
            lcd_puts( "PIN OK");
		    uk =0x00;
			pin_count = 0; // vznuluje pocet spatnych zadani
		    sprintf ( buffer , "&"  ) ; // odesle datagram - probehlo odstreuzeni spravne
		    _delay_ms(100);
			USART_putstring(buffer); 
			_delay_ms(1500);
			lcd_secondline();
			priznak |= (1<<strez);
	       }
		  else 
		  {
            lcd_gotoxy( 0,1 );
			lcd_secondline (); 	  
            lcd_puts( "Spatny PIN");
		    uk =0x0;//vynuluje ukazatel
			if ( pin_count > 5)
			{		    
            sprintf ( buffer , "+"  ) ; // odesle datagram - posle SMS 5x spatny PIN
		    _delay_ms(100);
			USART_putstring(buffer);
			pin_count = 0; 
			}
			pin_count ++;
		    beep();	
	        beep();	
	        beep();	   			  
			_delay_ms(1500);
		    lcd_secondline();
		  } 

        }
		
   klavesa = 0x00 ;
   }
   
   else // je-li odstrezeno cykli zde
   {

  //****************************Rutina zastreseni**************
    if (klavesa == 14)
    {
    lcd_clrscr();
    lcd_gotoxy( 5,0 );
    lcd_puts( "Zastrezuji");
   
    for (volatile uint8_t i = 0; i < cas; i++ ) // cas za jak dlouho zastrezi 5 sec
    {
     beep();
	 _delay_ms(1000);   
    }
   
	 sprintf ( buffer , "@" ); // pro master zastrezeno
	 _delay_ms(100);
	 USART_putstring(buffer); 
	
     //  lcd_clrscr();
     lcd_gotoxy( 5,0 );
     lcd_puts( "ZASTREZENO");
	 priznak &= ~(1<<strez);
	 uk = 0x00; 	
     }
  
    menu(); // funkce menu nastaveni
	
 //*******************************************  
    }	  
   }	  
  }		
}















