/************************************************************************** | |
* | |
* 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}; | |
sc_cfg_get("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); | |
sc_cfg_get("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: | |
sc_timer_create(ZCCAPP_TIMER_DTMF_DETECT, | |
0, | |
ZCCAPP_TIMER_DTMF_INTERVAL, | |
zCcApp_DtmfTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_DigitsMatchRltProc sc_timer_create 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)//ÓÐÆäËûºô½Ðʱ²»·ÅæÒô | |
{ | |
sc_timer_create(ZCCAPP_TIMER_BUSYTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_BUSYTONE_INTERVAL, | |
zCcApp_BusyToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_DigitsMatchRltProc sc_timer_create 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)//ÓÐÆäËûºô½ÐÇÒÒѹһúʱ²»·ÅæÒô | |
{ | |
sc_timer_create(ZCCAPP_TIMER_BUSYTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_BUSYTONE_INTERVAL, | |
zCcApp_BusyToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SendAtDialReq sc_timer_create 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(); | |
} | |
sc_timer_delete(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 | |
sc_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}; | |
sc_cfg_get("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) | |
{ | |
sc_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 | |
sc_cfg_get("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 | |
sc_cfg_get("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 ) &"); | |
sc_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 | |
sc_cfg_get("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; | |
sc_timer_delete(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 | |
{ | |
sc_timer_delete(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; | |
} | |
} | |
sc_timer_delete(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 ) &"); | |
sc_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); | |
sc_timer_delete(ZCCAPP_TIMER_HOOKOFF_DETECT); | |
sc_timer_delete(ZCCAPP_TIMER_DTMF_DETECT); | |
sc_timer_delete(ZCCAPP_TIMER_BUSYTONE_DETECT); | |
sc_timer_delete(ZCCAPP_TIMER_TKYTONE_DETECT); | |
sc_timer_delete(ZCCAPP_TIMER_SSDIALTONE_DETECT); | |
sc_timer_delete(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 | |
sc_cfg_get("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; | |
sc_timer_delete(ZCCAPP_TIMER_HOOKOFF_DETECT);//ÊÕµ½ÉÁ¶Ï£¬µ±Ç°¶¨Ê±Æ÷¶¼ÐèҪֹͣ£¬ºóÐøÔÙÆô¶¯ | |
sc_timer_delete(ZCCAPP_TIMER_DTMF_DETECT); | |
sc_timer_delete(ZCCAPP_TIMER_BUSYTONE_DETECT); | |
sc_timer_delete(ZCCAPP_TIMER_TKYTONE_DETECT); | |
sc_timer_delete(ZCCAPP_TIMER_SSDIALTONE_DETECT); | |
sc_timer_delete(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; | |
sc_timer_create(ZCCAPP_TIMER_TKYTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_TKYTONE_INTERVAL, | |
zCcApp_TkyToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_MSeizeState sc_timer_create 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; | |
sc_timer_create(ZCCAPP_TIMER_BUSYTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_BUSYTONE_INTERVAL, | |
zCcApp_BusyToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_MSeizeState sc_timer_create 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 = sc_cfg_get("dialog_hotline_str", hotline, sizeof(hotline)-1); | |
if(rt!=0 || strlen(hotline)<=0) | |
{ | |
sc_timer_delete(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; | |
sc_timer_delete(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(); | |
} | |
sc_timer_delete(ZCCAPP_TIMER_HOOKOFF_DETECT);//ÊÕµ½ÉÁ¶Ï£¬µ±Ç°¶¨Ê±Æ÷¶¼ÐèҪֹͣ£¬ºóÐøÔÙÆô¶¯ | |
sc_timer_delete(ZCCAPP_TIMER_DTMF_DETECT); | |
sc_timer_delete(ZCCAPP_TIMER_BUSYTONE_DETECT); | |
sc_timer_delete(ZCCAPP_TIMER_TKYTONE_DETECT); | |
sc_timer_delete(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 | |
sc_timer_create(ZCCAPP_TIMER_SSDIALTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_HOOKOFF_INTERVAL, | |
zCcApp_SsDialToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_MSeizeState: sc_timer_create 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; | |
sc_timer_create(ZCCAPP_TIMER_SSDIALTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_HOOKOFF_INTERVAL, | |
zCcApp_SsDialToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_MSeizeState:sc_timer_create 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; | |
sc_timer_create(ZCCAPP_TIMER_SSDIALTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_HOOKOFF_INTERVAL, | |
zCcApp_SsDialToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_MSeizeState:sc_timer_create 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)//ÓÐÆäËûºô½ÐÇÒÒѹһúʱ²»·ÅæÒô | |
{ | |
sc_timer_create(ZCCAPP_TIMER_BUSYTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_BUSYTONE_INTERVAL, | |
zCcApp_BusyToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SendAtDialReq sc_timer_create 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) | |
{ | |
sc_timer_create(ZCCAPP_TIMER_SSDIALTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_HOOKOFF_INTERVAL, | |
zCcApp_SsDialToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_MSeizeState:sc_timer_create 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; | |
sc_timer_create(ZCCAPP_TIMER_HOOKOFF_DETECT, | |
0, | |
ZCCAPP_TIMER_HOOKOFF_INTERVAL, | |
zCcApp_HookOffTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SIdleState sc_timer_create zCcApp_HookOffTimer\n",__FUNCTION__); | |
g_Cc_CallDetail.slaveObj[slave].idle_second = 0; | |
sc_timer_create(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 sc_timer_create zCcApp_HookOff_Idle_Timer\n",__FUNCTION__); | |
} | |
break; | |
case ZCC_DTMF_E://held+dailing | |
if ( 0 != zCc_HeldCall() && 0 == zCc_ActiveCall()) | |
{ | |
sc_timer_delete(ZCCAPP_TIMER_SSDIALTONE_DETECT); | |
sc_timer_create(ZCCAPP_TIMER_DTMF_DETECT, | |
0, | |
ZCCAPP_TIMER_DTMF_INTERVAL, | |
zCcApp_DtmfTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SIdleState sc_timer_create 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)//ÓÐÆäËûºô½ÐÇÒÒѹһúʱ²»·ÅæÒô | |
{ | |
sc_timer_create(ZCCAPP_TIMER_BUSYTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_BUSYTONE_INTERVAL, | |
zCcApp_BusyToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SIdleState sc_timer_create 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: | |
sc_timer_delete(ZCCAPP_TIMER_HOOKOFF_IDLE); | |
g_Cc_CallDetail.slaveObj[slave].idle_second = 0; | |
sc_timer_delete(ZCCAPP_TIMER_HOOKOFF_DETECT); | |
sc_timer_create(ZCCAPP_TIMER_DTMF_DETECT, | |
0, | |
ZCCAPP_TIMER_DTMF_INTERVAL, | |
zCcApp_DtmfTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SDtState sc_timer_create 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: | |
sc_timer_delete(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)//ÓÐÆäËûºô½ÐÇÒÒѹһúʱ²»·ÅæÒô | |
{ | |
sc_timer_create(ZCCAPP_TIMER_BUSYTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_BUSYTONE_INTERVAL, | |
zCcApp_BusyToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SDialingState sc_timer_create 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)//ÓÐÆäËûºô½Ðʱ²»·ÅæÒô | |
{ | |
sc_timer_create(ZCCAPP_TIMER_BUSYTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_BUSYTONE_INTERVAL, | |
zCcApp_BusyToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SRingbackState sc_timer_create 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)//ÓÐÆäËûºô½Ðʱ²»·ÅæÒô | |
{ | |
sc_timer_create(ZCCAPP_TIMER_BUSYTONE_DETECT, | |
0, | |
ZCCAPP_TIMER_BUSYTONE_INTERVAL, | |
zCcApp_BusyToneTimer, | |
NULL); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_STalkingState sc_timer_create 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; | |
} | |
} | |