function [sys,x0,str,ts] = SPBA(t,x,u,flag,N,p,K)
%
% Cette S-fonction génère une séquence binaire pseudo aléatoire
% via un registre à décalage de N bits, de gain K, et avec une période p
% par rapport à la fréquence d'échantillonnage.
%
% Cette S-fonction doit-etre masquée pour pouvoir préciser les trois
% paramètres N, p et K, cf SPBAmod. 
%
switch flag,
  case 0
    [sys,x0,str,ts] = mdlInitializeSizes(N,p); % Initialization
  case 2
    sys = mdlUpdate(t,x,u,N,p); % Update discrete states
  case 3
    sys = mdlOutputs(t,x,u,N,K); % Calculate outputs
  case {1, 4, 9} % Unused flags
    sys = [];
  otherwise
    error(['unhandled flag = ',num2str(flag)]); % Error handling
end
% End of dsfunc.
%==============================================================
% Initialization
%==============================================================
function [sys,x0,str,ts] = mdlInitializeSizes(N,p)
% Call simsizes for a sizes structure, fill it in, and convert it 
% to a sizes array.
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = N+1;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 0;
sizes.DirFeedthrough = 0; % Matrix D is empty.
sizes.NumSampleTimes = 1;
sys = simsizes(sizes); 
x0  = [ones(N,1);p-1];   % Initialize the discrete states.
str = [];          % Set str to an empty matrix.
ts  = [1 0];       % sample time: [period, offset]
% End of mdlInitializeSizes.
%==============================================================
% Update the discrete states
%==============================================================
function sys = mdlUpdate(t,x,u,N,p)
if x(N+1)==0,
    switch N,
        case  2, k=[1,N];
        case  3, k=[1,N];
        case  4, k=[3,N];
        case  5, k=[3,N];
        case  6, k=[5,N];
        case  7, k=[4,N];
        case  8, k=[2,3,4,N];
        case  9, k=[5,N];
        case 10, k=[7,N];       
     end,
     sys = [mod(sum(x(k)),2);x(1:N-1);p-1];
 else
     sys = [x(1:N);x(N+1)-1];
 end,
% End of mdlUpdate.
%==============================================================
% Calculate outputs
%==============================================================
function sys = mdlOutputs(t,x,u,N,K)
sys = K*(2*x(N)-1);
% End of mdlOutputs.