blob: 889cfa3bfcf290b9ac27230aec22f18e15bcde7c [file] [log] [blame]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include "cc_at.h"
#include "cc_main.h"
#define ZAT_INVALID_LEN -1
#define MSG_RETRY_NUM 4
#define MSG_RETRY_INTERVAL 50
static CHAR g_zCc_RecvBuf[ATMAIN_AT_BUF_LEN + 1] = {0};
/* ÔÚ×Ö·û´®ÖÐѰÕÒÆ¥ÅäµÄ×Ó´®£¬Ë«ÒýºÅÄÚµÄÄÚÈݳýÍâ */
static PSTR zCc_FindSubStr(const PSTR pStr, const PSTR pSubStr,const SINT32 strLen)
{
SINT32 subStrLen = 0;
BOOL bInSideQuote = FALSE; /* ±ê¼ÇÊÇ·ñÔÚË«ÒýºÅÄÚ */
UINT16 wIndex = 0;
PSTR pTmpStr = pStr;
if ((pStr == ZUFI_NULL) || (pSubStr == ZUFI_NULL) || (strLen <= 0))
{
return ZUFI_NULL;
}
subStrLen = (SINT32)strlen((CHAR *)pSubStr);
if (strLen < subStrLen)
{
return ZUFI_NULL;
}
for (wIndex=0; wIndex<((strLen-subStrLen)+1); wIndex++)
{
/* ÅжÏÊÇ·ñÔÚË«ÒýºÅÄÚ */
if (*pTmpStr == '"')
{
bInSideQuote = !bInSideQuote;
}
/* ×Ó´®±È½Ï */
if (!bInSideQuote && *pTmpStr == *pSubStr)
{
if (strncmp((CHAR *)pTmpStr, (CHAR *)pSubStr, (UINT32)subStrLen) == 0)
{
return pTmpStr;
}
}
pTmpStr++;
}
return ZUFI_NULL;
}
/* ´Óµ±Ç°×Ö·û´®ÖлñÈ¡ATÏìÓ¦×Ó´®£¬·µ»Ø×Ó´®³¤¶È */
static SINT32 zCc_GetSubAtStr(const PSTR pCurAtStr, PSTR pSubAtStr, SINT32 iDataLen, PSTR atRecvBuf)
{
PSTR pAtHead = ZUFI_NULL; /* ATÏìӦͷ²¿ */
PSTR pAtTail = ZUFI_NULL; /* ATÏìӦβ²¿ */
SINT32 iSubAtStrLen = ZAT_INVALID_LEN; /* ATÏìÓ¦×Ó´®³¤¶È */
SINT32 iFreeDataLen = ZAT_INVALID_LEN; /* δ½âÎöµÄATÏìÓ¦Êý¾Ý³¤¶È */
if ((pCurAtStr == ZUFI_NULL) || (pSubAtStr == ZUFI_NULL))
{
return ZAT_INVALID_LEN;
}
/* ÔÚATÏìÓ¦´®ÖÐËÑË÷ATÏìÓ¦¿ªÊ¼´¦µÄ"\r\n" */
iFreeDataLen = iDataLen - (pCurAtStr - atRecvBuf);
pAtHead = zCc_FindSubStr(pCurAtStr, (PSTR)"\r\n", iFreeDataLen);
if (pAtHead == ZUFI_NULL)
{
return ZAT_INVALID_LEN;
}
/* ÔÚATÏìÓ¦´®ÖÐËÑË÷ATÏìÓ¦½áÊø´¦µÄ"\r\n" */
pAtHead += 2;
iFreeDataLen = iDataLen - (pAtHead - atRecvBuf);
pAtTail = zCc_FindSubStr(pAtHead, (PSTR)"\r\n", iFreeDataLen);
if (pAtTail == ZUFI_NULL)
{
if (strlen((CHAR *)pAtHead) == 0)
{
return ZAT_INVALID_LEN;
}
else
{
pAtTail = pAtHead + strlen((CHAR *)pAtHead);
}
}
/* È¡³öÁ½¸ö"\r\n"Ö®¼äµÄATÏìÓ¦ */
iSubAtStrLen = pAtTail - pAtHead;
if ((iSubAtStrLen > 0) && (iSubAtStrLen < AT_CMD_MAX))
{
memcpy(pSubAtStr, pAtHead, (UINT32)iSubAtStrLen);
return iSubAtStrLen;
}
return iSubAtStrLen == 0? 0 : ZAT_INVALID_LEN;
}
static void skipWhiteSpace(char **p_cur)
{
if (*p_cur == NULL)
{
return;
}
while (**p_cur != '\0' && isspace(**p_cur))
{
(*p_cur)++;
}
}
char *strsep(char **stringp, const char *delim)
{
char *s;
const char *spanp;
int c, sc;
char *tok;
if ((s = *stringp) == NULL)
return (NULL);
for (tok = s;;) {
c = *s++;
spanp = delim;
do {
if ((sc = *spanp++) == c) {
if (c == 0)
s = NULL;
else
s[-1] = 0;
*stringp = s;
return (tok);
}
} while (sc != 0);
}
/* NOTREACHED */
}
void skipNextComma(char **p_cur)
{
if (*p_cur == NULL)
{
return;
}
while (**p_cur != '\0' && **p_cur != ',')
{
(*p_cur)++;
}
if (**p_cur == ',')
{
(*p_cur)++;
}
}
static char * nextTok(char **p_cur)
{
char *ret = NULL;
skipWhiteSpace(p_cur);
if (*p_cur == NULL)
{
ret = NULL;
}
else if (**p_cur == '"')
{
(*p_cur)++;
ret = (char*)strsep(p_cur, "\"");
skipNextComma(p_cur);
}
else
{
ret = (char*)strsep(p_cur, ",");
}
return ret;
}
SINT32 zCc_at_tok_start(char **p_cur)
{
if (*p_cur == NULL)
{
return -1;
}
// skip prefix
// consume "^[^:]:"
*p_cur = strchr(*p_cur, ':');
if (*p_cur == NULL)
{
return -1;
}
(*p_cur)++;
return 0;
}
/**
* Parses the next integer in the AT response line and places it in *p_out
* returns 0 on success and -1 on fail
* updates *p_cur
* "base" is the same as the base param in strtol
*/
static SINT32 zCc_at_tok_nextint_base(char **p_cur, SINT32 *p_out, SINT32 base, SINT32 uns)
{
char *ret;
if (*p_cur == NULL)
{
return -1;
}
ret = nextTok(p_cur);
if (ret == NULL)
{
return -1;
}
else
{
long l;
char *end;
errno = 0;// kw CXX.ERRNO.NOT_CHECKED
if (uns)
{
l = strtoul(ret, &end, base);
}
else
{
l = strtol(ret, &end, base);
}
if (errno == ERANGE)// kw CXX.ERRNO.NOT_CHECKED
{
zte_log_append(__FILE__, __LINE__, "strtoul errno %d: %s\n", errno, strerror(errno));
}
*p_out = (SINT32) l;
if (end == ret)
{
return -1;
}
}
return 0;
}
/**
* Parses the next base 10 integer in the AT response line
* and places it in *p_out
* returns 0 on success and -1 on fail
* updates *p_cur
*/
SINT32 zCc_at_tok_nextint(char **p_cur, SINT32 *p_out)
{
return zCc_at_tok_nextint_base(p_cur, p_out, 10, 0);
}
int zCcApp_EncAtReqCcfc(char* ptMsgBuf)
{
int Fd ;
char AtCmdBuf[512] = {0};
int AtLen;
zCcApp_SetAtChnlCmdId(CC_APP_AT_CMD_REQ_SET_CCFC);
sprintf(AtCmdBuf, "%s",ptMsgBuf);
AtLen = strlen(AtCmdBuf);
Fd = zCcApp_GetAtCmdFd();
return zCcApp_PortSend(Fd,AtCmdBuf,AtLen);
}
int zCcApp_EncAtReqClck(char* ptMsgBuf)
{
int Fd ;
char AtCmdBuf[512] = {0};
int AtLen;
zCcApp_SetAtChnlCmdId(CC_APP_AT_CMD_REQ_SET_CLCK);
sprintf(AtCmdBuf, "%s",ptMsgBuf);
AtLen = strlen(AtCmdBuf);
Fd = zCcApp_GetAtCmdFd();
return zCcApp_PortSend(Fd,AtCmdBuf,AtLen);
}
int zCcApp_EncAtReqD(char* ptMsgBuf)
{
int Fd ;
char AtCmdBuf[512] = {0};
int AtLen;
zCcApp_SetAtChnlCmdId(CC_APP_AT_CMD_REQ_D);
sprintf(AtCmdBuf, "%s",ptMsgBuf);
AtLen = strlen(AtCmdBuf);
Fd = zCcApp_GetAtCmdFd();
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCcApp_EncAtReqD:AtcmdMsg = %s\n",__FUNCTION__,AtCmdBuf);
return zCcApp_PortSend(Fd,AtCmdBuf,AtLen);
}
int zCcApp_EncAtReqA(VOID)
{
int Fd ;
char AtCmdBuf[512] = {0};
int AtLen;
zCcApp_SetAtChnlCmdId(CC_APP_AT_CMD_REQ_A);
sprintf(AtCmdBuf, "ATA\r\n");
AtLen = strlen(AtCmdBuf);
/*·¢ËÍ*/
Fd = zCcApp_GetAtCmdFd();
return zCcApp_PortSend(Fd,AtCmdBuf,AtLen);
}
int zCcApp_EncAtReqChup(void)
{
int Fd ;
char AtCmdBuf[512] = {0};
int AtLen;
zCcApp_SetAtChnlCmdId(CC_APP_AT_CMD_REQ_CHUP);
sprintf(AtCmdBuf, "AT+CHUP\r\n");
AtLen = strlen(AtCmdBuf);
Fd = zCcApp_GetAtCmdFd();
return zCcApp_PortSend(Fd,AtCmdBuf,AtLen);
}
int zCcApp_EncAtReqVts(char *ptMsgBuf)
{
int Fd ;
char AtCmdBuf[512] = {0};
int AtLen;
zCcApp_SetAtChnlCmdId(CC_APP_AT_CMD_REQ_VTS);
sprintf(AtCmdBuf, "%s",ptMsgBuf);
AtLen = strlen(AtCmdBuf);
/*·¢ËÍ*/
Fd = zCcApp_GetAtCmdFd();
return zCcApp_PortSend(Fd,AtCmdBuf,AtLen);
}
int zCcApp_EncAtReqImsPlus(char *ptMsgBuf)
{
int Fd ;
char AtCmdBuf[512] = {0};
int AtLen;
zCcApp_SetAtChnlCmdId(CC_APP_AT_CMD_REQ_IMSPLUS);
sprintf(AtCmdBuf, "%s", ptMsgBuf);
AtLen = strlen(AtCmdBuf);
/*·¢ËÍ*/
Fd = zCcApp_GetAtCmdFd();
return zCcApp_PortSend(Fd,AtCmdBuf,AtLen);
}
int zCcApp_EncAtReqChld(char *AtcmdMsg)
{
int Fd ;
int AtLen;
zCcApp_SetAtChnlCmdId(CC_APP_AT_CMD_REQ_SET_CHLD);
AtLen = strlen(AtcmdMsg);
/*·¢ËÍ*/
Fd = zCcApp_GetAtCmdFd();
return zCcApp_PortSend(Fd,AtcmdMsg,AtLen);
}