#include <p30F4013.h>
#include <libpic30.h>
#include <string.h>
#include <stdlib.h>
#include "lcd.h"
#define DELAY 	1024

#define VENTILON 0
#define VENTILOFF 1
#define KOMPRESORON 1
#define KOMPRESOROFF 0
#define  ventil _LATC13
#define kompresor _LATB5
#define tlacS1	PORTBbits.RB8
#define tlacS2	PORTCbits.RC14
#define tlacS3	PORTDbits.RD3

typedef enum {STAV0=0,STAV1,STAV2,STAV3,STAV4,STAV5,STAV6,STAVERR} TStav;
TStav stav;

//_FOSC(CSW_FSCM_OFF & XT);

unsigned long CAS2=0x00000000, CAS2old=0x00000000;
unsigned long CAS2roz, CAS2rozPom;
unsigned int CAS2rozInt;
unsigned long CASTMR3TMR2;
unsigned int PERms;

//procedura na obslouzeni preruseni INT0
void _ISR __attribute__((no_auto_psv)) _INT0Interrupt(void)
{
	
	LATBbits.LATB3 ^=1;
	IFS0bits.INT0IF =0; 

}

//procedura na obslouzeni preruseni IC2
void _ISR __attribute__((no_auto_psv)) _IC2Interrupt(void)
{
	CAS2old=CAS2;
	//CAS2=0x00000000;
	CAS2=TMR3HLD; //CAS2=TMR3;
	CAS2=CAS2<<16;
	CAS2=CAS2+(unsigned long)IC2BUF;
	CAS2rozPom=CAS2 -CAS2old;		
	LATBbits.LATB3 ^=1;
	IFS0bits.IC2IF =0; 
	 
}

//prevod cis1 12-bitove hodnoty reprezentujici vystup ADC na cisT reprezentujici tlak v mmHg
//pokud je cis1>=4096 je vystupem chyba 0xFFFF
unsigned int cis2tlak(unsigned int cis1)
{
 unsigned int cisT;
 if(cis1>=4096)
	return(0xFFFF);

 if(cis1 <= 218) {
   cisT=0;
 }
 else { cisT=cis1-218; }
 cisT=cisT*10;
 cisT=cisT/98;
 return(cisT);
}
 

//hlavni program
int main()
{
	
	/*
		Nastaven asova 1
	*/
	 //Tdelay=(4/osc)*256*DELAY
	T1CON=0x0030;		//predelicka 1:256

	/*
		Nastaven asova 2,3 a jednotky OC3
	*/
	CAS2=0;
	CAS2old=0;
	TRISDbits.TRISD2=0;	//RD2 vystupni
	LATDbits.LATD2 =0;	//nastaveni 1 na vystupu		//pro buzzer
	OC3CON=0x0000;
	T2CONbits.TON=0;	//zastaveni casovace
	T3CONbits.TON=0;	//zastaveni casovace
	TMR2=0x0000;		//nastaveni registru
	TMR3HLD=0x0000;		//nastaveni registru
	TMR3=0x0000;		//nastaveni registru
	PR2=0xFFFF;			//nastaveni periody
	PR3=0xFFFF;			//nastaveni periody
	T3CON=0x0000;		//bezi i idle modu, bez preddelicky
	T2CON=0x0028;		//bezi i idle modu, s preddelickou 1:64, 32-bitovy, zdrojem Fosc/4
	OC3CON=0x0000;	//bezi i idle modu,podle TMR2,event toggles OC3  0x0003;
	OC3R=0xFFFF;	//hodnota na porovnani
	T2CONbits.TON=1;	//spusteni 32-bitoveho casovace 1-bezi, 0-stoji

	//Nastaveni IC2
	IC2CON=0x0083;	//operate in idle mode,uklada tmr3, kazda udalost, kazda nabezna hrana

	/*
		Nastaveni preruseni
	*/
	TRISAbits.TRISA11=1;	//RA11 vstupni
	TRISDbits.TRISD9=1;		//RD9 vstupni
	INTCON1=0x0000; //nesting enebled ostatni disabled
	INTCON2=0x0000; //standard vector table, interrupt on positive edge
	IFS0=0x0000; //vymazani priznaku
	IFS1=0x0000; //vymazani priznaku
	IFS2=0x0000; //vymazani priznaku
	IEC0=0x0011; //povoleni IC2 a INT0
	IEC1=0x0000; //
	IEC2=0x0000; //
	IPC0=0x0001;	//prioriita 1

	IEC0bits.INT0IE=1;	//0 zakazani INT0 , 1 povoleni
	IEC0bits.IC2IE=0;	//1 povoleni IC2

	/*
		nstaveni ADC
	*/
	ADCON1=0x0000; //covnerter off, output integer, clearing SAMP bit ends sampling and starts convertion, sampling begins when SAMP bit is set, sample and hold, DONE bit-1 convetrion is not done
				 
	ADCON2=0x6000;	//external Vref interrupt on each sample buffer 16bit ADCBUF
                 
	ADCON3=0x001F; //clock derived from system, TAD=32Tcy
	ADCHS=0x0009; //AN9 jako vstup CH0
	ADCSSL=0x0000; //bez skenovani
	ADCON1bits.ADON=1; //spusteni ADC


	LATBbits.LATB3 =1;
	unsigned int cis1=0x00FF;
	unsigned int cisT;
	char retPom[5]={' ',' ',' ',' ','\0'};
	char retRoz[5]={' ',' ',' ',' ','\0'};
	char retPom32[9]={' ',' ',' ',' ',' ',' ',' ',' ','\0'};	

	TRISCbits.TRISC13=0;		//nastaveni Portu C 13 -ventil jako vystupni
	TRISBbits.TRISB5=0;			//nastaveni Portu B 5 -kompresor jako vystupni
	TRISBbits.TRISB8=1;			//nastaveni Portu B 8 -tlacitko S1 jako vstupni
	TRISCbits.TRISC14=1;		//nastaveni Portu C 14 -tlacitko S2 jako vstupni
	TRISDbits.TRISD3=1;		//nastaveni Portu D 3 -tlacitko S3 jako vstupni

	inicializaceLCD();
	
	ventil=VENTILON;		//nastaveni ventilu do polohy ON - otevreno

	int pp,pp2;
	int soucp=0;

tiskRetNaPozXY((char*)retTlak,2,2,0,1);		//Tlak:
	//tiskRetNaPozXY((char*)retmmHg,3,32,1,0);			//mmHg
tiskRetNaPozXY((char*)retTlak,0,2,0,1);		//Tlak:
	tiskRetNaPozXY((char*)retmmHg,0,32,1,0);			//mmHg
tiskRetNaPozXY((char*)retPer,4,2,0,1);		//Perioda:
tiskRetNaPozXY((char*)retms,4,32,1,0);		//ms
tiskRetNaPozXY((char*)retTep,6,2,0,1);		//Tep:
	tiskRetNaPozXY((char*)retmin,6,32,1,0);			//min

//tisk TMR3:TMR2
CASTMR3TMR2=0x00000000;
CASTMR3TMR2=TMR3;
CASTMR3TMR2=CASTMR3TMR2 <<16;
CASTMR3TMR2=CASTMR3TMR2 + TMR2;
long2hex(CASTMR3TMR2,retPom32);
tiskRetNaPozXY((char*)retPom32,7,2,0,1);
//


TMR1=0x0000;
T1CONbits.TON=1;		//spusteni casovace TMR1

stav=STAV0;

//hlavni smycka
 while(1){
	//IEC0=0x0001; //zakazani INT0
	//LATBbits.LATB3 =0;//sviti
	int i;
	for(i=2;i>0;i--)
    {
    
				  	ADCON1bits.SAMP=1; //zacatek vzorkovani
				    for(pp2=0;pp2<36;pp2++)		//zpozdeni
                		{asm("nop");}
					ADCON1bits.SAMP=0; //nulovani samp
					while(ADCON1bits.DONE==0)
						{asm("nop");}
					pp=ADCBUF0;
					soucp=soucp+pp;
	}
	pp=soucp/2;
	cis1=(unsigned int)pp;
	int2dec(cis1, retPom);
	
	tiskRetNaPozXY((char*)retPom,2,2,1,0);			//

	cisT=cis2tlak(cis1);
    if(cisT==0xFFFF)
		cisT=3333;
    int2dec(cisT, retPom);
	tiskRetNaPozXY((char*)retPom,0,2,1,0);			//
	
	
	long2hex(CAS2rozPom,retPom32);
	tiskRetNaPozXY((char*)retPom32,7,2,1,0);	
	CAS2roz=983040L/CAS2rozPom;
	if(CAS2roz < 0x0000FFFF)
	{
	  CAS2rozInt=(unsigned int) CAS2roz;

		if((CAS2rozInt < 0xDFFF))
		{
		  int2dec(CAS2rozInt, retRoz);
		  tiskRetNaPozXY((char*)retRoz,6,2,1,0);			//tep za min
		  PERms=CAS2rozPom >>4;
		  int2dec(PERms, retRoz);
		  tiskRetNaPozXY((char*)retRoz,4,2,1,0);			//perioda v ms
		}
	} 

	//tisk TMR3:TMR2
	CASTMR3TMR2=0x00000000;
	CASTMR3TMR2=TMR3;
	CASTMR3TMR2=CASTMR3TMR2 <<16;
	CASTMR3TMR2=CASTMR3TMR2 + TMR2;
	long2hex(CASTMR3TMR2,retPom32);
	tiskRetNaPozXY((char*)retPom32,7,2,0,1);

	//LATBbits.LATB3 =1;//nesviti
	
		
    //Tdelay=(4/osc)*256*DELAY
    //
    /*TRISB=TRISB & 0xF7FF;		//pin 11 portu B vystupni
	ADPCFG=ADPCFG | 0x0800;  //digitalni*/
	
	soucp=0;
	//IEC0=0x0001; //povoleni INT0
    
 while((TMR1<2048))
 {
	
      asm("nop"); //cekej
	if(tlacS1==0)
	  {
	  	//kompresor=KOMPRESORON;
		stav=STAV1;
		ventil=VENTILOFF;
	  }
	  else
		//kompresor=KOMPRESOROFF;	  

	if(tlacS2==0)
	  {
	 	ventil=VENTILOFF;
	  }
	  
		if(tlacS3==0)
	  {
	 	ventil=VENTILON;
	  }
	

 }
 TMR1=0x0000;

	switch(stav)
  {
	case STAV0:
	{	
		asm("nop");
	}
	break;

	case STAV1:	
	{	 asm("nop"); //cekej
		 asm("nop"); //cekej
		 asm("nop"); //cekej
		 asm("nop"); //cekej
		kompresor=KOMPRESORON;
		stav=STAV2;
	}
	break;

	case STAV2:	
	{	
		if(cisT>105){
		kompresor=KOMPRESOROFF;
		stav=STAV3;
		}
	}
	break;

	case STAV3:
	{	
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		asm("nop");
		//stav=STAV4;
		//ventil=VENTILON;
	}
	break;	

	case STAV4:
	{	
		asm("nop");
	}
	break;	

	default:
	{
		asm("nop");
		stav=STAVERR;
	}
	break;
  }//switch 




}//hlavni smycka

 asm("nop");
}
