[Feature][R306BR][task-view-1592][voice] add call time dial time call hold call lock hotline base

Change-Id: I496d7b4c1b68e57b72b8248a7ad53e694c171f68
diff --git a/lynq/R306BR/ap/app/ccapp/cc_proc.c b/lynq/R306BR/ap/app/ccapp/cc_proc.c
new file mode 100755
index 0000000..1bb29a3
--- /dev/null
+++ b/lynq/R306BR/ap/app/ccapp/cc_proc.c
@@ -0,0 +1,3889 @@
+/**************************************************************************

+*

+*                  Copyright (c) 2013 ZTE Corporation.

+*

+***************************************************************************

+* Ä£ ¿é Ãû : CcApp

+* ÎÄ ¼þ Ãû : at_proc.c

+* Ïà¹ØÎļþ :

+* ʵÏÖ¹¦ÄÜ : ATÃüÁî·¢Ëͺͽá¹û´¦ÀíÄ£¿éº¯Êý¶¨Òå

+* ×÷    Õß : syx

+* °æ    ±¾ : V1.0

+* Íê³ÉÈÕÆÚ : 2013-01-05

+* ÆäËü˵Ã÷ :

+**************************************************************************/

+

+/**************************************************************************

+* Ð޸ļǼ :

+***************************************************************************/

+/**************************************************************************

+* Ð޸ıàºÅ : 0001

+* ÐÞ ¸Ä ÈË :

+* ÐÞ¸ÄÈÕÆÚ :

+* ÐÞ¸ÄÄÚÈÝ :

+**************************************************************************/

+

+/**************************************************************************

+* #includeÇø

+**************************************************************************/

+#include "cc_main.h"

+#include "cc_proc.h"

+#include "cc_com.h"

+#include "cc_at.h"

+#include "cc_timer.h"

+#include "string.h"

+#ifdef TEST_CCAPP

+#include "soft_timer.h"

+#endif

+

+#include "slic_inf.h"

+#include <stdint.h>

+#include <linux/volte_drv.h>

+#include "voice_lib.h"

+

+#define LOCAL_TEST_CALL_CODE "*#66*#"

+#define TZ_TEST_TIMING "*#83781234*#"

+typedef enum{

+	LocalTestCallST_None = 0,

+	LocalTestCallST_Start,

+	LocalTestCallST_Ring,

+	LocalTestCallST_End

+}eLocalTestCallST;

+int local_test_call_st = 0;

+typedef enum{

+	LocalTestCallType_None = 0,

+	LocalTestCallType_LOOP

+}eLocalTestCallType;

+int local_test_call_type = 0;

+

+extern SINT32 g_zCc_AtRspId;

+

+int zCc_find_held_cid(void);

+int zCc_find_held_incoming_cid(void);

+int zCc_find_all_callout(int slave[ZCC_SLAVES]);

+int zCc_talking_count(void);

+char *get_local_date_time(void);

+char *get_local_datetime(char *buff);

+

+

+/**************************************************************************

+* ³£Á¿¶¨ÒåÇø

+**************************************************************************/

+

+/*  {

+    ZCC_S_IDLE_S        = 0,

+    ZCC_S_DT_S           ,

+    ZCC_S_DACCM_S    ,

+    ZCC_S_DIALING_S  ,

+    ZCC_S_RINGBACK_S   ,// Ö÷½Ð¹ý³ÌÖеÄÕñÁå̬

+    ZCC_S_BSYT_S       ,

+    ZCC_S_TKYT_S       ,

+    ZCC_S_SIL_S        ,

+    ZCC_S_TALKING_S    ,

+    ZCC_S_TRYING_S     ,

+    ZCC_S_WAIT_RESOURCE_S ,

+} */

+const pCcSlaveFsmFunc zCcSlaveFsmFunc[] = {zCc_SIdleState, 

+                                                                   zCc_SDtState, 

+                                                                   zCc_SDaccmState, 

+                                                                   zCc_SDialingState, 

+                                                                   zCc_SRingbackState,

+                                                                   zCc_SBsyToneState, 

+                                                                   zCc_STkytState, 

+                                                                   zCc_SSilState, 

+                                                                   zCc_STalkingState, 

+                                                                   zCc_STryingState,

+                                                                   zCc_SWaitResourceState

+                        };

+    /*

+    CB

+        *54*KSSSS#     REGISTER         AT+CLCK="AO",1,"SSSS"

+        #54*KSSSS#     DeREGISTER      AT+CLCK="AO",0,"SSSS"

+        *#54#              QUERY/CHECK    AT+CLCK="AO",2,"SSSS"            not supported---------------------------

+        K=1 "AO"; K=2 or K=3 "OI"(ÒÆ¶¯ÍøÃ»ÓйúÄÚ³¤Í¾ÏÞÖÆÒµÎñ); SSSS password

+        *56#     REGISTER         AT+CLCK="AI",1,"SSSS"    ÐèÒªÖÕ¶Ë·½°¸»ò¸Ä²Ù×÷·½Ê½---------------------------

+        #56#     DeREGISTER      AT+CLCK="AI",0,"SSSS"              ---------------------------

+    CFU

+        *57*DN#     REGISTER         AT+CCFC=0,1,"DN"

+        #57#          DeREGISTER      AT+CCFC=0,0

+        *#57*DN#   AT+CCFC=0,2            not supported---------------------------

+    CFNRy

+        *41*DN#     REGISTER         AT+CCFC=2,1,"DN"

+        #41#          DeREGISTER      AT+CCFC=2,0

+        *#41*DN#   AT+CCFC=2,2            not supported---------------------------

+    CFB

+        *40*DN#     REGISTER         AT+CCFC=1,1,"DN"

+        #40#          DeREGISTER      AT+CCFC=1,0

+        *#40*DN#   AT+CCFC=1,2            not supported---------------------------

+    CW ( ÖÕ¶Ë·½°¸´ý¼Ó )

+        *58#     REGISTER         AT+CCWA=0,1 ---------------------------

+        #58#     DeREGISTER      AT+CCWA=0,0 ---------------------------

+    */

+static const T_zCc_ScTab g_zCc_SCTab[] = 

+{

+    {ZCC_BAOC_REG, 10, 10,         "*54*1"},

+    {ZCC_BAOC_DEREG, 10, 10,         "#54*1"},

+    {ZCC_BOIC_REG, 10, 10,         "*54*2"},

+    {ZCC_BOIC_DEREG, 10, 10,         "#54*2"},

+    {ZCC_BOIC_REG, 10, 10,         "*54*3"},

+    {ZCC_BOIC_DEREG, 10, 10,         "#54*3"},

+    {ZCC_CFU_REG, 6, SC_MAXLEN,          "*57*"},

+    {ZCC_CFU_DEREG, 4, 4,            "#57#"},

+    {ZCC_CFNRY_REG, 6, SC_MAXLEN,          "*41*"},

+    {ZCC_CFNRY_DEREG, 4, 4,            "#41#"},

+    {ZCC_CFB_REG, 6, SC_MAXLEN,          "*40*"},

+    {ZCC_CFB_DEREG, 4, 4,            "#40#"},

+};

+

+

+

+T_CC_APP_RecvAtIndItem gCcAppRecvAtIndProc[]=

+{

+    {MSG_CMD_DSCI_IND, zCc_RecvDsciInd},     

+    {MSG_CMD_ZCPI,zCc_RecvZcpiInd}, 

+    {MSG_CMD_ZIMSPLUS_IND,zCc_RecvImsplusInd},

+    {MSG_CMD_ZVOICECHNL,zCc_RecvZvoiceChnl},

+    {MSG_CMD_ATD_DIAL_RSP,zCc_RecvRsp},

+    {MSG_CMD_ATA_RSP,zCc_RecvRsp},

+    {MSG_CMD_CHUP_RSP,zCc_RecvRsp},

+    {MSG_CMD_VTS_RSP,zCc_RecvRsp},

+    {MSG_CMD_ZIMSPLUS_RSP,zCc_RecvRsp},

+    {MSG_CMD_CLCK_RSP,zCc_RecvRsp},

+    {MSG_CMD_CCFC_RSP,zCc_RecvRsp},

+    {MSG_CMD_CHLD_RSP,zCc_RecvRsp}

+};

+ T_CC_APP_AtIndProcItem gCcAppAtIndProc[]=

+{

+    {MSG_CMD_DSCI_IND, zCc_DsciIndProc},     

+    {MSG_CMD_ZCPI,zCc_ZcpiIndProc}, 

+    {MSG_CMD_ZIMSPLUS_IND,zCc_ZimsplusProc},

+    {MSG_CMD_ZVOICECHNL,zCc_ZvoicechnlProc}

+};

+

+

+SINT32 gCcAppRecvAtIndProcCnt = sizeof(gCcAppRecvAtIndProc)/sizeof(gCcAppRecvAtIndProc[0]);

+SINT32 gCcAppRecvAtIndCnt = sizeof(gCcAppAtIndProc)/sizeof(gCcAppAtIndProc[0]);

+char g_zCcApp_AtRecvBuf[ZCC_APP_AT_BUF_MAX_LEN+1] = {0};

+T_zCc_CurAtCmdInfo * g_Cc_AtIndRspMsg;

+

+VOID zCc_ShowAllSlave(VOID)

+{

+    UINT8   slave = 0;

+

+    for (slave = 0; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        ccapp_log(" slave=%d number=%s cid=%d state=%d tone=%d msg=%d held=%d isOut=%d dsci6=%d",

+            slave,

+            g_Cc_CallDetail.slaveObj[slave].number,

+            g_Cc_CallDetail.slaveObj[slave].cid,

+            g_Cc_CallDetail.slaveObj[slave].state,

+            g_Cc_CallDetail.slaveObj[slave].tone,

+            g_Cc_CallDetail.slaveObj[slave].sMsg,

+            g_Cc_CallDetail.slaveObj[slave].heldcall,

+            g_Cc_CallDetail.slaveObj[slave].is_callout,

+            g_Cc_CallDetail.slaveObj[slave].waitDSCI6);

+    }

+}

+

+VOID zCc_ShowAllSlaveWithTips(const char *tips)

+{

+

+    UINT8   slave = 0;

+

+    for (slave = 0; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        printf/*ccapp_log*/("%s master_state=%d\n        slave=%d number=%s cid=%d state=%d tone=%d msg=%d held=%d isOut=%d dsci6=%d",

+            tips, g_Cc_CallDetail.state, 

+            slave,

+            g_Cc_CallDetail.slaveObj[slave].number,

+            g_Cc_CallDetail.slaveObj[slave].cid,

+            g_Cc_CallDetail.slaveObj[slave].state,

+            g_Cc_CallDetail.slaveObj[slave].tone,

+            g_Cc_CallDetail.slaveObj[slave].sMsg,

+            g_Cc_CallDetail.slaveObj[slave].heldcall,

+            g_Cc_CallDetail.slaveObj[slave].is_callout,

+            g_Cc_CallDetail.slaveObj[slave].waitDSCI6);

+    }

+}

+

+

+VOID zCc_CheckSlaveState(const char *tips)

+{

+    UINT8   slave = 0;

+

+    if(g_Cc_CallDetail.old_state != g_Cc_CallDetail.state)

+    {

+        ccapp_log("=========== %s =============\n           master state %d --> %d",

+            tips,

+            g_Cc_CallDetail.old_state,

+            g_Cc_CallDetail.state);

+        g_Cc_CallDetail.old_state = g_Cc_CallDetail.state;

+    }

+

+    for (slave = 0; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        if(g_Cc_CallDetail.slaveObj[slave].old_state != g_Cc_CallDetail.slaveObj[slave].state)

+        {

+            ccapp_log("=========== %s =============\n           slave=%d state %d --> %d",

+                tips,

+                slave,

+                g_Cc_CallDetail.slaveObj[slave].old_state,

+                g_Cc_CallDetail.slaveObj[slave].state);

+                

+            g_Cc_CallDetail.slaveObj[slave].old_state = g_Cc_CallDetail.slaveObj[slave].state;

+        }

+    }

+}

+

+

+VOID zCc_ClearDigits(VOID)

+{

+    g_Cc_CallDetail.dCount = 0;

+    memset(g_Cc_CallDetail.digits, 0, sizeof(g_Cc_CallDetail.digits));

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ClearDigits: digits cleared\n",__FUNCTION__);

+}

+

+VOID zCc_InitSlaveObj(UINT8   slave)

+{

+    memset(&g_Cc_CallDetail.slaveObj[slave], 0, sizeof(T_zCc_SlaveObj));

+    if (slave == g_Cc_CallDetail.ringCid)

+    {

+        g_Cc_CallDetail.ringCid = 0;

+    }

+}

+

+UINT8 zCc_TalkingCall(UINT8 heldcall)

+{

+    UINT8   slave = 0, cnt = 0;

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_TALKING_S 

+            && g_Cc_CallDetail.slaveObj[slave].heldcall == heldcall

+            && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+        {

+            cnt++;

+        }

+    }

+

+    return cnt;

+}

+

+UINT8 zCc_GetWaitDisc6Slave(VOID)

+{

+    UINT8   slave = 0, cnt = 0;

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 1)

+        {

+            cnt++;

+        }

+    }

+    return cnt;

+}

+

+UINT8 zCc_BusyToneAllowed(VOID)

+{

+    UINT8   slave = 0, cnt = 0;

+

+    for (slave = 0; slave < ZCC_SLAVES; slave++) 

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state != ZCC_S_IDLE_S )

+        {

+            cnt++;

+        }

+    }

+    if ((1 == cnt)//µ±Ç°Ã»ÓÐÆäËûºô½Ð

+        ||(cnt == 2 && g_Cc_CallDetail.ringCid !=0 

+          && g_Cc_CallDetail.slaveObj[g_Cc_CallDetail.ringCid].state == ZCC_S_TRYING_S

+          && g_Cc_CallDetail.slaveObj[g_Cc_CallDetail.ringCid].tone != ZCC_TONE_CIDCW_A)//Õª»ú̬»¹ÓÐÀ´µçÇÒδ·ÅÒô

+        ||(cnt == zCc_GetWaitDisc6Slave()+1))//ÆäËûºô½Ð¶¼ÊÇÔÚµÈdsci6µÄ

+    {

+        return 1;

+    }

+    else  

+    {

+        return 0;

+    }

+    

+}

+

+UINT8 zCc_ActiveCall(VOID)

+{

+    return zCc_TalkingCall(0);

+}

+

+UINT8 zCc_HeldCall(VOID)

+{

+    return zCc_TalkingCall(1);

+}

+

+UINT8 zCc_GetSpecSlave(UINT8 state)

+{

+    UINT8   slave = 0;

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state == state && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+        {

+            return slave;

+        }

+    }

+    return 0;

+}

+

+UINT8 zCc_GetSpecSlaveIgnoreWaitDSCI6(UINT8 state)

+{

+    UINT8   slave = 0;

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state == state)

+        {

+            return slave;

+        }

+    }

+    return 0;

+}

+

+UINT8 zCc_Find_waitDSCI6_cid(void)

+{

+    UINT8   slave = 0;

+

+	for (slave = 1; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state!=ZCC_S_IDLE_S &&

+        	g_Cc_CallDetail.slaveObj[slave].waitDSCI6!=0)

+        {

+            return slave;

+        }

+    }

+    return 0;

+}

+

+

+

+

+UINT8 zCc_GetDialingSlave(UINT8 waitDSCI6)

+{

+    UINT8   slave = 0;

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_DIALING_S )

+        {

+            if (waitDSCI6)

+            {

+                if (g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+                {

+                    return slave;

+                }

+            }

+            else

+            {

+                return slave;

+            }

+        }

+    }

+    return 0;

+}

+

+UINT8 zCc_GetDiscSlave(UINT8 state)

+{

+    UINT8   slave = 0;

+    UINT8   cnt = 0;

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].sMsg== ZCC_SDISCN_M && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+        {

+             cnt++;

+        }

+    }

+    return cnt;

+}

+

+

+int  tz_lock_cellid_is_limit_callin()

+{

+	char cellid_is_lock[4] = {0};

+

+	cfg_get_item("cellid_is_lock",cellid_is_lock,sizeof(cellid_is_lock));

+	if(strcmp(cellid_is_lock, "1") == 0)	

+		return 1;

+

+	return 0;

+}

+

+int tz_lock_cellid_check_sos_num()

+{

+	int ret = 0;

+	char tz_Mexico_sos_lock_cellid[128] = {0};

+	

+	ret = strlen(g_Cc_CallDetail.digits);

+	cfg_get_item("tz_Mexico_sos_lock_cellid",tz_Mexico_sos_lock_cellid,sizeof(tz_Mexico_sos_lock_cellid));

+	if(ret > 0 && ((g_Cc_CallDetail.digits[ret-1] == '#') || (g_Cc_CallDetail.digits[ret-1] == 'T')))

+	{

+		return TRUE;

+	}

+	else if(strstr(tz_Mexico_sos_lock_cellid, g_Cc_CallDetail.digits) != NULL)

+	{

+		return TRUE;

+	}

+	else

+	{

+		return FALSE;

+	}

+	

+}

+

+extern int digit_map_call(char *num);

+/* µ±Ç°Ò»Â· ·Ç ±£³ÖµÄ ºô½Ð£¬FLASH£¬µ±Ç°ºô½Ð±»±£³Ö»òÊÍ·Å£¬digitsÖ»¼Ç¼Óû§²¦´òµÄºÅÂ룻

+ µ±Ç°Ò»Â· ·Ç ±£³ÖµÄ ºô½Ð£¬FLASH£¬µ±Ç°ºô½Ð±»»Ö¸´£»

+ ÆäËü³¡¾°ÐèÒªdigits ¼Ç¼ZCC_FLASH_SIGNºÍÓû§ ²¦´òµÄһλºÅÂë  */

+UINT8 zCc_DigitsMatch(VOID)

+{

+    UINT16  i  = 0;

+    UINT8   scSum = sizeof(g_zCc_SCTab)/sizeof(T_zCc_ScTab);

+

+    ccapp_log("zCc_DigitsMatch: digits=%s dCount=%d\n",g_Cc_CallDetail.digits,g_Cc_CallDetail.dCount);

+	if(tz_lock_cellid_is_limit_callin())

+	{

+		if(tz_lock_cellid_check_sos_num() == FALSE)

+			return ZCC_MATCHERR;

+	}

+	

+    if (g_Cc_CallDetail.dCount == 0)

+    {

+    	//ccapp_log("1");

+        return ZCC_NO_RESULT;

+	}

+	

+	if(g_Cc_CallDetail.dCount >= 2 && g_Cc_CallDetail.dCount<ZDIAL_NUM_MAX)

+	{

+		if(g_Cc_CallDetail.digits[0]!=ZCC_FLASH_SIGN &&

+			g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount-1]!=ZCC_TIMEOUT_SIGN)

+		{

+			printf("g_Cc_CallDetail.digits = %s\n",g_Cc_CallDetail.digits);

+	    	if(strcmp(LOCAL_TEST_CALL_CODE, g_Cc_CallDetail.digits)==0)

+	    	{

+	    		//ccapp_log("2");

+				local_test_call_type = LocalTestCallType_None;

+	    		return ZCC_LOCAL_TEST_CALL;

+	    	}

+	    	else if(strcmp(TZ_TEST_TIMING, g_Cc_CallDetail.digits)==0)

+	    	{

+	    		local_test_call_type = LocalTestCallType_LOOP;

+				return ZCC_LOCAL_TEST_CALL;

+	    	}

+	    }

+

+	    if(g_Cc_CallDetail.digits[0]=='*' && g_Cc_CallDetail.digits[1]=='#')

+	    {

+	    	//ccapp_log("3");

+	    	return ZCC_NO_RESULT;

+	    }

+	}

+

+	if(g_Cc_CallDetail.dCount>=ZDIAL_NUM_MAX)

+	{

+		//ccapp_log("4");

+		return ZCC_MATCHERR;

+	}

+	

+    if(digit_map_call(g_Cc_CallDetail.digits)!=0)

+    {

+    	ccapp_log("digit_map_call match %s", g_Cc_CallDetail.digits);

+    	return ZCC_CALL;

+	}

+    

+    if (g_Cc_CallDetail.digits[0] >= '0' && g_Cc_CallDetail.digits[0] <= '9')

+    {

+    	//ccapp_log("5");

+        return (g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount-1] == '#'

+                || g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount-1] == ZCC_TIMEOUT_SIGN

+                || g_Cc_CallDetail.dCount == ZDIAL_NUM_MAX)  ? ZCC_CALL : ZCC_NO_RESULT;

+    }

+

+    //ccapp_log("6");

+    if (g_Cc_CallDetail.digits[0] == ZCC_FLASH_SIGN) //ÖÁÉÙÓÐ2·ºô½ÐÁË

+    {

+        switch (g_Cc_CallDetail.digits[1])

+        {

+        case '0':

+            return ZCC_FLASH_0;

+        case '1':

+            return ZCC_FLASH_1;

+        case '2':

+        case ZCC_TIMEOUT_SIGN:

+            return ZCC_FLASH_2;

+        case '3':

+            return ZCC_FLASH_3;

+        case '4':

+            return ZCC_FLASH_4;    

+        default:

+            return ZCC_MATCHERR;

+        }

+    }

+

+    /*for (i = 0; i<scSum; i++)

+    {

+        if (strncmp((CHAR *)g_zCc_SCTab[i].sc, (CHAR *)g_Cc_CallDetail.digits, 

+            (UINT32)(strlen(g_zCc_SCTab[i].sc)<g_Cc_CallDetail.dCount)?strlen(g_zCc_SCTab[i].sc):g_Cc_CallDetail.dCount) == 0)

+        { 

+            if (g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount-1] == '#')

+            {

+                return g_zCc_SCTab[i].scName;

+            }

+            if (g_Cc_CallDetail.dCount < g_zCc_SCTab[i].scMaxLen)

+            {

+                return ZCC_NO_RESULT;

+            }

+            if (g_Cc_CallDetail.dCount == g_zCc_SCTab[i].scMaxLen)

+            {

+                return ZCC_MATCHERR;

+            }

+        }

+    }*/

+	

+    if(g_Cc_CallDetail.dCount>=2 && 

+    	g_Cc_CallDetail.dCount<ZDIAL_NUM_MAX &&

+    	g_Cc_CallDetail.digits[0]=='*')

+    {

+		if(g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount-1] == '#'

+                || g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount-1] == ZCC_TIMEOUT_SIGN)

+        {

+        	ccapp_log("match special code: %s", g_Cc_CallDetail.digits);

+			return ZCC_CALL;

+		}

+		else

+		{

+			//ccapp_log("8");

+			return ZCC_NO_RESULT;

+		}

+    }

+

+    //ccapp_log("9");

+    return ZCC_MATCHERR;

+}

+

+VOID zCc_DigitsMatchRltProc(UINT8   ret)

+{

+    UINT8   callCnt = 0, slave = 0;

+    SINT32  chldret = -1;

+

+    ccapp_log("ret=%d", ret);

+

+    slave = zCc_GetSpecSlave(ZCC_S_DACCM_S);

+    switch (ret)

+    {

+        case ZCC_NO_RESULT:

+            CreateSoftTimer(ZCCAPP_TIMER_DTMF_DETECT,

+                        0,

+                        ZCCAPP_TIMER_DTMF_INTERVAL,

+                        zCcApp_DtmfTimer,

+                        NULL);                    

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_DigitsMatchRltProc CreateSoftTimer zCcApp_DtmfTimer\n",__FUNCTION__);

+            return;

+            

+        case ZCC_CALL:

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SINV_M;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_DIALING_S;

+            if(g_Cc_CallDetail.digits[0]!='*' && (digit_map_call(g_Cc_CallDetail.digits)==0))

+            {

+	            g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount-1] = 0; 

+	            g_Cc_CallDetail.dCount--;

+            }

+            strcpy(g_Cc_CallDetail.slaveObj[slave].number, g_Cc_CallDetail.digits);

+            g_Cc_CallDetail.slaveObj[slave].is_callout = TRUE;

+            return;

+            

+        case ZCC_FLASH_1:

+            callCnt = zCc_CallCount();

+            if ((1 < callCnt) && (zCc_ActiveCall() == callCnt) )  // ¼Ç¼±¾´Î²Ù×÷ΪÕë¶Ôconf µÄ

+            {

+                chldret = zCc_SendAtChldReq(21);

+            }

+            else //if (1 < callCnt)

+            {

+    			slave = zCc_GetSpecSlave(ZCC_S_DIALING_S);

+    			if(slave)

+    			{

+    				ccapp_log("zCc_SendAtChldReq(%d) dialing", 10+slave);

+					chldret = zCc_SendAtChldReq(10+slave);

+					SLIC_Stop_Signal(0,TONE_SIGNAL);

+					g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+					g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+					break;

+    			}

+

+				slave = zCc_GetSpecSlave(ZCC_S_RINGBACK_S);

+    			if(slave)

+    			{

+    				ccapp_log("zCc_SendAtChldReq(%d) ringback", 10+slave);

+					chldret = zCc_SendAtChldReq(10+slave);

+					SLIC_Stop_Signal(0,TONE_SIGNAL);

+					g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+					g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+					break;

+    			}

+

+    			ccapp_log("zCc_SendAtChldReq(1)-");

+                chldret = zCc_SendAtChldReq(1);

+            }

+            break;

+            

+        case ZCC_FLASH_2:

+            chldret = zCc_SendAtChldReq(2);

+            break;

+            

+        case ZCC_FLASH_3:

+        	if(zCc_talking_count()==1 && zCc_GetSpecSlave(ZCC_S_TRYING_S))  

+			{

+				// talking + incoming, skip hookflash+3, do nothing

+			}

+			else

+            	chldret = zCc_SendAtChldReq(3);

+            break;

+

+        case ZCC_FLASH_4:

+        	if( zCc_CallCount()> 1)

+        	{

+	        	//system("at_cmd AT+ZTOR=2");

+	        	//zCcApp_send_message(MSG_CMD_ACTIVE_CALL_TRANSFER, 0, NULL);

+	        	//ccapp_log("send MSG_CMD_ACTIVE_CALL_TRANSFER");

+	        	chldret = zCc_SendAtChldReq(4); //AT+CHLD=4

+        	}

+        	else

+        		ccapp_log("skip at_cmd AT+ZTOR=2");

+        	break;

+            

+        case ZCC_FLASH_0://¾Ü½ÓÀ´µç£¬Í£Ö¹·ÅÒô£¬»Ö¸´ÓïÒô

+            SLIC_Stop_Signal(0,0);

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_DigitsMatchRltProc: SLIC_Stop_Signal <---\n",__FUNCTION__);

+            zCc_InitSlaveObj(0);

+            g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+            SLIC_Start_PCM();  

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_DigitsMatchRltProc: SLIC_Start_PCM <---\n",__FUNCTION__);

+            chldret = zCc_SendAtChldReq(0);

+            break;

+            

+        case ZCC_MATCHERR:

+            if (g_Cc_CallDetail.digits[0] != ZCC_FLASH_SIGN)

+            {

+                zCc_ClearDigits();

+                if (1 == zCc_BusyToneAllowed() && g_Cc_CallDetail.state == ZCC_M_SEIZE_S)//ÓÐÆäËûºô½Ðʱ²»·ÅæÒô

+                {

+                    CreateSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT,

+                                0,

+                                ZCCAPP_TIMER_BUSYTONE_INTERVAL,

+                                zCcApp_BusyToneTimer,

+                                NULL);              

+                    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_DigitsMatchRltProc CreateSoftTimer zCcApp_BusyToneTimer\n",__FUNCTION__);

+                    g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_BSY_A;

+                    g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_BSYT_S;

+                    g_Cc_CallDetail.slaveObj[slave].confcall = 0;

+                    g_Cc_CallDetail.slaveObj[slave].heldcall = 0;

+                }

+                else

+                {

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+                    zCc_InitSlaveObj(slave);

+                }

+                return;

+            }

+            break;

+            

+        default: 

+            if (ret >= ZCC_BAOC_REG && ret <= ZCC_CFB_DEREG)// SS slave=1

+            {

+                g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SINV_M;

+                g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_IDLE_S;//±ÜÃâºóÃæ¹Ò»ú»á·¢Æðchup

+            }

+            return;

+        }   

+

+        zCc_ClearDigits();

+        //zCc_InitSlaveObj(slave);

+}

+#if 0

+VOID zCc_PreProcRes(CHAR *pParaLine)

+{

+    SINT32  flg                                     = 0;

+    UINT32  i                                       = 0;

+    UINT32  length                                  = 0;

+    CHAR    *pSource                                = pParaLine;

+    CHAR    *pDest                                  = NULL;

+

+    CHAR    *pStrDestMalloc = (CHAR *)malloc(AT_CMD_MAX);

+    if (NULL == pStrDestMalloc)

+    {

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_PreProcRes: Malloc failed !!!\n",__FUNCTION__);

+        return;

+    }

+    memset(pStrDestMalloc, 0, AT_CMD_MAX); 

+

+    assert(pParaLine != NULL);

+    pDest = pStrDestMalloc;

+    length = strlen(pParaLine);

+    if (length == 0 || length >= ZAT_MAX_LEN)

+    {

+        free(pStrDestMalloc);

+        return;

+    }

+    for (i = 0; (i < length )&& (pDest - pStrDestMalloc < AT_CMD_MAX); i++)

+    {

+        if ('"' == *pSource)

+        {

+            flg = (0 == flg)?1:0;                           /* Ë«ÒýºÅ ɾ³ý  */

+            if ('"' == *(pSource + 1))                      /* ÐǺźóÃæ½ô¸úÐǺţ¬²åÈë¿Õ´®Õ¼Î»·û */

+            {

+                *pDest++ = (CHAR)ZAT_NULL_FILL;

+            }

+        }

+        else if ((',' == *pSource) && (0 == flg))

+        {

+            *pDest++ = ' ';                                 /* Ë«ÒýºÅÍâÃæµÄ¶ººÅ£¬Ìæ»»³É¿Õ¸ñ */

+            if (',' == *(pSource + 1))                       /* ¶ººÅºóÃæ½ô¸ú¶ººÅ£¬»òÕßÒÔ¶ººÅ½á⣬²åÈë¿Õ´®Õ¼Î»·û */

+            {

+                *pDest++ = '9';                             //±£Áô²ÎÊýÓÃ9ÔÝʱ´úÌæ

+            }

+            else if ('\0' == *(pSource + 1))                 /* ¶ººÅºóÃæ½ô¸ú¶ººÅ£¬»òÕßÒÔ¶ººÅ½á⣬²åÈë¿Õ´®Õ¼Î»·û */

+            {

+                *pDest++ = (CHAR)ZAT_NULL_FILL;

+            }

+        }

+        else if (('\r' == *pSource) ||('\n' == *pSource))

+        {

+            pSource++;

+        }

+        else

+        {

+            *pDest++ = ((' ' == *pSource) && (1 == flg))?(CHAR)ZAT_SPACE_REPLACE:((('\t' == *pSource) && (1 == flg))?(CHAR)ZAT_TAB_REPLACE:(*pSource));

+        }

+        pSource++;

+    }

+

+    memset(pParaLine, 0, length);                           /* ½«Ô¤´¦ÀíºóµÄÄÚÈÝ¿½±´»Ø²ÎÊýÐÐÖÐ */

+    strcpy(pParaLine, pStrDestMalloc);

+    free(pStrDestMalloc);

+}

+#endif

+UINT8 zCc_CallCount(VOID)

+{

+    UINT8   slave = 0, cnt = 0;

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++)

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state != ZCC_S_IDLE_S 

+            && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+            //&& !(g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 1

+              //&& g_Cc_CallDetail.slaveObj[slave].state ==ZCC_S_TRYING_S))

+        {

+            cnt++;

+        }

+    }

+

+    return cnt;

+}

+

+UINT8 zCc_FlashClearCall(VOID)

+{

+    UINT8   slave = 0, cnt = 0;

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++)

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_DACCM_S//Õª»úµ½atdÏ·¢Ç°

+            || g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_BSYT_S

+            || g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_TKYT_S

+            || g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_SIL_S//·ÅæÒô¡¢º¿ÃùÒô¡¢¾²Òô

+            && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+        {

+            zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+            cnt++;

+        }

+    }

+

+    return cnt;

+}

+

+UINT8 zCc_MoInactiveCall(VOID)

+{

+    UINT8   slave = 0, cnt = 0;

+

+    for (slave = 0; slave < ZCC_SLAVES; slave++)

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state > ZCC_S_IDLE_S 

+            && g_Cc_CallDetail.slaveObj[slave].state < ZCC_S_BSYT_S

+            && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+        {

+            cnt++;

+        }

+    }

+

+    return cnt;

+}

+UINT8 zCc_MoBeforDialingCall(VOID)

+{

+    UINT8   slave = 0, cnt = 0;

+

+    for (slave = 0; slave < ZCC_SLAVES; slave++)

+    {

+    	if (g_Cc_CallDetail.slaveObj[slave].state != ZCC_S_IDLE_S)

+    	{

+	    	ccapp_log("zCc_MoBeforDialingCall slave[%d]=%d", 

+	    		slave, 

+	    		g_Cc_CallDetail.slaveObj[slave].state); 

+		}

+		

+        if (g_Cc_CallDetail.slaveObj[slave].state > ZCC_S_IDLE_S

+	        && g_Cc_CallDetail.slaveObj[slave].state < ZCC_S_DIALING_S 

+            && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+        {

+            cnt++;

+        }

+    }

+

+    return cnt;

+}

+

+int zCc_GetMoBeforDialingCallCID(VOID)

+{

+    UINT8   slave = 0, cnt = 0;

+

+    for (slave = 0; slave < ZCC_SLAVES; slave++)

+    {

+    	if (g_Cc_CallDetail.slaveObj[slave].state != ZCC_S_IDLE_S)

+    	{

+	    	ccapp_log("zCc_GetMoBeforDialingCallCID slave[%d]=%d", 

+	    		slave, 

+	    		g_Cc_CallDetail.slaveObj[slave].state); 

+		}

+		

+        if (g_Cc_CallDetail.slaveObj[slave].state > ZCC_S_IDLE_S

+	        && g_Cc_CallDetail.slaveObj[slave].state < ZCC_S_DIALING_S 

+            && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+        {

+            return slave;

+        }

+    }

+

+    return -1;

+}

+

+

+int zCc_findCID_by_number(const char *number)

+{

+    UINT8   slave = 0, len = 0;

+    char slave_number[ZDIAL_NUM_MAX];

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++)

+    {

+    	if (g_Cc_CallDetail.slaveObj[slave].state != ZCC_S_IDLE_S)

+    	{

+	    	ccapp_log("zCc_findCID_by_number[%s] slave[%d]=%d num=%s", 

+	    		number,

+	    		slave, 

+	    		g_Cc_CallDetail.slaveObj[slave].state,

+	    		g_Cc_CallDetail.slaveObj[slave].number); 

+		}

+

+		strcpy(slave_number, g_Cc_CallDetail.slaveObj[slave].number);

+		len = strlen(slave_number);

+		if(len>0)

+		{

+    		if(slave_number[len-1]=='T')

+    		    slave_number[len-1]='\0';

+		}

+		   

+        if (strcmp(slave_number, number)==0)

+            return slave;

+    }

+

+    return 0;

+}

+

+int check_incoming_call_is_in_slave(MSG_BUF *ptMsgBuf)

+{

+	T_zCcApp_DsciInd tDiscInd = {0};

+    memcpy(&tDiscInd, (T_zCcApp_DsciInd*)ptMsgBuf->aucDataBuf, sizeof(T_zCcApp_DsciInd));

+

+    if(tDiscInd.cid==0)

+    	return 0;

+

+    return zCc_findCID_by_number(tDiscInd.num);

+}

+

+

+UINT8 zCc_MtInactiveCall(VOID)

+{

+    UINT8   slave = 0, cnt = 0;

+

+    for (slave = 0; slave < ZCC_SLAVES; slave++)

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_TRYING_S 

+            || g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_WAIT_RESOURCE_S)

+            //&& g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+        {

+            cnt++;

+        }

+    }

+

+    return cnt;

+}

+UINT8 zCc_GetCallSlave(UINT8 heldcall)//°´×î¶àÁ½Â·ÊµÏÖ

+{

+    UINT8   slave = 0;

+

+    for (slave = 1; slave < ZCC_SLAVES; slave++) // slave[0] ²»¿ÉÄÜ

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_TALKING_S 

+            && g_Cc_CallDetail.slaveObj[slave].heldcall == heldcall

+            && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+        {

+			return slave;

+        }

+    }

+    return 0;

+}

+

+VOID zCc_ControlTone(VOID)

+{

+    T_zCc_Tone            tone = ZCC_TONE_OFF_A;   /* What tone to play */

+    SIGNAL_DATA  tSig;

+    memset(tSig.cid, 0, 32);

+    UINT8   slave = 0;

+

+    for (slave = 0; slave < ZCC_SLAVES; slave++)

+    {

+        if (g_Cc_CallDetail.slaveObj[slave].tone != ZCC_TONE_OFF_A)

+        {

+            tone = g_Cc_CallDetail.slaveObj[slave].tone;

+            break;

+        }

+    }

+    printf("[ccapp_debug]:zCc_ControlTone,cur_tone=%d, last_tone=%d\n",tone,g_Cc_CallDetail.lastTone);

+    if (g_Cc_CallDetail.lastTone == tone || ZCC_TONE_OFF_A == tone)

+    {

+        return;

+    }

+

+    if(local_test_call_st != 0)

+    {

+		g_Cc_CallDetail.lastTone = tone;

+		return ;

+    }

+

+    switch (tone)

+    {

+    case ZCC_TONE_DIAL_A:

+        if (g_Cc_CallDetail.lastTone == ZCC_TONE_CIDCW_A)//¶à²»¶àÓà

+        {

+            SLIC_Stop_PCM();

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ControlTone: SLIC_Stop_PCM <---\n",__FUNCTION__);

+        }

+        tSig.signal_type= TONE_SIGNAL;

+        tSig.tone_type = TONE_DIAL;

+        SLIC_Play_Signal(0, 0, &tSig);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ControlTone: SLIC_Play_Signal TONE_DIAL<---\n",__FUNCTION__);

+        break;

+    case ZCC_TONE_RB_A:

+        tSig.signal_type= TONE_SIGNAL;

+        tSig.tone_type = TONE_RINGBACK;

+        SLIC_Play_Signal(0, 0, &tSig);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ControlTone: SLIC_Play_Signal ZCC_TONE_RB_A<---\n",__FUNCTION__);

+        break;

+    case ZCC_TONE_BSY_A:

+        tSig.signal_type= TONE_SIGNAL;

+        tSig.tone_type = TONE_BUSY;

+        SLIC_Play_Signal(0, 0, &tSig);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ControlTone: SLIC_Play_Signal TONE_BUSY<---\n",__FUNCTION__);

+        break;

+    case ZCC_TONE_SIL_A:     

+        SLIC_Stop_Signal(0, TONE_SIGNAL);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ControlTone: SLIC_Stop_Signal <---\n",__FUNCTION__);

+        break;

+    case ZCC_TONE_CIDCW_A:

+    	memset(&tSig, 0, sizeof(tSig));

+        tSig.signal_type= TONE_SIGNAL;

+        tSig.tone_type = TONE_CW;

+        //memcpy(tSig.cid, g_Cc_CallDetail.number, strlen(g_Cc_CallDetail.number));

+        strncpy(tSig.cid, g_Cc_CallDetail.number, sizeof(tSig.cid)-1);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ControlTone ZCC_TONE_CIDCW_A,number = %s\n",__FUNCTION__,g_Cc_CallDetail.number);

+        zCc_sleep(100);

+        SLIC_Play_Signal(0, 0, &tSig);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ControlTone: SLIC_Play_Signal TONE_CW<---\n",__FUNCTION__);

+        break;

+    case ZCC_TONE_TKY_A:

+        tSig.signal_type= TONE_SIGNAL;

+        tSig.tone_type = TONE_TKY;

+        SLIC_Play_Signal(0, 0, &tSig);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ControlTone: SLIC_Play_Signal TONE_TKY<---\n",__FUNCTION__);

+        break;

+    }

+    g_Cc_CallDetail.lastTone = tone;

+

+}

+void zCcApp_SetAtChnlCmdId(E_CC_APP_AtReqCmdId AtCmdId)

+{

+     g_Cc_CallDetail.curAtCmdId = AtCmdId;

+}

+VOID zCc_SendSsReq(PSTR pAtCmdPara)

+{

+    CHAR pw[5] = {0};

+    CHAR dn[ZDIAL_NUM_MAX] = {0};

+    UINT8   scSum = sizeof(g_zCc_SCTab)/sizeof(T_zCc_ScTab);

+    UINT8 scName = 0;

+    UINT8 i = 0;

+    T_zCcapp_ClckReq tclckreq = {0};

+    T_zCcapp_CcfcReq tccfcreq = {0};

+

+    for (i = 0; i<scSum; i++)

+    {

+        if (strncmp((CHAR *)g_zCc_SCTab[i].sc, (CHAR *)g_Cc_CallDetail.digits, 

+            (UINT32)(strlen(g_zCc_SCTab[i].sc)<g_Cc_CallDetail.dCount)?strlen(g_zCc_SCTab[i].sc):g_Cc_CallDetail.dCount) == 0)

+        {

+            scName = g_zCc_SCTab[i].scName;

+            break;

+        }

+    }

+    switch(scName)

+    {

+        case ZCC_BAOC_REG:

+            sscanf(pAtCmdPara, "%*5s%4s#", pw);

+            pw[4] = '\0';

+            tclckreq.type = 0;//AO

+            tclckreq.act = 1;

+            strncpy(tclckreq.pw,pw,sizeof(tclckreq.pw)-1);

+            break;

+        case ZCC_BAOC_DEREG:

+            sscanf(pAtCmdPara, "%*5s%4s#", pw);

+            pw[4] = '\0';

+            tclckreq.type = 0;//AO

+            tclckreq.act = 0;

+            strncpy(tclckreq.pw,pw,sizeof(tclckreq.pw)-1);

+            break;

+        case ZCC_BOIC_REG: 

+            sscanf(pAtCmdPara, "%*5s%4s#", pw);

+            pw[4] = '\0';

+            tclckreq.type = 1;//OI

+            tclckreq.act = 1;

+            strncpy(tclckreq.pw,pw,sizeof(tclckreq.pw)-1);

+            break;

+        case ZCC_BOIC_DEREG:

+            sscanf(pAtCmdPara, "%*5s%4s#", pw);

+            pw[4] = '\0';

+            tclckreq.type = 1;//OI

+            tclckreq.act = 0;

+            strncpy(tclckreq.pw,pw,sizeof(tclckreq.pw)-1);

+            break;

+        case ZCC_CFU_REG:

+            sscanf(pAtCmdPara, "%*4s%47s#", dn);

+            dn[strlen(dn)-1] = '\0';

+            tccfcreq.type = 0;

+            tccfcreq.act = 1;

+            strncpy(tccfcreq.dn, dn, strlen(dn));

+            break;

+        case ZCC_CFU_DEREG:

+            tccfcreq.type = 0;

+            tccfcreq.act = 0;

+            break;

+        case ZCC_CFNRY_REG:

+            sscanf(pAtCmdPara, "%*4s%47s#", dn);

+            dn[strlen(dn)-1] = '\0';

+            tccfcreq.type = 2;

+            tccfcreq.act = 1;

+            strncpy(tccfcreq.dn, dn, strlen(dn));

+            break;

+        case ZCC_CFNRY_DEREG:

+            tccfcreq.type = 2;

+            tccfcreq.act = 0;

+            break;

+        case ZCC_CFB_REG:

+            sscanf(pAtCmdPara, "%*4s%47s#", dn);

+            dn[strlen(dn)-1] = '\0';

+            tccfcreq.type = 1;

+            tccfcreq.act = 1;

+            strncpy(tccfcreq.dn, dn, strlen(dn));

+            break;

+        case ZCC_CFB_DEREG:

+            tccfcreq.type = 1;

+            tccfcreq.act = 0;

+            break;

+    }

+        

+    

+    if (scName > ZCC_BOIC_DEREG)

+    {

+        zCcApp_Ccfc(&tccfcreq);

+    }

+    else

+    {

+        zCcApp_Clck(&tclckreq);

+    }

+        

+}

+

+VOID zCc_SendAtDialReq(PSTR pAtCmdPara)

+{

+    UINT8 slave =0;

+

+    //ccapp_log("pAtCmdPara=%s len=%s", pAtCmdPara, strlen(pAtCmdPara));

+

+    if (strlen(pAtCmdPara)+1 > ZDIAL_NUM_MAX)

+    {

+        return;

+    }

+    else if (strlen(pAtCmdPara) <= 2)

+    {

+        slave = zCc_GetDialingSlave(1);

+        if (1 == zCc_BusyToneAllowed() && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0 && g_Cc_CallDetail.state == ZCC_M_SEIZE_S)//ÓÐÆäËûºô½ÐÇÒÒѹһúʱ²»·ÅæÒô

+        {

+            CreateSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT,

+                        0,

+                        ZCCAPP_TIMER_BUSYTONE_INTERVAL,

+                        zCcApp_BusyToneTimer,

+                        NULL);  

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SendAtDialReq CreateSoftTimer zCcApp_BusyToneTimer\n",__FUNCTION__);

+            g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_BSY_A;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_BSYT_S;

+            g_Cc_CallDetail.slaveObj[slave].confcall = 0;

+            g_Cc_CallDetail.slaveObj[slave].heldcall = 0;

+        }

+        else

+        {           

+        	int index;

+            zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+			index = zCc_find_held_cid();  // hookflash + onekey and dtmf timeout

+			if(index!=0)

+				zCc_SendAtChldReq(2);

+        }

+        return;

+    }

+    g_Cc_CallDetail.curAtCmdId  = CC_APP_AT_CMD_REQ_D;

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SendAtDialReq:AtcmdMsg = %s\n",__FUNCTION__,pAtCmdPara);

+    zCcApp_Dial((char *)pAtCmdPara);

+    

+}

+

+VOID zCc_SendAtAnswerReq(VOID)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SendAtAnswerReq\n",__FUNCTION__);

+    g_Cc_CallDetail.curAtCmdId = CC_APP_AT_CMD_REQ_A;

+    zCcApp_Answer();

+}

+

+VOID zCc_SendAtHangupReq(VOID)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SendAtHangupReq\n",__FUNCTION__);

+    g_Cc_CallDetail.curAtCmdId = CC_APP_AT_CMD_REQ_CHUP;

+    zCcApp_Chup();

+}

+

+VOID zCc_SendAtDtmfReq(char* dtmfchar)

+{

+    g_Cc_CallDetail.curAtCmdId  = CC_APP_AT_CMD_REQ_VTS;

+    zCcApp_Vts(dtmfchar);

+}

+

+VOID zCc_SendAtImsPlusReq(int rate, int setfg)

+{

+ zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SendAtImsPlusReq\n",__FUNCTION__);

+    g_Cc_CallDetail.curAtCmdId = CC_APP_AT_CMD_REQ_IMSPLUS;

+    zCcApp_SetImsPlus(rate, setfg);

+}

+#if 0

+VOID zCc_SendAtVolumnReq(PSTR pAtCmdPara)

+{

+    CHAR AtcmdMsg[ZAT_PARAM_LEN50]   = {0};

+

+    if (pAtCmdPara[0] == 0 || strlen(pAtCmdPara)+1 > ZDIAL_NUM_MAX)

+    {

+        return;

+    }

+    g_Cc_CallDetail.curAtCmdId  = CC_APP_AT_CMD_REQ_VTS;

+    sprintf(AtcmdMsg, "AT+VTS=\"%s\",20\r\n", pAtCmdPara);

+    printf( "--->  ccApp zCc_SendAtDtmfReq:AtcmdMsg = %s\n", AtcmdMsg);

+    zCcApp_Vts(AtcmdMsg);

+}

+#endif

+SINT32 zCc_SendAtChldReq(int chldtype)

+{

+    SINT32 ret = -1;

+

+    if (g_Cc_CallDetail.digits[0] == ZCC_FLASH_SIGN)

+    {

+        zCc_ClearDigits();

+    }

+    DeleteSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT);

+    g_Cc_CallDetail.curAtCmdId  = CC_APP_AT_CMD_REQ_SET_CHLD;

+    ret = zCcApp_Chld(chldtype);

+    return ret;

+}

+

+VOID zCc_SendLedInformMsg(VOID)

+{

+    int lRet = -1;

+    int lTgtMsgID = 0;

+    MSG_BUF stMsg;

+    LONG msgSize = sizeof(MSG_BUF) - sizeof(LONG); 

+

+#ifndef TEST_CCAPP

+    lTgtMsgID = msgget(MODULE_ID_MMI, 0);

+    if (-1 == lTgtMsgID) 

+    {

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SendLedInformMsg msgget MMI fail\n",__FUNCTION__);

+        return;

+    }

+    

+    memset(&stMsg, 0, sizeof(MSG_BUF));

+    stMsg.ulMagic = MSG_MAGIC_WORD;

+    stMsg.lMsgType = MSG_TYPE_DEFAULT;

+    stMsg.src_id = MODULE_ID_CALL_CTRL;

+    stMsg.dst_id = MODULE_ID_MMI;

+    stMsg.usMsgCmd = MSG_CMD_VOIP_STATUS_INFO;

+    stMsg.usDataLen = 0;

+    lRet = msgsnd(lTgtMsgID, &stMsg, msgSize, IPC_NOWAIT);

+    if (lRet < 0)

+    {        

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SendLedInformMsg msgsnd to MMI fail\n",__FUNCTION__);

+        return;

+    }

+#endif

+}

+

+VOID zCc_SetLedStatus(char* LedStatus)

+{

+    

+#ifndef TEST_CCAPP

+    cfg_set("voip_status", LedStatus);

+#endif

+    zCc_SendLedInformMsg();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SetLedStatus = %s\n",__FUNCTION__,LedStatus);

+}

+

+SINT32 zCc_RecvDsciInd(MSG_BUF *ptMsgBuf)

+{    

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","RECV dsciind!!!<---\n");

+    //ptMsgBuf->usMsgCmd   = ZCC_NO_E;

+    //ptMsgBuf->usMsgCmd = ZCCAPP_ATIND_DSCI;

+    //ptMsgBuf->usSourceModuleID = MSG_ID_CALL_CTRL;

+    

+    zCc_SendMsgToSub(ptMsgBuf); /* ·¢¸øÖ÷Ïß³Ì */ 

+    return 0;

+}

+

+int is_onecall_in_help_and_ready_to_input_new_call(void)

+{

+    int i;

+    if(zCc_find_held_cid()==0)

+        return 0;

+

+    for(i=0;i<ZCC_SLAVES;i++)   // should start from 0, it'll be 0 when hookflash comes but not input any key

+        if(g_Cc_CallDetail.slaveObj[i].state==ZCC_S_DT_S || 

+            g_Cc_CallDetail.slaveObj[i].state==ZCC_S_DACCM_S)

+            return 1;

+    

+    return 0;

+}

+

+void tz_lock_cellid_active_for_call(int state)

+{

+	static int old_state = -1;

+	static int cellid_active_count = 0;

+	char tz_lock_cellid_active[4] = {0};

+

+	cfg_get_item("tz_lock_cellid_active",tz_lock_cellid_active,sizeof(tz_lock_cellid_active));

+	if(strcmp(tz_lock_cellid_active, "1") == 0)

+		return;

+	

+	if((old_state == 3) && (state == 0) && (cellid_active_count < 3))

+	{

+		cellid_active_count++;

+		if(cellid_active_count == 3)

+		{

+			cfg_set("tz_lock_cellid_call_active", "1");

+		}

+	}

+	old_state = state;

+	return;

+}

+

+SINT32 zCc_DsciIndProc(MSG_BUF *ptMsgBuf)

+{

+    int inMpty = 0;

+    int cid = 0;

+    int state = 0;

+    int dir = 0;

+    CHAR num[ZDIAL_NUM_MAX]   = {0}; 

+    CHAR voip_status[ZDIAL_NUM_MAX] = {0};

+    T_zCcApp_DsciInd tDiscInd = {0};

+

+    int n;

+    int slave_callout[ZCC_SLAVES];

+

+    memcpy(&tDiscInd, (T_zCcApp_DsciInd*)ptMsgBuf->aucDataBuf, sizeof(T_zCcApp_DsciInd));

+    cid = tDiscInd.cid;

+    inMpty = tDiscInd.inMpty;

+    dir = tDiscInd.dir;

+    state = tDiscInd.state;

+    strncpy(num, tDiscInd.num,sizeof(num)-1);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s RECV dsciind: cid=%d num=%s dir=%d inMpty=%d state=%d !!!<---\n",

+        __FUNCTION__, cid, num, dir,inMpty,state);

+    zCc_ShowAllSlave();

+    

+    if (cid < ZCC_MINCID || cid > ZCC_MAXCID)

+    {

+        return 0;

+    }

+    if (num[0] < 0)

+    {

+        memset(num,0,ZDIAL_NUM_MAX);

+    }

+    ptMsgBuf->dst_id = cid;

+	tz_lock_cellid_active_for_call(state);

+    switch(state)

+    { 

+    case 0://Z_MMIACC_CALL_STATE_ACTIVE

+        if (g_Cc_CallDetail.slaveObj[cid].state == ZCC_S_TALKING_S)//held->active

+        {

+            SLIC_Start_PCM();

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_DsciIndProc: SLIC_Start_PCM <---\n",__FUNCTION__);

+

+            if (g_Cc_CallDetail.lastTone == ZCC_TONE_DIAL_A

+           && g_Cc_CallDetail.slaveObj[0].tone == ZCC_TONE_DIAL_A)

+            {

+                SLIC_Stop_Signal(0, TONE_SIGNAL);

+                zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_DsciIndProc: SLIC_Stop_Signal <---\n",__FUNCTION__);

+                g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;      

+                zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_DsciIndProc handling zCc_InitSlaveObj(0)\n",__FUNCTION__);

+                zCc_InitSlaveObj(0);                

+            }

+            g_Cc_CallDetail.slaveObj[cid].heldcall = 0;

+            g_Cc_CallDetail.slaveObj[cid].confcall = inMpty;

+        }

+        else

+        {

+            ptMsgBuf->usMsgCmd = ZCC_SANS_E;

+        }

+        	

+#ifndef TEST_CCAPP

+		cfg_get_item("voip_status",voip_status,sizeof(voip_status));

+		if (0 != strcmp("ledon" , voip_status))

+#endif

+        {

+            zCc_SetLedStatus("ledon");

+        }

+        break;

+    case 1://Z_MMIACC_CALL_STATE_HELD

+        if (g_Cc_CallDetail.slaveObj[cid].state == ZCC_S_TALKING_S)//active->held

+        {

+            if (1 == zCc_CallCount())

+            {

+                //SLIC_Stop_PCM();

+            } 

+            g_Cc_CallDetail.slaveObj[cid].heldcall = 1;

+            g_Cc_CallDetail.slaveObj[cid].confcall = inMpty;

+

+        }

+        break;

+    case 3://Z_MMIACC_CALL_STATE_MO_ALERTING

+        ptMsgBuf->usMsgCmd = ZCC_SRING_E;

+        break;

+    case 4://Z_MMIACC_CALL_STATE_MT_INCOMING

+		 if(tz_lock_cellid_is_limit_callin())

+		 {

+			 zCc_SendAtChldReq(10+cid);

+			 break;

+		 }

+		 

+        if(g_Cc_CallDetail.state==ZCC_M_SEIZE_S)    

+        {

+        	int cnt;

+

+        	cnt= zCc_CallCount();

+        	ccapp_log("cnt=%d slave[0]=%d", cnt, g_Cc_CallDetail.slaveObj[0].state);

+        	

+			if(cnt==0)			// hookoff but not dail out utill dtmf-timer timeout

+			{	

+				if(ZCC_S_BSYT_S<=g_Cc_CallDetail.slaveObj[0].state &&

+					g_Cc_CallDetail.slaveObj[0].state<=ZCC_S_SIL_S)

+				{

+					zCc_SendAtChldReq(10+cid);

+	                break;

+                }

+			}

+        	

+            if(zCc_GetSpecSlaveIgnoreWaitDSCI6(ZCC_S_BSYT_S)||

+                zCc_GetSpecSlaveIgnoreWaitDSCI6(ZCC_S_TKYT_S)||   	// fast dududu is being ....

+                zCc_GetSpecSlaveIgnoreWaitDSCI6(ZCC_S_SIL_S))		// fast dududu is end ....

+            {

+                zCc_SendAtChldReq(10+cid);

+                break;

+            }

+        }

+		else if(g_Cc_CallDetail.state==ZCC_M_RELEASE_S) 

+        {

+        	int dsci6_cid = zCc_Find_waitDSCI6_cid();

+			if(dsci6_cid!=0 && dsci6_cid==cid)

+			{

+                zCc_SendAtChldReq(10+cid);

+                zCc_InitSlaveObj(cid);

+                ccapp_log("zCc_Find_waitDSCI6_cid and skip this call %s", num);

+

+                char temp[200];

+                sprintf(temp, "echo \"%s get error incoming call cid=%d num=%s\" > /tmp/log.ccapp.callin.err",

+                	get_local_date_time(), cid, num);

+                soft_system(temp);

+                break;

+            }

+        }

+        

+        ptMsgBuf->usMsgCmd = ZCC_SINVITE_E;

+        memset(g_Cc_CallDetail.number, 0, sizeof(g_Cc_CallDetail.number));

+        memcpy(g_Cc_CallDetail.number, num, ZDIAL_NUM_MAX);

+        break;

+    case 5://Z_MMIACC_CALL_STATE_MT_WAITING

+        if(g_Cc_CallDetail.state==ZCC_M_RINGING_S && zCc_find_held_cid())

+        {

+            zCc_SendAtChldReq(10+cid);

+            break;

+        }

+        else if(is_onecall_in_help_and_ready_to_input_new_call())

+        {

+            zCc_SendAtChldReq(10+cid);

+            break;

+        }

+        

+        if(zCc_CallCount()>=2)

+        {

+            zCc_SendAtChldReq(10+cid);

+            break;

+        }

+        

+        ptMsgBuf->usMsgCmd = ZCC_CIDCW_E;

+        memset(g_Cc_CallDetail.number, 0, sizeof(g_Cc_CallDetail.number));

+        memcpy(g_Cc_CallDetail.number, num, ZDIAL_NUM_MAX);

+        break;

+    case 6://Z_MMIACC_CALL_STATE_END

+    	zCcApp_Vts_CleanReq();

+    	if(zCc_findCID_by_number(num)==0)

+    		break;

+    	

+        ptMsgBuf->usMsgCmd = dir?ZCC_SDISCN_MT_E: ZCC_SDISCN_MO_E;

+        g_Cc_CallDetail.chupSent = 0;

+

+		memset(slave_callout, 0, sizeof(slave_callout));

+		n = zCc_find_all_callout(slave_callout);

+		

+        ccapp_log("DscInd 6, dir=%d is_callout=%d, find_all_callout=%d", 

+        		dir, 

+        		g_Cc_CallDetail.slaveObj[cid].is_callout,

+        		n);

+

+        if(dir==0 && g_Cc_CallDetail.slaveObj[cid].is_callout == TRUE) 

+        {

+        	if(n<1 || (n==1 && slave_callout[0]==cid))

+        		SLIC_PolarityReverse(0, FALSE);

+        }

+        

+        if ((cid == g_Cc_CallDetail.ringCid) && (ZCC_TONE_CIDCW_A == g_Cc_CallDetail.lastTone))

+        {

+            SLIC_Stop_Signal(0, 0);//Í£Ö¹ºô½ÐµÈ´ýÒô

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_DsciIndProc: SLIC_Stop_Signal <---\n",__FUNCTION__);

+            g_Cc_CallDetail.slaveObj[0].tone = ZCC_TONE_OFF_A;

+            g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+        }

+        

+        break;

+      case 2://Z_MMIACC_CALL_STATE_MO_DIALING

+        ptMsgBuf->usMsgCmd = ZCC_SDIALLING_E;

+        break;

+    case 7://Z_MMIACC_CALL_STATE_MT_CONNREQ

+    case 8://Z_MMIACC_CALL_STATE_DISC

+    default:

+        break;

+    }

+    return 0;

+}

+

+

+

+SINT32 zCc_RecvZvoiceChnl(MSG_BUF *ptMsgBuf)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","RECV zvoicechnl!!!<---\n");

+    //if (g_Cc_CallDetail.state == ZCC_M_RELEASE_S)

+    //{

+    //    return 0;

+    //}

+    printf("[ccapp_debug]:recv zvoicechnl and send to local cc\n");

+

+    //ptMsgBuf->usMsgCmd   = ZCC_NO_E;

+    //ptMsgBuf->usMsgCmd = ZCCAPP_ATIND_IMSPLUS;

+    //ptMsgBuf->usSourceModuleID = MSG_ID_CALL_CTRL;

+    

+    zCc_SendMsgToSub(ptMsgBuf); /* ·¢¸øÖ÷Ïß³Ì */ 

+    return 0;

+}

+

+

+

+SINT32 zCc_RecvImsplusInd(MSG_BUF *ptMsgBuf)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","RECV imsplusind!!!<---\n");

+    //if (g_Cc_CallDetail.state == ZCC_M_RELEASE_S)

+    //{

+    //    return 0;

+    //}

+     printf("[ccapp_debug]:recv imsplus and send to local cc\n");

+

+    //ptMsgBuf->usMsgCmd   = ZCC_NO_E;

+    //ptMsgBuf->usMsgCmd = ZCCAPP_ATIND_IMSPLUS;

+    //ptMsgBuf->usSourceModuleID = MSG_ID_CALL_CTRL;

+    

+    zCc_SendMsgToSub(ptMsgBuf); /* ·¢¸øÖ÷Ïß³Ì */ 

+    return 0;

+}

+SINT32 zCc_RecvRsp(MSG_BUF *ptMsgBuf)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","RECV at_rsp %d !!!<---\n", ptMsgBuf->usMsgCmd);

+    

+    zCc_SendMsgToSub(ptMsgBuf); /* ·¢¸øÖ÷Ïß³Ì */ 

+    return 0;

+}

+

+static inline unsigned char zCc_MapVoiceChnlAct(unsigned char  act)

+{

+    if (act == 3)

+    {

+        return  0; //gsm

+    }

+    else if (act == 5)

+    {

+        return 2; //wcdma

+    }

+    else if (act == 15)

+    {

+        return 1;

+    }

+    else

+    {

+        assert(0);

+    }

+	return 3;

+}

+

+static unsigned char  g_zCc_VoiceOpenSucc = 1;

+

+static  T_Voice_Para   g_zCc_VoicePara_bak;

+

+static  unsigned int   g_zCc_pcm_bak = 0; /*new add*/

+

+SINT32 zCc_ZvoicechnlProc(MSG_BUF *ptMsgBuf)

+{

+    T_zCcApp_VoiceChnl  tVoiceChnl;

+    T_Voice_Para    tVoicePara = {0};

+    memcpy(&tVoiceChnl, (T_zCcApp_VoiceChnl*)ptMsgBuf->aucDataBuf, sizeof(T_zCcApp_VoiceChnl));

+

+    tVoicePara.mode = zCc_MapVoiceChnlAct(tVoiceChnl.act);

+    tVoicePara.codec_type = tVoiceChnl.codetype; //0-nb, 1-wb

+    if ( tVoicePara.codec_type == 1)

+        tVoicePara.clock_rate = 16000;

+    else

+        tVoicePara.clock_rate = 8000;

+

+    tVoicePara.codec_path = tVoiceChnl.amrpath;

+        

+    printf("[ccapp_debug]:recv zvoicechnl, tVoicePara=%d,%d,%d,%d\n",tVoicePara.clock_rate,tVoicePara.mode,tVoicePara.codec_type,tVoicePara.codec_path);

+    if (tVoiceChnl.op == 1)

+    {

+    /*  new add begin*/

+        //start voice

+        if (/*voice_open(&tVoicePara) != 0 ||*/ g_Cc_CallDetail.state == ZCC_M_RINGING_S)

+        {

+            printf("[ccapp]:voice open fail");//´ò¿ªvoiceʧ°Ü£¬»òÕßÕñÁå̬ÊÕµ½zvoicechnl£¬¶¼ÈÏΪʧ°Ü

+            g_zCc_VoiceOpenSucc = 0;

+            g_zCc_VoicePara_bak = tVoicePara;

+        }

+	  else if (g_Cc_CallDetail.state == ZCC_M_SEIZE_S)

+        {

+

+            if ( voice_open(&tVoicePara) != 0)

+

+            {

+

+                printf("[ccapp_debug]:mo call voice_open fail!!!\n");

+

+                voice_close(&tVoicePara);

+

+            }

+

+        }

+/*  new add end*/

+        printf("[ccapp_debug]:voice_open:rlt=%d\n",g_zCc_VoiceOpenSucc);

+

+    }

+    else

+    {

+        //close voice

+        g_zCc_VoiceOpenSucc = 1;

+        voice_close(&tVoicePara);

+        printf("[ccapp_debug]:voice_close:rlt=%d\n",g_zCc_VoiceOpenSucc);

+

+    }

+	return 0;

+}

+

+

+

+

+

+SINT32 zCc_ZimsplusProc(MSG_BUF *ptMsgBuf)

+{

+    int act = 0;

+    int rate = 0;  

+    T_zCcApp_ImsplusInd tImsplusInd = {0};

+

+    memcpy(&tImsplusInd, (T_zCcApp_ImsplusInd*)ptMsgBuf->aucDataBuf, sizeof(T_zCcApp_ImsplusInd));

+    act = tImsplusInd.act;

+    rate = tImsplusInd.rate;

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: act = %d  rate = %d new!!!<---\n",__FUNCTION__, act, rate);

+    printf("[ccapp_debug]:recv imsplus, tImsplusInd=%d,%d\n",tImsplusInd.act,tImsplusInd.rate);

+

+ 

+    if (act == 0)

+    {

+        SLIC_Stop_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_Stop_PCM <---\n",__FUNCTION__);

+    }

+    else if (act == 1)

+    { 

+        /*  new add begin*/

+        if ( g_Cc_CallDetail.state == ZCC_M_RINGING_S)

+        {

+            g_zCc_pcm_bak =  rate;

+            return 0;

+        }

+        /*  new add end */

+

+        if (rate == 8000)

+        {

+            SLIC_PCM_Set_NB();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_PCM_Set_NB <---\n",__FUNCTION__);

+            SLIC_Start_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_Start_PCM <---\n",__FUNCTION__);

+        }

+        else if (rate == 16000)

+        {

+            SLIC_PCM_Set_WB();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_PCM_Set_WB <---\n",__FUNCTION__);

+            SLIC_Start_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_Start_PCM <---\n",__FUNCTION__);

+        }

+    }

+    else if (act == 2)//¹Ø±Õpcm£¬·Å±¾µØ»ØÁåÒô

+    {

+        if (ZCC_S_RINGBACK_S != g_Cc_CallDetail.slaveObj[rate].state)

+        {

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: act 2,cid err <---\n",__FUNCTION__);

+            return 0; 

+        }

+        SLIC_Stop_PCM();

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_Stop_PCM <---\n",__FUNCTION__);

+        g_Cc_CallDetail.slaveObj[rate].tone = ZCC_TONE_RB_A;

+    }

+    else if (act == 3)//ºóÐø»áÔÙÓÐact1Éϱ¨£¬ËùÒÔ´Ëʱ²»´ò¿ªpcm

+    {

+        SLIC_Stop_Signal(0,0);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_Stop_Signal <---\n",__FUNCTION__);

+              

+        zCc_SendAtImsPlusReq(rate,0);

+        g_Cc_CallDetail.slaveObj[rate].tone = ZCC_TONE_OFF_A;

+    }

+    return 0;

+}

+SINT32 zCc_RecvZcpiInd(MSG_BUF *ptMsgBuf)

+{

+    //ptMsgBuf->usMsgCmd = ZCCAPP_ATIND_ZCPI;

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","RECV zcpiind!!!<---\n");

+    //ptMsgBuf->usSourceModuleID = MSG_ID_CALL_CTRL;

+    zCc_SendMsgToSub(ptMsgBuf); /* ·¢¸øÖ÷Ïß³Ì */ 

+    return 0;

+}

+

+SINT32 zCc_ZcpiIndProc(MSG_BUF *ptMsgBuf)

+{

+    int              state = 0;

+    int              cid   = 0;

+    int              progdsp   = 0;

+    T_zCcApp_ZcpiInd tZcpiInd = {0};

+

+    memcpy(&tZcpiInd, (T_zCcApp_ZcpiInd*)ptMsgBuf->aucDataBuf, sizeof(T_zCcApp_ZcpiInd));

+    state = tZcpiInd.state;

+    cid = tZcpiInd.cid;

+    progdsp = tZcpiInd.progdsp;

+

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZcpiIndProc: cid= %d, state=%d, progdsp=%d  <---\n",__FUNCTION__,cid,state,progdsp);

+    if (5 == state)

+    {   

+        ptMsgBuf->dst_id = cid;

+        ptMsgBuf->usMsgCmd = ZCC_RESOURCE_READY_E;

+        g_Cc_CallDetail.resourceReady = 1;

+    }

+    else if (6 == state)

+    {

+        g_Cc_CallDetail.resourceReady = 0;

+    }

+

+    if (8 == progdsp)

+    {

+        SLIC_Start_PCM();

+    }

+

+    return 0;

+}

+

+LONG zCcApp_send_message(unsigned short Msg_cmd,unsigned short us_DataLen,unsigned char *pData)

+{

+    ipc_send_message(MODULE_ID_CALL_CTRL, MODULE_ID_AT_CTL, Msg_cmd, us_DataLen, (unsigned char *)pData,0);    

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ipc_send_message:Msg_cmd is %d<---\n",__FUNCTION__, Msg_cmd);

+

+    return 0;

+}

+

+VOID zCcApp_Dial(char *ptMsgBuf)

+{

+    SINT32 ret = -1;

+    MSG_BUF stMsg;

+    LONG msgSize =  sizeof(MSG_BUF)-sizeof(LONG);   

+    T_zCcapp_CallMoReq tcallReq = {0};

+

+	memset(tcallReq.number, 0, sizeof(tcallReq.number));

+    //strncpy(tcallReq.number, ptMsgBuf,strlen(ptMsgBuf));

+    strncpy(tcallReq.number, ptMsgBuf,sizeof(tcallReq.number)-1);

+    zCcApp_send_message(MSG_CMD_ATD_DIAL_REQ, sizeof(T_zCcapp_CallMoReq), (unsigned char *) &tcallReq);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ipc_send_message:Msg is  MSG_CMD_ATD_DIAL_REQ<---\n",__FUNCTION__);

+

+}

+SINT32 zCcApp_Ccfc(T_zCcapp_CcfcReq *ptccfcreq)

+{

+    SINT32 ret = -1;  

+    MSG_BUF stMsg;

+    LONG msgSize =  sizeof(MSG_BUF)-sizeof(LONG);    

+  

+    zCcApp_send_message(MSG_CMD_CCFC_REQ, sizeof(T_zCcapp_CcfcReq), (unsigned char *) ptccfcreq);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ipc_send_message:Msg is MSG_CMD_CCFC_REQ<---\n",__FUNCTION__);

+

+    return 0;

+}

+SINT32 zCcApp_Clck(T_zCcapp_ClckReq *ptclckreq)

+{

+    SINT32 ret = -1;

+    MSG_BUF stMsg;

+    LONG msgSize =  sizeof(MSG_BUF)-sizeof(LONG);    

+  

+    zCcApp_send_message( MSG_CMD_CLCK_REQ, sizeof(T_zCcapp_ClckReq), (unsigned char *) ptclckreq);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ipc_send_message:Msg is MSG_CMD_CLCK_REQ<---\n",__FUNCTION__);

+

+    return 0;

+}

+

+SINT32 zCcApp_Answer(VOID)

+{

+    SINT32 ret = -1;

+    MSG_BUF stMsg;

+    LONG msgSize =  sizeof(MSG_BUF)-sizeof(LONG);    

+  

+    zCcApp_send_message(MSG_CMD_ATA_REQ, 0, NULL);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ipc_send_message:Msg is MSG_CMD_ATA_REQ<---\n",__FUNCTION__);

+

+    return 0;

+}

+

+SINT32 zCcApp_Chup(void)

+{

+    SINT32 ret = -1;

+    MSG_BUF stMsg;

+    LONG msgSize =  sizeof(MSG_BUF)-sizeof(LONG);    

+  

+    zCcApp_send_message(MSG_CMD_CHUP_REQ, 0, NULL);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ipc_send_message:Msg isMSG_CMD_CHUP_REQ<---\n",__FUNCTION__);

+

+    return 0;

+}

+

+//µ±ÉÏÒ»¸öVTSûÓÐÊÕµ½OKǰ£¬ÆäËûµÄVTSÈ«²¿»º´æÔÚÁ´±íÀ´ýÊÕµ½ÉÏÒ»¸öOKʱÔÚÏ·¢ÏÂÒ»¸ö

+//¶¼ÔÚmainÏ̴߳¦Àí£¬ÎÞÐ軥³â

+typedef struct {

+	struct list_head list;

+	T_zCcapp_VtsReq vts;

+}T_zCcapp_VtsReq_list;

+

+static LIST_HEAD(ccapp_vts_waitqueue);

+static int ccapp_vts_flag = 0;

+

+void zCcApp_Vts_CleanReq(void)

+{

+	struct list_head *head = &ccapp_vts_waitqueue;

+	T_zCcapp_VtsReq_list *l, *tmp;

+	

+	if(!list_empty(head))

+	{

+		list_for_each_entry_safe(l, tmp, head, list)

+		{

+			list_del(&l->list);

+			free(l);

+		}

+		ccapp_vts_flag = 0;

+	}

+}

+

+void zCcApp_Vts_Rsp(void)

+{

+	struct list_head *head = &ccapp_vts_waitqueue;

+	printf("[ccapp_debug]:Vts_Rsp flag=%d\n",ccapp_vts_flag);

+	if(list_empty(head))

+	{

+		ccapp_vts_flag = 0;

+	}

+	else

+	{

+		T_zCcapp_VtsReq_list *node = list_entry(head->next,T_zCcapp_VtsReq_list,list);

+		

+		zCcApp_send_message(MSG_CMD_VTS_REQ, sizeof(T_zCcapp_VtsReq), (unsigned char *) &node->vts);

+		ccapp_vts_flag = 1;

+		list_del(&node->list);

+		free(node);

+	}

+}

+

+SINT32 zCcApp_Vts(char* dtmfchar)

+{

+    T_zCcapp_VtsReq tvtsreq = {0};

+	struct list_head *head = &ccapp_vts_waitqueue;

+	

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","vtschar=%s<---\n",dtmfchar);

+    tvtsreq.dtmfchar=*dtmfchar;

+	printf("[ccapp_debug]:Vts_Req flag=%d\n",ccapp_vts_flag);

+	if(list_empty(head) && ccapp_vts_flag == 0)

+	{

+		zCcApp_send_message(MSG_CMD_VTS_REQ, sizeof(T_zCcapp_VtsReq), (unsigned char *) &tvtsreq);

+		ccapp_vts_flag = 1;

+	}

+	else

+	{

+		T_zCcapp_VtsReq_list *node = (T_zCcapp_VtsReq_list *)malloc(sizeof(T_zCcapp_VtsReq_list));

+		if(node == NULL)

+		{

+			printf("[ccapp_debug]: zCcApp_Vts malloc fail!!!\n");

+			return 0;

+		}

+		memset(node, 0 , sizeof(T_zCcapp_VtsReq_list));

+		node->vts.dtmfchar = tvtsreq.dtmfchar;

+		list_add_tail(&node->list,head);

+	}

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ipc_send_message:Msg is MSG_CMD_VTS_REQ<---\n",__FUNCTION__);

+

+    return 0;

+}

+SINT32 zCcApp_SetImsPlus(int rate, int setfg)

+{

+    SINT32 ret = -1;

+    MSG_BUF stMsg;

+    LONG msgSize =  sizeof(MSG_BUF)-sizeof(LONG);   

+    T_zCcapp_ImsplusReq timsplusreq= {0};

+

+    timsplusreq.act = rate;

+    timsplusreq.setfg = setfg;

+    

+    zCcApp_send_message(MSG_CMD_ZIMSPLUS_REQ, sizeof(T_zCcapp_ImsplusReq), (unsigned char *) &timsplusreq);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ipc_send_message:Msg is MSG_CMD_ZIMSPLUS_REQ<---\n",__FUNCTION__);

+

+    return 0;

+}

+

+SINT32 zCcApp_Chld(int chldtype)

+{

+    SINT32 ret = -1;

+    MSG_BUF stMsg;

+    LONG msgSize =  sizeof(MSG_BUF)-sizeof(LONG);  

+    

+    T_zCcapp_ChldReq tchldreq = {0};

+

+    tchldreq.type = chldtype;

+  

+    zCcApp_send_message(MSG_CMD_CHLD_REQ, sizeof(T_zCcapp_ChldReq), (unsigned char *) &tchldreq);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ipc_send_message:Msg is MSG_CMD_CHLD_REQ[%d]<---\n",__FUNCTION__,chldtype);

+

+    return 0;

+}

+

+SINT32 zCcApp_AtIndRspProc(MSG_BUF *ptMsgBuf)

+{

+    SINT32 i ;

+    SINT32 ret  = -1;

+    for(i=0;i< gCcAppRecvAtIndProcCnt;i++)

+    {

+        if(ptMsgBuf->usMsgCmd == gCcAppRecvAtIndProc[i].AtIndCmd)

+        {

+            if(NULL!= gCcAppRecvAtIndProc[i].RecvAtIndProcFun)

+            {

+                ret = gCcAppRecvAtIndProc[i].RecvAtIndProcFun(ptMsgBuf);

+            }

+            break;

+        }

+    }

+    

+    return ret;

+}

+VOID zCc_MReleaseState(MSG_BUF *ptMsgBuf)

+{

+	CHAR voip_status[ZDIAL_NUM_MAX] = {0};

+	zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MReleaseState ptMsgBuf->usMsgCmd = %d\n",__FUNCTION__,ptMsgBuf->usMsgCmd);

+

+       printf("[ccapp_debug]: Release State Recv MsgCmd: %d\n",ptMsgBuf->usMsgCmd);

+

+    switch (ptMsgBuf->usMsgCmd)

+    {

+    case ZCC_SEIZE_E: // ͻȜ

+        // slave[0] to play dial tone

+        g_Cc_CallDetail.evt[0] = ZCC_DIAL_E;

+        g_Cc_CallDetail.state = ZCC_M_SEIZE_S;     

+        g_Cc_CallDetail.chupSent = FALSE;

+        g_Cc_CallDetail.hookofffg = TRUE;

+        if (g_Cc_CallDetail.ringCid)// ¾Ü¾øµÈ´ý×ÊԴ״̬µÄincoming call

+        {

+            zCc_SendAtHangupReq();

+            g_Cc_CallDetail.slaveObj[g_Cc_CallDetail.ringCid].waitDSCI6 = 1;

+        } 

+         

+#ifndef TEST_CCAPP

+		cfg_get_item("voip_status",voip_status,sizeof(voip_status));

+

+        if (0 != strcmp("ledblink" , voip_status))

+#endif

+        {

+            zCc_SetLedStatus("ledblink");

+        }   

+        break;

+

+    case ZCC_SINVITE_E:

+        g_Cc_CallDetail.evt[ptMsgBuf->dst_id] = ZCC_SINVITE_E;

+        //g_Cc_CallDetail.state = ZCC_M_RINGING_S; È·ÈÏ×ÊÔ´·ÖÅäºóÔÙǨ״̬

+        break;

+

+    case ZCC_RESOURCE_READY_E:

+    	ccapp_log("g_Cc_CallDetail.ringCid=%d", g_Cc_CallDetail.ringCid);

+        if (g_Cc_CallDetail.ringCid)

+        {

+            g_Cc_CallDetail.evt[g_Cc_CallDetail.ringCid] = ZCC_RESOURCE_READY_E;

+        }

+        break;

+

+    case ZCC_SDISCN_MO_E:

+    case ZCC_SDISCN_MT_E:

+        g_Cc_CallDetail.evt[ptMsgBuf->dst_id] = ptMsgBuf->usMsgCmd;

+        break;

+

+    case ZCC_RELEASE_E:

+    case ZCC_FLASH_E:

+    default:

+        // do nothing

+        break;

+    }

+}

+

+pthread_t slic_ring_test_pid;	

+void* slic_ring_test_thread(void * ptr)

+{

+	SIGNAL_DATA tSig;

+	while(1)

+	{

+		sleep(30);

+		printf("ring stop\n");

+		SLIC_Stop_Signal(0, RING_SIGNAL);

+		zCc_SetLedStatus("ledoff");

+

+		sleep(30);

+		printf("ringing\n");

+		memset(&tSig, 0, sizeof(tSig));

+		tSig.signal_type = RING_SIGNAL;

+		strcpy(g_Cc_CallDetail.number, "1234567890");

+		strncpy(tSig.cid, g_Cc_CallDetail.number,sizeof(tSig.cid)-1);

+		get_local_datetime(tSig.date_time);

+		ccapp_log("local test call RING_SIGNAL,number = %s\n",g_Cc_CallDetail.number);

+		SLIC_Play_Signal(0, 0, &tSig);	

+		zCc_SetLedStatus("ledblink");

+	}

+	return NULL;

+}

+

+VOID zCc_MRingingState(MSG_BUF *ptMsgBuf)

+{

+    int held_call_cid = 0;

+    int incoming_call_cid = 0;

+    int shall_ring_cid;

+    

+    SIGNAL_DATA  tSig;

+    

+	CHAR voip_status[ZDIAL_NUM_MAX] = {0};

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MRingingState ptMsgBuf->usMsgCmd = %d\n",__FUNCTION__,ptMsgBuf->usMsgCmd);

+    switch (ptMsgBuf->usMsgCmd)

+    {

+    case ZCC_SEIZE_E: // ͻȜ

+        g_Cc_CallDetail.state = ZCC_M_SEIZE_S;

+        SLIC_Stop_Signal(0, RING_SIGNAL);     

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MRingingState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+        if (g_zCc_VoiceOpenSucc == 0)

+        {

+            g_zCc_VoiceOpenSucc = 1;

+            voice_open(&g_zCc_VoicePara_bak);

+		/* new add begin */	

+	        if (g_zCc_pcm_bak == 8000)

+	        {

+	            SLIC_PCM_Set_NB();

+	    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_PCM_Set_NB <---\n",__FUNCTION__);

+	            SLIC_Start_PCM();

+	    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_Start_PCM <---\n",__FUNCTION__);

+	        }

+	        else if (g_zCc_pcm_bak == 16000)

+	        {

+	            SLIC_PCM_Set_WB();

+	            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_PCM_Set_WB <---\n",__FUNCTION__);

+	            SLIC_Start_PCM();

+	            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_ZimsplusProc: SLIC_Start_PCM <---\n",__FUNCTION__);

+	        }

+	       g_zCc_pcm_bak = 0;

+		/* new add end */	

+        }

+        

+        g_Cc_CallDetail.chupSent = FALSE;

+

+        ccapp_log("ZCC_SEIZE_E held_cid=%d held_incoming_cid=%d", 

+            zCc_find_held_cid(),

+            zCc_find_held_incoming_cid());

+

+        if(local_test_call_st==LocalTestCallST_Ring)

+        {

+			/*memset(&tSig, 0, sizeof(tSig));

+        	tSig.signal_type= TONE_SIGNAL;

+	        tSig.tone_type = TONE_TKY;

+	        SLIC_Play_Signal(0, 0, &tSig);*/

+			if(local_test_call_type == LocalTestCallType_LOOP)

+	        	pthread_cancel(slic_ring_test_pid);

+

+	        g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+	        g_Cc_CallDetail.evt[0]= ZCC_NO_E;

+	        g_Cc_CallDetail.slaveObj[0].sMsg = ZCC_SNO_M;

+

+	        local_test_call_st = LocalTestCallST_End;

+

+            //system("echo loop_1 >> /tmp/log.ccapp.vploop");

+	        //system("( sleep 1 && at_cmd AT+VPLOOP=1 ) &");

+	        cfg_set("tz_vploop", "1");

+	        ipc_send_message(MODULE_ID_CALL_CTRL_LOCAL,

+	            MODULE_ID_AT_CTL,

+	            MSG_CMD_SET_VPLOOP_REQ,

+	            0,

+	            NULL,

+	            0);

+

+	        zCc_ShowAllSlaveWithTips("testCall-end");

+			break;

+        }

+

+        incoming_call_cid = zCc_find_held_incoming_cid();

+        ccapp_log("incoming_call_cid=%d is_cidcw=%d",

+            incoming_call_cid, 

+            g_Cc_CallDetail.slaveObj[incoming_call_cid].is_cidcw);

+            

+        if(zCc_find_held_cid())

+        {

+			zCc_SendAtChldReq(1);

+        }

+        else if(incoming_call_cid)

+        {

+            if(g_Cc_CallDetail.slaveObj[incoming_call_cid].is_cidcw == TRUE)

+                zCc_SendAtChldReq(1);

+            else

+            {

+                if (g_Cc_CallDetail.ringCid)

+    	        {

+    	            g_Cc_CallDetail.evt[g_Cc_CallDetail.ringCid] = ZCC_CNCT_E;

+    	            zCc_SendAtAnswerReq();

+    	        }

+            }

+        }

+        else

+        {

+	        if (g_Cc_CallDetail.ringCid)

+	        {

+	            g_Cc_CallDetail.evt[g_Cc_CallDetail.ringCid] = ZCC_CNCT_E;

+	            zCc_SendAtAnswerReq();

+	        }

+        }

+        break;

+

+//    case ZCC_SINVITE_E:

+    case ZCC_SDISCN_MT_E:

+    case ZCC_SDISCN_MO_E:

+    	if(check_incoming_call_is_in_slave(ptMsgBuf)==0)

+    		break;

+    		

+        g_Cc_CallDetail.evt[ptMsgBuf->dst_id] = ptMsgBuf->usMsgCmd;

+        g_Cc_CallDetail.state = ZCC_M_RELEASE_S;

+        SLIC_Stop_Signal(0, RING_SIGNAL);

+        g_zCc_VoiceOpenSucc = 1;

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MRingingState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+#ifndef TEST_CCAPP

+		cfg_get_item("voip_status",voip_status,sizeof(voip_status));

+

+		if (0 != strcmp("ledoff" , voip_status ))

+#endif

+        {

+            zCc_SetLedStatus("ledoff");

+        }

+

+        shall_ring_cid = 0;

+        held_call_cid = zCc_find_held_cid();

+        incoming_call_cid = zCc_find_held_incoming_cid();

+        if(held_call_cid && (ptMsgBuf->dst_id!=held_call_cid))

+            shall_ring_cid = held_call_cid;

+        else if(incoming_call_cid && (ptMsgBuf->dst_id!=incoming_call_cid))

+            shall_ring_cid = incoming_call_cid;

+

+        if(shall_ring_cid!=0)   

+        {

+        	memset(&tSig, 0, sizeof(tSig));

+            g_Cc_CallDetail.state = ZCC_M_RINGING_S;

+            tSig.signal_type = RING_SIGNAL;

+            /*memcpy(tSig.cid, 

+                g_Cc_CallDetail.slaveObj[shall_ring_cid].number, 

+                strlen(g_Cc_CallDetail.slaveObj[shall_ring_cid].number));*/

+            strncpy(tSig.cid, g_Cc_CallDetail.slaveObj[shall_ring_cid].number, sizeof(tSig.cid)-1);

+            get_local_datetime(tSig.date_time);

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_RunMaster RING_SIGNAL,number = %s\n",__FUNCTION__,g_Cc_CallDetail.slaveObj[held_call_cid].number);

+            SLIC_Play_Signal(0, 0, &tSig);  

+            zCc_SetLedStatus("ledblink");

+        }

+        break;

+

+    default:

+        // do nothing

+        break;

+    }

+}

+

+VOID zCc_MSeizeState(MSG_BUF *ptMsgBuf)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState ptMsgBuf->usMsgCmd = %d\n",__FUNCTION__,ptMsgBuf->usMsgCmd);

+    UINT8   slave = (UINT8)ptMsgBuf->dst_id;

+    UINT8   callCnt = 0;

+    UINT8   ret = 0;

+    SINT32  chldret = -1;

+    UINT8 tmpslave = 0;

+    CHAR voip_status[ZDIAL_NUM_MAX] = {0};

+

+    printf("[ccapp_debug]: Seize State Recv MsgCmd: %d,localtest=%d\n",ptMsgBuf->usMsgCmd,local_test_call_st);

+

+    switch (ptMsgBuf->usMsgCmd)

+    {

+    case ZCC_DTMF_E: // ²¦ºÅ

+        // slave[0] dial , or other call's DTMF

+        ccapp_log("--> ZCC_DTMF_E[%c] lastTone=%d Count=%d Held=%d Active=%d getSlave(DACCM)=%d getSlave(RINGBACK)=%d ringCid=%d dig=%s", 

+                    ptMsgBuf->aucDataBuf[0],

+        			g_Cc_CallDetail.lastTone,

+        			zCc_CallCount(),

+        			zCc_HeldCall(),

+        			zCc_ActiveCall(), 

+        			zCc_GetSpecSlave(ZCC_S_DACCM_S),

+        			zCc_GetSpecSlave(ZCC_S_RINGBACK_S),

+        			g_Cc_CallDetail.ringCid,

+        			g_Cc_CallDetail.digits); 

+        printf("[ccapp_debug]: ZCC_DTMF_E[%c] lastTone=%d Count=%d Held=%d Active=%d getSlave(DACCM)=%d getSlave(RINGBACK)=%d ringCid=%d dig=%s\n", 

+                    ptMsgBuf->aucDataBuf[0],

+        			g_Cc_CallDetail.lastTone,

+        			zCc_CallCount(),

+        			zCc_HeldCall(),

+        			zCc_ActiveCall(), 

+        			zCc_GetSpecSlave(ZCC_S_DACCM_S),

+        			zCc_GetSpecSlave(ZCC_S_RINGBACK_S),

+        			g_Cc_CallDetail.ringCid,

+        			g_Cc_CallDetail.digits);

+

+        /* callwait ringback but he drop then we hookflash+1

+lastTone=6 Count=2 Held=1 Active=0 getSlave(DACCM)=0 getSlave(RINGBACK)=2 ringCid=0 dig[0]=F

+        */			

+        if ((g_Cc_CallDetail.lastTone == ZCC_TONE_BSY_A) || (g_Cc_CallDetail.lastTone == ZCC_TONE_TKY_A))//æÒôºÍÃùº¿Òô£¬²»´¦Àí°´¼üÏûÏ¢

+        {

+            zCc_ClearDigits();

+            break;

+        }

+        callCnt = zCc_CallCount();

+        if ( (g_Cc_CallDetail.lastTone == ZCC_TONE_DIAL_A || callCnt == zCc_HeldCall()) //Ö»Óб£³Öºô½Ð£¬²¦ºÅ·¢Æðкô½Ð

+            && g_Cc_CallDetail.digits[0] != ZCC_FLASH_SIGN

+            && 0 == zCc_ActiveCall())//·Å²¦ºÅÒô»òÒÑÓб£³Öºô½ÐʱÓû§²¦ºÅ,µÚÒ»¸ö×Ö·û£¬Åųýactive+heldʱÏ·¢F2

+        {            

+            slave = zCc_GetSpecSlave(ZCC_S_IDLE_S);

+            if (0 == slave )

+            {

+                return;

+            }        

+            g_Cc_CallDetail.slaveObj[slave] = g_Cc_CallDetail.slaveObj[0];

+            g_Cc_CallDetail.evt[slave] = ZCC_DTMF_E;

+            DeleteSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT);

+            zCc_InitSlaveObj(0);

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState ZCC_DTMF_E \n",__FUNCTION__);

+            break;

+        }

+        else if ((g_Cc_CallDetail.lastTone == ZCC_TONE_SIL_A) && (0 != zCc_GetSpecSlave(ZCC_S_DACCM_S)))//¼ÌÐø²¦ºÅ

+        {           

+            slave = zCc_GetSpecSlave(ZCC_S_DACCM_S);

+            g_Cc_CallDetail.evt[slave] = ZCC_DTMF_E;

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState ZCC_DTMF_E \n",__FUNCTION__);

+            break;

+        }

+        else if ((g_Cc_CallDetail.digits[0] != ZCC_FLASH_SIGN) && ((0 != zCc_ActiveCall())

+            ||((0 == zCc_ActiveCall()) && (0 != zCc_GetSpecSlave(ZCC_S_RINGBACK_S)))))//·¢dtmf

+        {            

+            if (0 != zCc_ActiveCall())

+            {

+                slave = zCc_GetCallSlave(0);

+            }

+            else

+            {

+                slave = zCc_GetSpecSlave(ZCC_S_RINGBACK_S);

+            }

+            g_Cc_CallDetail.evt[slave] = ZCC_DTMF_E;

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState ZCC_DTMF_E \n",__FUNCTION__);

+            break;

+        }

+        else if ((0 == zCc_ActiveCall()) && (0 == zCc_GetSpecSlave(ZCC_S_RINGBACK_S))

+           && (g_Cc_CallDetail.digits[0] != ZCC_FLASH_SIGN))//·ÇÎÈ̬·Ç»ØÁåÒô״̬ÊÕµ½×Ö·û£¬¶ªÆú

+        {

+            zCc_ClearDigits();

+            return;

+        }

+        else 

+        {

+            if (g_Cc_CallDetail.ringCid && (g_Cc_CallDetail.slaveObj[g_Cc_CallDetail.ringCid].tone == ZCC_TONE_CIDCW_A))//active+waiting+flashordtmf

+            {

+                DeleteSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT);     

+                if (g_Cc_CallDetail.digits[0] != ZCC_FLASH_SIGN)

+                {             

+                    slave = zCc_GetSpecSlave(ZCC_S_TALKING_S);

+                    if (0 == slave )

+                    {

+                        return;

+                    }        

+                    g_Cc_CallDetail.evt[slave] = ZCC_DTMF_E;

+                    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState ZCC_DTMF_E \n",__FUNCTION__);

+                    break;

+                }        

+            }  

+

+            DeleteSoftTimer(ZCCAPP_TIMER_DTMF_DETECT);

+            ret = zCc_DigitsMatch();

+            if ((ZCC_NO_RESULT != ret && ZCC_MATCHERR != ret && g_Cc_CallDetail.lastTone == ZCC_TONE_DIAL_A)

+              ||(ZCC_MATCHERR == ret && g_Cc_CallDetail.lastTone == ZCC_TONE_DIAL_A && 2 <= zCc_CallCount()))

+            {//call waitingÊÕµ½flash4£¬Í£Ö¹²¦ºÅÒô»Ö¸´ºô½ÐµÈ´ýÒô

+                SLIC_Stop_Signal(0, TONE_SIGNAL);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+                g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+                if (g_Cc_CallDetail.slaveObj[0].tone != ZCC_TONE_OFF_A)

+                {                   

+                    zCc_InitSlaveObj(0);

+                }  

+                if (0 != zCc_ActiveCall())

+                {

+                    SLIC_Start_PCM();

+                }

+                if ((ZCC_FLASH_1 == ret || ZCC_FLASH_2 == ret) && (g_Cc_CallDetail.ringCid != 0))//½ÓÌýwaiting call£¬ºô½ÐµÈ´ýÒôÓ¦Çå¿Õ

+                {

+                    g_Cc_CallDetail.slaveObj[g_Cc_CallDetail.ringCid].tone = ZCC_TONE_OFF_A;

+                }

+            } 

+            zCc_DigitsMatchRltProc(ret);

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState ZCC_DTMF_E \n",__FUNCTION__);

+        }

+        

+        break;

+

+    case ZCC_SDIALLING_E: // ·¢³öÁËSIP INVITE »ò CC SETUP , ͨ¹ýÕâ¸öÏûÏ¢Éϱ¨ cid

+        if (0 != zCc_GetDialingSlave(0))

+        {

+            tmpslave = zCc_GetDialingSlave(0);

+            if (tmpslave != slave)

+            {

+                g_Cc_CallDetail.slaveObj[slave] =  g_Cc_CallDetail.slaveObj[tmpslave];

+                zCc_InitSlaveObj(tmpslave);

+            }

+        }

+        break;

+

+    case ZCC_SRING_E:

+    case ZCC_SANS_E:

+    case ZCC_SINVITE_E:

+    case ZCC_CIDCW_E:

+        g_Cc_CallDetail.evt[slave] = ptMsgBuf->usMsgCmd;

+        break;

+

+    case ZCC_SDISCN_MT_E:  

+    case ZCC_SDISCN_MO_E: 

+	{ //cov m

+    	if(check_incoming_call_is_in_slave(ptMsgBuf)==0)

+    		break;

+    		

+    	g_Cc_CallDetail.evt[slave] = ptMsgBuf->usMsgCmd;

+    	

+    	T_zCcApp_DsciInd *ptr = ptMsgBuf->aucDataBuf;

+

+    	/* somebody drop the call

+		zCc_MSeizeState  zCc_MSeizeState ptMsgBuf->usMsgCmd = 43

+		zCc_MSeizeState ==> get MT/MO cid=1 num=13088877803 stat=6 inMp=0 getCnt=2

+		zCc_MSeizeState 	slv=1 cid=0 held=1 stat=8

+		zCc_MSeizeState 	slv=2 cid=0 held=0 stat=8

+		zCc_STalkingState  zCc_STalkingState g_Cc_CallDetail.evt[1] = 43

+    	*/

+    	ccapp_log("==> get MT/MO cid=%d num=%s stat=%d inMp=%d getCnt=%d", 

+    			ptr->cid, ptr->num, ptr->state, ptr->inMpty,

+    			zCc_CallCount());

+	

+    	for (tmpslave = 0; tmpslave < ZCC_SLAVES; tmpslave++)

+        {

+            if (g_Cc_CallDetail.slaveObj[tmpslave].state != ZCC_S_IDLE_S)

+            {

+                ccapp_log("    slave=%d cid=%d held=%d stat=%d", 

+                			tmpslave, 

+                			g_Cc_CallDetail.slaveObj[tmpslave].cid,

+                			g_Cc_CallDetail.slaveObj[tmpslave].heldcall,

+                			g_Cc_CallDetail.slaveObj[tmpslave].state);

+            }

+        }

+

+        if(zCc_CallCount()<2)

+        	break;

+

+        if(ptr->cid>=ZCC_SLAVES) //cov m

+        	break;

+

+        if(g_Cc_CallDetail.slaveObj[ptr->cid].heldcall==0 &&

+    		g_Cc_CallDetail.slaveObj[ptr->cid].confcall==0)  

+    	{

+    		if(zCc_HeldCall())					

+    		{

+	            zCc_SendAtChldReq(1);

+	            break;

+            }

+    	}

+

+        int incoming_call_cid = zCc_GetSpecSlave(ZCC_S_TRYING_S);

+        if(incoming_call_cid!=0 && incoming_call_cid!=ptr->cid) 

+			zCc_SendAtChldReq(2);

+

+		#if 0

+        tmpslave = zCc_GetSpecSlave(ZCC_S_TRYING_S);  // incoming call here and wait for to be accepted

+        ccapp_log("zCc_CallCount()=%d zCc_GetSpecSlave(ZCC_S_TRYING_S)=%d", 

+            zCc_CallCount(), 

+            tmpslave);

+        if(tmpslave!=0 && ptMsgBuf->usMsgCmd==ZCC_SDISCN_MO_E)  // foreground drop, automaticly accept the incoming call

+        {

+            SLIC_Stop_Signal(0, TONE_SIGNAL); 

+            zCc_SendAtChldReq(1);

+            break;

+        }

+        

+        if(zCc_CallCount()<2)

+        	break;

+

+        if(ptr->cid<0 || ptr->cid>=ZCC_SLAVES)

+        	break;

+	

+    	if(g_Cc_CallDetail.slaveObj[ptr->cid].heldcall==0 &&

+    		g_Cc_CallDetail.slaveObj[ptr->cid].confcall==0)  

+    	{

+    		/*if(g_Cc_CallDetail.slaveObj[ptr->cid].state==ZCC_S_DIALING_S ||

+    			g_Cc_CallDetail.slaveObj[ptr->cid].state==ZCC_S_RINGBACK_S ||

+    			g_Cc_CallDetail.slaveObj[ptr->cid].state==ZCC_S_TALKING_S) */

+    		if(zCc_HeldCall())

+    		{

+	            zCc_SendAtChldReq(1);

+            }

+    	}

+    	#endif

+        break;

+    }

+    case ZCC_RELEASE_E:

+    	if(local_test_call_st==LocalTestCallST_Start)

+    	{

+    		SIGNAL_DATA tSig;

+

+			SLIC_Stop_Signal(0, TONE_SIGNAL); 

+

+            memset(&tSig, 0, sizeof(tSig));

+            tSig.signal_type = RING_SIGNAL;

+            strcpy(g_Cc_CallDetail.number, "1234567890");

+            strncpy(tSig.cid, g_Cc_CallDetail.number,sizeof(tSig.cid)-1);

+            get_local_datetime(tSig.date_time);

+            ccapp_log("local test call RING_SIGNAL,number = %s\n",g_Cc_CallDetail.number);

+            SLIC_Play_Signal(0, 0, &tSig);  

+            zCc_SetLedStatus("ledblink");

+

+			if(local_test_call_type == LocalTestCallType_LOOP) {

+				if (pthread_create(&slic_ring_test_pid, NULL, slic_ring_test_thread,0) != 0) //cov m

+					printf("slic_ring_test_thread create fail\n");

+			}

+

+     		g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+		    g_Cc_CallDetail.evt[slave]= ZCC_NO_E;

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SNO_M;

+            g_Cc_CallDetail.state = ZCC_M_RINGING_S;

+

+            local_test_call_st = LocalTestCallST_Ring;

+            zCc_ShowAllSlaveWithTips("testCall-ring");

+			break;

+    	}

+    	else if(local_test_call_st==LocalTestCallST_End)

+    	{

+    		zCc_ClearDigits();

+			zCc_InitSlaveObj(0);

+			for (slave = 1; slave < ZCC_SLAVES; slave++)

+	        {

+	            if (g_Cc_CallDetail.slaveObj[slave].state != ZCC_S_IDLE_S)

+	                zCc_InitSlaveObj(slave);

+	        }

+        

+		    SLIC_Stop_Signal(0, TONE_SIGNAL); 

+		    SLIC_Stop_PCM();

+		    zCc_SetLedStatus("ledoff");

+

+		    g_Cc_CallDetail.resourceReady = 0;

+	        g_Cc_CallDetail.hookofffg = FALSE;

+	        g_Cc_CallDetail.state = ZCC_M_RELEASE_S;

+

+            //system("echo loop_0 >> /tmp/log.ccapp.vploop");

+	        //system("( sleep 1 && at_cmd AT+VPLOOP=0 ) &");

+	        cfg_set("tz_vploop", "0");

+	        ipc_send_message(MODULE_ID_CALL_CTRL_LOCAL,

+	            MODULE_ID_AT_CTL,

+	            MSG_CMD_SET_VPLOOP_REQ,

+	            0,

+	            NULL,

+	            0);

+	        

+	        DeleteSoftTimer(ZCCAPP_TIMER_HOOKOFF_DETECT);

+	        DeleteSoftTimer(ZCCAPP_TIMER_DTMF_DETECT);

+	        DeleteSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT);

+	        DeleteSoftTimer(ZCCAPP_TIMER_TKYTONE_DETECT);

+	        DeleteSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT);

+	        DeleteSoftTimer(ZCCAPP_TIMER_HOOKOFF_IDLE);

+	        

+	        local_test_call_st = LocalTestCallST_None;

+    		zCc_ShowAllSlaveWithTips("testCall-end-none");

+    		break;

+    	}

+    	

+        for (slave = 1; slave < ZCC_SLAVES; slave++)

+        {

+            if (g_Cc_CallDetail.slaveObj[slave].state != ZCC_S_IDLE_S && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)

+            {

+                g_Cc_CallDetail.evt[slave] = ZCC_DISCN_E;

+            }

+        }

+		//if(slave == ZCC_SLAVES)

+		//	return;

+        if (g_Cc_CallDetail.slaveObj[0].state != ZCC_S_IDLE_S)//slave0½öÓÃÓÚ·ÅÒô£¬²»¶ÔÓ¦ºô½Ð

+        {            

+            zCc_InitSlaveObj(0);

+        }

+        SLIC_Stop_Signal(0, TONE_SIGNAL); 

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+        g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+        //g_Cc_CallDetail.chupSent = FALSE;

+        //SLIC_Stop_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Stop_PCM <---\n",__FUNCTION__);

+        

+#ifndef TEST_CCAPP

+

+

+		cfg_get_item("voip_status",voip_status,sizeof(voip_status));

+

+        if (0 != strcmp("ledoff" , voip_status ))

+#endif

+        {

+            zCc_SetLedStatus("ledoff");

+        }

+        g_Cc_CallDetail.state = ZCC_M_RELEASE_S;

+        if (!(0 != zCc_GetSpecSlave(ZCC_S_TRYING_S) && (1 == zCc_CallCount())))//Õª»úʱµÄÀ´µç£¬²»Çå

+        {

+            g_Cc_CallDetail.resourceReady = 0;

+        }

+        zCc_ClearDigits();

+        g_Cc_CallDetail.hookofffg = FALSE;

+        DeleteSoftTimer(ZCCAPP_TIMER_HOOKOFF_DETECT);//ÊÕµ½ÉÁ¶Ï£¬µ±Ç°¶¨Ê±Æ÷¶¼ÐèҪֹͣ£¬ºóÐøÔÙÆô¶¯

+        DeleteSoftTimer(ZCCAPP_TIMER_DTMF_DETECT);

+        DeleteSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT);

+        DeleteSoftTimer(ZCCAPP_TIMER_TKYTONE_DETECT);

+        DeleteSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT);

+        

+        DeleteSoftTimer(ZCCAPP_TIMER_HOOKOFF_IDLE);

+        for (slave = 1; slave < ZCC_SLAVES; slave++)

+        {

+            g_Cc_CallDetail.slaveObj[slave].idle_second = 0;//hook off ldle timer is killed,  time_cnt reset

+        }

+        

+        break;

+    case ZCC_BUSYTONETIMER_E:

+        for (slave = 0; slave < ZCC_SLAVES; slave++)

+        {

+            if(g_Cc_CallDetail.slaveObj[slave].tone == ZCC_TONE_BSY_A)

+            break;

+        }

+		if(slave == ZCC_SLAVES)

+			return;

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_TKY_A;

+        CreateSoftTimer(ZCCAPP_TIMER_TKYTONE_DETECT,

+                    0,

+                    ZCCAPP_TIMER_TKYTONE_INTERVAL,

+                    zCcApp_TkyToneTimer,

+                    NULL);  

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState CreateSoftTimer zCcApp_TkyToneTimer\n",__FUNCTION__);

+        if (!(0 == zCc_GetSpecSlave(ZCC_S_BSYT_S)

+           &&(g_Cc_CallDetail.slaveObj[slave].state== ZCC_S_WAIT_RESOURCE_S

+            ||g_Cc_CallDetail.slaveObj[slave].state== ZCC_S_TRYING_S)

+           && g_Cc_CallDetail.lastTone == ZCC_TONE_BSY_A))

+        {

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_TKYT_S;

+        }

+        return;

+    case ZCC_HOOKOFFTIMER_E:

+        for (slave = 0; slave < ZCC_SLAVES; slave++)

+        {

+            if(g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_DT_S)

+            break;

+        }

+		if(slave == ZCC_SLAVES)

+			return;

+        if (1 == zCc_BusyToneAllowed() && g_Cc_CallDetail.state == ZCC_M_SEIZE_S)//ÓÐÆäËûºô½Ðʱ²»·ÅæÒô

+        {

+            g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_BSY_A;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_BSYT_S; 

+            g_Cc_CallDetail.slaveObj[slave].confcall = 0;

+            g_Cc_CallDetail.slaveObj[slave].heldcall = 0; 

+            CreateSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT,

+                    0,

+                    ZCCAPP_TIMER_BUSYTONE_INTERVAL,

+                    zCcApp_BusyToneTimer,

+                    NULL);   

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState CreateSoftTimer zCcApp_BusyToneTimer22222\n",__FUNCTION__);

+        }

+        else

+        {

+            zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        }

+        return;

+    case ZCC_HOOKOFF_IDLE_TIMER_E:

+    	for (slave = 0; slave < ZCC_SLAVES; slave++)

+        {

+            if(g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_DT_S)

+            {

+            	g_Cc_CallDetail.slaveObj[slave].idle_second++;            	

+				if(g_Cc_CallDetail.slaveObj[slave].idle_second >= 5000/ZCCAPP_TIMER_HOOKOFF_IDLE_INTERVAL)

+				{

+					int rt;

+					char hotline[ZDIAL_NUM_MAX-1];

+					

+					memset(hotline, 0, sizeof(hotline));

+					rt = cfg_get_item("dialog_hotline_str", hotline, sizeof(hotline)-1);

+					if(rt!=0 || strlen(hotline)<=0)

+					{

+						DeleteSoftTimer(ZCCAPP_TIMER_HOOKOFF_IDLE);

+						break;

+					}

+					

+					strcpy(g_Cc_CallDetail.digits, hotline);

+					g_Cc_CallDetail.dCount = strlen(hotline);

+

+					MSG_BUF msgBuf = {0};

+	                msgBuf.usMsgCmd   = ZCC_DTMF_E;

+	                msgBuf.src_id = MODULE_ID_SLIC;

+	                msgBuf.aucDataBuf[0] = (UINT8)'#';

+	                msgBuf.usDataLen = 1;

+	                zCc_SendMsgToSub(&msgBuf);

+

+	                g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_SIL_A;

+        			g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_DACCM_S;

+

+	                DeleteSoftTimer(ZCCAPP_TIMER_HOOKOFF_DETECT);

+	                

+					ccapp_log("==> HOOKOFF_IDLE_TIMER send hotline=%s\n", hotline);

+				}

+            }

+        }

+    	break;

+    case ZCC_DTMFTIMER_E:

+        for (slave = 0; slave < ZCC_SLAVES; slave++)

+        {

+            if(g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_DACCM_S)

+            break;

+        }

+		if(slave == ZCC_SLAVES)

+			return;

+        g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount++] = ZCC_TIMEOUT_SIGN;

+        ret = zCc_DigitsMatch();

+        zCc_DigitsMatchRltProc(ret);

+        if (ZCC_MATCHERR != ret)

+        {

+            if (g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_IDLE_S)//ss

+            {

+                zCc_SendSsReq(g_Cc_CallDetail.digits);

+                g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+            }

+            else

+            {

+                zCc_SendAtDialReq(g_Cc_CallDetail.digits);

+            }

+        }

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SNO_M;

+        zCc_ClearDigits();

+        return;

+    case ZCC_TKYTIMER_E:

+        for (slave = 0; slave < ZCC_SLAVES; slave++)

+        {

+            if(g_Cc_CallDetail.slaveObj[slave].tone == ZCC_TONE_TKY_A)

+            break;

+        }

+		if(slave == ZCC_SLAVES)

+			return;

+        SLIC_Stop_Signal(0, TONE_SIGNAL);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_SIL_A;

+        if (!(0 == zCc_GetSpecSlave(ZCC_S_TKYT_S)

+           &&(g_Cc_CallDetail.slaveObj[slave].state== ZCC_S_WAIT_RESOURCE_S

+            ||g_Cc_CallDetail.slaveObj[slave].state== ZCC_S_TRYING_S)

+           && g_Cc_CallDetail.lastTone == ZCC_TONE_TKY_A))

+        {

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_SIL_S;

+        }

+        g_Cc_CallDetail.lastTone = ZCC_TONE_SIL_A;

+        return;

+    case ZCC_SSDIALTONETIMER_E:

+        zCc_InitSlaveObj(0);//·Å²¦ºÅÒôµÄslave0 Çå¿Õ

+        zCc_ClearDigits();      

+        if (1 == zCc_CallCount() 

+            && (g_Cc_CallDetail.lastTone == ZCC_TONE_DIAL_A))//µ±Ç°Ö»ÓÐһ·£¬Í£Ö¹²¦ºÅÒô

+        {                

+            SLIC_Stop_Signal(0,0);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+            g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+            if (1 == zCc_HeldCall())//Òѱ£³Ö£¬»Ö¸´

+            {

+                chldret = zCc_SendAtChldReq(2);

+            }

+            else if (0 != zCc_ActiveCall())

+            {

+                SLIC_Start_PCM();

+            }

+        }

+        else if (1 < zCc_CallCount() && (g_Cc_CallDetail.lastTone == ZCC_TONE_DIAL_A))//active/held mpty and held+waiting

+        {            

+            SLIC_Stop_Signal(0,0);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+            g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+            if((0 == zCc_HeldCall() && 0 != g_Cc_CallDetail.ringCid)//active+waiting »Ö¸´ÓïÒô£¬held+waiting, ²»»Ö¸´ÓïÒô£¬·Åºô½ÐµÈ´ýÒô

+            ||(0 != zCc_HeldCall() && 0 !=zCc_ActiveCall()))//active+held»Ö¸´ÓïÒô

+            {

+                SLIC_Start_PCM();

+                zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Start_PCM <---\n",__FUNCTION__);

+            }

+        }

+        return;

+    case ZCC_FLASH_E:

+    	ccapp_log("ZCC_FLASH_E cnt=%d held=%d active=%d BefDial=%d",

+    		zCc_CallCount(),

+    		zCc_HeldCall(),

+    		zCc_ActiveCall(),

+    		zCc_MoBeforDialingCall());

+    		

+        if (!(zCc_CallCount() > 1 && g_Cc_CallDetail.digits[0] == ZCC_FLASH_SIGN))//¶à·ºô½Ðʱ£¬ÐèÒªÅжÏflashÁ¬·¢Á½´ÎµÄ³¡¾°£¬²»Çå³ý

+        {

+            zCc_ClearDigits();

+        }

+        DeleteSoftTimer(ZCCAPP_TIMER_HOOKOFF_DETECT);//ÊÕµ½ÉÁ¶Ï£¬µ±Ç°¶¨Ê±Æ÷¶¼ÐèҪֹͣ£¬ºóÐøÔÙÆô¶¯

+        DeleteSoftTimer(ZCCAPP_TIMER_DTMF_DETECT);

+        DeleteSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT);

+        DeleteSoftTimer(ZCCAPP_TIMER_TKYTONE_DETECT);

+        DeleteSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT);

+        

+        callCnt = zCc_CallCount();

+        

+        if (g_Cc_CallDetail.ringCid && (g_Cc_CallDetail.slaveObj[g_Cc_CallDetail.ringCid].tone == ZCC_TONE_CIDCW_A))//ºô½ÐµÈ´ý£¬¸ù¾ÝflashºóÃæµÄ×Ö·û¾ö¶¨ºóÐø²Ù×÷

+        {

+            if(g_Cc_CallDetail.digits[0] == ZCC_FLASH_SIGN)

+            {

+                zCc_InitSlaveObj(0);

+                zCc_ClearDigits();      

+                SLIC_Stop_Signal(0,0);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+                g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+                if (0 != zCc_ActiveCall())

+                {

+                    SLIC_Start_PCM();

+                }

+                break;

+            }

+            g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount++] = ZCC_FLASH_SIGN;

+            // slave[0] to play dial tone

+             CreateSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT,

+                 0,

+                 ZCCAPP_TIMER_HOOKOFF_INTERVAL,

+                 zCcApp_SsDialToneTimer,

+                 NULL);  

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: CreateSoftTimer zCcApp_SsDialToneTimer\n",__FUNCTION__);

+            g_Cc_CallDetail.evt[0] = ZCC_DIAL_E;

+            //g_Cc_CallDetail.slaveObj[g_Cc_CallDetail.ringCid].tone = ZCC_TONE_OFF_A;±£Áô¸Ã×ֶΣ¬ÓÃÓÚflash4µÈʧ°Üʱ»Ö¸´ºô½ÐµÈ´ýÒô

+            SLIC_Stop_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Stop_PCM2222\n",__FUNCTION__);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:ZCC_FLASH_E\n",__FUNCTION__);

+            break;

+        }

+                

+        if (  callCnt==0 //·Å²¦ºÅÒô»¹Î´Íê³É²¦ºÅ»òÕª»ú䲦ºÅ·ÅæÒôº¿ÃùÒô¾²Òô

+            ||(callCnt ==1 && zCc_FlashClearCall() > 0))  //ÕÒµ½½¨Á¢ÖеÄÖ÷½ÐÒÔ¼°ÊÍ·ÅÖеĺô½Ð£¬ÊÍ·Å£¬²¢·Å²¦ºÅÒô

+        {

+            zCc_InitSlaveObj(0);

+            g_Cc_CallDetail.evt[0] = ZCC_DIAL_E;

+            SLIC_Stop_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:SLIC_Stop_PCM\n",__FUNCTION__);

+            g_Cc_CallDetail.hookofffg = TRUE;  

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:ZCC_FLASH_E\n",__FUNCTION__);

+            break;

+        }

+        

+        if (zCc_ActiveCall() == callCnt) //Ö»ÓÐactive call£¬±£³ÖËü£¬²¢·Å²¦ºÅÒô

+        {

+            if (callCnt > 1) // conf call, ·Å²¦ºÅÒô

+            {

+                g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount++] = ZCC_FLASH_SIGN;

+                g_Cc_CallDetail.digits[ZDIAL_NUM_MAX-1] = 1;// ¼Ç¼±¾´Î²Ù×÷ΪÕë¶Ôconf µÄ

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:ZCC_FLASH_E\n",__FUNCTION__);

+            }

+            else

+            {

+                chldret = zCc_SendAtChldReq(2);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:ZCC_FLASH_E\n",__FUNCTION__);

+            g_Cc_CallDetail.waitchldresult = 1;

+            }

+            break;

+        }

+        

+        if (zCc_HeldCall() == callCnt) //Ö»ÓÐheld call£¬»Ö¸´

+        {

+            if (callCnt == 1 )

+            {

+                chldret = zCc_SendAtChldReq(2);

+                zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:ZCC_FLASH_E\n",__FUNCTION__);

+            }

+            else

+            {

+                g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount++] = ZCC_FLASH_SIGN;

+                CreateSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT,

+                                 0,

+                                 ZCCAPP_TIMER_HOOKOFF_INTERVAL,

+                                 zCcApp_SsDialToneTimer,

+                                 NULL);   

+                zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:CreateSoftTimer zCcApp_SsDialToneTimer\n",__FUNCTION__);

+                g_Cc_CallDetail.evt[0] = ZCC_DIAL_E;

+                

+            }

+            break;

+        }

+        //active + held

+

+        if(g_Cc_CallDetail.digits[0] == ZCC_FLASH_SIGN)

+        {

+            zCc_InitSlaveObj(0);

+            zCc_ClearDigits();      

+            SLIC_Stop_Signal(0,0);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+            g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+            if (0 != zCc_ActiveCall())

+            {

+                SLIC_Start_PCM();

+            }

+            break;

+        }   

+

+		/*

+			zCc_MSeizeState befor=1 act=0 held=1 callCnt=2

+				zCc_MoBeforDialingCall slave[1]=8

+				zCc_MoBeforDialingCall slave[2]=4

+		*/

+        ccapp_log("ZCC_FLASH_E befor=%d active=%d held=%d callCnt=%d",

+        	zCc_MoBeforDialingCall(),

+        	zCc_ActiveCall(),

+        	zCc_HeldCall(),

+        	callCnt);

+

+        if (((0 != zCc_MoBeforDialingCall())			

+        	&& (0 != zCc_ActiveCall() || 0 != zCc_HeldCall())) //active or held + ½¨Á¢Öеĺô½Ð

+            ||(0 != zCc_MoBeforDialingCall() && 1 == callCnt))

+        {

+        	/*if(g_Cc_CallDetail.digits[0]==ZCC_FLASH_SIGN && 

+        		strlen(g_Cc_CallDetail.digits)<=3)

+        	{

+				zCc_InitSlaveObj(0);

+            	zCc_ClearDigits();    

+            	zCc_SendAtChldReq(2);

+            	ccapp_log("get ZCC_FLASH_SIGN and return to old talk");

+        	}*/

+

+        	int cid = zCc_GetMoBeforDialingCallCID();

+        	if(cid>=0 && zCc_HeldCall()!=0)	// drop the beforeDialing call

+        	{

+				zCc_InitSlaveObj(cid);

+            	zCc_ClearDigits();    

+            	zCc_SendAtChldReq(1);

+            	ccapp_log("drop the beforeDialing call cid=%d", cid);

+        	}

+        	

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:ZCC_FLASH_E return\n",__FUNCTION__);

+            return;

+        }

+        

+        g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount++] = ZCC_FLASH_SIGN;

+        g_Cc_CallDetail.evt[0] = ZCC_DIAL_E;

+        CreateSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT,

+                 0,

+                 ZCCAPP_TIMER_HOOKOFF_INTERVAL,

+                 zCcApp_SsDialToneTimer,

+                 NULL);   

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:CreateSoftTimer zCcApp_SsDialToneTimer\n",__FUNCTION__);

+        SLIC_Stop_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:SLIC_Stop_PCM\n",__FUNCTION__);

+        break;

+

+    case ZCC_RESOURCE_READY_E:

+        g_Cc_CallDetail.evt[slave] = ZCC_RESOURCE_READY_E;

+        break;

+        /*ATÃüÁîÏìÓ¦£¬Ä¿Ç°Ö»ÓÐatdµÄÏìÓ¦ÐèÒª´¦Àí*/

+    case MSG_CMD_ATD_DIAL_RSP:

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ATD_rsp=%d\n",__FUNCTION__,((T_zCcapp_optRsp*)ptMsgBuf->aucDataBuf)->result);

+        if(((T_zCcapp_optRsp*)ptMsgBuf->aucDataBuf)->result == 0)

+            break;

+        slave = zCc_GetDialingSlave(1);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SendAtDialReq:RECV ERROR\n",__FUNCTION__);

+        slave = zCc_GetDialingSlave(1);

+        if (1 == zCc_BusyToneAllowed() && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0 && g_Cc_CallDetail.state == ZCC_M_SEIZE_S)//ÓÐÆäËûºô½ÐÇÒÒѹһúʱ²»·ÅæÒô

+        {

+            CreateSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT,

+                        0,

+                        ZCCAPP_TIMER_BUSYTONE_INTERVAL,

+                        zCcApp_BusyToneTimer,

+                        NULL);  

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SendAtDialReq CreateSoftTimer zCcApp_BusyToneTimer\n",__FUNCTION__);

+            g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_BSY_A;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_BSYT_S;

+            g_Cc_CallDetail.slaveObj[slave].confcall = 0;

+            g_Cc_CallDetail.slaveObj[slave].heldcall = 0;

+        }

+        else

+        {           

+        	char num[ZDIAL_NUM_MAX+1];

+        	strcpy(num, g_Cc_CallDetail.slaveObj[slave].number);

+        	

+            zCc_InitSlaveObj(slave);

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+

+			if(zCc_find_held_cid()|| zCc_find_held_incoming_cid())  // restore prvious talk to active

+			{

+				zCc_SendAtChldReq(2);

+

+				char temp[200];

+                sprintf(temp, "echo \"%s get error dialout cid=%d num=%s\" > /tmp/log.ccapp.callout.err",

+                	get_local_date_time(), slave, num);

+                soft_system(temp);

+			}

+        }

+        break;

+    /*case MSG_CMD_ATA_RSP:

+    case MSG_CMD_CHUP_RSP:

+    case MSG_CMD_VTS_RSP:

+    case MSG_CMD_ZIMSPLUS_RSP:

+    case MSG_CMD_CCFC_RSP:

+    case MSG_CMD_CLCK_RSP:

+        break;*/

+    case MSG_CMD_CHLD_RSP:        

+                zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  CHLD_rsp=%d\n",__FUNCTION__,((T_zCcapp_optRsp*)ptMsgBuf->aucDataBuf)->result);

+        if(g_Cc_CallDetail.waitchldresult == 1 )

+        {

+            g_Cc_CallDetail.waitchldresult = 0;

+            if (((T_zCcapp_optRsp*)ptMsgBuf->aucDataBuf)->result == 0)

+            {

+                CreateSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT,

+                     0,

+                     ZCCAPP_TIMER_HOOKOFF_INTERVAL,

+                     zCcApp_SsDialToneTimer,

+                     NULL);   

+                zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:CreateSoftTimer zCcApp_SsDialToneTimer\n",__FUNCTION__);

+                g_Cc_CallDetail.evt[0] = ZCC_DIAL_E;

+                SLIC_Stop_PCM(); 

+                zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_MSeizeState:SLIC_Stop_PCM\n",__FUNCTION__);

+                }

+        }

+        break;

+

+    case ZCC_SEIZE_E: // ͻȜ

+    default:

+        // do nothing

+        break;

+    }

+}

+

+

+//get local time string , format"YYYY-MM-DD HH:MM:SS"

+char *get_local_date_time(void)

+{

+	time_t now;

+	struct tm *timenow;

+	static char localtimestr[32];

+	

+	time(&now);

+	timenow = localtime(&now);

+	memset(localtimestr, 0, 32);

+	if(timenow)

+	snprintf(localtimestr, 32, "%04d-%02d-%02d %02d:%02d:%02d",

+		timenow->tm_year + 1900, timenow->tm_mon+1, timenow->tm_mday,

+		timenow->tm_hour, timenow->tm_min, timenow->tm_sec);

+	return localtimestr;

+}

+

+

+//get local time string , format"MMDDHHMM"

+char *get_local_datetime(char *buff)

+{

+	time_t now;

+	struct tm *timenow;

+	static char localtimestr[48];

+	

+	memset(localtimestr, 0, sizeof(localtimestr));

+

+	time(&now);

+	timenow = localtime(&now);

+	if(timenow)

+	sprintf(localtimestr, "%02d%02d%02d%02d",

+		timenow->tm_mon+1, timenow->tm_mday,

+		timenow->tm_hour, timenow->tm_min);

+

+	if(buff!=NULL)

+		strcpy(buff, localtimestr);

+		

+	return localtimestr;

+}

+

+

+int zCc_find_held_cid(void)

+{

+	int slavetmp;

+

+	for (slavetmp = 1; slavetmp < ZCC_SLAVES; slavetmp++)

+	{

+		if (g_Cc_CallDetail.slaveObj[slavetmp].heldcall!=0)

+		{

+			return slavetmp;

+		}

+	}

+

+	return 0;

+}

+

+int zCc_talking_count(void)

+{

+	int cnt = 0;

+	int slavetmp;

+

+	for (slavetmp = 1; slavetmp < ZCC_SLAVES; slavetmp++)

+	{

+		if (g_Cc_CallDetail.slaveObj[slavetmp].state==ZCC_S_TALKING_S)

+			cnt++;

+	}

+

+	return cnt;

+}

+

+

+int zCc_find_held_incoming_cid(void)

+{

+	int slavetmp;

+

+	for (slavetmp = 1; slavetmp < ZCC_SLAVES; slavetmp++)

+	{

+		if (g_Cc_CallDetail.slaveObj[slavetmp].state==ZCC_S_TRYING_S)

+		{

+			return slavetmp;

+		}

+	}

+

+	return 0;

+}

+

+

+int zCc_find_all_callout(int slave[ZCC_SLAVES])

+{

+	int n=0;

+

+	int i;

+	for (i = 1; i < ZCC_SLAVES; i++)

+	{

+		if (g_Cc_CallDetail.slaveObj[i].is_callout!=0)

+		{

+			slave[n] = i;

+			n++;

+		}

+	}

+

+	return n;

+}

+

+

+void zCc_hungup_all(int slave)

+{

+	int slavetmp;

+	if (!g_Cc_CallDetail.chupSent)

+    {

+        zCc_SendAtHangupReq();

+        for (slavetmp = 1; slavetmp < ZCC_SLAVES; slavetmp++)

+        {

+            if (g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_DIALING_S

+             || g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_RINGBACK_S

+             || g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_TALKING_S

+             || g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_TRYING_S 

+             || g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_WAIT_RESOURCE_S)

+            {

+                g_Cc_CallDetail.slaveObj[slavetmp].waitDSCI6 = 1;

+            }

+        }

+        if (!((zCc_CallCount() == 1) && ((ZCC_S_DACCM_S == g_Cc_CallDetail.slaveObj[slave].state)

+            || (ZCC_S_DIALING_S == g_Cc_CallDetail.slaveObj[slave].state)))

+            && !((zCc_CallCount() > 1) && (0 != zCc_MtInactiveCall()) && (0 != zCc_MoInactiveCall())))//·Çidle״̬¶¼ÊÇÕª»ú̬ÊÕµ½À´µçÇҾܽÓÀ´µç

+        {

+            g_Cc_CallDetail.chupSent = TRUE;//»¹ÓÐÆäËûºô½Ð£¬²»ÔÙÖØ¸´·¢chup

+        }

+    }   

+}

+

+VOID zCc_RunMaster(MSG_BUF *ptMsgBuf)

+{

+    UINT8   slave = 0;

+    UINT8   slavetmp = 0;

+    SIGNAL_DATA  tSig;

+    int held_call_cid;

+    int incoming_call_cid;    

+

+	static int old_state = -1;

+	if(old_state != g_Cc_CallDetail.state)

+	{

+		ccapp_log("=======================\n");

+		ccapp_log("zCc_RunMaster state %d --> %d\n", old_state, g_Cc_CallDetail.state);

+		old_state = g_Cc_CallDetail.state;

+	}

+

+    memset(tSig.cid, 0, 32);

+

+    zCc_CheckSlaveState("start zCc_RunMaster");

+    switch (g_Cc_CallDetail.state)

+    {

+    case ZCC_M_RELEASE_S:

+        zCc_MReleaseState(ptMsgBuf);

+        break;

+

+    case ZCC_M_RINGING_S:

+        zCc_MRingingState(ptMsgBuf);

+        break;

+

+    case ZCC_M_SEIZE_S:

+    default:

+        zCc_MSeizeState(ptMsgBuf);

+        break;

+    }

+

+    zCc_CheckSlaveState("in zCc_RunSlave");

+    /* Now run the slaves.  Since the slaves will always be run with the master , run them now.   */

+    for (slave = 0; slave < ZCC_SLAVES; slave++)

+    {

+        zCc_RunSlave(slave);

+        g_Cc_CallDetail.evt[slave] = ZCC_NO_E;

+    }

+

+    

+    /* Process sMsg.     */

+    for (slave = 1; slave < ZCC_SLAVES; slave++)

+    {

+        if(g_Cc_CallDetail.slaveObj[slave].sMsg!=ZCC_SNO_M)

+        {

+            zCc_CheckSlaveState("in slaveObj[slave].sMsg");

+            ccapp_log("g_Cc_CallDetail.slaveObj[%d].sMsg=%d", 

+                slave, 

+                g_Cc_CallDetail.slaveObj[slave].sMsg);

+        }

+        

+        switch (g_Cc_CallDetail.slaveObj[slave].sMsg)

+        {

+        case ZCC_SINV_M:

+            if (g_Cc_CallDetail.slaveObj[slave].state == ZCC_S_IDLE_S)//ss

+            {

+                zCc_SendSsReq(g_Cc_CallDetail.digits);

+                g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+            }

+            else

+            {

+                zCc_SendAtDialReq(g_Cc_CallDetail.digits);

+            }

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SNO_M;

+            zCc_ClearDigits();

+            break;

+        case ZCC_SDTMF_M:            

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  ZCC_SDTMF_M handling ptMsgBuf->aucDataBuf[0] = %d\n",__FUNCTION__,ptMsgBuf->aucDataBuf[0]);

+            zCc_SendAtDtmfReq((char*)(&(ptMsgBuf->aucDataBuf[0])));

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SNO_M;

+			if(g_Cc_CallDetail.waitchldresult == 0)//chld´¦Àí¹ý³ÌÖв»Çå³ý²¦ºÅ°´¼üadd by zpr

+            zCc_ClearDigits();

+            break;

+        case ZCC_SRING_M:

+            if (g_Cc_CallDetail.state == ZCC_M_RELEASE_S)// && g_Cc_CallDetail.ringCid)

+            {

+                g_Cc_CallDetail.state = ZCC_M_RINGING_S;

+                memset(&tSig, 0, sizeof(tSig));

+                tSig.signal_type = RING_SIGNAL;

+                //memcpy(tSig.cid, g_Cc_CallDetail.number, strlen(g_Cc_CallDetail.number));

+				strncpy(tSig.cid, g_Cc_CallDetail.number, sizeof(tSig.cid)-1);

+                get_local_datetime(tSig.date_time);

+                zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_RunMaster RING_SIGNAL,number = %s\n",__FUNCTION__,g_Cc_CallDetail.number);

+                SLIC_Play_Signal(0, 0, &tSig);  

+                zCc_SetLedStatus("ledblink");

+            }        

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SNO_M;

+            break;

+        case ZCC_SANS_M://ʲô³¡¾°?

+            if (zCc_CallCount() == 1)

+            {

+                SLIC_Stop_Signal(0, TONE_SIGNAL);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  : SLIC_Stop_Signal <---\n",__FUNCTION__);

+                g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+            }            

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SNO_M;

+            break;

+        case ZCC_SDISCN_M:

+        	held_call_cid = zCc_find_held_cid();

+        	incoming_call_cid = zCc_GetSpecSlave(ZCC_S_TRYING_S);

+			ccapp_log("ZCC_SDISCN_M held_call_cid=%d incoming_call_cid=%d chupSent=%d", 

+			            held_call_cid,

+			            incoming_call_cid,

+			            g_Cc_CallDetail.chupSent);

+

+			if((held_call_cid!=0 ||incoming_call_cid!=0) && g_Cc_CallDetail.chupSent==FALSE)

+			{

+				int active_call_cid = 0;

+

+				for (slavetmp = 1; slavetmp < ZCC_SLAVES; slavetmp++)

+                {

+                    if( (g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_DIALING_S

+                     || g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_RINGBACK_S

+                     || g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_TALKING_S

+//                     || g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_TRYING_S // incoming_call_cid

+                     || g_Cc_CallDetail.slaveObj[slavetmp].state == ZCC_S_WAIT_RESOURCE_S) &&

+                      g_Cc_CallDetail.slaveObj[slavetmp].heldcall==0)

+                    {

+                        active_call_cid = slavetmp;

+                        break;

+                    }

+                }

+

+				ccapp_log("ZCC_SDISCN_M active_call_cid=%d", active_call_cid);

+				

+                if(active_call_cid!=0)

+                {

+					zCc_SendAtChldReq(10+active_call_cid);

+

+	                g_Cc_CallDetail.chupSent = TRUE;

+	                g_Cc_CallDetail.state = ZCC_M_RINGING_S;

+

+	                /*MSG_BUF   msgBuff      = {0};				// let while(1) run one more time

+	                msgBuff.usMsgCmd   = ZCC_ASSIST_MSG_E;

+	                msgBuff.src_id = MODULE_ID_SLIC;

+	                zCc_SendMsgToSub(&msgBuff);

+

+	                ccapp_log("sendMsg ZCC_ASSIST_MSG_E"); */

+                }

+                else

+                {

+					zCc_hungup_all(slave);

+                }

+			}

+			else

+        	{

+	            zCc_hungup_all(slave); 

+	       	}     

+

+	        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SNO_M;

+            break;

+        default:

+            break;

+        }

+    }

+

+    if (g_Cc_CallDetail.state == ZCC_M_RINGING_S 

+        && g_Cc_CallDetail.ringCid == 0

+        && zCc_find_held_cid()==0 

+        && zCc_find_held_incoming_cid()==0

+        && local_test_call_st==0)

+    {

+        g_Cc_CallDetail.state = ZCC_M_RELEASE_S;

+        SLIC_Stop_Signal(0, RING_SIGNAL);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  : SLIC_Stop_Signal <---\n",__FUNCTION__);

+    }

+    /*else if (g_Cc_CallDetail.state == ZCC_M_SEIZE_S && g_Cc_CallDetail.ringCid > 0 && zCc_CallCount() == 1)

+    {

+        //תΪ½ÓÌý

+        ¹Ò»úºó¿ÉÒÔÖªµÀÀ´µç²¢½ÓÌý£¬ÎÞÐèÌØÊâ´¦Àí¡£

+    }*/    

+    zCc_ControlTone();

+

+    // ´¦Àíslave·µ»ØµÄÏûÏ¢

+    zCc_CheckSlaveState("End zCc_RunMaster");

+}

+

+VOID zCc_RunSlave(UINT8   slave)

+{

+    if (g_Cc_CallDetail.evt[slave] == ZCC_NO_E)

+    {

+        return;

+    }

+    

+    /* Call respective state function based on the current state. */

+    printf("[ccapp_debug]:Slave Run,slave:%d, state=%d,event=%d\n", slave, g_Cc_CallDetail.slaveObj[slave].state,g_Cc_CallDetail.evt[slave]);

+    zCcSlaveFsmFunc[g_Cc_CallDetail.slaveObj[slave].state](slave);

+}

+

+VOID zCc_SIdleState(UINT8   slave)

+{

+    UINT8   tmpslave = 0;

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SIdleState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave,g_Cc_CallDetail.evt[slave]);

+    g_Cc_CallDetail.slaveObj[slave].cid = slave;

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_DIAL_E:

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_DIAL_A;

+        g_Cc_CallDetail.slaveObj[slave].state = g_Cc_CallDetail.digits[0] != ZCC_FLASH_SIGN ? ZCC_S_DT_S : ZCC_S_DACCM_S;

+

+        if (g_Cc_CallDetail.hookofffg == TRUE)

+        {

+            g_Cc_CallDetail.hookofffg = FALSE;

+            CreateSoftTimer(ZCCAPP_TIMER_HOOKOFF_DETECT,

+                            0,

+                            ZCCAPP_TIMER_HOOKOFF_INTERVAL,

+                            zCcApp_HookOffTimer,

+                            NULL);  

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SIdleState CreateSoftTimer zCcApp_HookOffTimer\n",__FUNCTION__);

+

+			g_Cc_CallDetail.slaveObj[slave].idle_second = 0;

+            CreateSoftTimer(ZCCAPP_TIMER_HOOKOFF_IDLE,

+                            TIMER_FLAG_RESTART,

+                            ZCCAPP_TIMER_HOOKOFF_IDLE_INTERVAL,

+                            zCcApp_HookOff_Idle_Timer,

+                            NULL);  

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SIdleState CreateSoftTimer zCcApp_HookOff_Idle_Timer\n",__FUNCTION__);

+        }

+        break;

+    case ZCC_DTMF_E://held+dailing

+        if ( 0 != zCc_HeldCall() && 0 == zCc_ActiveCall())

+        {    

+            DeleteSoftTimer(ZCCAPP_TIMER_SSDIALTONE_DETECT);            

+            CreateSoftTimer(ZCCAPP_TIMER_DTMF_DETECT,

+                        0,

+                        ZCCAPP_TIMER_DTMF_INTERVAL,

+                        zCcApp_DtmfTimer,

+                        NULL);  

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SIdleState CreateSoftTimer zCcApp_DtmfTimer\n",__FUNCTION__);

+            g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_SIL_A;          

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_DACCM_S;

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SIdleState handling ZCC_DTMF_E\n",__FUNCTION__);

+        }

+        break;

+    case ZCC_CIDCW_E:

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_CIDCW_A;

+         //lint -fallthrough

+    case ZCC_SINVITE_E:

+        zCc_ShowAllSlaveWithTips("zCc_SIdleState");

+        if (((0 != zCc_GetDialingSlave(1)) || (0 != zCc_GetSpecSlave(ZCC_S_RINGBACK_S)))//ÓÐÒѾ­Ï·¢atd µÄºô½Ðʱ¾Ü¾øÐÂÀ´µç

+			 || (0 != zCc_MoInactiveCall()))//

+        {

+            //zCc_InitSlaveObj(slave);¼ÌÐøµÈdsci6Éϱ¨

+            g_Cc_CallDetail.slaveObj[slave].state = g_Cc_CallDetail.resourceReady?ZCC_S_TRYING_S:ZCC_S_WAIT_RESOURCE_S;

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SDISCN_M;

+            return;

+        }

+        

+        g_Cc_CallDetail.ringCid = slave;

+        if(g_Cc_CallDetail.evt[slave]==ZCC_CIDCW_E)

+            g_Cc_CallDetail.slaveObj[slave].is_cidcw = TRUE;

+        else

+            g_Cc_CallDetail.slaveObj[slave].is_cidcw = FALSE;

+        strcpy(g_Cc_CallDetail.slaveObj[slave].number, g_Cc_CallDetail.number);

+        

+        if (g_Cc_CallDetail.resourceReady == 1)

+        {

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SRING_M;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_TRYING_S;

+        }

+        else

+        {

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_WAIT_RESOURCE_S;

+        }

+        break;

+    

+    case ZCC_SRING_E://cid²»Æ¥ÅäµÄ³¡¾°

+        tmpslave = zCc_GetDialingSlave(0);

+        if (0 == tmpslave )

+        {

+            return;

+        }        

+        g_Cc_CallDetail.slaveObj[slave] = g_Cc_CallDetail.slaveObj[tmpslave];

+        zCc_InitSlaveObj(tmpslave);

+        g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_RINGBACK_S;

+        break;   

+    case ZCC_SDISCN_MO_E://cid²»Æ¥ÅäµÄ³¡¾°

+        tmpslave = zCc_GetDialingSlave(0);

+        if (0 == tmpslave )

+        {

+            return;

+        }        

+        g_Cc_CallDetail.slaveObj[slave] = g_Cc_CallDetail.slaveObj[tmpslave];

+        zCc_InitSlaveObj(tmpslave);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, tmpslave);

+        if (1 == zCc_BusyToneAllowed() && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0&& g_Cc_CallDetail.state == ZCC_M_SEIZE_S)//ÓÐÆäËûºô½ÐÇÒÒѹһúʱ²»·ÅæÒô

+        {

+            CreateSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT,

+                        0,

+                        ZCCAPP_TIMER_BUSYTONE_INTERVAL,

+                        zCcApp_BusyToneTimer,

+                        NULL);  

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SIdleState CreateSoftTimer zCcApp_BusyToneTimer\n",__FUNCTION__);

+            g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_BSY_A;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_BSYT_S;

+            g_Cc_CallDetail.slaveObj[slave].confcall = 0;

+            g_Cc_CallDetail.slaveObj[slave].heldcall = 0;

+        }

+        else

+        {           

+            zCc_InitSlaveObj(slave);

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        }

+        return;

+    default:

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SIdleState:evt=%d\n",__FUNCTION__,g_Cc_CallDetail.evt[slave]);

+        break;

+    }

+}

+

+VOID zCc_SDtState(UINT8   slave)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SDtState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_DTMF_E:

+    	DeleteSoftTimer(ZCCAPP_TIMER_HOOKOFF_IDLE);

+    	g_Cc_CallDetail.slaveObj[slave].idle_second = 0;

+    	

+        DeleteSoftTimer(ZCCAPP_TIMER_HOOKOFF_DETECT);

+        

+        CreateSoftTimer(ZCCAPP_TIMER_DTMF_DETECT,

+                    0,

+                    ZCCAPP_TIMER_DTMF_INTERVAL,

+                    zCcApp_DtmfTimer,

+                    NULL);    

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SDtState CreateSoftTimer zCcApp_DtmfTimer\n",__FUNCTION__);

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_SIL_A;

+        g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_DACCM_S;

+        break;

+

+    case ZCC_DISCN_E:

+        //zCc_ClearDigits();

+        zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        return;

+        

+    default://Ö»»áÊÇslave0£¬²»¿ÉÄÜÓëdsciµÄcid³åÍ»

+        break;

+    }

+}

+

+VOID zCc_SDaccmState(UINT8   slave)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SDaccmState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    UINT8   ret = 0;

+    UINT8   tmpslave = 0;

+    

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_DTMF_E:

+        DeleteSoftTimer(ZCCAPP_TIMER_DTMF_DETECT);

+        ret = zCc_DigitsMatch();

+        break;

+

+    case ZCC_DISCN_E:

+        zCc_ClearDigits();

+        zCc_InitSlaveObj(slave);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        return;

+    case ZCC_CIDCW_E:

+    case ZCC_SINVITE_E://ÒÔdsciµÄcidΪ׼£¬ÖØÐ¸ømoµÄºô½Ð·ÖÅäidle cid                 

+        tmpslave = zCc_GetSpecSlave(ZCC_S_IDLE_S);

+        if (0 == tmpslave )

+        {

+            return;

+        } 

+        g_Cc_CallDetail.slaveObj[tmpslave] =  g_Cc_CallDetail.slaveObj[slave];

+        zCc_InitSlaveObj(slave);

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SDISCN_M;

+        g_Cc_CallDetail.slaveObj[slave].state = g_Cc_CallDetail.resourceReady?ZCC_S_TRYING_S:ZCC_S_WAIT_RESOURCE_S;

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SDaccmState: reject mtcall\n",__FUNCTION__, slave);

+        return;

+    default:

+        return;

+    }

+

+	if(ret==ZCC_LOCAL_TEST_CALL)

+    {

+    	SIGNAL_DATA tSig;

+    	if(zCc_talking_count())

+    	{

+			zCc_ClearDigits();

+			zCc_InitSlaveObj(slave);

+			return;

+    	}

+

+		SLIC_Stop_Signal(0, TONE_SIGNAL);

+		memset(&tSig, 0, sizeof(tSig));

+    	tSig.signal_type= TONE_SIGNAL;

+        tSig.tone_type = TONE_CW;

+        SLIC_Play_Signal(0, 0, &tSig);

+

+        zCc_ClearDigits();

+

+        g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+        g_Cc_CallDetail.evt[slave]= ZCC_NO_E;

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SNO_M;

+

+        local_test_call_st = LocalTestCallST_Start;

+

+        zCc_ShowAllSlaveWithTips("testCall-start");

+		return ;

+    }

+    

+    zCc_DigitsMatchRltProc(ret);

+}

+

+VOID zCc_SDialingState(UINT8   slave)

+{

+    UINT8   tmpslave = 0;

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SDialingState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_SRING_E:

+        g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_RINGBACK_S;

+        break;

+

+    case ZCC_SANS_E:

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+        g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_TALKING_S;

+        SLIC_Stop_Signal(0, TONE_SIGNAL);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SDialingState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+        g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+        SLIC_Start_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SDialingState: SLIC_Start_PCM <---\n",__FUNCTION__);

+        break;

+

+    case ZCC_DISCN_E:

+        //zCc_InitSlaveObj(slave);

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SDISCN_M;

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+        return;

+

+    case ZCC_SDISCN_MO_E:

+        if (1 == zCc_BusyToneAllowed() && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0 && g_Cc_CallDetail.state == ZCC_M_SEIZE_S)//ÓÐÆäËûºô½ÐÇÒÒѹһúʱ²»·ÅæÒô

+        {

+            CreateSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT,

+                        0,

+                        ZCCAPP_TIMER_BUSYTONE_INTERVAL,

+                        zCcApp_BusyToneTimer,

+                        NULL);  

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SDialingState CreateSoftTimer zCcApp_BusyToneTimer\n",__FUNCTION__);

+            g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_BSY_A;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_BSYT_S;

+            g_Cc_CallDetail.slaveObj[slave].confcall = 0;

+            g_Cc_CallDetail.slaveObj[slave].heldcall = 0;

+        }

+        else

+        {           

+            zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        }

+        return;

+    case ZCC_SDISCN_MT_E:

+        zCc_InitSlaveObj(slave);//Ö÷±»½Ð²¢·¢

+        //g_Cc_CallDetail.slaveObj[slave].waitDSCI6 = 0;

+        return;

+    case ZCC_CIDCW_E:

+    case ZCC_SINVITE_E://ÒÔdsciµÄcidΪ׼£¬ÖØÐ¸ømoµÄºô½Ð·ÖÅäidle cid                 

+        tmpslave = zCc_GetSpecSlave(ZCC_S_IDLE_S);

+        if (0 == tmpslave )

+        {

+            return;

+        } 

+        g_Cc_CallDetail.slaveObj[tmpslave] =  g_Cc_CallDetail.slaveObj[slave];

+        zCc_InitSlaveObj(slave);

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SDISCN_M;

+        g_Cc_CallDetail.slaveObj[slave].state = g_Cc_CallDetail.resourceReady?ZCC_S_TRYING_S:ZCC_S_WAIT_RESOURCE_S;

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SDaccmState: reject mtcall\n",__FUNCTION__, slave);

+        return;

+        

+    default:

+        return;

+    }

+}

+

+VOID zCc_SRingbackState(UINT8   slave)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SRingbackState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_SANS_E:

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+        g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_TALKING_S;

+        SLIC_Stop_Signal(0, TONE_SIGNAL);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SRingbackState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+        g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+        

+        if(g_Cc_CallDetail.slaveObj[slave].is_callout)

+        	SLIC_PolarityReverse(0, TRUE);

+        

+        SLIC_Start_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SRingbackState SLIC_Start_PCM2222\n",__FUNCTION__);

+        break;

+

+    case ZCC_DISCN_E:

+        //zCc_InitSlaveObj(slave);

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SDISCN_M;

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+        return;

+

+    case ZCC_SDISCN_MO_E:

+        if (1 == zCc_BusyToneAllowed() && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0 &&  g_Cc_CallDetail.state == ZCC_M_SEIZE_S)//ÓÐÆäËûºô½Ðʱ²»·ÅæÒô

+        {

+            CreateSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT,

+                        0,

+                        ZCCAPP_TIMER_BUSYTONE_INTERVAL,

+                        zCcApp_BusyToneTimer,

+                        NULL);  

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SRingbackState CreateSoftTimer zCcApp_BusyToneTimer\n",__FUNCTION__);

+            g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_BSY_A;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_BSYT_S;

+            g_Cc_CallDetail.slaveObj[slave].confcall = 0;

+            g_Cc_CallDetail.slaveObj[slave].heldcall = 0;

+            SLIC_Stop_PCM();

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SRingbackState SLIC_Stop_PCM\n",__FUNCTION__);

+        }

+        else

+        {

+            zCc_InitSlaveObj(slave);

+            if ( 0 == zCc_ActiveCall() && 0 == zCc_HeldCall())

+            {

+                SLIC_Stop_PCM();

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SRingbackState SLIC_Stop_PCM\n",__FUNCTION__);

+            }

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        }

+        return;

+    case ZCC_SDISCN_MT_E:

+        g_Cc_CallDetail.slaveObj[slave].waitDSCI6 = 0;

+        return;

+        

+    case ZCC_DTMF_E: // ²¦ºÅ

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SDTMF_M;///???

+        return;

+

+    case ZCC_RESOURCE_READY_E:           

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SRingbackState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+        SLIC_Stop_Signal(0, TONE_SIGNAL);

+        g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+        SLIC_Start_PCM();//×ÊÔ´ÒÑ·ÖÅä£¬Íø²à·ÅÒô

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SRingbackState SLIC_Start_PCM\n",__FUNCTION__);

+        return;

+        

+    default:

+        return;

+    }

+}

+

+VOID zCc_STalkingState(UINT8   slave)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_STalkingState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_DISCN_E:

+        //zCc_InitSlaveObj(slave);

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SDISCN_M;

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+        return;

+

+    case ZCC_SDISCN_MO_E:  

+    case ZCC_SDISCN_MT_E:

+        //zCc_InitSlaveObj(slave);

+        if (zCc_CallCount() >= 2 || g_Cc_CallDetail.state == ZCC_M_RELEASE_S)//»¹Ê£¶àÓÚһ·ºô½Ð

+        {

+            zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+            break;

+        }             

+        if (g_Cc_CallDetail.slaveObj[0].tone != ZCC_TONE_OFF_A)

+        {                   

+            zCc_InitSlaveObj(0);

+        }                             

+        if (1 == zCc_BusyToneAllowed() && g_Cc_CallDetail.slaveObj[slave].waitDSCI6 == 0)//ÓÐÆäËûºô½Ðʱ²»·ÅæÒô

+        {

+            CreateSoftTimer(ZCCAPP_TIMER_BUSYTONE_DETECT,

+                        0,

+                        ZCCAPP_TIMER_BUSYTONE_INTERVAL,

+                        zCcApp_BusyToneTimer,

+                        NULL);  

+            zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_STalkingState CreateSoftTimer zCcApp_BusyToneTimer\n",__FUNCTION__);

+            g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_BSY_A;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_BSYT_S;

+            g_Cc_CallDetail.slaveObj[slave].confcall = 0;

+            g_Cc_CallDetail.slaveObj[slave].heldcall = 0;

+        }

+        else

+        {

+            zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        }

+        return;

+        

+    case ZCC_DTMF_E: // ²¦ºÅ. µ÷ÕûÒôÁ¿µÄ´¦Àí´ýÔö¼Ó

+        if (g_Cc_CallDetail.slaveObj[slave].heldcall == 0)

+        {

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SDTMF_M;///???

+        }

+        return;

+    default:

+        return;

+    }

+}

+

+VOID zCc_SWaitResourceState(UINT8   slave)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SWaitResourceState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_RESOURCE_READY_E:

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SRING_M;

+        g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_TRYING_S;

+        break;

+

+    case ZCC_SDISCN_MT_E:

+        zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        return;

+        

+    default:

+        return;

+    }

+}

+

+VOID zCc_STryingState(UINT8   slave)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_STryingState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_CNCT_E:

+        g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SANS_M;

+        //lint -fallthrough

+    case ZCC_SANS_E: //CHLD=2, ÊÕµ½DSCIǨ״̬

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+        g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_TALKING_S;

+        g_Cc_CallDetail.ringCid = 0;

+        SLIC_Stop_Signal(0, TONE_SIGNAL);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_STryingState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+        g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+        SLIC_Start_PCM();

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_STryingState SLIC_Start_PCM\n",__FUNCTION__);

+        break;

+

+    case ZCC_SDISCN_MT_E:

+        zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        return;

+

+    case ZCC_DISCN_E://trying ̬ÊÕµ½¹Ò»úÏûÏ¢£¬Ö»ÄÜÊÇÕª»ú̬À´µç(²»°üÀ¨ºô½ÐµÈ´ý)µÄ³¡¾°

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+        SLIC_Stop_Signal(0, TONE_SIGNAL);

+        zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_STryingState: SLIC_Stop_Signal <---\n",__FUNCTION__);

+        g_Cc_CallDetail.lastTone = ZCC_TONE_OFF_A;

+        if (1 == zCc_CallCount() && (zCc_GetDiscSlave(ZCC_SDISCN_M) == 0)// Õª»ú̬À´µçʱ¹Ò»ú£¬Èç¹ûµ±Ç°Ö»ÓÐһ·ºô½Ð£¬»°»úתÈëÕñÁå

+        ||(2 == zCc_CallCount()  

+            && (0 != zCc_GetSpecSlave(ZCC_S_DACCM_S)

+             ||0 != zCc_GetSpecSlave(ZCC_S_BSYT_S)

+             ||0 != zCc_GetSpecSlave(ZCC_S_TKYT_S)

+             ||0 != zCc_GetSpecSlave(ZCC_S_SIL_S))))//Õª»úºó£¬À´µç£¬ÔÙ²¦ºÅ£¬¹Ò»ú£¬Ò²ÐèÒªÕñÁå

+        {

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SRING_M;

+        }

+        else

+        {

+            //zCc_InitSlaveObj(slave);

+            g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_OFF_A;

+            g_Cc_CallDetail.ringCid = 0;

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SDISCN_M;

+        }

+        return;

+        

+    default:

+        return;

+    }

+}

+

+VOID zCc_SBsyToneState(UINT8   slave)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SBsyToneState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_DISCN_E:

+        zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        return;  

+    case ZCC_CIDCW_E:

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_CIDCW_A;

+         //lint -fallthrough

+    case ZCC_SINVITE_E:

+        if ((0 != zCc_GetDialingSlave(1)) || (0 != zCc_GetSpecSlave(ZCC_S_RINGBACK_S)))//ÓÐÒѾ­Ï·¢atd µÄºô½Ðʱ¾Ü¾øÐÂÀ´µç

+        {

+            zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+            g_Cc_CallDetail.evt[slave] = ZCC_DISCN_E;

+            return;

+        }

+        g_Cc_CallDetail.ringCid = slave;

+        

+        if(g_Cc_CallDetail.evt[slave]==ZCC_CIDCW_E)

+            g_Cc_CallDetail.slaveObj[slave].is_cidcw = TRUE;

+        else

+            g_Cc_CallDetail.slaveObj[slave].is_cidcw = FALSE;

+            

+        if (g_Cc_CallDetail.resourceReady == 1)

+        {

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SRING_M;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_TRYING_S;

+        }

+        else

+        {

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_WAIT_RESOURCE_S;

+        }

+        break;   

+    default:

+        return;

+    }

+}

+

+VOID zCc_STkytState(UINT8   slave)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_STkytState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_DISCN_E:

+        zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        return; 

+    case ZCC_CIDCW_E:

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_CIDCW_A;

+         //lint -fallthrough

+    case ZCC_SINVITE_E:

+        if ((0 != zCc_GetDialingSlave(1)) || (0 != zCc_GetSpecSlave(ZCC_S_RINGBACK_S)))//ÓÐÒѾ­Ï·¢atd µÄºô½Ðʱ¾Ü¾øÐÂÀ´µç

+        {

+            zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+            g_Cc_CallDetail.evt[slave] = ZCC_DISCN_E;

+            return;

+        }

+        g_Cc_CallDetail.ringCid = slave;

+

+        if(g_Cc_CallDetail.evt[slave]==ZCC_CIDCW_E)

+            g_Cc_CallDetail.slaveObj[slave].is_cidcw = TRUE;

+        else

+            g_Cc_CallDetail.slaveObj[slave].is_cidcw = FALSE;

+            

+        if (g_Cc_CallDetail.resourceReady == 1)

+        {

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SRING_M;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_TRYING_S;

+        }

+        else

+        {

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_WAIT_RESOURCE_S;

+        }

+        break;       

+    default:

+        return;

+    }

+}

+

+VOID zCc_SSilState(UINT8   slave)

+{

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_SSilState g_Cc_CallDetail.evt[%d] = %d\n",__FUNCTION__,slave, g_Cc_CallDetail.evt[slave]);

+    switch (g_Cc_CallDetail.evt[slave])

+    {

+    case ZCC_DISCN_E:

+        zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+        return;

+    case ZCC_CIDCW_E:

+        g_Cc_CallDetail.slaveObj[slave].tone = ZCC_TONE_CIDCW_A;

+         //lint -fallthrough

+    case ZCC_SINVITE_E:

+        if ((0 != zCc_GetDialingSlave(1)) || (0 != zCc_GetSpecSlave(ZCC_S_RINGBACK_S)))//ÓÐÒѾ­Ï·¢atd µÄºô½Ðʱ¾Ü¾øÐÂÀ´µç

+        {

+            zCc_InitSlaveObj(slave);

+    zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s  zCc_InitSlaveObj: slaveObj[%d] cleared\n",__FUNCTION__, slave);

+            g_Cc_CallDetail.evt[slave] = ZCC_DISCN_E;

+            return;

+        }

+        g_Cc_CallDetail.ringCid = slave;

+

+        if(g_Cc_CallDetail.evt[slave]==ZCC_CIDCW_E)

+            g_Cc_CallDetail.slaveObj[slave].is_cidcw = TRUE;

+        else

+            g_Cc_CallDetail.slaveObj[slave].is_cidcw = FALSE;

+            

+        if (g_Cc_CallDetail.resourceReady == 1)

+        {

+            g_Cc_CallDetail.slaveObj[slave].sMsg = ZCC_SRING_M;

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_TRYING_S;

+        }

+        else

+        {

+            g_Cc_CallDetail.slaveObj[slave].state = ZCC_S_WAIT_RESOURCE_S;

+        }

+        break;

+        

+    default:

+        return;

+    }

+}

+

+

diff --git a/lynq/R306BR/ap/app/zte_comm/at_ctl/src/atctrl/at_rcvmsg.c b/lynq/R306BR/ap/app/zte_comm/at_ctl/src/atctrl/at_rcvmsg.c
new file mode 100755
index 0000000..ca777cf
--- /dev/null
+++ b/lynq/R306BR/ap/app/zte_comm/at_ctl/src/atctrl/at_rcvmsg.c
@@ -0,0 +1,1473 @@
+/**

+ * @file at_rcvmsg.c 

+ * @brief ʵÏÖatͨµÀÏûÏ¢´¦ÀíµÄʵÏÖ

+ *

+ * Copyright (C) 2017 Sanechips Technology Co., Ltd.

+ * @author 

+ * 

+ * This program is free software; you can redistribute it and/or modify

+ * it under the terms of the GNU General Public License version 2 as

+ * published by the Free Software Foundation. 

+ *

+ */

+

+/*******************************************************************************

+*                           Include header files                              *

+******************************************************************************/

+#include "at_context.h"

+#include "at_register.h"

+#include "recv_thread.h"

+#include "softap_api.h"

+#include "at_netdog.h"

+#include "ps_sms_api.h"

+#include "at_zephyr.h"

+/*******************************************************************************

+ *                             Macro definitions                               *

+ ******************************************************************************/

+#define  BROADCAST_FWD        0XFFFFFFFF //¹ã²¥µ½FARPS&VOLTE

+#define  BROADCAST_VOLTE      0XFFFFFFF0 //¹ã²¥µ½VOLTE

+#define  BROADCAST_FARPS      0XFFFFFF00 //¹ã²¥µ½FARPS

+

+

+/*******************************************************************************

+ *                             Type definitions                                *

+ ******************************************************************************/

+/*******************************************************************************

+ *                        Local function declarations                          *

+ ******************************************************************************/

+static int get_msgtype(char *atCmdStr);

+//static void write_position_cmd(int fd, char *at_str, int flag);

+//static void write_farps_cmd(char *at_str);

+static int ext_req_at_proc(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, char *at_cmd_paras);

+static int fwd_not_VoLTE_req_at(struct at_context * context, int at_fd, char *at_str);

+static int fwd_not_VoLTE_extreq_at(struct at_context * context, int at_fd, char *at_str);

+static int fwd_req_at_proc(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras);

+static int rcv_at_req_handle(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras, int paras_len);

+static void rcv_rsp_at_fwd_down(struct at_context * context, char *at_str, void * at_cmd_paras, int at_fd);

+static void rcv_rsp_at_client(struct at_context * context, char *at_str, void * at_cmd_paras, int at_fd);

+static int rcv_at_rsp_handle(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras, int paras_len);

+static int rcv_at_inform_handle(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras, int paras_len);

+static int rcv_sms_pdu_handle(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras, int paras_len);

+static void set_fwd_fd(int fd);

+extern int phone_info_pdu(char *at_paras ,int is_query_report);

+/*******************************************************************************

+ *                         Local variable definitions                          *

+ ******************************************************************************/

+//ΪFFʱ£¬±íʾȺ·¢£»Îª0ʱ£¬±íʾÎÞÐèת·¢

+int fwd_fd = 0;

+int whole_at_type = -1; //±êʶÊÕµ½ÕûÌõÃüÁîµÄÀàÐÍ 

+/*******************************************************************************

+ *                        Global variable definitions                          *

+ ******************************************************************************/

+/* Ö÷¶¯Éϱ¨µÄͨµÀ¾ä±ú*/

+extern int g_auto_fd;

+/* ÓÃÓÚÅäÖÃCPÏòAP·¢Ë͵ÄÖ÷¶¯Éϱ¨ÃüÁîǰ׺*/

+char FwIndAtCmdPrefix[AT_CMD_MAX] = {0};

+

+//memory modify AT_CMD_MAX

+//¿ÉÒÔ±»È¡ÏûµÄ3GPPÃüÁîÁбí

+char cancelled_cmd_list[128] = "+COPS=?+BGLTEPLMN=?+ZPLMNBAND?+ZNCELLINFO?+ZCOPS=?";

+

+#ifdef _USE_BL

+char IndAtCmdPrefix[AT_CMD_PREFIX] = {0};

+#endif

+

+/*******************************************************************************

+ *                      Local function implementations                         *

+ ******************************************************************************/

+void set_cp_indcmd_list(char *atcmdlist)

+{

+	memset(FwIndAtCmdPrefix, 0x00, AT_CMD_MAX);

+

+    // coverity STRING_OVERFLOW

+	memcpy(FwIndAtCmdPrefix, atcmdlist, (strlen(atcmdlist) > sizeof(FwIndAtCmdPrefix) ? sizeof(FwIndAtCmdPrefix) : strlen(atcmdlist)));

+}

+

+

+/* »ñÈ¡½á¹ûÂëµÄÀàÐÍ*/

+static int get_msgtype(char *atCmdStr)

+{

+    if(strstr(atCmdStr, "OK") != NULL)

+        return AT_RSP_OK;

+    else

+        return AT_RSP_ERR;

+}

+

+/*Èç¹ûµÚÒ»ÌõATÇëÇó²»ÊÇÔ¼¶¨µÄÇëÇ󣬷µ»Ø0£¬ ·ñÔò·µ»Ø1*/

+static int rcv_at_req_first_check(int at_fd, char *at_str)

+{

+	static	int  have_check = 0;

+	char first_req[30] = {0};

+

+	//¼ì²éµÚÒ»ÌõATÇëÇóÊÇ·ñΪԼ¶¨µÄÇëÇó

+	if(have_check == 0)  

+	{

+		cfg_get_item("first_req",first_req,30);

+		if(first_req[0] == '\0' || strstr(at_str, first_req)!=NULL)

+			have_check = 1;

+		else

+			have_check = 2;

+	}

+	//µÚÒ»ÌõATÇëÇó·ÇÔ¼¶¨ÇëÇó£¬ËµÃ÷ÍⲿMCUδÓëÖÐÐË΢оƬһÆð¿ª»ú,Á¢¼´»Ø¸´Ö¸¶¨ERR

+	if(have_check == 2)

+	{

+		char* err_str = at_err_build(ATERR_ZXIC_ERR);

+		at_write(at_fd, err_str, strlen(err_str));

+		free(err_str);

+		return 0;

+	}	

+

+	return 1;

+}

+

+//ÅжÏÊÇ·ñÊÇ¿ÉÒÔ±»È¡ÏûµÄÃüÁÈç¹ûÊÇ£¬·µ»Ø1£¬·ñÔò·µ»Ø0

+static int check_cancelled_cmd(char *at_cmd_prefix)

+{

+	//¶ÔÓÚcontextÖб£´æµÄǰ׺Ϊ¿Õ£¬+,=?»òÕß?£¬Ö±½ÓÊÓΪ²»Äܱ»È¡ÏûµÄÃüÁî

+	if(strlen(at_cmd_prefix) == 0 || strcmp(at_cmd_prefix,"+") == 0

+		|| strcmp(at_cmd_prefix,"=?") == 0 || strcmp(at_cmd_prefix,"?") == 0)

+		return 0;

+	

+	if(at_strstr(cancelled_cmd_list,at_cmd_prefix) != NULL)

+		return 1;

+	else

+		return 0;

+}

+

+/*À©Õ¹ÀàATÇëÇóµÄ´¦Àí£¬·ÖΪµçÐÅÀàÀ©Õ¹ºÍ·ÇµçÐÅÀàÀ©Õ¹Á½Àà*/

+static int ext_req_at_proc(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, char *at_cmd_paras)

+{

+    int ret = AT_END;

+    struct at_context * context = NULL;

+    struct ser_ops_t2*  rcv_req_node = NULL;

+	struct extat_ser_ops_t*  modem_req_node = NULL;

+    MSG_BUF *pMsg = NULL;

+    void * res_msg =	NULL;

+    int res_msglen = 0;

+

+	//¶Ô·ÇµçÐÅÀàÀ©Õ¹ATÇëÇóµÄÆ¥Åä´¦Àí

+    list_for_each_entry(rcv_req_node,&g_ser_list2,list)

+    {

+    

+        //×¢²áµ½ser_ops_t2µ±ÖеÄǰ׺³¤¶È£¬ÓпÉÄܱȸø¶¨µÄatǰ׺³¤¶ÈÒª³¤

+        if(0 == at_strncmp(rcv_req_node->at_cmd_prefix, (char*)at_cmd_prefix,MAXSTR(rcv_req_node->at_cmd_prefix, prefix_len)))

+        {

+			if(at_context_find_ctx_by_fd_type(at_fd, AT_FWD_UP)||at_context_find_ctx_by_fd_type(at_fd, AT_SERVER))

+			{		

+				//¹úµç¶¨ÖÆ£¬¹úµçMCU·¢ËÍMYNETACTÖ®ºó5ÃëÖÓûÓ줻î³É¹¦»áÔٴη¢ËÍ£¬·µ»ØERROR»á´¥·¢µ×°åÖØÆô

+				if(g_customer_type == CUSTOMER_GUODIAN || g_customer_type == CUSTOMER_NANDIAN)

+				{

+					return 1;

+				}

+				else

+				{

+					//»Ø¸´ATͨµÀæ

+					char* err_str = at_err_build(ATERR_CHANNEL_BUSY);

+					at_context_write_data(at_fd, err_str,strlen(err_str));

+					free(err_str);

+					return 1;

+				}

+			}

+            if(rcv_req_node->context != NULL)

+            {

+                softap_assert("");

+                //ret = at_write(at_fd,"\r\nERROR\r\n",strlen("\r\nERROR\r\n"));

+                return 1;

+            }

+            ret = rcv_req_node->req_rcv_act(at_fd, at_cmd_paras, &res_msg, &res_msglen);

+

+            //Èç¹û¸ÃatÇëÇóÃüÁî¿ÉÒÔͬ²½Ö±½Ó´¦Àí£¬ÔòÔÚreq_rcv_actº¯ÊýÖÐÖ±½Ó´¦Àí£¬Éú³ÉÏìÓ¦atÃüÁîres_msg£¬²¢·µ»ØAT_END

+            if(ret == AT_END)

+            {

+                if(res_msg == NULL || res_msglen != strlen(res_msg))

+                {

+                    softap_assert("");

+                }

+				else

+                at_context_write_data(at_fd, res_msg,res_msglen);

+            }

+            //¶ÔÓÚÉèÖÃÀàµÄat ·þÎñ¶Ë£¬ËäÈ»ÐèÒªÖ§³ÖÒì²½´¦Àí£¬µ«ÊǶÔÓÚokµÄÏìÓ¦£¬²»±ØµÈµ½×¢²áÄ£¿é´¦ÀíÍê³ÉÖ®ºó£¬²Å»Ø¸´£»

+            //Òò´ËÔÚ×¢²áʱ£¬½ö×¢²áÒ»¸öµ¥ÏîµÄÇëÇóÏûÏ¢¼´¿É£¬²»±ØÔÙÏòat_ctlÓ¦´ðÏûÏ¢£¬Ö±½ÓÓÉat_ctlÍê³ÉokµÄÏìÓ¦¼´¿É£»

+            else if(ret == AT_END_AND_MSG)

+            {

+                if(rcv_req_node->module_id)

+                {

+                    ipc_send_message(MODULE_ID_AT_CTL, rcv_req_node->module_id, rcv_req_node->req_msg_id, res_msglen, res_msg,0);

+                }

+                at_context_write_data(at_fd,"\r\nOK\r\n",strlen("\r\nOK\r\n"));

+            }

+            else if(ret == AT_CONTINUE)//¶ÔÓÚÒì²½´¦Àí£¬ÔòÐèÒª·¢ËÍÏûÏ¢¸ø×¢²áµÄÄ£¿é£¬ÓɸÃÄ£¿é´¦Àí£¬´¦Àí½áÊøºó£¬·¢ËÍÏìÓ¦ÏûÏ¢¸øat_ctl

+            {

+                if(rcv_req_node->module_id)

+                {

+                	int send_ret = -1;

+                	//¶ÔÓÚ·þÎñ¶ËÕ¼ÓõÄatͨµÀ£¬¾ßÓжÀÕ¼ÐÔ£¬½öÔÚatͨµÀÒѾ­¹Ø±Õʱ£¬ÉêÇëÉÏÏÂÎIJŻáʧ°Ü£¬Òò´ËÊÍ·ÅÄÚ´æºó£¬Ö±½Ó·µ»Ø¼´¿É£¬ÎÞÐèÔÙ·¢ËÍÏûÏ¢

+                    context = at_context_alloc_ctx_by_fd(at_fd,AT_SERVER);

+					if(NULL == context)

+					{

+						if(res_msg)

+							free(res_msg);

+						return 1;

+					}

+					int store_len = prefix_len<(AT_CMD_PREFIX)?prefix_len:(AT_CMD_PREFIX-1);

+					snprintf(context->at_cmd_prefix,store_len+1,"%s",(char *)at_cmd_prefix);

+					//strncpy(context->at_cmd_prefix, (char *)at_cmd_prefix, store_len);

+                    context->at_proc = (void*)rcv_req_node;

+                    rcv_req_node->context = context;

+                    //at_ctlÓësocket½ø³Ì¼äʹÓÃunix socket·½Ê½½øÐÐͨѶ

+                    if(rcv_req_node->module_id == MODULE_ID_SOCKET_PROXY)

+                    {

+                    	//×¢²áat serverʱ£¬¶à¸ösocket proxyÓ¦Óýø³Ì¹²Ïíͬһ¸öÄ£¿éID MODULE_ID_SOCKET_PROXY;

+                    	//ʵ¼Ê·¢ËÍÏûϢʱ£¬ÐèÒª¸ù¾ÝatͨµÀ»ñȡʵ¼ÊͨÐŵÄsocket proxy½ø³ÌÄ£¿éID£¬·¢Ë͵½¸Ã½ø³Ì

+						int dst_id = get_dst_moduleid(at_fd);

+						int unix_sockfd = get_unix_sockfd(dst_id);

+

+						if(unix_sockfd < 0)  // cov M NEGATIVE_RETURNS

+						{

+						    // todo:

+						}

+						else

+						{

+                            send_ret = unix_send_proc(unix_sockfd, dst_id, rcv_req_node->req_msg_id, res_msglen, res_msg,0);

+						}

+                    }

+                    else

+                    {

+	            	    send_ret = ipc_send_message2(MODULE_ID_AT_CTL, rcv_req_node->module_id, rcv_req_node->req_msg_id, res_msglen, res_msg,0);

+                    }

+					//ÏûÏ¢·¢ËÍʧ°Ü£¬Ö±½Ó·µ»ØERROR²¢ÊÍ·ÅͨµÀÉÏÏÂÎÄ

+					if(0 != send_ret)

+					{	

+						char* err_str = at_err_build(ATERR_PROC_FAILED);

+						at_context_write_data(at_fd, err_str,strlen(err_str));

+			            free(err_str);

+						at_context_free_ctx(context);

+					}

+                }

+            }

+            if(res_msg)

+            {

+                free(res_msg);

+                res_msg = NULL;

+            }

+            return 1;

+        }

+    }

+

+	//¶ÔµçÐÅÀàÍⲿCPU·¢ËÍÀ´µÄÀ©Õ¹ATÇëÇó£¬×ª»»Îªat_ctl¶ÔÍâµÄÇëÇóÏûÏ¢£¬²¢½«fd¾ä±ú×÷ΪԴģ¿éID£¬ÒÔÔÚ×îÖÕÓ¦´ðʱ×é×°ÏìÓ¦µÄATÓ¦´ð×Ö·û´®·¢Ë͸øÍⲿMCU

+    list_for_each_entry(modem_req_node,&g_modem_extat_list,list)

+    {

+        if(0 == at_strncmp(modem_req_node->at_cmd_prefix, (char*)at_cmd_prefix, MAXSTR(modem_req_node->at_cmd_prefix, prefix_len)))

+        {        

+        	if(at_context_find_ctx_by_fd_type(at_fd, AT_FWD_UP)||at_context_find_ctx_by_fd_type(at_fd, AT_SERVER))

+        	{

+				//»Ø¸´ATͨµÀæ

+				char* err_str = at_err_build(ATERR_CHANNEL_BUSY);

+				at_context_write_data(at_fd, err_str,strlen(err_str));

+				free(err_str);

+				return 1;

+			}

+			

+			at_print(AT_DEBUG,"rcvmsg_server_extat extat=%s \n", at_str);

+            pMsg = malloc(sizeof(MSG_BUF));

+			if(pMsg == NULL){

+				softap_assert("");

+				return 1;

+			}

+			memset(pMsg, 0x00, sizeof(MSG_BUF));

+

+            pMsg->ulMagic = MSG_MAGIC_WORD;

+            pMsg->lMsgType = MSG_TYPE_DEFAULT;

+            pMsg->src_id = at_fd;    //¶ÔÓÚÍⲿµçÐÅÀ©Õ¹ATÃüÁ´Ë´¦¸³ÖµÎªATͨµÀ¾ä±ú

+            pMsg->dst_id = MODULE_ID_AT_CTL;

+            pMsg->usMsgCmd = modem_req_node->req_msg_id;

+            if(modem_req_node->parse_act != NULL)

+            {

+                ret = modem_req_node->parse_act(at_cmd_paras, (void*)pMsg->aucDataBuf, &pMsg->usDataLen);

+                //Èô²ÎÊý½âÎöʧ°Ü£¬Á¢¼´»Ø¸´ERRÓ¦´ð¸ø¶Ô¶Ë

+                if(ret == AT_END)

+                {	

+                	char *retStr = NULL;					

+					retStr = at_err_build(ATERR_PARAM_INVALID);

+                    at_context_write_data(at_fd, retStr,strlen(retStr));

+					free(retStr);

+					

+					free(pMsg); 

+                    return 1;

+                }

+            }

+            else//ÎÞ²ÎÊýµÄÀ©Õ¹ÇëÇóATÃüÁî

+            {

+                pMsg->usDataLen = 0;

+            }

+			//´Ë´¦½«ATͨµÀ¾ä±ú×÷ΪԴģ¿éID£¬ÊôÓÚ¼¼Çɶ¨ÖÆ

+			rcv_clt_req_msg_proc(pMsg);

+			free(pMsg);         

+            return 1;

+        }

+

+    }

+    return 0;

+}

+

+/*À©Õ¹ÀàATÇëÇóµÄ´¦Àí£¬·ÖΪͬ²½ºÍÒì²½Á½ÖÖ·½Ê½*/

+static int ext_req_to_app(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, char *at_cmd_paras)

+{

+	int ret = AT_END;

+	struct at_context *context = NULL;

+	struct ser_ops_t *rcv_req_node = NULL;

+	struct at_channel_info *new_chan = NULL;

+	void * res_msg = NULL;

+

+	//¶Ô·ÇµçÐÅÀàÀ©Õ¹ATÇëÇóµÄÆ¥Åä´¦Àí

+    list_for_each_entry(rcv_req_node,&g_ser_list,list)

+    {    

+        //×¢²áµ½ser_ops_t2µ±ÖеÄǰ׺³¤¶È£¬ÓпÉÄܱȸø¶¨µÄatǰ׺³¤¶ÈÒª³¤

+		if(0 == at_strncmp(rcv_req_node->at_cmd_prefix, (char*)at_cmd_prefix,MAXSTR(rcv_req_node->at_cmd_prefix, prefix_len)))

+		{

+			if(at_context_find_ctx_by_fd_type(at_fd, AT_FWD_UP)||at_context_find_ctx_by_fd_type(at_fd, AT_SERVER))

+			{

+				//»Ø¸´ATͨµÀæ

+				char* err_str = at_err_build(ATERR_CHANNEL_BUSY);

+				at_context_write_data(at_fd, err_str,strlen(err_str));

+				free(err_str);

+				return 1;

+			}

+

+			

+			ret = rcv_req_node->req_rcv_act(at_cmd_paras, &res_msg);

+			//Èç¹û¸ÃatÇëÇóÃüÁî¿ÉÒÔͬ²½Ö±½Ó´¦Àí£¬ÔòÔÚreq_rcv_actº¯ÊýÖÐÖ±½Ó´¦Àí£¬Éú³ÉÏìÓ¦atÃüÁîres_msg£¬²¢·µ»ØAT_END

+			if(ret == AT_END)

+			{                

+				if(res_msg == NULL)

+					at_context_write_data(at_fd,"\r\nOK\r\n",strlen("\r\nOK\r\n"));

+				else

+				{

+					at_context_write_data(at_fd, res_msg,strlen(res_msg));				            

+					free(res_msg);

+					res_msg = NULL;

+				}

+				return 1;

+			}

+			//¶ÔÓÚÒì²½´¦Àí£¬´´½¨·þÎñ¶ËÉÏÏÂÎÄ

+			else if(ret == AT_CONTINUE)

+			{

+				if(res_msg)

+					softap_assert("exception");

+                if(rcv_req_node->module_id)

+                {                	

+                	//¶ÔÓÚ·þÎñ¶ËÕ¼ÓõÄatͨµÀ£¬¾ßÓжÀÕ¼ÐÔ£¬½öÔÚatͨµÀÒѾ­¹Ø±Õʱ£¬ÉêÇëÉÏÏÂÎIJŻáʧ°Ü£¬Òò´ËÊÍ·ÅÄÚ´æºó£¬Ö±½Ó·µ»Ø¼´¿É£¬ÎÞÐèÔÙ·¢ËÍÏûÏ¢

+                    context = at_context_alloc_ctx_by_fd(at_fd,AT_SERVER);

+					if(NULL == context)

+					{

+						softap_assert("exception");

+						return 1;

+					}

+					int store_len = prefix_len<(AT_CMD_PREFIX)?prefix_len:(AT_CMD_PREFIX-1);

+					snprintf(context->at_cmd_prefix,store_len+1,"%s",(char *)at_cmd_prefix);

+					//strncpy(context->at_cmd_prefix, (char *)at_cmd_prefix, store_len);

+                    context->source = rcv_req_node->module_id;

+					return 1;

+                }

+				else

+				{

+					softap_assert("exception");

+				}

+		    }

+			else

+			{

+				softap_assert("exception");

+			}

+        }

+    }    

+    return 0;

+}

+

+void* wait_rsp_timeout_proc(VOID *arg)

+{

+	int at_fd = (int)arg;

+

+	at_print(AT_ERR,"at_fd: %d!!!!\n", at_fd);

+

+    ipc_send_message(MODULE_ID_AT_CTL, MODULE_ID_AT_CTL, ATCTL_INNER_WAIT_OUTSIDE_RSP_MSG, sizeof(int), &at_fd, IPC_NOWAIT);

+	

+	NETDOG_AT_STATICS(wait_farps_rsp_timeout++);

+	return NULL;

+}

+

+void set_wait_rsp_timeout(int fd, struct at_context *up_context)

+{

+	#if (APP_OS_TYPE == APP_OS_LINUX)	

+	int ret = 0;

+	

+	DeleteSoftTimer(AtWaitRspTimeID);

+	

+    ret = CreateSoftTimer(AtWaitRspTimeID,

+                        TIMER_FLAG_ONCE,

+                        up_context->at_channel->timeout*1000,

+                        wait_rsp_timeout_proc,

+                        (void *)fd);

+	if(ret != 0)

+		softap_assert("");

+	#endif

+}

+

+

+/*Ö»ÓÐVOLTE²»´¦ÀíµÄ¿Í»§¶ËÓ¦ÓÃÇëÇóÃüÁ´Óptyԭ··µ»Ø²Å»á×ß½øÕâ¸öÁ÷³Ì£¬ÔÙת·¢¸øÐ­ÒéÕ» */

+static int fwd_not_VoLTE_req_at(struct at_context * context, int at_fd, char *at_str)

+{

+    struct at_context *new_context = NULL;

+    struct app_clt_ops_t *ext_nod = NULL;

+

+    ext_nod = find_extclt_by_msg(context->msg_id);

+    if(ext_nod == NULL)

+    {

+        at_print(AT_ERR,"fwd_not_VoLTE_req_at ERR: ext_nod == NULL \n");

+		softap_assert("");//²»Ó¦¸Ã×ßµ½

+        return -1;

+    }

+

+    new_context = at_context_alloc_ctx_by_pos(ext_nod->position);

+    if(new_context == NULL)

+    {

+        at_print(AT_ERR,"fwd_not_VoLTE_req_at \n");

+		resend_rcv_atstr(at_fd,at_str);

+        return -1;

+    }

+    new_context->source = context->source;

+    new_context->msg_id = context->msg_id;

+    new_context->cmdId = context->cmdId;

+    new_context->app_param = context->app_param;

+	context->app_param = NULL;//¶ÌÐÅÓ¦ÓÃ×ßvolte£¬Õâ¸ö²»Äܶª

+

+    at_context_free_ctx(context);

+

+    at_context_write_by_ctx(new_context,at_str,strlen(at_str));

+	set_fwd_fd(new_context->at_channel->at_fd);

+    return 0;

+}

+

+/*Ö»ÓÐVOLTE²»´¦ÀíµÄÍⲿת·¢ÇëÇóÃüÁ´Óptyԭ··µ»Øºó£¬·¢Ë͸øNEAR_PS£¬¼´Ð­ÒéÕ»*/

+static int fwd_not_VoLTE_extreq_at(struct at_context * context, int at_fd, char *at_str)

+{

+    int position = at_context_get_pos_by_fd(at_fd);

+    struct at_context *up_context;

+    struct at_context *down_context = NULL;

+    int    down_position = 0;

+

+    up_context = context->fwd_context;

+    

+    /* Èç¹ûÊÇ·¢Ë͸øvolte£¬µ«volte²»´¦ÀíµÄÏûÏ¢£¬Ö±½Ó·¢Ë͵½modem*/

+    if(position == POSITION_VOLTE)

+    {

+        down_context = at_context_alloc_ctx_by_fwdctx(NEAR_PS, up_context);

+        down_position = NEAR_PS;

+    }

+    else

+    {

+        softap_assert("");

+    }

+

+    /* ÈôÏÂÓÎÎÞ¿ÉÓÃÎïÀíͨµÀ£¬ÔòЯ´øÉÏÓÎÉÏÏÂÎĺÍATÃüÁî´®£¬ÇëÇóat_ctlÖØÐ´¥·¢ÏÂÓÎÉÏÏÂÎĵÄÉêÇë*/

+    if (!down_context)

+    {

+		resend_rcv_atstr(at_fd,at_str);

+    }

+    else

+    {

+    	at_context_free_ctx(context);

+        /* cp²à±ØÐë¼Ç¼ÏÂÐеÄÉÏÏÂÎÄ£¬¹©ap²à¸øcp²à·¢ËÍpdu²éѯʹÓÃ*/

+        up_context->fwd_context = down_context;

+        at_context_write_by_ctx(down_context, at_str, strlen(at_str));

+		set_fwd_fd(down_context->at_channel->at_fd);

+    }

+    return 0;

+}

+

+

+/*·Ç·þÎñ¶ËÇëÇóÃüÁȫ²¿×ª·¢¸øÐ­ÒéÕ»*/

+static int fwd_req_at_proc(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras)

+{

+	struct at_context *context = NULL;

+    int position = at_context_get_pos_by_fd(at_fd);

+    struct fwd_ops_t* at_forward_node;

+    struct at_context *up_context;

+    struct at_context *down_context;

+    int    down_position = 0;

+

+	//ÉÏÓÎÓÖÊÕµ½ÇëÇóÀàATÃüÁת·¢¸øÏÂÓÎ

+    context = at_context_find_ctx_by_fd_type(at_fd, AT_FWD_UP); // kw 3

+    if(context)

+    {/* ת·¢ÀàÈ¡Ïû£¬Ö±½Óת·¢µ½ÎïÀíͨµÀ¡£²»´´½¨ÉÏÏÂÎĽڵãµÄÏûÏ¢²»´¦Àí*/

+		if(context->fwd_context)

+		{

+#if (APP_OS_TYPE == APP_OS_LINUX)

+			//¶ÔÓÚap²àÖ»ÓÐÀ´×ÔÓÚttyͨµÀµÄת·¢ÃüÁîÈç¹û²»ÊÇ¿ÉÈ¡ÏûµÄÃüÁֱ½Ó»Ø¸´Í¨µÀæ

+			if(check_is_farps(at_fd) && !check_cancelled_cmd(context->fwd_context->at_cmd_prefix))

+			{

+				//»Ø¸´ATͨµÀæ

+				char* err_str = at_err_build(ATERR_CHANNEL_BUSY);

+				at_context_write_data(at_fd, err_str,strlen(err_str));

+				free(err_str);

+			}

+			else//ÆäÓàÇé¿ö¶¼ÊÇÖ±½ÓÏò֮ǰÉêÇëµÄͨµÀÖÐдÊý¾Ý

+#endif

+				set_fwd_fd(context->fwd_context->at_channel->at_fd);

+			

+			return 0;

+		}

+    }

+    at_forward_node = find_fwd_by_prefix(at_cmd_prefix, prefix_len);

+    /* Ϊµ±Ç°×ª·¢atÃüÁî´´½¨×ª·¢ÉÏÓÎÉÏÏÂÎĽڵã*/

+    up_context = at_context_alloc_ctx_by_fd(at_fd,AT_FWD_UP);

+

+	if(NULL == up_context)

+	{

+		//¶ÔÓÚÉÏÓβàÕ¼ÓõÄatͨµÀ£¬¾ßÓжÀÕ¼ÐÔ£¬½öÔÚatͨµÀÒѾ­¹Ø±Õʱ£¬ÉêÇëÉÏÏÂÎIJŻáʧ°Ü£¬Ö±½Ó·µ»Ø£¬²»ÔÙ¼ÌÐø×ª·¢

+		return 0;

+	}

+	//±¾CPUÄÚÎÞÐè¹Ø×¢µÄÇëÇóAT£¬Ö±½Óת·¢¸øÏÂÓÎ

+    if(at_forward_node==NULL ||!at_forward_node->req_act || (AT_CONTINUE == at_forward_node->req_act(at_cmd_paras, at_fd, up_context)))

+    {

+        up_context->at_proc = (void*)at_forward_node;

+        //atÃüÁîµÄ´¦Àí˳Ðò:ÓÅÏÈVOLTE£¬×îºó·¢Ë͸ømodem

+        if(position == FAR_PS)

+        {

+            if(prefix_len <= 0)

+            {

+            	softap_assert("fwd_req_at_proc prefix is less than 0!!!");

+            }

+#ifdef _USE_VOLTE

+            down_position = POSITION_VOLTE;

+#else

+        	down_position = NEAR_PS;

+#endif           

+            /* ¸ù¾ÝÉÏÓÎÉÏÏÂÎÄÉêÇëÏÂÓÎÉÏÏÂÎĽڵã*/

+            down_context = at_context_alloc_ctx_by_fwdctx(down_position,up_context);

+        }

+        else if(position== POSITION_VOLTE)

+        {

+            down_context = at_context_alloc_ctx_by_fwdctx(NEAR_PS,up_context);

+            down_position = NEAR_PS;

+        }  

+		else if(position== NEAR_PS)

+		{

+            down_context = at_context_alloc_ctx_by_fwdctx(FAR_PS,up_context);

+            down_position = FAR_PS;

+        } 

+        else

+        {

+            //¿ªÍ·ÊÇATµÄÎı¾¶ÌÏûÏ¢»òδע²áµÄATÉϱ¨¿ÉÄÜ×ßµ½Õâ¸öλÖÃ,ÔݶªÆú

+            //softap_assert("");

+            at_print(AT_ERR,"ERR: %s unknow AT",at_str);

+            at_context_free_ctx(up_context);

+            return -1;

+        }

+

+        /* ÈôÏÂÓÎÎÞ¿ÉÓÃÎïÀíͨµÀ£¬ÔòЯ´øÉÏÓÎÉÏÏÂÎĺÍATÃüÁî´®£¬ÇëÇóat_ctlÖØÐ´¥·¢ÏÂÓÎÉÏÏÂÎĵÄÉêÇë*/

+        if (!down_context)

+        {

+        	at_context_free_ctx(up_context);

+			resend_rcv_atstr(at_fd,at_str);

+        }

+        else

+        {

+            /* cp²à±ØÐë¼Ç¼ÏÂÐеÄÉÏÏÂÎÄ£¬¹©ap²à¸øcp²à·¢ËÍpdu²éѯʹÓÃ*/

+            up_context->fwd_context = down_context;

+			at_context_write_by_ctx(down_context, at_str, strlen(at_str));

+			set_fwd_fd(down_context->at_channel->at_fd);	

+			if(up_context->at_channel->timeout > 0)

+			{				

+				set_wait_rsp_timeout(at_fd, up_context);	    

+			}

+			return  1;

+        }

+    }

+	//²ÎÊý¼ì²é²»¹ýµÈÒì³£ÍⲿATÇëÇ󣬱»req_actÀ¹½Øºó£¬ÔÚÄÚ²¿»Ø¸´½á¹ûÂë¸øÍⲿMCU£¬ÎÞÐèÔÚ´Ë¿ò¼ÜÖÐÔÙÖ´ÐÐ

+    else

+    {

+        at_context_free_ctx(up_context);

+        at_print(AT_ERR,"%s  REQ  have  been  consumed\n",at_str);

+    }

+    return 0;

+}

+/* ÇëÇóÀàATÃüÁî´¦Àí*/

+static int rcv_at_req_handle(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras, int paras_len)

+{

+    struct at_context * context = NULL;

+	struct at_channel_info * ch_info = at_context_find_chn_by_fd(at_fd);

+	

+#if (APP_OS_TYPE == APP_OS_LINUX)

+	//ΪÁ˱£Ö¤ÍⲿMCUÓëÎÒÃDZ£³ÖÒ»Æð¿ª»ú£¬Í¨¹ýË«·½Ô¼¶¨µÄµÚÒ»ÌõATÇëÇóǰ׺À´¼ì²â

+	if(check_is_farps(at_fd) && 0 == rcv_at_req_first_check(at_fd, at_str))

+	{

+		return 0;

+	}

+#endif

+	if(ch_info)

+	{

+		snprintf(ch_info->last_cmd,AT_CMD_MAX,"%s\r\n",(char *)at_str);

+	}

+

+	//Ó¦ÓÃAPP·¢Ë͵ÄÃüÁVoLTEԭ··µ»Ø

+    if((context = at_context_find_ctx_by_fd_type(at_fd, AT_CLIENT)) 

+		&& 0 == at_strncmp(context->at_cmd_prefix,(char*)at_cmd_prefix, MAXSTR(context->at_cmd_prefix,prefix_len))

+		&& context->at_channel->position == POSITION_VOLTE)

+    { 

+        /*Ö»ÓÐVOLTE²»´¦ÀíµÄ¿Í»§¶ËÓ¦ÓÃÇëÇóÃüÁ´Óptyԭ··µ»Ø²Å»á×ß½øÕâ¸öÁ÷³Ì£¬ÔÙת·¢¸øÐ­ÒéÕ» */

+        return fwd_not_VoLTE_req_at(context, at_fd, at_str);

+    }

+	//ÍⲿCPU·¢Ë͵ÄÃüÁVoLTEԭ··µ»Ø

+    else if( (context = at_context_find_ctx_by_fd_type(at_fd, AT_FWD_DOWN)) 

+		&& 0 == at_strncmp(context->at_cmd_prefix,(char*)at_cmd_prefix, MAXSTR(context->at_cmd_prefix,prefix_len))

+		&& context->at_channel->position == POSITION_VOLTE)

+    { 

+    	/*Ö»ÓÐVOLTE²»´¦ÀíµÄÍⲿת·¢ÇëÇóÃüÁ´Óptyԭ··µ»Øºó£¬ÔÙת·¢Ë͸øNEAR_PS£¬¼´Ð­ÒéÕ»*/

+        return fwd_not_VoLTE_extreq_at(context, at_fd, at_str);

+    }

+    else

+    {

+        if((context = at_context_find_ctx_by_fd_type(at_fd, AT_SERVER)) != 0)

+        {	 

+        	NETDOG_AT_STATICS(farps_cmd_again++);

+        	at_print(AT_ERR,"more than one REQ at cmd on channel %d as AT_SERVER, prefix is %s, now at str is %s!!!\n", at_fd, context->at_cmd_prefix,at_str);

+        }

+        else if ((context = at_context_find_ctx_by_fd_type(at_fd, AT_FWD_UP)) != 0)

+        {			

+        	NETDOG_AT_STATICS(farps_cmd_again++);

+        	at_print(AT_ERR,"more than one REQ at cmd on channel %d as AT_FWD_UP, prefix is %s, now at str is %s!!!\n", at_fd, context->fwd_context->at_cmd_prefix,at_str);

+        }		

+

+		

+		/*ÍⲿÀ©Õ¹ATÇëÇó£¬ÄÚ²¿·ÖΪµçÐźͷǵçÐÅÁ½Àà´¦Àí£¬ÄÚ²¿Í¨³£×ª»¯ÎªÇëÇóÏûÏ¢*/

+        if(ext_req_at_proc(at_fd, at_str, at_cmd_prefix, prefix_len,at_cmd_paras))

+        {

+            return 0;

+        }

+		else if(ext_req_to_app(at_fd, at_str, at_cmd_prefix, prefix_len,at_cmd_paras))

+        {

+            return 0;

+        }

+

+

+		//·Ç±¾CPUÄÜ´¦ÀíµÄATÇëÇó£¬Ò»ÂÉͨ¹ýдATͨµÀ·¢Ë͸øÍⲿCPU

+		return fwd_req_at_proc(at_fd, at_str, at_cmd_prefix, prefix_len, at_cmd_paras);

+    }

+}

+

+/* ת·¢ÏÂÓÎÀàÉÏÏÂÎĽڵãÏìÓ¦ÏûÏ¢µÄ´¦Àí*/

+static void rcv_rsp_at_fwd_down(struct at_context * context, char *at_str, void * at_cmd_paras, int at_fd)

+{

+    int msgtype = get_msgtype(at_str);

+    int ret = AT_END;

+

+	at_print(AT_ERR, "rcvmsg_rsp_at_fwd_down context->prefix = %s \n" ,context->at_cmd_prefix);

+    /* ¶ÔÓÚת·¢ÏÂÓÎÊÕµ½µÄÓ¦´ð´¦Àí,Ö»ÓÐPDP¼¤»îµÄת·¢ÐèÒª¼à¿Ø£¬Ò»°ãµÄATÃüÁîת·¢ÎÞÐè¼à¿Ø,Ö±½Óת·¢Í¸´«¸øÉÏÓÎλÖÃ*/

+    if(context->at_proc != NULL)

+    {

+        struct fwd_ops_t *forward_node = (struct fwd_ops_t *)context->at_proc;

+        at_netdog_monitor(at_fd, at_str, context->at_cmd_prefix);

+        if(msgtype == AT_RSP_OK && forward_node->ok_act)

+        {

+            ret = forward_node->ok_act(at_cmd_paras, context->fwd_context);

+        }

+        else if(msgtype == AT_RSP_ERR && forward_node->err_act)

+        {

+            ret = forward_node->err_act(at_cmd_paras,context->fwd_context);

+        }

+    }

+    if(ret == AT_WAIT_AUTO)

+    {

+		delay_resend_atstr(at_fd,at_str);  

+    }

+    else

+    {

+		set_fwd_fd(context->fwd_context->at_channel->at_fd);

+		//Èç¹ûÉèÖÃÁËͨµÀÃüÁʱʱ¼ä£¬ÐèÒª¹Ø±Õ¶¨Ê±Æ÷

+		if(context->fwd_context->at_channel->timeout > 0)

+		{		

+#if (APP_OS_TYPE == APP_OS_LINUX)	

+			DeleteSoftTimer(AtWaitRspTimeID);

+#endif

+		}

+        at_context_free_ctx(context->fwd_context);

+        at_context_free_ctx(context);

+    }

+}

+

+/* ¿Í»§¶ËÀàÉÏÏÂÎĽڵãÏìÓ¦ÏûÏ¢µÄ´¦Àí¡£*/

+static void rcv_rsp_at_client(struct at_context * context, char *at_str, void * at_cmd_paras, int at_fd)

+{

+    int msgtype = get_msgtype(at_str);

+    int ret = AT_END;

+    void   *res_msg = NULL;

+    int    res_msglen = 0;

+    struct app_clt_ops_t *clt_nod = NULL;

+

+    at_print(AT_ERR, "rcvmsg_rsp_at_client context->prefix = %s \n" ,context->at_cmd_prefix);

+

+	//оƬÈÏÖ¤ÅжϷÖÖ§

+	if(atcmd_stream_rep_proc(context, at_str))

+		return;

+	/* Ö»Óпͻ§¶Ë×¢²áÁËATµÄproc½Ó¿ÚµÄ£¬²Å»á½øÐжÔÓ¦µÄ½Ó¿Ú´¦Àí£¬·ñÔòºöÂÔ*/

+    if(context->at_proc)

+    {

+        struct clt_ops_t *req_node = (struct clt_ops_t *)context->at_proc;

+

+        /* ¸ù¾Ýok_actºÍerr_actµÄ·µ»ØÖµ£¬È·¶¨ÏÂÒ»²½ÈçºÎ´¦Àí£¬¶ÔÓÚʼþÁ´£¬Í¨¹ýAT_CONTINUEÍê³ÉÏÂÒ»¸öatÃüÁîµÄ·¢ËÍ£»

+           ͨ¹ýAT_ENDÍê³ÉʼþÁ´µÄÖÕÖ¹£»*/

+        at_netdog_monitor(at_fd, at_str, context->at_cmd_prefix);

+        if(msgtype == AT_RSP_OK && req_node->ok_act)

+        {

+            ret = req_node->ok_act(at_cmd_paras,context,&res_msg,&res_msglen);

+        }

+        else if(msgtype == AT_RSP_ERR && req_node->err_act)

+        {

+            ret = req_node->err_act(at_cmd_paras,context,&res_msg,&res_msglen);

+        }

+

+        if(ret == AT_END)

+        {/* ¿Í»§¶ËµÄÇëÇóÍê³Éºó£¬×é×°Ó¦´ðÏûÏ¢Éϱ¨¸ø¿Í»§¶ËAPP*/

+            at_print(AT_DEBUG,"rcvmsg_rsp_at_client reply to app \n");

+            if(context->msg_id != 0)

+            {

+                clt_nod = find_extclt_by_msg(context->msg_id);

+                if(clt_nod == NULL)

+                {

+                    at_print(AT_ERR,"ERR: find_extclt_by_msg fail \n");

+                    at_context_free_ctx(context);

+                    return;

+                }

+                at_print(AT_NORMAL,"rcvmsg_rsp_at_client send msg to app msg_id=0x%x,dst_id=0x%x,rsp_msg_id=0x%x \n",context->msg_id,context->source,clt_nod->rsp_msg_id);

+				send_rsp_msg(context->source,context->msg_id,clt_nod->rsp_msg_id,res_msglen,res_msg);

+            }           

+            at_context_free_ctx(context);

+        }

+        //Ŀǰ½öÓÃÓÚPDP¼¤»îµÄzgipdnsÖ÷¶¯Éϱ¨³ÙÓÚOKºóÉϱ¨µÄÇé¿ö

+        //ÓÃÓÚʼþÁ´ÒѾ­Íê³É£¬µ«ÈÔÔڵȴýij¸öÖ÷¶¯Éϱ¨Ìõ¼þÖÐ

+        else if(ret == AT_WAIT_AUTO)

+        {

+			delay_resend_atstr(at_fd,at_str);  

+            return;

+        }

+        //Ŀǰ½öÓÃÓÚpdp¼¤»î»ñÈ¡cidºó£¬±£³Ö¸ÃÉÏÏÂÎÄ·¢ËÍcgact

+        else if(ret == AT_CONTINUE)

+        {

+			at_context_write_by_ctx(context, res_msg, res_msglen);			

+            at_context_write_data(context->at_channel->at_fd, res_msg, res_msglen);

+        }

+        else

+        {

+            softap_assert("");

+        }

+

+        if(res_msg != NULL)

+        {

+            free(res_msg);

+        }

+    }

+    else

+    {

+        at_context_free_ctx(context);

+    }

+}

+/* ÏìÓ¦ÀàATÃüÁî´¦Àí*/

+static int rcv_at_rsp_handle(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras, int paras_len)

+{

+    struct at_context * context = NULL;

+

+

+    if((context = at_context_find_ctx_by_fd_type(at_fd, AT_FWD_DOWN)) != 0)

+    {/* ת·¢ÏÂÓÎÀàÉÏÏÂÎĽڵãÏûÏ¢µÄ´¦Àí*/

+        rcv_rsp_at_fwd_down(context, at_str, at_cmd_paras, at_fd);

+    }

+    else if( (context = at_context_find_ctx_by_fd_type(at_fd, AT_CLIENT)) != 0)

+    {/* ¿Í»§¶ËÀàÉÏÏÂÎĽڵãÏûÏ¢µÄ´¦Àí*/

+        rcv_rsp_at_client(context, at_str, at_cmd_paras, at_fd);

+    }	

+    else

+    {/* Æ¥Åä²»µ½ÉÏÏÂÎÄ£¬¼«¿ÉÄÜÊÇÈ¡ÏûµÄÑÓ³ÙÓ¦´ð£¬²»×ö¶¯×÷*/

+        NETDOG_AT_STATICS(rcv_undesirable_rsp++);

+        at_print(AT_ERR,"AT_TYPE_RESPONSE have not related context,may abort rsp\n");

+    }

+

+    return 0;

+}

+

+void rcv_at_inform_filter(int at_fd, void *at_cmd_prefix, int prefix_len)

+{	

+	char PsmIndAtCmdPrefix[AT_CMD_MAX] = {0};    /*À©Õ¹ÃüÁîÅäÖõÄÖ÷¶¯Éϱ¨µÄATÃüÁîǰ׺*/

+    int position = at_context_get_pos_by_fd(at_fd);

+	char temp_prefix[21]= {0};

+	int tempPrefixlen = 0;

+

+	tempPrefixlen = (prefix_len>20)? 20: prefix_len;

+	snprintf(temp_prefix,tempPrefixlen+1,"%s",(char *)at_cmd_prefix);

+ 	//strncpy(temp_prefix, at_cmd_prefix, tempPrefixlen);

+

+	//ÁªÇ¿µÄMCUÖ»½ÓÊÕ+CGREG+CREGÁ½ÌõÖ÷¶¯Éϱ¨

+	if(CUSTOMER_GUODIAN == g_customer_type || CUSTOMER_NANDIAN == g_customer_type)

+	{

+		strcpy(PsmIndAtCmdPrefix, "+CGREG+CREG");

+	}

+	else

+	{

+		cfg_get_item("customIndCmdList", PsmIndAtCmdPrefix, sizeof(PsmIndAtCmdPrefix));

+	}

+	

+	//at_print(AT_ERR,"[XXX]customIndCmdList =%s\n",PsmIndAtCmdPrefix);

+	//at_print(AT_ERR,"[XXX]FwIndAtCmdPrefix =%s\n",FwIndAtCmdPrefix);	

+	//at_print(AT_ERR,"[XXX]at_cmd_prefix =%s\n",temp_prefix);

+	//½öת·¢NEAR_PS[0]ͨµÀ

+	//if((g_auto_fd == at_fd || check_is_fd(at_fd) == 0) && position == NEAR_PS)

+	if(g_auto_fd == at_fd)

+	{		

+		//Ö÷¶¯Éϱ¨ÃüÁîÈôÔÚ×éÊýÖУ¬Ôò¹ã²¥µ½FARPS&VOLTE,·ñÔòÖ»¹ã²¥µ½VOLTEЭÒéÕ»

+		if(strlen(PsmIndAtCmdPrefix) != 0)

+		{

+			if(at_strstr(PsmIndAtCmdPrefix, temp_prefix))

+			{

+				set_fwd_fd(BROADCAST_FWD);				

+				at_print(AT_ERR,"[XXX]set_fwd_fd  111\n");

+			}

+			else

+			{

+				set_fwd_fd(BROADCAST_VOLTE);

+				at_print(AT_ERR,"[XXX]set_fwd_fd  222\n");

+			}

+		}

+		else if(strlen(FwIndAtCmdPrefix) != 0)

+		{

+			if(at_strstr(FwIndAtCmdPrefix, temp_prefix))

+			{

+				set_fwd_fd(BROADCAST_FWD);	

+				at_print(AT_ERR,"[XXX]set_fwd_fd  333\n");

+			}

+			else

+			{

+				set_fwd_fd(BROADCAST_VOLTE);	

+				at_print(AT_ERR,"[XXX]set_fwd_fd  444\n");

+			}

+		}

+		else

+		{

+			set_fwd_fd(BROADCAST_FWD);	

+			at_print(AT_ERR,"[XXX]set_fwd_fd  555\n");

+		}

+	}	

+	/* ½«VOLTEµÄÖ÷¶¯Éϱ¨·¢Ë͸øFAR_PS*/

+	else if(position == POSITION_VOLTE)

+	{

+		if(strlen(PsmIndAtCmdPrefix) != 0)

+		{

+			if(at_strstr(PsmIndAtCmdPrefix, temp_prefix))

+			{

+				set_fwd_fd(BROADCAST_FARPS);	

+				at_print(AT_ERR,"[XXX]set_fwd_fd  666\n");

+			}

+			else

+			{

+				set_fwd_fd(0);	

+				at_print(AT_ERR,"[XXX]set_fwd_fd  777\n");

+			}

+		}

+		else if(strlen(FwIndAtCmdPrefix) != 0)

+		{

+			if(at_strstr(FwIndAtCmdPrefix, temp_prefix))

+			{

+				set_fwd_fd(BROADCAST_FARPS);	

+				at_print(AT_ERR,"[XXX]set_fwd_fd 888\n");

+			}

+			else

+			{

+				set_fwd_fd(0);	

+				at_print(AT_ERR,"[XXX]set_fwd_fd  999\n");

+			}

+		}		

+		else

+		{

+			set_fwd_fd(BROADCAST_FARPS);	

+			at_print(AT_ERR,"[XXX]set_fwd_fd  AAA\n");

+		}		

+	}

+	//fd²»ÊÇÕæÊµµÄͨµÀ£¨½«ÏûÏ¢Ô´×÷Ϊfd£©ÉÏÊÕµ½µÄÖ÷¶¯Éϱ¨²»²ÎÓë¹ýÂË

+	else if(check_is_fd(at_fd) == 0 && position == NEAR_PS)

+	{

+		set_fwd_fd(BROADCAST_FARPS);	

+		at_print(AT_ERR,"[XXX]set_fwd_fd  BBB\n");

+	}

+

+}

+

+

+/* ֪ͨÀàATÃüÁî´¦Àí*/

+static int rcv_at_inform_handle(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras, int paras_len)

+{

+    int position = at_context_get_pos_by_fd(at_fd);

+    struct at_context * context = NULL;

+    struct at_context *fwd_context = NULL;

+	struct inform_ops_t* entry = NULL;	

+

+    /* ¿Í»§¶ËÉÏÏÂÎÄ½ÚµãÆ¥Åä*/

+    if(NULL != (context = at_context_find_ctx_by_fd_type(at_fd, AT_CLIENT)))

+    {

+        /* atǰ׺ƥÅ䣬һÖÂÔò˵Ã÷ÊÇ֮ǰ¿Í»§¶ËÏ·¢atÃüÁîµÄÖмä½á¹ûÉϱ¨*/

+        if( (prefix_len >0 && at_cmd_prefix != NULL && 0 == at_strncmp(context->at_cmd_prefix,(char*)at_cmd_prefix, prefix_len))

+                || (prefix_len >0 && at_cmd_prefix != NULL && 0==strncmp("> ",at_cmd_prefix, prefix_len)))

+        {

+        	at_print(AT_ERR,"receive client inform str = %s, fd = %d\n", at_str, at_fd);

+        	//оƬÈÏÖ¤ÅжϷÖÖ§

+			if(atcmd_stream_inform_proc(context, at_str))

+				return 0;			

+						

+		    list_for_each_entry(entry,&g_inform_list,list)

+		    {

+		        if((0 == at_strncmp(entry->at_cmd_prefix,(char*)at_cmd_prefix, MAXSTR(entry->at_cmd_prefix,prefix_len))) && entry->inform_act)

+

+					entry->inform_act(at_cmd_paras, (int)context);

+		            

+		    }

+           

+            return 0;

+        }

+    }

+    /* ת·¢ÏÂÓζËÉÏÏÂÎÄ½ÚµãÆ¥Åä*/

+    else if(NULL != (fwd_context = at_context_find_ctx_by_fd_type(at_fd, AT_FWD_DOWN)))

+    {

+    	//·ÇÕæÊµÎïÀíͨµÀÏÂÓÎÊÕµ½µÄÃüÁ²»ÔÙ½øÐÐATǰ׺ƥÅ䣬ֱ½ÓÉèÖÃת·¢Í¨µÀ

+		if(0 == check_is_fd(at_fd))

+		{

+			set_fwd_fd(fwd_context->fwd_context->at_channel->at_fd);

+			return 0;

+		}

+		

+		/* atǰ׺ƥÅ䣬һÖÂÔò˵Ã÷ÊÇ֮ǰת·¢atÃüÁîµÄÖмä½á¹ûÉϱ¨

+           ¶ÔÓÚת·¢ÀàµÄÖмä½á¹û£¬°´ÕÕÂß¼­£¬Ó¦¸ÃÊÇËùÓÐÄÚ²¿Ä£¿é²»¹ØÐĺʹ¦ÀíµÄ£¬Òò´Ë²»Óõ÷ÓÃÖ÷¶¯Éϱ¨´¦Àíº¯Êý

+         */

+        if( (prefix_len >0 && at_cmd_prefix != NULL && 0 == at_strncmp(fwd_context->at_cmd_prefix, (char*)at_cmd_prefix, prefix_len))

+                ||(prefix_len >0 && at_cmd_prefix != NULL && 0==strncmp("> ",at_cmd_prefix, prefix_len)) )

+        {

+        	at_print(AT_ERR,"receive fwd_down inform str = %s, fd = %d\n", at_str, at_fd);

+			set_fwd_fd(fwd_context->fwd_context->at_channel->at_fd);

+			if(strstr(at_str,"> ") != NULL)

+			{

+				struct at_channel_info * ch_info = at_context_find_chn_by_fd(fwd_context->fwd_context->at_channel->at_fd);

+				if(ch_info != NULL)

+				ch_info->cmd_state = 1;//ÊÕµ½> ºó£¬ÖøÃͨµÀ״̬Ϊ¶ÌÐÅ״̬£¬±íÃ÷½ÓÏÂÀ´¸ÃͨµÀÊÕµ½¶¼ÊǶÌÐÅÄÚÈÝ

+			}

+            return 0;

+        }

+    }

+    /* Ò»°ãÖ÷¶¯Éϱ¨£¬½ö´¦Àíg_auto_fdͨµÀµÄÖ÷¶¯Éϱ¨ºÍVOLTEµÄÖ÷¶¯Éϱ¨£¬g_auto_fdĬÈÏÑ¡ÔñµÚÒ»¸ö´ò¿ªµÄNEAR_PSλÖõÄatͨµÀ*/

+    if(g_auto_fd == at_fd || position == POSITION_VOLTE || position == FAR_PS)

+    {

+    	at_print(AT_ERR,"receive auto report str = %s, fd = %d, g_auto_fd = %d, position = %d\n", at_str, at_fd, g_auto_fd, position);

+

+		list_for_each_entry(entry,&g_inform_list,list)

+		{

+		   if((0 == at_strncmp(entry->at_cmd_prefix,(char*)at_cmd_prefix, MAXSTR(entry->at_cmd_prefix,prefix_len))) && entry->inform_act)

+		   {

+#ifdef _USE_BL

+			if(at_cmd_prefix){

+			if(AT_CMD_PREFIX > prefix_len)

+			   memcpy(IndAtCmdPrefix, at_cmd_prefix, prefix_len);

+			else

+				memcpy(IndAtCmdPrefix, at_cmd_prefix, AT_CMD_PREFIX-1);

+			}

+#endif

+			   entry->inform_act(at_cmd_paras, 0);

+#ifdef _USE_BL

+			   memset(IndAtCmdPrefix, 0x00, AT_CMD_PREFIX);

+#endif

+		   }			   

+		}

+    }

+	if(at_cmd_prefix)

+	rcv_at_inform_filter(at_fd, at_cmd_prefix, prefix_len);

+    

+    return 0;

+}

+

+/* PDUÀàATÃüÁî´¦Àí

+ÓÐÁ½ÖÖÇé¿ö£¬Ò»ÖÖÊÇЭÒéÕ»Éϱ¨µÄPDU, Ò»ÖÖÊÇ´ÓÍⲿMCU»òÕßAP²à½ÓÊÕµ½µÄPDU£¬ÐèҪת·¢µ½Ð­ÒéÕ»*/

+static int rcv_sms_pdu_handle(int at_fd, char *at_str, void *at_cmd_prefix, int prefix_len, void * at_cmd_paras, int paras_len)

+{

+    int position = at_context_get_pos_by_fd(at_fd);

+    struct at_context * context = NULL;

+	int i = 0, curlen = 0, leftDatalen = 0;

+	int totallen = strlen(at_str);

+	

+    /* ¿Í»§¶ËÉÏÏÂÎÄÆ¥Åä     £¨ZMGR ZMGLÉϱ¨µÄPDU£©*/

+    if(NULL != (context = at_context_find_ctx_by_fd_type(at_fd, AT_CLIENT)))

+    {        

+        at_print(AT_ERR,"client pdu:%s, msgid:%d, prefix:%s\n", (char *)at_cmd_paras, context->msg_id, context->at_cmd_prefix);

+        //at_print(AT_ERR,"client pdu\n");

+#ifdef _USE_BL

+        at_print(AT_NORMAL,"corem prefix:%s,cmdId:%d\n", context->at_cmd_prefix, context->cmdId);

+        phone_info_pdu(at_cmd_paras ,(int)context);

+#else

+        atSms_RecvPdu(at_cmd_paras, context);

+#endif

+        return 0;       

+

+    }

+    /* ת·¢ÉÏÓζËÉÏÏÂÎÄÆ¥Åä¡£cp²à:´ÓºË¼äͨѶ¶ÁÈ¡µÄÖмä¹ý³ÌÉϱ¨×ß´ËÁ÷³Ì*/

+    else if(NULL != (context = at_context_find_ctx_by_fd_type(at_fd, AT_FWD_UP)))

+    {

+        //at_print(AT_DEBUG,"coremtest context:%p, fwcontext:%p, str:%s\n", context, context->fwd_context, context->at_cmd_prefix);

+        if(context->fwd_context)

+            at_print(AT_DEBUG,"coremtest contextfwd:%p, str:%s\n", context->fwd_context, context->fwd_context->at_cmd_prefix);

+

+        at_print(AT_DEBUG,"corem len:%d, str: %s, position:%d, ctprefix:%s\n", prefix_len, (char *)at_cmd_prefix, position, context->fwd_context->at_cmd_prefix);

+        /* ´Óap²àÀ´µÄpdu¶ÌÐÅÐèҪת·¢¸øÐ­ÒéÕ», ÔÚcp²à½öÐèÒªÕâ¸öת·¢*/

+        if(position == FAR_PS && context->fwd_context != NULL)

+        {

+            at_print(AT_DEBUG,"corem cmdp:%s, msgid:%d, prefix:%s\n", (char *)at_cmd_paras, context->msg_id, context->at_cmd_prefix);

+            if(context->fwd_context->at_channel == NULL)

+            {

+                softap_assert("");

+				return 0;

+            }

+            set_fwd_fd(context->fwd_context->at_channel->at_fd);			

+            return 0;

+        }

+    } 

+

+	/*NEAR_PS»òÕßVOLTE_PTYÉϱ¨µÄPDU£¨CDS CMT £©*/

+	if(g_auto_fd == at_fd || position == POSITION_VOLTE)

+	{

+		at_print(AT_ERR,"Recv Pdu auto rsp\n");

+		//at_print(AT_DEBUG,"corem cmdp:%s\n", (char *)at_cmd_paras);

+#ifdef _USE_BL

+		at_print(AT_DEBUG,"corem prefix NULL\n");

+        phone_info_pdu(at_cmd_paras ,NULL);

+#else

+		atSms_RecvPdu(at_cmd_paras, NULL);		

+#endif

+	}

+    return 0;

+}

+

+

+/*******************************************************************************

+ *                      Global function implementations                        *

+ ******************************************************************************/

+/**

+ * @brief ATͨµÀÏûÏ¢´¦ÀíʵÏÖ¡£°üÀ¨ÇëÇóÀà¡¢ÏìÓ¦Àࡢ֪ͨÀ༰PDUÀàµÄatÏûÏ¢´¦Àí¡£

+ * @param msg ÏûÏ¢Ìå

+ * @return ÏêϸÐÅÏ¢²Î¼ûat_write_positionö¾ÙÐÅÏ¢

+ * @note   

+ * @warning 

+ */

+int at_rcvmsg_handle(int at_fd, char *at_str, int at_len)

+{

+    /* atÀàÐÍ*/

+    int at_str_type;

+    /* atǰ׺ÆðʼλÖã¬Ö±½ÓÖ¸ÏòatÃüÁîËùÔÚÄڴ棬Òò´Ëatǰ׺½áÊøÎ»ÖúóÃæµÄ×Ö·û²»Ò»¶¨Ê±'\0'£¬Óëatǰ׺³¤¶È±ØÐëÒ»ÆðʹÓã¬È·¶¨Ç°×º³¤¶È*/

+    void * at_cmd_prefix = NULL;

+    /* atǰ׺³¤¶È£¬¶ÔÓÚpduÐÅÏ¢£¬Ç°×º³¤¶ÈΪ0£¬´Ëʱat_cmd_prefixΪ¿Õ*/

+    int prefix_len = 0;

+    /* atÃüÁî²ÎÊýÆðʼλÖã¬Ö±½ÓÖ¸ÏòatÃüÁîËùÔÚÄڴ棬µ±atÃüÁî²»´æÔÚ²ÎÊýʱ£¬at_cmd_parasΪnull£¬paras_lenΪ0*/

+    void * at_cmd_paras = NULL;

+    /* atÃüÁî²ÎÊý³¤¶È£¬¿ÉÒÔΪ0*/

+    int paras_len = 0;

+

+    /* ½âÎöATÃüÁîǰ׺ÐÅÏ¢£¬Ê¶±ð³öǰ׺ÄÚÈݼ°ATÀàÐÍ*/

+    at_str_type = parase_at_cmd(at_str, &at_cmd_prefix, &prefix_len, &at_cmd_paras, &paras_len);

+    //at_print(AT_NORMAL,"at_rcvmsg_handle str=%s, len = %d\n, at_fd = %d, at_str_type = %d, at_cmd_paras: %s\n",at_str, at_len, at_fd,at_str_type,(char *)at_cmd_paras);

+	

+	if(whole_at_type == -1)

+		whole_at_type = at_str_type;

+#ifdef MULTI_CPU

+	/*´¦ÀíºË¼äÏûÏ¢ÃüÁî+MSG:XXXXX*/

+    if(0 == at_strncmp("MSG", (char*)at_cmd_prefix, MAXSTR("MSG", prefix_len)))

+    {

+		at_print(AT_ERR,"receive socmsg str = %s\n", at_str);

+		/* Èç¹ûÊǺ˼äͨѶATÏûÏ¢£¬Ôòat_ctlÄÚ²¿Ö±½Ó´¦Àí»ò·¢Ë͸ø¹ØÁªÓ¦Óô¦Àí£¬´Ë´¦¾Í½áÊø*/

+		at_socmsg_trans_and_write(at_cmd_paras,paras_len); 

+        return 0;

+    }

+#endif

+    if(at_str_type == AT_TYPE_REQUEST)//ÇëÇóÀàÃüÁî´¦Àí

+    {

+    	//Îı¾¶ÌÐÅÄÚÈÝÖÐÈç¹û°üº¬AT£¬AT»á±»µ±³ÉÇëÇóÃüÁת·¢µ½FAR_PS

+    	//È磺\r\n+CMT: "+8613813800713","","18/04/18,14:05:18+32"\r\n at\r\n

+    	if(fwd_fd != 0 && whole_at_type != at_str_type)

+			return 0;

+			

+    	at_print(AT_ERR,"at_rcvmsg_handle AT_TYPE_REQUEST str=%s, at_fd = %d, at_cmd_paras: %s, prefix_len: %d, paras_len: %d\n",at_str, at_fd,(char *)at_cmd_paras, prefix_len, paras_len);

+		//µ±Ç°×º³¤¶È´óÓÚǰ׺×î´ó±£´æ³¤¶Èʱ£¬±¨´í add by zpr 210115

+		if(prefix_len >= AT_CMD_PREFIX)

+		{

+			//»Ø¸´AT³¬³¤

+			char* err_str = at_err_build(ATERR_STR_TOO_LONG);

+			at_context_write_data(at_fd, err_str,strlen(err_str));

+			free(err_str);

+			return 0;

+		}

+        return rcv_at_req_handle(at_fd, at_str, at_cmd_prefix, prefix_len, at_cmd_paras, paras_len);

+    }

+    else if(at_str_type == AT_TYPE_RESPONSE)//ÏìÓ¦ÀàÃüÁî´¦Àí

+    {

+    	at_print(AT_ERR,"at_rcvmsg_handle AT_TYPE_RESPONSE str=%s, at_fd = %d, at_cmd_paras: %s, prefix_len: %d, paras_len: %d\n",at_str, at_fd,(char *)at_cmd_paras, prefix_len, paras_len);

+        return rcv_at_rsp_handle(at_fd, at_str, at_cmd_prefix, prefix_len, at_cmd_paras, paras_len);

+    }

+    else if(at_str_type == AT_TYPE_INFORM)//Öмä½á¹ûÃüÁîºÍÖ÷¶¯Éϱ¨´¦Àí

+        return rcv_at_inform_handle(at_fd, at_str, at_cmd_prefix, prefix_len, at_cmd_paras, paras_len);

+    else if(at_str_type == AT_TYPE_PDU)//PDU´¦Àí

+    {

+    	at_print(AT_ERR,"at_rcvmsg_handle AT_TYPE_PDU at_fd = %d, prefix_len: %d, paras_len: %d\n", at_fd, prefix_len, paras_len);

+		if(at_cmd_paras)

+		return rcv_sms_pdu_handle(at_fd, at_str, at_cmd_prefix, prefix_len, at_cmd_paras, paras_len);

+    }

+    return 0;

+}

+

+

+//ÉèÖÃת·¢¾ä±ú£¬µ±ATÁ÷ÖÐÖ»ÒªÓÐÒ»ÌõΪµ¥²¥£¬ËùÓеĽÔΪµ¥²¥£»µ±µ¥²¥¾ä±ú³åͻʱ£¬¶ÏÑÔ

+void set_fwd_fd(int fd)

+{

+	if(fwd_fd == fd)

+	{}

+	else if(fwd_fd == 0 || fwd_fd == BROADCAST_FWD)

+	{

+		fwd_fd = fd;

+	}

+	else if(fwd_fd == BROADCAST_VOLTE  && fd == BROADCAST_FWD)

+	{

+	

+	}

+	else if(fwd_fd == BROADCAST_VOLTE  && fd == BROADCAST_FARPS)

+	{

+		softap_assert("");

+	}

+	else if(fwd_fd == BROADCAST_FARPS  && fd == BROADCAST_FWD)

+	{

+		softap_assert("");

+	}

+}

+extern int strnlen(char *s, unsigned int n);

+/* APºË·¢µ½ÍⲿMCUµÄATÏìÓ¦Èç¹û²»Âú×ã¿Í»§MCUµÄÐèÇó£¬

+ ÐèÒª°´ÕÕÍⲿMCUµÄÒªÇó½øÐÐת»»£¬º¯Êý·µ»Ø×ª»»ºóµÄAT×Ö·û´® */

+char* format_inform_for_farps(char *at_str)

+{

+#if (APP_OS_TYPE == APP_OS_LINUX)

+	struct formatinform_ops_t * format_inform_node;

+	char *at_param = NULL; 

+

+    if((*at_str == 'A'||*at_str == 'a')&&(*(at_str+1) == 'T'||*(at_str+1) == 't'))

+		return NULL;	

+

+	list_for_each_entry(format_inform_node,&g_formatinform_list,list)

+	{

+		at_param = strstr(at_str, format_inform_node->at_cmd_prefix);

+		if(at_param != NULL)

+		{

+			char *at_new_str = malloc(AT_CMD_MAX);

+			char *at_new_param = NULL, *at_end = NULL, *next_str = NULL;

+			int left_len = AT_CMD_MAX;

+			

+			at_param += strlen(format_inform_node->at_cmd_prefix);

+	

+			if(!at_new_str){

+				softap_assert("malloc fail");

+				return NULL;

+			}

+			memset(at_new_str, 0x00, AT_CMD_MAX);

+			if(left_len <= at_param-at_str){

+				free(at_new_str);

+				return NULL;

+			}

+			memcpy(at_new_str, at_str, at_param-at_str);

+			next_str = at_new_str + strnlen(at_new_str,left_len-1);

+			left_len = left_len - strnlen(at_new_str,left_len-1);

+	

+			at_new_param = format_inform_node->inform_act(at_param);

+			if(at_new_param)

+			{

+				if(left_len <= strlen(at_new_param)){

+					free(at_new_str);

+					free(at_new_param);

+					return NULL;

+				}

+				memcpy(next_str, at_new_param, strlen(at_new_param));

+				next_str = next_str + strlen(at_new_param); 

+				left_len = left_len - strlen(at_new_param);

+				free(at_new_param);

+			}

+			

+			at_end = strstr(at_param, "\r\n");

+			if(at_end)

+			{	

+				if(left_len <= strlen(at_end)){

+					free(at_new_str);

+					return NULL;

+				}

+				memcpy(next_str, at_end, strlen(at_end));			

+				next_str = next_str + strlen(at_end);

+			}

+	

+			*next_str = '\0';

+			return at_new_str;

+		}

+	}

+#endif

+	return NULL;

+}

+

+

+/*ת·¢·½Ê½Èº·¢AT×Ö·û´®Á÷*/

+static void fwd_all_at_str(int fd, char *at_str)

+{

+	if(fd == BROADCAST_FARPS)

+	{

+		at_context_write_by_pos(FAR_PS, at_str);

+	}

+	else if(fd == BROADCAST_VOLTE)

+	{

+		at_context_write_by_pos(POSITION_VOLTE, at_str);

+	}

+	else if(fd == BROADCAST_FWD)

+	{

+		at_context_write_by_pos(FAR_PS, at_str);

+		//if(check_is_pty())

+		//{

+			at_context_write_by_pos(POSITION_VOLTE, at_str);

+		//}

+	}

+	else

+	{	

+		char* at_new_str = NULL;

+		int ret = -1;

+

+		//ÅжÏת·¢µÄATÃüÁîÊÇ·ñÐèÒª¸ñʽ»¯´¦Àí

+		at_new_str = format_inform_for_farps(at_str);

+		if(!at_new_str)

+		{

+			ret = at_context_write_data(fd, at_str, strlen(at_str)); 

+		}

+		else			

+		{

+			ret = at_context_write_data(fd, at_new_str, strlen(at_new_str)); 

+			free(at_new_str);

+		}

+		if(ret < 0)

+		{/*дʧ°Ü·ÀֹͨµÀ¶ÂÈû*/

+			rcv_at_rsp_handle(fd,"ERROR","",0,"",0);

+			at_print(AT_ERR,"fwd_all_at_str write fail\n");

+		}

+	}

+}

+

+/*¶Ô½ÓÊÕµ½µÄATÃüÁî×Ö·û´®½øÐе¥¸ö×Ö·û´®´¦Àí ´¦Àí´Ó"at_recv_thread"Ï̴߳«À´µÄATͨµÀÏûÏ¢¡£¸ù¾Ý½ÓÊÕµ½µÄatÃüÁî×Ö·û´®£¬

+×é×°ºÍÖØ×é³ÉÍêÕûµÄatÃüÁ²¢´¦Àí¡£*/

+int rcv_at_str_proc(int at_fd, char *at_str, int at_len)

+{

+    char *whole_cmd_str = NULL;

+    char *next_str = at_str;

+    char *next_str_rn = NULL;

+	char *pdu_str = NULL;

+    char *next_str_r = NULL;

+    char *next_str_n = NULL;

+    char *pdu_data = NULL;

+	char *pend_ctrlz = NULL, *pend_esc = NULL;

+	int position = at_context_get_pos_by_fd(at_fd);

+

+    at_print(AT_DEBUG,"rcv_at_str_proc recv fd:%d,len:%d,data:%s\n", at_fd, at_len, get_small_str(at_str));

+    /*Óë֮ǰµÄ·Ö¶ÎAT×Ö·û´®½øÐд®Áª*/

+    if((whole_cmd_str = is_whole_atcmd(at_fd, at_str, at_len)) == NULL)

+    {

+        //at_print(AT_ERR,"ERR: recv incompleted cmd and stored!!\n");

+        return 0;

+    }

+    fwd_fd = 0;

+	whole_at_type = -1;

+    //·¢Ë͸øÐ­ÒéÕ»µÄPDUʶ±ð

+    pend_ctrlz = strchr(whole_cmd_str, CTRL_Z_CHAR);

+	pend_esc = strchr(whole_cmd_str, ESC_CHAR);

+    if(NEAR_PS != position && (pend_ctrlz || pend_esc))

+    {    

+    	if(pend_ctrlz) *(pend_ctrlz+1) = '\0';

+		if(pend_esc)  *(pend_esc+1) = '\0';       

+        rcv_sms_pdu_handle(at_fd, whole_cmd_str,NULL, 0, whole_cmd_str, strlen(whole_cmd_str));

+		next_str = whole_cmd_str + strlen(whole_cmd_str);

+		struct at_channel_info * ch_info = at_context_find_chn_by_fd(at_fd);

+		if(ch_info != NULL)

+		ch_info->cmd_state = 0;//ÊÕµ½ÍêÕûµÄ¶ÌÐÅÄÚÈݺó£¬ÔÚ´¦Àí¶ÌÐÅÄÚÈݺ󣬻ָ´ÊÕµ½¸Ã¶ÌÐŵÄͨµÀ״̬ΪÆÕͨÃüÁî״̬

+		goto send_at_str;

+    }

+    /*ÒÔ"\r\n""\n""\r"µÈΪ±ß½ç£¬Öð¸öÌáȡÿ¸öATÃüÁ½øÐд¦Àí.ÇëÇóÀàµÄÃüÁî´ø"\r\n"»ò

+    "\r"»ò"\n"½á⣬ÏìÓ¦ÀàÃüÁî¶¼ÊÇÒÔ"\r\n"½áβ*/

+	next_str = whole_cmd_str;

+	while(next_str < whole_cmd_str + strlen(whole_cmd_str))

+    {

+        char *single_at;

+

+        next_str_rn = find_sub_str(next_str,"\r\n",strlen(next_str));

+        next_str_r = find_sub_str(next_str,"\r",strlen(next_str));

+        next_str_n = find_sub_str(next_str,"\n",strlen(next_str));

+		if(next_str_n > (whole_cmd_str + strlen(whole_cmd_str)))

+		{

+			softap_assert("");

+		}

+

+		#if 1

+		{

+			char *quo_double_pre = NULL;

+			char *quo_double_after = NULL;

+			char *real_next_str_r = NULL;

+			char *real_next_str_n = NULL;

+			char *cusd = find_sub_str(next_str,"+CUSD:",strlen(next_str));

+

+			if(cusd != NULL && (cusd < next_str_r || cusd < next_str_n))

+			{//º¬ÓÐcusd£¬ÇÒÔÚ\r»ò\nÄÚ

+			

+    	    	quo_double_pre = find_sub_str(next_str,"\"",strlen(next_str));

+				if(quo_double_pre != NULL && quo_double_pre > cusd && (quo_double_pre < next_str_r || quo_double_pre < next_str_n)){

+					quo_double_after = find_sub_str(quo_double_pre + 1,"\"",strlen(quo_double_pre + 1));

+					if(quo_double_after != NULL && (quo_double_after - next_str - 1 <  strlen(next_str))){

+						real_next_str_r = find_sub_str(quo_double_after + 1,"\r",strlen(quo_double_after + 1));

+						real_next_str_n = find_sub_str(quo_double_after + 1,"\n",strlen(quo_double_after + 1));

+						next_str_rn = find_sub_str(quo_double_after + 1,"\r\n",strlen(quo_double_after + 1));//corem0418

+						if(real_next_str_r != NULL && real_next_str_r <= next_str_rn){

+							next_str_r = real_next_str_r;

+						}

+						if(real_next_str_n != NULL && real_next_str_n <= next_str_rn+1){

+							next_str_n = real_next_str_n;

+						}

+					}

+				}					

+			}

+#if 0			

+			if(quo_double_pre != NULL){

+				at_print(AT_ERR,"quo_pre:%s\n", quo_double_pre);

+			}

+			if(quo_double_after != NULL){

+				at_print(AT_ERR,"quo_aft:%d\n", quo_double_after - next_str);

+			}

+			if(real_next_str_r != NULL){

+				at_print(AT_ERR,"real_r:%d\n", real_next_str_r - next_str);

+			}

+			if(real_next_str_n != NULL){

+				at_print(AT_ERR,"real_n:%d\n", real_next_str_n - next_str);

+			}

+			if(next_str_rn != NULL){

+				at_print(AT_ERR,"real_rn:%d\n", next_str_rn - next_str);

+			}

+#endif

+        	

+		}

+#endif	

+		

+        //ÏÂÒ»¸öATÃüÁîÊÇÒÔ"\r\n"½áβ

+        if((next_str_rn!=NULL)&&(next_str_r!=NULL)&&(next_str_rn==next_str_r)&&(next_str_rn<next_str_n))

+        {

+            //AT´®Í·²¿Îª"\r\n"£¬Ìø¹ý

+            if(next_str == next_str_rn)

+            {               

+                next_str += 2;

+				continue;

+            }

+            single_at = (char *)malloc(next_str_rn-next_str+1);

+			if(single_at == NULL){

+				softap_assert("rcv_at_str_proc no mem!");

+				free(whole_cmd_str);

+				return -1;

+			}

+			memset(single_at, 0x00, next_str_rn-next_str+1);

+            memcpy(single_at, next_str,next_str_rn-next_str);           

+			at_rcvmsg_handle(at_fd, single_at,strlen(single_at));

+			free(single_at);

+            next_str = next_str_rn+2;

+        }

+        //ÏÂÒ»¸öATÃüÁîÊÇÒÔ"\n"½áβ

+        else if((next_str_n!=NULL)&&(next_str_rn>next_str_n || next_str_rn==NULL)&&(next_str_r>next_str_n || next_str_r==NULL))

+        {

+            //¿ÕµÄ"\n"Ìø¹ý£¬³£¼ûÓÚÉϴνضÏΪ'\r'Ϊ½áÊøÇé¿ö

+            if(next_str == next_str_n)

+            {

+                next_str++;

+                continue;

+            }

+            single_at = (char *)malloc(next_str_n-next_str+1);

+			if(single_at == NULL){

+				softap_assert("rcv_at_str_proc no mem!");

+				free(whole_cmd_str);

+				return -1;

+			}

+			memset(single_at, 0x00, next_str_n-next_str+1);

+			memcpy(single_at, next_str,next_str_n-next_str);

+			at_rcvmsg_handle(at_fd, single_at,strlen(single_at));

+			free(single_at);

+            next_str = next_str_n+1;

+        }

+        //ÏÂÒ»¸öATÃüÁîÊÇÒÔ"\r"½áβ,ºóÃæµÄ'\n'»¹Ã»ÊÕµ½£¬´ËʱҲµ±³ÉÍê³ÉATµ¥ÌõÃüÁî´¦Àí£¬²»ÖªÊÇ·ñÓÐÎÊÌâ

+        else if((next_str_r!=NULL)&&(next_str_rn>next_str_r || next_str_rn==NULL)&&(next_str_r<next_str_n || next_str_n==NULL))

+        {

+            //¿ÕµÄ"\r"Ìø¹ý£¬³£¼ûÓÚ×îºóÒ»¸öAT´®½Ø¶Ï£¬Ï´ÎÊ××Ö·ûΪ'\n'

+            if(next_str == next_str_r)

+            {

+                next_str ++;

+                continue;

+            }

+            single_at = (char *)malloc(next_str_r-next_str+1);

+			if(single_at == NULL){

+				softap_assert("rcv_at_str_proc no mem!");

+				free(whole_cmd_str);

+				return -1;

+			}

+			memset(single_at, 0x00, next_str_r-next_str+1);

+			memcpy(single_at, next_str,next_str_r-next_str);

+			at_rcvmsg_handle(at_fd, single_at,strlen(single_at));

+			free(single_at);

+            next_str = next_str_r+1;

+        }

+		//·¢ËͶÌÏûÏ¢µÄÌØÊâÖ÷¶¯Éϱ¨

+        else if((pdu_str = strstr(next_str,"> "))!= NULL)

+        {

+            /*single_at = (char *)malloc(3);

+			if(single_at == NULL){

+				softap_assert("rcv_at_str_proc no mem!");

+				free(whole_cmd_str);

+				return -1;

+			}

+			memset(single_at, 0x00, 3);

+            memcpy(single_at, "> ",2);*/

+			at_rcvmsg_handle(at_fd, "> ",strlen("> "));

+			//free(single_at);

+        	next_str = pdu_str + 2;

+			*next_str = '\0';

+            goto  send_at_str;

+        }

+		else if(next_str_rn == NULL && next_str_r == NULL && next_str_n == NULL)//Ç°ÃæÓÐ/r/nµ«ºóÃæÃ»ÓеÄ

+		{

+			break;

+		}

+		else

+		{

+			softap_assert("rcv_at_str_proc unkonw str!");

+		}

+    }

+    //µ±×îºóµÄβ²¿²»Îª"\r\n"»ò"\r"ʱ£¬ÐèÒª½«¸Ãβ²¿±£´æ

+    if(whole_cmd_str+strlen(whole_cmd_str)-next_str > 0)

+    {

+    	//¶ÔÓÚ²»ÍêÕûµÄÃüÁî½øÐÐÊÇ·ñÆô³¬Ê±¶¨Ê±Æ÷µÄÅжÏ

+		start_farps_waittimer(at_fd);

+		struct at_channel_info * ch_info = at_context_find_chn_by_fd(at_fd);

+		unsigned int store_len = whole_cmd_str+strlen(whole_cmd_str)-next_str;

+		store_len = store_len<(AT_CMD_MAX)?store_len:(AT_CMD_MAX-1);

+		if(ch_info != NULL)

+		memcpy(ch_info->store_cmd, next_str, store_len);

+    }

+send_at_str:

+    //¶ÔÓÚ·ÇÇëÇóµÄ×Ö·û´®×ª·¢£¬ÒÔÍêÕû×Ö·û´®±ß½ç½øÐÐת·¢

+    if(next_str > whole_cmd_str && fwd_fd != 0)

+    {

+    	//½Ø¶Ï×Ö·û´®£¬·ÀÖ¹ÄÚ²¿Ê¹ÓÃ×Ö·û´®api½Ó¿Ú

+        *(next_str) = '\0';

+		fwd_all_at_str(fwd_fd,whole_cmd_str);

+    }

+    free(whole_cmd_str);

+    return 0;

+}

+