% 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,state]=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

% Abertura da porta de comunicação
handler=cportopen(['com' num2str(gate)]);
if (handler==0)
    error('cport:cportopen:GateNotOpened',['Failed to open gate COM',num2str(gate)]);
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',1, ...
                          'ReadTotalTimeoutMultiplier',5, ...
                          'ReadTotalTimeoutConstant',100, ...
                          'WriteTotalTimeoutMultiplier',1000, ...
                          'WriteTotalTimeoutConstant',1000);
                          

% Reset das comunicações
[stat,ErrStr]=cportreset(handler);

% Verificação da ocorrencia de erros no RESET
if (stat==0)
    error('cport:cportreset:ResetFailed','Cannot reset communications!');
    
    % Encerramento da porta
    stat=cportclose(handler);
    % Verificação da ocorrência de erros no encerramento
    if (stat==0)
        error('cport:cportclose:CloseFailed','Cannot close communications gate!');
    end
end

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