line source
/*
+-----------------------------------------------------------------------------
| Project : GSM-PS (6147)
| Modul : PSA_SATF
+-----------------------------------------------------------------------------
| 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 for the protocol
| stack adapter for the SIM application toolkit.
+-----------------------------------------------------------------------------
*/
#ifdef SIM_TOOLKIT
#ifndef PSA_SATF_C
#define PSA_SATF_C
#endif
#include "aci_all.h"
/*==== INCLUDES ===================================================*/
#include "aci_cmh.h"
#include "aci_mem.h"
#ifdef GPRS
#include "gaci_cmh.h"
#endif
#ifdef FAX_AND_DATA
#include "aci_fd.h"
#endif /* of #ifdef FAX_AND_DATA */
#include "aci.h"
#include "psa.h"
#include "psa_cc.h"
#include "psa_sat.h"
#include "psa_util.h"
#include "cmh.h"
#include "cmh_sat.h"
#include "psa_mm.h"
#include "psa_ss.h"
#include "psa_sim.h"
#include "cmh_cc.h"
#include "ksd.h"
/*==== CONSTANTS ==================================================*/
#define ITM_WDT (14) /* item width in chars */
#define HDR_WDT (10) /* header width in chars */
/*==== TYPES ======================================================*/
/*==== EXPORT =====================================================*/
/*==== VARIABLES ==================================================*/
LOCAL UBYTE ssResPrms[MAXIMUM( sizeof(BUF_res_params_sat),
MAXIMUM(sizeof(BUF_rej_params_sat),
sizeof(BUF_err_params_sat)))];
/*==== FUNCTIONS ==================================================*/
LOCAL void psaSAT_getTonNpi(CHAR *inSeq, BOOL call_active,
UBYTE *ton, UBYTE *npi);
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : SAT |
| ROUTINE : psaSAT_BuildEnvCC |
+-------------------------------------------------------------------+
PURPOSE : Build envelope call control command.
*/
GLOBAL void psaSAT_BuildEnvCC ( SHORT cId,
T_CLPTY_PRM *ss_cldPty,
T_sat_ussd *ussd,
T_MNCC_bcconf *ccp1,
T_MNCC_bcconf *ccp2)
{
T_CC_CALL_TBL *pCtbNtry = ccShrdPrm.ctb[cId];
UBYTE ton;
UBYTE npi;
/*
*-------------------------------------------------------------------
* build envelope call control command
*-------------------------------------------------------------------
*/
{
MCAST( env, ENV_CMD );
memset( env, 0, sizeof( T_ENV_CMD ));
env->v_cc_cmd = TRUE;
/* device identities */
env->cc_cmd.v_dev_ids = TRUE;
env->cc_cmd.dev_ids.src_dev = DEV_SRC_ME;
env->cc_cmd.dev_ids.dest_dev = DEV_DST_SIM;
if( cId NEQ NO_ENTRY )
{
/* address */
env->cc_cmd.v_addr = TRUE;
if( (pCtbNtry->SATinv & SAT_REDIAL_ECCBE) AND
(rdlPrm.rdlState) )
{
memcpy(&env->cc_cmd.addr, &satRdlCCEnv.addr, sizeof(T_addr));
}
else
{
/* address */
env->cc_cmd.addr.v_noa = TRUE;
env->cc_cmd.addr.noa = pCtbNtry->cldPty.ton;
env->cc_cmd.addr.v_npi = TRUE;
env->cc_cmd.addr.npi = pCtbNtry->cldPty.npi;
env->cc_cmd.addr.c_bcdDigit = pCtbNtry->cldPty.c_called_num;
memcpy( env->cc_cmd.addr.bcdDigit,
pCtbNtry->cldPty.called_num,
pCtbNtry->cldPty.c_called_num );
}
#ifdef SIM_TOOLKIT
if ( !rdlPrm.rdlState )
{
memcpy(&satRdlCCEnv.addr, &env->cc_cmd.addr, sizeof(T_addr));
}
#endif
/* capability configuration parameters 1*/
if( ccp1 )
{
env->cc_cmd.v_cap_cnf_parms = TRUE;
env->cc_cmd.cap_cnf_parms.l_cap_cnf_parms = ccp1->bc_len<<3;
memcpy( env->cc_cmd.cap_cnf_parms.b_cap_cnf_parms, ccp1->bc,
ccp1->bc_len );
}
/* capability configuration parameters 2*/
if( ccp2 )
{
env->cc_cmd.v_cap_cnf_parms_2 = TRUE;
env->cc_cmd.cap_cnf_parms_2.l_cap_cnf_parms_2 = ccp2->bc_len<<3;
memcpy( env->cc_cmd.cap_cnf_parms_2.b_cap_cnf_parms_2, ccp2->bc,
ccp2->bc_len );
}
/* If ccp is present in the setUpCall */
if ((satShrdPrm.capParm.cntxt EQ CTX_SAT_SETUP) AND satShrdPrm.stk_ccp.l_cap_cnf_parms )
{
env->cc_cmd.v_cap_cnf_parms = TRUE;
/* Storing the ccp if ECCBE is enabled */
if( (ccShrdPrm.ctb[cId]->SATinv & SAT_REDIAL_ECCBE) AND
(rdlPrm.rdlState) )
{
memcpy(&env->cc_cmd.cap_cnf_parms, &satRdlCCEnv.ccp, sizeof(BUF_cap_cnf_parms));
}
else
{
env->cc_cmd.cap_cnf_parms.l_cap_cnf_parms = satShrdPrm.stk_ccp.l_cap_cnf_parms;
memcpy( env->cc_cmd.cap_cnf_parms.b_cap_cnf_parms, &satShrdPrm.stk_ccp.b_cap_cnf_parms,
satShrdPrm.stk_ccp.l_cap_cnf_parms );
}
#ifdef SIM_TOOLKIT
if ( !rdlPrm.rdlState )
{
memcpy( &satRdlCCEnv.ccp, &env->cc_cmd.cap_cnf_parms, sizeof(BUF_cap_cnf_parms));
}
#endif
}
/* subaddress */
if( pCtbNtry->cldPtySub.c_subaddr )
{
env->cc_cmd.v_subaddr = TRUE;
if( (pCtbNtry->SATinv & SAT_REDIAL_ECCBE) AND
(rdlPrm.rdlState) )
{
memcpy( &env->cc_cmd.subaddr, &satRdlCCEnv.sub_addr, sizeof(T_subaddr) );
}
else
{
env->cc_cmd.subaddr.v_tos = TRUE;
env->cc_cmd.subaddr.tos = pCtbNtry->cldPtySub.tos;
env->cc_cmd.subaddr.v_oei = TRUE;
env->cc_cmd.subaddr.oei = pCtbNtry->cldPtySub.odd_even;
env->cc_cmd.subaddr.c_subadr_str = pCtbNtry->cldPtySub.c_subaddr;
memcpy( env->cc_cmd.subaddr.subadr_str, pCtbNtry->cldPtySub.subaddr,
pCtbNtry->cldPtySub.c_subaddr );
}
#ifdef SIM_TOOLKIT
if ( !rdlPrm.rdlState )
{
memcpy( &satRdlCCEnv.sub_addr, &env->cc_cmd.subaddr, sizeof(T_subaddr));
}
#endif
}
}
else if( ss_cldPty NEQ NULL )
{
/* SS string */
env->cc_cmd.v_ss_string = TRUE;
psaSAT_getTonNpi(ss_cldPty->num, FALSE, &ton, &npi);
env->cc_cmd.ss_string.v_noa = TRUE;
env->cc_cmd.ss_string.noa = ton;
env->cc_cmd.ss_string.v_npi = TRUE;
env->cc_cmd.ss_string.npi = npi;
env->cc_cmd.ss_string.c_ss_ctrl_string =
(UBYTE)utl_dialStr2BCD (ss_cldPty->num, /*ssStr,*/
env->cc_cmd.ss_string.ss_ctrl_string,
MAX_SS_STRING_LEN);
}
else if( ussd NEQ NULL )
{
/* USSD string */
env->cc_cmd.v_ussd_string = TRUE;
env->cc_cmd.ussd_string.dcs = ussd->dcs;
env->cc_cmd.ussd_string.c_ussd_str = MINIMUM (ussd->c_ussd_str, MAX_SAT_USSD_LEN);
memcpy( env->cc_cmd.ussd_string.ussd_str,
ussd->ussd_str,
env->cc_cmd.ussd_string.c_ussd_str);
}
/* location information */
/* code MCC */
env->cc_cmd.cc_smc_loc_info.mnc_mcc |= ((mmShrdPrm.usedPLMN.mcc[1]<<4) + mmShrdPrm.usedPLMN.mcc[0]) <<16;
env->cc_cmd.cc_smc_loc_info.mnc_mcc |= ((mmShrdPrm.usedPLMN.mnc[2]<<4) + mmShrdPrm.usedPLMN.mcc[2]) << 8;
/* code MNC */
env->cc_cmd.cc_smc_loc_info.mnc_mcc |= (mmShrdPrm.usedPLMN.mnc[1]<<4)+mmShrdPrm.usedPLMN.mnc[0];
/* code LAC */
env->cc_cmd.cc_smc_loc_info.lac = mmShrdPrm.lac;
/* code CID */
env->cc_cmd.cc_smc_loc_info.cid = mmShrdPrm.cid;
env->cc_cmd.v_cc_smc_loc_info = TRUE;
}
}
/*
+--------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : psa_sat |
| STATE : code ROUTINE : psaSAT_getTonNpi |
+--------------------------------------------------------------------+
PURPOSE : Get TON and NPI. The SS string in inSeq will be
decoded to check if it contains a phone number. If
SS String contains a number, its TON and NPI will be
returned. Otherwise TON and NPI will be set to FF as
required in GSM 11.14/GSM 11.11.
*/
LOCAL void psaSAT_getTonNpi(CHAR *inSeq, BOOL call_active,
UBYTE *ton, UBYTE *npi)
{
T_KSD_SEQGRP grp;
CHAR *rest;
T_KSD_SEQPARAM para;
CHAR seq[MAX_DIAL_LEN];
*ton = MNCC_TON_NOT_PRES;
*npi = MNCC_NPI_NOT_PRES;
strcpy(seq, inSeq);
/* decode sequence */
ksd_decode(seq, call_active, &grp, &rest, ¶);
/* analyse TON and NPI */
switch( grp )
{
case SEQGRP_CF:
if ( (para.cf.num NEQ NULL) AND (para.cf.num[0] NEQ 0) )
{
*ton = para.cf.ton;
*npi = para.cf.npi;
}
break;
case SEQGRP_DIAL:
if ( ( para.dial.number NEQ NULL ) AND
( para.dial.number[0] EQ 0 ) )
{
if ( para.dial.number[0] EQ '+' )
{
*ton = TON_International;
}
else
{
*ton = TON_Unknown;
}
*npi = NPI_IsdnTelephony;
}
break;
#ifdef SMI
case SEQGRP_SET_ABBR_DIAL:
if ( (para.abbrDial.number NEQ NULL) AND
( para.abbrDial.number[0] EQ 0 ) )
{
if ( para.abbrDial.number[0] EQ '+' )
{
*ton = TON_International;
}
else
{
*ton = TON_Unknown;
}
*npi = NPI_IsdnTelephony;
}
break;
#endif /* SMI */
default:
/* Sequence group does not contain number. TON and NPI still set to FF */
break;
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : SAT |
| ROUTINE : psaSAT_BuildEnvCB |
+-------------------------------------------------------------------+
PURPOSE : Build envelope cell broadcast data download command.
*/
GLOBAL void psaSAT_BuildEnvCB ( UBYTE *cbMsg, SHORT cbLen )
{
/*
*-------------------------------------------------------------------
* build envelope cell broadcast data download command
*-------------------------------------------------------------------
*/
{
MCAST( env, ENV_CMD );
memset( env, 0, sizeof( T_ENV_CMD ));
env->v_cbd_cmd = TRUE;
/* device identities */
env->cbd_cmd.v_dev_ids = TRUE;
env->cbd_cmd.dev_ids.src_dev = DEV_SRC_NTW;
env->cbd_cmd.dev_ids.dest_dev = DEV_DST_SIM;
/* CB message */
env->cbd_cmd.v_cb_page = TRUE;
env->cbd_cmd.cb_page.l_cb_page = cbLen<<3;
env->cbd_cmd.cb_page.o_cb_page = 0;
memcpy( env->cbd_cmd.cb_page.b_cb_page, cbMsg, cbLen );
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : SAT |
| ROUTINE : psaSAT_BuildEnvMoSmCntr |
+-------------------------------------------------------------------+
PURPOSE : Build envelope cell broadcast data download command.
*/
GLOBAL void psaSAT_BuildEnvMoSmCntr ( T_rp_addr sc_addr,
T_tp_da dest_addr )
{
/*
*-------------------------------------------------------------------
* build envelope
*-------------------------------------------------------------------
*/
{
MCAST( env, ENV_CMD );
memset( env, 0, sizeof( T_ENV_CMD ));
env->v_smc_cmd = TRUE;
/* device identities */
env->smc_cmd.v_dev_ids = TRUE;
env->smc_cmd.dev_ids.src_dev = DEV_DST_ME;
env->smc_cmd.dev_ids.dest_dev = DEV_DST_SIM;
/* short message address */
env->smc_cmd.v_sm_addr = TRUE;
env->smc_cmd.sm_addr.v_noa = TRUE;
env->smc_cmd.sm_addr.noa = sc_addr.ton;
env->smc_cmd.sm_addr.v_npi = TRUE;
env->smc_cmd.sm_addr.npi = sc_addr.npi;
env->smc_cmd.sm_addr.c_bcdDigit = sc_addr.c_num;
memcpy(&(env->smc_cmd.sm_addr.bcdDigit[0]),
&(sc_addr.num[0]),
sc_addr.c_num /*MAX_SMS_DIGIT_LEN*/);
/* address 2 */
env->smc_cmd.v_sm_addr_2 = TRUE;
env->smc_cmd.sm_addr_2.v_noa = TRUE;
env->smc_cmd.sm_addr_2.noa = dest_addr.ton;
env->smc_cmd.sm_addr_2.v_npi = TRUE;
env->smc_cmd.sm_addr_2.npi = dest_addr.npi;
env->smc_cmd.sm_addr_2.c_bcdDigit = dest_addr.c_num;
memcpy(&(env->smc_cmd.sm_addr_2.bcdDigit[0]),
&(dest_addr.num[0]),
dest_addr.c_num /*MAX_SMS_DIGIT_LEN*/);
/* location information */
/* code MCC */
env->smc_cmd.cc_smc_loc_info.mnc_mcc |= ((mmShrdPrm.usedPLMN.mcc[1]<<4) + mmShrdPrm.usedPLMN.mcc[0]) <<16;
env->smc_cmd.cc_smc_loc_info.mnc_mcc |= ((mmShrdPrm.usedPLMN.mnc[2]<<4) + mmShrdPrm.usedPLMN.mcc[2]) << 8;
/* code MNC */
env->smc_cmd.cc_smc_loc_info.mnc_mcc |= (mmShrdPrm.usedPLMN.mnc[1]<<4)+mmShrdPrm.usedPLMN.mnc[0];
/* code LAC */
env->smc_cmd.cc_smc_loc_info.lac = mmShrdPrm.lac;
/* code CID */
env->smc_cmd.cc_smc_loc_info.cid = mmShrdPrm.cid;
env->smc_cmd.v_cc_smc_loc_info = TRUE;
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : SAT |
| ROUTINE : psaSAT_BuildEnvEventDwn |
+-------------------------------------------------------------------+
PURPOSE : Build envelope event download command.
*/
GLOBAL BOOL psaSAT_BuildEnvEventDwn ( UBYTE event, SHORT callId, T_CC_INITIATER actionSrc )
{
T_CC_CALL_TBL * pCtbNtry; /* holds pointer to call table entry */
BOOL MT_flag;
UBYTE trans_id = 0xFF;
UBYTE ti_flag = 0xFF; /* lint: initialization warning */
TRACE_FUNCTION("psaSAT_BuildEnvEventDwn()");
pCtbNtry = ccShrdPrm.ctb[callId];
/*
*-------------------------------------------------------------------
* build envelope
*-------------------------------------------------------------------
*/
{
MCAST( env, ENV_CMD );
memset( env, 0, sizeof( T_ENV_CMD ));
env->v_evd_cmd = TRUE;
/* event */
env->evd_cmd.v_ev_list = TRUE;
env->evd_cmd.ev_list.c_event = 1;
env->evd_cmd.ev_list.event[0] = event;
/* device identities */
env->evd_cmd.v_dev_ids = TRUE;
env->evd_cmd.dev_ids.dest_dev = DEV_DST_SIM;
switch( actionSrc )
{
case( NEAR_END ):
env->evd_cmd.dev_ids.src_dev = DEV_SRC_ME;
break;
case( FAR_END ):
env->evd_cmd.dev_ids.src_dev = DEV_SRC_NTW;
break;
default:
env->evd_cmd.v_dev_ids = FALSE;
}
if ( event EQ EVENT_MT_CALL OR
event EQ EVENT_CALL_CONN OR
event EQ EVENT_CALL_DISC )
{
/* process ti identifier */
env->evd_cmd.v_ti_list = TRUE;
env->evd_cmd.ti_list.c_ti_oct = 1;
MT_flag = pCtbNtry -> ti & 0x08; /* TRUE if MS terminated transaction */
trans_id = ( pCtbNtry -> ti) & 0x07; /* see GSM 04.07 ?1.2.3.1.3 */
}
switch( event )
{
case( EVENT_MT_CALL ):
/* ti identifier */
/* MNCC_SETUP_IND means message sent from the side that originated the TI */
env->evd_cmd.ti_list.ti_oct[0].ti = /*lint -e(644) */ trans_id;
/* address */
if (pCtbNtry->clgPty.c_num NEQ 0)
{
env->evd_cmd.v_addr = TRUE;
env->evd_cmd.addr.v_noa = TRUE;
env->evd_cmd.addr.noa = pCtbNtry->clgPty.ton;
env->evd_cmd.addr.v_npi = TRUE;
env->evd_cmd.addr.npi = pCtbNtry->clgPty.npi;
env->evd_cmd.addr.c_bcdDigit = pCtbNtry->clgPty.c_num;
memcpy(&(env->evd_cmd.addr.bcdDigit[0]),
&(pCtbNtry->clgPty.num[0]),
pCtbNtry->clgPty.c_num);
}
/* called party subaddress */
if (pCtbNtry->clgPtySub.c_subaddr NEQ 0)
{
env->evd_cmd.v_subaddr = TRUE;
env->evd_cmd.subaddr.v_tos = TRUE;
env->evd_cmd.subaddr.tos = pCtbNtry -> clgPtySub.tos;
env->evd_cmd.subaddr.v_oei = TRUE;
env->evd_cmd.subaddr.oei = pCtbNtry -> clgPtySub.odd_even;
env->evd_cmd.subaddr.c_subadr_str = pCtbNtry->clgPtySub.c_subaddr;
memcpy(&(env->evd_cmd.subaddr.subadr_str[0]),
&(pCtbNtry->clgPtySub.subaddr[0]),
pCtbNtry->clgPtySub.c_subaddr);
}
break;
case( EVENT_CALL_CONN ):
/* ti identifier */
/* MNCC_SETUP_CNF context with MO Call
or: MNCC_SETUP_RES context with MT Call
means: message sent to the side that originates the TI */
ti_flag = 0x08;
env->evd_cmd.ti_list.ti_oct[0].ti = trans_id | ti_flag;
break;
case( EVENT_CALL_DISC ):
/* ti identifier */
/*
means: message sent to the side that originates the TI */
switch (actionSrc)
{
case( NEAR_END ):
/* MNCC_REJ_IND / MNCC_DISC_REQ / MNCC_REL_REQ */
if ( /*lint -e(644) */ MT_flag )
ti_flag = 0x08;
else
ti_flag = 0x00;
break;
case( FAR_END ):
/* MNCC_DISC_IND / MNCC_REL_IND / MNCC_REL_REQ */
if ( MT_flag )
ti_flag = 0x00;
else
ti_flag = 0x08;
break;
}
env->evd_cmd.ti_list.ti_oct[0].ti = trans_id | ti_flag;
/* Cause */
env->evd_cmd.v_cause = TRUE;
if (pCtbNtry -> numRawCauseBytes EQ 0)
{
if (GET_CAUSE_VALUE(pCtbNtry -> rejCs) NEQ NOT_PRESENT_8BIT) /* radio-link failure */
{
env->evd_cmd.cause.c_cs = 0;
}
else
{
if (GET_CAUSE_VALUE(pCtbNtry -> nrmCs) NEQ NOT_PRESENT_8BIT)
{
env->evd_cmd.cause.c_cs = 2;
/*Location is user : 0 and coding standard defined for the GSM PLMNS : 3 */
env->evd_cmd.cause.cs[0] =0xE0;
env->evd_cmd.cause.cs[1] = GET_CAUSE_VALUE(pCtbNtry -> nrmCs) |0x80 ;
}
else
{
env->evd_cmd.v_cause = FALSE;
}
}
}
else
{
env->evd_cmd.cause.c_cs = pCtbNtry -> numRawCauseBytes;
memcpy( env->evd_cmd.cause.cs,
pCtbNtry -> rawCauseBytes,
pCtbNtry -> numRawCauseBytes );
}
break;
case( EVENT_LOC_STATUS ):
env->evd_cmd.v_loc_state = TRUE;
switch( satShrdPrm.locInfo.regStatus )
{
case( NO_VLD_RS ):
env->evd_cmd.v_loc_state = FALSE;
break;
case( RS_NO_SRV ):
env->evd_cmd.loc_state = 0x02;
break;
case( RS_LMTD_SRV ):
env->evd_cmd.loc_state = 0x01;
break;
case( RS_FULL_SRV ):
env->evd_cmd.loc_state = 0x00;
/*---------------------------------------------------
only in this case would location info be included
----------------------------------------------------*/
/* location information */
/* code MCC */
env->evd_cmd.cc_smc_loc_info.mnc_mcc |=
((satShrdPrm.locInfo.currPLMN.mcc[1]<<4) + satShrdPrm.locInfo.currPLMN.mcc[0]) <<16;
env->evd_cmd.cc_smc_loc_info.mnc_mcc |=
((satShrdPrm.locInfo.currPLMN.mnc[2]<<4) + satShrdPrm.locInfo.currPLMN.mcc[2]) << 8;
/* code MNC */
env->evd_cmd.cc_smc_loc_info.mnc_mcc |=
(satShrdPrm.locInfo.currPLMN.mnc[1]<<4)+satShrdPrm.locInfo.currPLMN.mnc[0];
/* code LAC */
env->evd_cmd.cc_smc_loc_info.lac = satShrdPrm.locInfo.lac;
/* code CID */
env->evd_cmd.cc_smc_loc_info.cid = satShrdPrm.locInfo.cid;
env->evd_cmd.v_cc_smc_loc_info = TRUE;
break;
}
break;
#ifdef FF_SAT_E
case( EVENT_CHAN_STAT ):
env->evd_cmd.v_chan_stat = TRUE;
env->evd_cmd.chan_stat.chan_id = CHANNEL_ID_1;
env->evd_cmd.chan_stat.chan_stat_link = LINK_NO_ESTABL;
env->evd_cmd.chan_stat.chan_stat_inf2 = LINK_DROPPED;
break;
#endif /* FF_SAT_E */
default:
env->v_evd_cmd = FALSE;
TRACE_EVENT("wrong event id for SAT event download");
break;
}
/*
*-------------------------------------------------------------------
* check if a call control request is already in progress
*-------------------------------------------------------------------
*/
if( satShrdPrm.SIMCCParm.busy EQ TRUE )
{
/* event has to be queued */
T_SAT_QUEUE *p_queue;
if (satShrdPrm.event.c_queued >= MAX_EVENT_QUEUED - 1 )
{
TRACE_EVENT("Too many events have been queued: failed to queue this new event");
return FALSE;
}
p_queue = &satShrdPrm.event.queued[satShrdPrm.event.c_queued - 1];
p_queue->owner = (T_OWN)satShrdPrm.owner;
if (p_queue->stk_cmd NEQ NULL)
{
MFREE (p_queue->stk_cmd); /* Should not happen */
}
ACI_MALLOC (p_queue->stk_cmd, sizeof (T_stk_cmd));
if (psaSAT_STKBuildCmd (p_queue->stk_cmd) < 0)
{
ACI_MFREE (p_queue->stk_cmd);
p_queue->stk_cmd = NULL;
TRACE_ERROR ("problem encoding SAT cmd");
return FALSE;
}
satShrdPrm.event.c_queued++;
}
return TRUE;
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : SAT |
| ROUTINE : psaSAT_SendTrmResp |
+-------------------------------------------------------------------+
PURPOSE : Send a terminal response for a previous SAT command.
*/
GLOBAL void psaSAT_InitTrmResp ( T_ACI_SAT_TERM_RESP *init_resp )
{
init_resp->addLen = 0;
init_resp->add = NULL;
init_resp->add_content = 0;
init_resp->resCC = NULL;
init_resp->text = NULL;
init_resp->at_resp = NULL;
init_resp->at_resp_count = 0;
#ifdef FF_SAT_E
init_resp->chnStat = FALSE;
init_resp->bearDesc = FALSE;
init_resp->bufSize = FALSE;
#endif /* FF_SAT_E */
memset (init_resp->dtt_buf, 0xFF, TIME_STAMP_LENGTH);
memset (init_resp->lang, 0xFF, CLAN_CODE_LEN);
}
LOCAL void sat_build_cc_action_resp(UBYTE rspId,
UBYTE addLen,
UBYTE *add,
UBYTE *resCC,
T_TERM_RESP *res)
{
UBYTE byteLen; /* holds byte length */
UBYTE *p; /* byte pointer */
if( satShrdPrm.stkCnfPrim OR resCC )
{
p = (resCC)? resCC : satShrdPrm.stkCnfPrim->stk_cmd.cmd;
if( p[1] EQ 0x81 )
{
byteLen = p[2];
p = &p[3];
}
else
{
byteLen = p[1];
p = &p[2];
}
res->v_cc_req_act = TRUE;
res->cc_req_act.l_cc_req_act = byteLen<<3;
memcpy( res->cc_req_act.b_cc_req_act, p, byteLen );
/* result 2 */
res->v_res_2 = TRUE;
res->res_2.gen = res->res.gen;
/* adjust first result according to second result (GSM 11.14 / 9.1) */
if( rspId <= 0x1F )
res->res.gen = RSLT_PERF_MDFY_SIM;
else if( rspId >= 0x20 AND rspId <= 0x2F )
res->res.gen = RSLT_CC_SIM_TMP;
else if( rspId >= 0x30 AND rspId <= 0x3F )
{
res->res.gen = RSLT_CC_SIM_PRM;
res->res.v_add = TRUE;
res->res.add.l_add = 8;
res->res.add.b_add[0] = ADD_CC_REQ_CHNG;
}
if( addLen )
{
if( res->res.gen NEQ RSLT_CC_SIM_PRM ) res->res.v_add = FALSE;
res->res_2.v_add = TRUE;
res->res_2.add.l_add = addLen<<3;
memcpy( res->res_2.add.b_add,
add,
addLen );
}
/* free the primitive */
if( satShrdPrm.stkCnfPrim )
{
PFREE( satShrdPrm.stkCnfPrim );
satShrdPrm.stkCnfPrim = NULL;
}
}
}
GLOBAL BOOL psaSAT_SendTrmResp ( UBYTE rspId,
T_ACI_SAT_TERM_RESP *data_for_term_resp)
{
TRACE_FUNCTION("psaSAT_SendTrmResp()");
/*
*-------------------------------------------------------------------
* build terminal response
*-------------------------------------------------------------------
*/
CCD_START;
{
MCAST( res, TERM_RESP );
memset( res, 0, sizeof( T_TERM_RESP ));
/* init of data_for_term_resp */
/* return network error cause GSM 11.14 / 12.12.3 (it's mandatory) */
if( ( data_for_term_resp->add_content NEQ 0 ) OR
( rspId EQ RSLT_NTW_UNAB_PROC ) )
{
data_for_term_resp->add = &(data_for_term_resp->add_content);
data_for_term_resp->addLen = 1;
}
/* device identities */
res->v_cmd_details = TRUE;
res->cmd_details.cmd_nr = satShrdPrm.cmdDet.cmdNr;
res->cmd_details.cmd_typ = satShrdPrm.cmdDet.cmdType;
res->cmd_details.cmd_qlf = satShrdPrm.cmdDet.cmdQlf;
/* device identities */
res->v_dev_ids = TRUE;
res->dev_ids.src_dev = DEV_SRC_ME;
res->dev_ids.dest_dev = DEV_DST_SIM;
/* result */
res->v_res = TRUE;
res->res.gen = (rspId EQ RSLT_PERF_SUCCESS AND cmpFlg)?
RSLT_PERF_PART_CMPR:rspId;
if( data_for_term_resp->addLen )
{
res->res.v_add = TRUE;
res->res.add.l_add = data_for_term_resp->addLen<<3;
memcpy( res->res.add.b_add, data_for_term_resp->add, data_for_term_resp->addLen );
}
/* call control requested action */
sat_build_cc_action_resp( rspId,
data_for_term_resp->addLen,
data_for_term_resp->add,
data_for_term_resp->resCC,
res );
/* USSD related terminal response */
if( data_for_term_resp->text NEQ NULL )
{
res->v_text = TRUE;
res->text.dcs = data_for_term_resp->text->dcs;
res->text.c_text_str = data_for_term_resp->text->c_text_str;
memcpy( &(res->text.text_str),
data_for_term_resp->text->text_str,
data_for_term_resp->text->c_text_str);
}
/* Run AT related terminal response */
if( data_for_term_resp->at_resp NEQ NULL )
{
res->v_at_resp = TRUE;
memcpy( res->at_resp.text_str,
data_for_term_resp->at_resp,
data_for_term_resp->at_resp_count );
res->at_resp.c_text_str = (UBYTE)data_for_term_resp->at_resp_count;
}
/*
Provide Local Information (date, time and time zone)
related terminal response
*/
if( data_for_term_resp->dtt_buf[0] NEQ 0xFF)
{
res->v_dtt = TRUE;
memcpy( res->dtt.text_str,
data_for_term_resp->dtt_buf,
TIME_STAMP_LENGTH );
res->dtt.c_text_str = (UBYTE)TIME_STAMP_LENGTH;
}
/*
Provide Local Information (Language Setting)
*/
if( data_for_term_resp->lang[0] NEQ 0xFF)
{
res->v_lang = TRUE;
memcpy( res->lang.lang_buf,
data_for_term_resp->lang,
CLAN_CODE_LEN );
res->lang.c_lang_buf = (UBYTE)CLAN_CODE_LEN;
}
#ifdef FF_SAT_E
/* add channel status to terminal response */
if( data_for_term_resp->chnStat NEQ FALSE )
{
/* restricted to only one channel for class e */
res->v_chan_stat = TRUE;
res->c_chan_stat = 1;
res->chan_stat[0].chan_id = CHANNEL_ID_1;
res->chan_stat[0].chan_stat_inf2 = NO_FURTH_INFO;
res->chan_stat[0].chan_stat_link = LINK_NO_ESTABL;
if( satShrdPrm.chnTb.chnUsdFlg )
{
switch( satShrdPrm.chnTb.lnkStat )
{
case( SIM_LINK_CNCT ):
res->chan_stat[0].chan_stat_link = LINK_ESTABL;
break;
case( SIM_LINK_DROP ):
res->chan_stat[0].chan_stat_inf2 = LINK_DROPPED;
break;
default: /* already handled by pre-setting */
break;
}
}
}
/* add bearer description to terminal response */
if( data_for_term_resp->bearDesc NEQ FALSE AND satShrdPrm.opchPrm )
{
if( satShrdPrm.opchType EQ B_CSD )
{
res->v_bear_desc = TRUE;
res->bear_desc.bear_type = BT_CSD;
res->bear_desc.v_csd_bear_prm = TRUE;
res->bear_desc.csd_bear_prm = ((T_SAT_CSD_PRM*)satShrdPrm.opchPrm)->csd_bear_prm;
}
if( satShrdPrm.opchType EQ B_GPRS )
{
res->v_bear_desc = TRUE;
res->bear_desc.bear_type = BT_GPRS;
res->bear_desc.v_gprs_bear_prm = TRUE;
res->bear_desc.gprs_bear_prm = ((T_SAT_GPRS_PRM*)satShrdPrm.opchPrm)->gprs_bear_prm;
}
}
/* add buffer size to terminal response */
if( data_for_term_resp->bufSize NEQ FALSE )
{
res->v_buffer_size = TRUE;
res->buffer_size = satShrdPrm.buffer_size;
}
#endif /* FF_SAT_E */
cmpFlg = FALSE;
}
/*
*-------------------------------------------------------------------
* send terminal response
*-------------------------------------------------------------------
*/
satShrdPrm.owner = OWN_SRC_INV;
satShrdPrm.ownSAT = FALSE;
memset( &satShrdPrm.stk_ccp, 0, sizeof(BUF_cap_cnf_parms));
#ifdef TI_PS_FF_AT_P_CMD_CUST
if (satShrdPrm.cust1StkCmd != (void *)0)
{
ACI_MFREE(satShrdPrm.cust1StkCmd); /* Free the dynamically allocated Cust1 Stk Cmd memory */
satShrdPrm.cust1StkCmd = (void *)0;
satShrdPrm.cust1StkCmdLen = 0;
}
#endif /* TI_PS_FF_AT_P_CMD_CUST */
if( psaSAT_STKResponse() < 0 ) /* STK command response */
{
TRACE_EVENT( "FATAL RETURN SAT in send term resp" );
CCD_END;
return( FALSE );
}
CCD_END;
return (TRUE);
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SATF |
| ROUTINE : psaSAT_dasmMECmd |
+-------------------------------------------------------------------+
PURPOSE : disassemble ME proactive SIM command.
*/
GLOBAL BOOL psaSAT_dasmMECmd ( BUF_cmd_prms *cmdPrm )
{
UBYTE ccdRet, err;
T_ACI_SAT_TERM_RESP resp_data;
BOOL aciOnlyEvents; /* holds information whether only ACI events are in SET UP
EVENT LIST */
BOOL sendRes; /* holds temporaly return result whether to send response
or not */
/* response message in the case of SET UP EVENT LIST, only ACI events */
static UBYTE TRSetEventOk [12] =
{
0x81, /* command details tag */
0x03, /* command details length */
0x00, /* will be updated to current cmd num */
0x05, /* command SETUP EVENT LIST */
0x00, /* not used */
0x82, /* device details tag */
0x02, /* device details length */
0x82, /* source ME */
0x81, /* destination SIM */
0x83, /* result tag */
0x01, /* result length */
0x00 /* result OK */
};
TRACE_FUNCTION("psaSAT_dasmMECmd");
psaSAT_InitTrmResp( &resp_data );
#ifdef TI_PS_FF_AT_P_CMD_CUST
if ((satShrdPrm.cmdDet.cmdType NEQ SAT_CMD_EVENT_LIST) AND /* ACI has to process the event before */
(simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_NORMAL_BEHAVIOUR)) /* and NOT Cust1 behaviour */
#else
if (satShrdPrm.cmdDet.cmdType NEQ SAT_CMD_EVENT_LIST)
#endif /* TI_PS_FF_AT_P_CMD_CUST */
cmhSAT_STKUsrNtfy();
if( cmdPrm EQ NULL ) /* no parameter */
{
memset(&satShrdPrm.stkCmdPrm, 0,
sizeof(satShrdPrm.stkCmdPrm));
}
else
{
memcpy( &satShrdPrm.stkCmdPrm, cmdPrm,
sizeof(satShrdPrm.stkCmdPrm));
ccdRet = ccd_decodeMsg (CCDENT_SAT,
DOWNLINK,
(T_MSGBUF *) &satShrdPrm.stkCmdPrm,
(UBYTE *) _decodedMsg,
satShrdPrm.cmdDet.cmdType );
/* check for CCD error */
if( ccdRet NEQ ccdOK )
{
TRACE_EVENT_P1( "CCD Decoding Error: %d", ccdRet );
err = psaSAT_ccdErrChk();
if( err NEQ 0 )
{
psaSAT_SendTrmResp( err, &resp_data );
return( FALSE );
}
}
}
/* continue processing */
switch( satShrdPrm.cmdDet.cmdType )
{
case( SAT_CMD_SETUP_CALL ):
{
MCAST( calCmd, SETUP_CALL );
return( cmhSAT_setupCall( calCmd ));
}
case( SAT_CMD_SEND_SS ):
{
MCAST( ssCmd, SEND_SS );
return( cmhSAT_sendSS( ssCmd ));
}
case( SAT_CMD_SEND_USSD ):
{
MCAST( ussdCmd, SEND_USSD );
return( cmhSAT_sendUSSD( ussdCmd ));
}
case( SAT_CMD_SEND_SMS ):
{
MCAST( smCmd, SEND_SM );
return( cmhSAT_sendSM( smCmd ));
}
case( SAT_CMD_SEND_DTMF ):
{
MCAST( dtmfCmd, SEND_DTMF );
return( cmhSAT_sendDTMF( dtmfCmd ));
}
case( SAT_CMD_EVENT_LIST ):
{
MCAST( setEvent, SETUP_EVENT );
if (cmhSAT_setupEvent_Test( setEvent, &aciOnlyEvents ))
{
/* ACI-SPR-18200: If there are no Events to be processed by MMI
ACI bypasses the MMI functionality and returns TR by itself */
/* something went wrong, temp event list is empty --> TR(30) */
if ( satShrdPrm.event.temp_list EQ 0L )
{
psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
return FALSE;
}
if ( aciOnlyEvents )
{
/* prepare response to signal OK to SATK */
TRSetEventOk[2] = satShrdPrm.cmdDet.cmdNr;
satShrdPrm.setPrm[satShrdPrm.owner].stkCmd = TRSetEventOk;
satShrdPrm.setPrm[satShrdPrm.owner].stkCmdLen = 12;
/* inform SIM about acknowledged event list */
sendRes = cmhSAT_CheckSetEventResp( );
if (sendRes)
{
if( psaSAT_STKResponse() < 0 ) /* respond to STK command */
{
TRACE_EVENT( "FATAL RETURN - TR could not be send" );
}
}
}
else /* signal MMI to process further events */
{
cmhSAT_STKCmdInd();
}
return TRUE;
}
else
{
if ( satShrdPrm.event.temp_list NEQ 0L )
{
satShrdPrm.event.temp_list = 0L; /* reinitialize temp_event_list */
psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data );
}
}
}
break;
case( SAT_CMD_RUN_AT ):
{
MCAST( calCmd, RUN_AT );
return( cmhSAT_runAt( calCmd ));
}
case( SAT_CMD_LAUNCH_BROWSER ):
{
MCAST( launchBrowserCmd, LAUNCH_BROWSER );
return( cmhSAT_launchBrowser( launchBrowserCmd ));
}
case( SAT_CMD_PROV_LOC_INFO):
{
return( cmhSAT_provLocalInfo());
}
#ifdef FF_SAT_E
case( SAT_CMD_OPEN_CHANNEL ):
{
MCAST( opchCmd, OPEN_CHANNEL );
return( cmhSAT_OpenChannelReq( opchCmd ));
}
#endif /* FF_SAT_E */
}
return( FALSE );
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SATF |
| ROUTINE : psaSAT_SSResComp |
+-------------------------------------------------------------------+
PURPOSE : SS result component handling.
*/
GLOBAL void psaSAT_SSResComp ( T_res_comp* resCmp )
{
UBYTE addLen = 0;
T_ACI_SAT_TERM_RESP resp_data;
psaSAT_InitTrmResp( &resp_data );
/* Add the operation code and parameters to terminal response
(reference: section 12.12.1 "Additional information for SEND SS" of 11.14)
*/
if( resCmp -> v_sequence AND
resCmp -> sequence.v_op_code )
{
ssResPrms[0] = resCmp -> sequence.op_code;
if( resCmp -> sequence.params.l_params )
{
addLen = resCmp -> sequence.params.l_params >> 3;
memcpy( &ssResPrms[1], resCmp -> sequence.params.b_params, addLen);
}
++addLen;
}
resp_data.add = ssResPrms;
resp_data.addLen = addLen;
psaSAT_SendTrmResp( RSLT_PERF_SUCCESS, &resp_data );
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SATF |
| ROUTINE : psaSAT_SSErrComp |
+-------------------------------------------------------------------+
PURPOSE : SS error result component handling.
*/
GLOBAL void psaSAT_SSErrComp ( T_fac_inf* errCmp, BOOL is_fac_ussd )
{
UBYTE ccdRet;
UBYTE addLen = 1;
T_ACI_SAT_TERM_RESP resp_data;
MCAST( com, COMP_SAT );
TRACE_FUNCTION("psaSAT_SSErrComp()");
psaSAT_InitTrmResp( &resp_data );
*ssResPrms = ADD_NO_CAUSE;
memset( com, 0, sizeof( T_COMP_SAT ));
ccdRet = ccd_decodeMsg (CCDENT_FAC,
DOWNLINK,
(T_MSGBUF *) errCmp,
(UBYTE *) _decodedMsg,
COMP_SAT);
if( ccdRet NEQ ccdOK )
{
TRACE_EVENT_P1("CCD Decoding Error: %d",ccdRet );
}
else
{
if( com->err_comp_sat.err_desc_sat.err_params_sat.
l_err_params_sat )
{
addLen = com->err_comp_sat.err_desc_sat.err_params_sat.
l_err_params_sat >> 3;
memcpy( ssResPrms,com->err_comp_sat.err_desc_sat.err_params_sat.
b_err_params_sat, addLen );
}
}
resp_data.add = ssResPrms;
resp_data.addLen = addLen;
if( is_fac_ussd )
{
psaSAT_SendTrmResp( RSLT_USSD_ERR, &resp_data );
}
else
{
psaSAT_SendTrmResp( RSLT_SS_ERR, &resp_data );
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SATF |
| ROUTINE : psaSAT_SSRejComp |
+-------------------------------------------------------------------+
PURPOSE : SS reject component handling.
*/
GLOBAL void psaSAT_SSRejComp ( UBYTE cRejectInfo )
{
UBYTE addLen = 1;
T_ACI_SAT_TERM_RESP resp_data;
TRACE_FUNCTION("psaSAT_SSRejComp()");
psaSAT_InitTrmResp( &resp_data );
*ssResPrms = ADD_NO_CAUSE;
resp_data.add = ssResPrms;
resp_data.addLen = addLen;
psaSAT_SendTrmResp( cRejectInfo, &resp_data );
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SATF |
| ROUTINE : psaSAT_ss_end_ind |
+-------------------------------------------------------------------+
PURPOSE : handles SAT responses to SAT after a SAT originated SS.
*/
GLOBAL T_ACI_RETURN psaSAT_ss_end_ind ( SHORT sId,
T_COMPONENT *com,
T_MNSS_END_IND *mnss_end_ind,
BOOL is_fac_ussd )
{
TRACE_FUNCTION("psaSAT_ss_end_ind()");
if( com->v_res_comp )
{
if( is_fac_ussd EQ FALSE ) /* not for USSD !! */
{
//TISH, patch for ASTec20762
//start
psaSS_dasmResultCmp( sId, &com->res_comp );
//end
psaSAT_SSResComp( &com->res_comp );
}
else
{
psaSS_dasmResultCmp( sId, &com->res_comp );
}
return( AT_EXCT );
}
if( com->v_err_comp )
{
ssShrdPrm.stb[sId].failType = SSF_SS_ERR;
psaSAT_SSErrComp( &mnss_end_ind -> fac_inf, is_fac_ussd );
return( AT_FAIL );
}
if( com->v_rej_comp )
{
UBYTE cRejectInfo = RSLT_NTW_UNAB_PROC;
/* check for protocol incompatibility for USSD */
if ( (is_fac_ussd) AND
(com->rej_comp.v_inv_problem) )
{
switch( com->rej_comp.inv_problem )
{
case 0x01 : /* invoke problem code #1 */
{
if (psaSS_asmUSSDProt1(sId))
{
/* facility with Protocole 1 format has been sent: wait for answer */
return( AT_CMPL );
}
cRejectInfo = RSLT_NTW_UNAB_PROC;
break;
}
case 0x02 : /* invoke problem code #2 */
{
cRejectInfo = RSLT_USSD_ERR;
break;
}
default :
{
TRACE_EVENT_P1("psaSAT_ss_end_ind(): unknown invoke problem: %x", com->rej_comp.inv_problem );
break;
}
}
ssShrdPrm.stb[sId].failType = SSF_INV_PRB;
}
/* check for protocol incompatibility for USSD */
if ((is_fac_ussd EQ FALSE) AND (com->rej_comp.v_gen_problem))
{
ssShrdPrm.stb[sId].failType = SSF_GEN_PRB;
/* for 27.22.4.11.1 Seq. 1.3 SEND SS */
if (com->rej_comp.gen_problem EQ GEN_PROB_UNRECOG_CMP)
{
cRejectInfo = RSLT_SS_ERR;
}
}
psaSAT_SSRejComp( cRejectInfo );
return( AT_FAIL );
}
return(AT_FAIL);
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SATF |
| ROUTINE : psaSAT_ccdErrChk |
+-------------------------------------------------------------------+
PURPOSE : CCD error checking. The function returns a SAT result
value unequal to 0 if the operation is must be terminated.
Otherwise the condition is only a warning and the operation
should be proceeded.
*/
GLOBAL UBYTE psaSAT_ccdErrChk ( void )
{
USHORT parLst[MAX_ERR_PAR];
UBYTE ccdErr;
UBYTE fstFlg = TRUE;
TRACE_FUNCTION("psaSAT_ccdErrChk()");
/*
*-------------------------------------------------------------------
* handling of first error
*-------------------------------------------------------------------
*/
do
{
memset (parLst,0, sizeof (parLst));
if( fstFlg )
{
ccdErr = ccd_getFirstError (CCDENT_SAT, parLst);
fstFlg = FALSE;
}
else
ccdErr = ccd_getNextError (CCDENT_SAT, parLst);
switch (ccdErr)
{
case( ERR_IE_NOT_EXPECTED ): /* unexpected element */
if( !((UBYTE)parLst[0] & 0x80) )
{
cmpFlg = TRUE;
break;
}
/* otherwise continue, no break */
/*lint -fallthrough*/
case( ERR_COMPREH_REQUIRED ): /* comprehension required */
return( RSLT_UNKN_DATA );
case( ERR_MAND_ELEM_MISS ): /* mandatory elements missing */
return( RSLT_ERR_REQ_VAL );
}
} while( ccdErr NEQ ERR_NO_MORE_ERROR );
return( 0 );
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SAT |
| ROUTINE : psaSAT_DumpCmd |
+-------------------------------------------------------------------+
PURPOSE : Dump SAT command to debug output.
*/
GLOBAL void psaSAT_DumpCmd ( T_stk_cmd * cmd )
{
#define SAT_TRC_LEN 32
CHAR strBuf[2*SAT_TRC_LEN+1]; /* holds string buffer */
ULONG idx, cnt, mcnt; /* buffer index */
CHAR *pDest; /* points to destination */
TRACE_FUNCTION("psaSAT_DumpCmd()");
/*
*-------------------------------------------------------------------
* format command
*-------------------------------------------------------------------
*/
TRACE_EVENT( "SAT CMD SENT/RECEIVED:" );
mcnt = (ULONG)cmd->l_cmd >> 3;
if( !mcnt )
{
TRACE_EVENT_P1("an empty envelope. (%d)", (ULONG)cmd->l_cmd);
return;
}
for( cnt = 0; cnt < mcnt; cnt += SAT_TRC_LEN )
{
pDest = strBuf;
for( idx = 0; idx < SAT_TRC_LEN AND (idx + cnt) < mcnt; idx++ )
{
/* Implements Measure#32: Row 1277 */
pDest += sprintf( pDest, format_2X_str, (UBYTE)cmd->cmd[idx + cnt] );
}
*pDest = 0x0;
TRACE_EVENT_P1("%s", strBuf );
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SAT |
| ROUTINE : psaSAT_FURegister |
+-------------------------------------------------------------------+
PURPOSE : Register a handler for FILE UPDATE.
*/
GLOBAL BOOL psaSAT_FURegister ( T_SAT_FU_FUNC fu_func )
{
int i;
TRACE_FUNCTION("psaSAT_FURegister()");
for (i = 0; i < MAX_FU_OPS; i++)
{
if (satShrdPrm.fu_func[i] EQ fu_func)
{
TRACE_EVENT ("FU func already registered");
return TRUE;
}
if (satShrdPrm.fu_func[i] EQ NULL)
{
satShrdPrm.fu_func[i] = fu_func;
return TRUE;
}
}
return FALSE;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SAT |
| ROUTINE : psaSAT_FUConfirm |
+-------------------------------------------------------------------+
PURPOSE : Confirm a handled FILE UPDATE. The parameter is the same
with which the handler was called and refers to the entry
of the callback table.
*/
GLOBAL void psaSAT_FUConfirm (int currFU, USHORT resFU)
{
BOOL fu_active;
BOOL aci_sent_no_primitive;
TRACE_EVENT_P2("psaSAT_FUConfirm(): currFU: %d, resFU: %d", currFU, resFU);
if (resFU EQ SIM_FU_ERROR) /*If there is one error, the rest of the procedure is to be cancelled */
{
PALLOC (fu_res, SIM_FILE_UPDATE_RES);
fu_res->source = SRC_MMI;
fu_res->fu_rsc = SIM_FU_ERROR;
if (satShrdPrm.fu_func_notif)
(void)satShrdPrm.fu_func_notif((int)fu_res->fu_rsc,satShrdPrm.fu_ind); /*Sends the final result to MMI */
PSENDX (SIM, fu_res);
return;
}
TRACE_EVENT_P1("satShrdPrm.fu_ind: %d", satShrdPrm.fu_ind);
if (satShrdPrm.fu_ind NEQ NULL AND currFU < MAX_FU_OPS)
{
if (currFU < 0)
{
if (satShrdPrm.fu_func_notif)
{ /*Sends the file update request notification to MMI */
if (!satShrdPrm.fu_func_notif(-1,satShrdPrm.fu_ind))
{
PALLOC (fu_res, SIM_FILE_UPDATE_RES); /* If rejected, send negative response to SIM */
fu_res->source = SRC_MMI;
fu_res->fu_rsc = SIM_FU_ERROR;
PSENDX (SIM, fu_res);
}
}
currFU = 0;
/*satShrdPrm.fu_rsc = SIM_FU_ERROR;*/ /* default*/
fu_active = FALSE;
}
else
{
++currFU;
if ( (resFU EQ SIM_FU_SUCC_ADD) AND (satShrdPrm.fu_rsc NEQ SIM_FU_ERROR) )
{
satShrdPrm.fu_rsc = resFU;
}
/*
switch (resFU)
{
case SIM_FU_SUCCESS:
if (satShrdPrm.fu_rsc EQ SIM_FU_SUCC_ADD)
break;
case SIM_FU_SUCC_ADD:
satShrdPrm.fu_rsc = resFU;
}
*/
fu_active = TRUE;
}
for ( ; currFU < MAX_FU_OPS; currFU++)
{
if (satShrdPrm.fu_func[currFU] EQ NULL)
continue;
/* else
fu_active = TRUE;*/
aci_sent_no_primitive = satShrdPrm.fu_func[currFU](currFU, satShrdPrm.fu_ind);
if (!aci_sent_no_primitive)
{
return; /* otherwise, result would be sent directly, and not at the end */
}
}
{
PALLOC (fu_res, SIM_FILE_UPDATE_RES);
fu_res->source = SRC_MMI;
fu_res->fu_rsc = (fu_active)? satShrdPrm.fu_rsc: SIM_FU_SUCCESS;
if (satShrdPrm.fu_func_notif)
(void)satShrdPrm.fu_func_notif((int)fu_res->fu_rsc,satShrdPrm.fu_ind); /*Sends the final result to MMI */
TRACE_EVENT("FREE satShrdPrm.fu_ind");
PFREE (satShrdPrm.fu_ind);
satShrdPrm.fu_ind = NULL;
PSENDX (SIM, fu_res);
simShrdPrm.fuRef = -1;
}
}
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SAT |
| ROUTINE : psaSAT_FUNotifyRegister |
+-------------------------------------------------------------------+
PURPOSE : Register a handler for FILE UPDATE.
*/
GLOBAL BOOL psaSAT_FUNotifyRegister ( T_SAT_FU_FUNC fu_func )
{
TRACE_FUNCTION("psaSAT_FUNotifyRegister()");
if (fu_func)
{
satShrdPrm.fu_func_notif = fu_func;
return TRUE;
}
else
return FALSE;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : PSA_SAT |
| ROUTINE : psaSAT_Init |
+-------------------------------------------------------------------+
PURPOSE : initialize the protocol stack adapter for SAT.
*/
/* MACRO: initializer for set parameter */
#define INIT_SAT_SET_PARM( dest, def )\
for( LpCnt = 0; LpCnt < OWN_SRC_MAX; LpCnt++ )\
satShrdPrm.setPrm[LpCnt].dest = def
GLOBAL void psaSAT_Init ( void )
{
TRACE_FUNCTION("psaSAT_Init()");
/*
*-------------------------------------------------------------------
* set default parms
*-------------------------------------------------------------------
*/
memset( &satShrdPrm, 0, sizeof(T_SAT_SHRD_PRM));
satShrdPrm.dur = -1;
satShrdPrm.SentUSSDid = NO_ENTRY;
satShrdPrm.fu_rsc = SIM_FU_SUCCESS;
satShrdPrm.fu_ind = NULL;
satShrdPrm.sId_pwd_requested = NO_ENTRY;
#ifdef TI_PS_FF_AT_P_CMD_CUST
satShrdPrm.cust1SimRefreshRespRqd = FALSE;
#endif /* TI_PS_FF_AT_P_CMD_CUST */
satShrdPrm.locInfo.currPLMN.v_plmn = INVLD_PLMN;
satShrdPrm.Cbch_EvtDnl = FALSE;
satShrdPrm.ownSAT = FALSE;
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : SAT |
| ROUTINE : psaSAT_ChkEventList |
+-------------------------------------------------------------------+
PURPOSE : Check if the event is monitored and shall alert SAT.
*/
GLOBAL BOOL psaSAT_ChkEventList( UBYTE eventNr )
{
BOOL event_listed = FALSE;
TRACE_FUNCTION("psaSAT_ChkEventList()");
event_listed = (satShrdPrm.event.list >> eventNr ) & 0x01;
if( event_listed )
return( TRUE );
return( FALSE );
}
#ifdef FF_SAT_E
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : SAT |
| ROUTINE : psaSAT_ctbFindActCall |
+-------------------------------------------------------------------+
PURPOSE : Return the call id of a call which is in an active state.
If no call could be found the function returns NO_ENTRY.
*/
GLOBAL SHORT psaSAT_ctbFindActCall( void )
{
UBYTE ctbIdx;
SHORT actId = NO_ENTRY;
TRACE_FUNCTION("psaSAT_ctbFindActCall()");
for( ctbIdx = 0; ctbIdx < MAX_CALL_NR; ctbIdx++ )
{
if (ccShrdPrm.ctb[ctbIdx] NEQ NULL)
{
switch( psaCC_ctb(ctbIdx)->calStat )
{
case( CS_ACT ):
case( CS_ACT_REQ ):
case( CS_MDF_REQ ):
actId = ctbIdx;
break;
}
}
}
return( actId );
}
/*
+-------------------------------------------------------------------+
| PROJECT : GSM-PS (6147) MODULE : SAT |
| ROUTINE : psaSAT_gprsFindFreeCntxt|
+-------------------------------------------------------------------+
PURPOSE : Return a free context id, if busy return NO_ENTRY.
*/
#ifdef GPRS
GLOBAL SHORT psaSAT_gprsFindFreeCntxt( void )
{
BOOL cntxtStat[MAX_CID+1];
SHORT cntxtId[MAX_CID+1];
SHORT cid = NO_ENTRY;
UBYTE idx;
TRACE_FUNCTION("psaSAT_gprsFindFreeCntxt()");
if( qAT_PlusCGACT( CMD_SRC_LCL, cntxtStat, cntxtId ) NEQ AT_CMPL )
return( NO_ENTRY );
for( idx = 0; idx < MAX_CID; idx++ )
{
if( cntxtId[idx] NEQ INVALID_CID AND cntxtStat[idx] EQ TRUE ) continue;
cid = (cntxtId[idx] EQ INVALID_CID)? idx+1:cntxtId[idx];
break;
}
return( cid );
}
#endif /* GPRS */
#endif /* FF_SAT_E */
#endif /* #ifdef SIM_TOOLKIT */
/*==== EOF ========================================================*/