%% Funzione che calcola gli angoli assoluti per i RSN Link HR (ampolle)

function [AlfaX_HR,AlfaY_HR,TempDef_RSNHR,ARRAYdateRSNHR,ErrRSNLinkHR] = ...
    elaborazione_RSNHR(conn,IDcentralina,DTcatena,rRSNHR,angRSNHR,Tmax,Tmin,...
    TempDef_RSNHR,NodoRSNLinkHR,ARRAYdateRSNHR,NuovoZeroRSNHR,NdatiMedia,...
    Ndatidespike,datainiRSNHR,ErrRSNLinkHR,FileName)

% Inizio del ciclo di elaborazione
text = 'elaborazione_RSNHR function started';
fileID = fopen(FileName,'a');
fmt = '%s \r';
fprintf(fileID,fmt,text);
fclose(fileID);

if NuovoZeroRSNHR == 1
    if NdatiMedia > Ndatidespike
        Ndati = NdatiMedia;
    else
        Ndati = Ndatidespike;
    end
    ini = round(Ndati/2)+1;
    if rem(Ndati,2) == 0
        ini = ini+1;
    end
    clear NDati
    angRSNHR = angRSNHR(ini:end,:);
    TempDef_RSNHR = TempDef_RSNHR(ini:end,:);
    ARRAYdateRSNHR = ARRAYdateRSNHR(ini:end,1);
    ErrRSNLinkHR = ErrRSNLinkHR(ini:end,:);
end

%% Temperatura
cont3 = 0; % contatore
FileTemperature = ['' IDcentralina '-' DTcatena '-RSNHR-Therm.csv'];
if isfile(FileTemperature) == 1
    DatiRaw = csvread(FileTemperature);
    [rDR,cDR] = size(DatiRaw);
    DatiRaw(:,1) = DatiRaw(:,1) + 730000;
else
    rDR = 1;
    cDR = 1;
end
[Ndate,~] = size(ARRAYdateRSNHR);
Nnodi = rRSNHR;
TempDef_RSNHR = TempDef_RSNHR';
angRSNHR = angRSNHR';
textT = 'No correction needed for RSN Link HR - Temperature filter';
for b = 1:Ndate % Data
    nodo = 1;
    for a = 1:Nnodi % Nodo
        % NON considero i dati al di sopra dei 80 °C o al di sotto dei -30 °C!
        if TempDef_RSNHR(a,b) > Tmax || TempDef_RSNHR(a,b) < Tmin
            cont3 = cont3+1;
            if b == 1
                if isfile(FileTemperature) == 1
                    RawDate = find(DatiRaw(:,1)<=datenum(datainiRSNHR));
                    if isempty(RawDate) == 1
                        cc = 2;
                        while cc <= c
                            if TempDef_RSNHR(a,cc) > Tmax || TempDef_RSNHR(a,cc) < Tmin
                                cc = cc+1;
                            else
                                break
                            end
                        end
                        TempDef_RSNHR(a,b) = TempDef_RSNHR(a,cc);
                        angRSNHR(nodo:nodo+1,b) = angRSNHR(nodo:nodo+1,cc);
                    else
                        if isnan(DatiRaw(RawDate(end),a+1)) == 0
                            TempDef_RSNHR(a,b) = cellstr(num2str(DatiRaw(b+1,RawDate(end))));
                            angRSNHR(nodo:nodo+1,b) = cellstr(num2str(DatiRaw(1+a*2:2+a*2,RawDate(end))));
                            if ErrRSNLinkHR(b,a) == 0
                                ErrRSNLinkHR(b,a) = 0.5;
                            end
                            wardat = 'Temperature data of RSN Link HR nodes corrected using Raw Data of reference Csv file.';
                            fprintf(fileID,fmt,wardat);
                        else
                            cc = 2;
                            while cc <= c
                                if TempDef_RSNHR(a,cc) > Tmax || TempDef_RSNHR(a,cc) < Tmin
                                    cc = cc+1;
                                else
                                    break
                                end
                            end
                            TempDef_RSNHR(a,b) = TempDef_RSNHR(a,cc);
                            angRSNHR(nodo:nodo+1,b) = angRSNHR(nodo:nodo+1,cc);
                        end
                    end
                else
                    cc = 2;
                    while cc <= c
                        if TempDef_RSNHR(a,cc) > Tmax || TempDef_RSNHR(a,cc) < Tmin
                            cc = cc+1;
                        else
                            break
                        end
                    end
                    TempDef_RSNHR(a,b) = TempDef_RSNHR(a,cc);
                end
            else
                TempDef_RSNHR(a,b) = TempDef_RSNHR(a,b-1);
                angRSNHR(nodo:nodo+1,b) = angRSNHR(nodo:nodo+1,b-1);
                if ErrRSNLinkHR(b,a) == 0
                    ErrRSNLinkHR(b,a) = 0.5;
                end
            end
            textT = ['' num2str(cont3) ' correction executed for RSN Link HR - Temperature filter!'];
        end
        nodo = nodo+2;
    end
end

if  rDR~=1 && cDR~=1 && isempty(DatiRaw) == 0
    RawDate1 = find(DatiRaw(:,1)<=ARRAYdateRSNHR(1));
    if isempty(RawDate1) == 1
        RawDate2 = 1;
    elseif RawDate1(end) == rDR
        RawDate2 = find(ARRAYdateRSNHR(:,1)>DatiRaw(end,1));
    else
        RawDate2 = find(ARRAYdateRSNHR(:,1)>DatiRaw(RawDate1(end)+1,1));
    end
else
    RawDate1 = [];
    RawDate2 = 1;
end
if isempty(RawDate1) == 0 && isempty(RawDate2) == 0
    Dati = [DatiRaw(1:RawDate1(end),:); ARRAYdateRSNHR(RawDate2(1):end) TempDef_RSNHR(:,RawDate2(1):end)' angRSNHR(:,RawDate2(1):end)'];
elseif isempty(RawDate1) == 1 && isempty(RawDate2) == 0
    Dati = [ARRAYdateRSNHR TempDef_RSNHR' angRSNHR'];
else
    Dati = DatiRaw;
end
% Elimino appoggio più vecchio di un mese
RawDate3 = find(Dati(:,1)<now-30);
if isempty(RawDate3) == 0
    [rDati,~] = size(Dati);
    if RawDate3(end) == rDati
    else
        Dati = Dati(RawDate3(end)+1:end,:);
    end
end
if isfile(FileTemperature) == 1
    delete(FileTemperature);
end
Dati(:,1) = Dati(:,1) - 730000;
csvwrite(FileTemperature,Dati);

TempDef_RSNHR = TempDef_RSNHR';
angRSNHR = angRSNHR';
fileID = fopen(FileName,'a');
fmt = '%s \r';
fprintf(fileID,fmt,textT);
fclose(fileID);

% azzeramenti di alcuni nodi in particolare
angRSNHR = azzeramenti_RSNHR(conn,IDcentralina,DTcatena,angRSNHR,...
    NodoRSNLinkHR,ARRAYdateRSNHR,FileName);

%% Definizione dati
NnodiHR = rRSNHR;
[Ndate,~] = size(ARRAYdateRSNHR);

AlfaX_HR = zeros(Ndate,NnodiHR);
AlfaY_HR = zeros(Ndate,NnodiHR);

for i = 1:NnodiHR
    a = angRSNHR(:,(i-1)*2+1); % aHRx
    AlfaX_HR(:,i) = a;
    b = angRSNHR(:,(i-1)*2+2); % aHRy
    AlfaY_HR(:,i) = b;
end

% Inizio del ciclo di elaborazione
text = 'Elaboration of RSN Link HR started';
fileID = fopen(FileName,'a');
fmt = '%s \r';
fprintf(fileID,fmt,text);
fclose(fileID);

% Approssimo i dati con il corretto numero di cifre decimali
[AlfaX_HR,AlfaY_HR,TempDef_RSNHR] = approx_RSNHR(AlfaX_HR,AlfaY_HR,TempDef_RSNHR,FileName);

[r,~] = size(ErrRSNLinkHR);
Matrice_err = zeros(r,rRSNHR);
clear j
for i = 1:r % date
    d = 1;
    for n = 1:rRSNHR % nodi
        j = 1;
        err = ErrRSNLinkHR(i,d:d+2);
        while j <= 3
            if err(1,j) == 1
                Matrice_err(i,n) = 1;
            elseif err(1,j) == 0.5 && Matrice_err(i,n) == 0
                Matrice_err(i,n) = 0.5;
            end
            j = j+1;
        end
        d = d+3;
    end
end
ErrRSNLinkHR = Matrice_err';

text = 'RSN Link HR elaboration executed correctly. elaborazione_RSNHR function closed';
fileID = fopen(FileName,'a');
fmt = '%s \r';
fprintf(fileID,fmt,text);
fclose(fileID);

end