line source
/*
+-----------------------------------------------------------------------------
| Project : GSM-PS (6147)
| Modul : CMH_CCR
+-----------------------------------------------------------------------------
| Copyright 2002 Texas Instruments Berlin, AG
| All rights reserved.
|
| This file is confidential and a trade secret of Texas
| Instruments Berlin, AG
| The receipt of or possession of this file does not convey
| any rights to reproduce or disclose its contents or to
| manufacture, use, or sell anything it may describe, in
| whole, or in part, without the specific written consent of
| Texas Instruments Berlin, AG.
+-----------------------------------------------------------------------------
| Purpose : This module defines the functions which are responsible
| for the responses of the protocol stack adapter for
| call control.
+-----------------------------------------------------------------------------
*/
#ifndef CMH_CCR_C
#define CMH_CCR_C
#endif
/*==== INCLUDES ===================================================*/
#include "aci_all.h"
#include "aci_cmh.h"
#include "ati_cmd.h"
#include "aci_cmd.h"
#include "aci_mem.h"
#include "phb.h"
#include "l4_tim.h"
#include "aci_lst.h"
#ifdef FAX_AND_DATA
#include "aci_fd.h"
#endif /* of #ifdef FAX_AND_DATA */
#include "aci.h"
#include "psa.h"
#include "ksd.h"
#include "psa_cc.h"
#include "psa_ss.h"
#include "psa_util.h"
#include "cmh.h"
#include "cmh_cc.h"
#include "cmh_ss.h"
#ifdef FF_ATI
#include "aci_io.h"
#endif /* of #ifdef FF_ATI */
#ifdef UART
#include "dti.h" /* functionality of the dti library */
#include "dti_conn_mng.h"
#include "dti_cntrl_mng.h"
#endif
#ifdef FAX_AND_DATA
#include "psa_ra.h"
#include "cmh_ra.h"
#include "psa_l2r.h"
#include "cmh_l2r.h"
#include "psa_tra.h"
#ifdef FF_FAX
#include "psa_t30.h"
#include "cmh_t30.h"
#endif /* FF_FAX */
#endif /* FAX_AND_DATA */
#ifdef SIM_TOOLKIT
#include "psa_sat.h"
#include "cmh_sat.h"
#include "psa_sim.h"
#endif /* of #ifdef SIM_TOOLKIT */
#include "aoc.h"
#include "audio.h"
#if defined (FF_WAP) || defined (FF_TCP_IP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E)
#include "wap_aci.h"
#include "psa_ppp_w.h"
#include "cmh_ppp.h"
#endif /* of FF_WAP or FF_TCP_IP || FF_GPF_TCPIP FF_SAT_E */
#if defined (CO_UDP_IP) || defined (FF_GPF_TCPIP)
#include "psa_tcpip.h"
#include "cmh_ipa.h"
#endif /* CO_UDP_IP || FF_GPF_TCPIP */
#ifdef FF_GPF_TCPIP
#include "dcm_utils.h"
#include "dcm_state.h"
#include "dcm_env.h"
#endif
#include "dcm_f.h"
#ifdef UART
#include "psa_uart.h"
#include "cmh_uart.h"
#endif /*UART*/
#ifdef FF_PSI
#include "psa_psi.h"
#include "cmh_psi.h"
#endif /*FF_PSI*/
#include "cmh_phb.h"
#include "psa_sim.h"
#include "cmh_sim.h"
/*==== CONSTANTS ==================================================*/
/*==== TYPES ======================================================*/
/*==== EXPORT =====================================================*/
/*==== VARIABLES ==================================================*/
#if defined (FF_WAP) || defined (FF_TCP_IP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E)
ULONG ipAddress;
GLOBAL SHORT cmhCC_PPP_Established (ULONG ip_address,USHORT max_receive_unit,
ULONG dns1, ULONG dns2);
GLOBAL SHORT cmhCC_PPP_Terminated (void);
#endif
#ifdef CO_UDP_IP
GLOBAL SHORT cmhCC_IPA_Configurated (void);
GLOBAL SHORT cmhCC_UDPA_Configurated (void);
GLOBAL SHORT cmhCC_UDPA_Deconfigurated (void);
#endif /* CO_UDP_IP */
/*==== FUNCTIONS ==================================================*/
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CallAlerted |
+-------------------------------------------------------------------+
PURPOSE : called party is alerted
*/
GLOBAL void cmhCC_CallAlerted ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
UBYTE idx;
TRACE_FUNCTION ("cmhCC_CallAlerted()");
/*
*-------------------------------------------------------------------
* process event
*-------------------------------------------------------------------
*/
if (ctb->prgDesc EQ PROG_NOT_PRES)
{
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CPI, idx )
( cId+1,
CPI_MSG_Alert,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->curCs);
}
}
return;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CallProceeding |
+-------------------------------------------------------------------+
PURPOSE : call proceed indication
*/
GLOBAL void cmhCC_CallProceeding ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_ACI_CPI_MSG msgType;
SHORT idx;
TRACE_FUNCTION ("cmhCC_CallProceeding()");
/*
*-------------------------------------------------------------------
* process event
*-------------------------------------------------------------------
*/
switch( ccShrdPrm.msgType )
{
case( MT_SETUP ): msgType = CPI_MSG_Setup; break;
case( MT_DISC ):
switch (ctb->calStat)
{
case NO_VLD_CS:
case CS_ACT_REQ:
case CS_CPL_REQ:
case CS_DSC_REQ:
break;
default:
return;
}
msgType = CPI_MSG_Disc;
break;
case( MT_ALRT ): msgType = CPI_MSG_Alert; break;
case( MT_PROC ): msgType = CPI_MSG_Proc; break;
case( MT_PROGR ): msgType = CPI_MSG_Progr; break;
/* case( MT_CONN ): msgType = CPI_MSG_Conn; break; */
case( MT_CONN ): return; /* CPI is generated in cmhCC_CallConnected */
default: TRACE_EVENT("UNEXP MSG TYPE IN CC SHRD PARM");
return;
}
/* ctb->curCs = MNCC_CAUSE_NO_MS_CAUSE; */
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CPI, idx )
( cId+1,
msgType,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->curCs);
}
return;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CallConnected |
+-------------------------------------------------------------------+
PURPOSE : call is connected
*/
GLOBAL void cmhCC_CallConnected ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
CHAR numBuf[MAX_CC_CALLING_NUMBER+1]; /* buffers calling number + '\0' */
CHAR subBuf[SUB_LENGTH+1]; /* buffers subaddress 'subaddress\0' */
T_ACI_TOA toaBuf; /* buffers type of address */
T_ACI_TOS tosBuf; /* buffers type of subaddress */
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
SHORT idx;
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
TRACE_FUNCTION ("cmhCC_CallConnected()");
/* check for command context */
switch(ctb->curCmd)
{
case(AT_CMD_D):
case(AT_CMD_A):
case(AT_CMD_CHLD):
break;
default:
TRACE_EVENT_P1("cmhCC_CallConnected(): wrong command context %d", ctb->curCmd);
return;
}
/* call progress information */
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CPI, idx )
(cId+1,
CPI_MSG_Conn,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->curCs);
}
/* process event for D, A and +CHLD command */
pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
if (ctb->curCmd EQ AT_CMD_D)
{
/* Check if user allows Connected Line Presentation: FTA 31.1.3.1 */
switch (ctb->clgPty.present)
{
case (PRES_PRES_ALLOW): /* presentation allowed FTA 31.1.3.1 */
TRACE_EVENT ("cmhCC_CallConnected(): presentation allowed !");
break;
case (PRES_NOT_PRES):
TRACE_EVENT ("cmhCC_CallConnected(): presentation not present !");
break;
case (PRES_PRES_REST): /* presentation restricted FTA 31.1.4.2 procedure 1 */
TRACE_EVENT ("cmhCC_CallConnected(): presentation restricted !");
/*
* R_AT( RAT_COLR, ccShrdPrm.???.???.??? )
* ( COLR_STAT_??? );
*/
break;
case (PRES_NUMB_NOT_AVAIL): /* number not available due to interworking FTA 31.1.4.2 procedure 2 */
TRACE_EVENT ("cmhCC_CallConnected(): number not available due to interworking !");
/*
* R_AT( RAT_COLR, ccShrdPrm.???.???.??? )
* ( COLR_STAT_??? );
*/
break;
default:
TRACE_EVENT ("[ERR] cmhCC_CallConnected(): pCtbNtry->clgPty.present = UNKNOWN");
return;
}
if ((ctb->clgPty.present NEQ PRES_NOT_PRES) /* any .present indicator received from MSC? */
AND (ctb->clgPty.c_num EQ 0) ) /* but no number available? */
{
; /* do nothig */
}
else
{
/*
* This function call (rAT_PlusCOLP) informs MWF/BMI about
* presentation of the called number on display.
* If MFW did not receive this function call, then it should
* not display the number after querying the call state with
* qAT_PercentCAL() where it gets the typed in called number, unfortunately
*/
R_AT( RAT_COLP, ctb->curSrc )
( COLP_STAT_NotPresent,
psaCC_ctbClrAdr2Num( cId, numBuf, sizeof (numBuf) ),
cmhCC_ctbGetClrNumTyp( cId, &toaBuf ),
psaCC_ctbClrAdr2Sub( cId, subBuf ),
cmhCC_ctbGetClrSubTyp( cId, &tosBuf ),
psaCC_ctbGetAlpha( cId) );
}
}
/* reset CMOD to single mode */
ccShrdPrm.CMODmode = CMOD_MOD_Single;
switch(calltype)
{
/* Speech Call */
case( VOICE_CALL ):
cmdBuf = ctb->curCmd;
srcBuf = ctb->curSrc;
/* reset CMOD to single mode */
if( ctb->BC[1].bearer_serv NEQ BEARER_SERV_NOT_PRES )
{
ccShrdPrm.CMODmode = CMOD_MOD_Single;
}
/*
* check if connect is expected
*/
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if( pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */
{
#ifdef SIM_TOOLKIT
if( ctb->SATinv )
{
cmhSAT_CallCncted();
ctb->SATinv = FALSE; /* unsent */
}
#endif /* SIM_TOOLKIT */
if(!cmhCC_atdsendok(cId)) /* if OK hasn't been sent right after MNCC_SETUP_REQ, then send it now */
{
/* needed for RAT_OK in MFW... Temp until tasks are separated */
cmhCC_PrepareCmdEnd (cId, NULL, NULL);
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
}
/* log result */
cmh_logRslt ( srcBuf, RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
cmhCC_PrepareCmdEnd (cId, NULL, NULL);
break;
#if defined (FAX_AND_DATA) AND defined (DTI)
/* in case of a supported data call */
case(TRANS_CALL):
case(NON_TRANS_CALL):
case(FAX_CALL):
#ifdef FF_TCP_IP
/* PPP call initialisation (AAA - PPP - L2R) */
case(PPP_CALL):
#endif /* FF_TCP_IP */
/* wait for TCH if not assigned */
if( ccShrdPrm.TCHasg )
{
/* activate RA connection: in case of failure clear call ! */
ccShrdPrm.datStat = DS_ACT_REQ;
if (cmhRA_Activate( ctb->curSrc, ctb->curCmd, cId ) NEQ AT_EXCT)
{
TRACE_EVENT("RA ACTIVATION FAILURE -> DISC CALL");
ccShrdPrm.datStat = DS_IDL;
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (cId);
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
/* check impact for SAT commands */
cmhSAT_OpChnCSDDown( cId, TPL_NONE );
#endif /* SIM TOOLKIT AND FF_SAT_E */
}
}
break;
#if defined(CO_UDP_IP) OR defined(FF_GPF_TCPIP)
#ifdef CO_UDP_IP
case(UDPIP_CALL):
#endif
#ifdef FF_GPF_TCPIP
case(TCPIP_CALL):
#endif
/* wait for TCH if not assigned */
if( ccShrdPrm.TCHasg )
{
if (wap_state NEQ Wap_Not_Init) /* release call */
{
TRACE_EVENT("FATAL ERROR in cmhCC_CallConnected: WAP Call already in process");
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (cId);
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
cmhSAT_OpChnCSDDown( cId, UDP );
#endif /* SIM TOOLKIT AND FF_SAT_E */
break;
}
else
{
TRACE_EVENT("WAP call initialisation");
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
if( cmhSAT_OpChnChckCSD(UDP) )
{
psaTCPIP_Activate(ctb->curSrc, 0,
cId,
TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_UDP,
TCPIP_CONNECTION_TYPE_CSD_WAP,
cmhSAT_OpChnUDPActiveCsd) ;
}
else
#endif /* SIM TOOLKIT AND FF_SAT_E */
{
if(is_gpf_tcpip_call())
{
psaTCPIP_Activate(ctb->curSrc, 0 /* Change this! */,
cId,
TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_TCPIP,
TCPIP_CONNECTION_TYPE_CSD_WAP,
psaTCPIP_act_csd_callback) ;
}
else
{
psaTCPIP_Activate(ctb->curSrc, 0 /* Change this! */,
cId,
TCPIP_ACT_OPTION_V4 | TCPIP_ACT_OPTION_UDP,
TCPIP_CONNECTION_TYPE_CSD_WAP,
psaTCPIP_act_csd_callback) ;
}
}
}
}
break;
#endif /* defined(WAP) OR defined(FF_GPF_TCPIP) */
/* in case of an unsupported data call */
case(UNSUP_DATA_CALL):
TRACE_EVENT("UNSUPPORTED DATA CALL -> DISC CALL");
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (cId);
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
/* check impact for SAT commands */
cmhSAT_OpChnCSDDown( cId, TPL_NONE );
#endif /* SIM TOOLKIT AND SAT_SAT_E */
break;
#endif /* of #ifdef FAX_AND_DATA */
default:
TRACE_ERROR("Wrong call type");
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : process_CHLDaddInfo |
+-------------------------------------------------------------------+
PURPOSE : Local function: processes parameter CHLDaddInfo (continue action that
had to wait for a call to be connected first).
*/
/* Held call is being disconnected */
#define DISCONNECT_HELD (0)
/* Call is being put on hold */
#define CALL_HELD (1)
/* Multyparty call is being put on hold */
#define MTPTY_HELD (2)
LOCAL void process_CHLDaddInfo( UBYTE srcId, UBYTE context )
{
/* param context allows to differentiate some special case */
SHORT addId;
T_CC_CMD_PRM *pCCCmdPrm = &cmhPrm[srcId].ccCmdPrm;
TRACE_FUNCTION("process_CHLDaddInfo( )");
for( addId = 0; !((pCCCmdPrm -> mltyCncFlg >> addId) & 0x01); addId++ )
;
switch( CHLDaddInfo )
{
case( CHLD_ADD_INFO_ACC_CAL ):
cmhCC_AcceptCall(addId, srcId, AT_CMD_CHLD);
return;
case (CHLD_ADD_INFO_DIAL_CAL):
cmhCC_NewCall(addId, srcId, AT_CMD_D);
return;
case( CHLD_ADD_INFO_RTV_CAL ):
if(context NEQ CALL_HELD)
{
cmhCC_RetrieveCall(addId, srcId);
return;
}
break;
case (NO_CHLD_ADD_INFO):
if(context EQ DISCONNECT_HELD)
{
return; /* May happen for CCBS recall, disconnecting the active call */
}
break;
}
TRACE_EVENT("UNEXP ADD CHLD INFO");
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CallDisconnected |
+-------------------------------------------------------------------+
PURPOSE : call is disconnected: process event for D and A command, abort command or no command
*/
#ifdef SIM_TOOLKIT
LOCAL void cmhCC_CallDisc_whiledialling_sat(SHORT cId, BOOL *send_atresult)
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
UBYTE network_cause;
if( !ctb->SATinv )
{
return;
}
TRACE_FUNCTION("cmhCC_CallDisc_whiledialling_sat");
switch(ctb->curCmd)
{
case( AT_CMD_A ):
/* if connect is expected */
if( cmhPrm[ctb->curSrc].ccCmdPrm.mltyCncFlg NEQ 0 )
{
if( ctb->SATinv & SAT_REDIAL )
{
ctb->calStat = CS_SAT_REQ;
return;
}
/* return network error cause GSM 11.14 / 12.12.3 */
if(GET_CAUSE_VALUE(ctb->nrmCs) EQ NOT_PRESENT_8BIT)
{
network_cause = ADD_NO_CAUSE;
}
else
network_cause = GET_CAUSE_VALUE(ctb->nrmCs)|0x80;
*send_atresult = cmhSAT_NtwErr(network_cause);
}
break;
case( AT_CMD_ABRT ):
/* if disconnect is expected */
if( cmhPrm[ctb->curSrc].ccCmdPrm.mltyDscFlg NEQ 0 )
{
cmhSAT_UserClear();
}
break;
#ifdef FF_SAT_E
default:
cmhSAT_OpChnCSDDown( cId, TPL_DONT_CARE );
break;
#endif /* FF_SAT_E */
}
}
#endif /*#ifdef SIM_TOOLKIT*/
/*
+------------------------------------------------------------------------------
| Function : cmhCC_CallDisc_connectingphase
+------------------------------------------------------------------------------
| Description : This function checks on call type and disconnects the
| different calltypes.
|
| Parameters : call id
|
| Return :
|
+------------------------------------------------------------------------------
*/
LOCAL void cmhCC_CallDisc_connectingphase ( SHORT cId )
{
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
BOOL atRslt = TRUE; /* flags to send a AT result code */
TRACE_FUNCTION("cmhCC_CallDisc_connectingphase");
/* reset CMOD to single mode */
ccShrdPrm.CMODmode = CMOD_MOD_Single;
#ifdef SIM_TOOLKIT
/* handling of SAT invoked call */
cmhCC_CallDisc_whiledialling_sat(cId, &atRslt);
#endif /* SIM_TOOLKIT */
/* Unflag Multiconnect/disconnect Flags */
if( ctb->curSrc NEQ CMD_SRC_NONE )
{
cmhCC_tstAndUnflagCall( cId,
&cmhPrm[ctb->curSrc].ccCmdPrm.mltyCncFlg );
cmhCC_tstAndUnflagCall( cId,
&cmhPrm[ctb->curSrc].ccCmdPrm.mltyDscFlg );
}
/* CCBS handling */
if( ctb->curCmd EQ AT_CMD_D AND
ctb->CCBSstat EQ CCBSS_PSSBL )
{
cmhrat_ccbs( CMD_SRC_MAX, CCBS_IND_Possible,
CCBS_STAT_NotPresent, NULL );
}
switch( calltype )
{
case( VOICE_CALL ): /* voice call */
/* CSSU indications handling */
if( ctb->calStat EQ CS_HLD )
{
if( ctb->curCmd NEQ AT_CMD_NONE )
{
send_CSSX_notification(cId,
CSSX_CODE_HeldCallRel,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
}
break;
#if defined (FAX_AND_DATA) AND defined (DTI)
case(TRANS_CALL):
if( ccShrdPrm.datStat NEQ DS_IDL )
{
ccShrdPrm.datStat = DS_STOP_REQ;
cmhTRA_Deactivate ();
return;
}
break;
case(NON_TRANS_CALL):
if( ccShrdPrm.datStat NEQ DS_IDL )
{
ccShrdPrm.datStat = DS_STOP_REQ;
cmhL2R_Deactivate ();
return;
}
break;
#ifdef FF_FAX
case( FAX_CALL ):
if( ccShrdPrm.datStat NEQ DS_IDL )
{
ccShrdPrm.datStat = DS_STOP_REQ;
cmhT30_Deactivate ();
return;
}
break;
#endif /* FF_FAX */
#ifdef CO_UDP_IP
case(UDPIP_CALL):
/* check if a UDP/IP call is in process... If yes then end call */
if (ccShrdPrm.datStat NEQ DS_IDL)
{
ccShrdPrm.datStat = DS_STOP_REQ;
/* Check command context to know if lower layers of PPP already are down or not */
if(ctb->curCmd EQ AT_CMD_NONE OR
ctb->curCmd EQ AT_CMD_D )
{
/* If PPP connected - send terminate request to PPP */
if(pppShrdPrm.state EQ PPP_ESTABLISHED)
{
cmhPPP_Terminate(DWN);
}
return;
}
}
break;
#endif /* CO_UDP_IP */
#endif /* of #ifdef FAX_AND_DATA */
}
/* Command is done: send response to user if not suppressed */
/* if(atRslt) cmhCC_SndDiscRsn( cId ); */ /* to pass 26.8.1.2.8.1 */
}
LOCAL void call_disconnected_data_call(T_CC_CALL_TYPE calltype, SHORT cId)
{
TRACE_FUNCTION("call_disconnected_data_call");
/* Local disconnection for PPP if peer shuts down the line
instead of normal PPP shutdown */
switch( calltype )
{
#if defined (FAX_AND_DATA) AND defined (DTI)
/* check if a WAP call is in process... If yes then end call */
#if defined(CO_UDP_IP) || defined(FF_TCP_IP)
#ifdef CO_UDP_IP
case(UDPIP_CALL):
#endif /* CO_UDP_IP */
#if defined(FF_GPF_TCPIP)
case (TCPIP_CALL):
#endif /* FF_GPF_TCPIP */
#ifdef FF_TCP_IP
case PPP_CALL:
pppShrdPrm.is_PPP_CALL = FALSE;
TRACE_EVENT ("is_PPP_CALL resetted");
#endif /* FF_TCP_IP */
if (ccShrdPrm.datStat NEQ DS_IDL)
{
ccShrdPrm.datStat = DS_STOP_REQ;
/* Only local disconnection is possible in this case, the call is already disconnected !
if(pppShrdPrm.state EQ PPP_ESTABLISHED)
cmhPPP_Terminate(UP); */
if((pppShrdPrm.state EQ PPP_ESTABLISHED) OR
(pppShrdPrm.state EQ PPP_ESTABLISH) OR
(pppShrdPrm.state EQ PPP_TERMINATE))
{
cmhPPP_Terminate(DWN);
}
else if (wap_state > Wap_Not_Init AND
wap_state <= UDPA_Deactivation)
{
cmhPPP_Terminated(); /* Trigger termination of TCPIP if PPP did not yet start (ACI-FIX-9317)*/
}
}
break;
#endif /* of WAP || FF_TCP_IP || SAT E */
case(TRANS_CALL):
case(NON_TRANS_CALL):
if( ccShrdPrm.datStat NEQ DS_IDL )
{
ccShrdPrm.datStat = DS_STOP_REQ;
if(calltype EQ TRANS_CALL)
{
cmhTRA_Deactivate ();
}
else
{
cmhL2R_Deactivate ();
}
}
break;
#endif /* FAX_AND_DATA */
default:
break;
} /* end switch */
} /* end switch */
LOCAL void cmhCC_CallDisc_userinitiated ( SHORT cId )
{
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
#ifdef FF_PSI
T_ACI_DTI_PRC_PSI *src_infos = NULL;
#endif /*FF_PSI*/
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
TRACE_FUNCTION("cmhCC_CallDisc_userinitiated");
/* process event for H and +CHUP command */
pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
/* reset CMOD to single mode */
ccShrdPrm.CMODmode = CMOD_MOD_Single;
call_disconnected_data_call(calltype, cId);
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
/* if ATH before the call is connected, the flag must be cleared */
cmhCC_tstAndUnflagCall (cId, &(pCCCmdPrm -> mltyCncFlg));
/* check if disconnect is expected */
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)))
{
#if defined (FF_WAP) || defined (FF_SAT_E)
/* Check if the WAP stack is down */
if((pCCCmdPrm -> mltyDscFlg EQ 0) AND
(ccShrdPrm.wapStat EQ CC_WAP_STACK_DOWN))
#else
if( pCCCmdPrm -> mltyDscFlg EQ 0 )
#endif /* WAP || SAT E */
/****************/
/* if last call */
/****************/
{
#ifdef SIM_TOOLKIT
if( ctb->SATinv )
{
cmhSAT_StartPendingCall( );
}
else
#endif /* SIM_TOOLKIT */
{
if (cmdBuf EQ AT_CMD_Z)
{
cmh_Reset ( srcBuf, TRUE );
R_AT(RAT_Z, srcBuf)();
}
#if defined (FF_PSI) AND defined (DTI)
src_infos = find_element (psi_src_params, srcBuf, cmhPSItest_srcId);
if (src_infos EQ NULL)
#endif /*FF_PSI*/
#ifdef UART
{
if (uartShrdPrm.dtr_clearcall EQ TRUE)
{
uartShrdPrm.dtr_clearcall = FALSE;
R_AT( RAT_NO_CARRIER, srcBuf ) ( cmdBuf, cId+1 );
cmh_logRslt ( srcBuf,
RAT_NO_CARRIER, cmdBuf, (SHORT)(cId+1), -1, -1 );
}
else
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf,
RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
#endif /*UART*/
#if defined (FF_PSI) AND defined (DTI)
else
{
if (psiShrdPrm.dtr_clearcall EQ TRUE)
{
psiShrdPrm.dtr_clearcall = FALSE;
R_AT( RAT_NO_CARRIER, srcBuf ) ( cmdBuf, cId+1 );
cmh_logRslt ( srcBuf,
RAT_NO_CARRIER, cmdBuf, (SHORT)(cId+1), -1, -1 );
}
else
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf,
RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
#endif /*FF_PSI*/
}
}
}
/* inform call owner about disconnect */
if( srcBuf EQ ctb->calOwn
#ifdef SIM_TOOLKIT
AND
!ctb->SATinv )
#else
)
#endif
{
/* do nothing: owner knows already... */
/* EXCEPT if !ctb->SATinv: a SAT call setup has been started, and all previous
calls had to be disconnected (because of SAT command qualifer) */
}
else
{
R_AT( RAT_NO_CARRIER, ctb->calOwn ) ( AT_CMD_NONE, cId+1 );
cmh_logRslt ( srcBuf, RAT_NO_CARRIER, cmdBuf,
(SHORT)(cId+1), -1, -1 );
}
}
/* process disconnection of an held call: +CHLD command context */
LOCAL void cmhCC_CallDisc_heldcall ( SHORT cId )
{
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
TRACE_FUNCTION("cmhCC_CallDisc_heldcall");
pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
if( pCCCmdPrm -> mltyDscFlg EQ 0 AND
pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
/* check if disconnect is expected */
else if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)))
{
if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_RelActAndAcpt AND
pCCCmdPrm -> mltyCncFlg AND pCCCmdPrm -> mltyDscFlg EQ 0 )
{
process_CHLDaddInfo( srcBuf, DISCONNECT_HELD );
}
else if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_Ect )
{
cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)); /* now disconnected */
}
if( pCCCmdPrm -> mltyDscFlg EQ 0 AND
pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
/* check if disconnect is unexpected */
else if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */
R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent );
/* log result */
cmh_logRslt ( srcBuf, RAT_CME, cmdBuf,
-1, -1, CME_ERR_NotPresent );
}
/* inform call owner about disconnect */
if( srcBuf NEQ (UBYTE)CMD_SRC_NONE AND
srcBuf NEQ ctb->calOwn )
{
R_AT( RAT_NO_CARRIER, ctb->calOwn ) ( AT_CMD_NONE, cId+1 );
}
}
/* process event for the +CTFR command.*/
LOCAL void cmhCC_CallDisc_transferedcall ( SHORT cId )
{
T_CC_CMD_PRM *pCCCmdPrm; /* points to CC command parameters */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
RAT_ID rat_id;
T_ACI_CME_ERR cme_err;
TRACE_FUNCTION("cmhCC_CallDisc_transferedcall");
/* Get a pointer to the appropriate CC call table entry */
pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
/* End of command execution here */
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
(void)cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg));
switch (ctb->CDStat)
{
case CD_Succeeded:
rat_id = RAT_OK;
cme_err = -1;
break;
case CD_Requested: /* No answer from the network */
rat_id = RAT_CME;
cme_err = CME_ERR_Timeout;
break;
case CD_Failed: /* SS transaction failed */
rat_id = RAT_CME;
cme_err = CME_ERR_OpNotSupp;
break;
default: /* Unexpected here */
rat_id = RAT_CME;
cme_err = CME_ERR_Unknown;
break;
}
if(rat_id EQ RAT_OK)
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
}
else if(rat_id EQ RAT_CME)
{
R_AT( RAT_CME, srcBuf ) ( cmdBuf, cme_err );
}
cmh_logRslt( srcBuf, rat_id, cmdBuf,
(SHORT)(cId+1), -1, cme_err );
ctb->CDStat = NO_VLD_CD;
}
GLOBAL void cmhCC_CallDisconnected ( SHORT cId )
{
UBYTE idx;
#if defined(FF_GPF_TCPIP)
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
#endif /* FF_GPF_TCPIP */
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
UBYTE callId = 0;
UBYTE i = 0;
UBYTE mptyId = 0;
TRACE_FUNCTION ("cmhCC_CallDisconnected()");
/* inform advice of charge module */
aoc_info (cId, AOC_STOP_TIME);
#if defined(FF_GPF_TCPIP)
/* Needed if user stops call setup before app got connection conf */
if (calltype EQ TCPIP_CALL)
{
T_DCM_STATUS_IND_MSG msg;
msg.hdr.msg_id = DCM_NEXT_CMD_STOP_MSG;
msg.result = DCM_PS_CONN_BROKEN;
dcm_send_message(msg, DCM_SUB_WAIT_SATDN_CNF);
}
#endif /* FF_GPF_TCPIP */
/*
*----------------------------------------------------------------
* call progress information
*----------------------------------------------------------------
*/
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CPI, idx )
( cId+1,
CPI_MSG_Disc,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->curCs);
}
/*************************
call was not serviced yet
***************************/
if( ctb->calOwn EQ OWN_NONE AND
ctb->curCmd EQ AT_CMD_NONE )
{
psaCC_phbAddNtry ( LMN, cId, CT_MTC, NULL ); /* add call to LMN PB */
#ifdef FF_ATI
io_setRngInd (IO_RING_OFF, CRING_TYP_NotPresent, CRING_TYP_NotPresent ); /* V.24 Ring Indicator Line */
#endif
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CRING_OFF, idx )( cId+1 );
}
return;
}
/*************************
check for command context
***************************/
switch( ctb->curCmd )
{
case( AT_CMD_NONE ):
case( AT_CMD_A ):
case( AT_CMD_D ):
case( AT_CMD_ABRT ):
cmhCC_CallDisc_connectingphase(cId);
break;
case( AT_CMD_H ):
case( AT_CMD_Z ):
case( AT_CMD_CHUP ):
#ifdef FF_FAX
case( AT_CMD_FKS ):
case( AT_CMD_FDT ):
case( AT_CMD_FDR ):
#endif /* FF_FAX */
cmhCC_CallDisc_userinitiated(cId);
break;
case( AT_CMD_CHLD ):
cmhCC_CallDisc_heldcall(cId);
break;
case( AT_CMD_CTFR ):
cmhCC_CallDisc_transferedcall(cId);
break;
} /* switch */
if ( ctb NEQ NULL AND ctb->mptyStat NEQ CS_IDL)
{
for(;callId < MAX_CALL_NR; callId++)
{
if (psaCC_ctb(callId) NEQ NULL AND
psaCC_ctb(callId)->mptyStat EQ CS_ACT )
{
i++;
if (callId NEQ cId)
{
mptyId = callId;
}
}
}
if (i EQ 2)
{
psaCC_ctb(mptyId)->mptyStat = CS_IDL;
}
}
/* PATCH BE 03.07.00
* DO NOT declare the call table entry as unused:
do not free call table at this time then every second MTC will fail if early
assignment is used. */
return;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CallReleased |
+-------------------------------------------------------------------+
PURPOSE : call is released
*/
GLOBAL void cmhCC_CallReleased ( SHORT cId )
{
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
T_CC_CMD_PRM *pCCCmdPrm; /* points to CC command parameters */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
UBYTE idx;
UBYTE callId = 0;
UBYTE i = 0;
UBYTE mptyId = 0;
TRACE_FUNCTION ("cmhCC_CallReleased()");
/* inform advice of charge module */
aoc_info (cId, AOC_STOP_TIME);
#if defined(FF_GPF_TCPIP)
/* This will happen if network got lost during a CSD call */
if (calltype EQ TCPIP_CALL)
{
T_DCM_STATUS_IND_MSG msg;
msg.hdr.msg_id = DCM_ERROR_IND_MSG;
msg.result = DCM_PS_CONN_BROKEN;
dcm_send_message(msg, DCM_SUB_WAIT_SATDN_CNF);
}
#endif /* FF_GPF_TCPIP */
/* check for command context */
switch( ctb->curCmd )
{
case( AT_CMD_A ):
case( AT_CMD_D ):
case( AT_CMD_NONE ):
/* process event for A, D or no command */
/* handling for CCBS prolonged session */
if( ctb->curSrc NEQ CMD_SRC_NONE )
{
cmhCC_tstAndUnflagCall( cId, &cmhPrm[ctb->curSrc].ccCmdPrm.mltyCncFlg );
cmhCC_tstAndUnflagCall( cId, &cmhPrm[ctb->curSrc].ccCmdPrm.mltyDscFlg );
}
if (ctb->CCBSstat EQ CCBSS_PSSBL )
{
cmhrat_ccbs (CMD_SRC_MAX, CCBS_IND_PossibilityTimedOut,
CCBS_STAT_NotPresent, NULL );
break; /* skip the rest */
}
if (ctb->CCBSstat EQ CCBSS_REQ)
{
break; /* skip the rest */
}
if (ctb->calType EQ CT_NI_MOC)
{
cmhrat_ccbs( CMD_SRC_MAX, CCBS_IND_RecallTimedOut,
CCBS_STAT_NotPresent, NULL );
break; /* skip the rest */
}
/* call clean up */
switch( calltype )
{
case( VOICE_CALL ):
;
break;
#ifdef FF_GPF_TCPIP
case( TCPIP_CALL ):
if( ccShrdPrm.datStat NEQ DS_IDL )
{
ccShrdPrm.datStat = DS_STOP_REQ;
pppShrdPrm.state = PPP_UNDEFINED; /* Otherwise PPP and TCPIP doesn't go down well */
cmhPPP_Terminate(DWN);
ctb->curCmd = AT_CMD_NONE;
}
break;
#endif /* FF_GPF_TCPIP */
#if defined (FAX_AND_DATA) AND defined (DTI)
case( TRANS_CALL ):
if( ccShrdPrm.datStat NEQ DS_IDL )
{
ccShrdPrm.datStat = DS_STOP_REQ;
cmhTRA_Deactivate ();
}
break;
case( NON_TRANS_CALL ):
if( ccShrdPrm.datStat NEQ DS_IDL )
{
ccShrdPrm.datStat = DS_STOP_REQ;
cmhL2R_Deactivate ();
}
break;
#ifdef CO_UDP_IP
case( UDPIP_CALL ):
if( ccShrdPrm.datStat NEQ DS_IDL )
{
ccShrdPrm.datStat = DS_STOP_REQ;
cmhPPP_Terminate(DWN);
ctb->curCmd = AT_CMD_NONE;
}
break;
#endif /* CO_UDP_IP */
#ifdef FF_FAX
case( FAX_CALL ):
if( ccShrdPrm.datStat NEQ DS_IDL )
{
ccShrdPrm.datStat = DS_STOP_REQ;
cmhT30_Deactivate ();
}
#endif /* FF_FAX */
#endif /* FAX_AND_DATA */
}
cmhCC_SndDiscRsn( cId );
break;
case( AT_CMD_H ):
case( AT_CMD_Z ):
case( AT_CMD_CHUP ):
case( AT_CMD_ABRT ):
case( AT_CMD_CHLD ):
#ifdef FF_FAX
case( AT_CMD_FKS ):
case( AT_CMD_FDT ):
case( AT_CMD_FDR ):
#endif
/*
*----------------------------------------------------------------
* process event for H, Z and +CHUP command
*----------------------------------------------------------------
*/
/*
* Bugfix for DISCONNECT_IND in CC U3 with PROGRESS_IND #8
*/
cmdBuf = ctb->curCmd;
srcBuf = ctb->curSrc;
pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm->mltyCncFlg) );
cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm->mltyDscFlg) );
if ( cmdBuf EQ AT_CMD_Z AND
pCCCmdPrm -> mltyDscFlg EQ 0 )
{
cmh_Reset ( srcBuf, TRUE );
R_AT( RAT_Z, srcBuf)();
}
cmhCC_PrepareCmdEnd (cId, NULL, NULL);
if (ctb->curCmd NEQ AT_CMD_CHLD) /* Do not emmit OK for CHLD since this would
occour in multiple OKs for a multi-party call */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
}
/* log result */
cmh_logRslt ( srcBuf, RAT_OK, cmdBuf, (SHORT)(cId+1), -1, -1 );
break;
}
/* call progress information */
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT(RAT_CPI, idx)( cId+1,
CPI_MSG_Rls,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->curCs);
}
if ( ctb NEQ NULL AND ctb->mptyStat NEQ CS_IDL)
{
for(;callId < MAX_CALL_NR; callId++)
{
if (psaCC_ctb(callId) NEQ NULL AND
psaCC_ctb(callId)->mptyStat EQ CS_ACT )
{
i++;
if (callId NEQ cId)
{
mptyId = callId;
}
}
}
if (i EQ 2)
{
psaCC_ctb(mptyId)->mptyStat = CS_IDL;
}
}
if (rdlPrm.rdlcId NEQ cId)
{ /* if redialling is active no clean cId entry */
/* declare the call table entry as unused */
psaCC_FreeCtbNtry (cId);
}
return;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CallReleaseIndication |
+-------------------------------------------------------------------+
PURPOSE : call release indication to give out correct call process information
interface so that psa function can report a release ind
*/
GLOBAL void cmhCC_CPIReleaseMsg ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
UBYTE idx;
TRACE_FUNCTION ("cmhCC_CPIReleaseMsg()");
/* call progress information */
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT(RAT_CPI, idx)( cId+1,
CPI_MSG_Rls,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->curCs);
}
return;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CPIrejectMsg |
+-------------------------------------------------------------------+
PURPOSE : interface so that psa function can report a reject ind.
*/
GLOBAL void cmhCC_CPIrejectMsg ( SHORT cId )
{
UBYTE idx;
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
TRACE_FUNCTION ("cmhCC_CPIrejectMsg()");
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT(RAT_CPI, idx)( cId+1,
CPI_MSG_Rjct,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->curCs);
}
/*************************
call was not serviced yet
***************************/
if( ctb->calOwn EQ OWN_NONE AND
ctb->curCmd EQ AT_CMD_NONE )
{
psaCC_phbAddNtry ( LMN, cId, CT_MTC, NULL ); /* add call to LMN PB */
#ifdef AT_INTERPRETER
io_setRngInd (IO_RING_OFF, CRING_TYP_NotPresent, CRING_TYP_NotPresent ); /* V.24 Ring Indicator Line */
#endif
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CRING_OFF, idx )( cId+1 );
}
return;
}
return;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CallModified |
+-------------------------------------------------------------------+
PURPOSE : call was modified
*/
GLOBAL void cmhCC_CallModified ( SHORT cId )
{
#if defined (FAX_AND_DATA)
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
TRACE_FUNCTION ("cmhCC_CallModified()");
/* check for command context */
switch (ctb->curCmd )
{
case( AT_CMD_D ):
case( AT_CMD_A ):
case( AT_CMD_H ):
/* process event for D, A and H command */
cmdBuf = ctb->curCmd;
srcBuf = ctb->curSrc;
break;
default:
cmdBuf = AT_CMD_NONE;
srcBuf = ctb->calOwn;
break;
}
/* determine modifaction status */
switch (ctb->rslt)
{
/* successful modification */
case( MNCC_CAUSE_MODIFY_SUCCESS ):
switch( calltype )
{
/* modified to speech call */
case( VOICE_CALL ):
cmhCC_PrepareCmdEnd (cId, NULL, NULL);
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
break;
/* modified to transparent or non-transparent or fax data call */
case( TRANS_CALL ):
case( NON_TRANS_CALL ):
case( FAX_CALL ):
ccShrdPrm.datStat = DS_ACT_REQ;
if( cmhRA_Activate ( srcBuf, cmdBuf, cId ) NEQ AT_EXCT )
{
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (cId);
}
break;
}
break;
/* unsuccessful modification */
case( MNCC_CAUSE_MS_TIMER ):
default: /* network can send any cause */
TRACE_EVENT_P1 ("MODIFICATION FAILURE: cause=%d",ctb->rslt);
R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent );
/* log result */
cmh_logRslt ( srcBuf, RAT_CME, cmdBuf, -1, -1,
CME_ERR_NotPresent );
if( calltype EQ TRANS_CALL OR
calltype EQ NON_TRANS_CALL OR
calltype EQ FAX_CALL )
{
/* back to transparent or non-transparent or fax data call */
ccShrdPrm.datStat = DS_REST_REQ;
if( cmhRA_Activate ( srcBuf, cmdBuf, cId ) NEQ AT_EXCT )
{
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (cId);
}
}
break;
}
#endif /* FAX_AND_DATA */
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_DTMFsent |
+-------------------------------------------------------------------+
PURPOSE : confirmation for sent DTMF
*/
LOCAL void dtmf_sent_after_vts ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
UBYTE current_cmd_source = ctb->dtmfSrc; /* buffers current command source */
TRACE_FUNCTION ("dtmf_sent_after_vts()");
ctb->dtmfCmd = AT_CMD_NONE;
ctb->dtmfSrc = CMD_SRC_NONE;
ccShrdPrm.dtmf.cId = NO_ENTRY;
ccShrdPrm.dtmf.cnt = 0;
if ((GET_CAUSE_VALUE(ctb->nrmCs) NEQ NOT_PRESENT_8BIT) AND
(ctb->nrmCs NEQ MNCC_CAUSE_DTMF_START_SUCCESS) AND
(ctb->nrmCs NEQ MNCC_CAUSE_DTMF_STOP_SUCCESS))
{
TRACE_EVENT_P1("DTMF response cause value: %d", ctb->nrmCs);
R_AT( RAT_CME, current_cmd_source ) ( AT_CMD_VTS, CME_ERR_NotPresent );
return;
}
R_AT( RAT_OK, current_cmd_source ) ( AT_CMD_VTS );
}
LOCAL void dtmf_sent_within_number ( SHORT cId )
{
BOOL dtmf_sent; /* result of sending of next DTMF char */
TRACE_FUNCTION ("dtmf_sent_within_number()");
if ((ccShrdPrm.dtmf.cId NEQ cId) OR
!is_call_ok_for_dtmf(cId))
{
TRACE_EVENT_P2("Wrong cId for send DTMF. ccShrdPrm.dtmf.cId: %d, cId: %d", ccShrdPrm.dtmf.cId, cId);
return;
}
while( ccShrdPrm.dtmf.cnt AND
ccShrdPrm.dtmf.cur < ccShrdPrm.dtmf.cnt )
{
dtmf_sent = cmhCC_SendDTMFdig ( AT_CMD_NONE,
cId,
ccShrdPrm.dtmf.dig[ccShrdPrm.dtmf.cur],
DTMF_MOD_AUTO );
ccShrdPrm.dtmf.cur++;
if( dtmf_sent )
{
return;
}
}
TRACE_EVENT_P1("End of sending DTMF tones: %d", ccShrdPrm.dtmf.dig[ccShrdPrm.dtmf.cur]);
ccShrdPrm.dtmf.cnt = ccShrdPrm.dtmf.cur = 0;
ccShrdPrm.dtmf.cId = NO_ENTRY;
}
GLOBAL void cmhCC_DTMFsent ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
TRACE_FUNCTION ("cmhCC_DTMFsent()");
switch( ctb->dtmfCmd )
{
case( AT_CMD_VTS ):
dtmf_sent_after_vts(cId);
return;
case( AT_CMD_NONE ):
dtmf_sent_within_number(cId);
return;
default:
TRACE_EVENT_P1("Unexpected DTMF command value: %d", ctb->dtmfCmd);
break;
}
}
/*
This will be called when the call was disconnected while sending DTMF tones
*/
GLOBAL void cmhCC_DTMFstopped ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
TRACE_FUNCTION ("cmhCC_DTMFstopped()");
switch( ctb->dtmfCmd )
{
case( AT_CMD_VTS ):
TRACE_EVENT ("DTMF stopped within VTS");
R_AT( RAT_CME, ctb->dtmfSrc )
( AT_CMD_VTS, CME_ERR_Unknown );
return;
case( AT_CMD_NONE ):
TRACE_EVENT ("DTMF stopped within NONE");
return;
default:
TRACE_EVENT_P1("Unexpected DTMF command value: %d", ctb->dtmfCmd);
break;
}
}
#if 0 // HM 11-May-2005: Dead code
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_DisconnectCall |
+-------------------------------------------------------------------+
PURPOSE : request to disconnect the call (in-band tones available)
*/
GLOBAL void cmhCC_DisconnectCall ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_CC_CMD_PRM *pCCCmdPrm; /* points to CC command parameters */
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
TRACE_FUNCTION ("cmhCC_DisconnectCall()");
/* check for command context */
switch (ctb->curCmd)
{
case( AT_CMD_NONE ):
case( AT_CMD_D ):
case( AT_CMD_A ):
/*
*----------------------------------------------------------------
* process event for D, A and no command
*----------------------------------------------------------------
*/
/* for data calls proceed with call completion */
if( cmhCC_getcalltype(cId) NEQ VOICE_CALL )
{
psaCC_ClearCall (cId);
}
break;
case( AT_CMD_H ):
case( AT_CMD_Z ):
case( AT_CMD_CHUP ):
/*
*----------------------------------------------------------------
* process event for H, Z and +CHUP command
*----------------------------------------------------------------
*/
cmdBuf = ctb->curCmd;
srcBuf = ctb->curSrc;
psaCC_ClearCall (cId);
cmhCC_PrepareCmdEnd (cId, NULL, NULL);
pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
if(cmdBuf EQ AT_CMD_Z AND
pCCCmdPrm -> mltyDscFlg EQ 0 )
{
cmh_Reset ( srcBuf, TRUE );
R_AT( RAT_Z, srcBuf)();
}
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
break;
}
return;
}
#endif /* #if 0 */
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_IncomingCall |
+-------------------------------------------------------------------+
PURPOSE : indication of a mobile terminated call
*/
GLOBAL void cmhCC_IncomingCall ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
SHORT idx; /* holds index counter */
T_ACI_CRING_MOD mode; /* holds mode of call */
T_ACI_CRING_TYP type1, type2; /* holds types of bearer services */
CHAR numBuf[MAXIMUM(MAX_CC_CALLING_NUMBER, MAX_CC_REDIR_NUMBER)+1];
/* buffers calling number + '\0' */
CHAR subBuf[SUB_LENGTH+1]; /* buffers subaddress 'subaddress\0' */
T_ACI_TOA toaBuf; /* buffers type of address */
T_ACI_TOS tosBuf; /* buffers type of subaddress */
USHORT listcounter;
T_ACI_LIST *msg2send;
TRACE_FUNCTION ("cmhCC_IncomingCall()");
/*
*-------------------------------------------------------------------
* ring for call, if no call is in use
*-------------------------------------------------------------------
*/
if( ! psaCC_ctbCallInUse() )
{
switch (ctb->rptInd) /* determine call mode */
{
case( RI_NOT_PRES ):
case( RI_SEQUENTIAL ):
mode = CRING_MOD_Direct;
break;
case( RI_CIRCULAR ):
mode = CRING_MOD_Alternate;
break;
default:
TRACE_EVENT("UNEXP REPEAT INDICATOR IN CTB");
mode = CRING_MOD_NotPresent;
break;
}
/* determine 1st service */
type1 = cmhCC_GetCallType_from_bearer( &ctb->BC[0] );
/* determine 2nd service */
type2 = cmhCC_GetCallType_from_bearer( &ctb->BC[1] );
#ifdef FF_ATI
io_setRngInd (IO_RING_ON, type1, type2); /* V.24 Ring Indicator Line */
#endif
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
if (ctb->prgDesc EQ PROG_NOT_PRES)
{
R_AT( RAT_CPI, idx )
( cId+1,
CPI_MSG_Setup,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->curCs );
}
R_AT( RAT_CRING, idx )( mode, type1, type2 );
/* calling line presentation, if no call is in use */
/* check of presentation indicator removed, due to the fact that
* other mobiles show the same behaviour.
if( ctb->clgPty.present NEQ PRES_NUMB_NOT_AVAIL ){} */
R_AT( RAT_CLIP, idx )
( CLIP_STAT_NotPresent,
psaCC_ctbClrAdr2Num( cId, numBuf, sizeof (numBuf) ),
cmhCC_ctbGetClrNumTyp( cId, &toaBuf ),
ctb->clgPty.present,
psaCC_ctbClrAdr2Sub( cId, subBuf ),
cmhCC_ctbGetClrSubTyp( cId, &tosBuf ),
psaCC_ctbGetAlpha( cId ) );
R_AT ( RAT_CDIP, idx )
(psaCC_ctbCldAdr2Num( cId, numBuf, sizeof (numBuf) ),
cmhCC_ctbGetCldNumTyp( cId, &toaBuf ),
psaCC_ctbCldAdr2Sub( cId, subBuf ),
cmhCC_ctbGetCldSubTyp( cId, &tosBuf ));
} /* for */
if (ctb->CDStat EQ CD_Notified)
{
send_CSSX_notification(cId,
CSSX_CODE_DeflectedCall,
ACI_NumParmNotPresent,
psaCC_ctbRdrAdr2Num( cId, numBuf, sizeof (numBuf) ),
cmhCC_ctbGetRdrNumTyp( cId, &toaBuf ),
psaCC_ctbRdrAdr2Sub( cId, subBuf ),
cmhCC_ctbGetRdrSubTyp( cId, &tosBuf));
}
if (ctb->CDStat EQ CD_Notified)
{
psaCC_FreeRdrPty (cId);
ctb->CDStat = NO_VLD_CD;
}
/* check for TTY service */
cmhCC_TTY_Control ( cId, TTY_START );
/* Find out if there is any MNCC_FACILITY_IND stored */
listcounter = 0;
if ((listcounter = get_list_count(ccShrdPrm.facility_list)) > 0)
{
for (;listcounter > 0 ; listcounter --)
{
msg2send = remove_first_element(ccShrdPrm.facility_list);
/* Send MNCC_FACILITY_IND */
psa_mncc_facility_ind((T_MNCC_FACILITY_IND *)msg2send);
}
}
} /* endif */
/*
*-------------------------------------------------------------------
* call waiting indication, if a call is in use
*-------------------------------------------------------------------
*/
else
{
/* check of presentation indicator removed, due to the fact that
other mobiles show the same behaviour.
if( ctb->clgPty.present NEQ PRES_NUMB_NOT_AVAIL ) {} */
if (ctb->CDStat EQ CD_Notified)
{
send_CSSX_notification( cId,
CSSX_CODE_DeflectedCall,
ACI_NumParmNotPresent,
psaCC_ctbRdrAdr2Num( cId, numBuf, sizeof (numBuf) ),
cmhCC_ctbGetRdrNumTyp( cId, &toaBuf ),
psaCC_ctbRdrAdr2Sub( cId, subBuf ),
cmhCC_ctbGetRdrSubTyp( cId, &tosBuf ));
}
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
if (ctb->prgDesc EQ PROG_NOT_PRES)
{
R_AT( RAT_CPI, idx )
( cId+1,
CPI_MSG_Setup,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->curCs );
}
R_AT( RAT_CCWA, idx )
( NULL,
psaCC_ctbClrAdr2Num( cId, numBuf, sizeof (numBuf) ),
cmhCC_ctbGetClrNumTyp( cId, &toaBuf ),
ctb->clgPty.present,
cmhCC_GetCallClass( cId ),
psaCC_ctbGetAlpha( cId ) );
}
if (ctb->CDStat EQ CD_Notified)
{
psaCC_FreeRdrPty (cId);
ctb->CDStat = NO_VLD_CD;
}
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : psaCC_Synchronized |
+-------------------------------------------------------------------+
PURPOSE : channel mode has changed or
call reestablishment event received.
If a channel mode change is indicated cId needs not
to be valid.
*/
GLOBAL void cmhCC_Synchronized ( SHORT cId )
{
SHORT act_cId; /* holds call identifier */
UBYTE idx; /* holds index */
#if defined (FAX_AND_DATA) AND defined (DTI)
T_CC_CALL_TYPE calltype;
#endif /* of #ifdef FAX_AND_DATA */
TRACE_FUNCTION ("cmhCC_Synchronized()");
/* process event */
switch( ccShrdPrm.syncCs )
{
case( MNCC_CAUSE_CHANNEL_SYNC ): /* change of TCH state */
if( ccShrdPrm.TCHasg EQ TRUE )
{
/* search for an active call */
if((act_cId = psaCC_ctbFindCall( NO_VLD_OWN, CS_ACT, NO_VLD_CT ))
NEQ NO_ENTRY )
{
#if defined (FAX_AND_DATA) AND defined (DTI)
calltype = cmhCC_getcalltype(act_cId);
switch( calltype )
{
#ifdef FF_FAX
case( FAX_CALL ):
switch( ccShrdPrm.datStat )
{
case( DS_ACT ):
case( DS_TCH_MDF ):
ccShrdPrm.datStat = DS_TCH_MDF;
/*
* use entity owner instead of current source, because
* command is out of scope for CC
*/
if( cmhRA_Modify ( raEntStat.entOwn, act_cId ) NEQ AT_EXCT )
{
ccShrdPrm.datStat = DS_IDL;
cmhT30_Deactivate();
psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (act_cId);
}
break;
case( DS_IDL ):
ccShrdPrm.datStat = DS_ACT_REQ;
if( cmhRA_Activate ( psaCC_ctb(act_cId)->curSrc,
psaCC_ctb(act_cId)->curCmd,
act_cId )
NEQ AT_EXCT )
{
ccShrdPrm.datStat = DS_IDL;
psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (act_cId);
}
}
break;
#endif /* FF_FAX */
case( TRANS_CALL ): /* activate RA */
case( NON_TRANS_CALL ): /* activate RA */
switch( ccShrdPrm.datStat )
{
case( DS_IDL ):
ccShrdPrm.datStat = DS_ACT_REQ;
if( cmhRA_Activate ( psaCC_ctb(act_cId)->curSrc,
psaCC_ctb(act_cId)->curCmd,
act_cId )
NEQ AT_EXCT )
{
ccShrdPrm.datStat = DS_IDL;
psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (act_cId);
}
break;
default:
TRACE_EVENT("modify data call ignored");
break;
}
break;
case( UNSUP_DATA_CALL ):
TRACE_EVENT("UNSUPPORTED DATA CALL -> DISC CALL");
psaCC_ctb(act_cId)->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (act_cId);
break;
}
#endif /* FAX_AND_DATA */
}
}
/* Information about Traffic Channel Assignment should be sent
for all existing act_cIds */
for( act_cId = 0; act_cId < MAX_CALL_NR; act_cId++ )
{
if (ccShrdPrm.ctb[act_cId] NEQ NULL)
{
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CPI, idx )
( act_cId+1,
CPI_MSG_Sync,
(psaCC_ctb(act_cId)->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
psaCC_ctb(act_cId)->curCs );
}
}
}
break;
case( MNCC_CAUSE_REEST_STARTED ): /* call reestablishment */
case( MNCC_CAUSE_REEST_FINISHED ):
TRACE_EVENT_P1("SYNC -> CALL REESTABLISHMENT %s",
(ccShrdPrm.syncCs EQ MNCC_CAUSE_REEST_STARTED ? "STARTED" : "FINISHED"));
if (psaCC_ctbIsValid (cId))
{
/* Send %CPI notification for call reestablishment */
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CPI, idx )
( cId+1,
CPI_MSG_Sync,
(psaCC_ctb(cId)->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
psaCC_ctb(cId)->curCs );
}
}
else
{
TRACE_ERROR ("No call table entry");
}
break;
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : psaCC_CallHeld |
+-------------------------------------------------------------------+
PURPOSE : call hold result
*/
GLOBAL void cmhCC_CallHeld ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
SHORT addId; /* holds additional call id */
UBYTE idx;
TRACE_FUNCTION ("cmhCC_CallHeld()");
/* check for command context */
switch (ctb->curCmd )
{
case( AT_CMD_D ):
case( AT_CMD_A ):
case( AT_CMD_CHLD ):
break;
default:
TRACE_EVENT_P1("Error: wrong command context: %d", ctb->curCmd);
return; /* wrong command context */
}
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
/* check result of hold request */
TRACE_EVENT_P1("Hold CNF cause value: %04X", ctb->rslt);
switch( ctb->rslt )
{
case( MNCC_CAUSE_HOLD_SUCCESS ):
case( MNCC_CAUSE_SUCCESS ):
case( MNCC_CAUSE_NO_MS_CAUSE ):
/* Held information displayed if call is on hold */
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CPI, idx )
( cId+1,
CPI_MSG_Hld,
(ctb->inBndTns)? CPI_IBT_True: CPI_IBT_False,
(ccShrdPrm.TCHasg)? CPI_TCH_True: CPI_TCH_False,
ctb->rslt);
}
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if((pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActExc OR
pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActAndAcpt OR
pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial) AND
pCCCmdPrm -> mltyCncFlg )
{
process_CHLDaddInfo( srcBuf, CALL_HELD );
}
if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */
{
#ifdef SIM_TOOLKIT
if (ctb->SATinv )
{
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
cmhSAT_StartPendingCall( );
}
else
#endif /* SIM_TOOLKIT */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
}
break;
default: /* no positive result, i.e. negative result of Hold operation */
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
#ifdef SIM_TOOLKIT
if (ctb->SATinv)
{
psaCC_ctb(ccShrdPrm.cIdMPTY)->SATinv = FALSE;
/* return network error cause GSM 11.14 / 12.12.3 */
cmhSAT_NtwErr( ADD_NO_CAUSE );
}
#endif
if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial AND
pCCCmdPrm -> mltyCncFlg )
{
for( addId = 0; !((pCCCmdPrm -> mltyCncFlg >> addId) & 0x01); addId++ )
;
if( CHLDaddInfo EQ CHLD_ADD_INFO_DIAL_CAL )
{
CHLDaddInfo = NO_CHLD_ADD_INFO;
psaCC_FreeCtbNtry (addId);
}
}
pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */
CHLDaddInfo = NO_CHLD_ADD_INFO;
R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_OpNotAllow );
/* log result */
cmh_logRslt ( srcBuf, RAT_CME,
cmdBuf, -1, -1, CME_ERR_OpNotAllow );
}
break;
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : psaCC_CallRetrieved |
+-------------------------------------------------------------------+
PURPOSE : call retrieve result
*/
GLOBAL void cmhCC_CallRetrieved ( SHORT cId )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
TRACE_FUNCTION ("cmhCC_CallRetrieved()");
/* check for command context */
if (ctb->curCmd NEQ AT_CMD_CHLD)
{
return;
}
pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
/*
* check result of retrieve request
*/
switch (ctb->rslt)
{
case( MNCC_CAUSE_RETRIEVE_SUCCESS ):
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
break;
default: /* no positive result of retrieve operation */
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */
R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_OpNotAllow );
/* log result */
cmh_logRslt ( srcBuf, RAT_CME,
cmdBuf, -1, -1, CME_ERR_OpNotAllow );
}
break;
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_RA_Activated |
+-------------------------------------------------------------------+
PURPOSE : RA entity activated, data path established
*/
#ifdef DTI
GLOBAL void cmhCC_RA_Activated ( SHORT cId )
{
#ifdef FAX_AND_DATA
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
TRACE_FUNCTION ("cmhCC_RA_Activated()");
srcBuf = psaCC_ctb(cId)->curSrc;
cmdBuf = psaCC_ctb(cId)->curCmd;
pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
switch( ccShrdPrm.datStat )
{
case( DS_ACT_REQ ):
case( DS_REST_REQ ):
switch( calltype )
{
/* transparent data call */
case( TRANS_CALL ):
psaTRA_Activate( );
break;
/* non-transparent data call */
case( NON_TRANS_CALL ):
/* a WAP call is a non-transparent data call */
#ifdef CO_UDP_IP
case( UDPIP_CALL ):
#endif /* CO_UDP_IP */
#ifdef FF_TCP_IP
case( PPP_CALL ):
#endif /* FF_TCP_IP */
#if defined(FF_GPF_TCPIP)
case (TCPIP_CALL):
#endif /* FF_GPF_TCPIP */
if( cmhL2R_Activate(srcBuf, cmdBuf, cId) NEQ AT_EXCT )
{
ccShrdPrm.datStat = DS_DSC_REQ;
cmhRA_Deactivate ();
}
break;
#ifdef FF_FAX
case( FAX_CALL ):
if( cmhT30_Activate(srcBuf, cmdBuf, cId) NEQ AT_EXCT )
{
ccShrdPrm.datStat = DS_DSC_REQ;
cmhRA_Deactivate ();
}
break;
#endif /* FF_FAX */
/* in case of other types of call */
default:
ccShrdPrm.datStat = DS_DSC_REQ;
cmhRA_Deactivate ();
break;
}
break;
}
#endif /* of #ifdef FAX_AND_DATA */
}
#endif /* DTI */
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_RA_Deactivated |
+-------------------------------------------------------------------+
PURPOSE : RA entity deactivated, data path disconnected
*/
#ifdef DTI
GLOBAL void cmhCC_RA_Deactivated ( SHORT cId )
{
#ifdef FAX_AND_DATA
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
UBYTE cmdBuf; /* buffers current command */
TRACE_FUNCTION ("cmhCC_RA_Deactivated()");
cmdBuf = ctb->curCmd;
switch( calltype )
{
case( TRANS_CALL ):
/* transparent data call */
switch( ccShrdPrm.datStat )
{
case( DS_ACT ):
case( DS_ACT_REQ ):
case( DS_DSC_REQ ):
case( DS_TCH_MDF ):
ccShrdPrm.datStat = DS_IDL;
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (cId);
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
/* check impact for SAT commands */
cmhSAT_OpChnCSDDown( cId, TPL_NONE );
#endif /* SIM TOOLKIT AND FF_SAT_E */
break;
case( DS_MDF_REQ ):
ccShrdPrm.datStat = DS_IDL;
psaCC_ModifyCall(cId);
break;
case( DS_STOP_REQ ):
ccShrdPrm.datStat = DS_IDL;
cmhCC_CallDisconnected(cId);
break;
}
break;
/* non-transparent data call */
case( NON_TRANS_CALL ):
#ifdef CO_UDP_IP
case( UDPIP_CALL ):
#endif /* CO_UDP_IP */
#ifdef FF_TCP_IP
case( PPP_CALL ):
#endif /* FF_TCP_IP */
#ifdef FF_GPF_TCPIP
case (TCPIP_CALL):
#endif /* FF_GPF_TCPIP */
switch( ccShrdPrm.datStat )
{
case( DS_ACT ):
case( DS_ACT_REQ ):
case( DS_DSC_REQ ):
case( DS_REST_REQ ):
case( DS_TCH_MDF ):
ccShrdPrm.datStat = DS_IDL;
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
#if defined(CO_UDP_IP) OR defined(FF_GPF_TCPIP)
/* WAP STACK is down */
/* The following statements check which configuration is active,
because there are three possibilities:
1. UDP/IP only - WAP1.x and SAT_E
2. TCP/IP only - WAP2.x and higher and App's
3. UDP/IP and TCP/IP - WAP2.x and higher and App's and SAT_E
*/
#if defined(FF_GPF_TCPIP) AND !defined(CO_UDP_IP)
if(calltype EQ TCPIP_CALL)
#elif !defined(FF_GPF_TCPIP) AND defined(CO_UDP_IP)
if(calltype EQ UDPIP_CALL)
#elif defined(FF_GPF_TCPIP) AND defined(CO_UDP_IP)
if(calltype == UDPIP_CALL OR calltype == TCPIP_CALL)
#endif
{
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
/* check impact for SAT commands */
cmhSAT_OpChnCSDDown( cId, UDP );
#endif /* SIM TOOLKIT AND FF_SAT_E */
/* Have CC disconnected before ? */
if (ctb->calStat EQ CS_ACT)
{
psaCC_ClearCall (cId);
}
else
{
/* Message to MMI */
R_AT( RAT_OK, ctb->calOwn ) ( AT_CMD_NONE, cId+1 );
#ifdef FF_ATI
io_setDCD (ctb->calOwn, IO_DCD_OFF); /* V.24 DCD Line */
#endif
/* log result */
cmh_logRslt (ctb->calOwn, RAT_OK,
(T_ACI_AT_CMD)cmdBuf, (SHORT)(cId+1), -1, -1 );
}
break;
}
#endif /* CO_UDP_IP || FF_GPF_TCPIP */
psaCC_ClearCall (cId);
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
/* check impact for SAT commands */
cmhSAT_OpChnCSDDown( cId, TPL_NONE );
#endif /* SIM TOOLKIT AND FF_SAT_E */
break;
case( DS_STOP_REQ ):
ccShrdPrm.datStat = DS_IDL;
cmhCC_CallDisconnected(cId);
#if defined (FF_WAP) || defined (FF_SAT_E)
/* WAP STACK is down */
ccShrdPrm.wapStat = CC_WAP_STACK_DOWN;
#endif /* FF_WAP || SAT E */
break;
case( DS_ABO_REQ ): /* during modification */
switch( ctb->rptInd )
{
case( RI_SEQUENTIAL ): /* no way back */
ccShrdPrm.datStat = DS_IDL;
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (cId);
break;
case( RI_CIRCULAR ):
ccShrdPrm.datStat = DS_IDL;
psaCC_ModifyCall(cId); /* back to former service */
break;
}
break;
case( DS_MDF_REQ ):
ccShrdPrm.datStat = DS_IDL;
psaCC_ModifyCall(cId);
break;
}
break;
/* in case of a fax call */
case( FAX_CALL ):
switch( ccShrdPrm.datStat )
{
case( DS_ACT ):
case( DS_ACT_REQ ):
case( DS_DSC_REQ ):
case( DS_REST_REQ ):
case( DS_TCH_MDF ):
ccShrdPrm.datStat = DS_IDL;
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (cId);
break;
case( DS_STOP_REQ ):
ccShrdPrm.datStat = DS_IDL;
cmhCC_CallDisconnected(cId);
break;
case( DS_ABO_REQ ): /* abort during modification */
switch (ctb->rptInd)
{
case( RI_SEQUENTIAL ): /* no way back */
ccShrdPrm.datStat = DS_IDL;
ctb->nrmCs = MNCC_CAUSE_CALL_CLEAR;
psaCC_ClearCall (cId);
break;
case( RI_CIRCULAR ):
ccShrdPrm.datStat = DS_IDL;
psaCC_ModifyCall(cId); /* back to former service */
break;
}
break;
case( DS_MDF_REQ ):
ccShrdPrm.datStat = DS_IDL;
psaCC_ModifyCall(cId);
break;
}
break;
}
#endif /* of #ifdef FAX_AND_DATA */
}
#endif /* DTI */
#ifdef FF_FAX
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_RA_Modified |
+-------------------------------------------------------------------+
PURPOSE : RA entity modified after CMM
*/
#ifdef DTI
GLOBAL void cmhCC_RA_Modified ( SHORT cId )
{
#ifdef FAX_AND_DATA
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
TRACE_FUNCTION ("cmhCC_RA_Modified()");
if( calltype EQ FAX_CALL )
{
/* only in case of a fax call */
if( ccShrdPrm.datStat EQ DS_TCH_MDF )
{
ccShrdPrm.datStat = DS_ACT;
if( cmhT30_Modify() NEQ AT_EXCT )
{
ccShrdPrm.datStat = DS_DSC_REQ;
cmhRA_Deactivate ();
}
}
}
#endif /* of #ifdef FAX_AND_DATA */
}
#endif /* DTI */
#endif /* FF_FAX */
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_L2R_or_TRA_Activated |
+-------------------------------------------------------------------+
PURPOSE : L2R entity activated, data path established
*/
#ifdef DTI
GLOBAL void cmhCC_L2R_or_TRA_Activated ( T_DTI_ENTITY_ID activated_module, SHORT cId )
{
#ifdef FAX_AND_DATA
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
TRACE_FUNCTION ("cmhCC_L2R_or_TRA_Activated()");
if (!psaCC_ctbIsValid (cId))
{
/*
* If for some no good reason we got a L2R_CONNECT_CNF, L2R_CONNECT_IND
* or TRA_ACTIVATE_CNF without having a valid entry in the call table,
* we do here the same as for the FAX case where those events are also
* unexpected. We send the respective deativation request.
*/
TRACE_ERROR ("Call table entry disappeared");
ccShrdPrm.datStat = DS_DSC_REQ;
switch( activated_module )
{
case( DTI_ENTITY_TRA ):
psaTRA_Deactivate();
break;
case( DTI_ENTITY_L2R ):
cmhL2R_Deactivate();
break;
default: /* Unexpected to happen */
break;
}
return;
}
cmdBuf = ctb->curCmd;
srcBuf = ctb->curSrc;
pCCCmdPrm = &cmhPrm[srcBuf].ccCmdPrm;
switch( calltype )
{
case( TRANS_CALL ):
case( NON_TRANS_CALL ):
#ifdef CO_UDP_IP
case( UDPIP_CALL ):
#endif /* CO_UDP_IP */
#ifdef FF_TCP_IP
case( PPP_CALL ):
#endif
#if defined(FF_GPF_TCPIP)
case (TCPIP_CALL):
#endif /* FF_GPF_TCPIP */
switch( ccShrdPrm.datStat )
{
case( DS_ACT_REQ ):
ccShrdPrm.datStat = DS_ACT;
cmhCC_PrepareCmdEnd (cId, NULL, NULL);
/* reset CMOD to single mode */
ccShrdPrm.CMODmode = CMOD_MOD_Single;
/* check if connect is expected */
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if( pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */
{
R_AT( RAT_CR, srcBuf )
(cmhCC_GetSrvType (&ctb->BC[ctb->curBC]));
R_AT( RAT_ILRR, srcBuf )
(cmhCC_GetDataRate (&ctb->BC[ctb->curBC]),
cmhCC_GetFormat (&ctb->BC[ctb->curBC]),
cmhCC_GetParity (&ctb->BC[ctb->curBC]));
#if defined (CO_UDP_IP) AND defined (FF_GPF_TCPIP)
if ( (calltype NEQ UDPIP_CALL) AND (calltype NEQ TCPIP_CALL) )
#endif
#if defined (CO_UDP_IP) AND !defined(FF_GPF_TCPIP)
if (calltype NEQ UDPIP_CALL)
#endif
#if defined (FF_GPF_TCPIP) AND !defined(CO_UDP_IP)
if (calltype NEQ TCPIP_CALL)
#endif
#ifdef FF_TCP_IP
if (calltype NEQ PPP_CALL)
#endif /* FF_TCP_IP */
{
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
if (!cmhSAT_OpChnChckCSD( TPL_NONE))
#endif /* of SIM_TOOLKIT AND FF_SAT_E*/
{
R_AT( RAT_CONNECT, srcBuf )
(cmdBuf, cmhCC_GetDataRate(&ctb->BC[ctb->curBC]), cId+1, FALSE);
}
}
/* log result */
cmh_logRslt ( srcBuf, RAT_CONNECT,
cmdBuf, (SHORT)(cId+1),
cmhCC_GetDataRate(&ctb->BC[ctb->curBC]), -1 );
switch( activated_module )
{
case( DTI_ENTITY_TRA ):
if (IS_SRC_BT(srcBuf))
{
T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_BLUETOOTH, DTI_ENTITY_TRA};
UBYTE dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT);
dti_cntrl_est_dpath ( dti_id,
entity_list,
2,
SPLIT,
TRA_connect_dti_cb);
}
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
if (cmhSAT_OpChnChckCSD( TPL_NONE))
{
cmhSAT_OpChnSIMCnctReq( DTI_ENTITY_TRA );
}
#endif /* of SIM_TOOLKIT AND FF_SAT_E */
else
{
T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_TRA};
dti_cntrl_est_dpath_indirect ( srcBuf,
entity_list,
1,
SPLIT,
TRA_connect_dti_cb,
DTI_CPBLTY_SER,
DTI_CID_NOTPRESENT);
}
break;
case( DTI_ENTITY_L2R ):
#ifdef CO_UDP_IP
if ( calltype EQ UDPIP_CALL )
{
UBYTE dti_id;
T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_IP, DTI_ENTITY_PPPC, DTI_ENTITY_L2R};
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
if ( satShrdPrm.opchStat EQ OPCH_EST_REQ )
dti_id = simShrdPrm.sat_class_e_dti_id;
else
#endif /* SIM_TOOLKIT AND FF_SAT_E */
dti_id = wap_dti_id;
dti_cntrl_est_dpath ( dti_id,
entity_list,
3,
APPEND,
IP_UDP_connect_dti_cb);
break;
}
#endif /* CO_UDP_IP */
#if defined (FF_TCP_IP) AND defined (DTI)
if ( calltype EQ PPP_CALL )
{
T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_PPPC, DTI_ENTITY_L2R};
dti_cntrl_est_dpath_indirect ( srcBuf,
entity_list,
2,
SPLIT,
L2R_connect_dti_cb,
DTI_CPBLTY_PKT,
DTI_CID_NOTPRESENT);
break;
}
#endif /* FF_TCP_IP */
#ifdef FF_GPF_TCPIP
if ( calltype EQ TCPIP_CALL )
{
UBYTE dti_id;
T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_TCPIP, DTI_ENTITY_PPPC, DTI_ENTITY_L2R};
/* create a WAP DTI if not present */
if (wap_dti_id EQ DTI_DTI_ID_NOTPRESENT)
{
wap_dti_id = dti_cntrl_new_dti (DTI_DTI_ID_NOTPRESENT);
TRACE_EVENT_P1("tcpip_wap_dti_id = %d", wap_dti_id);
}
dti_id = wap_dti_id;
dti_cntrl_est_dpath ( dti_id,
entity_list,
3,
SPLIT,
TCPIP_connect_dti_cb);
break;
}
#endif /* FF_GPF_TCPIP */
#if defined (SIM_TOOLKIT) AND defined (FF_SAT_E)
if (cmhSAT_OpChnChckCSD( TPL_NONE))
{
cmhSAT_OpChnSIMCnctReq( DTI_ENTITY_L2R );
}
#endif /* of SIM_TOOLKIT AND FF_SAT_E */
#ifdef DTI
if (IS_SRC_BT(srcBuf))
{
T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_BLUETOOTH, DTI_ENTITY_L2R};
UBYTE dti_id = dti_cntrl_new_dti(DTI_DTI_ID_NOTPRESENT);
dti_cntrl_est_dpath ( dti_id,
entity_list,
2,
SPLIT,
L2R_connect_dti_cb);
}
else
{
T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_L2R};
dti_cntrl_est_dpath_indirect ( srcBuf,
entity_list,
1,
SPLIT,
L2R_connect_dti_cb,
DTI_CPBLTY_SER,
DTI_CID_NOTPRESENT);
}
#endif /* DTI */
break;
} /* switch( activated_module ) */
} /* if( pCCCmdPrm -> mltyCncFlg EQ 0 ) */
} /* if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg))) */
break;
case( DS_REST_REQ ):
ccShrdPrm.datStat = DS_ACT;
break;
}
break;
/* in case of a fax call */
case( FAX_CALL ):
TRACE_EVENT( "UNEXP BEARER SERV FAX" );
ccShrdPrm.datStat = DS_DSC_REQ;
switch( activated_module )
{
case( DTI_ENTITY_TRA ):
psaTRA_Deactivate();
break;
case( DTI_ENTITY_L2R ):
cmhL2R_Deactivate();
break;
}
break;
}
#endif /* of #ifdef FAX_AND_DATA */
}
#endif /* UART */
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_L2R_or_TRA_Deactivated |
+-------------------------------------------------------------------+
PURPOSE : L2R entity deactivated, data path disconnected
*/
#ifdef UART
GLOBAL void cmhCC_L2R_or_TRA_Deactivated ( SHORT cId )
{
#ifdef FAX_AND_DATA
UBYTE srcBuf;
#ifdef DTI
T_DTI_CNTRL dti_cntrl_info;
#endif /* DTI */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
/* if there is a redirection get proper source */
#ifdef DTI
if (dti_cntrl_get_info_from_dti_id(raShrdPrm.dti_id, &dti_cntrl_info))
{
srcBuf = dti_cntrl_info.src_id;
}
else /* if it is not a valid dti_id - take stored src_id */
{
TRACE_EVENT_P2("No valid dti_id:%d taking owner:%d",
raShrdPrm.dti_id,
raShrdPrm.owner);
#endif /* DTI */
srcBuf = raShrdPrm.owner;
#ifdef DTI
}
/* reset ra dti_id storage */
raShrdPrm.dti_id = NOT_PRESENT_8BIT;
#endif /* DTI */
TRACE_FUNCTION ("cmhCC_L2R_or_TRA_Deactivated()");
io_setDCD (srcBuf, IO_DCD_OFF);
switch( calltype )
{
case( TRANS_CALL ):
case( NON_TRANS_CALL ):
#ifdef CO_UDP_IP
case( UDPIP_CALL ):
#endif /* CO_UDP_IP */
#ifdef FF_TCP_IP
case( PPP_CALL ):
#endif
#if defined(FF_GPF_TCPIP)
case (TCPIP_CALL):
#endif /* FF_GPF_TCPIP */
switch( ccShrdPrm.datStat )
{
case( DS_ACT ):
case( DS_ACT_REQ ):
case( DS_DSC_REQ ):
case( DS_MDF_REQ ):
case( DS_STOP_REQ ):
cmhRA_Deactivate ();
break;
}
break;
case( FAX_CALL ):
TRACE_EVENT( "UNEXP BEARER SERV FAX" );
ccShrdPrm.datStat = DS_DSC_REQ;
cmhRA_Deactivate();
break;
}
#endif /* of #ifdef FAX_AND_DATA */
}
#endif /* UART */
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_L2R_Failed |
+-------------------------------------------------------------------+
PURPOSE : L2R entity failure
*/
GLOBAL void cmhCC_L2R_Failed ( void )
{
#ifdef FAX_AND_DATA
SHORT cId = raShrdPrm.cId; /* holds call identifier */
T_CC_CALL_TYPE calltype;
TRACE_FUNCTION ("cmhCC_L2R_Failed()");
calltype = cmhCC_getcalltype(cId);
switch( calltype )
{
case( NON_TRANS_CALL ):
switch( ccShrdPrm.datStat )
{
case( DS_ACT_REQ ):
if( psaCC_ctbIsValid (cId) AND
psaCC_ctb(cId)->calStat EQ CS_MDF_REQ )
{
ccShrdPrm.datStat = DS_ABO_REQ;
}
/*lint -fallthrough*/
case( DS_ACT ):
case( DS_REST_REQ ):
cmhL2R_Deactivate ();
break;
}
break;
case( FAX_CALL ):
TRACE_EVENT( "UNEXP BEARER SERV FAX" );
ccShrdPrm.datStat = DS_DSC_REQ;
cmhL2R_Deactivate();
break;
}
#endif /* of #ifdef FAX_AND_DATA */
}
#ifdef FF_FAX
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_T30_Activated |
+-------------------------------------------------------------------+
PURPOSE : T30 entity activated, data path established
*/
GLOBAL void cmhCC_T30_Activated ( void )
{
#if defined (FAX_AND_DATA) AND defined (DTI)
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE cmdBuf; /* buffers current command */
SHORT cId = t30ShrdPrm.cId; /* holds call identifier */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
TRACE_FUNCTION ("cmhCC_T30_Activated()");
pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->calOwn].ccCmdPrm;
cmdBuf = psaCC_ctb(cId)->curCmd;
switch( calltype )
{
case( FAX_CALL ):
switch( ccShrdPrm.datStat )
{
case( DS_ACT_REQ ):
ccShrdPrm.datStat = DS_ACT;
/* reset CMOD to single mode */
ccShrdPrm.CMODmode = CMOD_MOD_Single;
if( psaCC_ctb(cId)->calType EQ CT_MTC )
{
cmhT30_SendCaps( psaCC_ctb(cId)->curSrc, FRT_DIS );
}
break;
}
break;
/* in case of a asynchronous call */
case( TRANS_CALL ):
case( NON_TRANS_CALL ):
TRACE_EVENT( "UNEXP BEARER SERV ASYNC" );
ccShrdPrm.datStat = DS_DSC_REQ;
cmhT30_Deactivate();
break;
}
#endif /* of #ifdef FAX_AND_DATA */
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_T30_Deactivated |
+-------------------------------------------------------------------+
PURPOSE : T30 entity deactivated, data path disconnected
*/
GLOBAL void cmhCC_T30_Deactivated ( void )
{
#ifdef FAX_AND_DATA
SHORT cId = t30ShrdPrm.cId; /* holds call identifier */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
TRACE_FUNCTION ("cmhCC_T30_Deactivated()");
switch( calltype )
{
case( FAX_CALL ):
switch( ccShrdPrm.datStat )
{
case( DS_ACT ):
case( DS_ACT_REQ ):
case( DS_DSC_REQ ):
case( DS_MDF_REQ ):
case( DS_STOP_REQ ):
case( DS_TCH_MDF ):
cmhRA_Deactivate ();
break;
}
break;
/* in case of a asynchronous data call */
case( TRANS_CALL ):
case( NON_TRANS_CALL ):
TRACE_EVENT( "UNEXP BEARER SERV ASYNC" );
ccShrdPrm.datStat = DS_DSC_REQ;
cmhRA_Deactivate();
break;
}
#endif /* of #ifdef FAX_AND_DATA */
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_T30_Failed |
+-------------------------------------------------------------------+
PURPOSE : T30 entity failure
*/
GLOBAL void cmhCC_T30_Failed ( void )
{
#if defined FAX_AND_DATA AND defined (DTI)
SHORT cId = t30ShrdPrm.cId; /* holds call identifier */
T_CC_CALL_TYPE calltype = cmhCC_getcalltype(cId);
TRACE_FUNCTION ("cmhCC_T30_Failed()");
switch( calltype )
{
case( FAX_CALL ):
switch( ccShrdPrm.datStat )
{
case( DS_ACT_REQ ):
if( psaCC_ctb(cId)->calStat EQ CS_MDF_REQ )
{
ccShrdPrm.datStat = DS_ABO_REQ;
}
/*lint -fallthrough*/
case( DS_ACT ):
case( DS_REST_REQ ):
case( DS_TCH_MDF ):
cmhT30_Deactivate ();
break;
}
break;
/* in case of a asynchronous data call */
case( TRANS_CALL ):
case( NON_TRANS_CALL ):
TRACE_EVENT( "UNEXP BEARER SERV ASYNC" );
ccShrdPrm.datStat = DS_DSC_REQ;
cmhT30_Deactivate();
break;
}
#endif /* of #ifdef FAX_AND_DATA */
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_T30_RmtCaps |
+-------------------------------------------------------------------+
PURPOSE : T30 remote capability indication
*/
GLOBAL void cmhCC_T30_RmtCaps ( void )
{
#ifdef FAX_AND_DATA
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE cmdBuf; /* buffers current command */
UBYTE srcBuf; /* buffers current command source */
SHORT cId = t30ShrdPrm.cId; /* holds call identifier */
TRACE_FUNCTION ("cmhCC_T30_RmtCaps()");
/*
*-------------------------------------------------------------------
* check if connect is expected
*-------------------------------------------------------------------
*/
pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if( pCCCmdPrm -> mltyCncFlg EQ 0 ) /* if last call */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
#endif /* of #ifdef FAX_AND_DATA */
}
#endif /* FF_FAX */
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_MPTYBuild |
+-------------------------------------------------------------------+
PURPOSE : Multiparty successful build.
*/
GLOBAL void cmhCC_MPTYBuild( SHORT cId,
T_BUILD_MPTY_RES *bldMPTY )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE ctbIdx; /* holds call table index */
UBYTE cmdBuf; /* buffers command */
UBYTE srcBuf; /* buffers command source */
TRACE_FUNCTION ("cmhCC_MPTYBuild()");
TIMERSTOP( ACI_TMPTY );
if( ctb->curCmd NEQ AT_CMD_CHLD )
return; /* wrong command context */
/* set multiparty status for involved calls */
for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if (ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
(psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT_REQ OR
psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT ))
{
psaCC_ctb(ctbIdx)->mptyStat = CS_ACT;
psaCC_ctb(ctbIdx)->calStat = CS_ACT;
}
}
pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
psaCC_MPTY (cId, MPTY_BUILD_SUCCESS);
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_MPTYSplit |
+-------------------------------------------------------------------+
PURPOSE : Multiparty successful split.
*/
GLOBAL void cmhCC_MPTYSplit( SHORT cId,
T_SPLIT_MPTY_RES *splMPTY )
{
T_CC_CALL_TBL *ctb = ccShrdPrm.ctb[cId];
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE ctbIdx; /* holds call table index */
UBYTE cmdBuf; /* buffers command */
UBYTE srcBuf; /* buffers command source */
UBYTE fndCId; /* holds call id of found call */
UBYTE fndCal; /* holds number of found calls */
TRACE_FUNCTION ("cmhCC_MPTYSplit()");
TIMERSTOP( ACI_TMPTY );
if( ctb->curCmd NEQ AT_CMD_CHLD )
return; /* wrong command context */
/* set status for involved calls */
for( fndCal = 0, ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT AND
ctbIdx NEQ cId )
{
psaCC_ctb(ctbIdx)->calStat = CS_HLD;
fndCal++;
fndCId = ctbIdx;
}
}
/* if only one other call is left, reset multiparty status */
/* if only one other call is left, do not reset multiparty status - VO patch
if( fndCal EQ 1 )
{
psaCC_ctb(fndCId)->mptyStat = CS_IDL;
}
*/
pCCCmdPrm = &cmhPrm[ctb->curSrc].ccCmdPrm;
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
ctb->calStat = CS_ACT;
ctb->mptyStat = CS_IDL;
psaCC_MPTY (cId, MPTY_SPLIT_SUCCESS);
psaCC_setSpeechMode (); /* In case we split from a held mpty */
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_MPTYHeld |
+-------------------------------------------------------------------+
PURPOSE : Multiparty successful held.
*/
GLOBAL void cmhCC_MPTYHeld( SHORT cId,
T_HOLD_MPTY_RES *hldMPTY )
{
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE ctbIdx; /* holds call table index */
UBYTE cmdBuf; /* buffers command */
UBYTE srcBuf; /* buffers command source */
TRACE_FUNCTION ("cmhCC_MPTYHeld()");
TIMERSTOP( ACI_TMPTY );
/* check for command context */
switch( psaCC_ctb(cId)->curCmd )
{
case( AT_CMD_CHLD ):
case( AT_CMD_D ):
break;
default:
return; /* wrong command context */
}
/* set call status for multiparty call member */
for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
psaCC_ctb(ctbIdx)->calStat EQ CS_HLD_REQ AND
psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT )
{
psaCC_ctb(ctbIdx)->calStat = CS_HLD;
}
}
psaCC_MPTY (cId, MPTY_HOLD_SUCCESS);
psaCC_setSpeechMode ();
pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if((pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActExc OR
pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActAndAcpt OR
pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial) AND
pCCCmdPrm -> mltyCncFlg )
{
process_CHLDaddInfo( srcBuf, MTPTY_HELD );
}
if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_MPTYRetrieved |
+-------------------------------------------------------------------+
PURPOSE : Multiparty successful retrieved.
*/
GLOBAL void cmhCC_MPTYRetrieved( SHORT cId,
T_RETRIEVE_MPTY_RES *rtvMPTY )
{
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
UBYTE ctbIdx; /* holds call table index */
UBYTE cmdBuf; /* buffers command */
UBYTE srcBuf; /* buffers command source */
TRACE_FUNCTION ("cmhCC_MPTYRetrieved()");
TIMERSTOP( ACI_TMPTY );
if( psaCC_ctb(cId)->curCmd NEQ AT_CMD_CHLD )
return; /* wrong command context */
/* set call status for multiparty call member */
for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
psaCC_ctb(ctbIdx)->calStat EQ CS_ACT_REQ AND
psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT )
{
psaCC_ctb(ctbIdx)->calStat = CS_ACT;
}
}
pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
psaCC_MPTY (cId, MPTY_RETRIEVE_SUCCESS);
psaCC_setSpeechMode ();
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if( pCCCmdPrm -> mltyCncFlg EQ 0 AND
pCCCmdPrm -> mltyDscFlg EQ 0 ) /* if last call */
{
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_NotifySS |
+-------------------------------------------------------------------+
PURPOSE : SS notification received: in preamble, some
local functions, otherwise, the function would be huge...
*/
/*
+------------------------------------------------------------------------------
| Function : cssx2I_Code_Convert
+------------------------------------------------------------------------------
| Description : This function converts CSSX codes to CSSI codes.
|
| Parameters : cssx_code - CSS(X) code
|
| Return : CSSI_CODE_ XXX - exit sucessful with CSSI_CODE_
| CSSI_CODE_NotPresent - exit not sueccessful
+------------------------------------------------------------------------------
*/
LOCAL T_ACI_CSSI_CODE cssx2I_Code_Convert(T_ACI_CSSX_CODE cssx_code)
{
T_ACI_CSSI_CODE cssi_code;
switch (cssx_code)
{
case( CSSX_CODE_ForwardedCall ):
cssi_code = CSSI_CODE_ForwardedCall;
break;
case( CSSX_CODE_CFUActive ):
cssi_code = CSSI_CODE_CFUActive;
break;
case( CSSX_CODE_SomeCCFActive ):
cssi_code = CSSI_CODE_SomeCCFActive;
break;
case( CSSX_CODE_CallWaiting ):
cssi_code = CSSI_CODE_CallWaiting;
break;
case( CSSX_CODE_OutCallsBarred ):
cssi_code = CSSI_CODE_OutCallsBarred;
break;
case( CSSX_CODE_IncCallsBarred ):
cssi_code = CSSI_CODE_IncCallsBarred;
break;
case( CSSX_CODE_CLIRSupRej ):
cssi_code = CSSI_CODE_CLIRSupRej;
break;
case( CSSX_CODE_DeflectedCall ):
cssi_code = CSSI_CODE_DeflectedCall;
break;
case( CSSX_CODE_CUGCall ):
cssi_code = CSSI_CODE_CUGCall;
break;
default:
cssi_code = CSSI_CODE_NotPresent;
break;
}
return cssi_code;
}
/*
+------------------------------------------------------------------------------
| Function : cssx2U_Code_Convert
+------------------------------------------------------------------------------
| Description : This function converts CSSX codes to CSSU codes.
|
| Parameters : cssx_code - CSS(X) code
|
| Return : CSSU_CODE_ XXX - exit sucessful with CSSU_CODE_
| CSSU_CODE_NotPresent - exit not sueccessful
+------------------------------------------------------------------------------
*/
LOCAL T_ACI_CSSU_CODE cssx2U_Code_Convert(T_ACI_CSSX_CODE cssx_code)
{
T_ACI_CSSU_CODE cssu_code;
switch (cssx_code)
{
case( CSSX_CODE_ForwardedCall ):
cssu_code = CSSU_CODE_ForwardedCall;
break;
case( CSSX_CODE_CUGCall ):
cssu_code = CSSU_CODE_CUGCall ;
break;
case( CSSX_CODE_OnHold ):
cssu_code = CSSU_CODE_OnHold;
break;
case( CSSX_CODE_Retrieved ):
cssu_code = CSSU_CODE_Retrieved;
break;
case( CSSX_CODE_Multiparty ):
cssu_code = CSSU_CODE_Multiparty;
break;
case( CSSX_CODE_HeldCallRel ):
cssu_code = CSSU_CODE_HeldCallRel;
break;
case( CSSX_CODE_FwrdCheckSS ):
cssu_code = CSSU_CODE_FwrdCheckSS;
break;
case( CSSX_CODE_ECTAlert ):
cssu_code = CSSU_CODE_ECTAlert;
break;
case( CSSX_CODE_ECTConnect ):
cssu_code = CSSU_CODE_ECTConnect;
break;
case( CSSX_CODE_DeflectedCall ):
cssu_code = CSSU_CODE_DeflectedCall;
break;
default:
cssu_code = CSSU_CODE_NotPresent;
break;
}
return cssu_code;
}
/*
+------------------------------------------------------------------------------
| Function : send_CSSX_notification
+------------------------------------------------------------------------------
| Description : This function sends CSSU and CSSI.
|
| Parameters : ctbIdx - call table index
| cssx_code - CSS(X) code
| index - Index
| *number - buffer for number
| *toa - buffers type of address
| *subaddr - buffer for subaddress
| *tos - holds type of subaddress
|
| Return :
+------------------------------------------------------------------------------
*/
GLOBAL void send_CSSX_notification(SHORT ctbIdx,
T_ACI_CSSX_CODE cssx_code,
SHORT index,
CHAR *number,
T_ACI_TOA *toa,
CHAR *subaddr,
T_ACI_TOS *tos)
{
UBYTE idx; /* holds index counter */
/* Check if CC State is CS ACT REQ */
if (ctbIdx > NO_ENTRY AND
psaCC_ctb(ctbIdx)->calStat EQ CS_ACT_REQ AND
psaCC_ctb(ctbIdx)->calType EQ CT_MOC)
{
T_ACI_CSSI_CODE cssi_code;
cssi_code = cssx2I_Code_Convert(cssx_code);
if (cssi_code != CSSI_CODE_NotPresent )
{
S8 source = psaCC_ctb(ctbIdx)->curSrc;
R_AT( RAT_CSSI, source)( cssi_code, index );
}
}
else /* (calldirection EQ CT_MTC) */
{
/* Sent CSSU TO ALL */
T_ACI_CSSU_CODE cssu_code;
cssu_code = cssx2U_Code_Convert(cssx_code);
if (cssu_code != CSSU_CODE_NotPresent )
{
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CSSU, idx )(cssu_code, index, number, toa, subaddr, tos);
}
}
}
}
LOCAL void cmhCC_NotifySS_v_ssCode( SHORT cId, T_NOTIFY_SS_INV *ntfySS )
{
CHAR numBuf[MAX_B_SUBSCR_NUM_LEN]; /* buffer for number */
T_ACI_TOA toa; /* holds type of address */
CHAR subBuf[MAX_SUBADDR_LEN]; /* buffer for subaddress */
T_ACI_TOS tos; /* holds type of subaddress */
TRACE_FUNCTION ("cmhCC_NotifySS_v_ssCode()");
switch( ntfySS -> notifySSArg.ssCode )
{
case( SS_CD_ALL_FWSS ):
case( SS_CD_CFU ):
if( ntfySS -> notifySSArg.v_ssStatus AND
ntfySS -> notifySSArg.ssStatus & SSS_A )
{
send_CSSX_notification(cId,
CSSX_CODE_CFUActive,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
break;
case( SS_CD_CFB ):
case( SS_CD_CFNRY ):
case( SS_CD_CFNRC ):
case( SS_CD_ALL_CFWSS ):
if( ntfySS -> notifySSArg.v_ssStatus AND
ntfySS -> notifySSArg.ssStatus & SSS_A )
{
send_CSSX_notification(cId,
CSSX_CODE_SomeCCFActive,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
break;
case( SS_CD_ALL_CBSS ):
if( ntfySS -> notifySSArg.v_ssStatus AND
ntfySS -> notifySSArg.ssStatus & SSS_A )
{
/* RAT_CSSI ... outgoing calls are barred */
/* RAT_CSSI ... incoming calls are barred */
send_CSSX_notification(cId,
CSSX_CODE_OutCallsBarred,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
send_CSSX_notification(cId,
CSSX_CODE_IncCallsBarred,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
break;
case( SS_CD_BOC ):
case( SS_CD_BAOC ):
case( SS_CD_BOIC ):
case( SS_CD_BOICXH ):
if( ntfySS -> notifySSArg.v_ssStatus AND
ntfySS -> notifySSArg.ssStatus & SSS_A )
{
/* RAT_CSSI ... outgoing calls are barred */
send_CSSX_notification(cId,
CSSX_CODE_OutCallsBarred,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
break;
case( SS_CD_BIC ):
case( SS_CD_BAIC ):
case( SS_CD_BICRM ):
if( ntfySS -> notifySSArg.v_ssStatus AND
ntfySS -> notifySSArg.ssStatus & SSS_A )
{
/* RAT_CSSI ... incoming calls are barred */
send_CSSX_notification(cId,
CSSX_CODE_IncCallsBarred,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
break;
case( SS_CD_CD ):
if (ntfySS->notifySSArg.v_ssNotification AND
ntfySS->notifySSArg.ssNotification.fwdSubscriber EQ
FWD_C_INC_CALL_FWD)
{
/*
* If alerting is allowed now, send the CSSU indication.
* Otherwise just remember that we got this notification.
*/
if ((ccShrdPrm.TCHasg EQ TRUE) OR
(psaCC_ctb(cId)->sigInf NEQ SIG_NOT_PRES))
{
/*
* The conditions for user alerting are fulfilled.
* Send the +CSSU: unsolicited result code now.
*/
send_CSSX_notification(cId,
CSSX_CODE_DeflectedCall,
ACI_NumParmNotPresent,
psaCC_ctbRdrAdr2Num (cId, numBuf, sizeof (numBuf)),
cmhCC_ctbGetRdrNumTyp (cId, &toa),
psaCC_ctbRdrAdr2Sub (cId, subBuf),
cmhCC_ctbGetRdrSubTyp (cId, &tos));
psaCC_FreeRdrPty (cId);
psaCC_ctb(cId)->CDStat = NO_VLD_CD;
}
else
{
/*
* Indication of the MT call towards the MMI is deferred until
* the alerting conditions are fulfilled (TCH assignment).
*/
psaCC_ctb(cId)->CDStat = CD_Notified;
}
return;
}
if (ntfySS->notifySSArg.v_ssNotification AND
ntfySS->notifySSArg.ssNotification.clgSubscriber EQ
CLG_A_OUTG_CALL_FWD_C)
{
/* RAT_CSSI ... outgoing call has been deflected */
send_CSSX_notification(cId,
CSSX_CODE_DeflectedCall,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
break;
default:
TRACE_EVENT( "UNHANDLED SS-CODE IN NOTIFY" );
break;
}
}
LOCAL void cmhCC_NotifySS_v_ssNotification( SHORT cId, T_NOTIFY_SS_INV *ntfySS )
{
TRACE_FUNCTION ("cmhCC_NotifySS_v_ssNotification()");
if( ntfySS -> notifySSArg.ssNotification.clgSubscriber EQ
CLG_A_OUTG_CALL_FWD_C )
{
/* RAT_CSSI ... outgoing call has been forwarded */
send_CSSX_notification(cId,
CSSX_CODE_ForwardedCall,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
if( ntfySS -> notifySSArg.ssNotification.fwgSubscriber EQ
FWG_B_INC_CALL_FWD_C )
{
/* RAT_CSSU ... this is a forwarded call */
send_CSSX_notification(cId,
CSSX_CODE_ForwardedCall,
ACI_NumParmNotPresent ,
NULL, NULL, NULL, NULL);
}
if( ntfySS -> notifySSArg.ssNotification.fwdSubscriber EQ
FWD_C_INC_CALL_FWD )
{
/* RAT_CSSU ... this is a forwarded call */
send_CSSX_notification(cId,
CSSX_CODE_ForwardedCall,
ACI_NumParmNotPresent ,
NULL, NULL, NULL, NULL);
}
}
LOCAL void cmhCC_NotifySS_v_ectIndicator( SHORT cId, T_NOTIFY_SS_INV *ntfySS )
{
CHAR numBuf[MAX_B_SUBSCR_NUM_LEN]; /* buffer for number */
T_ACI_TOA toa; /* holds type of address */
CHAR subBuf[MAX_SUBADDR_LEN]; /* buffer for subaddress */
T_ACI_TOS tos; /* holds type of subaddress */
BOOL numFlg = FALSE; /* flags a present number */
BOOL subFlg = FALSE; /* flags a present subaddress */
TRACE_FUNCTION ("cmhCC_NotifySS_v_ectIndicator()");
/* note that according to GSM 04.91, indications without RDN are
possible but not without ectCallState */
if( ntfySS -> notifySSArg.ectIndicator.v_ectCallState )
{
/* (G)ACI-FIX-1415 */
if(ntfySS -> notifySSArg.ectIndicator.v_rdn )
{
if( ntfySS -> notifySSArg.ectIndicator.
rdn.v_presentationAllowedAddress )
{
if( ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.v_partyNumber AND
ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partyNumber.c_bcdDigit )
{
utl_BCD2DialStr
(ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partyNumber.bcdDigit,
numBuf,
ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partyNumber.c_bcdDigit);
toa.npi = ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partyNumber.npi;
toa.ton = ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partyNumber.noa;
numFlg = TRUE;
}
if( ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.v_partySubaddress AND
ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partySubaddress.c_bcdDigit )
{
utl_BCD2DialStr
(ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partySubaddress.bcdDigit,
subBuf,
ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partySubaddress.c_bcdDigit);
tos.tos = ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partySubaddress.tos;
tos.oe = ntfySS -> notifySSArg.ectIndicator.
rdn.presentationAllowedAddress.partySubaddress.oei;
subFlg = TRUE;
}
}
/* check if the override case occured, do present RDN, (G)ACI-FIX-1434 */
/* if presentationAllowedAddress is present then it is obsolete to look
at presentationRestrictedAddress */
else if( ntfySS -> notifySSArg.ectIndicator.
rdn.v_presentationRestrictedAddress )
{
if( ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.v_partyNumber AND
ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partyNumber.c_bcdDigit )
{
utl_BCD2DialStr
(ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partyNumber.bcdDigit,
numBuf,
ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partyNumber.c_bcdDigit);
toa.npi = ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partyNumber.npi;
toa.ton = ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partyNumber.noa;
numFlg = TRUE;
}
if( ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.v_partySubaddress AND
ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partySubaddress.c_bcdDigit )
{
utl_BCD2DialStr
(ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partySubaddress.bcdDigit,
subBuf,
ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partySubaddress.c_bcdDigit);
tos.tos = ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partySubaddress.tos;
tos.oe = ntfySS -> notifySSArg.ectIndicator.
rdn.presentationRestrictedAddress.partySubaddress.oei;
subFlg = TRUE;
}
}
}
switch( ntfySS -> notifySSArg.ectIndicator.ectCallState )
{
case( ECT_CS_ALERTING ):
/* RAT_CSSU ... ECT alerting */
send_CSSX_notification(cId,
CSSX_CODE_ECTAlert,
ACI_NumParmNotPresent,
(numFlg)?numBuf:NULL,
(numFlg)?&toa:NULL,
(subFlg)?subBuf:NULL,
(subFlg)?&tos:NULL);
break;
case( ECT_CS_ACTIVE ):
/* RAT_CSSU ... ECT active */
send_CSSX_notification(cId,
CSSX_CODE_ECTConnect,
ACI_NumParmNotPresent,
(numFlg)?numBuf:NULL,
(numFlg)?&toa:NULL,
(subFlg)?subBuf:NULL,
(subFlg)?&tos:NULL);
break;
}
}
}
LOCAL void cmhCC_NotifySS_v_ccbsf( T_NOTIFY_SS_INV *ntfySS )
{
T_ACI_CCBS_SET ccbsSet; /* holds ccbs setting */
TRACE_FUNCTION ("cmhCC_NotifySS_v_ccbsf()");
if( ntfySS -> notifySSArg.ccbsf.v_ccbsIndex )
{
ccbsSet.idx = ntfySS -> notifySSArg.ccbsf.ccbsIndex;
}
else
ccbsSet.idx = ACI_NumParmNotPresent;
if( ntfySS -> notifySSArg.ccbsf.v_b_subscriberNumber AND
ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.c_bcdDigit)
{
utl_BCD2DialStr
(ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.bcdDigit,
ccbsSet.number,
ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.c_bcdDigit);
ccbsSet.type.npi = ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.npi;
ccbsSet.type.ton = ntfySS -> notifySSArg.ccbsf.b_subscriberNumber.noa;
}
else
{
ccbsSet.number[0] = 0x0;
ccbsSet.type.npi = NPI_NotPresent;
ccbsSet.type.ton = TON_NotPresent;
}
if( ntfySS -> notifySSArg.ccbsf.v_b_subscriberSubaddress AND
ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.c_bcdDigit)
{
utl_BCD2DialStr
(ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.bcdDigit,
ccbsSet.subaddr,
ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.c_bcdDigit);
ccbsSet.satype.tos = ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.tos;
ccbsSet.satype.oe = ntfySS -> notifySSArg.ccbsf.b_subscriberSubaddress.oei;
}
else
{
ccbsSet.subaddr[0] = 0x0;
ccbsSet.satype.tos = TOS_NotPresent;
ccbsSet.satype.oe = OE_NotPresent;
}
if( ntfySS -> notifySSArg.ccbsf.v_basicServiceGroup )
ccbsSet.class_type = cmhSS_GetClass( (T_basicService*)&ntfySS -> notifySSArg.ccbsf.
basicServiceGroup );
else
ccbsSet.class_type = CLASS_NotPresent;
if( ntfySS -> notifySSArg.v_alertingPattern )
{
ccbsSet.alrtPtn = ntfySS -> notifySSArg.alertingPattern;
}
else
{
ccbsSet.alrtPtn = ALPT_NotPresent;
}
cmhrat_ccbs( CMD_SRC_MAX, CCBS_IND_Recall,
CCBS_STAT_NotPresent, &ccbsSet );
}
GLOBAL void cmhCC_NotifySS( SHORT cId, T_NOTIFY_SS_INV *ntfySS )
{
UBYTE idx; /* holds index counter */
T_callingName *NameId; /* holds Name Identifier for CNAP */
TRACE_FUNCTION ("cmhCC_NotifySS()");
/* check SS code */
if( ntfySS -> notifySSArg.v_ssCode )
{
cmhCC_NotifySS_v_ssCode( cId, ntfySS );
}
/* check SS notification */
if( ntfySS -> notifySSArg.v_ssNotification )
{
cmhCC_NotifySS_v_ssNotification( cId, ntfySS );
}
/* check call is waiting indicator */
if( ntfySS -> notifySSArg.v_callIsWaitingIndicator )
{
/* RAT_CSSI ... call is waiting */
send_CSSX_notification(cId,
CSSX_CODE_CallWaiting,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
/* check call on hold indicator */
if( ntfySS -> notifySSArg.v_callOnHoldIndicator )
{
switch( ntfySS -> notifySSArg.callOnHoldIndicator )
{
case( CHLD_CALL_RETRIEVED ):
send_CSSX_notification(cId,
CSSX_CODE_Retrieved,
ACI_NumParmNotPresent ,
NULL, NULL, NULL, NULL);
break;
case( CHLD_CALL_ON_HOLD ):
/* RAT_CSSU ... call has been put on hold */
send_CSSX_notification(cId,
CSSX_CODE_OnHold,
ACI_NumParmNotPresent ,
NULL, NULL, NULL, NULL);
break;
}
}
/* check multparty indicator */
if( ntfySS -> notifySSArg.v_mptyIndicator )
{
/* If the Call is on hold and a SS_Notify with a MPTY
the state shall change from CS_HOLD to CS_ACT */
psaCC_ctb(cId)->calStat = CS_ACT;
/* mptyStat equal to CS_ACT_REQ set it to CS_ACT
required to place multiparty call on hold */
if(psaCC_ctb(cId)->mptyStat EQ CS_ACT_REQ)
{
psaCC_ctb(cId)->mptyStat = CS_ACT;
}
/* RAT_CSSU ... multiparty call entered */
send_CSSX_notification(cId,
CSSX_CODE_Multiparty,
ACI_NumParmNotPresent ,
NULL, NULL, NULL, NULL);
}
/* check CUG index */
if( ntfySS -> notifySSArg.v_cugIndex )
{
send_CSSX_notification(cId,
CSSX_CODE_CUGCall,
ntfySS -> notifySSArg.cugIndex,
NULL, NULL, NULL, NULL);
}
/* check CLIR suppression */
if( ntfySS -> notifySSArg.v_clirSuppressionRejected )
{
/* RAT_CSSI ... CLIR suppression rejected */
send_CSSX_notification(cId,
CSSX_CODE_CLIRSupRej,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
/* check ECT indicator */
if( ntfySS -> notifySSArg.v_ectIndicator )
{
cmhCC_NotifySS_v_ectIndicator( cId, ntfySS );
}
/* check CNAP indicator */
if( ntfySS -> notifySSArg.v_nameIndicator )
{
if ( ntfySS -> notifySSArg.nameIndicator.v_callingName )
{
NameId = &(ntfySS -> notifySSArg.nameIndicator.callingName);
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
R_AT( RAT_CNAP, idx )
( NameId, CNAP_SERVICE_STATUS_NOT_PRESENT);
}
}
}
/* check CCBS feature */
if( ntfySS -> notifySSArg.v_ccbsf )
{
cmhCC_NotifySS_v_ccbsf( ntfySS );
}
}
/*
+------------------------------------------------------------------------------
| Function : cmhCC_CheckSS
+------------------------------------------------------------------------------
| Description : check SS indication received.
|
| Parameters : cId -
|
| Return :
+------------------------------------------------------------------------------
*/
GLOBAL void cmhCC_CheckSS( SHORT cId )
{
UBYTE idx; /* holds index counter */
TRACE_FUNCTION ("cmhCC_CheckSS()");
/*
*-------------------------------------------------------------------
* indicate check SS
*-------------------------------------------------------------------
*/
/* RAT_CSSU ... forward check SS indication */
for( idx = 0; idx < CMD_SRC_MAX; idx++ )
{
send_CSSX_notification( cId,
CSSX_CODE_FwrdCheckSS,
ACI_NumParmNotPresent,
NULL, NULL, NULL, NULL);
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CCBSRegistered |
+-------------------------------------------------------------------+
PURPOSE : call completion to busy subscriber successfully registered.
*/
GLOBAL void cmhCC_CCBSRegistered( SHORT cId,
T_ACC_REGISTER_CC_ENTRY_RES *CCBSreg )
{
UBYTE cmdBuf; /* buffers command */
UBYTE srcBuf; /* buffers command source */
T_ACI_CCBS_SET ccbsSet; /* holds ccbs setting */
TRACE_FUNCTION ("cmhCC_CCBSRegistered()");
/* check for command context */
if( psaCC_ctb(cId)->curCmd NEQ AT_CMD_CHLD )
{
TRACE_EVENT("cmhCC_CCBSRegistered: wrong command context !");
return;
}
if( CCBSreg->accRegisterCCEntryRes.v_ccbsf )
{
if( CCBSreg->accRegisterCCEntryRes.ccbsf.v_ccbsIndex )
ccbsSet.idx = CCBSreg->accRegisterCCEntryRes.ccbsf.ccbsIndex;
else
ccbsSet.idx = ACI_NumParmNotPresent;
if( CCBSreg->accRegisterCCEntryRes.ccbsf.
v_b_subscriberNumber AND
CCBSreg->accRegisterCCEntryRes.ccbsf.
b_subscriberNumber.c_bcdDigit)
{
utl_BCD2DialStr
(CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberNumber.
bcdDigit,
ccbsSet.number,
CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberNumber.
c_bcdDigit);
ccbsSet.type.npi = CCBSreg->accRegisterCCEntryRes.ccbsf.
b_subscriberNumber.npi;
ccbsSet.type.ton = CCBSreg->accRegisterCCEntryRes.ccbsf.
b_subscriberNumber.noa;
}
else
{
ccbsSet.number[0] = 0x0;
ccbsSet.type.npi = NPI_NotPresent;
ccbsSet.type.ton = TON_NotPresent;
}
if( CCBSreg->accRegisterCCEntryRes.ccbsf.
v_b_subscriberSubaddress AND
CCBSreg->accRegisterCCEntryRes.ccbsf.
b_subscriberSubaddress.c_bcdDigit)
{
utl_BCD2DialStr
(CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberSubaddress.
bcdDigit,
ccbsSet.subaddr,
CCBSreg->accRegisterCCEntryRes.ccbsf.b_subscriberSubaddress.
c_bcdDigit);
ccbsSet.satype.tos = CCBSreg->accRegisterCCEntryRes.ccbsf.
b_subscriberSubaddress.tos;
ccbsSet.satype.oe = CCBSreg->accRegisterCCEntryRes.ccbsf.
b_subscriberSubaddress.oei;
}
else
{
ccbsSet.subaddr[0] = 0x0;
ccbsSet.satype.tos = TOS_NotPresent;
ccbsSet.satype.oe = OE_NotPresent;
}
if( CCBSreg->accRegisterCCEntryRes.ccbsf.v_basicServiceGroup )
ccbsSet.class_type = cmhSS_GetClass( (T_basicService*)&CCBSreg->accRegisterCCEntryRes.
ccbsf.basicServiceGroup );
else
ccbsSet.class_type = CLASS_NotPresent;
ccbsSet.alrtPtn = ALPT_NotPresent;
}
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
cmhCC_tstAndUnflagCall( cId, &(cmhPrm[srcBuf].ccCmdPrm.mltyDscFlg));
psaCC_FreeCtbNtry (cId);
cmhrat_ccbs( srcBuf, CCBS_IND_Registered,
CCBS_STAT_NotPresent, &ccbsSet );
R_AT( RAT_OK, srcBuf ) ( cmdBuf );
/* log result */
cmh_logRslt ( srcBuf, RAT_OK,
cmdBuf, (SHORT)(cId+1), -1, -1 );
}
/* sends RAT_CCBS: sometimes it is an intermediate result, and sometimes it is an
indication.
When srcId = CMD_SRC_MAX, it is an indication and shall go to all sources...
Otherwise, only to the source specified... */
GLOBAL void cmhrat_ccbs( UBYTE srcId,
T_ACI_CCBS_IND ccbs_ind,
T_ACI_CCBS_STAT status,
T_ACI_CCBS_SET *setting )
{
UBYTE idx;
if( srcId EQ CMD_SRC_MAX )
{
#if defined MFW || defined SMI OR defined FF_MMI_RIV
rAT_PercentCCBS(ccbs_ind, status, setting);
#endif
#ifdef FF_ATI
for( idx = CMD_SRC_ATI_1; idx < CMD_SRC_MAX; idx++ )
{
srcId_cb = idx;
rCI_PercentCCBS(ccbs_ind, status, setting, FALSE);
}
#endif /* FF_ATI */
return;
}
#if defined MFW || defined SMI OR defined FF_MMI_RIV
if( srcId EQ CMD_SRC_LCL )
{
rAT_PercentCCBS( ccbs_ind, status, setting );
return;
}
#endif
/* else it is an ATI source */
srcId_cb = srcId;
#ifdef FF_ATI
rCI_PercentCCBS(ccbs_ind, status, setting, TRUE);
#endif /* FF_ATI */
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_CDRegistered |
+-------------------------------------------------------------------+
PURPOSE : Call Deflection (CD) successfully registered.
*/
GLOBAL void cmhCC_CDRegistered( SHORT cId )
{
TRACE_FUNCTION ("cmhCC_CDRegistered()");
switch( psaCC_ctb(cId)->curCmd )
{
case AT_CMD_CTFR:
psaCC_ctb(cId)->CDStat = CD_Succeeded;
break;
default: /* This is unexpected or network failure, ignore the event */
break;
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_SSTransFail |
+-------------------------------------------------------------------+
PURPOSE : SS transaction failed.
*/
GLOBAL void cmhCC_SSTransFail ( SHORT cId )
{
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
SHORT ctbIdx; /* holds call table index */
SHORT addId; /* holds additional call id */
UBYTE cmdBuf; /* buffers command */
UBYTE srcBuf; /* buffers command source */
TRACE_FUNCTION ("cmhCC_SSTransFail()");
/*
*-------------------------------------------------------------------
* check for command context
*-------------------------------------------------------------------
*/
switch( psaCC_ctb(cId)->curCmd )
{
/*
*----------------------------------------------------------------
* process result for D and A command
*----------------------------------------------------------------
*/
case( AT_CMD_D ):
case( AT_CMD_A ):
/* restore call status for hold request*/
if( psaCC_ctb(cId)->calStat EQ CS_HLD_REQ )
for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
psaCC_ctb(ctbIdx)->calStat EQ CS_HLD_REQ AND
psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT )
{
psaCC_ctb(ctbIdx)->calStat = CS_ACT;
}
}
pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
cmhCC_PrepareCmdEnd (cId, &cmdBuf, &srcBuf);
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
if( pCCCmdPrm -> CHLDmode EQ CHLD_MOD_HldActDial AND
pCCCmdPrm -> mltyCncFlg )
{
for( addId = 0; !((pCCCmdPrm -> mltyCncFlg >> addId) & 0x01); addId++ )
;
if( CHLDaddInfo EQ CHLD_ADD_INFO_DIAL_CAL )
{
CHLDaddInfo = NO_CHLD_ADD_INFO;
psaCC_FreeCtbNtry (addId); /* remove pending call */
}
}
pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */
R_AT( RAT_CME, srcBuf ) ( cmdBuf, CME_ERR_NotPresent );
cmh_logRslt ( srcBuf, RAT_CME,
cmdBuf, -1, -1, CME_ERR_NotPresent );
}
break;
/*
*----------------------------------------------------------------
* process result for +CTFR command
*----------------------------------------------------------------
*/
case( AT_CMD_CTFR ):
psaCC_ctb(cId)->CDStat = CD_Failed;
break;
/*
*----------------------------------------------------------------
* process result for +CHLD command
*----------------------------------------------------------------
*/
case( AT_CMD_CHLD ):
/* determine CHLD mode */
switch( cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm.CHLDmode )
{
/*
*------------------------------------------------------------
* no multiparty relation
*------------------------------------------------------------
*/
case( CHLD_MOD_NotPresent ):
case( CHLD_MOD_RelHldOrUdub ):
case( CHLD_MOD_RelActSpec ):
TRACE_EVENT( "UNEXP CHLD MODE FOR SS ERROR COMP" );
return;
/*
*------------------------------------------------------------
* multiparty hold or retrieve
*------------------------------------------------------------
*/
case( CHLD_MOD_RelActAndAcpt ):
case( CHLD_MOD_HldActAndAcpt ):
/* restore call status for retrieve request */
if( psaCC_ctb(cId)->calStat EQ CS_ACT_REQ )
{
for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
psaCC_ctb(ctbIdx)->calStat EQ CS_ACT_REQ AND
psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT )
{
psaCC_ctb(ctbIdx)->calStat = CS_HLD;
}
}
psaCC_MPTY (cId, MPTY_RETRIEVE_FAIL);
}
/* restore call status for hold request*/
if( psaCC_ctb(cId)->calStat EQ CS_HLD_REQ )
{
for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
psaCC_ctb(ctbIdx)->calStat EQ CS_HLD_REQ AND
psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT )
{
psaCC_ctb(ctbIdx)->calStat = CS_ACT;
}
}
psaCC_MPTY (cId, MPTY_HOLD_FAIL);
}
break;
/*
*------------------------------------------------------------
* multiparty split
*------------------------------------------------------------
*/
case( CHLD_MOD_HldActExc ):
psaCC_ctb(cId)->mptyStat = CS_ACT;
psaCC_MPTY (cId, MPTY_SPLIT_FAIL);
break;
/*
*------------------------------------------------------------
* multiparty build
*------------------------------------------------------------
*/
case( CHLD_MOD_AddHld ):
/* restore call status for build request */
for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if( ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
psaCC_ctb(ctbIdx)->mptyStat EQ CS_ACT_REQ AND
psaCC_ctb(ctbIdx)->calStat EQ CS_HLD )
{
psaCC_ctb(ctbIdx)->mptyStat = CS_IDL;
}
}
if( psaCC_ctb(cId)->mptyStat EQ CS_ACT_REQ )
psaCC_ctb(cId)->mptyStat = CS_IDL;
psaCC_MPTY (cId, MPTY_BUILD_FAIL);
break;
/*
*------------------------------------------------------------
* explicit call transfer
*------------------------------------------------------------
*/
case( CHLD_MOD_Ect ):
pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
TRACE_EVENT("ECT failed...");
TIMERSTOP( ACI_TECT );
/* restore call status for other call that was to be transfered */
for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if( ctbIdx EQ cId )
{
continue;
}
else if (ccShrdPrm.ctb[ctbIdx] NEQ NULL AND
cmhCC_tstAndUnflagCall( ctbIdx, &(pCCCmdPrm -> mltyDscFlg)) AND
psaCC_ctb(ctbIdx)->curCmd EQ AT_CMD_CHLD )
{
/* then it is the second call id */
cmhCC_PrepareCmdEnd (ctbIdx, NULL, NULL);
}
}
/* restore first call id parameters */
cmhCC_PrepareCmdEnd (cId, NULL, &srcBuf);
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)) )
{
R_AT( RAT_CME, srcBuf )
( AT_CMD_CHLD, CME_ERR_Unknown );
cmh_logRslt ( srcBuf, RAT_CME,
AT_CMD_CHLD, -1, -1, CME_ERR_Unknown );
}
return;
/*
*------------------------------------------------------------
* call completion to busy subscriber
*------------------------------------------------------------
*/
case( CHLD_MOD_Ccbs ):
pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
TRACE_EVENT("CCBS failed...");
/* restore first call id parameters */
cmhCC_PrepareCmdEnd (cId, NULL, &srcBuf);
if( psaCC_ctb(cId)->opCode EQ OPC_ACC_REGISTER_CC_ENTRY )
psaCC_FreeCtbNtry (cId); /* remove call table entry */
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyDscFlg)) )
{
pCCCmdPrm -> mltyDscFlg = 0; /* unflag calls */
R_AT( RAT_CME, srcBuf )
( AT_CMD_CHLD, CME_ERR_Unknown );
cmh_logRslt ( srcBuf, RAT_CME,
AT_CMD_CHLD, -1, -1, CME_ERR_Unknown );
}
return;
}
pCCCmdPrm = &cmhPrm[psaCC_ctb(cId)->curSrc].ccCmdPrm;
cmhCC_PrepareCmdEnd (cId, NULL, &srcBuf);
if( cmhCC_tstAndUnflagCall( cId, &(pCCCmdPrm -> mltyCncFlg)))
{
pCCCmdPrm -> mltyCncFlg = 0; /* unflag calls */
R_AT( RAT_CME, srcBuf ) ( AT_CMD_CHLD, CME_ERR_Unknown );
cmh_logRslt ( srcBuf, RAT_CME,
AT_CMD_CHLD, -1, -1, CME_ERR_Unknown );
}
break;
}
return;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_MPTYTimeout |
+-------------------------------------------------------------------+
PURPOSE : handle multiparty timeout
*/
GLOBAL void cmhCC_MPTYTimeout ( void )
{
TRACE_FUNCTION( "cmhCC_MPTYTimeout()" );
if (!psaCC_ctbIsValid (ccShrdPrm.cIdMPTY))
{
TRACE_ERROR ("ccShrdPrm.cIdMPTY invalid");
return;
}
/*
*-------------------------------------------------------------------
* SS failure
*-------------------------------------------------------------------
*/
#ifdef SIM_TOOLKIT
if (psaCC_ctb(ccShrdPrm.cIdMPTY)->SATinv )
{
psaCC_ctb(ccShrdPrm.cIdMPTY)->SATinv = FALSE;
/* return network error cause GSM 11.14 / 12.12.3 */
cmhSAT_NtwErr( ADD_NO_CAUSE );
}
#endif
cmhCC_SSTransFail(ccShrdPrm.cIdMPTY);
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_ECTTimeout |
+-------------------------------------------------------------------+
PURPOSE : handle explicit call transfer timeout
*/
LOCAL SHORT search_ect_call(void)
{
SHORT idx;
UBYTE chld_src;
for(idx = 0; idx < MAX_CALL_NR; idx++)
{
if (ccShrdPrm.ctb[idx] NEQ NULL AND
psaCC_ctb(idx)->curCmd EQ AT_CMD_CHLD)
{
chld_src = psaCC_ctb(idx)->curSrc;
if( cmhPrm[chld_src].ccCmdPrm.CHLDmode EQ CHLD_MOD_Ect )
{
return(idx);
}
}
}
return(NO_ENTRY);
}
GLOBAL void cmhCC_ECTTimeout ( void )
{
SHORT ectId;
TRACE_FUNCTION( "cmhCC_ECTTimeout()" );
ectId = search_ect_call( );
if (ectId NEQ NO_ENTRY)
cmhCC_SSTransFail(ectId);
}
#ifdef FF_TTY
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_TTY_Control |
+-------------------------------------------------------------------+
PURPOSE : Enabling/disabling TTY for the active call
*/
LOCAL BOOL cmhCC_TTY_Proceed (SHORT cId)
{
T_TTY_CMD ttyAction = TTY_OFF;
T_bcpara *bc;
if (ccShrdPrm.ctb[cId] NEQ NULL)
{
/* Call table entry exists */
bc = &psaCC_ctb(cId)->BC[psaCC_ctb(cId)->curBC];
if ((bc->bearer_serv EQ BEARER_SERV_SPEECH_CTM OR
bc->bearer_serv EQ BEARER_SERV_AUX_SPEECH_CTM) AND
psaCC_ctb(cId)->calStat NEQ CS_DSC_REQ)
{
if ((ccShrdPrm.chMod EQ CHM_SPEECH) OR
(ccShrdPrm.chMod EQ CHM_SPEECH_V2) OR
(ccShrdPrm.chMod EQ CHM_SPEECH_V3))
{
audio_set_tty (ttyAction = (T_TTY_CMD)ccShrdPrm.ttyCmd);
}
else
{
TRACE_EVENT_P1 ("TTY no speech mode: %d", (int)ccShrdPrm.chMod);
}
}
else
{
TRACE_EVENT_P1 ("TTY wrong BCAP: %d", (int)bc->bearer_serv);
}
if (ttyAction NEQ (UBYTE)TTY_OFF)
{
cmhCC_notifyTTY (CTTY_NEG_Grant, cmhCC_getTTYtrx_state (ttyAction));
return TRUE;
}
else
{
cmhCC_notifyTTY (((ccShrdPrm.ctmReq EQ CTM_ENABLED)?
CTTY_NEG_Reject: CTTY_NEG_None),
CTTY_TRX_Unknown);
}
}
else
{
TRACE_EVENT ("TTY no call table entry");
}
return FALSE;
}
GLOBAL void cmhCC_TTY_Control (SHORT cId, UBYTE action)
{
TRACE_EVENT_P3 ("TTY event %d, old state %d, callId %d",
action, ccShrdPrm.ctmState, cId);
if (!ccShrdPrm.TCHasg)
{
TRACE_EVENT ("TTY: no TCH");
}
switch (action)
{
case TTY_TCH:
if (ccShrdPrm.ctmState EQ TTY_STATE_IDLE)
{
ccShrdPrm.ctmState = TTY_STATE_SYNC;
}
else if (ccShrdPrm.ctmState EQ TTY_STATE_BCAP)
{
if (cmhCC_TTY_Proceed (cId))
ccShrdPrm.ctmState = TTY_STATE_ACTIVE;
else
ccShrdPrm.ctmState = TTY_STATE_WAIT;
}
break;
case TTY_START:
if (ccShrdPrm.ctmState EQ TTY_STATE_IDLE)
{
ccShrdPrm.ctmState = TTY_STATE_BCAP;
}
else if (ccShrdPrm.ctmState EQ TTY_STATE_SYNC)
{
if (cmhCC_TTY_Proceed (cId))
ccShrdPrm.ctmState = TTY_STATE_ACTIVE;
else
ccShrdPrm.ctmState = TTY_STATE_WAIT;
}
break;
case TTY_PAUSE:
if (ccShrdPrm.ctmState EQ TTY_STATE_WAIT)
{
ccShrdPrm.ctmState = TTY_STATE_SYNC;
}
else if (ccShrdPrm.ctmState EQ TTY_STATE_ACTIVE)
{
audio_set_tty (TTY_OFF);
ccShrdPrm.ctmState = TTY_STATE_SYNC;
}
break;
case TTY_STOP:
if (ccShrdPrm.ctmState EQ TTY_STATE_ACTIVE)
{
audio_set_tty (TTY_OFF);
cmhCC_notifyTTY (CTTY_NEG_None, CTTY_TRX_Off);
}
ccShrdPrm.ctmState = (ccShrdPrm.ctmReq EQ CTM_ENABLED)?
TTY_STATE_IDLE: TTY_STATE_NONE;
break;
default:
break;
}
TRACE_EVENT_P1 ("TTY new state %d", ccShrdPrm.ctmState);
}
#endif /* FF_TTY */
#if defined (FF_WAP) || defined (FF_TCP_IP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E)
/* Only for WAP or RNET */
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_PPP_Established |
+-------------------------------------------------------------------+
PURPOSE : PPP entity activated, data path established
*/
GLOBAL SHORT cmhCC_PPP_Established (ULONG ip_address, USHORT max_receive_unit,
ULONG dns1, ULONG dns2)
{
char c_ip_address[16],c_dns1[16],c_dns2[16];
SHORT cId = raShrdPrm.cId;
TRACE_FUNCTION ("cmhCC_PPP_Established()");
ipAddress = ip_address;
sprintf (c_ip_address, "%03u.%03u.%03u.%03u", (ip_address & 0xff000000) >> 24,
(ip_address & 0x00ff0000) >> 16,
(ip_address & 0x0000ff00) >> 8 ,
(ip_address & 0x000000ff) );
sprintf(c_dns1, "%03u.%03u.%03u.%03u", (dns1 & 0xff000000) >> 24,
(dns1 & 0x00ff0000) >> 16,
(dns1 & 0x0000ff00) >> 8 ,
(dns1 & 0x000000ff) );
sprintf(c_dns2, "%03u.%03u.%03u.%03u", (dns2 & 0xff000000) >> 24,
(dns2 & 0x00ff0000) >> 16,
(dns2 & 0x0000ff00) >> 8 ,
(dns2 & 0x000000ff) );
TRACE_EVENT_P3("addr : %s ,dns1 : %s ,dns2: %s",c_ip_address,c_dns1,c_dns2);
if(is_gpf_tcpip_call()) {
pppShrdPrm.ipaddr = ip_address ;
pppShrdPrm.dns1 = dns1 ;
pppShrdPrm.dns2 = dns2 ;
}
#ifdef FF_TCP_IP
if (psaCC_ctbIsValid (cId) AND /* Ensure not to dereferentiate NULL */
pppShrdPrm.is_PPP_CALL EQ TRUE)
{
pppShrdPrm.ipaddr = ip_address ;
pppShrdPrm.dns1 = dns1 ;
pppShrdPrm.dns2 = dns2 ;
R_AT( RAT_CONNECT, raShrdPrm.owner )
(psaCC_ctb(cId)->curCmd,
cmhCC_GetDataRate(&psaCC_ctb(cId)->BC[psaCC_ctb(cId)->curBC]),
cId+1,
FALSE);
return 0;
}
#endif /*FF_TCP_IP*/
#if defined (FF_SAT_E)
if(cmhSAT_OpChnChckCSD(UDP))
{
psaTCPIP_Configure((UBYTE*)c_ip_address, NULL, NULL,
(UBYTE*)c_dns1, (UBYTE*)c_dns2,max_receive_unit,
cmhSAT_OpChnUDPConfCsd) ;
}
else
#endif /* FF_SAT_E */
#if defined (FF_WAP) || defined (FF_GPF_TCPIP)
{
psaTCPIP_Configure((UBYTE*)c_ip_address, NULL, NULL,
(UBYTE*)c_dns1, (UBYTE*)c_dns1,max_receive_unit,
psaTCPIP_conf_csd_callback) ;
}
#endif /* FF_WAP OR FF_GPF_TCPIP */
return 0;
}
#ifdef CO_UDP_IP
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_IPA_Configurated |
+-------------------------------------------------------------------+
PURPOSE : IPA entity activated, data path established
*/
GLOBAL SHORT cmhCC_IPA_Configurated (void)
{
TRACE_FUNCTION ("cmhCC_IPA_Configurated()");
psaUDPA_Config(UDPA_CONFIG_UP);
return 0;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_UDPA_Configurated |
+-------------------------------------------------------------------+
PURPOSE : IPA entity activated, data path established
*/
GLOBAL SHORT cmhCC_UDPA_Configurated (void)
{
TRACE_FUNCTION ("cmhCC_UDPA_Configurated()");
#ifdef FF_WAP
if (Wap_Call)
{
if ( tcpipShrdPrm.connection_type EQ TCPIP_CONNECTION_TYPE_CSD_WAP )
{
rAT_WAP_PPP_connected(wapId,ipAddress);
}
else
{
TRACE_EVENT_P1 ("IP: %s", tcpipShrdPrm.ipaddr);
rAT_WAP_PPP_connected(wapId, psaTCPIP_bytes2ipv4addr(tcpipShrdPrm.ipaddr));
}
}
#endif
psaUDPIP_config_dispatch() ;
return 0;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_UDPA_Deconfigurated |
+-------------------------------------------------------------------+
PURPOSE :
*/
GLOBAL SHORT cmhCC_UDPA_Deconfigurated (void)
{
TRACE_FUNCTION ("cmhCC_UDPA_Deconfigurated ()");
cmhUDPA_Deactivate(tcpipShrdPrm.src_id);
return 0;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_IPA_Deconfigurated |
+-------------------------------------------------------------------+
PURPOSE :
*/
GLOBAL SHORT cmhCC_IPA_Deconfigurated (void)
{
TRACE_FUNCTION ("cmhCC_IPA_Deconfigurated()");
psaUDPA_Config(UDPA_CONFIG_DOWN);
return 0;
}
#endif /* of WAP || SAT E */
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_PPP_Terminated |
+-------------------------------------------------------------------+
PURPOSE : PPP entity terminated, close connection / update CC parameters
*/
GLOBAL SHORT cmhCC_PPP_Terminated ( void )
{
TRACE_FUNCTION ("cmhCC_PPP_Terminated()");
#ifdef DTI
#if defined (FF_WAP) || defined (FF_GPF_TCPIP) || defined (FF_SAT_E)
if (Wap_Call EQ TRUE)
{
if(is_gpf_tcpip_call()) {
GPF_TCPIP_STATEMENT(dti_cntrl_entity_disconnected(peer_link_id,
DTI_ENTITY_TCPIP ));
}
else {
dti_cntrl_entity_disconnected( peer_link_id, DTI_ENTITY_IP );
}
dti_cntrl_entity_disconnected( prot_link_id, DTI_ENTITY_L2R );
}
#endif /* WAP || defined (FF_GPF_TCPIP) || SAT E */
dti_cntrl_entity_disconnected( peer_link_id, DTI_ENTITY_PPPC );
dti_cntrl_entity_disconnected( prot_link_id, DTI_ENTITY_PPPC );
#if defined (FF_SAT_E)
if( cmhSAT_OpChnChckCSD(UDP))
{
psaTCPIP_Deactivate(cmhSAT_OpChnUDPDeactCsd) ;
}
else
#endif /* FF_SAT_E */
#if defined (FF_WAP) OR defined (FF_GPF_TCPIP)
{
psaTCPIP_Deactivate(psaTCPIP_deact_csd_callback) ;
}
#endif /* defined (WAP) OR defined (FF_GPF_TCPIP) */
#endif /* DTI */
return 0;
}
#endif /* of WAP or FF_TCP_IP || defined (FF_GPF_TCPIP) or SAT E */
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| STATE : code ROUTINE : cmhCC_checkALS_Support_cb|
+--------------------------------------------------------------------+
PURPOSE : Call-backs for ALS support check.
*/
GLOBAL void cmhCC_checkALS_Support_cb ( SHORT aId )
{
TRACE_FUNCTION ("cmhCC_checkALS_Support_cb()");
simShrdPrm.atb[aId].ntryUsdFlg = FALSE;
/* Step #1: Reading of CPHS Info */
if (simShrdPrm.atb[aId].errCode NEQ SIM_NO_ERROR OR
simShrdPrm.atb[aId].exchData EQ NULL OR
simShrdPrm.atb[aId].dataLen < 2)
{
; /* CPHS info not supported or invalid */
}
else if ((simShrdPrm.atb[aId].exchData[1] & 0x03) EQ ALLOCATED_AND_ACTIVATED)
{
/* continue with step 2 */
cmhCC_checkALS_Support_2();
return;
}
cmhCC_checkALS_Support_exec( 0 );
}
GLOBAL void cmhCC_checkALS_Support_cb_2 ( SHORT aId )
{
int i;
TRACE_FUNCTION ("cmhCC_checkALS_Support_cb_2()");
simShrdPrm.atb[aId].ntryUsdFlg = FALSE;
if (simShrdPrm.atb[aId].errCode NEQ SIM_NO_ERROR OR
simShrdPrm.atb[aId].exchData EQ NULL OR
simShrdPrm.atb[aId].dataLen < ACI_CPHS_CSP_SIZE )
{
; /* CSP not supported or invalid */
}
else
{
for (i = 0; i < simShrdPrm.atb[aId].dataLen; i += 2)
{
if (simShrdPrm.atb[aId].exchData[i] EQ ALS_SERVICE_GROUP_CODE)
{
if (BITFIELD_CHECK(simShrdPrm.atb[aId].exchData[i+1],ALS_BIT_ON))
{
cmhCC_checkALS_Support_exec( 1 );
return;
}
break;
}
}
}
cmhCC_checkALS_Support_exec( 0 );
}
GLOBAL void cmhCC_checkALS_Support_exec ( UBYTE flag )
{
T_ACI_CMD_SRC ownBuf; /* buffers current owner */
T_ACI_ALS_MOD ALSmode;
TRACE_FUNCTION ("cmhCC_checkALS_Support_exec()");
ownBuf = simEntStat.entOwn;
simEntStat.curCmd = AT_CMD_NONE;
simEntStat.entOwn = simShrdPrm.owner = OWN_NONE;
switch (ccShrdPrm.als_cmd)
{
case ALS_CMD_SET:
if (flag)
{
cmhPrm[ownBuf].ccCmdPrm.ALSmode = ALS_MOD_AUX_SPEECH;
R_AT( RAT_OK, ownBuf ) ( AT_CMD_ALS );
}
else
{
R_AT( RAT_CME, ownBuf ) ( AT_CMD_ALS, CME_ERR_OpNotSupp );
}
break;
case ALS_CMD_TEST:
if (flag)
{
ALSmode = ALS_MOD_SPEECH | ALS_MOD_AUX_SPEECH;
}
else
{
ALSmode = ALS_MOD_SPEECH;
}
R_AT( RAT_ALS, ownBuf ) ( ALSmode );
R_AT( RAT_OK, ownBuf ) ( AT_CMD_ALS );
break;
default:
TRACE_EVENT("wrong value in als_cmd");
R_AT( RAT_CME, ownBuf ) ( AT_CMD_ALS, CME_ERR_OpNotSupp );
}
ccShrdPrm.als_cmd = ALS_CMD_NONE;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_redialTimeout |
+-------------------------------------------------------------------+
PURPOSE : handle redial timeout
*/
GLOBAL void cmhCC_redialTimeout ( void )
{
int i;
T_CC_CMD_PRM * pCCCmdPrm; /* points to CC command parameters */
TRACE_FUNCTION( "cmhCC_redialTimeout()" );
if (psaCC_ctbIsValid (rdlPrm.rdlcId))
{
pCCCmdPrm = &cmhPrm[psaCC_ctb(rdlPrm.rdlcId)->curSrc].ccCmdPrm;
if (rdlPrm.rdlMod EQ AUTOM_REPEAT_ON)
{
if((psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex >= 1) AND
(psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex < 3))
{
#ifdef _SIMULATION_
TIMERSTART(ACI_REPEAT_1,ACI_REPEAT_HND);
#else
psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex++;
TIMERSTART(ACI_REPEAT_2_4,ACI_REPEAT_HND);
#endif
}
else
{
psaCC_ctb(rdlPrm.rdlcId)->rdlTimIndex = RDL_TIM_INDEX_NOT_PRESENT;
psaCC_ctb(rdlPrm.rdlcId)->rdlCnt++;
for(i = 0; i < CMD_SRC_MAX; i++)
{
R_AT(RAT_RDL, i)(REDIAL_ATT_START);
}
psaCC_ctb(rdlPrm.rdlcId)->calType = CT_MOC_RDL;
cmhCC_flagCall( rdlPrm.rdlcId, &(pCCCmdPrm->mltyCncFlg));
/* start a new call */
psaCC_NewCall(rdlPrm.rdlcId);
rdlPrm.rdlcId = NO_ENTRY;
}
}
else
{
TRACE_EVENT("cmhCC_redialTimeout: wrong cId");
}
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : CMH_CCR |
| ROUTINE : cmhCC_sendFie |
+-------------------------------------------------------------------+
PURPOSE : forward unsolicited facility responses from CC to terminal
*/
GLOBAL T_ACI_RETURN cmhCC_sendFie( T_ACI_FAC_DIR tDirection,
SHORT cId,
T_fac_inf *fie )
{
T_ACI_CMD_SRC tSrc;
TRACE_EVENT( "cmhCC_sendFie()" );
for( tSrc=CMD_SRC_LCL; tSrc<CMD_SRC_MAX; tSrc++ ) /* try over all sources */
{
if( cmhPrm[tSrc].ccCmdPrm.CSCNcc_mode.CcCSCNModeState EQ CC_CSCN_MOD_STATE_ON )
{
switch (cmhPrm[tSrc].ccCmdPrm.CSCNcc_mode.CcCSCNModeDirection)
{
case CC_CSCN_MOD_DIR_BOTH:
break; /* printout regardless of direction */
case CC_CSCN_MOD_DIR_IN:
if( tDirection NEQ CSCN_FACILITY_DIRECTION_IN)
continue; /* settings for source don't match, advance to next source */
break;
case CC_CSCN_MOD_DIR_OUT:
if( tDirection NEQ CSCN_FACILITY_DIRECTION_OUT )
continue; /* settings for source don't match, advance to next source */
break;
default:
continue; /* illegal setting, advance to next source */
}
R_AT( RAT_CCCN, tSrc )( tDirection, cId, fie );
}
}
return( AT_CMPL );
}
/*==== EOF ========================================================*/