📄 rs232module.cpp
字号:
return true;
}
bool Rs232Module::SkipComma( char *ptr, int& ri, const int size)
{
while(ri < size && *(ptr+ri)!=',')
ri++;
if (ri == size)
{
ri--;
return false;
}
else
return true;
}
bool Rs232Module::GetString(char *ptr, int& wi, ATParamLst& lst)
{
ATParamElem elem;
readIndex++; // Skip "
wi = 0;
while(respDataBuf[readIndex]!='"')
{
switch(respDataBuf[readIndex])
{
case '\0':
return false;
break;
default:
ptr[wi++] = respDataBuf[readIndex++];
break;
}
}
ptr[wi]='\0';
elem.type = AT_STRING;
elem.str_value = string(ptr);
lst.eleLst.push_back(elem);
while(respDataBuf[readIndex]!='\0'
&& respDataBuf[readIndex]!=',')
{
readIndex++;
}
if(respDataBuf[readIndex]==',')
readIndex++;
if(respDataBuf[readIndex]=='\0')
readIndex--;
return true;
}
bool Rs232Module::GetString(char *ptr, int& wi, ATParamElem& elem)
{
ATParamElem elemLocal;
readIndex++; // Skip "
wi = 0;
while(respDataBuf[readIndex]!='"')
{
switch(respDataBuf[readIndex])
{
case '\0':
return false;
break;
default:
ptr[wi++] = respDataBuf[readIndex++];
break;
}
}
ptr[wi]='\0';
elemLocal.type = AT_STRING;
elemLocal.str_value = string(ptr);
while(respDataBuf[readIndex]!='\0'
&& respDataBuf[readIndex]!=')'
&& respDataBuf[readIndex]!=',')
{
readIndex++;
}
if(respDataBuf[readIndex]==',')
readIndex++;
if(respDataBuf[readIndex]=='\0'
|| respDataBuf[readIndex]==')')
readIndex--;
return true;
}
bool Rs232Module::IsNumber(char *ptr)
{
int len = strlen(ptr);
for(int i =0; i<len; i++)
{
if( (*(ptr+i) < '0')
|| (*(ptr+i) > '9')
)
{
return false;
}
}
return true;
}
bool Rs232Module::GetLstString(char *ptr, int& wi, ATParamElem& elem)
{
ATParamElem elemLocal;
readIndex++; // Skip "
wi = 0;
while(respDataBuf[readIndex]!='"')
{
switch(respDataBuf[readIndex])
{
case '\0':
return false;
break;
default:
ptr[wi++] = respDataBuf[readIndex++];
break;
}
}
ptr[wi]='\0';
return true;
}
bool Rs232Module::GetStringToBuf(char *ptr, int& wi, const int size)
{
wi = 0;
readIndex++; // Skip one "
while(respDataBuf[readIndex]!='"')
{
switch(respDataBuf[readIndex])
{
case '\0':
return false;
break;
default:
ptr[wi++] = respDataBuf[readIndex++];
break;
}
if(readIndex>=size)
return false;
}
ptr[wi]='\0';
#ifdef SP_DEBUG
string tmpString((const char *)ptr, wi);
tmpString[wi]='\0';
TRACE("Rs232Module::GetStringToBuf(): %s\n", tmpString.c_str());
#endif
return true;
}
bool Rs232Module::UnsolicitedGetPdu(char *buf, const int bufLen, ATParamLst& lst)
{
ATParamElem elem;
if(lst.eleLst[0].str_value == "+CMT"
|| lst.eleLst[0].str_value == "+CBM"
|| lst.eleLst[0].str_value == "+CDS")
{
// Get pdu data to buffer
GetPdu(buf, bufLen);
// Set up elem
elem.type = AT_STRING;
elem.str_value = string(buf);
// Push to the elem to elemlst
lst.eleLst.push_back(elem);
}
return true;
}
bool Rs232Module::GetRawData(unsigned char &ch)
{
if( m_idxReadRawBuffer == m_iRead )
return false;
else
ch = rawchars[m_idxReadRawBuffer++];
return true;
}
void Rs232Module::SetCurCommand(unsigned char *ptr, int len)
{
memcpy(m_curCommand, ptr, len);
m_curCommand[len]='\0';
}
HANDLE Rs232Module::GetWriteEvent()
{
return m_hWriteEvt;
}
HANDLE Rs232Module::GetParserEvent()
{
return m_hParserEvt;
}
void Rs232Module::GetResult(ATResult& rt)
{
#ifdef SP_DEBUG
TRACE(" ----AP COPY DATA FROM PARSER \n");
#endif
rt = result;
}
void Rs232Module::SetCallBack(void(*unSolicitedFunc)(ATResult& result))
{
m_usc_cb = unSolicitedFunc;
}
void Rs232Module::SetExpectString(string command)
{
result.expectedCommand=command;
#ifdef SP_LEVEL1
TRACE("Expected Command: %s\n", command.c_str());
#endif
}
bool Rs232Module::AnalyingRespString()
{
int size = strlen(respDataBuf);
char tmp[1024];
int tmpWI =0;
bool ignoreWhiteSpace = false;
string endString;
string command = "";
bool stag = false;
bool getDbQEmptyString=false;
ATParamElem elem;
ATParamLst paraLst;
readIndex =0;
#ifdef T_DEBUG
string tmpStr(respDataBuf, size);
tmpStr[size]='\0';
TRACE("PARSER: [Entire resp] %s\n", tmpStr.c_str());
#endif
while(readIndex!=(size+1) && !m_bReset)
{
if(::WaitForSingleObject( m_hResetEvt, 0) == WAIT_OBJECT_0)
{
#ifdef SP_LEVEL1
TRACE("\t\t\t\tAnalyingRespString(): exit by reset event\n");
#endif
break;
}
switch(respDataBuf[readIndex])
{
case '\0':
tmp[tmpWI] = '\0';
if (command.empty())
command = tmp;
else
endString = tmp;
if(command == "> ")
{
tmp[0]='\0';
}
else if(command == "OK"
|| command == "ERROR"
|| command == "CONNECT"
)
{
// Just fill the data to the result structure
result.result = AT_SUCCESS;
elem.type = AT_STRING;
elem.str_value = command;
paraLst.eleLst.push_back(elem);
result.resultLst.push_back(paraLst);
Sync();
tmp[0]='\0';
}
else if(command == "+CME ERROR"
|| command == "+CMS ERROR")
{
ATParamElem telem;
telem.type = AT_INTEGER;
telem.int_value = atoi(tmp);
paraLst.eleLst.push_back(telem);
result.result = AT_SUCCESS;
result.resultLst.push_back(paraLst);
#ifdef SPSP_DEBUG
cout << "result in parser: \n";
cout << result << endl;
#endif
tmp[0] = '\0';
Sync();
}
else if(IsUnsolicited(command, paraLst))
{
//Check if current paraLst is a unsolicited command
// Call the unsolicited call back function to notify
// upper layer.
if(sizeof(tmp)!=0)
GetParam(tmp, paraLst, false);
UnsolicitedGetPdu(tmp, 2047, paraLst);
unsolicitedRt.result = AT_SUCCESS;
unsolicitedRt.resultLst.push_back(paraLst);
#ifdef SPSP_DEBUG
cout << "result in parser: \n";
cout << result << endl;
#endif
m_usc_cb(unsolicitedRt);
CleanResult(unsolicitedRt);
}
else if(command == result.expectedCommand )
{
// Get the pdu block and push it the the parameter list
if((strlen(tmp)!=0 )
|| (getDbQEmptyString == true))
GetParam( tmp, paraLst, stag);
if(pduFlag)
{
// Get PDU
TRACE(_T("PARSER: Get PDU\n"));
GetPduToBuf();
// Put to parameter list
elem.type = AT_STRING;
elem.str_value = string(m_pduBuf);
paraLst.eleLst.push_back(elem);
pduFlag = false;
}
result.resultLst.push_back(paraLst);
}
else
{
TRACE(_T("~~~~~~ONE COMMAND IS SKIPPED!\n"));
}
break;
case ',':
tmp[tmpWI]='\0';
GetParam( tmp, paraLst, stag);
tmpWI = 0;
stag = false;
ignoreWhiteSpace = true;
break;
case ':':
#ifdef SP_LEVEL1
TRACE("+EFSL: 'XXXXXX' STEP 1\n");
#endif
tmp[tmpWI]='\0';
ignoreWhiteSpace = true;
readIndex++; // skip ':'
command = tmp;
elem.type = AT_STRING;
elem.str_value = string(command);
paraLst.eleLst.push_back(elem);
tmpWI = 0; // clear tmp
break;
case '(':
GetList(tmp, tmpWI, elem);
paraLst.eleLst.push_back(elem);
elem.paramLst.clear();
SkipComma(respDataBuf, readIndex, size);
tmp[0]='\0';
break;
case '"':
#ifdef SP_LEVEL1
TRACE("+EFSL: 'XXXXXX' STEP 2\n");
#endif
if(!GetStringToBuf(tmp, tmpWI, (size+1)))
{
TRACE(_T("**********+EFSL: 'XXXXXX' STEP 3\n"));
return false;
}
if(strlen(tmp)==0)
getDbQEmptyString = true;
stag = true;
break;
default:
if(ignoreWhiteSpace == false)
{
tmp[tmpWI++] = respDataBuf[readIndex];
}
else
{
if(respDataBuf[readIndex]!=' ')
{
ignoreWhiteSpace = false;
tmpWI = 0;
tmp[tmpWI++] = respDataBuf[readIndex];
}
}
break;
}
readIndex++;
}
return true;
}
void Rs232Module::Sync()
{
#ifdef SP_LEVEL1
TRACE("Rs232Module::Sync() -----7\n");
#endif
// Check InProgressEvt to check if the result should be given up.
if(::WaitForSingleObject(m_hInProgressEvt, 0) == WAIT_TIMEOUT)
{
// No command is in progressing
#ifdef SP_LEVEL1
TRACE("\tNo Command In progressing, Skip the result of cancel.\n");
#endif
CleanResult(result);
return;
}
if( ::WaitForSingleObject( m_hResetEvt, 0)== WAIT_OBJECT_0)
{
#ifdef SP_LEVEL1
TRACE(">>>>>ResetInSync: so Clean Result<<<\n");
#endif
CleanResult(result);
return;
}
::SetEvent(m_hWriteEvt);
// Write command copy data in this time period
#ifdef T_DEBUG
if(result.resultLst.size()==0)
{
ASSERT(false);
}
#endif
::WaitForSingleObject(m_hParserEvt, INFINITE);
::ResetEvent(m_hParserEvt);
#ifdef T_DEBUG
if(result.resultLst.size()==0)
{
ASSERT(false);
}
#endif
CleanResult(result);
}
bool Rs232Module::IsUnsolicited(string cmd, ATParamLst& lst)
{
ATParamElem elem;
if( cmd == "RING" )
{
return true;
}
if(lst.eleLst.size()==0)
return false;
if(lst.eleLst[0].type != AT_STRING)
return false;
// Then handled unsolicited command is listed here
// This should take care of all the unsolicited command
// listed in spec.
if(
lst.eleLst[0].str_value == "RING"
|| lst.eleLst[0].str_value == "NO CARRIER"
|| lst.eleLst[0].str_value == "+CMT"
|| lst.eleLst[0].str_value == "+CBM"
|| lst.eleLst[0].str_value == "+CDS"
|| lst.eleLst[0].str_value == "+CMTI"
|| lst.eleLst[0].str_value == "+CBMI"
|| lst.eleLst[0].str_value == "+CDSI"
|| lst.eleLst[0].str_value == "+CLIP"
|| lst.eleLst[0].str_value == "+EADC"
|| lst.eleLst[0].str_value == "+GPIOS"
|| lst.eleLst[0].str_value == "+EKPDS"
|| lst.eleLst[0].str_value == "+BATS"
)
return true;
else
return false;
}
bool Rs232Module::GetParam(char *ptr, ATParamElem& elem, bool isString)
{
ATParamElem elemLocal;
if(isString)
{
elemLocal.type = AT_STRING;
elemLocal.str_value = string(ptr);
}
else
{
if(strlen(ptr)==0)
elemLocal.type = AT_OMIT;
if(IsNumber(ptr))
{
elemLocal.type = AT_INTEGER;
elemLocal.int_value = atoi(ptr);
}
else
{
elemLocal.type = AT_STRING;
elemLocal.str_value = string(ptr);
}
}
elem.paramLst.push_back(elemLocal);
return true;
}
bool Rs232Module::GetParam(char *ptr, ATParamLst& lst, bool isString)
{
ATParamElem elem;
if(isString)
{
elem.type = AT_STRING;
elem.str_value = string(ptr);
}
else
{
if(strlen(ptr)==0)
{
elem.type = AT_OMIT;
}
else
{
if(IsNumber(ptr))
{
elem.type = AT_INTEGER;
elem.int_value = atoi(ptr);
}
else
{
elem.type = AT_STRING;
elem.str_value = string(ptr);
}
}
}
lst.eleLst.push_back(elem);
return true;
}
HANDLE Rs232Module::GetInProgressEvent()
{
return m_hInProgressEvt;
}
HANDLE Rs232Module::GetCleanedEvent()
{
return m_hCleanedEvt;
}
HANDLE Rs232Module::GetCancelEvent()
{
return m_hCancelEvt;
}
void Rs232Module::CancelSync()
{
DWORD state;
#ifdef SP_LEVEL1
TRACE("Rs232Module::CancelSync() -- Enter\n");
TRACE("Rs232Module::CancelSync() -- m_ParserEvent HANDLE = %d\n", m_hParserEvt);
#endif
// Check InProgressEvt to check if the result should be given up.
state = ::WaitForSingleObject(m_hInProgressEvt, 0);
if(state == WAIT_TIMEOUT)
{
// No command is in progressing
#ifdef SP_LEVEL1
TRACE("\tNo Command In progressing, Skip the result of cancel.\n");
#endif
CleanResult(result);
return;
}
CleanResult(result);
//Setting the result to be AT_TIMEOUT
result.result = AT_TIMEOUT;
::SetEvent(m_hWriteEvt);
// Write command copy data in this time period
state = ::WaitForSingleObject(m_hParserEvt, INFINITE);
::ResetEvent(m_hParserEvt);
#ifdef SP_LEVEL1
TRACE("Rs232Module::CancelSync() -- Exit\n");
#endif
}
HANDLE Rs232Module::GetResetEvent()
{
return m_hResetEvt;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -