#define F_CPU 16000000UL  // 16 MHz frekvence mikroprocesoru
//#define atmega8
#define atmega168
//obecne knihovny, viz: WinAVR-20081205->avr-libc Manual [WinAVR]
#include <util/delay.h>
#include <stdio.h> 
#include <stdlib.h> 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <ctype.h>
#include <math.h>
#include <avr/pgmspace.h> 

#include "sd_raw.c"
#include "sd_raw_config.h"


//vlastni knihovny
#include "makra.h"
#include "init.h"    		//inicializacni funkce
#include "ovladani.h"  		//filtry, regulatory, merici a vystupni funkce
#include "enkoder.h"
#include "komunikace.h"     //komunikacni protokol



//#include "klouzavy_prumer.h"	//filtr
//#include "regulaceBosch.h"

#include <string.h> 

//**********************      main        **********************
int main () {


//	  ******************* inicializace *******************


	cli();			//globalne vypne vsechna preruseni
	USART_Init(1);//1 odpovida baud 62500 pri 1MHz/ baud 500 000 pri 16MHz
				  //7 odpovida baud 125 000 pri 16MHz
	Timer0_init();//inicializace timeru pro hlavni casovou smycku
	sei();			//globalne zapne vsechna preruseni

//spinac pro nacteni LOG z SD

PORTD|=_BV(PIN6);

//    ******************* // inicializace *******************


TransmitStr("zapnuto\n");
//********************      nekonecna smycka        **********************
	while(1){


		if(cas_tmr>=Vvzorkovani)	//Vvzorkovani....nastavene vzorkovani [ms]
		{TIC;
		if(! ((PIND&_BV(PIN6))|lognacten) ) {nactilogSD();lognacten=1;TransmitStr("log");}
		if((PIND&_BV(PIN6))&&lognacten) {TransmitStr("zakaz");lognacten=0;if (vystup_komunikace==SDCARD) uloz_delku_mereniSD();}

			if (Vstop)		//celkove zastaveni cinnosti
			{//dodelat ukazatel na funkci pro stopnuty rezim
			}
			else		//pokud neni celkovy stop:
			{
			}


				{	//	_________________    hlavni beh programu: _________________
			
				//(1)
				if (povoleno.merit)	
					{merit();}      //zmeri vybranou velicinu

			
				//(2)
				if (povoleno.filtr)
				{uint8_t i=0;void (*f)(void);
						//spousti vybrane filtry
						while(kfiltrovani[i]){
						memcpy_P(&f,(PGM_VOID_P)&povelf[kfiltrovani[i]].fce,sizeof(f));
						f();
						i++;}
						}
								
				//(3)
				if (tmrRegulace>=prescRegulace){  //zpomaluje regulaci
				//pro kazdy "prescRegulace" cyklus provede:
					if (povoleno.regulovat)
						{regulace();}		//spusti vybranou regulaci
				  	  else
						{setpwm(0);}		//bez regulace nastavi vystup na 0

					if (povoleno.vystup)
						{setpwm(Vpwm);}		//nastavi vystup dle typu H-mustku

					tmrRegulace=0;
					}
					else tmrRegulace++; //zvysuje se o 1 kazdym cyklem

			
				//(4)
				if (tmrOdesilat>=prescOdesilat){  //zpomaluje odesilani hodnot
					tmrOdesilat=0;
					if (povoleno.odesilat)
						{uint8_t i=0;void (*f)(void);
						//prochazi a posila vsechny vybrane data k odeslani
						while(kodeslani[i]){
						//povelm[kodeslani[i]].fce();
						memcpy_P(&f,(PGM_VOID_P)&povelm[kodeslani[i]].fce,sizeof(f));
						f();
						i++;}
						}
					}else tmrOdesilat++; //zvysuje se o 1 kazdym cyklem


				}//	_________________    //hlavni beh programu: _________________

		cpu=cas_tmr;
		cas_tmr=0;	//vynulovani, preruseni dale samo incrementuje zase od 0
		TOC;
		}//konec preruseni

		
	smycka();			// smycka zprav, vyrizuje prikazy z PC

	}
//********************   nekonecna smycka konec   **********************
return(0);}
//********************      konec main        **********************
