📄 mfw_cm.c
字号:
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) $Workfile:: mfw_cm.c $|
| $Author: jhxu $Revision: 1.2 $|
| CREATED: 3.11.98 $Modtime:: 10.04.00 14:58 $|
| STATE : code |
+--------------------------------------------------------------------+
MODULE : MFW_CM
PURPOSE : This modul contains call management functions.
*/
#define ENTITY_MFW
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#if defined (NEW_FRAME)
#include "typedefs.h"
#include "vsi.h"
#include "pei.h"
#include "custom.h"
#include "gsm.h"
#else
#include "stddefs.h"
#include "custom.h"
#include "gsm.h"
#include "vsi.h"
#endif
#include "mfw_mfw.h"
#include "mfw_phb.h"
#include "mfw_phbi.h"
#include "mfw_cm.h"
#include "mfw_cmi.h"
#include "mfw_nm.h"
#include "mfw_sim.h"
#include "mfw_sima.h"
#include "mfw_nmi.h"
#include "mfw_simi.h"
#include "mfw_win.h"
#include "mfw_tim.h"
#include "mfw_utils.h"
#include "ksd.h"
#include "psa.h"
#if defined (FAX_AND_DATA)
#include "aci_fd.h"
#endif
#include "cmh.h"
#include "phb.h"
#include "cmh_phb.h"
#include "mfw_ss.h"
#include "mfw_ssi.h"
#include "mfw_win.h"
#include "mfw_ffs.h"
#include "pcm.h"
/*
* Conditional compilation flag for CCBS testing.
* When defined, the cm_ccbs_... functions do not call ACI functions but
* simply set the return value variable to indicate success. Also the body
* of the rAT_PercentMMITEST function is defined for parsing AT%MMITEST
* commands and calling ACI/MFW functions as if CCBS events had occured.
*/
// #define CCBS_TEST
/********* current define *******************************************/
static T_MFW_CM_BLACKLIST_LIST black_list;
static T_ACI_CAL_ENTR call_tab[MAX_CALL_NR];
/* glowing,2004-06-0-10,remove ph_list, it will define in mfw_phb.c in TCS2112 */
//static T_ACI_PB_ENTR pb_list[PHB_MAX_ENTRY_NUM];
static T_MFW_PHB_LIST entries;
static T_MFW_CM_CC_STAT cc_stat; /* current outgoing call status */
static T_MFW_CM_COMMAND cmd;
static T_MFW_CM_NOTIFY notify;
static UBYTE call_type; /* indicate an ECC call or normal call */
static UBYTE call_stat; /* indicate an MO call or MT call */
static SHORT cc_id; /* current call index */
static UBYTE redial_stat;
static UBYTE redial_count;
static UBYTE cmd_hold;
static T_MFW_CM_CW_INFO in_call;
static T_MFW_CM_MO_INFO out_call;
static T_MFW_CM_DISCONNECT dis_connect;
static T_MFW_CM_REDIAL rdl;
static T_MFW_CM_CPI cm_cpi;
/* glowing,2004-06-10, import from TCS2112 */
/* Marcus: CCBS: 14/11/2002: Start */
static T_MFW_CM_CCBS_INFO ccbs_info; // E_CM_CCBS data
static T_MFW_CM_CCBS_OP ccbs_op = CM_CCBS_NONE; // Current CCBS operation
/* Marcus: CCBS: 14/11/2002: End */
/* glowing,2004-06-10, end of import */
static T_CM_CLI cli_prefix;
/*CONQUEST 5998-MC 30/04/02 -initialised timers to zero (prevents corruption) */
static MfwHnd redialTim1= NULL; /* the 1th redialing */
static MfwHnd redialTim24 = NULL; /* the 2th to 4st redialing */
static MfwHnd redialTim5 = NULL; /* the 5th or over redialing */
static int cmCommand (U32 cmd, void *h); /* handle window commands */
static int cm_redial_timeout(MfwEvt e, MfwTim *t);
static char currAccepting = 0; /* ES!! 210999 */
static char currConnecting = 0; /* ES!! 290999 */
static T_ACI_AT_CMD currCmd;
char currTryAccept; //glowing,2004-06-12, import from M188
#define MAX_DTMF_Q_ENTRIES 50
static UBYTE dtmf_q[MAX_DTMF_Q_ENTRIES];
static SHORT mfw_cm_dtmf_q_id;
EXTERN MfwHdr * current_mfw_elem;
LOCAL T_MFW_CM_CALL_STAT cm_cvt_call_status( T_ACI_CAL_STAT stat );
void ReleaseAllConnection( void )
{
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_init |
+--------------------------------------------------------------------+
PURPOSE : initialize for call management
*/
void cm_init(void)
{
TRACE_FUNCTION ("cm_init()");
memset(&black_list, 0, sizeof(T_MFW_CM_BLACKLIST_LIST));
currAccepting = 0; /* ES!! 210999 */
currConnecting = 0; /* ES!! 290999 */
currTryAccept =0; //glowing,2004-06-12,import from M188
call_type = MFW_CALL_FREE;
call_stat = MFW_CALL_FREE;
cc_stat.type = MFW_CALL_FREE;
cc_id = 0;
cmd_hold = 0;
currCmd = AT_CMD_NONE;
// get prefix from EEPROM
cli_prefix = 0;
/* create time event for redialing */
redialTim1 = timCreate (0, MIN_DURATION_1, (MfwCb)cm_redial_timeout);
redialTim24 = timCreate (0, MIN_DURATION_2_4, (MfwCb)cm_redial_timeout);
redialTim5 = timCreate (0, MIN_DURATION_5, (MfwCb)cm_redial_timeout);
redial_stat = (UBYTE)FFS_flashData.redial_mode;
mfwCommand[MfwTypCm] = (MfwCb) cmCommand;
/*
** Create a static circular buffer to hold the dtmf tones
*/
mfw_cm_dtmf_q_id = mfw_cbuf_create( MAX_DTMF_Q_ENTRIES,
sizeof(UBYTE),
0,
0xFF,
TRUE,
(void *)&dtmf_q[0]);
if (mfw_cm_dtmf_q_id < 0)
TRACE_EVENT_P1("ERROR : mfw_cbuf_create failed with error value %d", mfw_cm_dtmf_q_id);
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_exit |
+--------------------------------------------------------------------+
PURPOSE :
*/
void cm_exit(void)
{
TRACE_FUNCTION ("cm_exit()");
/* delete time event for redialing */
timDelete (redialTim5);
timDelete (redialTim24);
timDelete (redialTim1);
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_create |
+--------------------------------------------------------------------+
PURPOSE : create event for call management
*/
T_MFW_HND cm_create(T_MFW_HND hWin, T_MFW_EVENT event, T_MFW_CB cbfunc)
{
T_MFW_HDR *hdr;
T_MFW_CM *cm_para;
TRACE_FUNCTION ("cm_create()");
hdr = (T_MFW_HDR *) mfwAlloc(sizeof (T_MFW_HDR));
cm_para = (T_MFW_CM *) mfwAlloc(sizeof (T_MFW_CM));
if (!hdr OR !cm_para)
return FALSE;
/*
* initialisation of the handler
*/
cm_para->emask = event;
cm_para->handler = cbfunc;
hdr->data = cm_para; /* store parameter in node */
hdr->type = MFW_TYP_CM; /* store type of event handler */
/*
* installation of the handler
*/
return mfwInsert((T_MFW_HDR *)hWin, hdr);
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_delete |
+--------------------------------------------------------------------+
PURPOSE : delete a event for call management
*/
T_MFW_RES cm_delete(T_MFW_HND h)
{
TRACE_FUNCTION ("cm_delete()");
if (!h OR !((T_MFW_HDR *)h)->data)
return MFW_RES_ILL_HND;
if (!mfwRemove((T_MFW_HDR *)h))
return MFW_RES_ILL_HND;
mfwFree((U8 *)(((T_MFW_HDR *) h)->data),sizeof(T_MFW_CM));
mfwFree((U8 *)h,sizeof(T_MFW_HDR));
return MFW_RES_OK;
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_signal |
+--------------------------------------------------------------------+
PURPOSE : send a event signal.
*/
void cm_signal(T_MFW_EVENT event, void * para)
{
UBYTE temp;
// temp = dspl_Enable(0);
if (mfwSignallingMethod EQ 0)
{
/*
* focus is on a window
*/
if (mfwFocus)
/*
* send event to sim management
* handler if available
*/
if (cm_sign_exec (mfwFocus, event, para))
{
// dspl_Enable(temp);
return;
}
/*
* acutal focussed window is not available
* or has no network management registration
* handler, then search all nodes from the root.
*/
if (mfwRoot)
cm_sign_exec (mfwRoot, event, para);
}
else
{
MfwHdr * h = 0;
/*
* Focus set, then start here
*/
if (mfwFocus)
h = mfwFocus;
/*
* Focus not set, then start root
*/
if (!h)
h = mfwRoot;
/*
* No elements available, return
*/
while (h)
{
/*
* Signal consumed, then return
*/
if (cm_sign_exec (h, event, para))
{
// dspl_Enable(temp);
return;
}
/*
* All windows tried inclusive root
*/
if (h == mfwRoot)
{
// dspl_Enable(temp);
return;
}
/*
* get parent window
*/
h = mfwParent(mfwParent(h));
if(h)
h = ((MfwWin * )(h->data))->elems;
}
if( FALSE == cm_sign_exec (mfwRoot, event, para) )
ReleaseAllConnection();
}
// dspl_Enable(temp);
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_sign_exec |
+--------------------------------------------------------------------+
PURPOSE : Send a signal if CM management handler.
*/
BOOL cm_sign_exec (T_MFW_HDR * cur_elem, T_MFW_EVENT event, T_MFW_CM_PARA * para)
{
TRACE_FUNCTION ("cm_sign_exec()");
/* glowing,2004-06-10, replace the following by M188A */
//while (cur_elem)
while (cur_elem&&cur_elem->type!=MfwTypMax)
{
/*
* event handler is available
*/
if (cur_elem->type EQ MFW_TYP_CM)
{
T_MFW_CM * cm_data;
/*
* handler is CM management handler
*/
cm_data = (T_MFW_CM *)cur_elem->data;
if (cm_data->emask & event)
{
/*
* event is expected by the call back function
*/
cm_data->event = event;
switch (event)
{
case E_CM_COLP:
memcpy (&cm_data->para.mo_data, para, sizeof (T_MFW_CM_MO_INFO));
break;
case E_CM_DISCONNECT:
memcpy (&cm_data->para.disconnect, para, sizeof (T_MFW_CM_DISCONNECT));
break;
case E_CM_DISCONNECT_ALL:
memcpy (&cm_data->para.disconnect_all, para, sizeof (T_MFW_CM_DISCONNECT_ALL));
break;
case E_CM_CW:
memcpy (&cm_data->para.cw_info, para, sizeof (T_MFW_CM_CW_INFO));
break;
case E_CM_COMMAND:
memcpy (&cm_data->para.command, para, sizeof (T_MFW_CM_COMMAND));
break;
case E_CM_AOC:
memcpy (&cm_data->para.aoc_info, para, sizeof (T_MFW_CM_AOC_INFO));
break;
case E_CM_REDIAL:
memcpy (&cm_data->para.rdl, para, sizeof (T_MFW_CM_REDIAL));
break;
case E_CM_CONNECT_ACK:
memcpy (&cm_data->para.call_id, para, sizeof (SHORT));
break;
case E_CM_MO_RES:
memcpy (&cm_data->para.call_id, para, sizeof (SHORT));
break;
case E_CM_CPI:
memcpy (&cm_data->para.cm_cpi, para, sizeof (T_MFW_CM_CPI));
break;
case E_CM_RING_OFF:
break;
case E_CM_AOC_CNF:
memcpy (&cm_data->para.aoc_cnf, para, sizeof (T_MFW_CM_AOC_CNF));
break;
case E_CM_DTMF:
memcpy (&cm_data->para.dtmf_tone, para, sizeof (UBYTE));
break;
case E_CM_NOTIFY:
memcpy (&cm_data->para.notify, para, sizeof (T_MFW_CM_NOTIFY));
break;
/*MC SPR 1392*/
case E_CM_CALL_DEFLECT_STATUS:
memcpy (&cm_data->para.call_deflect_status, para, sizeof (BOOL));
break;
/* Marcus: CCBS: 14/11/2002: Start */
case E_CM_CCBS:
TRACE_EVENT("E_CM_CCBS");
memcpy (&cm_data->para.ccbs, para, sizeof (T_MFW_CM_CCBS_INFO));
break;
/* Marcus: CCBS: 14/11/2002: End */
case E_CM_CTYI:
memcpy (&cm_data->para.ctyi, para, sizeof (T_MFW_CM_CTYI));
break;
}
/*
* if call back defined, call it
*/
if (cm_data->handler)
{
// PATCH LE 06.06.00
// store current mfw elem
current_mfw_elem = cur_elem;
// END PATCH LE 06.06.00
if ((*(cm_data->handler)) (cm_data->event, (void *)&cm_data->para))
return TRUE;
}
}
}
cur_elem = cur_elem->next;
}
return FALSE;
}
/*
+--------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
| STATE : code ROUTINE : cm_callTyp_cvt |
+--------------------------------------------------------------------+
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -