/************************************************************************** | |
* | |
* Copyright (c) 2013 ZTE Corporation. | |
* | |
*************************************************************************** | |
* Ä£ ¿é Ãû : Cc | |
* ÎÄ ¼þ Ãû : Cc_main.c | |
* Ïà¹ØÎļþ : | |
* ʵÏÖ¹¦ÄÜ : µç»°ÒµÎñÃüÁî·¢Ëͺͽá¹û´¦ÀíÄ£¿éº¯Êý¶¨Òå | |
* ×÷ Õß : | |
* °æ ±¾ : | |
* Íê³ÉÈÕÆÚ : | |
* ÆäËü˵Ã÷ : | |
**************************************************************************/ | |
/************************************************************************** | |
* Ð޸ļǼ : | |
***************************************************************************/ | |
/************************************************************************** | |
* #includeÇø | |
**************************************************************************/ | |
#include <errno.h> | |
//#include <signal.h> | |
#include <stdio.h> | |
#include <string.h> | |
#include <stdlib.h> | |
//#include <time.h> | |
#include <fcntl.h> | |
#include "cc_main.h" | |
#include "cc_proc.h" | |
#include "cc_com.h" | |
#include "cc_at.h" | |
#include <sys/types.h> | |
#ifdef TEST_CCAPP | |
#include "soft_timer.h" | |
#endif | |
/************************************************************************** | |
* ³£Á¿¶¨ÒåÇø | |
**************************************************************************/ | |
/************************************************************************** | |
* Êý¾Ý½á¹¹¶¨ÒåÇø | |
**************************************************************************/ | |
extern T_CC_APP_AtIndProcItem gCcAppAtIndProc[]; | |
extern SINT32 gCcAppRecvAtIndCnt; | |
T_zCc_CallDetail g_Cc_CallDetail; | |
char g_zCcApp_AtIndBuf[ZCC_APP_AT_BUF_MAX_LEN+1]; | |
/************************************************************************** | |
* staticº¯ÊýÉùÃ÷Çø | |
**************************************************************************/ | |
/************************************************************************** | |
* È«¾Ö±äÁ¿¶¨ÒåÇø | |
**************************************************************************/ | |
static SINT32 g_zCc_MsqId = NULL; | |
//static SINT32 g_zCc_AtIndRspId = NULL; | |
SINT32 g_zCc_AtRspId = NULL; | |
static SINT32 g_zCc_getSlicEv_threadId = -1; | |
int zCc_sleep(long ms) | |
{ | |
struct timeval tv; | |
tv.tv_sec = 0; | |
tv.tv_usec = ms * 1000; | |
return select(0, NULL, NULL, NULL, &tv); | |
} | |
VOID zCc_SlicMsgProc(MSG_BUF *ptMsgBuf) | |
{ | |
assert(ptMsgBuf != NULL); | |
//g_Cc_CallDetail.curEvt = ptMsgBuf->usMsgCmd; | |
if (ptMsgBuf->usMsgCmd == ZCC_DTMF_E && g_Cc_CallDetail.dCount < ZDIAL_NUM_MAX) | |
{ | |
g_Cc_CallDetail.digits[g_Cc_CallDetail.dCount++] = ptMsgBuf->aucDataBuf[0]; | |
ccapp_log("zCc_SlicMsgProc digit[%d]=%s", g_Cc_CallDetail.dCount, g_Cc_CallDetail.digits); | |
printf("[ccapp_debug]:collect number digit[%d]=%s\n",g_Cc_CallDetail.dCount,g_Cc_CallDetail.digits); | |
} | |
} | |
VOID zCc_SendMsgToSub(MSG_BUF *pMsg) | |
{ | |
MSG_BUF *ptMsgBuf = (MSG_BUF*)malloc(sizeof(MSG_BUF)); | |
SINT32 iMsgQueueId = ZAT_INVALID_ID; | |
if(ptMsgBuf == NULL) | |
return; | |
memcpy(ptMsgBuf, pMsg, sizeof(MSG_BUF)); | |
iMsgQueueId = msgget(MODULE_ID_CALL_CTRL_LOCAL, 0); | |
if (iMsgQueueId != ZAT_INVALID_ID) | |
{ | |
ptMsgBuf->lMsgType = MSG_TYPE_DEFAULT; | |
ptMsgBuf->dst_id = MODULE_ID_CALL_CTRL_LOCAL; | |
if (msgsnd(iMsgQueueId, ptMsgBuf, sizeof(MSG_BUF) - sizeof(LONG), 0) < 0) | |
{ | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SendMsgToSub fail!!!\n",__FUNCTION__); | |
} | |
else | |
{ | |
//zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCc_SendMsgToSub ptMsgBuf->usMsgCmd = %d, errno = %d <---\n",__FUNCTION__,ptMsgBuf->usMsgCmd,errno); | |
} | |
} | |
free(ptMsgBuf); | |
} | |
void* zCcApp_AtIndReader(void * ptr) | |
{ | |
int ret = -1; | |
int ReadLen = -1; | |
MSG_BUF QueueMsg = {0}; | |
while(1) | |
{ | |
ReadLen = msgrcv(g_zCc_AtRspId,&QueueMsg, sizeof(MSG_BUF)-sizeof(LONG), 0, 0); | |
if (ReadLen > 0) | |
{ | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s msgrcv QueueMsg.aucDataBuf = %d \n",__FUNCTION__,QueueMsg.usMsgCmd); | |
ret = zCcApp_AtIndRspProc(&QueueMsg); | |
} | |
else | |
{ | |
continue; | |
} | |
} | |
} | |
VOID zCc_AtRecvMsgProc(MSG_BUF *ptMsgBuf) | |
{ | |
assert(ptMsgBuf != NULL); | |
ULONG cmdId = ptMsgBuf->usMsgCmd; | |
SINT32 i ; | |
SINT32 ret = -1; | |
for(i=0;i< gCcAppRecvAtIndCnt;i++) | |
{ | |
if(cmdId == gCcAppAtIndProc[i].cmdId) | |
{ | |
if(NULL!= gCcAppAtIndProc[i].AtIndProcFun) | |
{ | |
ret = gCcAppAtIndProc[i].AtIndProcFun(ptMsgBuf); | |
} | |
break; | |
} | |
} | |
} | |
static VOID zCc_SetRj11LedStatus(char* LedStatus) | |
{ | |
int ret = 0; | |
sc_cfg_set("cc_rj11_status", LedStatus); | |
ret = ipc_send_message(MODULE_ID_CALL_CTRL, MODULE_ID_MMI, MSG_CMD_RJ11_STATUS_INFO, 0, NULL, 0); | |
if (ret != 0) { | |
printf("zCc_SetRj11LedStatus %s failed\n", LedStatus); | |
} else { | |
printf("zCc_SetRj11LedStatus %s success\n", LedStatus); | |
} | |
} | |
VOID* zCcApp_getSlicEv_entry(VOID *pBUf) | |
{ | |
MSG_BUF msgBuf = {0}; | |
unsigned char bEvent = EV_UNKONWN; | |
DWORD dtmf1 = 0; | |
char dtmf; | |
while (1) | |
{ | |
if (SLIC_SUCCESS == SLIC_MsgRev(&bEvent, &dtmf1)) | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s zCcApp_getSlicEv_entry recv msg %d\n",__FUNCTION__,bEvent); | |
printf("[ccapp_debug]: get slic event, bEvent = %d, dtmf1=%d\n",bEvent, dtmf1); | |
switch (bEvent) | |
{ | |
case EV_FXS_HOOKON: | |
msgBuf.usMsgCmd = ZCC_RELEASE_E; | |
msgBuf.src_id = MODULE_ID_SLIC; | |
zCc_SendMsgToSub(&msgBuf); /* ·¢¹Ò»ú ʼþ¸øÖ÷Ïß³Ì */ | |
break; | |
case EV_FXS_HOOKOFF: | |
msgBuf.usMsgCmd = ZCC_SEIZE_E; | |
msgBuf.src_id = MODULE_ID_SLIC; | |
zCc_SendMsgToSub(&msgBuf); /* ·¢Õª»úʼþ¸øÖ÷Ïß³Ì */ | |
break; | |
case EV_FXS_COLLECT_DIG:// '0'-'9', '*', '#' | |
dtmf = dtmf1; | |
msgBuf.usMsgCmd = ZCC_DTMF_E; | |
msgBuf.src_id = MODULE_ID_SLIC; | |
msgBuf.aucDataBuf[0] = (UINT8)(dtmf); | |
msgBuf.usDataLen = 1; | |
zCc_SendMsgToSub(&msgBuf); /* ·¢DTMF ʼþ¸øÖ÷Ïß³Ì */ | |
break; | |
case EV_FXS_FLASH: | |
msgBuf.usMsgCmd = ZCC_FLASH_E; | |
msgBuf.src_id = MODULE_ID_SLIC; | |
zCc_SendMsgToSub(&msgBuf); /* ·¢FLASH ʼþ¸øÖ÷Ïß³Ì */ | |
break; | |
case EV_LT_RINGER_REN: | |
if (dtmf1 == 1) { | |
zCc_SetRj11LedStatus("ledon"); | |
} else { | |
zCc_SetRj11LedStatus("ledoff"); | |
} | |
break; | |
default:/* ÆäËûʼþ¶ªÆú²»´¦Àí*/ | |
break; | |
} | |
//zCc_sleep(10); | |
} | |
} | |
#define MAX_DIGIT_MAP_NUM 20 | |
#define MAX_DIGIT_MAP_WHOLE_LEN 256 | |
#define MAX_PHONE_NUM_SIZE 32 | |
char tz_digitmap[MAX_DIGIT_MAP_NUM][MAX_PHONE_NUM_SIZE+1];//phone list | |
int frist_get_map = 0; | |
//(2xxxxxx|3xxxxxx|4xxxxxx|5xxxxxx|7xxxxxx|0[1-9][0-9]xxxxxxx|00xxxxxxxxxxxxxx|6xxx|8xxx|1xxx|*xx|#xx) | |
void get_digit_map_list() | |
{ | |
int i = 0; | |
int j = 0; | |
char buff[256] = {0}; | |
char *str = NULL; | |
//sc_cfg_set("digitmap_str", "(2xxxxxx|3xxxxxx|4xxxxxx|5xxxxxx|7xxxxxx|0[1-9][0-9]xxxxxxx|00xxxxxxxxxxxxxx|6xxx|8xxx|1xxx|*xx|#xx)"); | |
//sc_cfg_save(); | |
sc_cfg_get("digitmap_str",buff,sizeof(buff)); | |
if (strlen(buff) == 0) | |
return; | |
str = buff; | |
if(*str == '(') | |
str++; | |
while(*str != 0) | |
{ | |
if(*str == '|') | |
{ | |
tz_digitmap[i][j] = 0; | |
i++; | |
j = 0; | |
} | |
else if(*str == ')') | |
{ | |
break; | |
} | |
else | |
{ | |
tz_digitmap[i][j] = *str; | |
j++; | |
} | |
str++; | |
} | |
} | |
int digit_map_call(char *num) | |
{ | |
int i = 0; | |
int j = 0; | |
int n = 0; | |
char flag = 0; | |
char switch_str[4] = {0}; | |
static char buff[32+1] = {0}; | |
sc_cfg_get("digitmap_switch",switch_str,sizeof(switch_str)); | |
if(strcmp(switch_str, "0") == 0) | |
{ | |
return 0; | |
} | |
if(0 == frist_get_map) | |
{ | |
get_digit_map_list(); | |
frist_get_map = 1; | |
} | |
strncpy(buff, num,sizeof(buff)-1); | |
//printf("buff:%s\n", buff); | |
for(i = 0; i < MAX_DIGIT_MAP_NUM; i++) | |
{ | |
if(strlen(tz_digitmap[i]) != 0) | |
{ | |
while(((j+n) <= MAX_PHONE_NUM_SIZE) && (tz_digitmap[i][j] != 0) && (buff[j] != 0)) | |
{ | |
if(tz_digitmap[i][j+n] == '[' ) | |
{ | |
n++; | |
while(((j+n) <= MAX_PHONE_NUM_SIZE) && tz_digitmap[i][j+n] != ']') | |
{ | |
if(((j+n+2) <= MAX_PHONE_NUM_SIZE) && tz_digitmap[i][j+n+1] == '-') | |
{ | |
if(tz_digitmap[i][j+n] <= buff[j] && buff[j] <= tz_digitmap[i][j+n+2]) | |
{ | |
//printf("digit_map:%c, %c, %c\n", tz_digitmap[i][j+n], tz_digitmap[i][j+n+2], buff[j]); | |
flag = 1; | |
} | |
n+=3; | |
} | |
else | |
{ | |
if(tz_digitmap[i][j+n] == buff[j]) | |
{ | |
flag = 1; | |
} | |
n++; | |
} | |
} | |
if(flag == 0) | |
{ | |
break; | |
} | |
flag = 0; | |
} | |
else | |
{ | |
if(tz_digitmap[i][j+n] != buff[j]) | |
{ | |
if(!(tz_digitmap[i][j+n] == 'X' || tz_digitmap[i][j+n] == 'x')) | |
break; | |
} | |
} | |
j++; | |
if(((j+n) <= MAX_PHONE_NUM_SIZE) && (tz_digitmap[i][j+n] == 0) && (buff[j] == 0)) | |
{ | |
//ccapp_log("digit_map_call do Match: %d, %s, %s\n", i, tz_digitmap[i], buff); | |
return 1; | |
} | |
} | |
} | |
n = 0; | |
j = 0; | |
} | |
return 0; | |
} | |
#ifdef TEST_CCAPP | |
VOID* zCc_main(VOID * pbuf) | |
{ | |
MSG_BUF QueueMsg = {0}; | |
int MainQeueId = -1; | |
int ret = -1; | |
UINT8 bMsgType =1; | |
int fd = -1; | |
pthread_attr_t AtIndReaderAttr; | |
pthread_t AtIndReaderThreadId; | |
pthread_attr_init(&AtIndReaderAttr); | |
pthread_attr_setstacksize(&AtIndReaderAttr,4*1024); | |
fd = zCcApp_GetAtIndFd(); | |
AtIndReaderThreadId = pthread_create(&AtIndReaderThreadId, NULL, zCcApp_AtIndReader, (void*)&fd); | |
if(AtIndReaderThreadId < 0) | |
{ | |
return NULL; | |
} | |
while (1) | |
{ | |
ret = msgrcv(MainQeueId, &QueueMsg, sizeof(MSG_BUF), bMsgType, 0); | |
if(ret == -1) | |
{ | |
return NULL; | |
} | |
else | |
{ | |
switch (QueueMsg.src_id) | |
{ | |
case MODULE_ID_CALL_CTRL: // AT Ind msg | |
zCc_AtRecvMsgProc(&QueueMsg); | |
break; | |
case MODULE_ID_SLIC: // message from slic | |
default: | |
zCc_SlicMsgProc(&QueueMsg); | |
break; | |
} | |
zCc_RunMaster(&QueueMsg); | |
} | |
} | |
} | |
#endif | |
#ifndef TEST_CCAPP | |
static int polarity_reversal_flag = 0; | |
int get_polarity_reversal_flag(void) | |
{ | |
return polarity_reversal_flag; | |
} | |
void check_polarity_reversal_cfg(void) | |
{ | |
int rt; | |
char buf[32]; | |
memset(buf, 0, sizeof(buf)); | |
rt = sc_cfg_get("polarity_reversal",buf,sizeof(buf)); | |
if (rt != 0 || strlen(buf) == 0) | |
{ | |
sc_cfg_set("polarity_reversal", "0"); | |
sc_cfg_save(); | |
polarity_reversal_flag = 0; | |
return ; | |
} | |
polarity_reversal_flag = atoi(buf); | |
} | |
void check_wb_mode_cfg(void) | |
{ | |
int rt; | |
int val; | |
char buf[64]; | |
memset(buf, 0, sizeof(buf)); | |
rt = sc_cfg_get("wb_mode",buf,sizeof(buf)); | |
if (rt != 0 || strlen(buf) == 0) | |
{ | |
sc_cfg_set("wb_mode", "1"); | |
sc_cfg_save(); | |
val = 1; | |
} | |
else | |
val = atoi(buf); | |
sprintf(buf, "at_cmd AT+ZIMSAMRW=%d", (val==0)?0:1); | |
soft_system(buf); | |
sprintf(buf, "echo \"at_cmd AT+ZIMSAMRW=%d\" > /tmp/log.ZIMSAMRW", (val==0)?0:1); | |
soft_system(buf); | |
} | |
int main(VOID) | |
{ | |
MSG_BUF QueueMsg = {0}; | |
int ret = -1; | |
pthread_t CcAppMainThreadId; | |
pthread_attr_t AtIndReaderAttr; | |
pthread_t AtIndReaderThreadId; | |
SLIC_Initial(); | |
SLIC_Dev_Init(); | |
soft_system("at_cmd AT+ZIMSTEST=\"EMCALL_TO_NORMAL\",1 "); | |
check_wb_mode_cfg(); | |
check_polarity_reversal_cfg(); | |
g_zCc_MsqId = msgget(MODULE_ID_CALL_CTRL_LOCAL, IPC_CREAT | 0600); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s g_zCc_MsqId %d, errno:%d\n",__FUNCTION__,g_zCc_MsqId,errno); | |
if (g_zCc_MsqId == ZAT_INVALID_ID) | |
{ | |
return 0; | |
} | |
g_zCc_AtRspId = msgget(MODULE_ID_CALL_CTRL, IPC_CREAT | 0600); | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s g_zCc_AtRspId %d, errno:%d\n",__FUNCTION__,g_zCc_AtRspId,errno); | |
if (g_zCc_AtRspId == ZAT_INVALID_ID) | |
{ | |
return 0; | |
} | |
g_zCc_getSlicEv_threadId = pthread_create(&CcAppMainThreadId, NULL, zCcApp_getSlicEv_entry,0); | |
if(g_zCc_getSlicEv_threadId!=0) | |
{ | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s pthread_create zCc_getSlicEv error, errno = %d \n",__FUNCTION__,errno); | |
return -1; | |
} | |
else | |
{ | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s pthread_create zCc_getSlicEv succ\n",__FUNCTION__); | |
} | |
pthread_attr_init(&AtIndReaderAttr); | |
pthread_attr_setstacksize(&AtIndReaderAttr,4*1024); | |
ret = pthread_create(&AtIndReaderThreadId, NULL, zCcApp_AtIndReader, 0); | |
pthread_attr_destroy(&AtIndReaderAttr); //kw 2 | |
if(ret != 0) //cov m | |
{ | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s pthread_create zCcApp_AtIndReader error, errno = %d \n",__FUNCTION__,errno); | |
return -1; | |
} | |
else | |
{ | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s pthread_create zCcApp_AtIndReader succ\n",__FUNCTION__); | |
} | |
zCc_SendAtImsPlusReq(1,1);//ÉèÖÃimsplusÉϱ¨ | |
while (1) | |
{ | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","BACK TO main\n"); | |
ret = msgrcv(g_zCc_MsqId, &QueueMsg, sizeof(MSG_BUF)-sizeof(LONG), 0, 0); | |
if(ret==-1) | |
{ | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","%s msgrcv return ret= %d errno=%d\n",__FUNCTION__,ret, errno); | |
continue; | |
} | |
else | |
{ | |
switch (QueueMsg.src_id) | |
{ | |
case MODULE_ID_SLIC: // message from slic | |
zCc_SlicMsgProc(&QueueMsg); | |
break; | |
default: // AT Ind msg | |
zte_log_append(__FILE__, __LINE__, "zte_ccapp.log","recv msg %d from at_ctl\n",QueueMsg.usMsgCmd); | |
if (QueueMsg.usMsgCmd==MSG_CMD_ZIMSPLUS_IND | |
||QueueMsg.usMsgCmd==MSG_CMD_DSCI_IND | |
||QueueMsg.usMsgCmd==MSG_CMD_ZCPI | |
||QueueMsg.usMsgCmd==MSG_CMD_ZVOICECHNL) | |
{ | |
zCc_CheckSlaveState("in zCc_AtRecvMsgProc"); | |
zCc_AtRecvMsgProc(&QueueMsg); | |
} | |
break; | |
} | |
if (QueueMsg.usMsgCmd==MSG_CMD_VTS_RSP) | |
{ | |
zCcApp_Vts_Rsp(); | |
} | |
zCc_RunMaster(&QueueMsg); | |
} | |
} | |
return 0; | |
} | |
#endif | |