%Measuring directional characteristics of sound sources
%Made by Benjamin Nimmerrichter 2022/23 for BUT

%% INITIALIZATION
if isfile("MEASUREMENT\config.mat")  %load config file
    load('MEASUREMENT\config.mat','conf');
    disp('Kalibrační soubor byl načten');
else
    disp('Nebylo možné načíst kalibrační soubor')
end

playRec = audioPlayerRecorder(conf.Fs,'BitDepth','16-bit integer','Device',conf.device,'RecorderChannelMapping',1:(conf.mics),'SupportVariableSize',true,'BufferSize',conf.buffer);
passes = conf.passes;
noise_set = conf.noise_set;
success = 0;


while(true) %loop for restart of measuremet 
    if (success ~= 0)
        disp(['Toto je ' ,num2str(success+1), '. průběh měření:'])
    end
    input("Pro spuštění měření stiskněte enter"); %start measurement
    if(noise_set == true)
    meas_raw = IECnoise(conf.time,conf.Fs,conf.buffer,playRec); %measure data with IEC 60286-5 simulated programme
    else
    meas_raw = generator(playRec,conf.Fs,8000,conf.amplitude,conf.time,conf.buffer,false); %measure data with harmonic signal
    end
    %% CLIP AND SNR CRITERIA CHECK
    clear crit_met
    crit_met = 0;

    meas_rms = calc_rms(meas_raw(1024:end,:),conf.mics);
    meas_snr = calculate_db(meas_rms,conf.noise,false);
    meas_dB = calculate_db(meas_rms,conf.calibration,true);

    for i = 1:conf.mics
        if(clip_detect(meas_raw(1024:end,i),conf.headroom,conf.num_clips) == 0) %clip detect
            if (meas_snr(i) > 0.1*conf.snr_lim)%minimal needed snr
                crit_met = crit_met + 1; % if SNR and clip criteria is met add one to mics meeting criteria
            else
                disp(['Poměr signálu a šumu je moc malý, zkuste zvýšit gain, nebo zmenšit potřebné SNR při kalibraci (mikrofon ', num2str(i),')']);
            end
        else
            disp(['Signál je omezen, zkuste snížit gain, nebo zmenšit headroom při kalibraci (mikrofon ', num2str(i),')']);
        end
    end
    if (crit_met == conf.mics)
        if (success == 0)
            full_meas_raw = meas_raw;
            full_meas_rms = meas_rms;
            full_meas_dB = meas_dB;
            full_meas_snr = meas_snr;
        else
            full_meas_raw = cat(2,full_meas_raw,meas_raw);
            full_meas_rms = cat(2,full_meas_rms,meas_rms);
            full_meas_dB = cat(2,full_meas_dB,meas_dB);
            full_meas_snr = cat(2,full_meas_snr,meas_snr);
        end
            disp(['Úspěšně jste dokončili ',num2str(success+1),'. průběh měření.'])
            success = success + 1;
    else
        disp('Měření se nezdařilo, zkuste napravit indikované chyby a měření opakovat.')
    end

    if (success >= passes)
        disp('Úspěšně jste dokončili všechny průběhy měření.')
        break; %stop measurement, when all passes are done
    end
end




%---load values into the meas struct
meas.raw = full_meas_raw;
meas.dB = full_meas_dB;
meas.RMS = full_meas_rms;
meas.SNR = full_meas_snr;

save ("MEASUREMENT\meas.mat",'meas'); %save mat file
generate_report(); %generate text output file