⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfw_cm.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
| 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 + -