% nacteni a dekodovani celeho souboru avg.dbf do matice znaku a hodnot
% vcetne vytvoreni vstupni matice (obsahuje pouze hodnoty prumeru danych mereni) 
% pro nasledne tvoreni trenovacich a testovacich mnozin pro analyzu, vyrazeni 
% pacientskych zaznamu, ktere obsahuji nekompletni data

%% Pocatecni smazani pracovniho adresare "data mtlab" a jeho opetovne
%vytvoreni
clear all
close all
clc
PathName2 = 'data matlab'; FileName2 = 'DB_AVG.mat';
fprintf('||| Dekodovani souboru AVG.DBF ||| \n');
%% Nacteni souboru
[FileName, PathName] = uigetfile( ...
    { '*.DBF', 'AVG database file (*.DBF)'; ...
      '*.*', 'All files (*.*)'}, ...
      'Select an AVG database-file');
if isequal(FileName,0)
    %... pokud user zvolil cancel ... preruseni behu programu
    fprintf('Uzivatel zvolil Cancel \n')
    clear all
    else
       fprintf('Zvolen soubor: \n "%s" \n',fullfile(PathName,FileName));
    fprintf('Vytvoren prazdny pracovni adresar "%s" \n',PathName2);
    %... pokracovani programu 
    PathName2 = uigetdir;
    FileName2 = 'DB_AVG.mat';
    rmdir(PathName2,'s'); mkdir(PathName2);
    fid = fopen([PathName, FileName]); %nacte file id
    c = fread(fid); %nacte soubor v dec po adresach do jednoho sloupce
    c = c(hex2dec('263'):end-1);
    %% Rozkodovani souboru AVG.DBF
    znak = 1;
    %jeden retezec je dlouhy 107 znaku
    %uzitecna informace ma 105 znaku
    if exist(fullfile(PathName2,FileName2),'file')  %smaze existujici soubor, pokud existuje
        delete(fullfile(PathName2,FileName2));
        fprintf('Puvodni soubor %s byl smazan. \n',FileName2);
    end 

    fprintf('Provadi se dekodovani souboru: \n "%s%s" \nTato akce muze chvili trvat ... \n',PathName,FileName);
    x = 0; procent_10 = round((length(c)/107)/100); %pomocna pro vypocet hotovych %
    db_avg_znak=[];
    for index1 = 1:(length(c)/107) 
        if index1 == (x*procent_10) || index1 == 1 %vypocet a zobrazeni hotovych %
            fprintf(1,'Hotovo %d%% \n',x)
            x = x + 10;
        end
        db_avg_znak(index1,:) = c(znak:znak+104);   %rozdeleni retezcu do radku
        znak = znak + 106;
    end
    
    db_avg_znak = char(db_avg_znak); %prevedeni radku zdnaku na retezce
    %vytvoreni indexove tabulky ID_pacienta pro vyhledavaci ucely v souboru
    %DB_AVG.mat
    ID_zaznamu=[]; strana = [];
    load('zaloha\ZARAZENI.mat');
    for index = 1:size(db_avg_znak,1)
        ID_zaznamu(index,1) = str2double(db_avg_znak(index,1:3));
        if strcmp(db_avg_znak(index,35:37),'DX ')
            strana(index,:) = 1;
        elseif strcmp(db_avg_znak(index,35:37),'SIN')
            strana(index,:) = 2;
        end
    end
    ID_zaznamu_zarazeni = [];
    for index = 1:size(zarazeni,1)/2
        ID_zaznamu_zarazeni(ID_zaznamu==index & repmat(zarazeni(index,3),size(strana,1),1)==1 & strana==1) = zarazeni(index,2);
        ID_zaznamu_zarazeni(ID_zaznamu==index & repmat(zarazeni(index,3),size(strana,1),1)==1 & strana==2) = zarazeni(index+140,2);
    end   
    %% vytvoreni ciselne db
    %db_avg_cisl hodnot z string pole zaznamu, fmin,fmax,A,D,PI
    polozka = 1; db_avg_cisl=[]; db_avg = [];
    for index = 1:length(ID_zaznamu)
        db_avg_cisl(index,1) = str2double(db_avg_znak(index,41:41+6));    %fmax 
        db_avg_cisl(index,2) = str2double(db_avg_znak(index,48:48+6));    %fmin
        db_avg_cisl(index,3) = str2double(db_avg_znak(index,62:62+6));    %A
        db_avg_cisl(index,4) = str2double(db_avg_znak(index,69:69+6));    %D
        db_avg_cisl(index,5) = str2double(db_avg_znak(index,76:76+5));    %T0
        db_avg_cisl(index,6) = str2double(db_avg_znak(index,94:94+6));    %PI

        db_avg{index}.ID = str2double(db_avg_znak(index,1:3));     %ID pacienta 
        db_avg{index}.Prijmeni =  db_avg_znak(index,4:18);    %Prijmeni
        db_avg{index}.Datum_mer = db_avg_znak(index,19:26);   %Datum mereni
        db_avg{index}.Cas_mer =   db_avg_znak(index,27:34);   %Cas mereni
        db_avg{index}.Strana =    db_avg_znak(index,35:37);   %Merena strana
        db_avg{index}.Misto =     db_avg_znak(index,38:40);   %Merene misto
        db_avg{index}.F_max = str2double(db_avg_znak(index,41:47));   %Maximalni dopp. frekvence [kHz]
        db_avg{index}.F_min = str2double(db_avg_znak(index,48:54));   %Minimalni dopp. frekvence [kHz]
        db_avg{index}.F_mean = str2double(db_avg_znak(index,55:61));   %Stredni dopp. frekvence [kHz]
        db_avg{index}.A = str2double(db_avg_znak(index,62:68));   %Zrychleni krevniho toku [kHz/s]
        db_avg{index}.D = str2double(db_avg_znak(index,69:75));   %Zpomaleni krevniho toku [kHz/s]
        db_avg{index}.T0 = str2double(db_avg_znak(index,76:81));   %Doba pocatku pulsu od R vlny [ms]
        db_avg{index}.T_per = str2double(db_avg_znak(index,82:88));   %Doba trvani srdecni periody [ms]
        db_avg{index}.Tep = str2double(db_avg_znak(index,89:93));   %Minutova tepova frekvence
        db_avg{index}.PI = str2double(db_avg_znak(index,94:100));  %Pulsacni index
        db_avg{index}.F_dopp = str2double(db_avg_znak(index,101));     %frekvence sondy dopplera
        db_avg{index}.Druh_zazn = db_avg_znak(index,102:103); %Druh zaznamu (ME,VK,OD,PR)
        db_avg{index}.Por_pulsu = db_avg_znak(index,104:105); %Poradi/pocet pulsu pro vypocty
        db_avg{index}.Zarazeni = ID_zaznamu_zarazeni(index);
        db_avg{index}.Cislo_zaznamu = index;
    end

    %% Ulozeni vytvoreneho souboru do zvoleneho adresare
    fprintf('\n')
    [filename, pathname] = uiputfile('DB_AVG.mat','Save Mat-file');
    if isequal(filename,0) || isequal(pathname,0)
        fprintf('Uzivatel zvolil Storno. Soubor ulozen v: \n "...%s" \n',fullfile(PathName2,FileName2))
        save(fullfile(PathName2,FileName2), 'db_avg_cisl','db_avg');
    else
        fprintf('Vytvoren soubor: \n %s%s \n',pathname,filename);
    %ulozeni vytvorenych dat do souboru DB_AVG.mat (prevedeni souboru DB.AVG do mat fileu)
        save(fullfile(pathname, filename), 'db_avg_cisl','db_avg');
    end
    % soubor DB_AVG.mat obsahuje ...
    % ciselne vyjadreni parametru fmax,fmin,A,D,T0,PI -                 db_avg_cisl
    % kompletni udaje zaznamu vcetne ID pacienta                        db_avg
    %
    save(('path.mat'), 'pathname','filename','PathName','FileName','PathName2','FileName2');
    clear all;
end %konecny END celeho programu pokud byl vybran soubor