FreeCalypso > hg > fc-magnetite
diff src/g23m-aci/aci/aci_em.c @ 162:53929b40109c
src/g23m-aci: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 11 Oct 2016 02:02:43 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-aci/aci/aci_em.c Tue Oct 11 02:02:43 2016 +0000 @@ -0,0 +1,1774 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : ++----------------------------------------------------------------------------- +| 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 engineering mode (EM) device driver for the +| G23 protocol stack. This driver is used to control all engineering +| mode related functions. ++----------------------------------------------------------------------------- +*/ + +#ifndef ACI_EM_C +#define ACI_EM_C +#endif + +#include "aci_all.h" +/*===== INCLUDES ===================================================*/ + +#include "aci_cmh.h" + +#ifdef UART +#include "dti.h" +#include "dti_conn_mng.h" +#endif + +#ifdef _SIMULATION_ +#ifdef UART +#include "psa_uart.h" +#endif +#endif + +#include "ati_cmd.h" +#include "aci_mem.h" + +#ifdef FF_ATI +#include "aci_io.h" +#endif + +#include "aci.h" + +#include "aci_em.h" + +#ifdef GPRS +#include "gaci.h" +#include "gaci_cmh.h" +#include "psa.h" +#include "cmh.h" +#include "cmh_sm.h" +#endif + + +/*==== CONSTANTS ==================================================*/ +/*==== PRIVAT =====================================================*/ +/*==== EXPORT =====================================================*/ + +EXTERN UBYTE em_l1_sem_buffer []; +EXTERN UBYTE em_l1_sem_index; +EXTERN UBYTE em_dl_sem_buffer []; +EXTERN UBYTE em_dl_sem_index; +EXTERN UBYTE em_rr_sem_buffer []; +EXTERN UBYTE em_rr_sem_index; + +EXTERN void em_l1_sem_read (void); +EXTERN void em_l1_sem_reset(void); +EXTERN void em_dl_sem_read (void); +EXTERN void em_dl_sem_reset(void); +EXTERN void em_rr_sem_read (void); +EXTERN UBYTE em_rr_sem_reset(void); + +EXTERN UBYTE em_mm_event_buffer[EM_MM_BUFFER_SIZE]; +EXTERN UBYTE em_mm_buffer_write; +EXTERN UBYTE em_cc_event_buffer[EM_CC_BUFFER_SIZE]; +EXTERN UBYTE em_cc_buffer_write; +EXTERN UBYTE em_ss_event_buffer[EM_SS_BUFFER_SIZE]; +EXTERN UBYTE em_ss_buffer_write; +EXTERN UBYTE em_sms_event_buffer[EM_SMS_BUFFER_SIZE]; +EXTERN UBYTE em_sms_buffer_write; +EXTERN UBYTE em_sim_event_buffer[EM_SIM_BUFFER_SIZE]; +EXTERN UBYTE em_sim_buffer_write; + +EXTERN void em_aci_sem (UBYTE entity, UBYTE *buffer, UBYTE buf_index_tmp); + +#ifndef WIN32 +EXTERN const CHAR* l1_version(void); +EXTERN const CHAR* dl_version(void); +EXTERN const CHAR* rr_version(void); +EXTERN const CHAR* mm_version(void); +EXTERN const CHAR* cc_version(void); +EXTERN const CHAR* ss_version(void); +EXTERN const CHAR* sim_version(void); +EXTERN const CHAR* sms_version(void); +/*EXTERN const CHAR* aci_version(void);*/ +#endif + +/*==== VARIABLES ==================================================*/ + +/* +* callback for the single infrastructure and mobile data functions. +*/ +static drv_SignalCB_Type_EM em_para_signal_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_sc_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_sc_gprs_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_nc_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_loc_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_plmn_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_cip_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_pow_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_id_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_ver_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_gmm_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_grlc_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_amr_callback = NULL; +static drv_SignalCB_Type_EM em_para_signal_pdp_callback = NULL; + +/* +* callback for the event trace function. +*/ +static drv_SignalCB_Type_EM_EVENT em_event_signal_callback = NULL; + +/* +* These flags indicates if the first event for the corresponding entity occurred. It is only used to +* prevent unnecessary semaphor copying. +*/ +static UBYTE em_l1_trace; +static UBYTE em_dl_trace; +static UBYTE em_rr_trace; +static UBYTE em_mm_trace; +static UBYTE em_cc_trace; +static UBYTE em_ss_trace; +static UBYTE em_sms_trace; +static UBYTE em_sim_trace; + +/* +* The buffer keeps all information about index and length of the single event trace data until it is +* passed to the originator of the em_Read_Event_Parameter() call. +*/ +static T_EM_EVENT_BUF aci_em_buf; + +static UBYTE drv_enabled; + +static UBYTE em_aci_buf_index; + +GLOBAL USHORT em_relcs = 0; + +/*==== FUNCTIONS ==================================================*/ +LOCAL UBYTE em_class_infra_data (UBYTE em_subclass, UBYTE em_type); +LOCAL UBYTE em_class_mobile_data (UBYTE em_subclass, UBYTE em_type); +LOCAL UBYTE em_class_event_tracing (UBYTE em_subclass, ULONG bitmask_h, ULONG bitmask_l); + +LOCAL UBYTE em_subclass_sc (UBYTE em_type); +LOCAL UBYTE em_subclass_sc_gprs (UBYTE em_type); +LOCAL UBYTE em_subclass_nc (UBYTE em_type); +LOCAL UBYTE em_subclass_loc_pag (UBYTE em_type); +LOCAL UBYTE em_subclass_plmn (UBYTE em_type); +LOCAL UBYTE em_subclass_ciph_hop_dtx (UBYTE em_type); +LOCAL UBYTE em_subclass_power (UBYTE em_type); +LOCAL UBYTE em_subclass_id (UBYTE em_type); +LOCAL UBYTE em_subclass_version (UBYTE em_type); +LOCAL UBYTE em_subclass_gmm (UBYTE em_type); +LOCAL UBYTE em_subclass_grlc (UBYTE em_type); +LOCAL UBYTE em_subclass_amr (UBYTE em_type); +#ifdef GPRS +LOCAL UBYTE em_subclass_pdp (UBYTE em_type); +LOCAL void em_pco_pdp_trace_req (void ); +#endif + +LOCAL UBYTE em_event_l1 (USHORT bitmask_h, ULONG bitmask_l); +LOCAL UBYTE em_event_dl (USHORT bitmask_h); +LOCAL UBYTE em_event_rr (USHORT bitmask_h, ULONG bitmask_l); +LOCAL UBYTE em_event_mm (ULONG bitmask_h); +LOCAL UBYTE em_event_cc (ULONG bitmask_h, ULONG bitmask_l); +LOCAL UBYTE em_event_ss (USHORT bitmask_h); +LOCAL UBYTE em_event_sms (ULONG bitmask_h, ULONG bitmask_l); +LOCAL UBYTE em_event_sim (ULONG bitmask); + +LOCAL void em_sw_ver_info_cnf (T_EM_SW_VER *version); + + +/*==== FUNCTIONS ==================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : em_Init ++------------------------------------------------------------------------------ +| Description : The function initializes the driverīs internal data. The +| function returns DRV_OK in case of a successful completition. +| The function returns DRV_INITIALIZED if the driver has already +| been initialized and is ready to be used or is already in use. +| In case of an initialization failure, which means that the +| driver cannot be used, the function returns DRV_INITFAILURE. +| This function handles unsupported primitives. +| +| Parameters : Callback function +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_Init (drv_SignalCB_Type_EM in_SignalCBPtr, drv_SignalCB_Type_EM_EVENT in_SignalEventCBPtr) +{ + TRACE_FUNCTION("em_Init ()"); + + em_para_signal_callback = in_SignalCBPtr; /* store call-back function - Data */ + em_event_signal_callback = in_SignalEventCBPtr; /* store call-back function - Event */ + + em_relcs = 0; + + if (drv_enabled EQ FALSE) { /* EM not initialized yet */ + drv_enabled = TRUE; + return DRV_OK; + } + else { + return DRV_INITIALIZED; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : em_Exit ++------------------------------------------------------------------------------ +| Description : The function is used to indicate that the driver and its +| functionality isnīt needed anymore. +| +| Parameters : void +| +| Return : void ++------------------------------------------------------------------------------ +*/ + +GLOBAL void em_Exit (void) +{ + TRACE_FUNCTION("em_Exit ()"); + + em_para_signal_callback = NULL; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_Read_Data_Parameter ++------------------------------------------------------------------------------ +| Description : The function is used to indicate that the driver and its +| functionality isnīt needed anymore. +| +| Parameters : UBYTE em_class +| UBYTE em_subclass +| UBYTE em_type +| void (*cbfunc)(T_DRV_SIGNAL_EM * Signal) +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_Read_Data_Parameter (UBYTE em_class, UBYTE em_subclass, UBYTE em_type, + void (*cbfunc)(T_DRV_SIGNAL_EM * Signal)) +{ + TRACE_FUNCTION("em_Read_Data_Parameter ()"); + + /* + Used to store the callback-address for the different sub-functions. If the same infrastructure data is + requested a second time before the first one is served only the latest one is handled. + */ + switch (em_subclass) + { + case EM_SUBCLASS_SC: + em_para_signal_sc_callback = cbfunc; + break; + case EM_SUBCLASS_SC_GPRS: + em_para_signal_sc_gprs_callback = cbfunc; + break; + case EM_SUBCLASS_NC: + em_para_signal_nc_callback = cbfunc; + break; + case EM_SUBCLASS_LOC_PAG: + em_para_signal_loc_callback = cbfunc; + break; + case EM_SUBCLASS_PLMN: + em_para_signal_plmn_callback = cbfunc; + break; + case EM_SUBCLASS_CIPH_HOP_DTX: + em_para_signal_cip_callback = cbfunc; + break; + case EM_SUBCLASS_POWER: + em_para_signal_pow_callback = cbfunc; + break; + case EM_SUBCLASS_ID: + em_para_signal_id_callback = cbfunc; + break; + case EM_SUBCLASS_SW_VERSION: + em_para_signal_ver_callback = cbfunc; + break; + case EM_SUBCLASS_GMM: + em_para_signal_gmm_callback = cbfunc; + break; + case EM_SUBCLASS_GRLC: + em_para_signal_grlc_callback = cbfunc; + break; + case EM_SUBCLASS_AMR: + em_para_signal_amr_callback = cbfunc; + break; + case EM_SUBCLASS_PDP: + em_para_signal_pdp_callback = cbfunc; + break; + default: + em_para_signal_callback = NULL; + break; + } + + switch (em_class) + { + case EM_CLASS_INFRA_DATA: + return(em_class_infra_data(em_subclass, em_type)); + case EM_CLASS_MOBILE_DATA: + return(em_class_mobile_data(em_subclass, em_type)); + default: + return EM_INVALID_CLASS; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : em_Read_Event_Parameter ++------------------------------------------------------------------------------ +| Description : The function is used to indicate that the driver and its +| functionality isnīt needed anymore. +| +| Parameters : UBYTE entity +| (*cbfunc)(T_DRV_SIGNAL_EM_EVENT * Signal) +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +GLOBAL UBYTE em_Read_Event_Parameter (UBYTE entity, void (*cbfunc)(T_DRV_SIGNAL_EM_EVENT * Signal)) +{ + T_DRV_SIGNAL_EM_EVENT signal_params; + + UBYTE emet1=0,emet2=0,emet3=0,emet4=0,emet5=0,emet6=0,emet7=0,emet8=0; + UBYTE *event_buf; + USHORT length_event_buf; + UBYTE alr_tmp, dl_tmp, rr_tmp, mm_tmp, cc_tmp, ss_tmp, sms_tmp, sim_tmp; + + TRACE_FUNCTION("em_Read_Event_Parameter ()"); + + /* + * Used to store the callback-address for the different sub-functions. If the same event trace is + * requested a second time before the first one is served only the latest one is handled. + */ + em_event_signal_callback = cbfunc; + + em_aci_buf_index = 0; + + /* + * length_event_buf indicates the length of all event traces and is used for dynamic + * memory allocation. The single values are from the correspondent entities and therefor + * defined as global. To ensure that no buffer overflow happens, the actual index is stored + * in a temp variable - a new event could occure after the memory is allocated. + */ + length_event_buf = (alr_tmp=em_l1_sem_index) + (dl_tmp=em_dl_sem_index) + (rr_tmp=em_rr_sem_index) + + (mm_tmp=em_mm_buffer_write) + (cc_tmp=em_cc_buffer_write) + (ss_tmp=em_ss_buffer_write) + + (sms_tmp=em_sms_buffer_write) + (sim_tmp=em_sim_buffer_write); + + #ifdef WIN32 + length_event_buf = 100; + #endif /* WIN32 */ + + memset(&aci_em_buf, 0, sizeof(T_EM_EVENT_BUF)); + + ACI_MALLOC(event_buf, length_event_buf); + + /* + * This checks if the entity is set in the bitmask and at least one event + * occurred in the corresponding entity. The event flag (em_xx_trace) protects + * unnecessary buffer operations. + */ + emet1 = ( (((entity & 0x0001) > 0) ? TRUE : FALSE) AND em_l1_trace ) ; /* L1 */ + emet2 = ( (((entity & 0x0002) > 0) ? TRUE : FALSE) AND em_dl_trace ) ; /* DL */ + emet3 = ( (((entity & 0x0004) > 0) ? TRUE : FALSE) AND em_rr_trace ) ; /* RR */ + emet4 = ( (((entity & 0x0008) > 0) ? TRUE : FALSE) AND em_mm_trace ) ; /* MM */ + emet5 = ( (((entity & 0x0010) > 0) ? TRUE : FALSE) AND em_cc_trace ) ; /* CC */ + emet6 = ( (((entity & 0x0020) > 0) ? TRUE : FALSE) AND em_ss_trace ) ; /* SS */ + emet7 = ( (((entity & 0x0040) > 0) ? TRUE : FALSE) AND em_sms_trace ); /* SMS */ + emet8 = ( (((entity & 0x0080) > 0) ? TRUE : FALSE) AND em_sim_trace ); /* SIM */ + + if(emet1) + { + em_aci_sem(EM_L1, event_buf, alr_tmp); + em_l1_trace = FALSE; + } + if(emet2) + { + em_aci_sem(EM_DL, event_buf, dl_tmp); + em_dl_trace = FALSE; + } + if(emet3) + { + em_aci_sem(EM_RR, event_buf, rr_tmp); + em_rr_trace = FALSE; + } + if(emet4) + { + em_aci_sem(EM_MM, event_buf, mm_tmp); + em_mm_trace = FALSE; + } + if(emet5) + { + em_aci_sem(EM_CC, event_buf, cc_tmp); + em_cc_trace = FALSE; + } + if(emet6) + { + em_aci_sem(EM_SS, event_buf, ss_tmp); + em_ss_trace = FALSE; + } + if(emet7) + { + em_aci_sem(EM_SMS, event_buf, sms_tmp); + em_sms_trace = FALSE; + } + if(emet8) + { + em_aci_sem(EM_SIM, event_buf, sim_tmp); + em_sim_trace = FALSE; + } + + memcpy(&signal_params.Data, &aci_em_buf, sizeof(T_EM_EVENT_BUF)); + signal_params.DataLength = length_event_buf; + signal_params.Pointer = event_buf; + + if (em_event_signal_callback NEQ NULL) { + (*em_event_signal_callback)(&signal_params); + } + + ACI_MFREE(event_buf); + + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_Set_EventTrace ++------------------------------------------------------------------------------ +| Description : Set the event flags and the callback function for the subclass +| +| Parameters : subclass - defines the subclass the data is coming from +| bitmask_h - bitmask +| bitmask_l - bitmask +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ +GLOBAL UBYTE em_Set_EventTrace (UBYTE em_subclass, ULONG bitmask_h, ULONG bitmask_l) +{ + TRACE_FUNCTION("em_Set_EventTrace ()"); + + return(em_class_event_tracing(em_subclass, bitmask_h, bitmask_l)); +} + + +/* ++------------------------------------------------------------------------------ +| Function : em_Received_Data ++------------------------------------------------------------------------------ +| Description : Compose the callback function +| +| Parameters : data - requested data + subclass - defines the subclass the data is coming from +| +| Return : void ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_Received_Data (void *data, UBYTE subclass) +{ + /*lint -e813*//* info about auto variable size of drv_SignalID_Type_EM*/ + drv_SignalID_Type_EM signal_params; + + TRACE_FUNCTION("em_Received_Data ()"); + + signal_params.SignalType = subclass; + + switch (subclass) { + case EM_SUBCLASS_SC: { + memcpy(&signal_params.UserData.sc, data, sizeof (T_EM_SC_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.sc) + 6); + em_para_signal_callback = em_para_signal_sc_callback; + break; } + case EM_SUBCLASS_SC_GPRS: { + memcpy(&signal_params.UserData.sc_gprs, data, sizeof (T_EM_SC_GPRS_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.sc_gprs) + 6); + em_para_signal_callback = em_para_signal_sc_gprs_callback; + break; } + case EM_SUBCLASS_NC: { + memcpy(&signal_params.UserData.nc, data, sizeof (T_EM_NC_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.nc) + 6); + em_para_signal_callback = em_para_signal_nc_callback; + break; } + case EM_SUBCLASS_LOC_PAG: { + memcpy(&signal_params.UserData.log_pag, data, sizeof (T_EM_LOC_PAG_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.log_pag) + 6); + em_para_signal_callback = em_para_signal_loc_callback; + break; } + case EM_SUBCLASS_PLMN: { + memcpy(&signal_params.UserData.plmn, data, sizeof (T_EM_PLMN_INFO_CNF)); + signal_params.UserData.plmn.rel_cause = em_relcs; + signal_params.DataLength = (sizeof (signal_params.UserData.plmn) + 6); + em_para_signal_callback = em_para_signal_plmn_callback; + break; } + case EM_SUBCLASS_CIPH_HOP_DTX: { + memcpy(&signal_params.UserData.cip, data, sizeof (T_EM_CIP_HOP_DTX_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.cip) + 6); + em_para_signal_callback = em_para_signal_cip_callback; + break; } + case EM_SUBCLASS_POWER: { + memcpy(&signal_params.UserData.power, data, sizeof (T_EM_POWER_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.power) + 6); + em_para_signal_callback = em_para_signal_pow_callback; + break; } + case EM_SUBCLASS_ID: { + memcpy(&signal_params.UserData.id, data, sizeof (T_EM_IDENTITY_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.id) + 6); + em_para_signal_callback = em_para_signal_id_callback; + break; } + case EM_SUBCLASS_SW_VERSION: { + em_sw_ver_info_cnf(&signal_params.UserData.version); + signal_params.DataLength = (sizeof (signal_params.UserData.version) + 6); + em_para_signal_callback = em_para_signal_ver_callback; + break; } + case EM_SUBCLASS_GMM: { + memcpy(&signal_params.UserData.gmm, data, sizeof (T_EM_GMM_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.gmm) + 6); + em_para_signal_callback = em_para_signal_gmm_callback; + break; } + case EM_SUBCLASS_GRLC: { + memcpy(&signal_params.UserData.grlc, data, sizeof (T_EM_GRLC_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.grlc) + 6); + em_para_signal_callback = em_para_signal_grlc_callback; + break; } + case EM_SUBCLASS_AMR: { + memcpy(&signal_params.UserData.amr, data, sizeof (T_EM_AMR_INFO_CNF)); + signal_params.DataLength = (sizeof (signal_params.UserData.amr) + 6); + em_para_signal_callback = em_para_signal_amr_callback; + break; } + case EM_SUBCLASS_PDP: { + em_para_signal_callback = em_para_signal_pdp_callback; + break; } + default: { + signal_params.UserData.defaulT = 0xff; + signal_params.DataLength = (sizeof (signal_params.UserData.defaulT) + 6); + em_para_signal_callback = NULL; + break; } + } + if (em_para_signal_callback NEQ NULL) { + (*em_para_signal_callback)(&signal_params); + } + + if(data NEQ NULL) + PFREE(data); +} + +LOCAL void em_sw_ver_info_cnf (T_EM_SW_VER *version) +{ + TRACE_FUNCTION ("em_sw_ver_info_cnf()"); + + memset (version, 0, sizeof (T_EM_SW_VER)); + +#ifndef WIN32 + /* The respective functions are auto-generated by the target build only */ + + /* Copy the static const strings into the structure */ + strncpy (version->alr, l1_version(), MAX_VER-1); + strncpy (version->dl, dl_version(), MAX_VER-1); + strncpy (version->rr, rr_version(), MAX_VER-1); + strncpy (version->mm, mm_version(), MAX_VER-1); + strncpy (version->cc, cc_version(), MAX_VER-1); + strncpy (version->ss, ss_version(), MAX_VER-1); + strncpy (version->sms, sms_version(), MAX_VER-1); + strncpy (version->sim, sim_version(), MAX_VER-1); +#endif +} + +/* ++------------------------------------------------------------------------------ +| Function : em_class_infra_data ++------------------------------------------------------------------------------ +| Description : This function calls the appropriate subfunction for the +| requested data (infrastructure data). +| +| Parameters : em_subclass - defines the subclass the data is requested from +| em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_class_infra_data (UBYTE em_subclass, UBYTE em_type) +{ + TRACE_FUNCTION("em_class_infra_data ()"); + + switch (em_subclass) + { + case EM_SUBCLASS_SC: + return (em_subclass_sc(em_type)); + case EM_SUBCLASS_SC_GPRS: +#ifdef GPRS + return (em_subclass_sc_gprs(em_type)); +#else + return EM_INVALID_SUBCLASS; +#endif /* GPRS */ + case EM_SUBCLASS_NC: + return (em_subclass_nc(em_type)); + case EM_SUBCLASS_LOC_PAG: + return (em_subclass_loc_pag(em_type)); + case EM_SUBCLASS_PLMN: + return (em_subclass_plmn(em_type)); + case EM_SUBCLASS_CIPH_HOP_DTX: + return (em_subclass_ciph_hop_dtx(em_type)); + case EM_SUBCLASS_GMM: +#ifdef GPRS + return (em_subclass_gmm(em_type)); +#else /* GPRS */ + return EM_INVALID_SUBCLASS; +#endif /* GPRS */ + case EM_SUBCLASS_GRLC: +#ifdef GPRS + return (em_subclass_grlc(em_type)); +#else /* GPRS */ + return EM_INVALID_SUBCLASS; +#endif /* GPRS */ + case EM_SUBCLASS_AMR: + return (em_subclass_amr(em_type)); + case EM_SUBCLASS_PDP: +#ifdef GPRS + return (em_subclass_pdp(em_type)); +#else + return EM_INVALID_SUBCLASS; +#endif + default: + return EM_INVALID_SUBCLASS; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : em_class_mobile_data ++------------------------------------------------------------------------------ +| Description : This function calls the appropriate subfunction for the +| requested data (mobile data). +| +| Parameters : em_subclass - defines the subclass the data is requested from +| em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_class_mobile_data (UBYTE em_subclass, UBYTE em_type) +{ + TRACE_FUNCTION("em_class_mobile_data ()"); + + switch (em_subclass) + { + case EM_SUBCLASS_POWER: + return (em_subclass_power(em_type)); + case EM_SUBCLASS_ID: + return (em_subclass_id(em_type)); + case EM_SUBCLASS_SW_VERSION: + return (em_subclass_version(em_type)); /* not implemented yet */ + default: + return EM_INVALID_SUBCLASS; + } +} + + +/* ++------------------------------------------------------------------------------ +| Function : em_class_event_tracing ++------------------------------------------------------------------------------ +| Description : This function calls the appropriate subfunction for the +| requested data (event trace). +| +| Parameters : em_subclass - defines the event subclass +| bitmask - defines the single events +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_class_event_tracing (UBYTE em_subclass, ULONG bitmask_h, ULONG bitmask_l) +{ + TRACE_FUNCTION("em_class_event_tracing ()"); + + switch (em_subclass) + { + case EM_SUBCLASS_LAYER_1: + return em_event_l1((USHORT)bitmask_h, bitmask_l); + case EM_SUBCLASS_DL: + return em_event_dl((USHORT)bitmask_l); + case EM_SUBCLASS_RR: + return em_event_rr((USHORT)bitmask_h, bitmask_l); + case EM_SUBCLASS_MM: + return em_event_mm(bitmask_l); + case EM_SUBCLASS_CC: + return em_event_cc(bitmask_h, bitmask_l); + case EM_SUBCLASS_SS: + return em_event_ss((USHORT)bitmask_l); + case EM_SUBCLASS_SMS: + return em_event_sms(bitmask_h, bitmask_l); + case EM_SUBCLASS_SIM: + return em_event_sim(bitmask_l); + default: + return EM_INVALID_SUBCLASS; + } +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_sc ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_subclass_sc (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_sc()"); + + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_sc_info_req, EM_SC_INFO_REQ); /* T_EM_SC_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_sc_info_req->data = em_type; + + /* the primitive is send to RR via MM */ + PSENDX (RR, em_sc_info_req); + } + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_sc_gprs ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +#ifdef GPRS +LOCAL UBYTE em_subclass_sc_gprs (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_sc_gprs()"); + + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_sc_gprs_info_req, EM_SC_GPRS_INFO_REQ); /* T_EM_SC_GPRS_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_sc_gprs_info_req->data = em_type; + + /* the primitive is send to GRR via GMM */ + PSEND (hCommGMM, em_sc_gprs_info_req); + } + return TRUE; +} +#endif /* GPRS */ + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_nc ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_subclass_nc (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_nc()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_nc_info_req, EM_NC_INFO_REQ); /* T_EM_NC_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_nc_info_req->data = em_type; + + /* the primitive is send to RR via MM */ + PSENDX (RR, em_nc_info_req); + } + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_loc_pag ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_subclass_loc_pag (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_loc_pag()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_loc_pag_info_req, EM_LOC_PAG_INFO_REQ); /* T_EM_LOC_PAG_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_loc_pag_info_req->data = em_type; + + /* the primitive is send to RR via MM */ + PSENDX (RR, em_loc_pag_info_req); + } + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_plmn ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_subclass_plmn (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_plmn()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_plmn_info_req, EM_PLMN_INFO_REQ); /* T_EM_PLMN_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_plmn_info_req->data = em_type; + + /* the primitive is send to RR via MM */ + PSENDX (RR, em_plmn_info_req); + } + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_ciph_hop_dtx ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_subclass_ciph_hop_dtx (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_ciph_hop_dtx()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_cip_hop_dtx_info_req, EM_CIP_HOP_DTX_INFO_REQ); /* T_EM_CIP_HOP_DTX_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_cip_hop_dtx_info_req->data = em_type; + + /* the primitive is send to RR via MM */ + PSENDX (RR, em_cip_hop_dtx_info_req); + } + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_power ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_subclass_power (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_power()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_power_info_req, EM_POWER_INFO_REQ); /* T_EM_POWER_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_power_info_req->data = em_type; + + /* the primitive is send to RR via MM */ + PSENDX (RR, em_power_info_req); + } + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_id ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_subclass_id (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_id()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_identity_info_req, EM_IDENTITY_INFO_REQ); /* T_EM_IDENTITY_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_identity_info_req->data = em_type; + + /* the primitive is send to RR via MM */ + PSENDX (RR, em_identity_info_req); + } + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_version ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_subclass_version (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_version()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_sw_version_info_req, EM_SW_VERSION_INFO_REQ); /* T_EM_SW_VERSION_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_sw_version_info_req->data = em_type; + + /* the primitive is send to RR via MM */ + PSENDX (RR, em_sw_version_info_req); + } + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_pco_bitmap ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_pco_bitmap - defines the actual requested data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +UBYTE em_subclass_pco_bitmap (U32 em_pco_bitmap) +{ + TRACE_FUNCTION ("em_subclass_pco_bitmap()"); + +/* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + +#ifdef GPRS + /*check for requested GMM, GRLC, GRR info*/ + if(em_pco_bitmap & (EM_PCO_GPRS_INFO | EM_PCO_GMM_INFO | EM_PCO_GRLC_INFO)) + { + PALLOC(em_pco_trace_req, EM_PCO_TRACE_REQ); /* T_EM_PCO_TRACE_REQ */ + + em_pco_trace_req->pco_bitmap = em_pco_bitmap; + + /* the primitive is send to GMM*/ + PSENDX(GMM, em_pco_trace_req); + } +#endif /*GPRS*/ + + /*check for requested RR info*/ + if(em_pco_bitmap & (EM_PCO_SC_INFO | EM_PCO_NC_INFO | EM_PCO_LOC_PAG_INFO | EM_PCO_IDENTITY_INFO | + EM_PCO_CIPH_HOP_DTX_INFO | EM_PCO_POWER_INFO | EM_PCO_PLMN_INFO | EM_PCO_SW_VERSION_INFO | + EM_PCO_AMR_INFO)) + { + PALLOC(em_pco_trace_req, EM_PCO_TRACE_REQ); /* T_EM_PCO_TRACE_REQ */ + + em_pco_trace_req->pco_bitmap = em_pco_bitmap; + + /* the primitive is send to RR*/ + PSENDX(RR, em_pco_trace_req); + } + +#ifdef GPRS + if(em_pco_bitmap & EM_PCO_PDP_INFO) + { + em_pco_pdp_trace_req(); + } +#endif + return TRUE; +}/*em_subclass_pco_bitmap*/ + +/* ++------------------------------------------------------------------------------ +| Function : em_pco_pdp_trace_req ++------------------------------------------------------------------------------ +| Description : This function prints PDP configuration on PCO +| +| Parameters : void +| +| Return : void ++------------------------------------------------------------------------------ +*/ +#ifdef GPRS +LOCAL void em_pco_pdp_trace_req(void) +{ + UBYTE cid; + T_PDP_CONTEXT_INTERNAL *p_pdp_context_node = NULL; + + + TRACE_FUNCTION ("em_pco_pdp_trace_req()"); + + TRACE_EVENT_EM_P1("EM_PDP_INFO_REQ: num_ctxts : %d",PDP_CONTEXT_CID_MAX); + + for(cid=1;cid<=PDP_CONTEXT_CID_MAX;cid++) + { + + p_pdp_context_node = pdp_context_find_node_from_cid( cid ); + + if( p_pdp_context_node->internal_data.state EQ PDP_CONTEXT_STATE_INVALID ) + { + TRACE_EVENT_EM_P1("EM_PDP_INFO_REQ: state : %d",p_pdp_context_node->internal_data.state); + } + else + { + if ( p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address EQ NAS_is_ipv4 ) + { + TRACE_EVENT_EM_P4("EM_PDP_INFO_REQ: state:%d,pdp_type:%s,apn:%s,pdp address:%s", + p_pdp_context_node->internal_data.state, + p_pdp_context_node->attributes.pdp_type, + p_pdp_context_node->attributes.pdp_apn, + (( p_pdp_context_node->internal_data.state EQ PDP_CONTEXT_STATE_ACTIVATED ) OR + ( p_pdp_context_node->internal_data.state EQ PDP_CONTEXT_STATE_DATA_LINK )) + ? p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv4_addr.a4 : + p_pdp_context_node->attributes.pdp_addr.ip_address.ipv4_addr.a4); + } + else if ( p_pdp_context_node->attributes.pdp_addr.ctrl_ip_address EQ NAS_is_ipv6 ) + { + TRACE_EVENT_EM_P4("EM_PDP_INFO_REQ: state:%d,pdp_type:%s,apn:%s,pdp address:%s", + p_pdp_context_node->internal_data.state, + p_pdp_context_node->attributes.pdp_type, + p_pdp_context_node->attributes.pdp_apn, + (( p_pdp_context_node->internal_data.state EQ PDP_CONTEXT_STATE_ACTIVATED ) OR + ( p_pdp_context_node->internal_data.state EQ PDP_CONTEXT_STATE_DATA_LINK )) + ? p_pdp_context_node->internal_data.pdp_address_allocated.ip_address.ipv6_addr.a6 : + p_pdp_context_node->attributes.pdp_addr.ip_address.ipv6_addr.a6); + } + } + } + +} +#endif /* GPRS */ + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_gmm ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +#ifdef GPRS +LOCAL UBYTE em_subclass_gmm(UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_gmm()"); + + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_gmm_info_req, EM_GMM_INFO_REQ); /* T_EM_SC_GPRS_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_gmm_info_req->data = em_type; + + /* the primitive is send to GMM */ + PSEND (hCommGMM, em_gmm_info_req); + } + return TRUE; +} +#endif /* GPRS */ + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_gmm ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +#ifdef GPRS +LOCAL UBYTE em_subclass_grlc(UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_grlc()"); + + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_subclass_grlc, EM_GRLC_INFO_REQ); /* T_EM_SC_GPRS_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_subclass_grlc->data = em_type; + + /* the primitive is send to GRLC via GMM */ + PSEND (hCommGMM, em_subclass_grlc); + } + return TRUE; +} +#endif /* GPRS */ + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_amr ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_subclass_amr (UBYTE em_type) +{ + TRACE_FUNCTION ("em_subclass_amr()"); + + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_amr_info_req, EM_AMR_INFO_REQ); /* T_EM_AMR_INFO_REQ */ + + /* fill in primitive parameter: */ + /* the bitmask em_type is only used to prevent unnecesary use of primitives*/ + em_amr_info_req->data = em_type; + + /* the primitive directly to RR */ + PSENDX (RR, em_amr_info_req); + } + return TRUE; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_subclass_pdp ++------------------------------------------------------------------------------ +| Description : This function displays PDP output directly since the +| data is available in ACI itself. +| +| Parameters : em_type - defines the actual data +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +#ifdef GPRS +LOCAL UBYTE em_subclass_pdp (UBYTE em_type) +{ + + TRACE_FUNCTION ("em_subclass_pdp()"); + + em_Received_Data ((void *)NULL, EM_SUBCLASS_PDP); + + return TRUE; + +} +#endif + +/* ++------------------------------------------------------------------------------ +| Function : em_event_l1 ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : bitmask - defines the single events +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_event_l1 (USHORT bitmask_h, ULONG bitmask_l) +{ + TRACE_FUNCTION ("em_event_l1()"); + + /* check if only specified events are set in the bitmask */ + if (!(bitmask_h & ~EM_BITMASK_L1_H)) + { + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + PALLOC(em_l1_event_req, EM_L1_EVENT_REQ); /* T_EM_L1_EVENT_REQ */ + + /* fill in primitive parameter: */ + em_l1_event_req->bitmask_l1_h = bitmask_h; + em_l1_event_req->bitmask_l1_l = bitmask_l; + + /* additional information for the mscviewer */ + TRACE_PRIM_TO("PL"); + + /* the primitive is send to PL */ + PSENDX (PL, em_l1_event_req); + return TRUE; + } + else /* wrong bitmask */ + return EM_DATA_NOT_AVAIL; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_event_dl ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : bitmask - defines the single events +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_event_dl (USHORT bitmask) +{ + TRACE_FUNCTION ("em_event_dl()"); + + /* check if only specified events are set in the bitmask */ + if (!(bitmask & ~EM_BITMASK_DL)) { + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_dl_event_req, EM_DL_EVENT_REQ); /* T_EM_DL_EVENT_REQ */ + + /* fill in primitive parameter: */ + em_dl_event_req->bitmask_dl = bitmask; + + /* additional information for the mscviewer */ + TRACE_PRIM_TO("DL"); + + /* the primitive is send to DL via MM */ + PSENDX (MM, em_dl_event_req); + } + return TRUE; + } + else /* wrong bitmask */ + return EM_DATA_NOT_AVAIL; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_event_rr ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : bitmask - defines the single events +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_event_rr (USHORT bitmask_h, ULONG bitmask_l) +{ + TRACE_FUNCTION ("em_event_rr()"); + + /* check if only specified events are set in the bitmask */ + if (!(bitmask_h & ~EM_BITMASK_RR_H)) { + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_rr_event_req, EM_RR_EVENT_REQ); /* EM_RR_EVENT_REQ */ + + /* fill in primitive parameter: */ + em_rr_event_req->bitmask_rr_h = bitmask_h; + em_rr_event_req->bitmask_rr_l = bitmask_l; + + /* no additional information for the mscviewer is needed here because + * RR is the default entity inside the mscview.tbl + TRACE_PRIM_TO("RR"); + */ + + /* the primitive is send to RR */ + PSENDX (RR, em_rr_event_req); + } + return TRUE; + } + else /* wrong bitmask */ + return EM_DATA_NOT_AVAIL; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_event_mm ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : bitmask - defines the single events +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_event_mm (ULONG bitmask) +{ + TRACE_FUNCTION ("em_event_mm()"); + + /* check if only specified events are set in the bitmask */ + if (!(bitmask & ~EM_BITMASK_MM)) { + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_mm_event_req, EM_MM_EVENT_REQ); /* T_EM_MM_EVENT_REQ */ + + /* fill in primitive parameter: */ + em_mm_event_req->bitmask_mm = bitmask; + + /* additional information for the mscviewer */ + TRACE_PRIM_TO("MM"); + + /* the primitive is send to MM */ + PSENDX (MM, em_mm_event_req); + } + return TRUE; + } + else /* wrong bitmask */ + return EM_DATA_NOT_AVAIL; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_event_cc ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : bitmask - defines the single events +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_event_cc (ULONG bitmask_h, ULONG bitmask_l) +{ + TRACE_FUNCTION ("em_event_cc()"); + + /* check if only specified events are set in the bitmask */ + if (!(bitmask_h & ~EM_BITMASK_CC_H)) { + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_cc_event_req, EM_CC_EVENT_REQ); /* T_EM_CC_EVENT_REQ */ + + /* fill in primitive parameter: */ + em_cc_event_req->bitmask_cc_h = bitmask_h; + em_cc_event_req->bitmask_cc_l = bitmask_l; + + /* additional information for the mscviewer */ + TRACE_PRIM_TO("CC"); + + /* the primitive is send to CC */ + PSENDX (CC, em_cc_event_req); + } + return TRUE; + } + else /* wrong bitmask */ + return EM_DATA_NOT_AVAIL; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_event_ss ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : bitmask - defines the single events +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + + +LOCAL UBYTE em_event_ss (USHORT bitmask) +{ + TRACE_FUNCTION ("em_event_ss()"); + + /* check if only specified events are set in the bitmask */ + if (!(bitmask & ~EM_BITMASK_SS)) { + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_ss_event_req, EM_SS_EVENT_REQ); /* T_EM_SS_EVENT_REQ */ + + /* fill in primitive parameter: */ + em_ss_event_req->bitmask_ss = bitmask; + + /* additional information for the mscviewer */ + TRACE_PRIM_TO("SS"); + + /* the primitive is send to SS */ + PSENDX (SS, em_ss_event_req); + } + return TRUE; + } + else /* wrong bitmask */ + return EM_DATA_NOT_AVAIL; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_event_sms ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : bitmask - defines the single events +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_event_sms (ULONG bitmask_h, ULONG bitmask_l) +{ + TRACE_FUNCTION ("em_event_sms()"); + + /* check if only specified events are set in the bitmask */ + if (!(bitmask_h & ~EM_BITMASK_SMS_H)) { + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_sms_event_req, EM_SMS_EVENT_REQ); /* T_EM_SMS_EVENT_REQ */ + + /* fill in primitive parameter: */ + em_sms_event_req->bitmask_sms_h = bitmask_h; + em_sms_event_req->bitmask_sms_l = bitmask_l; + + /* additional information for the mscviewer */ + TRACE_PRIM_TO("SMS"); + + /* the primitive is send to SMS */ + PSENDX (SMS, em_sms_event_req); + } + return TRUE; + } + else /* wrong bitmask */ + return EM_DATA_NOT_AVAIL; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_event_sim ++------------------------------------------------------------------------------ +| Description : This function send the appropriate primitive to the involved +| entity. +| +| Parameters : bitmask - defines the single events +| +| Return : UBYTE ++------------------------------------------------------------------------------ +*/ + +LOCAL UBYTE em_event_sim (ULONG bitmask) +{ + TRACE_FUNCTION ("em_event_sim()"); + + /* check if only specified events are set in the bitmask */ + if (!(bitmask & ~EM_BITMASK_SIM)) { + /* + *------------------------------------------------------------------- + * create and send primitive + *------------------------------------------------------------------- + */ + { + PALLOC(em_sim_event_req, EM_SIM_EVENT_REQ); /* T_EM_SIM_EVENT_REQ */ + + /* fill in primitive parameter: */ + em_sim_event_req->bitmask_sim = bitmask; + + /* additional information for the mscviewer */ + TRACE_PRIM_TO("SIM"); + + /* the primitive is send to SIM */ + PSENDX (SIM, em_sim_event_req); + } + return TRUE; + } + else /* wrong bitmask */ + return EM_DATA_NOT_AVAIL; +} + +/* ++------------------------------------------------------------------------------ +| Function : em_aci_sem ++------------------------------------------------------------------------------ +| Description : Clear all entries inside the semaphor for event tracing +| +| Parameters : UBYTE entity +| +| Return : void ++------------------------------------------------------------------------------ +*/ +void em_aci_sem (UBYTE entity, UBYTE *buffer, UBYTE buf_index_tmp) +{ + TRACE_FUNCTION ("em_aci_sem()"); + + /* + * aci_em_buf.xxx.index keeps the position of the data inside the buffer + * aci_em_buf.xxx.length indicates the length of the data to be copied + * both values are used for later processing of the data + */ + switch (entity) + { + case (EM_L1): + em_l1_sem_read(); + memcpy(buffer + em_aci_buf_index, em_l1_sem_buffer, buf_index_tmp); + aci_em_buf.alr.index = em_aci_buf_index; + aci_em_buf.alr.length = buf_index_tmp; + em_aci_buf_index += buf_index_tmp; + em_l1_sem_reset (); + break; + case (EM_DL): + em_dl_sem_read(); + memcpy(buffer + em_aci_buf_index, em_dl_sem_buffer, buf_index_tmp); + aci_em_buf.dl.index = em_aci_buf_index; + aci_em_buf.dl.length = buf_index_tmp; + em_aci_buf_index += buf_index_tmp; + em_dl_sem_reset (); + break; + case (EM_RR): + em_rr_sem_read(); + memcpy(buffer + em_aci_buf_index, em_rr_sem_buffer, buf_index_tmp); + aci_em_buf.rr.index = em_aci_buf_index; + aci_em_buf.rr.length = buf_index_tmp; + em_aci_buf_index += buf_index_tmp; + em_rr_sem_reset (); + break; + case (EM_MM): + memcpy(buffer + em_aci_buf_index, em_mm_event_buffer, buf_index_tmp); + aci_em_buf.mm.index = em_aci_buf_index; + aci_em_buf.mm.length = buf_index_tmp; + em_aci_buf_index += buf_index_tmp; + em_mm_buffer_write = 0; + break; + case (EM_CC): + memcpy(buffer + em_aci_buf_index, em_cc_event_buffer, buf_index_tmp); + aci_em_buf.cc.index = em_aci_buf_index; + aci_em_buf.cc.length = buf_index_tmp; + em_aci_buf_index += buf_index_tmp; + em_cc_buffer_write = 0; + break; + case (EM_SS): + memcpy(buffer + em_aci_buf_index, em_ss_event_buffer, buf_index_tmp); + aci_em_buf.ss.index = em_aci_buf_index; + aci_em_buf.ss.length = buf_index_tmp; + em_aci_buf_index += buf_index_tmp; + em_ss_buffer_write = 0; + break; + case (EM_SMS): + memcpy(buffer + em_aci_buf_index, em_sms_event_buffer, buf_index_tmp); + aci_em_buf.sms.index = em_aci_buf_index; + aci_em_buf.sms.length = buf_index_tmp; + em_aci_buf_index += buf_index_tmp; + em_sms_buffer_write = 0; + break; + case (EM_SIM): + memcpy(buffer + em_aci_buf_index, em_sim_event_buffer, buf_index_tmp); + aci_em_buf.sim.index = em_aci_buf_index; + aci_em_buf.sim.length = buf_index_tmp; + em_aci_buf_index += buf_index_tmp; + em_sim_buffer_write = 0; + break; + default: + break; + } /* switch */ +} /* endfunc em_aci_sem */ + +/* ++------------------------------------------------------------------------------ +| Function : em_event_trace_ind ++------------------------------------------------------------------------------ +| Description : When event tracing is enabled, the entity sends a notification +| that the first event occurred. The event flag (em_xx_trace) +| protects unnecessary buffer operations. +| +| Parameters : Entity +| +| Return : void ++------------------------------------------------------------------------------ +*/ +GLOBAL void em_event_trace_ind (T_EM_DATA_IND * em_data_ind) +{ + TRACE_FUNCTION ("em_event_trace_ind()"); + + switch (em_data_ind->entity) + { + case EM_L1: + em_l1_trace = TRUE; + break; + case EM_DL: + em_dl_trace = TRUE; + break; + case EM_RR: + em_rr_trace = TRUE; + break; + case EM_MM: + em_mm_trace = TRUE; + break; + case EM_CC: + em_cc_trace = TRUE; + break; + case EM_SS: + em_ss_trace = TRUE; + break; + case EM_SMS: + em_sms_trace = TRUE; + break; + case EM_SIM: + em_sim_trace = TRUE; + break; + default: + break; + } /* switch */ + PFREE(em_data_ind); +} + + +/*+++++++++++++++++++++++++++++++++++++++++ E O F +++++++++++++++++++++++++++++++++++++++++*/