FreeCalypso > hg > fc-magnetite
diff src/g23m-gprs/grr/grr_meass.c @ 183:219afcfc6250
src/g23m-gprs: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 13 Oct 2016 04:24:13 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/grr/grr_meass.c Thu Oct 13 04:24:13 2016 +0000 @@ -0,0 +1,1597 @@ +/* ++----------------------------------------------------------------------------- +| Project : GPRS (8441) +| Modul : GRR ++----------------------------------------------------------------------------- +| 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 implements signal handler functions for service +| MEAS of entity GRR. ++----------------------------------------------------------------------------- +*/ + +#ifndef GRR_MEASS_C +#define GRR_MEASS_C +#endif + +#define ENTITY_GRR + +/*==== INCLUDES =============================================================*/ + +#include <string.h> +#include "typedefs.h" /* to get Condat data types */ +#include "vsi.h" /* to get a lot of macros */ +#include "macdef.h" +#include "gprs.h" +#include "gsm.h" /* to get a lot of macros */ +#include "ccdapi.h" /* to get CCD API */ +#include "cnf_grr.h" /* to get cnf-definitions */ +#include "mon_grr.h" /* to get mon-definitions */ +#include "prim.h" /* to get the definitions of used SAP and directions */ +#include "message.h" +#include "grr.h" /* to get the global entity definitions */ +#include "grr_f.h" +#include "grr_measf.h" /* to get the definitions for interference measurements */ +#include "grr_meass.h" /* to get the own definitions */ +#include "grr_measp.h" /* to get the own definitions */ +#include "cl_rlcmac.h" +#include "grr_tcs.h" + +/*==== CONST ================================================================*/ + +#define BS_PA_MFRMS_OFFSET 2 /* BS_PA_MRMS is coded within 3 bits and */ + /* ranges from 2 to 9 */ +#define DRX_DENOMINATOR_FOR_CCCH 4 + +/*==== LOCAL VARS ===========================================================*/ + +/*==== LOCAL TYPES===========================================================*/ + +#if !defined (NTRACE) + +LOCAL void meas_im_trace_i_level( T_MEAS_IM_FILTER *filter, + T_ilev *i_level ); + +#endif /* #if !defined (NTRACE) */ + +/*==== PUBLIC FUNCTIONS =====================================================*/ +/* ++------------------------------------------------------------------------------ +| Function : meas_im_get_permit ++------------------------------------------------------------------------------ +| Description : This function returns whether interference measurements in +| packet transfer mode shall be performed by Layer 1 +| autonomously. +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL UBYTE meas_im_get_permit ( void ) +{ + UBYTE permit = MPHP_IM_ENABLED; + + TRACE_FUNCTION( "meas_im_get_permit" ); + + if( grr_data->meas_im.mode NEQ IM_MODE_IDLE_TRANSFER AND + grr_data->meas_im.mode NEQ IM_MODE_TRANSFER ) + { + permit = MPHP_IM_DISABLED; + } + + return( permit ); +} /* meas_im_get_permit() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_init ++------------------------------------------------------------------------------ +| Description : This function initializes the measurement module. +| +| Parameters : im_mode - operation mode for interference measurements +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void meas_init ( T_MEAS_IM_MODE im_mode ) +{ + TRACE_FUNCTION( "meas_init" ); + + /* general initialization */ + INIT_STATE( MEAS, MEAS_NULL ); + + /* initialization of interference measurements */ + meas_im_init( im_mode ); + + /* initialization of extended measurements */ + meas_em_init( ); + + /* initialization of C value derivation */ + meas_c_init( ); + +} /* meas_init() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_im_get_rel_i_level ++------------------------------------------------------------------------------ +| Description : This function returns the interference level values mapped to +| values relative to the C value. +| +| Parameters : *ma - Ptr to frequency information in MA format +| *i_level - Ptr to relative interference level values +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void meas_im_get_rel_i_level ( T_MEAS_IM_CARRIER *ma, + T_ilev *i_level ) +{ + T_MEAS_IM_FILTER *filter; /* filter */ + + TRACE_FUNCTION( "meas_im_get_rel_i_level" ); + + filter = meas_im_get_filter( ma ); + + meas_im_fill_rel_iLevel( &i_level->v_ilev0, &i_level->ilev0, filter, 0 ); + meas_im_fill_rel_iLevel( &i_level->v_ilev1, &i_level->ilev1, filter, 1 ); + meas_im_fill_rel_iLevel( &i_level->v_ilev2, &i_level->ilev2, filter, 2 ); + meas_im_fill_rel_iLevel( &i_level->v_ilev3, &i_level->ilev3, filter, 3 ); + meas_im_fill_rel_iLevel( &i_level->v_ilev4, &i_level->ilev4, filter, 4 ); + meas_im_fill_rel_iLevel( &i_level->v_ilev5, &i_level->ilev5, filter, 5 ); + meas_im_fill_rel_iLevel( &i_level->v_ilev6, &i_level->ilev6, filter, 6 ); + meas_im_fill_rel_iLevel( &i_level->v_ilev7, &i_level->ilev7, filter, 7 ); + +#if !defined (NTRACE) + + meas_im_trace_i_level( filter, i_level ); + +#endif /* #if !defined (NTRACE) */ + +} /* meas_im_get_rel_i_level() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_im_get_drx_period_seconds ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL ULONG meas_im_get_drx_period_seconds ( void ) +{ + ULONG t_drx; /* DRX period for the MS */ + + TRACE_FUNCTION( "meas_im_get_drx_period_seconds" ); + + if( grr_is_pbcch_present( ) EQ TRUE ) + { + if( grr_is_non_drx_mode( ) ) + { + t_drx = DRX_NORM_FACTOR / BLOCK_PER_MF; + } + else + { + t_drx = ( DRX_NORM_FACTOR * PAGING_CYCLE ) / grr_data->ms.split_pg_cycle; + } + + t_drx *= ( USEC_PER_MF / MEAS_ACRCY ); + } + else + { + if( meas_is_spgc_ccch_supported( ) ) + { + if( grr_is_non_drx_mode( ) ) + { + t_drx = DRX_NORM_FACTOR / DRX_DENOMINATOR_FOR_CCCH; + } + else + { + t_drx = ( DRX_NORM_FACTOR * PAGING_CYCLE ) / grr_data->ms.split_pg_cycle; + } + } + else + { + t_drx = DRX_NORM_FACTOR * + ( psc_db->net_ctrl.bs_pa_mfrms + BS_PA_MFRMS_OFFSET ); + } + + t_drx *= ( USEC_PER_CS_MF / MEAS_ACRCY ); + } + + return( t_drx ); +} /* meas_im_get_drx_period_seconds() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_im_get_drx_period_frames ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL USHORT meas_im_get_drx_period_frames ( void ) +{ + ULONG frames; + + TRACE_FUNCTION( "meas_im_get_drx_period_frames" ); + + frames = meas_im_get_drx_period_seconds( ) * N_MSEC_PER_FRAME; + frames = M_ROUND_UP( frames, Z_MSEC_PER_FRAME * DRX_NORM_FACTOR ); + + return( ( USHORT )frames ); +} /* meas_im_get_drx_period_frames() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_im_get_abs_i_level ++------------------------------------------------------------------------------ +| Description : This function returns the interference level values mapped to +| values as defined for RXLEV. It returns the number of bits +| occupied within the measurement report. +| +| Parameters : *ma - Ptr to frequency information in MA format +| *i_level - Ptr to absolute interference level values +| ++------------------------------------------------------------------------------ +*/ +GLOBAL UBYTE meas_im_get_abs_i_level ( T_MEAS_IM_CARRIER *ma, + T_ilev_abs *i_level ) +{ + UBYTE used_bits; + + T_MEAS_IM_FILTER *filter; /* filter */ + + TRACE_FUNCTION( "meas_im_get_abs_i_level" ); + + filter = meas_im_get_filter( ma ); + + used_bits = + meas_im_fill_abs_iLevel( &i_level->v_ilevabs0, &i_level->ilevabs0, filter, 0 ); + used_bits += + meas_im_fill_abs_iLevel( &i_level->v_ilevabs1, &i_level->ilevabs1, filter, 1 ); + used_bits += + meas_im_fill_abs_iLevel( &i_level->v_ilevabs2, &i_level->ilevabs2, filter, 2 ); + used_bits += + meas_im_fill_abs_iLevel( &i_level->v_ilevabs3, &i_level->ilevabs3, filter, 3 ); + used_bits += + meas_im_fill_abs_iLevel( &i_level->v_ilevabs4, &i_level->ilevabs4, filter, 4 ); + used_bits += + meas_im_fill_abs_iLevel( &i_level->v_ilevabs5, &i_level->ilevabs5, filter, 5 ); + used_bits += + meas_im_fill_abs_iLevel( &i_level->v_ilevabs6, &i_level->ilevabs6, filter, 6 ); + used_bits += + meas_im_fill_abs_iLevel( &i_level->v_ilevabs7, &i_level->ilevabs7, filter, 7 ); + +#if !defined (NTRACE) + + meas_im_trace_i_level( filter, ( T_ilev* )i_level ); + +#endif /* #if !defined (NTRACE) */ + + return( used_bits ); +} /* meas_im_get_abs_i_level() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_im_set_carrier ++------------------------------------------------------------------------------ +| Description : +| +| Frequency Band config. ETSI GSM spec. coding used in L1 +| GSM 900 STD_900 1-124 1-124 +| E-GSM STD_EGSM 1-124, 1-124, +| 975-1023, 0 125-174 +| PCS 1900 STD_1900 512-810 512-810 +| DCS 1800 STD_1800 512-885 512-885 +| GSM 900/DCS 1800 STD_DUAL 1-124, 1-124, +| 512-885 125-498 +| E-GSM/DCS 1800 STD_DUAL_EGSM 1-124, 1-124, +| 975-1023,0 125-174, +| 512-885 175-548 +| GSM 850 STD_850 128-251 128-251 +| GSM 850/PCS 1900 STD_DUAL_US 128-251, 1-124, +| 512-810 125-424 +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void meas_im_set_carrier ( T_MEAS_IM_CARRIER *carrier, + T_p_frequency_par *freq_par ) +{ + TRACE_FUNCTION( "meas_im_set_carrier" ); + + if( freq_par->p_chan_sel.hopping ) + { + UBYTE i; + UBYTE bit_shift; + USHORT array_idx; + USHORT arfcn; + + carrier->hopping = TRUE; + carrier->alloc.hop_param.hsn = ( freq_par->p_chan_sel.p_rf_ch.arfcn >> 8 ); + carrier->alloc.hop_param.maio = ( freq_par->p_chan_sel.p_rf_ch.arfcn & 0x00FF ); + + memset( carrier->alloc.hop_param.arfcn_bit_field, + 0, MAX_IM_HOP_ARFCN_BIT_FIELD_SIZE ); + + for( i = 0; i < freq_par->p_freq_list.p_rf_chan_cnt; i++ ) + { + arfcn = freq_par->p_freq_list.p_rf_chan_no.p_radio_freq[i]; + + switch( std ) + { + case STD_1900: arfcn -= LOW_CHANNEL_1900; break; + case STD_1800: arfcn -= LOW_CHANNEL_1800; break; + default : break; + } + + array_idx = arfcn / 8; + bit_shift = ( UBYTE )( arfcn % 8 ); + + if( array_idx < MAX_IM_HOP_ARFCN_BIT_FIELD_SIZE ) + { + carrier->alloc.hop_param.arfcn_bit_field[array_idx] |= + ( 0x01 << bit_shift ); + } + else + { + TRACE_ERROR( "meas_im_set_carrier: array_idx >= MAX_IM_HOP_ARFCN_BIT_FIELD_SIZE" ); + } + } + } + else + { + carrier->hopping = FALSE; + carrier->alloc.arfcn = freq_par->p_chan_sel.p_rf_ch.arfcn; + } + +#if !defined (NTRACE) + + if( grr_data->meas_im.n_im_trace & M_IM_TRACE_FREQUENCY ) + { + if( carrier->hopping ) + { + ULONG arfcn[4]; + ULONG freq[4]; + + arfcn[0] = ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[0] << 0; + arfcn[0] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[1] << 8; + arfcn[0] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[2] << 16; + arfcn[0] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[3] << 24; + arfcn[1] = ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[4] << 0; + arfcn[1] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[5] << 8; + arfcn[1] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[6] << 16; + arfcn[1] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[7] << 24; + arfcn[2] = ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[8] << 0; + arfcn[2] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[9] << 8; + arfcn[2] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[10] << 16; + arfcn[2] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[11] << 24; + arfcn[3] = ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[12] << 0; + arfcn[3] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[13] << 8; + arfcn[3] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[14] << 16; + arfcn[3] |= ( ULONG )carrier->alloc.hop_param.arfcn_bit_field[15] << 24; + + freq[0] = ( ULONG )freq_par->p_freq_list.p_rf_chan_no.p_radio_freq[0] << 16; + freq[0] |= ( ULONG )freq_par->p_freq_list.p_rf_chan_no.p_radio_freq[1] << 0; + freq[1] = ( ULONG )freq_par->p_freq_list.p_rf_chan_no.p_radio_freq[2] << 16; + freq[1] |= ( ULONG )freq_par->p_freq_list.p_rf_chan_no.p_radio_freq[3] << 0; + freq[2] = ( ULONG )freq_par->p_freq_list.p_rf_chan_no.p_radio_freq[4] << 16; + freq[2] |= ( ULONG )freq_par->p_freq_list.p_rf_chan_no.p_radio_freq[5] << 0; + freq[3] = ( ULONG )freq_par->p_freq_list.p_rf_chan_no.p_radio_freq[6] << 16; + freq[3] |= ( ULONG )freq_par->p_freq_list.p_rf_chan_no.p_radio_freq[7] << 0; + + + TRACE_EVENT_P9( "meas_im_get_trns_freq: %08X%08X%08X%08X Num: %d Freq: %08X %08X %08X %08X", + arfcn[3], arfcn[2], arfcn[1], arfcn[0], + freq_par->p_freq_list.p_rf_chan_cnt, + freq[0], freq[1], freq[2], freq[3] ); + } + else + { + TRACE_EVENT_P1( "meas_im_get_trns_freq: %d", carrier->alloc.arfcn ); + } + } + +#endif /* #if !defined (NTRACE) */ + +} /* meas_im_set_carrier() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_prepare_and_start_idle ++------------------------------------------------------------------------------ +| Description : ... +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void meas_prepare_and_start_idle ( void ) +{ + TRACE_FUNCTION( "meas_prepare_and_start_idle" ); + + meas_im_cgrlc_int_level_req( TRUE ); + + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + if ( grr_data->meas_im.mode EQ IM_MODE_IDLE_TRANSFER OR + grr_data->meas_im.mode EQ IM_MODE_IDLE ) + { + meas_im_prepare_idle( ); + + switch( GET_STATE( MEAS_IM ) ) + { + case MEAS_IM_NULL: + { + if( meas_im_start_idle( ) ) + { + SET_STATE( MEAS_IM, MEAS_IM_START ); + } + } + break; + + default: + /* do nothing */ + break; + } + } + break; + + default: + /* do nothing */ + break; + } +} /* meas_prepare_and_start_idle() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_prepare_and_stop_idle ++------------------------------------------------------------------------------ +| Description : ... +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void meas_prepare_and_stop_idle ( void ) +{ + TRACE_FUNCTION( "meas_prepare_and_stop_idle" ); + + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + { + meas_im_prepare_idle( ); + } + break; + + default: + /* do nothing */ + break; + } +} /* meas_prepare_and_stop_idle() */ + +/*==== SIGNAL FUNCTIONS =====================================================*/ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_start ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_START +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_start ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_start" ); + + /* process the extended measurement service */ + if( psc_db->is_ext_psi5_valid EQ TRUE ) + { + sig_ctrl_meas_ext_valid_psi5( ); + } + + /* process the interference measurement service */ + sig_ctrl_meas_int_list_valid( ); + +} /* sig_ctrl_meas_start() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_stop ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_STOP +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_stop ( void ) +{ + UBYTE state = GET_STATE( MEAS ); + + TRACE_ISIG( "sig_ctrl_meas_stop" ); + + /* process the interference measurement service */ + switch( state ) + { + case MEAS_ACCESS: + case MEAS_TRANSFER: + { + meas_im_stop_trns( ); + SET_STATE( MEAS_IM, MEAS_IM_NULL ); + } + break; + + case MEAS_IDLE: + { + switch( GET_STATE( MEAS_IM ) ) + { + case MEAS_IM_START: + { + meas_im_stop_idle( ); + + SET_STATE( MEAS_IM, MEAS_IM_STOP_REQ ); + } + break; + + case MEAS_IM_NULL: + SET_STATE( MEAS_IM, MEAS_IM_NULL ); + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_STOP unexpected INT MEAS 1" ); + break; + } + } + break; + + default: + /* do nothing */; + break; + } + + /* process the extended measurement service */ + switch( state ) + { + case MEAS_NULL: + case MEAS_IDLE: + case MEAS_ACCESS: + case MEAS_TRANSFER: + switch( GET_STATE( MEAS_EM ) ) + { + case MEAS_EM_REP_REQ: + meas_em_stop_req( ); + break; + + case MEAS_EM_PMR_SENDING: + case MEAS_EM_PENDING: + SET_STATE( MEAS_EM, MEAS_EM_NULL ); + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_STOP unexpected EXT MEAS 1" ); + break; + } + + if( grr_t_status( T3178) NEQ 0 ) + { + vsi_t_stop( GRR_handle, T3178); + TRACE_EVENT( "Timer T3178 stopped" ); + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_STOP unexpected EXT MEAS 2" ); + break; + } + + /* process the signal quality service */ + if( state EQ MEAS_TRANSFER ) + { + RX_SetRxQual( RX_QUAL_UNAVAILABLE ); + } + + SET_STATE( MEAS, MEAS_NULL ); + +} /* sig_ctrl_meas_stop() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_suspend ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_SUSPEND +| This signal suspends the measurement service +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_suspend ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_suspend" ); + + /* process the interference measurement service */ + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + case MEAS_ACCESS: + case MEAS_TRANSFER: + { + switch( GET_STATE( MEAS_IM ) ) + { + case MEAS_IM_START: + { + meas_im_stop_idle( ); + + grr_data->meas_im.trig_signal = IM_TRIG_SIGNAL_PAUSE; + + SET_STATE( MEAS_IM, MEAS_IM_STOP_REQ ); + } + break; + + default: + /* do nothing */ + break; + } + } + break; + + default: + /* do nothing */ + break; + } + + /* process the extended measurement service */ + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + case MEAS_ACCESS: + case MEAS_TRANSFER: + SET_STATE( MEAS_EM, MEAS_EM_SUSPEND ); + + meas_em_process_t3178( ); + break; + + default: + /* do nothing */ + break; + } +} /* sig_ctrl_meas_suspend() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_resume ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_RESUME +| This signal resumes the measurement service +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_resume ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_resume" ); + + /* process the interference measurement service */ + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + case MEAS_ACCESS: + case MEAS_TRANSFER: + if ( grr_data->meas_im.mode EQ IM_MODE_IDLE_TRANSFER OR + grr_data->meas_im.mode EQ IM_MODE_IDLE ) + { + if( meas_im_start_idle( ) ) + { + SET_STATE( MEAS_IM, MEAS_IM_START ); + } + else + { + SET_STATE( MEAS_IM, MEAS_IM_NULL ); + } + break; + } + break; + + default: + /* do nothing */ + break; + } + + /* process the extended measurement service */ + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + case MEAS_ACCESS: + case MEAS_TRANSFER: + SET_STATE( MEAS_EM, MEAS_EM_NULL ); + + meas_em_process_t3178( ); + break; + + default: + /* do nothing */ + break; + } + +} /* sig_ctrl_meas_resume() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_pim ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_PIM +| +| Parameters : dummy - description of parameter dummy +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_pim ( void ) +{ + UBYTE state = GET_STATE( MEAS ); + + TRACE_ISIG( "sig_ctrl_meas_pim" ); + + /* process the interference measurement service */ + switch( state ) + { + case MEAS_TRANSFER: + meas_im_state_changed( MEAS_IDLE ); + + /*lint -fallthrough*/ + + case MEAS_ACCESS: + meas_im_stop_trns( ); + SET_STATE( MEAS_IM, MEAS_IM_NULL ); + if ( grr_data->meas_im.mode EQ IM_MODE_IDLE_TRANSFER OR + grr_data->meas_im.mode EQ IM_MODE_IDLE ) + { + meas_im_prepare_idle( ); + + if( meas_im_start_idle( ) ) + { + SET_STATE( MEAS_IM, MEAS_IM_START ); + } + } + break; + + default: + /* do nothing */ + break; + } + + /* process the extended measurement service */ + switch( state ) + { + case MEAS_ACCESS: + case MEAS_TRANSFER: + { + if( GET_STATE( MEAS_EM ) EQ MEAS_EM_PENDING ) + { + meas_em_start( ); + SET_STATE( MEAS_EM, MEAS_EM_REP_REQ ); + } + } + break; + + default: + /* do nothing */ + break; + } + + /* process the signal quality service */ + if( state EQ MEAS_TRANSFER ) + { + RX_SetRxQual( RX_QUAL_UNAVAILABLE ); + } + + SET_STATE( MEAS, MEAS_IDLE ); + +} /* sig_ctrl_meas_pim() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_pam ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_PAM +| +| Parameters : dummy - description of parameter dummy +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_pam ( void ) +{ + UBYTE state = GET_STATE( MEAS ); + + TRACE_ISIG( "sig_ctrl_meas_pam" ); + + /* process the interference measurement service */ + switch( state ) + { + case MEAS_IDLE: + { + switch( GET_STATE( MEAS_IM ) ) + { + case MEAS_IM_START: + { + meas_im_stop_idle( ); + + grr_data->meas_im.trig_signal = IM_TRIG_SIGNAL_PAM; + + SET_STATE( MEAS_IM, MEAS_IM_STOP_REQ ); + } + break; + + case MEAS_IM_NULL: + { + if ( grr_data->meas_im.mode EQ IM_MODE_IDLE_TRANSFER OR + grr_data->meas_im.mode EQ IM_MODE_TRANSFER ) + { + meas_im_prepare_trns( ); + meas_im_start_trns( ); + + SET_STATE( MEAS_IM, MEAS_IM_START ); + } + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_PAM unexpected" ); + break; + } + } + break; + + case MEAS_TRANSFER: + meas_im_state_changed( MEAS_ACCESS ); + break; + + default: + /* do nothing */ + break; + } + + + /* process the extended measurement service */ + switch( state ) + { + case MEAS_IDLE: + { + switch( GET_STATE( MEAS_EM ) ) + { + case MEAS_EM_REP_REQ: + meas_em_stop_req( ); + SET_STATE( MEAS_EM, MEAS_EM_PENDING ); + break; + + default: + /* do nothing */ + break; + } + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_PAM unexpected, EXT MEAS 2" ); + break; + } + + /* process the signal quality service */ + if( state EQ MEAS_TRANSFER ) + { + RX_SetRxQual( RX_QUAL_UNAVAILABLE ); + } + + SET_STATE( MEAS, MEAS_ACCESS ); + +} /* sig_ctrl_meas_pam() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_ptm ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_PTM +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_ptm ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_ptm" ); + + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + case MEAS_ACCESS: + meas_im_state_changed( MEAS_TRANSFER ); + break; + + default: + /* do nothing */ + break; + } + + SET_STATE( MEAS, MEAS_TRANSFER ); + +} /* sig_ctrl_meas_ptm() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_int_list_invalid ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_INT_LIST_INVALID +| If this signal is received then the list for interfrence +| measurements are invalid +| and interference measurements shall be stopped, if running +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_int_list_invalid ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_int_list_invalid" ); + + meas_prepare_and_stop_idle( ); +} /* sig_ctrl_meas_int_list_invalid() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_int_list_valid ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_INT_LIST_VALID +| If this signal is received then the list for interfrence +| measurements are valid +| and interference measurements could be started, refreshed etc. +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_int_list_valid ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_int_list_valid" ); + + meas_prepare_and_start_idle( ); + +} /* sig_ctrl_meas_int_list_valid() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_ext_invalid_psi5 ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_EXT_INVALID_PSI5 +| If this signal is received then the list for extended +| measurements are invalid +| and interference measurements could be stopped, if already running +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_ext_invalid_psi5 ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_ext_invalid_psi5" ); + + switch( GET_STATE( MEAS ) ) + { + case MEAS_NULL: + case MEAS_IDLE: + case MEAS_ACCESS: + case MEAS_TRANSFER: + if( !meas_em_is_valid_pmo_present( ) ) + { + meas_em_valid_psi5( ); + + switch( GET_STATE( MEAS_EM ) ) + { + case MEAS_EM_REP_REQ: + meas_em_stop_req( ); + break; + + default: + SET_STATE( MEAS_EM, MEAS_NULL ); + break; + } + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_EXT_INVALID_PSI5 unexpected" ); + break; + } +} /* sig_ctrl_meas_ext_invalid_psi5() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_ext_valid_psi5 ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_EXT_VALID_PSI5 +| If this signal is received then the list for extended +| measurements are valid +| and interference measurements could performed +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_ext_valid_psi5 ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_ext_valid_psi5" ); + + + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + if( !meas_em_is_valid_pmo_present( ) ) + { + switch( GET_STATE( MEAS_EM ) ) + { + case MEAS_EM_REP_REQ: + meas_em_stop_req( ); + + /*lint -fallthrough*/ + + case MEAS_EM_NULL: + meas_em_valid_psi5( ); + meas_em_process_t3178( ); + break; + default: + TRACE_ERROR( "SIG_CTRL_MEAS_EXT_VALID_PSI5 unexpected 1" ); + break; + } + } + break; + + case MEAS_NULL: + case MEAS_ACCESS: + case MEAS_TRANSFER: + if( !meas_em_is_valid_pmo_present( ) ) + { + /* measurement report parameters of PSI5 shall only be taken into */ + /* account in case there is no individually parameter set send to */ + /* the MS using a Packet Measurement Order message */ + meas_em_valid_psi5( ); + meas_em_process_t3178( ); + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_EXT_VALID_PSI5 unexpected 2" ); + break; + } + +} /* sig_ctrl_meas_ext_valid_psi5() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_cs_meas_start ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CS_MEAS_START +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_cs_meas_start ( void ) +{ + TRACE_ISIG( "sig_cs_meas_start" ); + + grr_data->meas_im.v_cs_meas_active = TRUE; + + meas_prepare_and_start_idle( ); + +} /* sig_cs_meas_start() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_cs_meas_stop ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CS_MEAS_STOP +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_cs_meas_stop ( void ) +{ + TRACE_ISIG( "sig_cs_meas_stop" ); + + grr_data->meas_im.v_cs_meas_active = FALSE; + + meas_prepare_and_stop_idle( ); + +} /* sig_cs_meas_stop() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_pmr_accept ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_PMR_ACCEPT +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_pmr_accept ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_pmr_accept" ); + + switch( GET_STATE( MEAS_EM ) ) + { + case( MEAS_EM_PMR_SENDING ): + if( meas_em_send_meas_rpt( FALSE ) EQ FALSE ) + { + SET_STATE( MEAS_EM, MEAS_EM_NULL ); + + meas_em_process_t3178( ); + } + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_PMR_ACCEPT unexpected" ); + break; + } + +} /* sig_ctrl_meas_pmr_accept() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_pmr_reject ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_MEAS_PMR_REJECT +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_pmr_reject ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_pmr_reject" ); + + switch( GET_STATE( MEAS_EM ) ) + { + case( MEAS_EM_PMR_SENDING ): + SET_STATE( MEAS_EM, MEAS_EM_NULL ); + + meas_em_process_t3178( ); + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_PMR_REJECT unexpected" ); + break; + } + +} /* sig_ctrl_meas_pmr_reject() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_ext_meas_cnf ++------------------------------------------------------------------------------ +| Description : ... +| +| Parameters : ... +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_ext_meas_cnf + ( T_RRGRR_EXT_MEAS_CNF *rrgrr_ext_meas_cnf ) +{ + TRACE_ISIG( "sig_ctrl_meas_ext_meas_cnf" ); + + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + case MEAS_ACCESS: + case MEAS_TRANSFER: + switch( GET_STATE( MEAS_EM ) ) + { + case( MEAS_EM_REP_REQ ): + if( meas_em_store_rslt( rrgrr_ext_meas_cnf ) EQ TRUE ) + { + SET_STATE( MEAS_EM, MEAS_EM_PMR_SENDING ); + + if( meas_em_send_meas_rpt( TRUE ) EQ FALSE ) + { + /* + * The additional state check is necessary because signals + * might be send during the processing of the function + * meas_em_send_meas_rpt. + */ + if( GET_STATE( MEAS_EM ) EQ MEAS_EM_PMR_SENDING ) + { + SET_STATE( MEAS_EM, MEAS_NULL ); + + meas_em_process_t3178( ); + } + } + } + else + { + SET_STATE( MEAS_EM, MEAS_NULL ); + + meas_em_process_t3178( ); + } + break; + + default: + TRACE_EVENT( "SIG_CTRL_MEAS_EXT_MEAS_CNF unexpected 1" ); + break; + } + break; + + default: + TRACE_EVENT( "SIG_CTRL_MEAS_EXT_MEAS_CNF unexpected 2" ); + break; + } +} /* sig_ctrl_meas_ext_meas_cnf() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_meas_order ++------------------------------------------------------------------------------ +| Description : Handles the signal SIG_GFP_MEAS_ORDER +| +| Parameters : - +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_meas_order ( void ) +{ + MCAST( d_meas_order, D_MEAS_ORDER ); + TRACE_ISIG( "sig_gfp_meas_order" ); + + if (grr_data->nc2_on) + { + meas_p_meas_order_ind(d_meas_order); + } + else + { + TRACE_EVENT( "PACKET MEASUREMENT ORDER RECEIVED,but NC2 is deactivated" ); + } + + +} /* sig_gfp_meas_order() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_meas_int_meas_stop_con ++------------------------------------------------------------------------------ +| Description : Handles the signal SIG_GFP_MEAS_INT_MEAS_STOP_CON +| +| Parameters : *dummy - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_meas_int_meas_stop_con ( T_MPHP_INT_MEAS_STOP_CON * dummy ) +{ + TRACE_ISIG( "sig_gfp_meas_int_meas_stop_con" ); + + switch( GET_STATE( MEAS ) ) + { + case MEAS_NULL: + case MEAS_IDLE: + case MEAS_ACCESS: + case MEAS_TRANSFER: + { + switch( GET_STATE( MEAS_IM ) ) + { + case MEAS_IM_STOP_REQ: + { + if( grr_data->meas_im.trig_signal EQ IM_TRIG_SIGNAL_PAM ) + { + meas_im_prepare_trns( ); + } + + SET_STATE( MEAS_IM, MEAS_IM_NULL ); + + grr_data->meas_im.trig_signal = IM_TRIG_SIGNAL_NULL; + } + break; + + default: + TRACE_ERROR( "SIG_GFP_MEAS_INT_MEAS_STOP_CON unexpected 1" ); + break; + } + } + break; + + default: + TRACE_ERROR( "SIG_GFP_MEAS_INT_MEAS_STOP_CON unexpected 2" ); + break; + } + +} /* sig_gfp_meas_int_meas_stop_con() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_meas_int_meas_ind ++------------------------------------------------------------------------------ +| Description : Handles the signal sig_gfp_meas_int_meas_ind +| +| Parameters : *mphp_int_meas_ind - Ptr to primitive payload +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_meas_int_meas_ind ( T_MPHP_INT_MEAS_IND *mphp_int_meas_ind ) +{ + UBYTE state = GET_STATE( MEAS ); + + TRACE_ISIG( "sig_gfp_meas_int_meas_ind" ); + + switch( state ) + { + case MEAS_ACCESS: + case MEAS_TRANSFER: + meas_im_new_value( mphp_int_meas_ind, state ); + break; + + case MEAS_IDLE: + { + switch( GET_STATE( MEAS_IM ) ) + { + case MEAS_IM_START: + meas_im_new_value( mphp_int_meas_ind, state ); + break; + + case MEAS_IM_STOP_REQ: + /* do nothing */ + break; + + default: + TRACE_ERROR( "SIG_GFP_MEAS_INT_MEAS_IND unexpected 1" ); + break; + } + } + break; + + default: + TRACE_ERROR( "SIG_GFP_MEAS_INT_MEAS_IND unexpected 2" ); + break; + } +} /* sig_gfp_meas_int_meas_ind() */ + +#if !defined (NTRACE) + +/* ++------------------------------------------------------------------------------ +| Function : meas_im_trace_i_level ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +LOCAL void meas_im_trace_i_level( T_MEAS_IM_FILTER *filter, + T_ilev *i_level ) +{ + TRACE_ISIG( "meas_im_trace_i_level" ); + + if( grr_data->meas_im.n_im_trace & M_IM_TRACE_OUTPUT_VALUE ) + { + if( filter NEQ NULL ) + { + TRACE_EVENT_P8( "meas_im_trace_i_level: %02X %02X %02X %02X %02X %02X %02X %02X", + i_level->ilev0, i_level->ilev1, i_level->ilev2, + i_level->ilev3, i_level->ilev4, i_level->ilev5, + i_level->ilev6, i_level->ilev7 ); + } + else + { + TRACE_EVENT( "meas_im_trace_i_level: filter EQ NULL" ); + } + } +} /* meas_im_trace_i_level() */ + +#endif /* #if !defined (NTRACE) */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_meas_ba_changed ++------------------------------------------------------------------------------ +| Description : Handles the signal SIG_CTRL_MEAS_BA_CHANGED +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_meas_ba_changed ( void ) +{ + TRACE_ISIG( "sig_ctrl_meas_ba_changed" ); + + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + case MEAS_ACCESS: + case MEAS_TRANSFER: + psc_db->nc_ms.ncmeas.list.number = 0; + psc_db->nc_ms.rfreq.number = 0; + + psc_db->nc_ms.ncmeas.list.chng_mrk.curr++; + break; + + default: + TRACE_ERROR( "SIG_CTRL_MEAS_BA_CHANGED unexpected" ); + break; + } +} /* sig_ctrl_meas_ba_changed() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_meas_rxlev_pccch_ind ++------------------------------------------------------------------------------ +| Description : Handles the signal SIG_GFP_MEAS_RXLEV_PCCCH_IND +| +| Parameters : pccch_lev - signal level received on pccch +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_meas_rxlev_pccch_ind( UBYTE pccch_lev ) +{ + TRACE_ISIG( "sig_gfp_meas_rxlev_pccch_ind" ); + + switch( GET_STATE( MEAS ) ) + { + case MEAS_IDLE: + case MEAS_ACCESS: + meas_c_val_update_pim( pccch_lev ); + grr_cgrlc_pwr_ctrl_req( TRUE ); + break; + + default: + TRACE_ERROR( "SIG_GFP_MEAS_RXLEV_PCCCH_IND unexpected" ); + break; + } +} /* sig_gfp_meas_rxlev_pccch_ind() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_meas_ctrl_pwr_ta_ptm ++------------------------------------------------------------------------------ +| Description : Handles the signal SIG_GFP_MEAS_CTRL_PWR_TA_PTM +| +| Parameters : - +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_meas_ctrl_pwr_ta_ptm ( void ) +{ + MCAST( d_ctrl_pwr_ta, D_CTRL_PWR_TA ); + + TRACE_ISIG( "sig_gfp_meas_ctrl_pwr_ta_ptm" ); + + switch( GET_STATE( MEAS ) ) + { + case MEAS_TRANSFER: + if( d_ctrl_pwr_ta->v_gpta ) + { + sig_meas_tc_update_ta_req( ); + } + + { + UBYTE pb; + + pb = psc_db->g_pwr_par.pb; + + meas_handle_pwr_par( ); + + if( pb NEQ psc_db->g_pwr_par.pb ) + { + grr_update_pacch(); + } + } + break; + + default: + TRACE_ERROR( "SIG_GFP_MEAS_CTRL_PWR_TA_PTM unexpected" ); + break; + } +} /* sig_gfp_meas_ctrl_pwr_ta_ptm() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_tc_meas_update_pch ++------------------------------------------------------------------------------ +| Description : ... +| +| Parameters : ... +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_tc_meas_update_pch ( void ) +{ + TRACE_ISIG( "sig_tc_meas_update_pch" ); + + grr_cgrlc_pwr_ctrl_req( FALSE ); + +} /* sig_tc_meas_update_pch() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_c_get_value ++------------------------------------------------------------------------------ +| Description : This function returns the current C value. +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL UBYTE meas_c_get_value ( void ) +{ + UBYTE c_value; + + TRACE_FUNCTION( "meas_c_get_value" ); + + if( grr_data->meas.c_filter.index > 0 ) + { + c_value = ( M_ROUND_UP( grr_data->meas.c_filter.value, MEAS_ACRCY ) ); + } + else + { + +#ifdef _SIMULATION_ + + TRACE_ERROR( "meas_c_get_value: grr_data->meas.c_filter.index EQ 0" ); + +#endif /* #ifdef _SIMULATION_ */ + + c_value = C_VALUE_DEFAULT; + } + + return( c_value ); + +} /* meas_c_get_value() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_c_get_c_value ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void meas_c_get_c_value ( T_CGRLC_c_value *c_value ) +{ + TRACE_FUNCTION( "meas_c_get_c_value" ); + + c_value->c_acrcy = MEAS_ACRCY; + c_value->c_lev = grr_data->meas.c_filter.value; + c_value->c_idx = grr_data->meas.c_filter.index; + +} /* meas_c_get_c_value() */ + +/* ++------------------------------------------------------------------------------ +| Function : meas_c_set_c_value ++------------------------------------------------------------------------------ +| Description : +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void meas_c_set_c_value ( T_CGRLC_c_value *c_value ) +{ + TRACE_FUNCTION( "meas_c_set_c_value" ); + + grr_data->meas.c_filter.value = ( c_value->c_lev * MEAS_ACRCY ) / + c_value->c_acrcy; + + grr_data->meas.c_filter.index = c_value->c_idx; + +} /* meas_c_set_c_value() */