[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, ¶s_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;
+}
+