function historie=protokol()
%FCE Summary of this function goes here
%   Detailed explanation goes here
addpath('mereni infra');
buffer=[];

%krok=400;pocethodnot=1;
%prijtyp={'uint8','uint16','int16','int16','uint8'};prijmsk=[1 2 2 2 1];zobrazeni=@rizeni;
%prijtyp={'uint16','int16','uint8'};prijmsk=[2 2 1];zobrazeni=@srovnanider;
%prijtyp={'uint8','uint16','int64','uint8','uint8'};prijmsk=[1 2 8 1 1];
%prijtyp={'int32'};prijmsk=[4];
prijtyp={'uint16'};prijmsk=[2];zobrazeni=@ZobrazInfraVGUI;
%prijtyp={'single'};
pocethodnot=2;    %pocet bytu
promenych=pocethodnot;
if exist('prijmsk') pocethodnot=sum(prijmsk);promenych=length(prijmsk);end
krok=pocethodnot*20;
meritkoX=200;

zaznam(1:1e6,1:promenych)=NaN;  %prectena cisla
n=0;                            %pozice v zaznamu

%%
prikazy=[
    struct('nazev','napis','fce',@napis,'popis','něco napíše') 
    struct('nazev','tram','fce',@()disp('tamta'),'popis','něco napíše') 
    struct('nazev','konec','fce','quit=1;','popis','ukončí se fce') 
    struct('nazev','perioda','fce',@nastav_per,'popis','nastaví periodu') 
    struct('nazev','pauza','fce','pauza=~pauza','popis','nastavena pauza')
    struct('nazev','bod','fce',@bod,'popis','posila body')
    struct('nazev','pwm','fce',@pwm,'popis','nastavi PWM')
    struct('nazev','infrafrekvence','fce',@infrafrekvence,'popis','nastavi frekvenci IR')
];
nastaveni.frekvence=210;
[hnahled guipokyn]=infra('pokyn',@pokyn,'nastaveni',nastaveni);     %otevre gui zobrazeni a uloží jeho handle
% ovladac('pokyn',@pwm,'nazev','Řízení motoru','limity',[0 255 0 -255],'nazevhodnoty','pwm');


%% funkce gpokyn, prida do parametru volane funkce handel gui%%%%%%%%%%%%%%%%%%%%
    function gpokyn(gnazev,gdata)
        if exist('gnazev','var')
            if exist('gdata','var')
            guipokyn(gnazev,hnahled,gdata);
            else
                guipokyn(gnazev,hnahled)
            end
        end
    end
%% hlavni smyčka
quit=0; %program bezi dokud je quit=0;
prubeznyprenos=0;%prijimani dat prubezne-vypnuto
%keyboard
%atodesli('help;')
rawzaznam=uint8(zeros(1,1e7));
doruc=0;vyriz=0;
prijem;
tic;
%atodesli('PWM_InA_B;');
atodesli('reset;');
atodesli('PWM_IR;');
atodesli('vzorkovani 20;');
%atodesli('stop;');
atodesli('odesilatmsk AD0;');
atodesli('meritAD1;');
atodesli('povolit;');
while ~quit
pause(0.1);
% zpracujprikazy;
%keyboard
if prubeznyprenos
tmpa=prijem(10000);
rawzaznam(doruc+1:doruc+length(tmpa))=tmpa;
doruc=doruc+length(tmpa);
zpracujdata;
end
%keyboard
%if toc>10, quit=1;end  %automatické vypnutí
end
%keyboard
%atodesli('stop;');
atodesli('zakazat;');
%% komunikace
    function zpracujprikazy()
index=find(buffer==10);%find(buffer==';');

for i=index
    char(buffer(1:i))
end
buffer=buffer(i+1:end);
%if length(buffer)>20, buffer=buffer(20:end);end
        %keyboard
    end
%___________________________________________________________
function zpracujdata()
if doruc>=vyriz+pocethodnot  
krok=floor((doruc-vyriz)/pocethodnot);

    vystup = rawzaznam(vyriz+1:vyriz+krok*pocethodnot);
    vyriz=vyriz+krok*pocethodnot;
    if exist('prijtyp')            %sablona prijmanych promenych
    vystup2(promenych)=0;
     for b=1:krok
     for pocetcisel=1:promenych
         pozice=(b-1)*pocethodnot+sum(prijmsk(1:pocetcisel));
     vystup2(pocetcisel)=typecast(uint8(vystup(pozice-prijmsk(pocetcisel)+1:pozice)),char(prijtyp(pocetcisel)));
    end
    zaznam(n+b,:)=vystup2';
   end
 else

     for b=1:krok
     zaznam(n+b,:)=uint8(vystup((b-1)*pocethodnot+1:b*pocethodnot)');
     end
 
end
n=n+krok;
%x((n/krok),1)=toc-toc2;toc2=toc;
%x((n/krok),2)=s.BytesAvailable;

%plot(y)
%axis([-10*timespan+1*n 1*n+50 0 260])
if exist('zobrazeni')
%zobrazeni((max(1,n-10*krok)):(n),y((max(1,n-10*krok)):(n),1:promenych),h);
zobrazeni((max(1,n-meritkoX)):(n),zaznam((max(1,n-meritkoX)):(n),1:promenych));
else
%plot((max(1,n-10*krok)):(n),y((max(1,n-10*krok)):(n),1:promenych))
plot((max(1,n-meritkoX)):(n),zaznam((max(1,n-meritkoX)):(n),1:promenych))
axis([-inf inf 0 260]);
end

if exist('cas') if n>=cas quit=1; end,end   %automatické vypínaní
  % if n>=cas disp('avaib'),s.BytesAvailableFcn='';end

%     if signal, fprintf(s,'pwm %d;',round(100*sin(pr/10)+140));
%     pr=pr+1;
%      end
  drawnow;
end
end
%% funkce pokyn vyrizuje prichozi prikazy
function pokyn(nazev,hodn)
   %keyboard
   proveden=0;
    for np=1:length(prikazy)
               if  strcmp(nazev,prikazy(np).nazev)
                    proveden=1;
                   try
                    if strcmp(class(prikazy(np).fce),'function_handle')
                        if exist('hodn','var')
                           prikazy(np).fce(hodn);
                        else prikazy(np).fce();
                        end
                        
                    elseif ischar(prikazy(np).fce)
                    eval(prikazy(np).fce);
                    end
                    disp(prikazy(np).popis);
                  catch chybu
                  disp(chybu.message)
                  end
         end 
   end  
    if ~proveden       
disp([mfilename '/Neznam prikaz:' nazev]);
    end
 

end
%% ovladaci funkce tohoto protokolu:
    function ZobrazInfraVGUI(x,y)
        infradata.x=x;
        infradata.y=y;
        gpokyn('infradata',infradata);
    end
    
    function infrafrekvence(frek)
    atodesli(sprintf('pwm %i;',round(frek)));
    end

    function napis(text)
    disp(text)
    %keyboard
end

function t(str)
       fprintf(s,str)
disp(str);
end
    function dokoncena_cara()
   %keyboard
        gpokyn('dokoncenacara');
    end

    function pwm(a,b,c)
        %   keyboard
        atodesli(sprintf('pwm %i;',round(c)));
        round(c)
    end
%% zavreni protokolu
pause(1)
unloadlibrary lib
%keyboard
historie=zaznam(1:n,:);
end