#include <htc.h>
//#include <pic.h>
#include "1wire.h"
#include "ds18x20.h"
//#include "usart.h"
#include "lcd_1.h"
#include "vdelay.h"
#include "hw.h"
#define eszkoz_szam 24
//RTS=1 írás
//RTS=0 olvasás
void interrupt isr(void);
__CONFIG(FOSC_XT & WDTE_OFF & PWRTE_ON & MCLRE_ON & CPD_OFF & CP_OFF & BOREN_ON & IESO_ON & FCMEN_ON & LVP_OFF & BOR4V_BOR40V);


//float homersekletek[24];

struct {
	unsigned char adat[2];
	unsigned char hossz;
} bejovo_puffer;

struct {
	unsigned char kimeno_adat[24];
	unsigned char hatralevo;
	unsigned char hossz;
} kimeno_puffer;


signed char hom=0;
char aindex=0;
bit atlagmehet;


bit kijelzo_frissites_flag;
bit meres_flag;
bit soros_flag;
int atlag[24]; 

const char lcd_cim[8]={0x00,0x40,0x14,0x54,0x0a,0x4a,0x1e,0x5e};
const char pic_cim='7';

void initUART( void )
{

	RX_PIN = 1;	
	TX_PIN = 0;	
   	BRGH=1;					//high speed
	SPBRG=25;				//9,600 @ 4MHz, SPBRG = (4MHz/(16*BAUD_RATE))-1;
	PEIE=1;					
	TX9=0;					//8 bits
	RX9=0;					//
	SYNC=0;					//uart settings
	SPEN=1;
	CREN=1;
	TXIE=0;
	RCIE=1;
	TXEN=1;
	PEIE=1;
	RTS=0;
}

unsigned char is_OK_pressed(void)
{
    if (OK==0)        // is SW1 pressed?
    {                            //yes
        vWait_ms(300);            // wait 10mS for debounce.
        if (OK==0)    // is SW1 still has pressed status after 10mS delay?
        {                        // yes, we have key press
            return 1;
        }
    }
    return 0;// if key is not pressed, return 0
}



void main(void){
unsigned char szam;
unsigned char melyik_csoport=0;
//signed char tomb[24][4];			//átlagok számításához
//osszeg=0;
volatile unsigned char presence=0;
TRISA=0b00011110;
PORTA=0;
TRISC=0b10001111;
PORTC=0;
TRISB=0;
PORTB=0;
ANSEL=0;
ANSELH=0;
OPTION_REG=0x07;
initUART();
lcd_init();
lcd_clear();
lcd_init_cgram();


if(is_OK_pressed()==1){
while(is_OK_pressed());
bus_init();
}

lcd_clear();
lcd_goto(0x00);

	switch(presence=OW_reset()){
		case 1: lcd_puts("Nincs eszköz!"); while(OW_reset()){CLRWDT();} break;
		case 2: lcd_puts("Zárlat a buszon!"); while(OW_reset()){CLRWDT();} break;
		default: break;
	}
	szam=FindDevices_withoutsaving();
	lcd_goto(0x00);
	lcd_puts("Talált eszköz: ");lcd_senddecimal(szam,1);
//	lcd_putch(' ');
//	PR2=240;
//	TMR2IE=1;
	T0IE=1;
	while(1){
		if (kijelzo_frissites_flag)	// öt másodpercenként fut ide bele
		{
			switch (melyik_csoport)
			{	
				// kiirni a 0-7 hőmérsékleteket
				case 0: for(unsigned char kijel=1;kijel<=8;kijel++){				
						lcd_goto(lcd_cim[kijel-1]);
						lcd_puts("Hő");
						lcd_senddecimal(kijel,1);
						if(kijel==1){lcd_goto(0x08);lcd_puts("  ");lcd_goto(0x03);}
						lcd_puts(": ");
						if(atlag[kijel-1]!=-128 && atlag[kijel-1]!=-127){
							lcd_senddecimal(atlag[kijel-1],0);
							lcd_putch(' ');
						}
						else if(atlag[kijel-1]==-128) lcd_puts("ERR ");
						else lcd_puts("--- ");
						}

				break;
				// kiirni a 8-15 hőmérsékleteket
				case 1:	for(unsigned char kijel=9;kijel<=16;kijel++){
						lcd_goto(lcd_cim[kijel-9]);
						lcd_puts("Hő");
						lcd_senddecimal(kijel,1);
						if(kijel==9)lcd_puts(" : ");
						else
						lcd_puts(": ");
						if(atlag[kijel-1]!=-128 && atlag[kijel-1]!=-127){
							lcd_senddecimal(atlag[kijel-1],0);
							lcd_putch(' ');
						}
						else if(atlag[kijel-1]==-128) lcd_puts("ERR ");
						else lcd_puts("--- ");
						}		
				break;
				// kiírni a 16-23 hőmérsékleteket
				case 2:for(unsigned char kijel=17;kijel<=24;kijel++){
						lcd_goto(lcd_cim[kijel-17]);
						lcd_puts("Hő");
						lcd_senddecimal(kijel,1);
						lcd_puts(": ");
						if(atlag[kijel-1]!=-128 && atlag[kijel-1]!=-127){
							lcd_senddecimal(atlag[kijel-1],0);
							lcd_putch(' ');
						}
						else if(atlag[kijel-1]==-128) lcd_puts("ERR ");
						else lcd_puts("--- ");
						}
				
				break;
			}
			melyik_csoport++;
			if (melyik_csoport==3)
			{
				melyik_csoport=0;
			}
			kijelzo_frissites_flag=0;
		}

		if (meres_flag)	// egy másodpercenként fut ide bele
		{
			if(atlagmehet){
			for(char d_index=0;d_index<eszkoz_szam;d_index++){	
			// adatok_kiolvasasa_a_szenzorokbol
			hom=(int)read_after_getstartalldev(d_index);
			// eredmeny elhelyezese a homersekletek nevű tömbbe
			atlag[d_index]=hom;
			}
			}
			// konverzió parancs kiadása a szenzoroknak
			start_allds1820();
			atlagmehet=1;
			// azért jó itt, mert kiolvastuk az eredményt, és a következő kiolvasásig lesz elég idő, hogy befejezzék a konverziót.
			// esetleg ha 250ms nem elég a kiolvasásra, akkor pl. nem meres_idozit==1000, hanem meres_idozite==2000 esetén
			// kell a timer isr-ben beállítani a meres_flag-et
			
			meres_flag=0;
		}

		if (soros_flag)
		{
			if (bejovo_puffer.adat[1]==1)
			{
				kimeno_puffer.hossz=24,kimeno_puffer.hatralevo=24;
				unsigned char hoadatok=0;
				for(unsigned char puffercount=0;puffercount<=24;puffercount++)
				{
					kimeno_puffer.kimeno_adat[puffercount]=atlag[hoadatok++];
					// soros porton kuldendo adatok elokeszitese a kimeno_pufferbe
					// kimeno_puffer.hossz es kimeno_puffer.hatralevo valtozokba annyit kell irni, ahany bajtot akarunk kuldeni	
				}
			}

			else if (bejovo_puffer.adat[1]==2)
			{
				kimeno_puffer.hossz=1,kimeno_puffer.hatralevo=1;	
				kimeno_puffer.kimeno_adat[0]=szam;
			}
			else 
			{
				bejovo_puffer.hossz=0;		
			}
			soros_flag=0;
		}
		
		if (kimeno_puffer.hatralevo && TXIF)	//ha tx üres és van mit küldeni/* set when register is empty */
		{
			RTS=1;
			vWait_us(200);
			TXREG=kimeno_puffer.kimeno_adat[kimeno_puffer.hossz-kimeno_puffer.hatralevo];
			kimeno_puffer.hatralevo--;
			RTS=0;
		}
	}	//end while
}




void interrupt isr(void)
{
	unsigned char cgetchar;
	
	static unsigned char kijelzo_idozito=0;
	
	static unsigned char meres_idozito=0;
	
	if (T0IE && T0IF)	// 1ms idonkent jon ide a vezerles. De akar lehet hosszabb ido is, pl. 1s is, vagy amit a hardverben be lehet állítani
	{
		T0IF=0;
		
		kijelzo_idozito++;
		if (kijelzo_idozito==240)	// 1ms időalap esetén
		{
			kijelzo_idozito=100;
			kijelzo_frissites_flag=1;
		}
		
		meres_idozito++;
		if (meres_idozito==80)	// szintén 1ms időalap esetén
		{
			meres_idozito=0;
			meres_flag=1;
		}
	}
	
	if (RCIE&&RCIF)	// soros port dolgai
	{
		cgetchar=RCREG;
		if( OERR ) 
		{
			OERR=0;
			CREN = 0;
			CREN = 1;
		return;
		}
		if (cgetchar=='*')
		{
			bejovo_puffer.hossz=0;
			// ürítjük a fogadó puffert
		}
		else
		{
			bejovo_puffer.adat[bejovo_puffer.hossz++]=cgetchar;	// letaroljuk a pufferbe a bejovo adatokat (eloszor csak cimet, majd utana parancsot), így lesz két bájt a pufferben
			if (bejovo_puffer.hossz==2)
			{
				if (bejovo_puffer.adat[0]==pic_cim)
				{
					soros_flag=1;
				}
			}
		}
	}
}
