FreeCalypso > hg > fc-tourmaline
diff src/g23m-gprs/grr/grr_psis.c @ 1:fa8dc04885d8
src/g23m-*: import from Magnetite
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 16 Oct 2020 06:25:50 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-gprs/grr/grr_psis.c Fri Oct 16 06:25:50 2020 +0000 @@ -0,0 +1,1836 @@ +/* ++----------------------------------------------------------------------------- +| 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 +| PSI of entity GRR. ++----------------------------------------------------------------------------- +*/ + +#ifndef GRR_PSIS_C +#define GRR_PSIS_C +#endif + +#define ENTITY_GRR + +/*==== INCLUDES =============================================================*/ + +#include "typedefs.h" /* to get Condat data types */ +#include <string.h> + +#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" /* To use global functions*/ + +#include "grr_psif.h" /* */ + +#include "grr_ctrls.h" /* */ + +#include "grr_psis.h" /* */ + +#include <stdio.h> + +/*==== CONST ================================================================*/ + +/*==== LOCAL VARS ===========================================================*/ + +/*==== PRIVATE FUNCTIONS ====================================================*/ + +/*==== PUBLIC FUNCTIONS =====================================================*/ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_si13_received ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_SI13_RECEIVED +| +| Parameters : T_RRGRR_SI13_IND *rrgrr_si13_ind +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_si13_received ( T_RRGRR_GPRS_SI13_IND *rrgrr_si13_ind, + BOOL ba_bcch_changed ) +{ + MCAST(si13,D_SYS_INFO_13); + UBYTE in_state = GET_STATE( PSI ); + UBYTE pb, ab_type; + TRACE_ISIG( "sig_ctrl_psi_si13_received" ); + +#ifndef _TARGET_ + + switch(psc_db->acq_type) + { + case NONE: + /* + * SI13 was not requested + */ + TRACE_ERROR("SI13 not requested!"); + return; + } + +#endif + + pb = psc_db->g_pwr_par.pb; + ab_type = psc_db->gprs_cell_opt.ab_type; + + switch( in_state ) + { + case PSI_NULL: + grr_data->psi.is_start_of_10_sec_allowed = TRUE; + psi_start_60sec(); + /* + * This is the first SI13 message received by the service PSI, except in + * case of having SI13 without rest octets in the former SI13 message + */ + switch(psi_process_si13(si13)) + { + case SI13_OK: + SET_STATE( PSI, PSI_BCCH_IDLE ); + TRACE_EVENT("NULL: BCCH present"); + psi_is_access_class_changed(); + sig_psi_ctrl_si13_processed(); + /* + * Stop and restart 60 sec. timer + */ + psi_stop_60sec ( TRUE ); + psi_start_30sec(); + /* + * Check acq state of SI messages + */ + switch(psi_acq_state_of_si(rrgrr_si13_ind->si_states)) + { + case ACQ_COMP_OK: + /* + * packet access enabled + */ + psi_send_access_enable_if_needed(); + psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/ + /* BCCH reading is automatically stopped by RR/ALR */ + + /*stop the timer 3172 timer if it is already running in old cell*/ + if(grr_t_status( T3172_1 ) > 0) + { + vsi_t_stop(GRR_handle,T3172_1); + } + break; + case ACQ_RUNNING: + sig_psi_ctrl_read_si( COMPLETE_SI ); + psc_db->acq_type = COMPLETE; + break; + default: + TRACE_ERROR("Unexpected acq state of SI in PSI_NULL"); + break; + } + break;/* switch SI13_OK */ + case SI13_REREAD: + /* + * Only in case of no rest octets + * Do not stop 60 sec. timer. Request new SI13 + */ + psc_db->acq_type = PARTIAL; + sig_psi_ctrl_read_si( UPDATE_SI13 ); + break; + case SI13_COMPLETE_PSI: + /* + * SI13 contains PBCCH description. Start complete acq of PSI + */ + SET_STATE( PSI, PSI_IDLE ); + TRACE_EVENT("PBCCH present"); + psi_update_data_to_request(INIT_NEEDED); + sig_psi_ctrl_si13_processed(); + psi_complete_acq(COMPLETE); + psi_stop_60sec ( TRUE ); + break; + default: + TRACE_ERROR("Unexpected SI13 return in PSI_NULL"); + break; + } + break; + case PSI_BCCH_IDLE: + /* + * Reading periodical SI13 message or reread because of absence of SI13 rest octets + * or partial acq or complete acq because of change field in the former SI13 message + * or PCCCH was released and we reread SI13 + */ + grr_data->psi.is_start_of_10_sec_allowed = TRUE; + switch(psi_process_si13(si13)) + { + case SI13_OK: + /* + * Stop and restart 60 sec. timer + */ + psi_stop_60sec ( TRUE ); + psi_stop_30sec ( TRUE ); + if(psi_is_access_class_changed()) + { + /* + * Implies the CTRL to send CELL_IND + */ + sig_psi_ctrl_access_changed(); + } + + /* + * Check acq state of SI messages + */ + switch(psi_acq_state_of_si(rrgrr_si13_ind->si_states)) + { + case ACQ_PERIOD_OK: + psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/ + /* BCCH reading is automatically stopped by RR/ALR */ + break; + case ACQ_PART_OK: + psi_stop_10sec(); /* partial acquisition completed */ + /* + * packet access enabled + */ + psi_send_access_enable_if_needed(); + psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/ + /* BCCH reading is automatically stopped by RR/ALR */ + break; + case ACQ_COMP_OK: + /* + * packet access enabled + */ + psi_send_access_enable_if_needed(); + psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/ + /* BCCH reading is automatically stopped by RR/ALR */ + break; + case ACQ_RUNNING: + break; + default: + TRACE_ERROR("Unexpected acq state of SI in PSI_BCCH_IDLE"); + break; + } + sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed ); + break;/* SI13_OK */ + case SI13_REREAD: + /* Only in case of no rest octets + * Do not stop 60 sec. timer. Request new SI13 + */ + psi_stop_30sec ( TRUE ); + psc_db->acq_type = PARTIAL; + sig_psi_ctrl_read_si( UPDATE_SI13 ); + sig_psi_ctrl_meas_param_invalid_si13( ); + break; + case SI13_PARTIAL_SI: + /* + * Partial acq has to be started + */ + psi_stop_30sec ( TRUE ); + sig_psi_ctrl_read_si(si13->si13_rest_oct.si13_info.si_cf); + psc_db->acq_type = PARTIAL; + psi_start_10sec(); + sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed ); + break; + case SI13_COMPLETE_SI: + psi_initiate_read_complete_si( ); + sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed ); + break; + case SI13_COMPLETE_PSI: + SET_STATE( PSI, PSI_NULL ); + /* BCCH reading is automatically stopped by RR/ALR */ + psi_initiate_pbcch_switching( PSI_DC_PBCCH_ESTABLISHED ); + break; + default: + TRACE_ERROR("Unexpected SI13 return in PSI_BCCH_IDLE"); + break; + } + break; + case PSI_BCCH_TRANSFER: + /* + * Reread SI13 because of PBCCH release indicated in PSI1 + * or change/release of PBCCH description indicated in PSI13 + * message. Both PSI13 and PSI1 are sent on PACCH + */ + /* + * Read SI13. We probably were not able to read PSI13 in transfer mode within + * 30 seconds, so we requested SI13. + */ + grr_data->psi.is_start_of_10_sec_allowed = FALSE; + switch(psi_process_si13(si13)) + { + case SI13_OK: + /* + * Stop and restart 60 sec. timer + * The MS may continue its operation on transfer mode + */ + psi_stop_60sec ( TRUE ); + psi_stop_30sec ( TRUE ); + + if(psi_is_access_class_changed()) + { + /* + * Implies the CTRL to send CELL_IND + */ + sig_psi_ctrl_access_changed(); + } + + switch(psi_acq_state_of_si(rrgrr_si13_ind->si_states)) + { + case ACQ_PERIOD_OK: + psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/ + /* BCCH reading is automatically stopped by RR/ALR */ + break; + case ACQ_PART_OK: + psi_stop_10sec(); /* partial acquisition completed */ + psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/ + /* BCCH reading is automatically stopped by RR/ALR */ + break; + case ACQ_COMP_OK: + /* + * packet access enabled + */ + psi_send_access_enable_if_needed(); + psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/ + /* BCCH reading is automatically stopped by RR/ALR */ + break; + case ACQ_RUNNING: + break; + default: + TRACE_ERROR("Unexpected acq state of SI in PSI_BCCH_TRANSFER"); + break; + } + + if( ab_type NEQ psc_db->gprs_cell_opt.ab_type OR + pb NEQ psc_db->g_pwr_par.pb ) + { + grr_update_pacch(); + } + + sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed ); + break; + case SI13_REREAD: + /* + * Only in case of no rest octets + * Do not stop 60 sec. timer. Request new SI13 + */ + psi_stop_30sec ( TRUE ); + psc_db->acq_type = PARTIAL; + sig_psi_ctrl_read_si( UPDATE_SI13 ); + sig_psi_ctrl_meas_param_invalid_si13( ); + break; + + case SI13_PARTIAL_SI: + /* + * Partial acq has to be started + */ + psi_stop_30sec ( TRUE ); + sig_psi_ctrl_read_si(si13->si13_rest_oct.si13_info.si_cf); + psc_db->acq_type = PARTIAL; + psi_start_10sec(); + sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed ); + TRACE_EVENT ("SI 13 with partial SI"); + break; + + case SI13_COMPLETE_SI: + psc_db->acq_type =COMPLETE; + sig_psi_ctrl_read_si( COMPLETE_SI); + TRACE_EVENT ("SI 13 with complete SI"); + break; + + case SI13_COMPLETE_PSI: + SET_STATE( PSI, PSI_NULL ); + /* BCCH reading is automatically stopped by RR/ALR */ + psi_initiate_pbcch_switching( PSI_DC_PBCCH_ESTABLISHED ); + break; + default: + TRACE_ERROR("SIG_CTRL_PSI_SI13_RECEIVED: unexpected return value of type T_SI13_RET"); + break; + } + break; + default: + TRACE_ERROR( "SIG_CTRL_PSI_SI13_RECEIVED unexpected" ); + break; + } +} /* sig_ctrl_psi_si13_received() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_pim ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_PIM +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_pim ( void ) +{ + UBYTE state; + TRACE_ISIG( "sig_ctrl_psi_pim" ); + + state = GET_STATE( PSI ); + switch( state ) + { + case PSI_NULL: + case PSI_TRANSFER: + SET_STATE( PSI, PSI_IDLE ); + /*lint -fallthrough*/ + case PSI_IDLE: + /* Partial acquisition in this case is not taken care */ + if(psc_db->acq_type EQ PERIODICAL_PSI1_READING) + { + TRACE_EVENT("Trigger PSI1 : Packet->Idle"); + psi_receive_psi(READ_PSI1_IN_PSI1_REPEAT_PERIODS); + } + break; + case PSI_BCCH_TRANSFER: + SET_STATE( PSI, PSI_BCCH_IDLE ); + + /*lint -fallthrough*/ + + case PSI_BCCH_IDLE: + if(psc_db->acq_type EQ PERIODICAL_SI13_READING) + { + sig_psi_ctrl_read_si( UPDATE_SI13 ); + } + break; + default: + TRACE_EVENT_P1("PSI_PIM PSI: %d",state); + break; + } +} /* sig_ctrl_psi_pim() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_pam ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_PAM +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_pam ( void ) +{ + UBYTE state; + TRACE_ISIG( "sig_ctrl_psi_pam" ); + + state = GET_STATE( PSI ); + switch( state ) + { + case PSI_IDLE: + /* PBCCH reading process is running, we have to stop it*/ + if (psc_db->acq_type EQ PERIODICAL_PSI1_READING) + { + /* When entering Idle go for PSI1 acquisition + * acq_type is changed to PERIODICAL_PSI1_READING */ + psi_stop_psi_reading(PERIODICAL_PSI1_READING); + } + else if (psc_db->acq_type NEQ NONE) + { + /* Limitation: partial acquisition of other PSIs not taken care */ + psi_stop_psi_reading(NONE); + } + break; + case PSI_BCCH_IDLE: + case PSI_BCCH_TRANSFER: + /* BCCH reading is automatically stopped by RR/ALR */ + break; + default: + TRACE_EVENT_P1("PSI_PAM PSI: %d",state); + break; + } +} /* sig_ctrl_psi_pam() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_ptm ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_PTM +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_ptm ( void ) +{ + UBYTE state; + + TRACE_ISIG( "sig_ctrl_psi_ptm" ); + + state = GET_STATE( PSI ) ; + switch( state ) + { + case PSI_IDLE: + SET_STATE( PSI, PSI_TRANSFER ); + /* acquisition has been running, so we have to stop this acq.*/ + if (psc_db->acq_type EQ PERIODICAL_PSI1_READING) + { + /* When entering Idle go for PSI1 acquisition + * acq_type is changed to PERIODICAL_PSI1_READING */ + psi_stop_psi_reading(PERIODICAL_PSI1_READING); + } + else if (psc_db->acq_type NEQ NONE) + { + /* Limitation: partial acquisition of other PSIs not taken care */ + psi_stop_psi_reading(NONE); + } + + if(psc_db->send_psi_status AND psc_db->psi1_params.psi_status_supported) + { + /* MS should acquire PSI messages; we have to send PACKET PSI STATUS message*/ + psi_send_psi_status(); + } + /* PSI STATUS*/ + break; + case PSI_NULL: + case PSI_BCCH_IDLE: + SET_STATE( PSI, PSI_BCCH_TRANSFER ); + if(psc_db->acq_type EQ PERIODICAL_SI13_READING ) + { + /* SI reading has been running and therefore it has to be restarted. */ + sig_psi_ctrl_read_si( UPDATE_SI13 ); + } + break; + default: +/* TRACE_EVENT_P1( "PSI_PTM PSI: %d",state);*/ + break; + } +} /* sig_ctrl_psi_ptm() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_suspend ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_SUSPEND +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_suspend ( void ) +{ + TRACE_ISIG( "sig_ctrl_psi_suspend" ); + + SET_STATE(PSI, PSI_SUSPENDED); + + if(psc_db->acq_type NEQ NONE) /* acquisition has been running, so we have to stop this acq.*/ + { + psi_stop_psi_reading(NONE); + } + psi_stop_timer(); + +} /* sig_ctrl_psi_suspend() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_resumpt ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_RESUMPT +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_resumpt ( void ) +{ + TRACE_ISIG( "sig_ctrl_psi_resumpt" ); + + switch( GET_STATE( PSI ) ) + { + case PSI_SUSPENDED: + if(grr_is_pbcch_present()) + { + SET_STATE(PSI, PSI_IDLE); + } + else + { + SET_STATE(PSI, PSI_BCCH_IDLE); + } + /* + * start timer 30, 60 sec. to be able to read PSI1 or SI13 + */ + psi_start_60sec(); + psi_start_30sec(); + break; + default: + TRACE_ERROR( "SIG_CTRL_PSI_RESUMPT unexpected" ); + break; + } +} /* sig_ctrl_psi_resumpt() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_stop ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_STOP +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_stop ( void) +{ + TRACE_ISIG( "sig_ctrl_psi_stop" ); + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + case PSI_TRANSFER: + SET_STATE( PSI, PSI_NULL ); + if(psc_db->acq_type NEQ NONE) /* acquisition has been running, so we have to stop this acq.*/ + { + TRACE_EVENT("Acq. running: send MPHP_SCELL_PBCCH_STOP_REQ"); + psi_stop_psi_reading(NONE); + } + psi_stop_timer(); + psi_init_params(); + break; + case PSI_SUSPENDED: + SET_STATE( PSI, PSI_NULL ); + psi_stop_timer(); + psi_init_params(); + break; + case PSI_BCCH_IDLE: + case PSI_BCCH_TRANSFER: + SET_STATE( PSI, PSI_NULL ); + psi_stop_timer(); + if(psc_db->acq_type NEQ COMPLETE) /* acquisition has been running, so we have to stop this acq.*/ + { + TRACE_EVENT("Acq. running: send STOP SI READING"); + psc_db->acq_type = COMPLETE; + /* BCCH reading is automatically stopped by RR/ALR */ + } + psi_reset_si_entries(); + break; + default: + TRACE_EVENT( "PSI stopped/not running" ); + break; + } +} /* sig_ctrl_psi_stop() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_sync_ok ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_SYNC_OK +| PSI can start PBCCH reading process +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_sync_ok ( void) +{ + TRACE_ISIG( "sig_ctrl_psi_sync_ok" ); + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + psi_complete_acq(COMPLETE); + break; + default: + TRACE_ERROR( "SIG_CTRL_PSI_SYNC_OK unexpected" ); + break; + } +} /* sig_ctrl_psi_sync_ok() */ + +/* ++------------------------------------------------------------------------------ +| Function : SIG_CTRL_PSI_READ_FULL_PSI_IN_NEW_CELL ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_READ_FULL_PSI_IN_NEW_CELL +| PSI can starts PBCCH reading process in the possible new cell +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_read_full_psi_in_new_cell ( void) +{ + TRACE_ISIG( "sig_ctrl_psi_read_full_psi_in_new_cell" ); + switch( GET_STATE( PSI ) ) + { + case PSI_NULL: + SET_STATE(PSI, PSI_IDLE); + + /*lint -fallthrough*/ + + case PSI_IDLE: + case PSI_TRANSFER: + case PSI_SUSPENDED: + case PSI_BCCH_IDLE: + case PSI_BCCH_TRANSFER: + + psc_db->state_of_PSI[PSI13].state = RECEIPT_OK; /* we do not need to read PSI13 again*/ + /* + * read PSI: update it with PBCCH desc + */ + psi_update_data_to_request(INIT_NOT_NEEDED); + + psi_complete_acq(FULL_PSI_IN_NEW_CELL); + break; + default: + TRACE_ERROR( "SIG_CTRL_PSI_READ_FULL_PSI_IN_NEW_CELL unexpected" ); + break; + } +} /* sig_ctrl_psi_read_full_psi_in_new_cell() */ + +/* ++------------------------------------------------------------------------------ +| Function : SIG_CTRL_PSI_REL_STATE ++------------------------------------------------------------------------------ +| Description : Handles the internal signal sig_ctrl_psi_rel_state +| Check whether we have to start PBCCH request or not +| +| Parameters : T_RELEASE_STATE rel_state +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_rel_state(T_RELEASE_STATE rel_state) +{ + TRACE_ISIG("sig_ctrl_psi_rel_state"); + + if(rel_state EQ REL_PERFORMED) + { + grr_data->psi.is_pbcch_req_allowed = TRUE; + if(grr_data->psi.is_pbcch_req_needed) + { + TRACE_EVENT("Release of TBF, stop of RR task, etc. performed.There is a waiting PBCCH req. We can start it now"); + grr_data->psi.is_pbcch_req_needed =FALSE; + { + PALLOC(mphp_scell_pbcch_req, MPHP_SCELL_PBCCH_REQ); + psi_prepare_scell_pbcch_req(mphp_scell_pbcch_req, grr_data->psi.reading_type); + PSEND(hCommL1,mphp_scell_pbcch_req); + } + } + /* else + { + TRACE_EVENT("Release performed.There is NO waiting PBCCH req."); + } + */ + } + else + { + /* + * If a PBCCH req was running L1 stops automatically the reading procedure + * we have to set the grr_data->psi.is_pbcch_req_needed to TRUE to continue + * after performing release + * + * if(psc_db->acq_type NEQ NONE) + * { + * grr_data->psi.is_pbcch_req_needed = TRUE; + * } + * + * TRACE_EVENT("We may have to stop running PBCCH request.PBCCH req. NOT allowed"); + */ + grr_data->psi.is_pbcch_req_allowed = FALSE; + } + +} + + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_resumpt_cc ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_RESUMPT_CC +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_resumpt_cc ( void ) +{ + MCAST(si13,D_SYS_INFO_13); + + TRACE_ISIG( "sig_ctrl_psi_resumpt_cc" ); + /* because get_state(PSI) makes no difference of the psi status + *between the old and new cell, it must be directly from the datadase */ + + grr_set_pbcch( si13->si13_rest_oct.si13_info.v_pbcch_des ); + + if(( grr_t_status( T3176 ) > 0 ) /* in case of packet cell change failure, SI13 should be processed */ + AND + (psc_db->psi_assigned_data.state EQ PSI_SUSPENDED)) + { + if (grr_is_pbcch_present()) + { + psc_db->psi_assigned_data.state = PSI_IDLE; + psi_start_60sec(); + psi_start_30sec(); + } + else + { + psc_db->psi_assigned_data.state = PSI_BCCH_IDLE; + } + } +} /* sig_ctrl_psi_resumpt_cc() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_1_ptm ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_1_ptm ( void ) +{ + MCAST(psi1, PSI_1); + + TRACE_ISIG( "sig_gfp_psi_1_ptm" ); + + + switch( GET_STATE( PSI ) ) + { + case PSI_TRANSFER: + psi_stop_60sec(TRUE); + psi_stop_30sec(TRUE); + { + UBYTE pb, ab_type; + + pb = psc_db->g_pwr_par.pb; + ab_type = psc_db->gprs_cell_opt.ab_type; + + psi_handle_psi1(psi1); + + if( + (ab_type NEQ psc_db->gprs_cell_opt.ab_type) + OR + (pb NEQ psc_db->g_pwr_par.pb) + ) + { + /* + * update PACCH parameters + */ + grr_update_pacch(); + } + } + break; + case PSI_BCCH_TRANSFER: + psi_handle_psi1(psi1); + break; + + default: + TRACE_ERROR( "SIG_GFP_PSI_1_PTM unexpected" ); + break; + } +} /* sig_gfp_psi_1_ptm() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_2_ptm ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_2_ptm (void) +{ + MCAST(psi2, PSI_2); + + TRACE_ISIG( "sig_gfp_psi_2_ptm " ); + + switch( GET_STATE( PSI ) ) + { + case PSI_TRANSFER: + psi_handle_psi2(psi2); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_2_PTM unexpected" ); + break; + } +} /* sig_gfp_psi_2_ptm () */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_3_ptm ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_3_ptm (void) +{ + MCAST(psi3, PSI_3); + + TRACE_ISIG( "sig_gfp_psi_3_ptm " ); + + switch( GET_STATE( PSI ) ) + { + case PSI_TRANSFER: + psi_handle_psi3(psi3); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_3_PTM unexpected" ); + break; + } +} /* sig_gfp_psi_3_ptm () */ + + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_3_bis_ptm ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_3_bis_ptm ( void ) +{ + MCAST(psi3bis, PSI_3_BIS); + + TRACE_ISIG( "sig_gfp_psi_3_bis_ptm " ); + + + switch( GET_STATE( PSI ) ) + { + case PSI_TRANSFER: + psi_handle_psi3bis(psi3bis); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_3_BIS_PTM unexpected" ); + break; + } +} /* sig_gfp_psi_3_bis_ptm () */ + + +#if defined (REL99) AND defined (TI_PS_FF_EMR) +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_3_ter_ptm ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_GFP_PSI_3_TER_PTM +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_3_ter_ptm ( void ) +{ + MCAST(psi3ter, PSI_3_TER); + + TRACE_ISIG( "sig_gfp_psi_3_ter_ptm " ); + + + switch( GET_STATE( PSI ) ) + { + case PSI_TRANSFER: + psi_handle_psi3ter(psi3ter); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_3_TER_PTM unexpected" ); + break; + } +} /* sig_gfp_psi_3_ter_ptm () */ +#endif + +/* ++------------------------------------------------------------------------------ +| Function : sig_gff_psi_4 ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_4_ptm ( void ) +{ + MCAST(psi4, PSI_4); + + TRACE_ISIG( "sig_gfp_psi_4_ptm " ); + + switch( GET_STATE( PSI ) ) + { + case PSI_TRANSFER: + psi_handle_psi4(psi4); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_4_PTM unexpected" ); + break; + } +} /* sig_gfp_psi_4_ptm() */ + +#ifdef REL99 +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_8_ptm ++------------------------------------------------------------------------------ +| Description : Handles psi 8 messsage received on PACCH. +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_8_ptm ( void ) +{ + MCAST(psi8, PSI_8); + + TRACE_ISIG( "sig_gfp_psi_8_ptm " ); + + switch( GET_STATE( PSI ) ) + { + case PSI_TRANSFER: + psi_handle_psi8(psi8); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_8_PTM unexpected" ); + break; + } +} /* sig_gfp_psi_8_ptm() */ +#endif + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_13_ptm ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_13_ptm(void) +{ + MCAST(psi13,PSI_13); + + UBYTE pb, ab_type; + + TRACE_ISIG( "sig_gfp_psi_13_ptm" ); + + grr_data->psi.is_start_of_10_sec_allowed = TRUE; + + pb = psc_db->g_pwr_par.pb; + ab_type = psc_db->gprs_cell_opt.ab_type; + + switch( GET_STATE( PSI ) ) + { + case PSI_BCCH_TRANSFER: + case PSI_TRANSFER: + switch(psi_process_psi13(psi13)) + { + case PSI13_OK: + psi_stop_60sec(TRUE); + psi_stop_30sec(TRUE); + + if( ab_type NEQ psc_db->gprs_cell_opt.ab_type OR + pb NEQ psc_db->g_pwr_par.pb ) + { + grr_update_pacch(); + } + sig_psi_ctrl_meas_param_valid_si13( FALSE ); + break; + case PSI13_PARTIAL_SI: + psi_stop_60sec(TRUE); + psi_stop_30sec(TRUE); + sig_psi_ctrl_read_si(psi13->si_change_ma); + psc_db->acq_type = PARTIAL; + psi_start_10sec(); + sig_psi_ctrl_meas_param_valid_si13( FALSE ); + break; + case PSI13_COMPLETE_SI: + psi_stop_60sec(TRUE); + psi_stop_30sec(TRUE); + psc_db->acq_type =COMPLETE; + sig_psi_ctrl_read_si( COMPLETE_SI); + psi_start_10sec(); + sig_psi_ctrl_meas_param_valid_si13( FALSE ); + TRACE_EVENT ("PSI 13 with complete SI"); + //psi_initiate_read_complete_si( ); + //sig_psi_ctrl_meas_param_valid_si13( FALSE ); + break; + case PSI13_COMPLETE_PSI: + SET_STATE( PSI, PSI_IDLE ); + psi_initiate_read_complete_psi( INIT_NEEDED ); + break; + case PSI13_PBCCH_RELEASED: + SET_STATE( PSI, PSI_NULL ); + psi_initiate_pbcch_switching( PSI_DC_PBCCH_RELEASED ); + break; + case PSI13_PBCCH_ESTABLISHED: + SET_STATE( PSI, PSI_NULL ); + psi_initiate_pbcch_switching( PSI_DC_PBCCH_ESTABLISHED ); + break; + default: + TRACE_ERROR("SIG_GFP_PSI_13_PTM: unexpected return value of type T_PSI13_RET"); + break; + } + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_13_PTM unexpected" ); + break; + } +} /* sig_gfp_psi_13_ptm() */ + + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_1 ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_1 ( void ) +{ + MCAST(psi1, PSI_1); + + ACQ_TYPE old_acq_type = psc_db->acq_type; + T_DB_MODE old_db_mode = grr_get_db_mode( ); + + TRACE_ISIG( "sig_gfp_psi_1" ); + + switch(psc_db->acq_type) + { + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + } + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + /* + * Handle 60, 30, 10 sec. timer within psi_handle_psi1 + */ + grr_data->psi.is_start_of_10_sec_allowed = FALSE; + psi_handle_psi1(psi1); + break; + case PSI_TRANSFER: + /* + * Handle 60, 30, 10 sec. timer within psi_handle_psi1 + */ + grr_data->psi.is_start_of_10_sec_allowed = TRUE; + { + UBYTE pb, ab_type; + + pb = psc_db->g_pwr_par.pb; + ab_type = psc_db->gprs_cell_opt.ab_type; + + psi_handle_psi1(psi1); + + if( + (ab_type NEQ psc_db->gprs_cell_opt.ab_type) + OR + (pb NEQ psc_db->g_pwr_par.pb) + ) + { + /* + * update PACCH parameters + */ + grr_update_pacch(); + } + } + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_1 unexpected" ); + break; + } + switch(old_acq_type) + { + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + default: + break; + } + +} /* sig_gfp_psi_1() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_2 ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : UBYTE received_in: relative position to B0 +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_2 (UBYTE rel_pos_i) +{ + MCAST (psi2, PSI_2); + + ACQ_TYPE old_acq_type = psc_db->acq_type; + T_DB_MODE old_db_mode = grr_get_db_mode( ); + + TRACE_ISIG( "sig_gfp_psi_2" ); + + psi_store_rel_pos(grr_data->psi.psi2_pos, rel_pos_i, MAX_NR_OF_INSTANCES_OF_PSI2); /*MODIF*/ + + switch(psc_db->acq_type) + { + case NONE: + case PERIODICAL_PSI1_READING: + /* + * PSI2 was not requested + */ + +#ifdef _SIMULATION_ + TRACE_ERROR("PSI2 not requested!"); +#endif /* #ifdef _SIMULATION_ */ + return; + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + } + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/ + psi_handle_psi2(psi2); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_2 unexpected" ); + break; + } + + switch(old_acq_type) + { + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + default: + break; + } + +} /* sig_gfp_psi_2() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_3 ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : UBYTE received_in: relative position to B0 +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_3 (UBYTE rel_pos_i) +{ + MCAST (psi3, PSI_3); + + ACQ_TYPE old_acq_type = psc_db->acq_type; + T_DB_MODE old_db_mode = grr_get_db_mode( ); + + TRACE_ISIG( "sig_gfp_psi_3" ); +#if defined (REL99) AND defined (TI_PS_FF_EMR) + psi_store_rel_pos(grr_data->psi.psi3_set_pos, + rel_pos_i, + MAX_NR_OF_INSTANCES_OF_PSI3TER+ + MAX_NR_OF_INSTANCES_OF_PSI3BIS+MAX_NR_OF_INSTANCES_OF_PSI3); /*MODIF*/ +#else + psi_store_rel_pos(grr_data->psi.psi3bis_pos, + rel_pos_i, + MAX_NR_OF_INSTANCES_OF_PSI3BIS+MAX_NR_OF_INSTANCES_OF_PSI3); /*MODIF*/ +#endif + + switch(psc_db->acq_type) + { + case NONE: + case PERIODICAL_PSI1_READING: + /* + * PSI3 was not requested + */ +#ifdef _SIMULATION_ + TRACE_ERROR("PSI3 not requested!"); +#endif /* #ifdef _SIMULATION_ */ + return; + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + } + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/ + psi_handle_psi3(psi3); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_3 unexpected" ); + break; + } + + switch(old_acq_type) + { + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + default: + break; + } + +} /* sig_gfp_psi_3() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_3_bis ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : UBYTE received_in: relative position to B0 +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_3_bis (UBYTE rel_pos_i) +{ + MCAST(psi3bis, PSI_3_BIS); + + ACQ_TYPE old_acq_type = psc_db->acq_type; + T_DB_MODE old_db_mode = grr_get_db_mode( ); + + TRACE_ISIG( "sig_gfp_psi_3_bis" ); +#if defined (REL99) AND defined (TI_PS_FF_EMR) + psi_store_rel_pos(grr_data->psi.psi3_set_pos, + rel_pos_i, + MAX_NR_OF_INSTANCES_OF_PSI3TER+ + MAX_NR_OF_INSTANCES_OF_PSI3BIS+MAX_NR_OF_INSTANCES_OF_PSI3); /*MODIF*/ +#else + psi_store_rel_pos(grr_data->psi.psi3bis_pos, + rel_pos_i, + MAX_NR_OF_INSTANCES_OF_PSI3BIS+MAX_NR_OF_INSTANCES_OF_PSI3); /*MODIF*/ +#endif + + switch(psc_db->acq_type) + { + case NONE: + case PERIODICAL_PSI1_READING: + /* + * PSI3BIS was not requested + */ +#ifdef _SIMULATION_ + TRACE_ERROR("PSI3BIS not requested!"); +#endif /* #ifdef _SIMULATION_ */ + return; + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + } + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/ + psi_handle_psi3bis(psi3bis); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_3_BIS unexpected" ); + break; + } + + switch(old_acq_type) + { + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + default: + break; + } + +} /* sig_gfp_psi_3_bis() */ + + +#if defined (REL99) AND defined (TI_PS_FF_EMR) +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_3_ter ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_GFP_PSI_3_TER +| +| Parameters : UBYTE received_in: relative position to B0 +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_3_ter (UBYTE rel_pos_i) +{ + MCAST(psi3ter, PSI_3_TER); + + ACQ_TYPE old_acq_type = psc_db->acq_type; + T_DB_MODE old_db_mode = grr_get_db_mode( ); + + TRACE_ISIG( "sig_gfp_psi_3_ter" ); + + psi_store_rel_pos(grr_data->psi.psi3_set_pos, + rel_pos_i, + MAX_NR_OF_INSTANCES_OF_PSI3TER+MAX_NR_OF_INSTANCES_OF_PSI3BIS + +MAX_NR_OF_INSTANCES_OF_PSI3); + + switch(psc_db->acq_type) + { + case NONE: + case PERIODICAL_PSI1_READING: + /* + * PSI3TER was not requested + */ +#ifdef _SIMULATION_ + TRACE_ERROR("PSI3TER not requested!"); +#endif /* #ifdef _SIMULATION_ */ + return; + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + } + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/ + psi_handle_psi3ter(psi3ter); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_3_TER unexpected" ); + break; + } + + switch(old_acq_type) + { + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + default: + break; + } + +} /* sig_gfp_psi_3_ter() */ +#endif + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_4 ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : UBYTE received_in: relative position to B0 +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_4 ( UBYTE rel_pos_i) +{ + MCAST(psi4, PSI_4); + + ACQ_TYPE old_acq_type = psc_db->acq_type; + T_DB_MODE old_db_mode = grr_get_db_mode( ); + + TRACE_ISIG( "sig_gfp_psi_4" ); + + psi_store_rel_pos(grr_data->psi.psi4_pos, rel_pos_i, MAX_NR_OF_INSTANCES_OF_PSI4); + + switch(psc_db->acq_type) + { + case NONE: + case PERIODICAL_PSI1_READING: + /* + * PSI4 was not requested + */ +#ifdef _SIMULATION_ + TRACE_ERROR("PSI4 not requested!"); +#endif /* #ifdef _SIMULATION_ */ + return; + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + } + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/ + psi_handle_psi4(psi4); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_4 unexpected" ); + break; + } + + switch(old_acq_type) + { + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + default: + break; + } +} /* sig_gfp_psi_4() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_5 ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : UBYTE received_in: relative position to B0 +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_5 ( UBYTE rel_pos_i) +{ + MCAST(psi5, PSI_5); + + ACQ_TYPE old_acq_type = psc_db->acq_type; + T_DB_MODE old_db_mode = grr_get_db_mode( ); + + TRACE_ISIG( "sig_gfp_psi_5" ); + + psi_store_rel_pos(grr_data->psi.psi5_pos, rel_pos_i, MAX_NR_OF_INSTANCES_OF_PSI5); /*MODIF*/ + + switch(psc_db->acq_type) + { + case NONE: + case PERIODICAL_PSI1_READING: + /* + * PSI5 was not requested + */ +#ifdef _SIMULATION_ + TRACE_ERROR("PSI5 not requested!"); +#endif /* #ifdef _SIMULATION_ */ + return; + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + } + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/ + switch(psi_process_psi5(psi5)) + { + case PSI5_REREAD: + psi_reread_psi5(); + /* + * NC measurement parameters and Extended Measurement Parameters are invalid. + * We have to inform CS and MEAS-Service + */ + sig_psi_ctrl_meas_param_invalid_psi5(); + break; + case PSI5_MEAS_PARAM_VALID: + sig_psi_ctrl_meas_param_valid_psi5(); + + /*lint -fallthrough*/ + + case PSI5_OK: + /* + * check the acquisition state: it is only for having a complete set of information + */ + switch(psi_check_acq_state()) + { + case ACQ_RUNNING: + /* + * Nothing to do + */ + break; + case ACQ_PART_OK: + psi_stop_psi_reading(NONE); +#ifdef _TARGET_ + TRACE_EVENT("PSI5->NEW_PCCCH"); + sig_psi_ctrl_new_pccch(); +#endif + break; + case ACQ_COMP_OK: + case ACQ_NPSI_OK: + psi_stop_psi_reading(NONE); + /* + * Access to the network is allowed + */ + psi_send_access_enable_if_needed(); + break; + default: + TRACE_ERROR("Unexpected acq_ret in PSI5"); + break; + }/*switch check_acq*/ + break; + } + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_5 unexpected" ); + break; + } + switch(old_acq_type) + { + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + default: + break; + } +} /* sig_gfp_psi_5() */ + +#ifdef REL99 +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_8 ++------------------------------------------------------------------------------ +| Description : Handles PSI8 message received on PBCCH. +| +| Parameters : UBYTE received_in: relative position to B0 +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_8 ( UBYTE rel_pos_i) +{ + MCAST(psi8, PSI_8); + + ACQ_TYPE old_acq_type = psc_db->acq_type; + T_DB_MODE old_db_mode = grr_get_db_mode( ); + + TRACE_ISIG( "sig_gfp_psi_8" ); + + psi_store_rel_pos(grr_data->psi.psi8_pos, rel_pos_i, MAX_NR_OF_INSTANCES_OF_PSI8); + + switch(psc_db->acq_type) + { + case NONE: + case PERIODICAL_PSI1_READING: + /* + * PSI8 was not requested + */ +#ifdef _SIMULATION_ + TRACE_ERROR("PSI8 not requested!"); +#endif /* #ifdef _SIMULATION_ */ + return; + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + } + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/ + psi_handle_psi8(psi8); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_8 unexpected" ); + break; + } + + switch(old_acq_type) + { + case FULL_PSI_IN_NEW_CELL: + if( old_db_mode NEQ DB_MODE_CC_REQ ) + { + grr_set_db_ptr( DB_MODE_SWAP ); + } + break; + default: + break; + } +} /* sig_gfp_psi_8() */ +#endif + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_prach ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_prach (void ) +{ + MCAST(prach, D_PRACH_PAR); + + TRACE_ISIG( "sig_gfp_psi_prach" ); + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + psi_process_prach(&prach->prach_ctrl_par); + if(psi_is_access_class_changed()) + { + /* + * Implies the CTRL to send CELL_IND + */ + sig_psi_ctrl_access_changed(); + } + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_PRACH unexpected" ); + break; + } + +} /* sig_gfp_psi_prach() */ + + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_scell_pbcch_stop_con ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_GFP_PSI_SCELL_PBCCH_STOP_CON +| +| Parameters : T_MPHP_SCELL_PBCCH_STOP_CON *mphp_scell_pbcch_stop_con +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_scell_pbcch_stop_con ( T_MPHP_SCELL_PBCCH_STOP_CON *mphp_scell_pbcch_stop_con) +{ + TRACE_ISIG( "sig_gfp_psi_scell_pbcch_stop_con" ); + +} /* sig_gfp_psi_scell_pbcch_stop_con() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_ncell_pbcch_ind ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_GFP_PSI_NCELL_PBCCH_IND +| +| Parameters : T_MPHP_NCELL_PBCCH_IND *mphp_ncell_pbcch_ind +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_ncell_pbcch_ind ( T_MPHP_NCELL_PBCCH_IND *mphp_ncell_pbcch_ind) +{ + TRACE_ISIG( "sig_gfp_psi_ncell_pbcch_ind" ); + /* Not needed */ + PFREE(mphp_ncell_pbcch_ind); +} /* sig_gfp_psi_ncell_pbcch_ind() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_gfp_psi_save_persistence_level ++------------------------------------------------------------------------------ +| Description : Handles +| +| Parameters : T_pers_lev *pers_lev +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_gfp_psi_save_persistence_level( T_pers_lev *pers_lev ) +{ + TRACE_ISIG( "sig_gfp_psi_save_persistence_level" ); + + switch( GET_STATE( PSI ) ) + { + case PSI_IDLE: + case PSI_TRANSFER: + case PSI_SUSPENDED: + case PSI_BCCH_IDLE: + case PSI_BCCH_TRANSFER: + grr_save_persistence_level(pers_lev); + break; + default: + TRACE_ERROR( "SIG_GFP_PSI_SAVE_PERSISTENCE_LEVEL unexpected" ); + break; + } + +} /* sig_gfp_psi_save_persistence_level() */ + +/* ++------------------------------------------------------------------------------ +| Function : sig_ctrl_psi_access_disabled ++------------------------------------------------------------------------------ +| Description : Handles the internal signal SIG_CTRL_PSI_ACCESS_DISABLED +| +| Parameters : void +| ++------------------------------------------------------------------------------ +*/ +GLOBAL void sig_ctrl_psi_access_disabled ( T_PSI_DISABLE_CAUSE dc ) +{ + TRACE_ISIG( "sig_ctrl_psi_access_disabled" ); + + switch( dc ) + { + case PSI_DC_OTHER: + psc_db->acq_type = COMPLETE; + + psi_start_10sec( ); + break; + + case PSI_DC_READ_PSI: + psi_complete_acq(COMPLETE); + psi_start_10sec(); + break; + } +} /* sig_ctrl_psi_access_disabled() */