void rawprevod(uint8_t* i,uint8_t r){
	uint8_t j;
	if (buffer[konecbuf(vyriz,r+1)==ODDELOVAC])
	for(j=0;j<r;j++){
	*i=buffer[vyriz];i++;
	dalsi();
	}
	return;}


void cekej(int prodleva)
	{volatile int i,j;
	for(j=0;j<prodleva;j++)
	//for(i=0;i<110;i++);   //2Mhz
	for(i=0;i<880;i++);   //16Mhz
	return;}


/*PRIKAZ(mer)
{int k=255;
	//cekej(500);
	cas_ms=abs(atoi((char*)&buffer[vyriz]));
	if (carka()) k=atoi((char*)&buffer[vyriz]);

		setpwm((int16_t)k);
	return 1;}
*/

/*
PRIKAZ(frek)
	{if(buffer[vyriz]=='+') OCR1A++;
	if(buffer[vyriz]=='-') OCR1A--;
	return 1;}
*/

/*
PRIKAZ(comp){
	int k,v;
	if(!Vstop){
		
	k=atoi((char*)&buffer[vyriz]);
	if (carka()) v=atoi((char*)&buffer[vyriz]);

		if(k>=0)
		{OCR1AL=k;
		PORTB|=_BV(PIN0);}
		else
		{OCR1AL=-k;
		PORTB&=~_BV(PIN0);
		}

		
	
	}else {OCR1AL=0;}
	return 1;};
*/

/*
PRIKAZ(puls){
	uint16_t prodleva=50;	
	int16_t vykon=255,opakovani=0;
	if(isdigit(buffer[vyriz])) prodleva=atoi((char*)&buffer[vyriz]);
	if (carka()) vykon=atoi((char*)&buffer[vyriz]);
	if (carka()) opakovani=atoi((char*)&buffer[vyriz]);
	setpwm(vykon);
		cekej(prodleva);
		uint8_t i;
		for(i=0;i<opakovani;i++)
		{vykon=-vykon;setpwm(vykon);
		cekej(prodleva);
		}

		setpwm(0);
	//prom2=carka(&p)&isdigit(*p)?atoi(p):6;
	return 1;}
*/

PRIKAZ(ping){
		while (buffer[vyriz]!=ODDELOVAC)
		{USART_Transmit(buffer[vyriz]);dalsi();}
		return 1;}

PRIKAZ(chyba){
	while(buffer[vyriz]!=ODDELOVAC)
		{USART_Transmit(buffer[vyriz]);
		 dalsi();}
	//TransmitStr((char*)&buffer[vyriz]);
	TransmitStrP(PSTR(" -"));
	TransmitStrP(zpravy[ERROR]);
	return 0;}

PRIKAZ(svit){
	DDRB|=1;
	PORTB^=(1<<PIN0);
	return 1;}


/*
PRIKAZ(status){
	TransmitStrP(PSTR("LED "));
	if(!(PINB&_BV(PIN0))) {TransmitStrP(PSTR("ne"));}
	{TransmitStrP(PSTR("svítí\n\r"));}
	return 0;}
*/
int textprevod(){
	int k;
	char t[10];
	uint8_t i;
	for(i=0;i<10;i++){
		t[i]=buffer[vyriz];
		if (t[i]==ODDELOVAC) break;
		dalsi();}
	t[i]=0;
	k=atoi((char*)&t);
return k;};


PRIKAZ(pwm){
	Vpwm=textprevod();
	return 1;}


PRIKAZ(der){
	RAWPREVOD(Vder);
	//prevod(p,&Vder);
	return 1;};

PRIKAZ(nastavw){
	RAWPREVOD(w);
	//prevod(p,&Vder);
	return 1;};
/*
PRIKAZ(derzpoz){
	int k;
	k=atoi((char*)&buffer[vyriz]);
	Vderzpoz=k;
	return 1;}
*/
void obnovmaxVI(void){
maxVI=(double)255/Vitg*pomerVI;
}

PRIKAZ(itg){
	RAWPREVOD(Vitg);
	obnovmaxVI();
	//prevod(p,&Vitg);
	return 1;}

PRIKAZ(pVI){
	RAWPREVOD(pomerVI);
	obnovmaxVI();
	//prevod(p,&Vitg);
	return 1;}


PRIKAZ(prp){
	RAWPREVOD(Vprp);
	//prevod(p,&Vprp);
/*	int k;
	k=atoi(p);
	Vprp=k;*/
	return 1;}

PRIKAZ(stop){
	Vstop=!Vstop;
	return 1;}

PRIKAZ(vykon){
	maxvykon=textprevod();
	return 1;}

PRIKAZ(prescReg){
	prescRegulace=textprevod();
	return 1;}

PRIKAZ(prescOdes){
	prescOdesilat=textprevod();
	return 1;}

//uint8_t adc(char *p)
/*
PRIKAZ(adc)
	{uint16_t pot;
	char s[10];
//	ADCSRA|=_BV(ADSC);
//	while(ADCSRA&_BV(ADSC)){}
	pot=ADC;
	utoa(pot,s,10);
	TransmitStr(s);
	return 0;}
*/
/*
uint8_t index(void){
	uint8_t i,j;
	for(j=0;j<PRIKAZU;j++){			//projdi vsechny prikazy

		for(i=0;(povel[j].nazev[i]==buffer[konecbuf(vyriz,i)]);i++){	//shoda buffer-prikaz
				}

		if((buffer[konecbuf(vyriz,i)]==ODDELOVAC) & (povel[j].nazev[i]==0))
		{vyriz=konecbuf(vyriz,i);return j;}
		if((buffer[konecbuf(vyriz,i)]==' ')&(povel[j].nazev[i]==0)){vyriz=konecbuf(vyriz+1,i);return j;}
		}

	return 0;}   //0 spusti chybu-nenalezen prikaz
*/

/*			//umi prevadet double cislo z textu na double
void prevod(char *p,double* k)
	{int8_t j=0,i=0,t=0,znam=1;
	char z=0;char s[5];s[4]=0;
	while(*p==' ') p++;
	if((*p=='0')&(p[1]==0)){*k=0;return;}
	if(*p=='-'){p++;znam=-1;}
	while((*p=='0')|(*p==' '))p++;//vymaze 0

	while(p[i]!=0){if(p[i]=='.')break;i++;} //hleda '.'

	if(p[0]=='.'){p++;			//maze .0
		while(*p=='0'){p++;i--;}}

	for(j=0;j<4;j++){				//kopiruje 4 cifry
		if(p[j]=='.')p++;z=p[j];
		if((z==0)|(z=='e')|(z=='E')) break;
		if (isdigit(z)) s[j]=z;}
	if(!j)return;

t=j;
while(p[t]!=0){if((p[t]=='e')|(p[t]=='E'))
			{i+=atoi(&p[++t]);break;}
			t++;}

	for(j=j;j<4;j++) s[j]='0';

	

	i-=4;
	*k=atoi(s);*k*=znam;
	if(i<0) {for(j=0;j<-i;j++) *k/=10;}
	else {for(j=0;j<i;j++) *k*=10;}
	return;}
*/

/*
uint8_t carka(char **p){
	char* znak=*p;
	while (*znak!=0)
	{if(*znak==',')
	{*p=znak+1;return 1;};
	znak++;
	}
	return 0;
	};
*/
uint8_t carka(void){
	//char* znak=*p;
	uint16_t i=vyriz;
	while (buffer[i]!=ODDELOVAC)
	{if(buffer[i]==',')
	{vyriz=i+1;return 1;};
	i=dalsi2(i);
	}
	return 0;
	};

PRIKAZ(help)
	{uint8_t i;
	PGM_P pt;
	TransmitStrP(PSTR("Seznam prikazu:\r"));
		for(i=0;i<PRIKAZU;i++)
			{memcpy_P(&pt,(PGM_VOID_P)&povel[i].nazev,sizeof(PGM_P));
			TransmitStrP(pt);TransmitStrP(PSTR("	"));
			memcpy_P(&pt,(PGM_VOID_P)&povel[i].napoveda,sizeof(PGM_P));
			TransmitStrP(pt);TransmitStrP(PSTR("\r"));
			}
	return 0;};

PRIKAZ(helpm)
	{uint8_t i;
	PGM_P pt;
	TransmitStrP(PSTR("Seznam hodnot:\r"));
		for(i=0;i<PRIKAZUM;i++)
			{memcpy_P(&pt,(PGM_VOID_P)&povelm[i].nazev,sizeof(PGM_P));
			TransmitStrP(pt);TransmitStrP(PSTR("	"));
			memcpy_P(&pt,(PGM_VOID_P)&povelm[i].napoveda,sizeof(PGM_P));
			TransmitStrP(pt);TransmitStrP(PSTR("\r"));
			}
	return 0;};


PRIKAZ(helpf)
	{uint8_t i;
	PGM_P pt;
	TransmitStrP(PSTR("Seznam filtru:\r"));
		for(i=0;i<PRIKAZUF;i++)
			{memcpy_P(&pt,(PGM_VOID_P)&povelf[i].nazev,sizeof(PGM_P));
			TransmitStrP(pt);TransmitStrP(PSTR("	"));
			memcpy_P(&pt,(PGM_VOID_P)&povelf[i].napoveda,sizeof(PGM_P));
			TransmitStrP(pt);TransmitStrP(PSTR("\r"));
			}
	return 0;};


/*
PRIKAZ(uzivatel)
	{if (buffer[vyriz]=='1') Vuzivatel=MATLAB;
	if (buffer[vyriz]=='0') Vuzivatel=TERMINAL;
	return 0;}

PRIKAZ(zapnimustek)
	{ZMustek_Init();
	return 1;};
*/
/*PRIKAZ(pinb)
	{switch (buffer[vyriz])
		{
		case 'a':{PORTB^=(1<<PIN0);dalsi();break;}
		case 'p':{PORTB^=(1<<PIN1);dalsi();break;}
		case 'b':{PORTB^=(1<<PIN2);dalsi();break;}
		}
	return 1;}
*/

PRIKAZ(PWM_InA_B)
	{PWM_InA_B_Init();
	setpwm=pwmInAB;
	return 1;}

PRIKAZ(vzorkovani)
	{
	if(buffer[vyriz]==ODDELOVAC){ TransmitNm((uint8_t*)&Vvzorkovani,sizeof(Vvzorkovani));}
	else {Vvzorkovani=textprevod();}
	dt=(double)Vvzorkovani/1000;
	return 1;};

/*
PRIKAZ(PWM_IR){
	PWMInfra_Init();
	setpwm=pwmIR;
	Vpwm=210;
	ADC_Init10b();
	return 1;}
*/
PRIKAZ(povolit){
	if(buffer[vyriz]==ODDELOVAC){ 
	povoleno.merit=1;
	povoleno.filtr=1;
	povoleno.regulovat=1;
	povoleno.vystup=1;
	povoleno.odesilat=1;
	}
	else
	switch (buffer[vyriz]){
	case '1':povoleno.merit=1;break;
	case '2':povoleno.filtr=1;break;
	case '3':povoleno.regulovat=1;break;
	case '4':povoleno.vystup=1;break;
	case '5':povoleno.odesilat=1;break;
	}

	return 1;};

PRIKAZ(zakazat){
	if(buffer[vyriz]==ODDELOVAC){ 
	povoleno.merit=0;
	povoleno.filtr=1;
	povoleno.regulovat=0;
	povoleno.vystup=0;
	povoleno.odesilat=0;
	}
	else
	switch (buffer[vyriz]){
	case '1':povoleno.merit=0;break;
	case '2':povoleno.filtr=0;break;
	case '3':povoleno.regulovat=0;break;
	case '4':povoleno.vystup=0;break;
	case '5':povoleno.odesilat=0;break;
	}

	if (vystup_komunikace==SDCARD) uloz_delku_mereniSD();

	return 1;};



PRIKAZ(scope){
	uint8_t cislo;
	void (*f)(void);
	cislo=indexP(PRIKAZUM,(MERP*)&povelm);
	//povelm[cislo].fce();
	uint8_t zaloha=vystup_komunikace;
	vystup_komunikace=SERIAL;
	memcpy_P(&f,(PGM_VOID_P)&povelm[cislo].fce,sizeof(f));
	f();
	vystup_komunikace=zaloha;
	return 1;};

PRIKAZ(odesilatmsk){
	uint8_t cislo,i;
	kodeslani[0]=0;
	for(i=0;buffer[vyriz]!=ODDELOVAC;i++)
	{if (i==PRIKAZUM) {i++;break;}
	cislo=indexP(PRIKAZUM,(MERP*)&povelm);
	kodeslani[i]=cislo;//TRANSMIT(cislo)
	if (!(cislo)) {i++;break;}
	}
	kodeslani[i]=0;
//dopsat vektor
	
	if (vystup_komunikace==SDCARD){
		nastavSD();
		if (!uloz_nastaveniSD()) vystup_komunikace=SERIAL;
		//	vystup_offset=SD_MERENI_ZACATEK;
		
	}
	//obnov_prom_ukladaniSD();  nastav (vystup_bytu,kodeslani,vystup_offset(_konec)
	//pokud je aktivni SD, uloz_nastaveniSD();
	if (vystup_komunikace==SERIAL) cteniSD=0;

	return 1;};

PRIKAZ(filtrovatmsk){
	uint8_t cislo,i;
	kfiltrovani[0]=0;
	for(i=0;buffer[vyriz]!=ODDELOVAC;i++)
	{if (i==PRIKAZUF) {i++;break;}
	cislo=indexP(PRIKAZUF,(MERP*)&povelf);
	kfiltrovani[i]=cislo;//TRANSMIT(cislo)
	if (!(cislo)) {i++;break;}
	}
	kfiltrovani[i]=0;
	return 1;};

PRIKAZ(meritAD0){
	ADC_Init10b();
	merit=freerunAD0;
	return 1;};

PRIKAZ(meritAD01){
	ADC_Init10b();
	merit=freerunAD01;
	return 1;};


/*PRIKAZ(fAD0y){
	filtr=AD0y;
	return 1;};
*/

PRIKAZ(rpokus){
regulace=regulacepokus;
return 1;};

PRIKAZ(reset){
setpwm=pwmNic;
//filtr=prazdna;
regulace=prazdna;
merit=prazdna;
kodeslani[0]=0;
DDRB=0;
return 1;};

/*void VypnoutVse_Init(void)
{

};*/

PRIKAZ(Pgp){
	gp=textprevod();
	return 1;}

PRIKAZ(Pgh){
	RAWPREVOD(gh);
	return 1;}

PRIKAZ(Pgd){
	RAWPREVOD(gd);
	return 1;}

PRIKAZ(FK1){
	RAWPREVOD(K1);
	return 1;}

PRIKAZ(FK2){
	RAWPREVOD(K2);
	return 1;}

PRIKAZ(Penkoder_init){
	enkoder_init();
	return 1;}

PRIKAZ(PzapisSD){
	nastavSD();
	//USART_Transmit(vystup_bytu);
	if (!sd_raw_init()) {TransmitStrP(PSTR("neinit"));return 0;}
	if (!uloz_nastaveniSD()) return 0;

	vystup_komunikace=SDCARD;
		cteniSD=0;
	//vystup_komunikace=SERIAL;
		return 1;}

PRIKAZ(PlogSD){
	if ((buffer[vyriz]=='1')|(!logovatSD))
	zapnilogSD();
	else
	vypnilogSD();
	return 1;}

PRIKAZ(PreadSD){
	if (!sd_raw_init()) {TransmitStrP(PSTR("neinit"));return 0;}

	char z='-';
	uint8_t i;
	for(i=0;i<50;i++){
		sd_raw_read(SD_MERENI_ZACATEK+i,(uint8_t*)&z,1);
		USART_Transmit(z);
		}

	return 1;}


PRIKAZ(PzapnicteniSD){
	zapnicteniSD();
	return 1;}

PRIKAZ(PcistSD){
	uint8_t buffer[vystup_bytu];
	
	if (cteniSD)
	for(;SD_offset_cteni<SD_offset_zapis;SD_offset_cteni+=vystup_bytu){
	sd_raw_read(SD_offset_cteni,buffer,vystup_bytu);
	TransmitNm(buffer,vystup_bytu);
	_delay_ms(1);
	//smycka();
	}

	return 1;}

