📄 mfw_cm.c
字号:
| STATE : code ROUTINE : cm_error_connect |
+--------------------------------------------------------------------+
PURPOSE : The connection is not successful
*/
void cm_error_connect(SHORT call_number)
{
int i;
USHORT report; /* Marcus: Extended error reporting: 12/11/2002 */
USHORT extend_report; /* API - 1564 - 16-01-03 - add this variable to store the new error code */
TRACE_FUNCTION ("cm_error_connect()");
currAccepting = 0; /* ES!! 210999 */
currConnecting = 0; /* ES!! 290999 */
currTryAccept =0; //glowing,2004-06-12,import from M188
/* send event */
dis_connect.call_number = call_number;
qAT_PlusCEER( CMD_SRC_LCL, &report);
/* Marcus: Extended error reporting: 12/11/2002: Start */
TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
/* API - 1564 - 16-01-03 - store the error value to the new variable & throughout this function replace 'report' with 'extend_report */
extend_report = GET_CAUSE_VALUE(report);
if (GET_CAUSE_DEFBY(extend_report) == DEFBY_CONDAT)
{
/* Treat Condat defined cause values as if no cause given */
dis_connect.cause = NOT_PRESENT_8BIT;
}
else
{
/* Standards defined cause value is given */
dis_connect.cause = GET_CAUSE_VALUE(extend_report);
}
TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
/* Marcus: Extended error reporting: 12/11/2002: End */
cm_signal(E_CM_DISCONNECT, &dis_connect);
TRACE_EVENT("passed the E_CM_DISCONNECT point");
if ((call_stat EQ OUTGOING_CALL)
AND (call_type NEQ MFW_ECC_CALL)
AND ((redial_stat EQ CM_REDIAL_AUTO) OR (redial_stat EQ CM_REDIAL_MANU)))
{
/* If this call is 2nd outgoing call, redial is not started */
if (qAT_PercentCAL(CMD_SRC_LCL, call_tab) EQ AT_CMPL)
{
for (i=0; i<MAX_CALL_NR; i++)
{
if (call_tab[i].index == -1)
break;
if ((call_tab[i].status == CAL_STAT_NotPresent)
OR (call_tab[i].status == CAL_STAT_DeactiveReq))
continue;
if (call_tab[i].calType == CAL_TYPE_MOC)
{
call_stat = MFW_CALL_FREE;
call_type = MFW_CALL_FREE;
cmd_hold = MFW_CM_NO_FLAG;
return;
}
}
}
/* check blacklist whether it is full */
if (black_list.count == MAX_BLACKLIST_NUM)
{
TRACE_EVENT ("blacklist is now full");
/* Blacklist is now full and
MT shall prohibit further automatic call attempts
*/
redial_stat = CM_REDIAL_OFF;
/* allow a new outgoing */
call_stat = MFW_CALL_FREE;
call_type = MFW_CALL_FREE;
cc_stat.type = MFW_CALL_FREE;
rdl.redial_mode = CM_REDIAL_BLACKLIST;
cm_signal(E_CM_REDIAL, &rdl);
return;
}
/* check the registration staus */
if (nm_reg_status() == MFW_NO_SERVICE)
{
call_stat = MFW_CALL_FREE;
call_type = MFW_CALL_FREE;
cc_stat.type = MFW_CALL_FREE;
rdl.redial_mode = CM_REDIAL_NO_SERVICE;
cm_signal(E_CM_REDIAL, &rdl);
return;
}
TRACE_EVENT_P1("report = %d", extend_report);
switch (extend_report)
{
case 28:
// API - 1480 - Added this code to stop redial on an incorrect number
if(!redial_count)
{
call_stat = MFW_CALL_FREE;
call_type = MFW_CALL_FREE;
cc_stat.type = MFW_CALL_FREE;
rdl.redial_mode = CM_REDIAL_ABORTED;
cm_signal(E_CM_REDIAL, &rdl);
return;
}
case 1: /* check whether the reason is in category 3 (GSM 02.07) */
case 3:
case 22:
case 38:
TRACE_EVENT ("category 3");
if (!redial_count)
{
/* redial_count == 0;
this is for the first outgoing call and
now it is going to start the Auto-redial procedure
*/
cc_stat.type = REDIALING_CALL;
cc_stat.call_number = 0;
call_stat = REDIALING_CALL;
rdl.redial_mode = CM_REDIAL_STARTED;
strcpy((char *)rdl.number, (char *)cc_stat.number);
#ifdef NO_ASCIIZ
rdl.name.len = cc_stat.name.len;
memcpy(rdl.name.data,
cc_stat.name.data,
cc_stat.name.len);
#else
strcpy((char *)rdl.name, (char *)cc_stat.name);
// strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
rdl.ton = cc_stat.ton;
rdl.type = cc_stat.mode;
/* reasons in the category 3 have
a call repeat attempts of max. 1 !
*/
redial_count = MAX_REDIAL_ATTEMPT-1;
cm_signal(E_CM_REDIAL, &rdl);
return;
}
else
redial_count = MAX_REDIAL_ATTEMPT;
break;
case 17: /* check whether the reason is in category 1 and 2 (GSM 02.07) */
case 18:
case 19:
case 27:
case 34:
case 41:
case 42:
case 44:
case 47:
TRACE_EVENT ("category 1 & 2");
if (!redial_count)
{
/* redial_count == 0
this is for the first outgoing call and
now it is going to start the Auto-redial procedure
*/
cc_stat.type = REDIALING_CALL;
cc_stat.call_number = 0;
call_stat = REDIALING_CALL;
rdl.redial_mode = CM_REDIAL_STARTED;
strcpy((char *)rdl.number, (char *)cc_stat.number);
#ifdef NO_ASCIIZ
rdl.name.len = cc_stat.name.len;
memcpy(rdl.name.data,
cc_stat.name.data,
cc_stat.name.len);
#else
strcpy((char *)rdl.name, (char *)cc_stat.name);
// strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
rdl.ton = cc_stat.ton;
rdl.type = cc_stat.mode;
/* reasons in the category 1 and 2 have
a call repeat attempts of max. 10 !
*/
cm_signal(E_CM_REDIAL, &rdl);
return;
}
if (redial_count >= 1 AND redial_count <= 3)
{
timStart(redialTim24);
call_stat = REDIALING_CALL;
cc_stat.call_number = 0;
return;
}
if (redial_count >= 4 AND redial_count < MAX_REDIAL_ATTEMPT)
{
timStart(redialTim5);
call_stat = REDIALING_CALL;
cc_stat.call_number = 0;
return;
}
#ifdef CUSTOMER_6366
// JP PATCH The MMI needs to know if the 'error disconnect' has
// resulted in redial starting irrespective of whether this was a redial attempt or not
rdl.redial_mode = CM_REDIAL_STARTED;
cm_signal(E_CM_REDIAL, &rdl);
// END JP PATCH
#endif /* CUSTOMER_6366 */
break;
default:
if (redial_count)
{
rdl.redial_mode = CM_REDIAL_STOP;
strcpy((char *)rdl.number, (char *)cc_stat.number);
#ifdef NO_ASCIIZ
rdl.name.len = cc_stat.name.len;
memcpy(rdl.name.data,
cc_stat.name.data,
cc_stat.name.len);
#else
strcpy((char *)rdl.name, (char *)cc_stat.name);//???
// strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
rdl.ton = cc_stat.ton;
rdl.type = cc_stat.mode;
cm_signal(E_CM_REDIAL, &rdl);
}
/* allow a new outgoing */
call_stat = MFW_CALL_FREE;
call_type = MFW_CALL_FREE;
cc_stat.type = MFW_CALL_FREE;
return;
}
if (redial_count >= MAX_REDIAL_ATTEMPT
AND black_list.count < MAX_BLACKLIST_NUM)
{
strcpy((char *)black_list.number[black_list.count],
(char *)cc_stat.number);
black_list.count++;
rdl.redial_mode = CM_REDIAL_BLACKLISTED;
strcpy((char *)rdl.number, (char *)cc_stat.number);
#ifdef NO_ASCIIZ
rdl.name.len = cc_stat.name.len;
memcpy(rdl.name.data,
cc_stat.name.data,
cc_stat.name.len);
#else
strcpy((char *)rdl.name, (char *)cc_stat.name);
// strcpy((char *)rdl.subaddr, (char *)cc_stat.subaddr);
#endif
rdl.ton = cc_stat.ton;
rdl.type = cc_stat.mode;
rdl.left_attempts = 0;
cc_stat.call_number = 0;
cm_signal(E_CM_REDIAL, &rdl);
}
}
/* allow a new outgoing */
call_stat = MFW_CALL_FREE;
call_type = MFW_CALL_FREE;
cc_stat.type = MFW_CALL_FREE;
}
/*
+-----------------------------------------------------------------------+
| PROJECT : MMI-Framework (8417) MODULE : MFW_CM |
| STATE : code ROUTINE : cm_rmt_error_connect |
+-----------------------------------------------------------------------+
PURPOSE : The connection is not successful
*/
void cm_rmt_error_connect(SHORT call_number)
{
USHORT report; /* Marcus: Extended error reporting: 12/11/2002 */
TRACE_FUNCTION ("cm_error_connect()");
/* send event */
dis_connect.call_number = call_number;
currTryAccept =0; //glowing,2004-06-12,import from M188
qAT_PlusCEER( CMD_SRC_LCL, &report);
/* Marcus: Extended error reporting: 12/11/2002: Start */
TRACE_EVENT_P1("qAT_PlusCEER(%04X)", report);
if (GET_CAUSE_DEFBY(report) == DEFBY_CONDAT)
{
/* Treat Condat defined cause values as if no cause given */
dis_connect.cause = NOT_PRESENT_8BIT;
}
else
{
/* Standards defined cause value is given */
dis_connect.cause = GET_CAUSE_VALUE(report);
}
TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
/* Marcus: Extended error reporting: 12/11/2002: End */
cm_signal(E_CM_DISCONNECT, &dis_connect);
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_disconnect |
+--------------------------------------------------------------------+
PURPOSE : Disconnection for outgoing call or active call
*/
T_MFW cm_disconnect(SHORT call_number)
{
CHAR callId[5];
T_MFW_CM_CALL_STAT stat;
UBYTE ton;
UBYTE mode;
TRACE_FUNCTION ("cm_disconnect()");
dis_connect.call_number = call_number;
if (!call_number)
{
cmd_hold = MFW_CM_MPTY_TERMINATED;
sprintf(callId, "%d", 0);
if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActSpec, callId) != AT_EXCT)
return CM_ERROR;
return CM_OK;
}
cm_search_callStat(call_number, &stat, &ton, &mode);
TRACE_EVENT_P3("Status %d Ton %d Mode %d",stat,ton,mode);
/* HANG UP DATA CALL (WAP)
* SPR#1983 - SH - Use sAT_Abort() when call has not yet connected,
* rather than sAT_H */
if (mode == DATA_CALL)
{
T_ACI_RETURN retval;
TRACE_EVENT_P1("***Disconnect data call, stat=%d", stat);
if ((stat == CALL_DIAL) OR (stat == CALL_ALERT))
{
if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
return CM_ERROR;
return CM_OK;
}
if (stat == CALL_DEACTIVE && currConnecting) /* ES/AK 290999 */
{
currConnecting = 0;
if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
return CM_ERROR;
return CM_OK;
}
retval = sAT_H(CMD_SRC_LCL);
TRACE_EVENT_P1("Result of sAT_H = %d", retval)
if (retval)
return CM_ERROR;
return CM_OK;
}
if ((stat == CALL_DIAL) OR (stat == CALL_ALERT))
{
if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
return CM_ERROR;
return CM_OK;
}
if (stat == CALL_DEACTIVE && currConnecting) /* ES/AK 290999 */
{
currConnecting = 0;
if (sAT_Abort(CMD_SRC_LCL, AT_CMD_D) NEQ AT_CMPL)
return CM_ERROR;
return CM_OK;
}
if ((stat == CALL_ACTIVE) OR (stat == CALL_HELD) OR (stat == CALL_DEACTIVE))
{
cmd_hold = MFW_CM_TERMINATED;
sprintf(callId, "%d", call_number);
if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_RelActSpec, callId) != AT_EXCT)
return CM_ERROR;
return CM_OK;
}
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_force_disconnect |
+--------------------------------------------------------------------+
PURPOSE : Disconnection of any call existent needed for Multiparty and some structured procedures
call termination in state U9
*/
void cm_force_disconnect(void)
{
T_ACI_RETURN res;
TRACE_FUNCTION("cm_force_disconnect()");
res = sAT_H(CMD_SRC_LCL);
if (res != AT_EXCT && res != AT_CMPL)
TRACE_ERROR("satReject() error");
return;
}
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_ok_disconnect |
+--------------------------------------------------------------------+
PURPOSE : indicates disconnection from called party;
sends E_CM_DISCONNECT to mmi
*/
void cm_ok_disconnect(T_ACI_CMD_SRC src, SHORT call_id)
{
USHORT cause; /* Marcus: Extended error reporting: 12/11/2002 */
T_MFW_CM_DISCONNECT_ALL disconnect_all;
TRACE_FUNCTION("cm_ok_disconnect()");
TRACE_EVENT_P4("dis_connect.call_number %d, cmd_hold %d, src %d, call_id %d",
dis_connect.call_number, cmd_hold, src, call_id);
currTryAccept =0; //glowing,2004-06-12,import from M188
/* Marcus: CCBS: 14/11/2002: Start */
if (cmd_hold == MFW_CM_CCBS_REGISTER)
{
/* Rejecting the offered CCBS registration */
TRACE_EVENT("cmd_hold == MFW_CM_CCBS_REGISTER");
cmd_hold = 0;
cm_ccbs_ok();
return;
}
/* Marcus: CCBS: 14/11/2002: End */
if (cmd_hold == MFW_CM_MPTY_TERMINATED)
dis_connect.call_number = 0;
else if (src EQ CMD_SRC_ATI_1) //NM Berlin/UK integration 21.09.01
dis_connect.call_number = call_id;
/* send event */
qAT_PlusCEER( CMD_SRC_LCL, &cause);
/* Marcus: Extended error reporting: 12/11/2002: Start */
TRACE_EVENT_P1("qAT_PlusCEER(%04X)", cause);
if (GET_CAUSE_DEFBY(cause) == DEFBY_CONDAT)
{
/* Treat Condat defined cause values as if no cause given */
dis_connect.cause = NOT_PRESENT_8BIT;
}
else
{
/* Standards defined cause value is given */
dis_connect.cause = GET_CAUSE_VALUE(cause);
}
TRACE_EVENT_P1("dis_connect.cause = %02X)", dis_connect.cause);
/* Marcus: Extended error reporting: 12/11/2002: End */
/* allow a new outgoing */
call_stat = MFW_CALL_FREE;
call_type = MFW_CALL_FREE;
/*
** Reset the entries in the DTMF buffer
*/
mfw_cbuf_reset(mfw_cm_dtmf_q_id); //glowing,2004-06-1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -