| /************************************************************************** | |
| * | |
| * 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 | |