function RC = RSN(IDcentralina,DTcatena)
%%% Programma per l'elaborazione dei dati del Rockfall Safety Network
%%% Versione 2.0 del febbraio-giugno 2021

tic

RC = 1; %#ok<NASGU>
text = ['Elaboration of RSN chain ' DTcatena ' of control unit ' IDcentralina ' started correctly'];
d = datestr(datetime,'yyyy_mm_dd');
t = datestr(datetime,'HH_MM_SS');
FileName = ['LogFile_RSN-' IDcentralina '-' DTcatena '-' d '-' t '.txt'];
outdat = fopen(FileName,'wt+');
fileID = fopen(FileName,'a');
fmt = '%s \r';
fprintf(fileID,fmt,text);
fclose(fileID);

%% Parte generale

% Associo ID company al relativo DB 
% Definisco i parametri del Database
IDcompany = '1'; % DA INTEGRARE IN VERSIONI FUTURE
DB = database_definition(IDcompany,FileName);

% Apro la connessione al DB
dbname = cell2mat(DB{1,1});
username = cell2mat(DB{2,1});
password = cell2mat(DB{3,1});
driver = cell2mat(DB{4,1});
dburl = 'jdbc:mysql://212.237.30.90:3306/ase_lar?useLegacyDatetimeCode=false&serverTimezone=Europe/Rome&';
conn = database(dbname, username, password, driver, dburl);

% scarico Contol Unit ID
unitID = IDunit(IDcentralina,conn,FileName);

% questa funzione considera la prima data e ora da cui caricare i dati a seconda della catena
[date,time,unitID] = datainiziale(DTcatena,unitID,conn,FileName);

% funzione che elenca tutti i nodi ed il loro numero presenti per ogni tipo di sensore.
[idTool,NodoRSNLink,NodoSS,NodoRSNLinkHR,~,NodoLoadLink,...
    NodoTriggerLink,NodoGflowLink,NodoGshockLink,NodoDebrisLink] = tipologiaNodi(...
    DTcatena,unitID,conn,FileName);

% funzione che ricostruisce i nodi della catena
catena = schema(idTool,conn,FileName);

% funzione che attiva/disattiva l'elaborazione per una determinata tipologia di nodo
[yesRSN,yesRSNHR,yesSS,yesLL,yesTrL,yesGF,yesGS,yesDL,rRSN,rRSNHR,...
    rLL,rTrL,rSS,rDL] = YesNo(NodoRSNLink,NodoRSNLinkHR,NodoSS,NodoLoadLink,...
    NodoTriggerLink,NodoGflowLink,NodoGshockLink,NodoDebrisLink,FileName);

% funzione che definisce tutti i parametri importanti a elaborare
% un'installazione
[NdatiMedia,Ndatidespike,MEMS,tolleranzaAcc,pos_inst,Tmax,Tmin,SEL,...
    MEL] = Parametri_Installazione(yesRSN,yesRSNHR,yesDL,idTool,conn,FileName);

% funzione che carica i dati di calibrazione
[DCalRSNTot,DCalRSNHRTot,DCalLLTot,~,yesRSN,yesRSNHR,yesLL,yesDL]...
    = letturaCal(MEMS,IDcentralina,DTcatena,catena,yesRSN,yesRSNHR,yesLL,yesDL,rRSN,...
    rRSNHR,rLL,rDL,NodoRSNLink,NodoLoadLink,NodoDebrisLink,conn,FileName);

% tipologia di centralina
Unit = centralina(IDcentralina,conn,FileName);

%% Scarico dei dati

% Scarico l'ultima data elaborata: in questo modo far� i calcoli a partire
% solo da qualche data prima, per incrementare le prestazioni del software 
[NuovoZeroRSN,datainiRSN,tempoiniRSN,NuovoZeroRSNHR,datainiRSNHR,tempoiniRSNHR,...
    DatiElabTriggerLink,NuovoZeroTrL,datainiTrL,tempoiniTrL,DatiElabShockSensor,NuovoZeroSS,...
    datainiSS,tempoiniSS,NuovoZeroLL,datainiLL,tempoiniLL,datainiGF,tempoiniGF,datainiGS,tempoiniGS,...
    DatiElabDebrisLink,NuovoZeroDL,datainiDL,tempoiniDL]...
    = LastElab(conn,date,time,IDcentralina,DTcatena,NdatiMedia,NodoRSNLink,yesRSN,NodoRSNLinkHR,yesRSNHR,...
    NodoTriggerLink,yesTrL,rTrL,NodoSS,yesSS,rSS,NodoLoadLink,yesLL,yesGF,yesGS,NodoDebrisLink,yesDL,...
    rDL,Ndatidespike,FileName);

% Carico i dati dal database a seconda della catena
[Batteria,Batteria_LoRa,Type,DatiRSNLink,ErrRSNLink,DatiRSNLinkHR,ErrRSNLinkHR,DatiTriggerLink,ErrTriggerLink,...
    DatiShockSensor,ErrShockSensor,DatiLoadLink,ErrLoadLink,DatiDebrisLink,ErrDebrisLink,DatiGFLink,ErrGFLink,...
    DatiGSLink,ErrGSLink,yesRSN,yesRSNHR,yesTrL,yesLL,yesDL] = lettura(IDcentralina,DTcatena,MEMS,datainiRSN,tempoiniRSN,...
    NodoRSNLink,NuovoZeroRSN,datainiSS,tempoiniSS,NodoSS,NuovoZeroSS,datainiRSNHR,tempoiniRSNHR,NodoRSNLinkHR,...
    NuovoZeroRSNHR,datainiTrL,tempoiniTrL,NodoTriggerLink,NuovoZeroTrL,datainiLL,tempoiniLL,NodoLoadLink,NuovoZeroLL,...
    datainiGF,tempoiniGF,datainiGS,tempoiniGS,datainiDL,tempoiniDL,NodoDebrisLink,yesRSN,yesSS,yesRSNHR,yesTrL,yesLL,...
    yesGF,yesGS,yesDL,rRSN,rSS,rRSNHR,rTrL,rLL,rDL,conn,catena,date,time,FileName);

% Controllo incrociato fra la data iniziale definita da Lettura e la data
% iniziale definita da LastElab
[DatiElabTriggerLink,DatiElabShockSensor,DatiElabDebrisLink] = checkdata(...
    yesTrL,yesSS,yesDL,DatiElabTriggerLink,DatiElabShockSensor,DatiElabDebrisLink,...
    datainiTrL,datainiSS,datainiDL,rTrL,rSS,rDL,tempoiniTrL,tempoiniSS,tempoiniDL,...
    NodoTriggerLink,NodoSS,NodoDebrisLink,NuovoZeroTrL,NuovoZeroSS,NuovoZeroDL,...
    IDcentralina,DTcatena,conn,FileName);

%% ---Parte di definizione dati---

%% RSN Link
if yesRSN == 1 % attiva l'elaborazione dei RSN Link
   [TimeRSN,accRSN,tempRSN,ErrRSNLink] = defDatiRSN(MEMS,DatiRSNLink,...
       ErrRSNLink,rRSN,Ndatidespike,FileName);
   % Conversione dei dati grezzi
   [accRSN,ris_acc,tempRSN] = conv_grezziRSN(rRSN,accRSN,...
       tempRSN,DCalRSNTot,MEMS,FileName);
   % medie
   [angRSN,ARRAYdateRSN,TempDef_RSN] = MediaDati_RSN(accRSN,TimeRSN,tempRSN,...
       NdatiMedia,FileName);
else
    ARRAYdateRSN = [];
end  
% Pulisco le variabili che non uso
clear DatiRSNLink
clear TimeRSN
clear accRSN
clear tempRSN
clear DCalRSNTot
    
%% RSN Link HR 
if yesRSNHR == 1 % attiva l'elaborazione dei RSN Link HR
    [TimeRSNHR,angRSNHR,tempRSNHR,ErrRSNLinkHR] = defDatiRSNHR(DatiRSNLinkHR,...
        ErrRSNLinkHR,rRSNHR,IDcentralina,DTcatena,Ndatidespike,NuovoZeroRSNHR,FileName);
    % Conversione dei dati grezzi
    [angRSNHR,T_RSNHR] = conv_grezziRSNHR(angRSNHR,tempRSNHR,DCalRSNHRTot,rRSNHR,FileName);
    % Media
    [angRSNHR,ARRAYdateRSNHR,TempDef_RSNHR] = MediaDati_RSNHR(angRSNHR,...
        TimeRSNHR,T_RSNHR,NdatiMedia,FileName);
else
    ARRAYdateRSNHR = [];
end
% Pulisco le variabili che non uso
clear DatiRSNLinkHR
clear TimeRSNHR
clear tempRSNHR
clear DCalRSNHRTot
clear T_RSNHR

%% Trigger Link 
if yesTrL == 1 % attiva l' definizione dei dati dei Trigger Link 
  [ARRAYdateTrL,val_TrL,ErrTriggerLink] = defDatiTrL(DatiTriggerLink,...
      Type,ErrTriggerLink,rTrL,NuovoZeroTrL,FileName);
else
    ARRAYdateTrL = [];
end
clear Type
    
%% Shock Sensor
if yesSS == 1 % attiva l' definizione dei dati dei Trigger Link 
  [ARRAYdateSS,val_SS,ErrShockSensor] = defDatiSS(DatiShockSensor,...
      ErrShockSensor,rSS,FileName);
else
    ARRAYdateSS = [];
end

%% Load Link
if  yesLL == 1 % attiva l'elaborazione dei Load Link
    [TimeLL,ADCLoad,ErrLoadLink] = defDatiLL(DatiLoadLink,ErrLoadLink,rLL,Ndatidespike,FileName);
    % Conversione dei dati grezzi
    DatiLoad = conv_grezziLL(ADCLoad,DCalLLTot,NodoLoadLink,FileName);
    % Media
    [LoadDef,ARRAYdateLL] = MediaDati_LL(DatiLoad,TimeLL,NdatiMedia,FileName);
else
    ARRAYdateLL = [];
end
% Pulisco le variabili che non uso
clear DatiLoadLink
clear TimeLL
clear ADCLoad
clear DCalLLTot
clear DatiLoad

%% ---Parte di Elaborazione---

%% RSN Link
if yesRSN == 1
    [AlfaX,AlfaY,TempDef_RSN,ARRAYdateRSN,ErrRSNLink] = elaborazione_RSN(conn,...
        IDcentralina,DTcatena,MEMS,rRSN,ris_acc,tolleranzaAcc,angRSN,Tmax,Tmin,TempDef_RSN,...
        NodoRSNLink,ARRAYdateRSN,NuovoZeroRSN,NdatiMedia,Ndatidespike,ErrRSNLink,datainiRSN,...
        pos_inst,FileName);
else
    [AlfaX,AlfaY,TempDef_RSN,ARRAYdateRSN] = matrici_vuote_RSN(FileName);
end  
clear MEMS
clear ris_acc
clear tolleranza Acc
clear angRSN
clear NuovoZeroRSN

%% RSN Link HR
if  yesRSNHR == 1   
    [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);
else
   [AlfaX_HR,AlfaY_HR,TempDef_RSNHR] = matrici_vuote_RSNHR(FileName);
end
clear angRSNHR
clear NuovoZeroRSNHR

%% Load Link
if yesLL == 1
   [LoadDef,ErrLoadLink,ARRAYdateLL] = loadcell(LoadDef,ErrLoadLink,...
    ARRAYdateLL,NuovoZeroLL,NdatiMedia,Ndatidespike,yesRSN,IDcentralina,DTcatena,FileName);
else
    LoadDef = [];
end
clear NuovoZeroLL

%% Elaborazione Trigger Link
if yesTrL == 1
    if NuovoZeroTrL == 1
        cont = 3;
        [ndate,~] = size(val_TrL);
        StoricoTrigger = zeros(ndate,rTrL);
        for n = 1:rTrL
            StoricoTrigger(:,n) = cumsum(val_TrL(:,n))+cell2mat(DatiElabTriggerLink(1,cont));
            cont = cont+3;
        end
    else
        StoricoTrigger = cumsum(val_TrL);
    end
    text = 'Trigger Link elaborated correctly';
    fileID = fopen(FileName,'a');
    fmt = '%s \r';
    fprintf(fileID,fmt,text);
    fclose(fileID);
else
    StoricoTrigger = [];
    val_TrL=[];
    ARRAYdateTrL = [];
    text = 'Trigger Link has not been elaborated';
    fileID = fopen(FileName,'a');
    fmt = '%s \r';
    fprintf(fileID,fmt,text);
    fclose(fileID);
end 
clear NuovoZeroTrL

%% Elaborazione Shock Sensor
if yesSS == 1
    if NuovoZeroSS == 1
        cont = 3;
        [ndate,~] = size(val_SS);
        StoricoShock = zeros(ndate,rSS);
        ss = 1;
        while ss <= ndate
            if val_SS(ss) == 1 && val_SS(ss+1) == 1 && val_SS(ss+2) == 1
                val_SS(ss+1) = 0;
                val_SS(ss+2) = 0;
                ss = ss+3;
            else
                ss = ss+1;
            end
        end
        for n = 1:rSS
            StoricoShock(:,n) = cumsum(val_SS(:,n))+cell2mat(DatiElabShockSensor(1,cont));
            cont = cont+3;
        end
    else
        StoricoShock = cumsum(val_SS);
    end
    text = 'Shock Sensor elaborated correctly';
    fileID = fopen(FileName,'a');
    fmt = '%s \r';
    fprintf(fileID,fmt,text);
    fclose(fileID);
else
    StoricoShock = [];
    val_SS = [];
    ARRAYdateSS = [];
    text = 'Shock Sensor has not been elaborated';
    fileID = fopen(FileName,'a');
    fmt = '%s \r';
    fprintf(fileID,fmt,text);
    fclose(fileID);
end 
clear NuovoZeroSS

%% G-Flow
if yesGF == 1
    ARRAYdateGF = datenum(DatiGFLink(:,1));
    DatiGFLink = cell2mat(DatiGFLink(:,2:end));
else
    ARRAYdateGF = [];
    DatiGFLink = [];
end

%% G-Shock
if yesGS == 1
    ARRAYdateGS = datenum(DatiGSLink(:,1));
    DatiGSLink = cell2mat(DatiGSLink(:,2:end));
else
    ARRAYdateGS = [];
    DatiGSLink = [];
end

%% Scrittura Database
database_write(catena,IDcentralina,DTcatena,...
    AlfaX,AlfaY,TempDef_RSN,ARRAYdateRSN,ErrRSNLink,...
    AlfaX_HR,AlfaY_HR,TempDef_RSNHR,ARRAYdateRSNHR,ErrRSNLinkHR,...
    LoadDef,ErrLoadLink,ARRAYdateLL,val_TrL,StoricoTrigger,ErrTriggerLink,ARRAYdateTrL,...
    val_SS,StoricoShock,ErrShockSensor,ARRAYdateSS,conn,FileName);

%% Parte di lancio SW complementari
yesMusa = SWSearch(idTool,conn,FileName);
try
    if yesMusa == 1
        rilancio = ['/usr/local/matlab_func/run_Musa_lnx.sh /usr/local/MATLAB/MATLAB_Runtime/v93 ' IDcentralina ' ' DTcatena ''];
        status = system(rilancio);
        fileID = fopen(FileName,'a');
        fmt = '%s \r';
        text = 'Musa relaunch operation executed with success';
        fprintf(fileID,fmt,text);
        fprintf(fileID,fmt,status);
        fclose(fileID);
    end
catch err
    FileErr = ['ErrorFile-' IDcentralina '-' datestr(today) '-' datestr(now,'hhMMss')];
    fid = fopen(FileErr,'a+');
    fprintf(fid, '%s', err.getReport('extended','hyperlinks','off'));
    fclose(fid);
    fileID = fopen(FileName,'a');
    fmt = '%s \r';
    text = 'relaunch operation FAILED';
    fprintf(fileID,fmt,text);
    fclose(fileID);
end

%% Parte di allertamento

% Determino gli utenti da utilizzare in tutte le funzioni successive
[Mail,~,~,Users_Report,~,activeEN,~,siteID,NomeSito,~] = Users_Def(IDcentralina,conn,FileName);

% Determino alcune informazioni del sito che mi servono nei passaggi
% successivi
[unitID,chainID,Chain_Scheme,num_nodi,alarms] = Site_Info(siteID,conn,FileName);

% Soglie e Trigger
SirenON = alert_Levels(IDcentralina,DTcatena,ARRAYdateTrL,ARRAYdateSS,...
    ARRAYdateRSN,datainiRSN,ARRAYdateRSNHR,ARRAYdateLL,ARRAYdateGF,ARRAYdateGS,SEL,MEL,...
    val_TrL,val_SS,LoadDef,DatiGFLink,DatiGSLink,rTrL,rRSN,rRSNHR,rLL,yesTrL,yesSS,...
    yesRSN,yesRSNHR,yesLL,yesGF,yesGS,NomeSito,date,conn,FileName);

% Attivazione dispositivi come sirene, semafori, etc.
Siren(alarms,datainiSS,datainiTrL,datainiRSN,datainiRSNHR,datainiLL,...
    tempoiniSS,tempoiniTrL,tempoiniRSN,tempoiniRSNHR,tempoiniLL,ARRAYdateSS,ARRAYdateTrL,...
    ARRAYdateRSN,ARRAYdateRSNHR,ARRAYdateLL,SirenON,conn,date,time,FileName);

% Controllo del Livello della Batteria
checkBattery(Batteria,IDcentralina,Unit,Mail,conn,FileName);

% Controllo della data di chiusura piattaforma per una determinata centralina
checkUnit(IDcentralina,conn,FileName);

% Controllo della data di scadenza per una determinata SIM
checkSIM(IDcentralina,conn,FileName);

% Controllo della data di scadenza della visualizzazione GIS per un
% determinato sito
checkGIS(siteID,NomeSito,conn,FileName);

% Redazione del Report Automatico
Report_ASE(IDcentralina,unitID,chainID,alarms,Chain_Scheme,num_nodi,...
    Users_Report,Mail,time,activeEN,siteID,conn,FileName);

% Chiudo connessione al database
close(conn)

T = num2str(toc);
text = ['RSN elaboration completed in ' T '!'];
fileID = fopen(FileName,'a');
fmt = '%s \r';
fprintf(fileID,fmt,text);
fclose(fileID);

RC = 0;
end
