
#include "rfm_mega8_h.h"


//*************************************
//spi initialization
//-----------------------------------
void spi_init(void){
	PORT_PER=0b00001110;					// nastavení portu PERIFERIÍ
	DDR_PER=0b00001000;

	PORT_SPI = 0b00000100;
	DDR_SPI =  0b00101100;
	
	SPCR |=(1<<SPE)|(1<<MSTR)|(1<<SPR0);
	SPSR=1;								//double speed clock -> CLK= Fosc/8


}
//*************************************
//spi send and receive two bytes simultaneously
//-----------------------------------
  unsigned int rf_writecmd(unsigned int cmd){
	unsigned int receive=0;

	PORT_SPI &= ~(_BV(SS));
	SPDR=(cmd>>8);
	wait_spi_complete();
	receive=SPDR<<8;
	SPDR=cmd;
	wait_spi_complete();
	receive|=SPDR;
	PORT_SPI |= _BV(SS);
	return (receive);
  }
//*************************************
//rfm initialization
//-----------------------------------
  void rf_init(void) {
    rf_writecmd(0x80E7); //EL,EF,868band,12.0pF
    rf_writecmd(0xA640); //frequency select
    rf_writecmd(0xC623); //4.8kbps.............T(1bit)=204us, T(2byte)=6,5ms
    rf_writecmd(0x94A0); //VDI,FAST,134kHz,0dBm,-103dBm
    rf_writecmd(0xC2AC); //AL,!ml,DIG,DQD4
    rf_writecmd(0xCA81); //FIFO8,SYNC,!ff,DR
    rf_writecmd(0xCED4); //SYNC=2DD4
    rf_writecmd(0xC483); //@PWR,NO RSTRIC,!st,!fi,OE,EN
    rf_writecmd(0x9850); //!mp,90kHz,MAX OUT
    rf_writecmd(0xCC17); //OB1, COB0, LPX, Iddy, CDDITCBW0
    rf_writecmd(0xE000); //NOT USED
    rf_writecmd(0xC800); //NOT USED
    rf_writecmd(0xC040); //1.66MHz,2.2V
  }
//*************************************
//Data send
//-----------------------------------
void rf_send(unsigned char data){
	  
    WAIT_NIRQ_LOW();
    rf_writecmd(0xB800 + data);
  }
//*************************************
//Sleep
//-----------------------------------
void rf_sleep(void){
  rf_writecmd(0x8201); 
  rf_writecmd(0x0000);
}
//*************************************
//Transmitter
//-----------------------------------
void rf_transmitter(void){
  rf_writecmd(0x8239); //er,!ebb,ET,ES,EX,!eb,!ew,DC 
  rf_writecmd(0x0000);
}
//*************************************
//Receiver
//-----------------------------------
void rf_receiver(void){
  rf_writecmd(0x8299); //er,!ebb,ET,ES,EX,!eb,!ew,DC (bug was here)
  rf_writecmd(0x0000);
  rf_fifo_reset();			// reset prijímače po vyčtení zprávy
}
//*************************************
//Buffer reset
//----------------------------------
void rf_fifo_reset() {		
  rf_writecmd(0xCA81);
  rf_writecmd(0xCA83);
  }
//*************************************
//Hlavička zprávy
//------------------------------------
void rf_head(void) {		
	rf_writecmd(0);
	rf_send(0xAA);
	rf_send(0xAA);
	rf_send(0xAA);
	rf_send(0x2D);
	rf_send(0xD4);
  }
//*************************************
//Ukončení zprávy
//------------------------------------
void rf_end(void) {		
	rf_send(0xAA);
	rf_send(0xAA);
	rf_send(0xAA);
  }
//*************************************
  //funkce pro čtení z bufferu
//-------------------------------------
unsigned char rf_read(void) {
//  while(!FFIT) continue; 
  //čeká na bit FFIT, který přijímač oznamuje, e modul dokončil příjem
  return (rf_writecmd(0xB000)&0xff);
  }
//*************************************
// Poslání celé zprávy
//-------------------------------------
void zprava(char *znaky){
char pom3;
	rf_transmitter();
	rf_head();
	while(( pom3 = *znaky++ )){
        rf_send(pom3);
		}

	rf_end();
	rf_receiver();
	
}
//***************************************
// Poslání zprávy o 4 znacích
//-------------------------------------
void zprava4(char *znaky){
char j;
	rf_transmitter();
	rf_head();
	for(j=0;j<4;j++){
        rf_send(*znaky++);
		}
	rf_end();
	rf_receiver();
	
}
//***************************************
// Příjem zprávy o 4 znacích
//----------------------------------------
void precist(char *kam){
	unsigned char jj;
	for(jj=0;jj<4;jj++){
	while(bit_is_clear(PIN_SPI,FFIT))
	continue;
	*kam=rf_read();
	kam++;
	_delay_us(10);
		}
	rf_fifo_reset();
	}
// ***************************************
//  porovnání dat, výkon procesů
//---------------------------------------
void process(void){
		par=0;
		if((teplota!=teplota2)|(minuty0!=minuty)){
			if((minuty0!=minuty)&((minuty-(minuty/5*5))==0))
				par=2;														//kadých 5min se odelou konstanty a nastavení (par=2)
			minuty0=minuty;
			if(((teplota<130)&(abs(teplota-teplota2)<30))|(teplota==255))	// zjitění, zda je  teplota
			  teplota2=teplota;												//v rozumných mezích=> delta t <10°C
			else
			  teplota=255;
			}
		tep_disp();
		if(warning==1){
			PIP_ON
			LIGHT_ON
			_delay_ms(50);
			PIP_OFF
			LIGHT_OFF}
		stav_disp();
		}

/***********************************
compare - porovnává příchozí paket, provede zápis/čtení
-----------------------------------*/
void compare(char *msgin){
char msgout[4];

	if((*msgin==ID1[0])&(*(msgin+1)==ID1[1])){
			msgout[0]=*msgin++;
			msgout[1]=*msgin++;
			msgout[2]=*msgin++;
    		switch (msgout[2]){						//příchozí znaky jsou porovnávány, následuje
				case 'T':{  teplota=*msgin;			// přísluná operace a odpověď
							break;}
				case 'R':{  rel0=*msgin;
							msgout[3]=0;
							break;}
				case 'L':{  rel1=*msgin;
							msgout[3]=0;
							break;}
				case 'W':{  warning=*msgin;
							msgout[3]=0;
							break;}
				case 'w':{  msgout[3]=warning;
							break;}
				case 'r':{  msgout[3]=rel0;
							break;}
				case 'l':{  msgout[3]=rel1;
							break;}
				case 'M':{  minuty=*msgin;
							msgout[3]=0;
							break;}
				case 'H':{  hodiny=*msgin;
							msgout[3]=0;
							break;}
				case 'K':{  msgout[3]=0;
							break;}
				case 'p':{  msgout[3]=par;				//kdy 	par=0.....ádná akce
							break;}						//     	par=1.....Master pole čas a vyádá si teplotu
							}							//		par=2.....Master si vyádá konstanty (nastevení)
			zprava4(msgout);							//		par=3.....Master ví, e uivatel Slave nastavoval, a proto anuluje předchozí chyby přenosu (tím způsobené)
			}											// 				  zároveň se provedou akce 1,2
	
		}
/*----------------------------------------------
Zobrazení prvního řádku na displej
----------------------------------------------*/
void tep_disp(void){
char disp[17];
			lcd_gotoxy(15,0);
			lcd_putc(' ');									// prázdný řádek
			lcd_gotoxy(0,0);
			if((hodiny<10)&(minuty<10))												//výpis na disp.
				sprintf(disp,"0%d:0%d      %d%cC",hodiny,minuty,teplota,178);
			else if(minuty<10)
				sprintf(disp,"%d:0%d      %d%cC",hodiny,minuty,teplota,178);
			else if(hodiny<10)
				sprintf(disp,"0%d:%d      %d%cC",hodiny,minuty,teplota,178);
			else
				sprintf(disp,"%d:%d      %d%cC",hodiny,minuty,teplota,178);
			lcd_puts(disp);
		}
/*----------------------------------------------
Zobrazení druhého (stavového) řádku na displej
----------------------------------------------*/
void stav_disp(void){
		lcd_gotoxy(0,1);
		if((rel0==1)|(rel0==3)|(rel0==5))
			lcd_puts("R0-ZAP    ");
		else
			lcd_puts("R0-VYP    ");
		if((rel1==1)|(rel1==3)|(rel1==5))
			lcd_puts("R1-ZAP");
		else
			lcd_puts("R1-VYP");

		}
