function [uscita] = KalmanFilter(ingresso)
%le uscite le chiamo col 2 x non avere gli stessi nomi

global a;
global b;
global d;

in=ingresso(1:2);
xpred=ingresso(3:4);
PxpredCol=ingresso(5:8);
primaVolta=ingresso(9);

y_mis = in(1);    % e' lo stato che osservo, cioe' la posizione
x_mis = [y_mis;0];   %faccio cos� perch� senn� alla prima iteraz le condizioni iniziali sono uno scalare e dunque xpred diventa matrice 2x2!!(no buono!!!)mentre invece cos� � correttamente 2x1
presenza = in(2);   % se l'evento c'e' o no
Pxpred = [PxpredCol(1:2,:) PxpredCol(3:4,:)];   % costruisco la matrice varianza


global A
global P0
global Q

M = 1000;
Acaso = 10;
    A = [1 1 ; 0 a];
    B = [0 0; b 0];
    C = [1 0];
    D = [0 d];
    Q = B*B';
    R = D*D';
    if presenza    
        if primaVolta == 0
            P0 = [Acaso 0 ; 0 M]; % considero l'incertezza sulla vel molto molto grande, sulla posiz da valutare con il range d visione della telemacera...
            x0 = x_mis;   %PROVO A TOGLIERE LA DIPENDENZA DAL TEMPO: SAREBBE x_mis(t)
            xpred2=A*x0;                   % x(0|-1)
            Pxpred2=A*P0*A'+Q;             % P(0|-1) 
%                 if (length(find(primaVolta)) == 1)
%                     primaVolta(find(primaVolta)) = 0; 
%                 end
            primaVolta = 1;
            x_opt = xpred2(1);
            PxpredCol2 = [Pxpred2(:,1); Pxpred2(:,2)];
                        
        else
            xstim=xpred+Pxpred*C'/(C*Pxpred*C'+R)*((y_mis)-C*xpred); %x(t|t)
            Pxstim=Pxpred-Pxpred*C'/(C*Pxpred*C'+R)*C*Pxpred; 
            xpred2=A*xstim; %x(t|t-1)
            Pxpred2=A*Pxstim*A'+Q;
            x_opt = xpred2(1);
            PxpredCol2 = [Pxpred2(:,1); Pxpred2(:,2)];
            
        end
%             if (xpred(1) < 0)    %estraggo la posiz
%                 xpred(1) = 0;
%             end
%             if (xpred(1) > Li(n))
%                 xpred(1) = Li(n);
%             end
        %x_opt = xpred;   %posizione ottima    ANCHE QUI LEVO LA DIP DAL TEMPO: ERA xpred(1)
    else             
        primaVolta = 0;
        x_opt = 0;
        PxpredCol2 = zeros(4,1);
        xpred2 = [0;0];
    end    
    
    uscita=x_opt; % non faccio uscire il booleano di presenza
    uscita=[uscita; xpred2; PxpredCol2; primaVolta];
end
 