📄 mfw_cm.c
字号:
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;
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 */
TRACE_FUNCTION ("cm_ok_disconnect()");
/* 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;
cmd_hold = 0;
/* 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;
cm_signal(E_CM_DISCONNECT, &dis_connect);
}
/* Marcus: CCBS: 14/11/2002: Start */
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_error_disconnect |
+--------------------------------------------------------------------+
PURPOSE : indicates failed disconnection
*/
void cm_error_disconnect(void)
{
TRACE_FUNCTION ("cm_error_disconnect()");
/* Marcus: CCBS: 14/11/2002: Start */
if (cmd_hold == MFW_CM_CCBS_REGISTER)
{
TRACE_EVENT("cmd_hold == MFW_CM_CCBS_REGISTER");
/* Rejecting the offered CCBS registration */
cmd_hold = 0;
cm_ccbs_error();
}
}
/* Marcus: CCBS: 14/11/2002: End */
/*
+--------------------------------------------------------------------+
| PROJECT: MMI-Framework (8417) MODULE: MFW_CM |
| STATE : code ROUTINE: cm_command |
+--------------------------------------------------------------------+
PURPOSE :
*/
T_MFW cm_command(SHORT call_number, UBYTE command, UBYTE crss_string)
{
CHAR callId[5];
UBYTE res;
SHORT retVal;
TRACE_FUNCTION ("cm_command()");
// JP PATCH
cmd_hold = 0;
// END PATCH
cmd.call_number = call_number;
cmd.command = command;
switch (command)
{
case CM_HOLD:
case CM_SWAP:
case CM_RETRIEVE:
case CM_SWAP_MULTIPARTY:
case CM_HOLD_MULTIPARTY:
case CM_RETRIEVE_MULTIPARTY:
/* place all active calls on held and accept held or waiting call */
if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActAndAcpt, 0) != AT_EXCT)
return FALSE;
break;
case CM_BUILD_MULTIPARTY:
if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_AddHld, 0)!= AT_EXCT)
return FALSE;
break;
case CM_SPLIT_MULTIPARTY:
if (call_number <= 0)
return FALSE;
sprintf(callId, "%d", call_number);
if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_HldActExc, callId)!= AT_EXCT)
return FALSE;
break;
case CM_ETC:
/* connects two calls and disconnects the subsrciber from both calls */
if (sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ect, 0) != AT_EXCT)
return FALSE;
break;
case CM_CALL_DEFLECTION:
break;
case CM_CCBS:
TRACE_EVENT("CM_CCBS");
sAT_PlusCHLD(CMD_SRC_LCL, CHLD_MOD_Ccbs, 0);
break;
case CM_MODIFY:
break;
case CM_DTMF_ACTIVE:
if (currCmd == AT_CMD_VTS)
{
sAT_Abort(CMD_SRC_LCL, AT_CMD_VTS);
currCmd = AT_CMD_NONE;
}
if (sAT_PlusVTS(CMD_SRC_LCL, (CHAR)crss_string, VTS_MOD_ManStart) != AT_EXCT)
return FALSE;
currCmd = AT_CMD_VTS;
break;
case CM_DTMF_INACTIVE:
if (cur
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -