//-------------------------------------------------------------------
procedure TGenericModem._DataReceived
(ASender:TObject);
//--------------------------------------------------------------------
var
Data: ANSIstring;
Line: ANSIstring;
CRidx: integer;
begin
if not Enabled then
exit;
Data := FRxTmpBuffer+RxDataFilter(Port.RxString);
FRxTmpBuffer := sz;
while Data<>sz do
begin
CRidx := pos(#13,Data);
if CRidx<>0 then
begin
Line := copy(Data,1,CRidx-1);
Data := copy(Data,CRidx+1,length(Data)-CRidx);
IOCLog.Log(ThreadName,cmltInp,''''+Line+#13+'''');
// pokracovaci radek nevyzadanych dat
if FRxUnsolLines>0 then
begin
IOCLog.Log(ThreadName,cmltUns,'Unsolicited response');
__RxAddUnsolicited(Line);
end
// potlaceni echa
else if CompareText(Line,FTxLastCommand)=0 then
begin
IOCLog.LogRsp(ThreadName,'echo, skipped');
end
// indikace prichoziho hovoru v pripade, ze modem podporuje Voice
else if _RxDataRing(Line) then
begin
IOCLog.LogRsp(ThreadName,'ringing');
_Ringing;
end
// indikace volajiciho
else if _RxDataVoice(Line) then
begin
IOCLog.LogRsp(ThreadName,'Voice data recognized');
end
// nevyzadana data, pozadat o jejich zpracovani
else if _RxDataUnsolicited(Line) then
begin
IOCLog.Log(ThreadName,cmltUns,'Unsolicited response');
__RxAddUnsolicited(Line);
end
// ignorovana data napr. RING, pokud neni podpora Voice
else if _RxDataIgnore(Line) then
begin
IOCLog.LogRsp(ThreadName,'ignored');
end
// odezva na prikaz
else
begin
IOCLog.LogRsp(ThreadName,'response');
_RxAddResponse(Line);
end;
end
// Prompt, ktery neni ukoncen CR, napr. '> '. Je zkonvertovan na response
else if _RxDataPrompt(Data) then
begin
IOCLog.Log(ThreadName,cmltInp,''''+Data+'''');
IOCLog.LogRsp(ThreadName,'prompt');
_RxAddResponse(Data);
Data := sz;
end
// Fragment dat, docasne zapamatovat
else
begin
FRxTmpBuffer := Data;
Data := sz;
end;
end;
end;