#ifndef F_CPU
#warning F_CPU nastaveno na "16000000UL"
#define F_CPU 16000000UL  // 16 MHz
#endif
#include <util/delay.h>




//VYTVOR_ZPRAVU(Znazev,nazev,prikaz,napoveda)
	VYTVOR_ZPRAVU(Zchyba,"",chyba,"");
	VYTVOR_ZPRAVU(Zhelp,"help",help,"Vypise seznam ovladacich prikazu.");
//	VYTVOR_ZPRAVU(Zcomp,"comp",comp,"");
	VYTVOR_ZPRAVU(Zping,"ping",ping,"ping text; Odesle zpet <text>.");
//	VYTVOR_ZPRAVU(Zstatus,"status",status,"");
	VYTVOR_ZPRAVU(Zsvit,"svit",svit,"Prepina svit LED.");
//	VYTVOR_ZPRAVU(Zadc,"adc",adc,"Vrati zmerenou analog. hodnotu.");
	VYTVOR_ZPRAVU(Zpwm,"pwm",pwm,"Nastaveni vystupu PWM. [char]");
	VYTVOR_ZPRAVU(Zder,"der",der,"Nastaveni derivacni slozky regulatoru. [single]");
	VYTVOR_ZPRAVU(Znastavw,"w",nastavw,"Nastaveni zadane hodnoty. [single]");
//	VYTVOR_ZPRAVU(Zderzpoz,"derzpoz",derzpoz,"");
	VYTVOR_ZPRAVU(Zitg,"itg",itg,"Nastaveni integracni slozky regulatoru. [single]");
	VYTVOR_ZPRAVU(ZpVI,"pVI",pVI,"Koeficient omezeni integratoru, 1=max vykon. [single]");
	VYTVOR_ZPRAVU(Zprp,"prp",prp,"Nastaveni proporcialniho zesileni regulatoru. [sinlge]");
	VYTVOR_ZPRAVU(Zstop,"stop",stop,"Zastavi cinnost.");
	VYTVOR_ZPRAVU(Zvykon,"vykon",vykon,"Omezeni vykonu: min0-max255 [char]");
//	VYTVOR_ZPRAVU(Zpuls,"puls",puls,"");
//	VYTVOR_ZPRAVU(Zfrek,"frek",frek,"");
//	VYTVOR_ZPRAVU(Zmer,"mer",mer,"");
//	VYTVOR_ZPRAVU(Zuzivatel,"uziv",uzivatel,"");
//	VYTVOR_ZPRAVU(Zzapnimustek,"zapnimustek",zapnimustek,"");
//	VYTVOR_ZPRAVU(Zpinb,"pinb",pinb,"");
	VYTVOR_ZPRAVU(ZPWM_InA_B,"PWM_InA_B",PWM_InA_B,"Zapina vystup pro H-mustek.");
//	VYTVOR_ZPRAVU(ZPWM_IR,"PWM_IR",PWM_IR,"");
	VYTVOR_ZPRAVU(Zvzorkovani,"vzorkovani",vzorkovani,"Vzorkovaci perioda, 1=1ms, 0-65535. [char]");
	VYTVOR_ZPRAVU(Zpovolit,"povolit",povolit,"Povoleni cinnosti.(1)Mereni (2)Filtr (3)Regulace (4)Odesilani [char]");
	VYTVOR_ZPRAVU(Zzakazat,"zakazat",zakazat,"Zakaz cinnosti.(1)Mereni (2)Filtr (3)Regulace (4)Odesilani [char]");
	VYTVOR_ZPRAVU(Zhelpm,"helpm",helpm,"Vypise seznam promenych.");
	VYTVOR_ZPRAVU(Zhelpf,"helpf",helpf,"Vypise seznam filtru.");
	VYTVOR_ZPRAVU(Zscope,"scope",scope,"scope promena; Vrati hodnotu promenne.");
	VYTVOR_ZPRAVU(Zodesilatmsk,"odesilatmsk",odesilatmsk,"odesilatmsk 3,5,1; Nastaveni promenych k odesilani.");
	VYTVOR_ZPRAVU(Zfiltrovatmsk,"filtrmsk",filtrovatmsk,"filtrovatmsk 3,5,1; Nastaveni filtru.");
	VYTVOR_ZPRAVU(ZmeritAD0,"meritAD0",meritAD0,"Zapina AD prevodnik na pinu AD0.");
	VYTVOR_ZPRAVU(ZmeritAD01,"meritAD01",meritAD01,"Zapina AD prevodnik na pinu AD0 a AD1.");
	VYTVOR_ZPRAVU(Zrpokus,"rpokus",rpokus,"PID regulator s vylepsenimi.");
	VYTVOR_ZPRAVU(ZprescOdes,"pOdes",prescOdes,"Faktor zpomaleni odesilani hodnot proti <vzorkovani>. [char]");
	VYTVOR_ZPRAVU(ZprescReg,"pReg",prescReg,"Faktor zpomaleni regulace proti <vzorkovani>. [char]");
	VYTVOR_ZPRAVU(Zreset,"reset",reset,"Vyresetovani MU.");
	VYTVOR_ZPRAVU(ZPgp,"gp",Pgp,"Obdelnikovy signal, nastaveni periody nasobkem <vzorkovani>. [char]");
	VYTVOR_ZPRAVU(ZPgh,"gh",Pgh,"Obdelnikovy signal, horni mez. [single]");
	VYTVOR_ZPRAVU(ZPgd,"gd",Pgd,"Obdelnikovy signal, dolni mez. [single]");
	VYTVOR_ZPRAVU(ZFK1,"K1",FK1,"Nastaveni 1.koeficientu Kalmanova filtru. [single]");
	VYTVOR_ZPRAVU(ZFK2,"K2",FK2,"Nastaveni 2.koeficientu Kalmanova filtru. [single]");
	VYTVOR_ZPRAVU(Zenkoder,"enk",Penkoder_init,"Zapnuti snimani signalu z enkoderu.");
	VYTVOR_ZPRAVU(ZPzapisSD,"zapisSD",PzapisSD,"Zapnuti odesilani promenych do SDkarty.");
	VYTVOR_ZPRAVU(ZPlogSD,"logSD",PlogSD,"Logovani nastavovacich prikazu do SDkarty.");
	VYTVOR_ZPRAVU(ZPreadSD,"readSD",PreadSD,"recte blok pameti z SDkarty.");
	VYTVOR_ZPRAVU(ZPzapnicteniSD,"zapnicteniSD",PzapnicteniSD,"Synchronizace nastaveni MU pro cteni z SDkarty.");
	VYTVOR_ZPRAVU(ZPcistSD,"cistSD",PcistSD,"Cteni namerenych dat z SDkarty.");
//	VYTVOR_ZPRAVU(Z,"",,"");




enum {POZDRAV,LOUCENI,ERROR};
const char pozdrav[] PROGMEM = "Ahoj";
const char louceni[] PROGMEM = "Sbohem";
const char error[] PROGMEM = "Pro nápovědu použijte příkaz help";
	PGM_P zpravy[] PROGMEM = {pozdrav,louceni,error};



ZPRAVA povel[] PROGMEM={
//  {"nazev prikazu",nazev_vykonavajici_funkce,napoveda z PROGMEM},	
	Z(chyba),
	Z(help),
//	Z(comp),
	Z(ping),
//	Z(status),
	Z(svit),
//	Z(adc),
	Z(pwm),
	Z(der),
	Z(nastavw),
//	Z(derzpoz),
	Z(itg),
	Z(pVI),
	Z(prp),
	Z(stop),
	Z(vykon),
//	Z(puls),
//	Z(frek),
//	Z(mer),
//	Z(uzivatel),
//	Z(zapnimustek),
//	Z(pinb),
	Z(PWM_InA_B),
//	Z(PWM_IR),
	Z(vzorkovani),
	Z(povolit),
	Z(zakazat),
	Z(helpm),
	Z(helpf),
	Z(scope),
	Z(odesilatmsk),
	Z(filtrovatmsk),
	Z(meritAD0),
	Z(meritAD01),
	Z(rpokus),
	Z(prescOdes),
	Z(prescReg),
	Z(reset),
	Z(Pgp),
	Z(Pgh),
	Z(Pgd),
	Z(FK1),
	Z(FK2),
	Z(Penkoder_init),
	Z(PzapisSD),
	Z(PlogSD),
	Z(PreadSD),
	Z(PzapnicteniSD),
	Z(PcistSD),
};


#define PRIKAZU (sizeof(povel)/sizeof(ZPRAVA))
//---------------      #nove zpravy   ------------------

void rawprevod(uint8_t* i,uint8_t r);			//prevadi z raw formatu promene
#define RAWPREVOD(x) rawprevod((uint8_t*)&x,sizeof(x))  //makro pro zapis


volatile int16_t Vderzpoz=10,dw=0;

/*
int cas_ms=0;
uint8_t pozmer=0;
#define HODNOT 5
int32_t rozdil=0;
uint16_t senzor[HODNOT];
*/


