% Estabelecimento de uma nova ligação via RS-232
%
% [handler,state]=initcom(gate,rate)
%
% Entradas:
%  gate    -> Porta a utilizar (1,2,...)
%  rate    -> baudrate a definir
% Saídas:
%  handler -> ID da linha de comunicações
%  state   -> Configurações da linha
%
% (c) Milton Ruas da Silva, 2006

function [handler,error,errorstr]=initcom(gate,rate)

% Verificação dos argumentos de saída
if (nargout==0)
    error('myfunction:initComm:outargs','É necessário definir pelo menos uma variavel de saída!');
end

% Argumentos default:
if (nargin<2)
    rate=115200;     % BaudRate=19200
end
if (nargin==0)
    gate=1;         % gate=COM1
end

% Inicialização dos parametros de saída
error=0;
errorstr='OK';

% Abertura da porta de comunicação
handler=cportopen(['com' num2str(gate)]);
if (handler==0)
    error=1;
    errorstr=['Failed to open gate COM',num2str(gate)];
    return;
end

% Configuração do ritmo de transmissão
state=cportconfig(handler,'BaudRate',rate, ...
                          'ByteSize',8, ...
                          'fNull','OFF', ...
                          'fDtrControl','OFF', ...
                          'fRtsControl','OFF', ...
                          'fAbortOnError','ON', ...
                          'ErrorChar',-1, ...
                          'ReadIntervalTimeout',2*11/rate*1000, ...
                          'ReadTotalTimeoutMultiplier',1, ...
                          'ReadTotalTimeoutConstant',10, ...
                          'WriteTotalTimeoutMultiplier',1, ...
                          'WriteTotalTimeoutConstant',10);
                          

% Reset das comunicações (purging dos buffers de comunicação)
[stat,ErrStr]=cportreset(handler);

% Verificação da ocorrencia de erros no RESET
if (stat==0)
    error=1;
    errorstr='Cannot reset communications!';
    
    % Encerramento da porta
    cportclose(handler);
end

% Apresentação de erros ocorridos antes do RESET
if (~isempty(ErrStr)>0)
    fprintf('Previous errors:\n%s\n',ErrStr);
end
