% *****************************************************************************************
%  Fichier exemple issu du tutoriel : 
%  "Compilation et déploiement d'un modèle Simulink avec Embedded Coder"
%   
%  http://simulink.developpez.com/tutoriels/compilation-deploiement-modele-embedded-coder
%   
%  Auteurs : duf42 et Jérôme Briot pour Developpez.com - 2013   	
% *****************************************************************************************

modelname = 'gestion_reservoir';

arch = computer('arch');

if strcmp(arch,'win64') || strcmp(arch,'win32')
    ext = '.dll';
    libname = [modelname '_' arch];
else
    ext = '.so';
    libname = modelname;
end

if exist('mHeader.m','file')==2
    delete('mHeader.m');
end

if exist(modelname,'dir')==7
    rmdir(modelname,'s');
end
delete([modelname '*.*']);

zipfile = [modelname '.zip'];
libfile = [libname ext];

copyfile(['../lib/' arch '/' libfile],'.');
copyfile(['../lib/' arch '/' zipfile],'.');

unzip(zipfile , modelname);
delete(zipfile)

loadlibrary(libfile, ['./' modelname '/' modelname '.h'],'mfilename','mHeader')
unloadlibrary(libname)

% Chargement de la bibliotheque apres verification qu'elle n'est pas deja chargee
if ~libisloaded(libname)
    loadlibrary(libfile,@mHeader)
end

% Initialisation de la simulation
calllib(libname, [modelname '_initialize'], uint8(0))

% Recuperation des pointeurs vers les structures des entrees, sorties et parametres
entrees = calllib(libname,[modelname '_U']);
sorties = calllib(libname,[modelname '_Y']);

% Definition des variables utilisees pour la simulation
N = 600;
niveau_cible = 2;
debit_cible = 0.0003;
niveau_courant = zeros(N,1);
debit_courant = zeros(N,1);

% Simulation sur 1000 pas de temps
for i = 1:N
    
    % Affectation des valeurs d'entree
    entrees.Value.niveau_cible = niveau_cible;
    entrees.Value.debit_cible = debit_cible;
    
    % Calcul d'un pas
    calllib(libname, [modelname '_step'])
    
    % Stockage des valeurs de sortie dans les variables correspondantes
    niveau_courant(i) = sorties.Value.niveau_courant;
    debit_courant(i) = sorties.Value.debit_courant;
    
end

% Finalisation de la simulation
calllib(libname, [modelname '_terminate'])

% Liberation de la memoire
unloadlibrary(libname)

% Trace des resultats
figure

subplot(211)
plot(1:N,niveau_courant)
title('Niveau courant')

subplot(212)
plot(1:N,debit_courant)
title('Debit courant')

clear entrees sorties