VOS_UINT32 ParseDCmdPreProc( VOS_UINT8 * pData, VOS_UINT16 usLen) { VOS_UINT16 usTmpLen = usLen; VOS_UINT8* pTmp = pData; VOS_UINT32 ulResult = AT_FAILURE; /* 为了规避LINUX下拨号命令中带有引号(ATDT"*99#")的问题,将引号去除 */ ScanQuateChar(pTmp, &usTmpLen); #if 0 if(AT_SUCCESS == atCheckMmiString(pTmp,usTmpLen)) /* 补充业务处理 */ { if(AT_FAILURE == At_CheckCharWell(pTmp[usTmpLen - 1])) /* 如果不是以#号结尾 */ { atScanDcmdModifier(pTmp,&usTmpLen); /* 扫描修饰符 */ /* 因为要把命令名拷贝到gstATCmdName.usCmdNameLen中以备命令匹配, 所以,把内容拷贝到参数列表的第一个缓存中*/ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pTmp, usTmpLen)) { return AT_CME_DIAL_STRING_TOO_LONG; } g_stATParseCmd.ucCmdFmtType = AT_BASIC_CMD_TYPE; /* 设置命令类型 */ g_stATParseCmd.ucCmdOptType = AT_CMD_OPT_SET_CMD_NO_PARA; /* 设置命令操作类型 */ g_stATParseCmd.stCmdName.usCmdNameLen = 1; g_stATParseCmd.stCmdName.aucCmdName[0] = 'D'; ulResult = AT_SUCCESS; } else { atScanDmcmdModifier(pTmp,&usTmpLen); /* 扫描修饰符 */ /* 因为要把命令名拷贝到gstATCmdName.usCmdNameLen中以备命令匹配, 所以,把内容拷贝到参数列表的第一个缓存中*/ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pTmp, usTmpLen)) { return AT_CME_DIAL_STRING_TOO_LONG; } ulResult = atParseDMCmd(pTmp,usTmpLen); /* 如果带分号 */ if(ulResult == AT_FAILURE) { return AT_ERROR; } } } else #endif { if(AT_SUCCESS == At_CheckCharWell(pTmp[usTmpLen - 1])) /* 如果不是以#号结尾 */ { atScanDmcmdModifier(pTmp,&usTmpLen); /* 扫描修饰符 */ /* 因为要把命令名拷贝到gstATCmdName.usCmdNameLen中以备命令匹配, 所以,把内容拷贝到参数列表的第一个缓存中*/ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pTmp, usTmpLen)) { return AT_CME_DIAL_STRING_TOO_LONG; } ulResult = atParseDMCmd(pTmp,usTmpLen); /* 如果带分号 */ if(ulResult == AT_FAILURE) { return AT_ERROR; } } else { if(AT_FAILURE == atCheckRightArrowStr(pTmp,usTmpLen)) { atScanDcmdModifier(pTmp,&usTmpLen); /* 扫描修饰符 */ } /* 因为要把命令名拷贝到gstATCmdName.usCmdNameLen中以备命令匹配, 所以,把内容拷贝到参数列表的第一个缓存中*/ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pTmp, usTmpLen)) { return AT_CME_DIAL_STRING_TOO_LONG; } ulResult = atParseDCmd(pTmp,usTmpLen); /* D命令 */ if(ulResult == AT_FAILURE) { return AT_ERROR; } } } return ulResult; }
VOS_UINT32 atParseExtendCmd( VOS_UINT8 * pData, VOS_UINT16 usLen) { AT_STATE_TYPE_ENUM curr_state = AT_NONE_STATE; /* 设置初始状态 */ AT_STATE_TYPE_ENUM new_state = AT_NONE_STATE; /* 设置初始状态 */ VOS_UINT8 *pucCurrPtr = pData; /* 指向当前正在处理的字符*/ VOS_UINT8 *pucCopyPtr = pData; /* 拷贝内容的起始指针 */ VOS_UINT16 usLength = 0; /* 记录当前已经处理的字符个数*/ /* 依次分析字符串中的每个字符*/ while(usLength++ < usLen) /* 依次比较每个字符 */ { curr_state = new_state; /* 当前状态设置为新状态*/ /* 根据当前处理的字符和当前状态查表得到新状态*/ new_state = atFindNextMainState(AT_E_CMD_MAIN_STATE_TAB,*pucCurrPtr,curr_state); switch(new_state) /* 状态处理*/ { case AT_E_CMD_NAME_STATE: /* 扩展命令名状态*/ if(curr_state != new_state) /* 新状态部分不等于当前状态*/ { g_stATParseCmd.ucCmdFmtType = AT_EXTEND_CMD_TYPE; /* 设置命令类型*/ g_stATParseCmd.ucCmdOptType = AT_CMD_OPT_SET_CMD_NO_PARA; /* 设置命令操作类型*/ pucCopyPtr = pucCurrPtr; /* 准备接收扩展类型命令名*/ } break; case AT_E_CMD_SET_STATE: /* AT扩展命令等号状态 */ /* 存储命令名到全局变量中 */ g_stATParseCmd.ucCmdOptType = AT_CMD_OPT_SET_PARA_CMD; /* 设置命令操作类型*/ g_stATParseCmd.stCmdName.usCmdNameLen = (VOS_UINT16)(pucCurrPtr - pucCopyPtr); if(g_stATParseCmd.stCmdName.usCmdNameLen < sizeof(g_stATParseCmd.stCmdName.aucCmdName)) { atRangeCopy(g_stATParseCmd.stCmdName.aucCmdName,pucCopyPtr,pucCurrPtr); } else { return AT_ERROR; /* 返回错误 */ } break; case AT_E_CMD_PARA_STATE: /* AT扩展命令参数状态 */ case AT_E_CMD_LEFT_QUOT_STATE: /* AT扩展命令左引号状态 */ if(curr_state != new_state) /* 新状态部分不等于当前状态*/ { pucCopyPtr = pucCurrPtr; /* 准备接收参数内容*/ } break; case AT_E_CMD_COLON_STATE: /* AT扩展命令逗号状态 */ if((curr_state != new_state) && (AT_E_CMD_SET_STATE != curr_state)) /* 新状态部分不等于当前状态*/ { /* 存储参数到全局变量中 */ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pucCopyPtr, (VOS_UINT16)(pucCurrPtr - pucCopyPtr))) { return AT_ERROR; } } else { /*连续两个逗号,参数不存在*/ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pucCopyPtr, 0)) { return AT_ERROR; } } break; case AT_E_CMD_READ_STATE: /* AT扩展命令查询参数状态 */ /* 存储命令名到全局变量中 */ g_stATParseCmd.stCmdName.usCmdNameLen = (VOS_UINT16)(pucCurrPtr - pucCopyPtr); if (g_stATParseCmd.stCmdName.usCmdNameLen < sizeof(g_stATParseCmd.stCmdName.aucCmdName)) { atRangeCopy(g_stATParseCmd.stCmdName.aucCmdName,pucCopyPtr,pucCurrPtr); } else { return AT_ERROR; /* 返回错误 */ } g_stATParseCmd.ucCmdOptType = AT_CMD_OPT_READ_CMD; /* 设置命令操作类型*/ break; case AT_E_CMD_TEST_STATE: /* AT扩展命令测试参数状态 */ g_stATParseCmd.ucCmdOptType = AT_CMD_OPT_TEST_CMD; /* 设置命令操作类型*/ break; case AT_BUTT_STATE: /* 无效状态 */ return AT_ERROR; /* 返回错误 */ default: break; } pucCurrPtr++; /* 继续分析下一个字符*/ } switch(new_state) /* 根据最后的状态判断*/ { case AT_E_CMD_PARA_STATE: /* AT扩展命令参数状态 */ case AT_E_CMD_RIGHT_QUOT_STATE: /* AT扩展命令右引号状态 */ /* 存储参数到全局变量中 */ if (ERR_MSP_SUCCESS != atfwParseSaveParam(pucCopyPtr, (VOS_UINT16)(pucCurrPtr - pucCopyPtr))) { return AT_ERROR; } break; case AT_E_CMD_NAME_STATE: /* AT扩展命令查询参数状态 */ /* 存储命令名到全局变量中 */ g_stATParseCmd.stCmdName.usCmdNameLen = (VOS_UINT16)(pucCurrPtr - pucCopyPtr); if (g_stATParseCmd.stCmdName.usCmdNameLen < sizeof(g_stATParseCmd.stCmdName.aucCmdName)) { atRangeCopy(g_stATParseCmd.stCmdName.aucCmdName,pucCopyPtr,pucCurrPtr); } else { return AT_ERROR; /* 返回错误 */ } g_stATParseCmd.ucCmdOptType = AT_CMD_OPT_SET_CMD_NO_PARA; /* 设置命令操作类型*/ break; case AT_E_CMD_COLON_STATE: /* AT命令后面跟有无参的逗号 */ if (ERR_MSP_SUCCESS != atfwParseSaveParam(pucCopyPtr, 0)) { return AT_ERROR; } break; case AT_E_CMD_SET_STATE: /* AT扩展命令等号状态 */ case AT_E_CMD_TEST_STATE: /* AT扩展命令查询参数状态 */ case AT_E_CMD_READ_STATE: /* AT扩展命令测试参数状态 */ break; default: return AT_ERROR; /* 返回错误*/ } return AT_SUCCESS; /* 返回正确*/ }
static VOS_UINT32 atParseDCmd( VOS_UINT8 * pData, VOS_UINT16 usLen) { AT_STATE_TYPE_ENUM curr_state = AT_NONE_STATE; /* 设置初始状态 */ AT_STATE_TYPE_ENUM new_state = AT_NONE_STATE; /* 设置初始状态 */ VOS_UINT8 *pucCurrPtr = pData; /* 指向当前正在处理的字符*/ VOS_UINT8 *pucCopyPtr = pData; /* 拷贝内容的起始指针 */ VOS_UINT16 usLength = 0; /* 记录当前已经处理的字符个数*/ /* 依次分析字符串中的每个字符*/ while( (usLength++ < usLen) && (g_stATParseCmd.ucParaIndex < AT_MAX_PARA_NUMBER)) /* 依次比较每个字符 */ { curr_state = new_state; /* 当前状态设置为新状态*/ /* 根据当前处理的字符和当前状态查表得到新状态*/ new_state = atFindNextMainState(AT_D_CMD_MAIN_STATE_TAB,*pucCurrPtr,curr_state); switch(new_state) /* 状态处理*/ { case AT_D_CMD_NAME_STATE: /* AT D命令命令名状态 */ g_stATParseCmd.ucCmdFmtType = AT_BASIC_CMD_TYPE; /* 设置命令类型*/ g_stATParseCmd.ucCmdOptType = AT_CMD_OPT_SET_CMD_NO_PARA; /* 设置命令操作类型*/ pucCopyPtr = pucCurrPtr; /* 准备接收D类型命令名*/ break; case AT_D_CMD_RIGHT_ARROW_STATE: /* AT D命令右箭头状态 */ case AT_D_CMD_DIALSTRING_STATE: /* AT D命令拨号字符串状态 */ if(curr_state != new_state) /* 新状态部分不等于当前状态*/ { g_stATParseCmd.stCmdName.usCmdNameLen = (VOS_UINT16)(pucCurrPtr - pucCopyPtr); if(g_stATParseCmd.stCmdName.usCmdNameLen < sizeof(g_stATParseCmd.stCmdName.aucCmdName)) { atRangeCopy(g_stATParseCmd.stCmdName.aucCmdName,pucCopyPtr,pucCurrPtr); } else { return AT_FAILURE; /* 返回错误 */ } pucCopyPtr = pucCurrPtr; /* 准备接收参数*/ } break; case AT_D_CMD_DIGIT_STATE: /* AT D命令数字状态 */ case AT_D_CMD_LEFT_QUOT_STATE: /* AT D命令左引号状态 */ case AT_D_CMD_CHAR_STATE: if(curr_state != new_state) /* 新状态部分不等于当前状态*/ { /* 存储参数到全局变量中 */ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pucCopyPtr, (VOS_UINT16)(pucCurrPtr - pucCopyPtr))) { return AT_FAILURE; } pucCopyPtr = pucCurrPtr; /* 准备接收下一个参数*/ } break; case AT_D_CMD_CHAR_I_STATE: /* AT D命令字符I状态 */ case AT_D_CMD_CHAR_G_STATE: /* AT D命令字符G状态 */ case AT_D_CMD_SEMICOLON_STATE: /* AT D命令分号状态 */ /* 存储参数到全局变量中 */ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pucCopyPtr, (VOS_UINT16)(pucCurrPtr - pucCopyPtr))) { return AT_FAILURE; } pucCopyPtr = pucCurrPtr; /* 准备接收下一个参数*/ break; case AT_BUTT_STATE: /* 无效状态 */ return AT_FAILURE; /* 返回错误 */ default: break; } pucCurrPtr++; /* 继续分析下一个字符*/ } switch(new_state) /* 根据最后的状态判断*/ { case AT_D_CMD_SEMICOLON_STATE: /* AT D命令分号状态 */ break; case AT_D_CMD_DIALSTRING_STATE: /* AT D命令拨号字符串状态 */ case AT_D_CMD_DIGIT_STATE: /* AT D命令数字状态 */ case AT_D_CMD_RIGHT_QUOT_STATE: /* AT D命令右引号状态 */ case AT_D_CMD_CHAR_G_STATE: /* AT D命令字符G状态 */ case AT_D_CMD_CHAR_I_STATE: /* AT D命令字符I状态 */ /* 存储参数到全局变量中 */ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pucCopyPtr, (VOS_UINT16)(pucCurrPtr - pucCopyPtr))) { return AT_FAILURE; } break; default: return AT_FAILURE; /* 返回错误*/ } return AT_SUCCESS; /* 返回正确*/ }
VOS_UINT32 atParseBasicCmd(VOS_UINT8 * pData, VOS_UINT16 usLen) { AT_STATE_TYPE_ENUM curr_state = AT_NONE_STATE; /* 设置初始状态 */ AT_STATE_TYPE_ENUM new_state = AT_NONE_STATE; /* 设置初始状态 */ VOS_UINT8 *pucCurrPtr = pData; /* 指向当前正在处理的字符*/ VOS_UINT8 *pucCopyPtr = pData; /* 拷贝内容的起始指针 */ VOS_UINT16 usLength = 0; /* 记录当前已经处理的字符个数*/ if(AT_FAILURE == atCheckBasicCmdName(*pucCurrPtr)) { return AT_ERROR; } /* 依次分析字符串中的每个字符*/ while( (usLength++ < usLen) && (g_stATParseCmd.ucParaIndex < AT_MAX_PARA_NUMBER)) /* 依次比较每个字符 */ { curr_state = new_state; /* 当前状态设置为新状态*/ /* 根据当前处理的字符和当前状态查表得到新状态*/ new_state = atFindNextMainState(AT_B_CMD_MAIN_STATE_TAB,*pucCurrPtr,curr_state); switch(new_state) /* 状态处理*/ { case AT_B_CMD_NAME_STATE: /* 基本命令名状态*/ if(curr_state != new_state) /* 新状态部分不等于当前状态*/ { g_stATParseCmd.ucCmdFmtType = AT_BASIC_CMD_TYPE; /* 设置命令类型*/ g_stATParseCmd.ucCmdOptType = AT_CMD_OPT_SET_CMD_NO_PARA; /* 设置命令操作类型*/ pucCopyPtr = pucCurrPtr; /* 准备接收基本类型命令名*/ } break; case AT_B_CMD_PARA_STATE: /* AT基本命令参数状态 */ if(curr_state != new_state) /* 新状态部分不等于当前状态*/ { /* 存储命令名到全局变量中 */ g_stATParseCmd.stCmdName.usCmdNameLen = (VOS_UINT16)(pucCurrPtr - pucCopyPtr); if(g_stATParseCmd.stCmdName.usCmdNameLen < sizeof(g_stATParseCmd.stCmdName.aucCmdName)) { atRangeCopy(g_stATParseCmd.stCmdName.aucCmdName,pucCopyPtr,pucCurrPtr); } else { return AT_FAILURE; /* 返回错误 */ } g_stATParseCmd.ucCmdOptType = AT_CMD_OPT_SET_PARA_CMD; /* 设置命令操作类型*/ pucCopyPtr = pucCurrPtr; /* 准备接收参数*/ } break; default: return AT_FAILURE; /* 返回错误 */ } pucCurrPtr++; /* 继续分析下一个字符*/ } switch(new_state) /* 根据最后的状态判断*/ { case AT_B_CMD_NAME_STATE: /* 基本命令名状态*/ /* 存储命令名到全局变量中 */ g_stATParseCmd.stCmdName.usCmdNameLen = (VOS_UINT16)(pucCurrPtr - pucCopyPtr); if(g_stATParseCmd.stCmdName.usCmdNameLen < sizeof(g_stATParseCmd.stCmdName.aucCmdName)) { atRangeCopy(g_stATParseCmd.stCmdName.aucCmdName,pucCopyPtr,pucCurrPtr); } else { return AT_FAILURE; /* 返回错误 */ } break; case AT_B_CMD_PARA_STATE: /* 基本命令名状态*/ /* 存储参数到全局变量中 */ if(ERR_MSP_SUCCESS != atfwParseSaveParam(pucCopyPtr, (VOS_UINT16)(pucCurrPtr - pucCopyPtr))) { return AT_FAILURE; } break; default: /* 其它错误状态*/ return AT_FAILURE; /* 返回错误 */ } return AT_SUCCESS; /* 返回正确*/ }