/*	FŰTÉS AUTOMATIZÁLÁS
					
	Leidgeb Dániel	*/

/*****************************************************************/
/************************* HEADER FÁJLOK *************************/
/*****************************************************************/
#include "stdio.h"
#include "p18f6722.h"
#include "delays.h"
#include "math.h"
#include "menu.h"
#include "6722.h"
#include "lcd.h"
#include "clock.h"
#include "timers.h"
#define USE_OR_MASKS
#define RD16_ON 0x80


/*****************************************************************/
/************************** DEKLARÁCIÓK **************************/
/*****************************************************************/


int back=0;
int m=0, h, l, led=1;
int szamlalo=0;


void lo_isr(void);		//el?re deklaráljuk a kiszolgáló
void hi_isr(void);		//eljárásokat

//-- A PIC18 mikrovezérl?knél a magas prioritású interrupt vektor
//-- a 0x0008 címen található. Innen kell elugranunk a hi_isr()
//-- kiszolgáló eljáráshoz.
#pragma code high_vector_addr=0x08
void high_vector(void) {
  _asm GOTO hi_isr _endasm
}

//-- A PIC18 mikrovezérl?knél az alacsony prioritású interrupt vektor
//-- a 0x0018 címen található. Innen kell elugranunk a lo_isr()
//-- kiszolgáló eljáráshoz.
#pragma code low_vector_addr=0x18
void low_vector(void) {
  _asm GOTO lo_isr _endasm
}

#pragma code 			//visszatérünk az alapértelmezett kódszekcióba
#pragma interrupt hi_isr
void hi_isr (void) {
  /* Itt történik a magas prioritású megszakítás tényleges kiszolgálása */
}

#pragma interruptlow lo_isr
void lo_isr (void) {
    if(PIR1bits.TMR1IF && PIE1bits.TMR1IE){
 clock();
        PIR1bits.TMR1IF=0; }  	//Timer1 interrupt jelz?bitjének törlése
}





/*****************************************************************/
/*************************** FÜGGVÉNYEK **************************/
/*****************************************************************/

/*Gomb állapotok*/
typedef enum  {
  WFP,                                                                          //Lenyomásra vár
  WFR                                                                           //Felengedésre vár
} STATE;



/******************** ADC beolvasó függvény ********************/
unsigned int ADCRead(unsigned char ch)
{
   if(ch>13) return 0;                                                          //Nem valós csatorna
   ADCON0=0x00;
   ADCON0=(ch<<2);                                                              //ADC csatorna kiválasztása
   ADCON0bits.ADON=1;                                                           //ADC modul bekapcs.
   ADCON0bits.GO=1;                                                             //Konvertálás megkezdése
   while(ADCON0bits.NOT_DONE);                                                  //Várakozás a konvertálás befejezésére
   ADCON0bits.ADON=0;                                                           //ADC modul kikapcs.
   return ADRES;
}



/************* Függvény a fényerö meghatározására **************/
void fenyero_read(void){
unsigned int fenyero;
fenyero = ADCRead(5);
if(fenyero>300){
    LIGHTL =0;
    LIGHTH =1;}
if(fenyero<300){ LIGHTL=1;
       LIGHTH=0;}
}



/************* Függvény az áramszünet figyelésére **************/
void aramszunet_read(void){
unsigned int aram;
aram = ADCRead(6);
if(aram<890 && back==0){
SOUNDER_Toggle();
lcd8_write_command(0x80);
lcd8_write_command(0x16);
lcd8_write_command(0x16);
lcd8_write_command(0x16);
lcd8_write_command(0x16);
lcd8_write_command(0x16);
for(j=0; j<20; j++) {
		if(aramsz[j]!=0)
        lcd8_putc(aramsz[j]);                                                   //"aramsz" tömb karaktereinek kiírása (amég van)
		else break;
                    }
}
else
{ 
SOUNDER =0;
}
if(aram>890){
back=0;
lcd8_write_command(0x80);
lcd8_write_command(0x16);
lcd8_write_command(0x16);
lcd8_write_command(0x16);
lcd8_write_command(0x16);
lcd8_write_command(0x16);
for(j=0; j<20; j++) {
		if(tolt[j]!=0)
        lcd8_putc(tolt[j]);                                                     //"tolt" tömb karaktereinek kiírása (amég van)
		else break;
                    }
 }
}




/************** Függvény a h?mérséklet kiírására ***************/
void temp_read_write_to_lcd (void) {
	
	unsigned int val;                                                       //ADC érték
	unsigned int temp_value;                                                //Hőmérséklet érték

	val = ADCRead(0);
       
	temp_value = ceil(val*0.48876);                                         //Celsiussá konvertálás
        if(temp_value!=l){
        lcd8_write_command(0xD4);                                               //Kurzor a negyedik sorba
        lcd8_write_command(0x16);
        lcd8_write_command(0x16);
        lcd8_write_command(0x16);
        lcd8_write_command(0x16);
	lcd8_putnumber(temp_value);                                             //temp_value kiírása lcd-re
       
	lcd8_putc(space);                                                       //Szóköz beszúrása
	lcd8_putc(celsius_sign);                                                //"C" karakter beszúrása
        l = temp_value;}
	Delay1KTCYx(1000);                                                      //Várunk egy kicsit...

}





/********************** Idözítö függvény **********************/
void delay_ms(unsigned int d) {
unsigned int i;
   for(i=0; i<d; i++) {
     Delay1KTCYx(12);                                                           //12 000 TCY késleltetés (~ 1ms)
   }
}




/*****************************************************************/
/********************** ITT KEZDŐDIK A MAIN **********************/
/*****************************************************************/

void main(void){
    
    STATE gomb1; STATE gomb2; STATE gomb3; STATE gomb4;
    STATE gomb5; STATE gomb6; STATE gomb7;                                      //Állapotjelzök
    TRISAbits.TRISA6 = 1;
    TRISAbits.TRISA7 = 1;
    OSCCON | 0b11100000;
    mInitAllLEDs();                                                             // LED-ek inicializálása
    mInitALLSwitch();                                                           // Gombok inicializálása
    mInitSOUNDER();                                                             //Hangjelzö inicializálása
    lcd8_init();                                                                // Az LCD inicializálása
    lcd_cgram_init();
    ADCInit();                                                                  //ADC inicializálása
  

  //-- A megszakítási rendszer inicializálása -----------------
    RCONbits.IPEN=1;   		//Kétszint? megszakítási mód beállítása
    INTCONbits.GIEH=1;   	//A magas prioritású interrupt engedélyezése
    INTCONbits.GIEL=1;   	//Az alacsony prioritású interrupt engedélyezése

//-- Timer1 konfigurálása saját órával (T1OSC)
    T1CON | 0b10001111;
    TMR1H=0;               	//TMR1 törlése
    TMR1L=0;
    IPR1bits.TMR1IP=0;   	//Timer1 megszakítás alacsony prioritású legyen
    PIR1bits.TMR1IF=0;           //Timer1 interrupt jelz?bitjének törlése
    PIE1bits.TMR1IE=1;   	//Timer1 interrupt engedélyezése
    T1CONbits.TMR1ON = 1;    	//Elindítja Timer1-et

/*************** Gomb kezdöállapot beállítása ***************/
    gomb1=WFP; gomb2=WFP; gomb3=WFP; gomb4=WFP; gomb5=WFP; gomb6=WFP; gomb7=WFP;


/*************** Fix karakterek kiiratása *******************/
lcd8_write_command(0xD4);                                                       //Kurzor 4. sorba állítása

for(j=0; j<4; j++) {
		if(haz[j]!=0)
        lcd8_putc(haz[j]);	
		else break;}

lcd8_write_command(0x16);
lcd8_write_command(0x16);
lcd8_write_command(0x16);
lcd8_write_command(0x16);

for(j=0; j<1; j++) {
		if(ab[j]!=0)
        lcd8_putc(ab[j]);	
		else break;
                   }

lcd8_write_command(0x16);
lcd8_write_command(0x16);

for(j=0; j<5; j++) {
		if(aj[j]!=0)
        lcd8_putc(aj[j]);	
		else break;
                   }

lcd8_write_command(0xC0);                                                       //Kurzor 2.sorba állítása

for(j=0; j<11; j++) {
		if(uzemmod[j]!=0)
        lcd8_putc(uzemmod[j]);	
		else break;
                    }

lcd8_write_command(0x94);                                                       // Kurzor 3. sorba állítása

for(j=0; j<20; j++) {
		if(menu[j]!=0)
        lcd8_putc(menu[j]);	
		else break;
                    }


/******************** Végtelen ciklus **************************/
while (1) {

aramszunet_read();
temp_read_write_to_lcd();
fenyero_read();


/******************** ON villogtatása **************************/
szamlalo++;

if(szamlalo==10){
lcd8_write_command(0xD4);

for( h=0; h<9; h++){
lcd8_write_command(0x16);
                   }
for(j=0; j<2; j++) {
        if(on[j]!=0)
        lcd8_putc(on[j]);	
		else break;
                   }
}

if(szamlalo==20){
szamlalo=0;

lcd8_write_command(0xD4);

for( h=0; h<9; h++){
lcd8_write_command(0x16);
                   }
for(j=0; j<2; j++) {
		if(off[j]!=0)
        lcd8_putc(off[j]);	
		else break;
                   }
}


/******************** Ledek vezérlése **********************/
if(led==1){LED_1=1; LED_2=0; LED_3=0; LED_4=0;}
if(led==2){LED_2=1; LED_1=0;}
if(led==3){LED_3=1;}
if(led==4){LED_4=1;}


/********** 1. Nyomógomb állapotának vizsgálata ***********/
switch(gomb1) {
       case WFP:
         if(SW1==0) {
           TRISGbits.TRISG3=!TRISGbits.TRISG3;
           TRISGbits.TRISG2=!TRISGbits.TRISG2;
           
           gomb1=WFR;                                                           //következö állapot
         }
       break;
       case WFR:
         if(SW1==1) {
           gomb1=WFP;                                                           //következö állapot
         }
       break;
     }



/********** 2. Nyomógomb állapotának vizsgálata ***********/
switch(gomb2) {
       case WFP:
         if(SW2==0) {
            gomb2=WFR;	
       break;
      
       case WFR:
         if(SW2==1) {
           gomb2=WFP;	
         }
         }
       break;
     }



/********** 3. Nyomógomb állapotának vizsgálata ***********/
switch(gomb3) {
       case WFP:
         if(SW3==0) {
              if(m=4){min2++;
             
if(min2==10){
    min2= 0;
    min1++;
}
if(min1==6 && min2==0){
    min1= 0;
    min2= 0;
}
          
             lcd8_write_command(0x80);
    lcd8_putnumber(hour1);
    lcd8_putnumber(hour2);
    lcd8_putc(doublep);
    lcd8_putnumber(min1);
    lcd8_putnumber(min2);}
              
           gomb3=WFR;	
         }
       break;
       case WFR:
         if(SW3==1) {
           gomb3=WFP;	
         }
       break;
     }



/********** 4. Nyomógomb állapotának vizsgálata ***********/
switch(gomb4) {
       case WFP:
         if(SW4==0) {
             led++;
             if(led==5)led=1;
           gomb4=WFR;	
         }
       break;
       case WFR:
         if(SW4==1) {
           gomb4=WFP;	
         }
       break;
     }



/********** 5. Nyomógomb állapotának vizsgálata ***********/
switch(gomb5) {
       case WFP:
         if(SW5==0) {
             if(m==1){
              m=4;}
             if(m==2){m=5;}
           gomb5=WFR;	
         }
       break;
       case WFR:
         if(SW5==1) {
           gomb5=WFP;	
         }
       break;
     }



/********** 6. Nyomógomb állapotának vizsgálata ***********/
switch(gomb6) {
       case WFP:
         if(SW6==0) {            
             m++;
             if(m==4){m=1;}
           gomb6=WFR;	
         }
       break;
       case WFR:
         if(SW6==1) {
           gomb6=WFP;	
         }
       break;
     }



/********** 7. Nyomógomb állapotának vizsgálata ***********/
switch(gomb7) {
       case WFP:
         if(SW7==0) {
           m=0;
           back=1;
           gomb7=WFR;	
         }
       break;
       case WFR:
         if(SW7==1) {
           gomb7=WFP;	
         }
       break;
     }



/********************* Menürendszer ***********************/
switch(m){
    case 1:
         lcd8_write_command(0x94); 	
           for(j=0; j<20; j++) {
		if(tomb6[j]!=0)
        lcd8_putc(tomb6[j]);	
		else break;
}
         break;


    case 2:
        lcd8_write_command(0x94); 	
           for(j=0; j<20; j++) {
		if(tomb7[j]!=0)
        lcd8_putc(tomb7[j]);	
		else break;
}
        break;


    case 3:
          lcd8_write_command(0x94); 	
           for(j=0; j<20; j++) {
		if(tomb8[j]!=0){
        lcd8_putc(tomb8[j]);
               i=0;}
		else break;
}
          break;


 case 4:
          lcd8_write_command(0x94); 	
           for(j=0; j<20; j++) {
		if(tomb61[j]!=0){
        lcd8_putc(tomb61[j]);
               i=0;}
		else break;
}
          break;


 case 5:
          lcd8_write_command(0x94); 	
           for(j=0; j<20; j++) {
		if(tomb71[j]!=0){
        lcd8_putc(tomb71[j]);
               i=0;}
		else break;
}
          break;


 case 0:
          lcd8_write_command(0x94); 	
           for(j=0; j<20; j++) {
		if(menu[j]!=0){
        lcd8_putc(menu[j]);
               i=0;}
		else break;
}
          break;
}



delay_ms(5);                                                                    //Várakozunk 5ms-ot
}


}