%                function [time, energy, temp_hot, temp_cold] = read_vpdata
%
%          Inläsning av data från värmepump med ny datainsamlingsteknink
%                               070316 lars Engström
%          version 2 nu med test och korrektion för blanka rader på slutet
%
% funktionen frågar efter namnet och öppnar inputfilen
% skippar första textraden och den sista dataraden, som anses korrupt.
%
% Tid, Energipulsräkning, temperatur i varm och kall hink samlas med Pasco datainsamlingssytemet
% ej accumulerade energipulser i datafilen, dvs vi har bara en 1 eller en 0 typiskt 
% denna funktion accumulerar energin 
%
% Indatafilen. De 2 första raderena ser ut som:
%#	         Time	     Energi Tc (deg C)	Th (deg C) 
%1	2006-12-19 05:22:23	0,	21,4	21,9      eller med decimalpunkt i de 3 sista variablerna
%
% time = t(i) - t(1).   exakta tider läses så data behöver inte vara ekvidistanta. t(1) sätts till 0
% energy = sum(e(i))    Ackumulerad energi - se konstanten en_p_pulse nedan. e(1) sätts till 0
% temp_cold             kalla temperaturen. 
% temp_hot              varma temperaturen.
% 
% Kontroller:
% Minst 10 rader i filen.
% Temp data kollas så de temp med lägst summa anses "kalla" oavsett ordningen i filen
% Om det ev finns några punkter i början där den varma temp är lägre än den kalla så skippas dessa punkter
%**********************************************************************************************************
function [time, energy, temp_hot, temp_cold] = read_vpdata;
%-----------------------------------------------------------------------
% Konstanter
en_p_pulse = 4500;      % energiinkrement per puls (i joule per puls)
%-----------------------------------------------------------------------
% Fråga efter och öppna filen med data från värmepumpen
%-----------------------------------------------------------------------
fprintf('  \n');
while (1)
    f_name = input('Filnamn med data från värmepumpen?: ', 's');
    fid = fopen(f_name, 'r');
    if (fid ~= -1) 
        break;
    else
        fprintf('Kan inte öppna filen %s\n', f_name);
    end
end
%-----------------------------------------------------------------------
% Bestäm antalet rader i filen. färre än 10 ger felutgång
%---------------------------------------------------------------------
n=0;
for i=1:1000;
    dum=fgetl(fid);
    if dum ==-1
        break
    end
    test=size(dum);        % testa ev blanka rader i slutet - terminera då
    N=test(2);
    if N <= 0
        break
    end
    n=n+1;
end
if n < 10
    fprintf('!!! Fel på datafilen -- innehåller bara %i rader !!!\n', n);
    return
end
ndat=n-2;   % antalet datapunkter om sista raden anses korrupt
fprintf('Datafilen innehåller %i datarader \n', ndat);
%-----------------------------------------------------------------------
% återställ filpekaren till början av filen
% Skippa den första rubrikraden använd fgetl som läser en rad (=-1 om eof)
%------------------------------------------------------------------------
frewind(fid);
dum=fgetl(fid);
%--------------------------------------------------------------------------
% läs första dataraden för att avgöra om det finns decimalkomma eller decpunkt
%--------------------------------------------------------------------------
komma=0;             % inget komma utan dec punkt
text=fgetl(fid);     % första dataraden
n=size(text);
N=n(2);
for k=1:N;
    if text(k)==44;  % ','
        komma=1;
        break
    end
end
frewind(fid);        % återställ filpekaren till början
dum=fgetl(fid);      % skippa första textraden
%-----------------------------------------------------------------------
if komma == 1;       % fil med decimalkomma - öppna temp fil
%   fprintf('fil med komma \n');
%-------------------------------------------------------------------------
%   läs alla dataraderna, byt decimalkomma mot punkt och skriv dem till en temp fil
%--------------------------------------------------------------------------
    f_name_w='dumdumdum.txt';
    fidw = fopen(f_name_w, 'w');
%
    for i=1:ndat;
        text=fgetl(fid);
        n=size(text);
        N=n(2);
        for k=1:N;
            if text(k)==44;     % ','
            text(k)=46;         % '.'
            end
        end
        count = fprintf(fidw,'%c',text);    % data
        count = fprintf(fidw,'\n');         % generera ny rad i filen
    end
    status = fclose(fid);                   % ursprungsfilen
    status = fclose(fidw);                  % temp filen
    fidw = fopen(f_name_w, 'r');            % öppna tempfilen igen - nu för read - och starta på rad 1
%--------------------------------------------------------------------------
%   läs dataraderna från den temporära filen i formatet: 
%   1	2006-12-19 05:22:23	0.	21.4	21.9  
%--------------------------------------------------------------------------
    for i=1:ndat;
        [data,count] = fscanf(fidw, '%i%f%f%f%f%1c%f%1c%f%f%f%f', [12 1]);
        if count < 12
            fprintf('*** Datarad %i innehåller inte rätt antal storheter *** \n', i);
        end
        t(i)=data(5)*3600+data(7)*60+data(9);
        e(i)=data(10)*en_p_pulse;     
        th(i)=data(11); 
        tc(i)=data(12);
    end
    status = fclose(fidw);                  % temp filen
    delete 'dumdumdum.txt'                  % ta bort den temp filen
else  % fil med decimalpunkt på enhet fid, första textraden redan skippad. Läs direkt alla data
    for i=1:ndat;
        [data,count] = fscanf(fid, '%i%f%f%f%f%1c%f%1c%f%f%f%f', [12 1]);
        if count < 12
            fprintf('*** Datarad %i innehåller inte rätt antal storheter *** \n', i);
        end
        t(i)=data(5)*3600+data(7)*60+data(9);
        e(i)=data(10)*en_p_pulse;     
        th(i)=data(11); 
        tc(i)=data(12);
    end
    status = fclose(fid);                   % ursprungsfilen
end
%-------------------------------------------------------------------------------------
% testa att temperaturdata är i rätt ordning, dvs att hot > cold
%--------------------------------------------------------------------------------------
testh=sum(th);
testc=sum(tc);
if testc > testh;        % fel inputordning - byt
    dum=th;
    th=tc;
    tc=dum;
end
%-------------------------------------------------------------------------------------
% testa om några T-hot < T-cold. Kan vara så i början. 
% Skippa dessa punkter i så fall - ty annars blir Carnot-verkningsgraden Th/(Th-Tc)
% negativ och ev odefinierad i ngra punkter
%--------------------------------------------------------------------------------------
istart=1;
for i=1:ndat;
    if th(i) <= tc(i);
        istart=istart+1;
    else                        % sluta första gången varm > kall
        break
    end
end
if istart > 1;                  % ta bort de första istart-1 punkterna
    skipp=istart-1;
    fprintf('*** I de första %i punkterna är T-varm < T-kall. Dessa punkter ignoreras *** \n', skipp);
    ndat=ndat-skipp;
    for i=1:ndat;
        t(i)=t(i+skipp);
        e(i)=e(i+skipp);
        th(i)=th(i+skipp);
        tc(i)=tc(i+skipp);
    end
end
%-------------------------------------------------------------------------------------
% subtrahera tiden och energin med värdet i första punkten: 
% bygg upp output vektorerna.
% Då får dessa rätt längd om ev ngra punkter har tagits bort i början - istart > 1
%--------------------------------------------------------------------------------------
for i=1:ndat;
    time(i)=t(i)-t(1);
    temp_hot(i)=th(i);
    temp_cold(i)=tc(i);
end
estart=0;
e1=e(1);
energy(1)=0;
for i=2:ndat;
    energy(i)=estart+e(i);
    estart=energy(i);
end
fprintf('  \n');        % blank rad i kommandofönstret
    
      





