function varargout=wqrs(varargin)
%
% wqrs(recordName,N,N0,signal,threshold,findJ,powerLineFrequency,resample)
%
%    Wrapper to WFDB WQRS:
%         http://www.physionet.org/physiotools/wag/wqrs-1.htm
%
%    Creates a WQRS annotation file  at the current MATLAB directory.
%    The annotation file will have the same name as the recorName file,
%    but followed with the *.wqrs suffix. Use RDANN to read the annoations
%    into MATLAB's workspace in order to read the sample QRS locations.
%
%    If recordName is the path to a record at PhysioNet's database, then
%    the annation files will be stored in a subdirectory with the same relative 
%    path as recordName and under the current directory.
%
%
%    NOTE: In order to read the generated annotation file using RDANN, it is
%    necessary to have the WFDB record (*.hea and *.dat) files in the same 
%    directory as the annotation file.
%
%
% CITING CREDIT: To credit this function, please cite the following paper in your work:
%
% Zong, W., G. B. Moody, and D. Jiang."A robust open-source algorithm to detect onset 
% and duration of QRS complexes." Computers in Cardiology, 2003. IEEE, 2003.
%
%
% Required Parameters:
%
% recorName
%       String specifying the name of the record in the WFDB path or
%       in the current directory.
%
%
% Optional Parameters are:
%
% N 
%       A 1x1 integer specifying the sample number at which to stop reading the 
%       record file (default read all = N).
% N0 
%       A 1x1 integer specifying the sample number at which to start reading the 
%       annotion file (default 1 = begining of the record).
%
% signal
%       A 1x1 integer. Specify the signal to obtain the annotation (default
%       = 1, first signal).
%
% threshold
%       A 1x1 double. Specify the detection threshold in millivolts
%      (default = 100). Use higher values to reduce false detections, or lower values to 
%       reduce the number of missed beats. 
%
% findJ
%       A 1x1 boolean. Find and annotate J-points (QRS ends) as well as QRS onsets. 
%       Default is false.
%
%
% powerLineFrequency
%       A 1x1 double. Specify the power line main frequency in Hz (default=
%       60 Hz), wqrs will apply a notch filter of the specified frequency 
%       to the input signal before length-transforming it. 
%
% resample
%       A 1x1 boolean. Resample the input at 120 Hz if the power line frequency 
%       is 60 Hz, or at 150 Hz otherwise (default= false : do not resample).
%
%
%
% Source code written by Wei Zong and George B. Moody. 
%
% MATLAB wrapper written by Ikaro Silva, 2013
% Last Modified: -
% Version 1.0
% Since 0.0.1
%
% %Example - Requires write permission to current directory
%wqrs('challenge/2013/set-a/a01');

%endOfHelp
persistent javaWfdbExec
if(isempty(javaWfdbExec))
    javaWfdbExec=getWfdbClass('wqrs');
end

%Set default pararamter values
inputs={'recordName','N','N0','signal','threshold', ...
    'findJ','powerLineFrequency','resample'};
N=[];
N0=1;
signal=[]; %use application default
threshold=[];%use application default
findJ=[];
powerLineFrequency=[];
resample=[];
for n=1:nargin
    if(~isempty(varargin{n}))
        eval([inputs{n} '=varargin{n};']);
    end
end

N0=num2str(N0-1); %-1 is necessary because WFDB is 0 based indexed.
wfdb_argument={'-r',recordName,'-f',['s' N0]};

if(~isempty(N))
    wfdb_argument{end+1}='-t';
    %-1 is necessary because WFDB is 0 based indexed.
    wfdb_argument{end+1}=['s' num2str(N-1)];
end
if(~isempty(signal))
    wfdb_argument{end+1}='-s';
    %-1 is necessary because WFDB is 0 based indexed.
    wfdb_argument{end+1}=num2str(signal-1);
end
if(~isempty(threshold))
    wfdb_argument{end+1}='-m';
    %-1 is necessary because WFDB is 0 based indexed.
    wfdb_argument{end+1}=num2str(threshold-1);
end
if(~isempty(findJ) && findJ)
    wfdb_argument{end+1}='-j';
end

if(~isempty(powerLineFrequency))
    wfdb_argument{end+1}='-p';
    %-1 is necessary because WFDB is 0 based indexed.
    wfdb_argument{end+1}=num2str(powerLineFrequency);
end

if(~isempty(resample) && resample)
    wfdb_argument{end+1}='-R';
end

javaWfdbExec.execToStringList(wfdb_argument);
    


