% programme de recuperation des donnees DROP SONDE temps r�el
% a partir des donnees RMD et GONIO
% delta RMD/PC 17:27:21/19:38:20

%% raz
clear all;
close all;
fclose all;

warning off


%% dossier d'enregistrements
path_save=uigetdir('','S�l�ctionnez le dossier ou seront enregist�es les donn�es:');
cd(path_save);
now_save=datestr(now,31);

%%fenetre de selection des parametres du port com et chargement 
select_com_sbe_tr;

wait_param=0;
while wait_param==0
    wait_param=getappdata(0,'wait_param');
    pause(0.2);
end

Baud_Rate=str2num(getappdata(0,'Baud_Rate'));
data_bits=str2num(getappdata(0,'data_bits'));
com=getappdata(0,'com');
Baud_Rate2=str2num(getappdata(0,'Baud_Rate2'));
data_bits2=str2num(getappdata(0,'data_bits2'));
com2=getappdata(0,'com2');
num_ct=getappdata(0,'num_ct');

s = serial(com,'BaudRate',Baud_Rate,'dataBits',data_bits,'timeout',1);    %R�glage du port COM serie

s2=serial(com2,'BaudRate',Baud_Rate2,'dataBits',data_bits2,'timeout',1);
fopen(s2);
pause(1)
set(s2,'Terminator','CR');  %Reglage port com pour pouvoir envoyer des commande à l'instrument

%% load ficjier d etalonnage .PRB
[tt cc]=read_prb(['F:\CT\'], ['CTP' num_ct '.PRB']);

%% syncronisation SBE_matlab
nowvec=datevec(now);
commande=['MMDDYY=' datestr(nowvec,5) datestr(nowvec,7) datestr(nowvec,11)];
fprintf(s2,commande); pause(1);
nowvec=datevec(now);
commande2=datestr(nowvec,13);
commande2([3 6])=[];
commande2=['HHMMSS=' commande2];
fprintf(s2,commande2); pause(1);
while get(s2,'bytesavailable')~=0
    fscanf(s2);
    pause(0.1)
end

%% lancement des acquisitions
res_dif=[];
res_dif(1,1:7)=nan;
res=[]; 
date=[];
res_sbe=[];
i=0;
indic=0;
indic2=0;
temp_s2=-1;
tempold=datenum('00/00/0000 00:00:00');
test=0;

while_s; %fenetre d'arret

disp('D�but d acquisition')

fclose(s) 
fopen(s) %Ouverture du port com CT
pause(1) 


while 1

    temp=0;
    str=0;
    if get(s,'bytesavailable')==6    % Si nouvel mesure de la CT
      
        [temp,A ,B]=fread(s,6); %Chargement du buffer du port com CT (binaire)
        tempnow=now;
        if (length(temp)==6) & (get(s,'bytesavailable')==0)   % Si le chargement c'est bien effectué en temps réel 
            
            if tempnow-tempold>datenum('00/00/0000 00:00:08') % Mesure de la SBE toute les >8seconde
                fprintf(s2,'ts');   %envoi de la commande d'acquisition
                indic=1;
                tempold=tempnow;
            elseif tempnow-tempold>datenum('00/00/0000 00:00:04') & indic==1    % 4 seconde apres l'envoi de la commande d'acquisition, lécture du buffer poort com sbe
                while get(s2,'bytesavailable')>52  % Si d'autre information viennent avant la ligne des mesure (qui fait dans mon cas 52 charactere.
                temp_s2=fscanf(s2);               %Chargement du buffer du port com SBE (chaine de charactere)
                    if get(s2,'bytesavailable')==0, return; end   % en cas de mauvaise reception
                end
                if length(temp_s2)==52  % en cas de mauvaise reception
                    temp_sbe=temp_s2([30:53-1]);    
                    temp_sbe([1 13])=[];
                    temp_sbe([3 7])='-';
                    res_sbe_temp=[datenum(temp_sbe,0)   str2num(temp_s2([3:9]))   str2num(temp_s2([12:18]))*10   str2num(temp_s2([22:28]))];
                    res_sbe=[res_sbe ; res_sbe_temp];
                    indic2=1;
                    indic=0;
                    
                    [dif l_dif]=min(abs(res_sbe_temp(1)-res(:,1))); %calcule des donnée synchronisé entre les deux instrument et calcule de la différence
                    if dif<datenum('00/00/0000 00:00:04')
                        res_dif_temp=[res_sbe_temp   res_sbe_temp(2)-res(l_dif,2)   res_sbe_temp(3)-res(l_dif,3)       dif/datenum('00/00/0000 00:00:01')];
                        res_dif=[res_dif; res_dif_temp];    
                    end
                    
                end
            end
            
            str = dec2bin(temp,5); 
            
            if size(str,2)>7 % si aucun octet manquant (CT)
                str=str(:,[size(str,2)-7:end]); 
                i=i+1;  
                    % Decodage de la trame binaire et étalonnage
                    if bin2dec(str(:,end)')==54 & bin2dec(str(3,1:5))==3 & bin2dec(str(6,1:5))==4  % adresse message 1 et 2       
                    	date=[date ; tempnow]; 
                    	T_temp=bin2dec([str(3,[6:7]) str(2,[1:7]) str(1,[1:7])]);   % message 1
                    	C_temp=bin2dec([str(6,[6:7]) str(5,[1:7]) str(4,[1:7])]);   % message 2      
                        T_temp=tt(1)+T_temp*tt(2); 
                        C_temp=cc(1)+C_temp*cc(2)+C_temp.^2*cc(3)+C_temp.^3*cc(4); 
                        res=[res ; tempnow T_temp C_temp];
                        
                        liM=date(end);
                        if length(date)>240 %axe absisse large de 120 seconde (240/2)
                            lim=date(end-240);
                        elseif length(date)==1
                            lim=date(1);
                            liM=date(1)+4.6296e-005;
                        else
                            lim=date(1);
                        end
 
                       
                        %plot resultats en temps réel (à améliorer pour de
                        %longue période d'acquisition car perte de rapidité quand trop de données)
                        
                    	figure(1)
                        subplot(3,1,1)
                    	AXA1=plot(res(:,1),res(:,2));
                        hold on;
                        AXA2=plot(res_dif(:,1),res_dif(:,2),'r');
                        hold off;
                        %xlim([lim liM]);
                        datetick('x',13);
                        grid on
                        

                    	subplot(3,1,2)
                    	AXB1=plot(res(:,1),res(:,3));
                    	hold on;
                        AXB2=plot(res_dif(:,1),res_dif(:,3),'r');
                        hold off;
                        %xlim([lim liM]);
                        datetick('x',13);
                        grid on
                        
                        
                        
                        if indic2==1 & length(res_dif)>113
                            subplot(3,1,3)
                            [AX,H1,H2] = plotyy(res_dif(:,1),moy_glis2(res_dif(:,5),113,3),res_dif(:,1),moy_glis2(res_dif(:,6),113,3),'plot');
                            set(get(AX(1),'Ylabel'),'String','Erreur de mesure T') 
                            set(get(AX(2),'Ylabel'),'String','Erreur de mesure C')
                            datetick(AX(1),'x',13);
                            datetick(AX(2),'x',13);
                            %xlim([lim liM]);
                            grid on
                            linkprop([AX AXA1 AXA2 AXB1 AXB2],{'Xlim','XtickLabel','Xtick'});
                        end
                        
                        drawnow; % mise à jour des graphes
                        indic2=0;
                        
                     end
            end
        end
    elseif get(s,'bytesavailable')>6 % Si le buffer CT est chargeé en anciennes données
        fread(s,get(s,'bytesavailable')-mod(get(s,'bytesavailable'),6));
    end

    if getappdata(0,'stop_w')==1    %arret du programme avec le bouton quitter
        break
    end
    pause(0.01)
end    

% Sauvegarde des données
name=[path_save '\CT_' now_save([9 10 6 7 3 4]) '_' now_save([12 13 15 16]) '.mat'];     %save datas 
save(name , 'res');
res_sbe=res_dif; 
name=[path_save '\SBE_' now_save([9 10 6 7 3 4]) '_' now_save([12 13 15 16]) '.mat'];    %save datas 
save(name , 'res_sbe');

%fermeture des ports com
fclose(s)
fclose(s2)
