function [GI_DispCrL,GI_NumCrL,GI_DateCrL,battANALOG,ATTIVA,FIG,FIG_ENG] = report_CrL(rCrL,...
    m,NodoCrackLink,toolrif,unitrif,contunit,datarif,Font_caption,...
    Font_tools,battANALOG,ATTIVA,siteID,DT,DT_ENG,FIG,FIG_ENG,br,status,...
    activeEN,conn,FileName)

fileID = fopen(FileName,'a');
fmt = '%s \r';
text = 'report_CrL function started';
fprintf(fileID,fmt,text);

import mlreportgen.dom.*
import mlreportgen.report.*

% Make sure DOM is compilable
makeDOMCompilable()

GI_DispCrL = [];
GI_NumCrL = [];
GI_DateCrL = [];

if status(m,1) == 1
    if ATTIVA == 1
        testo = Paragraph('GMUX non ancora installato o canale inattivo.');
        add(DT,testo);
        ATTIVA = 0;
        if activeEN == 1
            testo = Paragraph('GMUX not installed or inactive.');
            add(DT_ENG,testo);
        end
    end
elseif status(m,1) == 3
    if ATTIVA == 1
        testo = Paragraph(['Monitoraggio completato. Invitiamo a visitare la '...
            'piattaforma web per la visione dei dati storici.']);
        ATTIVA = 0;
        add(DT,testo);
        if activeEN == 1
            testo = Paragraph(['Monitoring completed. Please log into the web-based platform '...
                'to access the complete dataset.']);
            add(DT_ENG,testo);
        end
    end
else
    CrE = Section();
    sezCrack = Heading3('Crack Link');
    sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)};
    CrE.Title = sezCrack;
    if battANALOG == 0
        comando = ['select Date, Time, UnitName, ToolNameID, BatLevel, Temperature from RawDataView where Date >= ''' ...
            datarif ''' and UnitName = ''' char(unitrif) ''' and ToolNameID = '''...
            char(toolrif) ''' and NodeNum = 1 '];
        curs = exec(conn,comando);
        curs = fetch(curs);
        BatTemp = curs.Data;
        [~,cc] = size(BatTemp);
        
        if cc ~= 1 %ci sono dati riferiti all'ultimo mese/periodo di interesse
            DataPlot = [BatTemp(:,1) BatTemp(:,2)];
            % sistemo date, batteria e temperatura
            [rD,~] = size(DataPlot);
            T = [cell2mat(DataPlot(:,1)) repmat(' ', [rD,1]) cell2mat(DataPlot(:,2))];
            Date = datenum(T);
            Batteria = cell2mat(BatTemp(:,5));
            Temperatura = cell2mat(BatTemp(:,6));
            
            % testo introduttivo
            testoB1 = Paragraph(['I valori di tensione di alimentazione del GMUX durante il periodo '...
                'di monitoraggio sono riportati di seguito. Il corretto funzionamento del sistema '...
                char(232) ' assicurato per una carica superiore a 12 V. L''ultimo dato disponibile ' char(232) ' pari '...
                'a ' num2str(Batteria(end,1)) ' V.']);
            testoB2 = Paragraph(['Il GMUX integra al proprio interno un termometro '...
                'per monitorate la temperatura di esercizio ed identificare eventuali '...
                'anomalie. I dati di temperatura registrati sono riportati di seguito.']);
            testoB1.HAlign = 'justify';
            testoB2.HAlign = 'justify';
            
            % grafico batteria
            figure(19)
            plot(Date,Batteria);
            hold on
            title('Batteria e Temperatura del GMUX');
            xlabel('Data [gg/mm/aaaa]');
            ylabel('Livello di Batteria [V]');
            ylim([floor(min(Batteria(:,1))) ceil(max(Batteria(:,1)))]);
            
            yyaxis right
            GMUX = plot(Date,Temperatura,':','LineWidth',1.1);
            ylim([floor(min(Temperatura(:,1))) ceil(max(Temperatura(:,1)))]);
            ylabel(['Temperatura [' char(176) 'C]']);
            set(gca,'YColor','k');
            str(1,1) = cellstr('Batteria');
            str(2,1) = cellstr('Temperatura');
            legend(str,'Location','northwest');
            h = gca;
            h.XAxis.MinorTick = 'on';
            datetick('x','dd/mm/yyyy','keepticks','keeplimits');
            xtickangle(20);
            grid on
            grid minor
            xlim([Date(1)-1 Date(end)+1]);
            
            TempName = char(strcat('Report',siteID,'-', contunit,'-GMUX.png'));
            saveas(GMUX,TempName);
            ChartGMUX = Image(TempName);
            ChartGMUX.Style = {Height('8cm'),HAlign('center')};
            if Batteria(end,1) >= 12.5
                TempName = char(strcat('B_13.jpg'));
            elseif Batteria(end,1) >= 12
                TempName = char(strcat('B_12.jpg'));
            elseif Batteria(end,1) >= 11.3
                TempName = char(strcat('B_115.jpg'));
            elseif Batteria(end,1) >= 10.5
                TempName = char(strcat('B_11.jpg'));
            else
                TempName = char(strcat('B_10.jpg'));
            end
            Batt = Image(TempName);
            Batt.Style = {Height('4cm'),HAlign('center')};
            
            lot = Table({ChartGMUX, Batt});
            lot.TableEntriesStyle = {HAlign('center'),VAlign('middle')};
            lot.Style = {ResizeToFitContents(false),Width("100%")};
            grps(1) = TableColSpecGroup;
            grps(1).Span = 2;
            specs(1) = TableColSpec;
            specs(1).Span = 1;
            specs(1).Style = {Width("80%")};
            specs(2) = TableColSpec;
            specs(2).Span = 1;
            specs(2).Style = {Width("20%")};
            grps(1).ColSpecs = specs;
            lot.ColSpecGroups = grps;
            
            lot_cap = Paragraph(['Fig. ' num2str(FIG) ' - Livello di carica della batteria e temperatura del '...
                'GMUX durante il periodo di riferimento']);
            FIG = FIG+1;
            lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')};
            Batt = Section();
            sezBATT = Heading3('GMUX - Batteria e Temperatura');
            sezBATT.Style = {FontSize(Font_tools),Bold(1),Italic(1)};
            Batt.Title = sezBATT;
            add(DT,sezBATT);
            add(DT,testoB1);
            add(DT,testoB2);
            add(DT,lot);
            add(DT,lot_cap);
            add(DT,br);
            close(figure(19));
            
            %--ENG---
            if activeEN == 1
                CrL_ENG = Section();
                sezCrL_ENG = Heading3('Crack Link');
                sezCrL_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)};
                CrL_ENG.Title = sezCrL_ENG;
                
                testoB1 = Paragraph(['The following chart reports the GMUX battery level trend recorded '...
                    'during the reference time period. '...
                    'The correct functioning of the data acquisition system is guaranteed for a '...
                    'minimum level of 12 V. The last available data is equal to ' num2str(Batteria(end,1)) ' V.']);
                testoB2 = Paragraph(['GMUX equips also a thermometer that allows the monitoring '...
                    'of the working temperature and the identification of eventual malfunctioning. The same '...
                    'chart displays also temperature data recorded by the multiplexer.']);
                testoB1.HAlign = 'justify';
                testoB2.HAlign = 'justify';
                
                % grafico batteria
                figure(19)
                plot(Date,Batteria);
                hold on
                title('GMUX battery level and temperature');
                xlabel('Date [dd/mm/yyyy]');
                ylabel('Battery Level [V]');
                ylim([floor(min(Batteria(:,1))) ceil(max(Batteria(:,1)))]);
                
                yyaxis right
                GMUX = plot(Date,Temperatura,':','LineWidth',1.1);
                ylim([floor(min(Temperatura(:,1))) ceil(max(Temperatura(:,1)))]);
                ylabel(['Temperature [' char(176) 'C]']);
                set(gca,'YColor','k');
                str(1,1) = cellstr('Battery');
                str(2,1) = cellstr('Temperature');
                legend(str,'Location','northwest');
                h = gca;
                h.XAxis.MinorTick = 'on';
                datetick('x','dd/mm/yyyy','keepticks','keeplimits');
                xtickangle(20);
                grid on
                grid minor
                xlim([Date(1)-1 Date(end)+1]);
                
                TempName = char(strcat('Report',siteID,'-', contunit,'-GMUX_ENG.png'));
                saveas(GMUX,TempName);
                ChartGMUX = Image(TempName);
                ChartGMUX.Style = {Height('8cm'),HAlign('center')};
                Batt = Image(TempNameB);
                Batt.Style = {Height('4cm'),HAlign('center')};
                
                lot = Table({ChartGMUX, Batt});
                lot.TableEntriesStyle = {HAlign('center'),VAlign('middle')};
                lot.Style = {ResizeToFitContents(false),Width("100%")};
                grps(1) = TableColSpecGroup;
                grps(1).Span = 2;
                specs(1) = TableColSpec;
                specs(1).Span = 1;
                specs(1).Style = {Width("80%")};
                specs(2) = TableColSpec;
                specs(2).Span = 1;
                specs(2).Style = {Width("20%")};
                grps(1).ColSpecs = specs;
                lot.ColSpecGroups = grps;
                
                lot_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Battery level and temperature recorded '...
                    'by the GMUX during the reference time period']);
                FIG_ENG = FIG_ENG+1;
                lot_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')};
                Batt_ENG = Section();
                sezBATT_ENG = Heading3('GMUX - Battery and temperature');
                sezBATT_ENG.Style = {FontSize(Font_tools),Bold(1),Italic(1)};
                Batt_ENG.Title = sezBATT_ENG;
                add(DT_ENG,sezBATT_ENG);
                add(DT_ENG,testoB1);
                add(DT_ENG,testoB2);
                add(DT_ENG,lot);
                add(DT_ENG,lot_cap);
                add(DT_ENG,br);
                close(figure(19));
            end          
            battANALOG = 1;
        end
    end
    add(DT,sezCrack);
    for cr = 1:rCrL(m,1)
        NodeNum = num2str(NodoCrackLink(cr,m));
        comando = ['select EventDate, EventTime, XShift from ElabDataView where EventDate >= ''' ...
            datarif ''' and  ToolNameID = ''' char(toolrif) ''' and UnitName = ''' char(unitrif) ...
            ''' and NodeNum = ''' NodeNum ''' '];
        curs = exec(conn,comando);
        curs = fetch(curs);
        Dati = curs.Data;
        % Modifico il formato di data e ora
        [rD,rC] = size(Dati);
        if rC ~= 1
            T = [cell2mat(Dati(:,1)) repmat(' ', [rD,1]) cell2mat(Dati(:,2))];
            Date = datenum(T); % Data
            open = cell2mat(Dati(:,3)); % Fessura
            dS = open-open(1);
            
            GI_DispCrL(:,cr) = open;
            GI_NumCrL(:,cr) = NodoCrackLink(cr,m);
            GI_DateCrL = Date;
            
            % grafico deformazioni NELL'ULTIMO MESE
            figure(5);
            apertura = plot(Date,dS);
            title(['Apertura/chiusura del fessurimetro numero ' NodeNum]);
            xlabel('Data [gg/mm/aaaa]');
            ylabel('Deformazione [mm]');
            control = abs(max(dS)-min(dS));
            if control < 1
                varG = (1-control)/2;
                ylim([min(dS)-varG max(dS)+varG]);
            end
            xlim([Date(1)-1 Date(end)+1]);
            h = gca;
            h.XAxis.MinorTick = 'on';
            datetick('x','dd/mm/yyyy','keepticks','keeplimits');
            xtickangle(15);
            grid on
            grid minor
            
            hold off
            
            TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Crack', NodeNum, '.png'));
            saveas(apertura,TempName);
            ChartCrL = Image(TempName);
            ChartCrL.Style = {Height('7.1cm'),HAlign('center')};
            ChartCrL_cap = Paragraph(['Fig. ' num2str(FIG) ' - Andamento '...
                'dell''apertura o chiusura del fessurimetro, nodo numero ' ...
                NodeNum ', durante il periodo temporale di riferimento']);
            FIG = FIG+1;
            ChartCrL_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')};
            
            if cr == 1
                testo = Paragraph(['Nei grafici seguenti sono rappresentati i dati relativi '...
                    'alle deformazioni registrate durante il periodo temporale di riferimento '...
                    'dai fessurimetri presenti in sito. Si sottolinea che valori crescenti indicano '...
                    'un''apertura della fessura, mentre numeri decrescenti una chiusura della stessa.']);
                testo.HAlign = 'justify';
                add(DT,testo);
            end
            testo2 = Paragraph(['In particolare, il nodo numero ' NodeNum ' ha registrato un valore massimo e minimo '...
                'di apertura assoluta dello strumento rispettivamente pari a ' num2str(round(max(open),2), '%0.2f') ' mm e '...
                num2str(round(min(open),2), '%0.2f') ' mm, con una '...
                'variazione massima di circa ' num2str(round(max(open),2)-round(min(open),2),'%0.2f') ' mm.' ]);
            testo2.HAlign = 'justify';
            add(DT,testo2);
            add(DT,ChartCrL);
            add(DT,ChartCrL_cap);
            if cr == rCrL(m,1)
                add(DT,br);
            end
            close(figure(5));
            
            %---ENG---
            if activeEN == 1
                % grafico deformazioni NELL'ULTIMO MESE
                figure(25);
                apertura = plot(Date,dS);
                title(['Crack meter opening - node ' NodeNum]);
                xlabel('Date [dd/mm/yyyy]');
                ylabel('Deformation [mm]');
                control = abs(max(dS)-min(dS));
                if control < 1
                    varG = (1-control)/2;
                    ylim([min(dS)-varG max(dS)+varG]);
                end
                xlim([Date(1)-1 Date(end)+1]);
                h = gca;
                h.XAxis.MinorTick = 'on';
                datetick('x','dd/mm/yyyy','keepticks','keeplimits');
                xtickangle(15);
                grid on
                grid minor
                
                hold off
                
                TempName = char(strcat('Report',siteID,'-', char(toolrif),'-Crack', NodeNum, '_ENG.png'));
                saveas(apertura,TempName);
                ChartCrL_ENG = Image(TempName);
                ChartCrL_ENG.Style = {Height('7.1cm'),HAlign('center')};
                ChartCrL_ENG_cap = Paragraph(['Fig. ' num2str(FIG_ENG) ' - Crack link '...
                    'opening measured by node ' ...
                    NodeNum ' during the reference time period']);
                FIG_ENG = FIG_ENG+1;
                ChartCrL_ENG_cap.Style = {HAlign('center'),FontSize(Font_caption),Italic(1),Color('midnightblue')};
                
                if cr == 1
                    testo = Paragraph(['The following graphs present deformation data recorded during the reference '...
                        'time period by the crack meters installed on site. In this representation, positive values '...
                        'corresponds to an opening crack, while negative values represent a closing displacement of '...
                        'the monitored element.']);
                    testo.HAlign = 'justify';
                    add(DT_ENG,testo);
                end
                testo2 = Paragraph(['In particular, Crack Link ' NodeNum ' recorded a maximum and minimum value of absolute '...
                    'opening of ' num2str(round(max(open),2), '%0.2f') ' mm and '...
                    num2str(round(min(open),2), '%0.2f') ' mm respectively, for a maximum variation '...
                    'that amounts to ' num2str(round(max(open),2)-round(min(open),2),'%0.2f') ' mm.' ]);
                testo2.HAlign = 'justify';
                add(DT_ENG,testo2);
                add(DT_ENG,ChartCrL_ENG);
                add(DT_ENG,ChartCrL_ENG_cap);
                if cr == rCrL(m,1)
                    add(DT_ENG,br);
                end
                close(figure(25));
            end
            
            %pulisco variabili da riutilizzare per catena successiva
            clear open;
        else
            if ATTIVA == 1
                CrE = Section();
                sezCrack = Heading3('Crack Link');
                sezCrack.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)};
                CrE.Title = sezCrack;
                add(DT,sezCrack);
                testo = Paragraph('Non sono presenti dati relativi al periodo temporale considerato.');
                add(DT,testo);
                br = PageBreak();
                add(DT,br);
                if activeEN == 1
                    CrE_ENG = Section();
                    sezCrack_ENG = Heading3('Crack Link');
                    sezCrack_ENG.Style = {OuterMargin('0in','0in','0.15in','0in'),FontSize(Font_tools),Bold(1),Italic(1)};
                    CrE_ENG.Title = sezCrack;
                    add(DT_ENG,sezCrack_ENG);
                    testo = Paragraph('No data available for the reference time period.');
                    add(DT_ENG,testo);
                    br = PageBreak();
                    add(DT_ENG,br);
                end
                ATTIVA = 0;
            end
        end
    end
    
    if isempty(GI_DispCrL) == 0
        ind = 1;
        if rCrL(m) > 1 % pił di un fessurimetro, prendo quello con max variazione
            for k = 1:rCrL(m)
                maxX(1,k) = max(GI_DispCrL(:,k)-GI_DispCrL(1,k));
                if k == 1
                    rif = maxX(1,1);
                end
                if  maxX(1,k) > rif
                    rif = maxX(1,k);
                    ind = k;
                end
            end
            GI_DispCrL = GI_DispCrL(:,ind);
            GI_NumCrL = GI_NumCrL(1,ind);
        end
    end
end

text = 'report_CrL function executed correctly';
fprintf(fileID,fmt,text);
fclose(fileID);

end