zte's code,first commit
Change-Id: I9a04da59e459a9bc0d67f101f700d9d7dc8d681b
diff --git a/ap/app/ccapp/cc_at.c b/ap/app/ccapp/cc_at.c
new file mode 100755
index 0000000..889cfa3
--- /dev/null
+++ b/ap/app/ccapp/cc_at.c
@@ -0,0 +1,384 @@
+#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);
+}
+