comparison src/g23m-gprs/grr/grr_psis.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
comparison
equal deleted inserted replaced
0:b6a5e36de839 1:d393cd9bb723
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GPRS (8441)
4 | Modul : GRR
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This module implements signal handler functions for service
18 | PSI of entity GRR.
19 +-----------------------------------------------------------------------------
20 */
21
22 #ifndef GRR_PSIS_C
23 #define GRR_PSIS_C
24 #endif
25
26 #define ENTITY_GRR
27
28 /*==== INCLUDES =============================================================*/
29
30 #include "typedefs.h" /* to get Condat data types */
31 #include <string.h>
32
33 #include "vsi.h" /* to get a lot of macros */
34 #include "macdef.h"
35 #include "gprs.h"
36 #include "gsm.h" /* to get a lot of macros */
37 #include "ccdapi.h" /* to get CCD API */
38 #include "cnf_grr.h" /* to get cnf-definitions */
39 #include "mon_grr.h" /* to get mon-definitions */
40 #include "prim.h" /* to get the definitions of used SAP and directions */
41 #include "message.h"
42 #include "grr.h" /* to get the global entity definitions */
43
44 #include "grr_f.h" /* To use global functions*/
45
46 #include "grr_psif.h" /* */
47
48 #include "grr_ctrls.h" /* */
49
50 #include "grr_psis.h" /* */
51
52 #include <stdio.h>
53
54 /*==== CONST ================================================================*/
55
56 /*==== LOCAL VARS ===========================================================*/
57
58 /*==== PRIVATE FUNCTIONS ====================================================*/
59
60 /*==== PUBLIC FUNCTIONS =====================================================*/
61
62
63 /*
64 +------------------------------------------------------------------------------
65 | Function : sig_ctrl_psi_si13_received
66 +------------------------------------------------------------------------------
67 | Description : Handles the internal signal SIG_CTRL_PSI_SI13_RECEIVED
68 |
69 | Parameters : T_RRGRR_SI13_IND *rrgrr_si13_ind
70 |
71 +------------------------------------------------------------------------------
72 */
73 GLOBAL void sig_ctrl_psi_si13_received ( T_RRGRR_GPRS_SI13_IND *rrgrr_si13_ind,
74 BOOL ba_bcch_changed )
75 {
76 MCAST(si13,D_SYS_INFO_13);
77 UBYTE in_state = GET_STATE( PSI );
78 UBYTE pb, ab_type;
79 TRACE_ISIG( "sig_ctrl_psi_si13_received" );
80
81 #ifndef _TARGET_
82
83 switch(psc_db->acq_type)
84 {
85 case NONE:
86 /*
87 * SI13 was not requested
88 */
89 TRACE_ERROR("SI13 not requested!");
90 return;
91 }
92
93 #endif
94
95 pb = psc_db->g_pwr_par.pb;
96 ab_type = psc_db->gprs_cell_opt.ab_type;
97
98 switch( in_state )
99 {
100 case PSI_NULL:
101 grr_data->psi.is_start_of_10_sec_allowed = TRUE;
102 psi_start_60sec();
103 /*
104 * This is the first SI13 message received by the service PSI, except in
105 * case of having SI13 without rest octets in the former SI13 message
106 */
107 switch(psi_process_si13(si13))
108 {
109 case SI13_OK:
110 SET_STATE( PSI, PSI_BCCH_IDLE );
111 TRACE_EVENT("NULL: BCCH present");
112 psi_is_access_class_changed();
113 sig_psi_ctrl_si13_processed();
114 /*
115 * Stop and restart 60 sec. timer
116 */
117 psi_stop_60sec ( TRUE );
118 psi_start_30sec();
119 /*
120 * Check acq state of SI messages
121 */
122 switch(psi_acq_state_of_si(rrgrr_si13_ind->si_states))
123 {
124 case ACQ_COMP_OK:
125 /*
126 * packet access enabled
127 */
128 psi_send_access_enable_if_needed();
129 psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/
130 /* BCCH reading is automatically stopped by RR/ALR */
131
132 /*stop the timer 3172 timer if it is already running in old cell*/
133 if(grr_t_status( T3172_1 ) > 0)
134 {
135 vsi_t_stop(GRR_handle,T3172_1);
136 }
137 break;
138 case ACQ_RUNNING:
139 sig_psi_ctrl_read_si( COMPLETE_SI );
140 psc_db->acq_type = COMPLETE;
141 break;
142 default:
143 TRACE_ERROR("Unexpected acq state of SI in PSI_NULL");
144 break;
145 }
146 break;/* switch SI13_OK */
147 case SI13_REREAD:
148 /*
149 * Only in case of no rest octets
150 * Do not stop 60 sec. timer. Request new SI13
151 */
152 psc_db->acq_type = PARTIAL;
153 sig_psi_ctrl_read_si( UPDATE_SI13 );
154 break;
155 case SI13_COMPLETE_PSI:
156 /*
157 * SI13 contains PBCCH description. Start complete acq of PSI
158 */
159 SET_STATE( PSI, PSI_IDLE );
160 TRACE_EVENT("PBCCH present");
161 psi_update_data_to_request(INIT_NEEDED);
162 sig_psi_ctrl_si13_processed();
163 psi_complete_acq(COMPLETE);
164 psi_stop_60sec ( TRUE );
165 break;
166 default:
167 TRACE_ERROR("Unexpected SI13 return in PSI_NULL");
168 break;
169 }
170 break;
171 case PSI_BCCH_IDLE:
172 /*
173 * Reading periodical SI13 message or reread because of absence of SI13 rest octets
174 * or partial acq or complete acq because of change field in the former SI13 message
175 * or PCCCH was released and we reread SI13
176 */
177 grr_data->psi.is_start_of_10_sec_allowed = TRUE;
178 switch(psi_process_si13(si13))
179 {
180 case SI13_OK:
181 /*
182 * Stop and restart 60 sec. timer
183 */
184 psi_stop_60sec ( TRUE );
185 psi_stop_30sec ( TRUE );
186 if(psi_is_access_class_changed())
187 {
188 /*
189 * Implies the CTRL to send CELL_IND
190 */
191 sig_psi_ctrl_access_changed();
192 }
193
194 /*
195 * Check acq state of SI messages
196 */
197 switch(psi_acq_state_of_si(rrgrr_si13_ind->si_states))
198 {
199 case ACQ_PERIOD_OK:
200 psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/
201 /* BCCH reading is automatically stopped by RR/ALR */
202 break;
203 case ACQ_PART_OK:
204 psi_stop_10sec(); /* partial acquisition completed */
205 /*
206 * packet access enabled
207 */
208 psi_send_access_enable_if_needed();
209 psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/
210 /* BCCH reading is automatically stopped by RR/ALR */
211 break;
212 case ACQ_COMP_OK:
213 /*
214 * packet access enabled
215 */
216 psi_send_access_enable_if_needed();
217 psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/
218 /* BCCH reading is automatically stopped by RR/ALR */
219 break;
220 case ACQ_RUNNING:
221 break;
222 default:
223 TRACE_ERROR("Unexpected acq state of SI in PSI_BCCH_IDLE");
224 break;
225 }
226 sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed );
227 break;/* SI13_OK */
228 case SI13_REREAD:
229 /* Only in case of no rest octets
230 * Do not stop 60 sec. timer. Request new SI13
231 */
232 psi_stop_30sec ( TRUE );
233 psc_db->acq_type = PARTIAL;
234 sig_psi_ctrl_read_si( UPDATE_SI13 );
235 sig_psi_ctrl_meas_param_invalid_si13( );
236 break;
237 case SI13_PARTIAL_SI:
238 /*
239 * Partial acq has to be started
240 */
241 psi_stop_30sec ( TRUE );
242 sig_psi_ctrl_read_si(si13->si13_rest_oct.si13_info.si_cf);
243 psc_db->acq_type = PARTIAL;
244 psi_start_10sec();
245 sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed );
246 break;
247 case SI13_COMPLETE_SI:
248 psi_initiate_read_complete_si( );
249 sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed );
250 break;
251 case SI13_COMPLETE_PSI:
252 SET_STATE( PSI, PSI_NULL );
253 /* BCCH reading is automatically stopped by RR/ALR */
254 psi_initiate_pbcch_switching( PSI_DC_PBCCH_ESTABLISHED );
255 break;
256 default:
257 TRACE_ERROR("Unexpected SI13 return in PSI_BCCH_IDLE");
258 break;
259 }
260 break;
261 case PSI_BCCH_TRANSFER:
262 /*
263 * Reread SI13 because of PBCCH release indicated in PSI1
264 * or change/release of PBCCH description indicated in PSI13
265 * message. Both PSI13 and PSI1 are sent on PACCH
266 */
267 /*
268 * Read SI13. We probably were not able to read PSI13 in transfer mode within
269 * 30 seconds, so we requested SI13.
270 */
271 grr_data->psi.is_start_of_10_sec_allowed = FALSE;
272 switch(psi_process_si13(si13))
273 {
274 case SI13_OK:
275 /*
276 * Stop and restart 60 sec. timer
277 * The MS may continue its operation on transfer mode
278 */
279 psi_stop_60sec ( TRUE );
280 psi_stop_30sec ( TRUE );
281
282 if(psi_is_access_class_changed())
283 {
284 /*
285 * Implies the CTRL to send CELL_IND
286 */
287 sig_psi_ctrl_access_changed();
288 }
289
290 switch(psi_acq_state_of_si(rrgrr_si13_ind->si_states))
291 {
292 case ACQ_PERIOD_OK:
293 psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/
294 /* BCCH reading is automatically stopped by RR/ALR */
295 break;
296 case ACQ_PART_OK:
297 psi_stop_10sec(); /* partial acquisition completed */
298 psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/
299 /* BCCH reading is automatically stopped by RR/ALR */
300 break;
301 case ACQ_COMP_OK:
302 /*
303 * packet access enabled
304 */
305 psi_send_access_enable_if_needed();
306 psc_db->acq_type = NONE; /* e.g. wait 30 sec for reread SI13*/
307 /* BCCH reading is automatically stopped by RR/ALR */
308 break;
309 case ACQ_RUNNING:
310 break;
311 default:
312 TRACE_ERROR("Unexpected acq state of SI in PSI_BCCH_TRANSFER");
313 break;
314 }
315
316 if( ab_type NEQ psc_db->gprs_cell_opt.ab_type OR
317 pb NEQ psc_db->g_pwr_par.pb )
318 {
319 grr_update_pacch();
320 }
321
322 sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed );
323 break;
324 case SI13_REREAD:
325 /*
326 * Only in case of no rest octets
327 * Do not stop 60 sec. timer. Request new SI13
328 */
329 psi_stop_30sec ( TRUE );
330 psc_db->acq_type = PARTIAL;
331 sig_psi_ctrl_read_si( UPDATE_SI13 );
332 sig_psi_ctrl_meas_param_invalid_si13( );
333 break;
334
335 case SI13_PARTIAL_SI:
336 /*
337 * Partial acq has to be started
338 */
339 psi_stop_30sec ( TRUE );
340 sig_psi_ctrl_read_si(si13->si13_rest_oct.si13_info.si_cf);
341 psc_db->acq_type = PARTIAL;
342 psi_start_10sec();
343 sig_psi_ctrl_meas_param_valid_si13( ba_bcch_changed );
344 TRACE_EVENT ("SI 13 with partial SI");
345 break;
346
347 case SI13_COMPLETE_SI:
348 psc_db->acq_type =COMPLETE;
349 sig_psi_ctrl_read_si( COMPLETE_SI);
350 TRACE_EVENT ("SI 13 with complete SI");
351 break;
352
353 case SI13_COMPLETE_PSI:
354 SET_STATE( PSI, PSI_NULL );
355 /* BCCH reading is automatically stopped by RR/ALR */
356 psi_initiate_pbcch_switching( PSI_DC_PBCCH_ESTABLISHED );
357 break;
358 default:
359 TRACE_ERROR("SIG_CTRL_PSI_SI13_RECEIVED: unexpected return value of type T_SI13_RET");
360 break;
361 }
362 break;
363 default:
364 TRACE_ERROR( "SIG_CTRL_PSI_SI13_RECEIVED unexpected" );
365 break;
366 }
367 } /* sig_ctrl_psi_si13_received() */
368
369
370
371 /*
372 +------------------------------------------------------------------------------
373 | Function : sig_ctrl_psi_pim
374 +------------------------------------------------------------------------------
375 | Description : Handles the internal signal SIG_CTRL_PSI_PIM
376 |
377 | Parameters : void
378 |
379 +------------------------------------------------------------------------------
380 */
381 GLOBAL void sig_ctrl_psi_pim ( void )
382 {
383 UBYTE state;
384 TRACE_ISIG( "sig_ctrl_psi_pim" );
385
386 state = GET_STATE( PSI );
387 switch( state )
388 {
389 case PSI_NULL:
390 case PSI_TRANSFER:
391 SET_STATE( PSI, PSI_IDLE );
392 /*lint -fallthrough*/
393 case PSI_IDLE:
394 /* Partial acquisition in this case is not taken care */
395 if(psc_db->acq_type EQ PERIODICAL_PSI1_READING)
396 {
397 TRACE_EVENT("Trigger PSI1 : Packet->Idle");
398 psi_receive_psi(READ_PSI1_IN_PSI1_REPEAT_PERIODS);
399 }
400 break;
401 case PSI_BCCH_TRANSFER:
402 SET_STATE( PSI, PSI_BCCH_IDLE );
403
404 /*lint -fallthrough*/
405
406 case PSI_BCCH_IDLE:
407 if(psc_db->acq_type EQ PERIODICAL_SI13_READING)
408 {
409 sig_psi_ctrl_read_si( UPDATE_SI13 );
410 }
411 break;
412 default:
413 TRACE_EVENT_P1("PSI_PIM PSI: %d",state);
414 break;
415 }
416 } /* sig_ctrl_psi_pim() */
417
418
419 /*
420 +------------------------------------------------------------------------------
421 | Function : sig_ctrl_psi_pam
422 +------------------------------------------------------------------------------
423 | Description : Handles the internal signal SIG_CTRL_PSI_PAM
424 |
425 | Parameters : void
426 |
427 +------------------------------------------------------------------------------
428 */
429 GLOBAL void sig_ctrl_psi_pam ( void )
430 {
431 UBYTE state;
432 TRACE_ISIG( "sig_ctrl_psi_pam" );
433
434 state = GET_STATE( PSI );
435 switch( state )
436 {
437 case PSI_IDLE:
438 /* PBCCH reading process is running, we have to stop it*/
439 if (psc_db->acq_type EQ PERIODICAL_PSI1_READING)
440 {
441 /* When entering Idle go for PSI1 acquisition
442 * acq_type is changed to PERIODICAL_PSI1_READING */
443 psi_stop_psi_reading(PERIODICAL_PSI1_READING);
444 }
445 else if (psc_db->acq_type NEQ NONE)
446 {
447 /* Limitation: partial acquisition of other PSIs not taken care */
448 psi_stop_psi_reading(NONE);
449 }
450 break;
451 case PSI_BCCH_IDLE:
452 case PSI_BCCH_TRANSFER:
453 /* BCCH reading is automatically stopped by RR/ALR */
454 break;
455 default:
456 TRACE_EVENT_P1("PSI_PAM PSI: %d",state);
457 break;
458 }
459 } /* sig_ctrl_psi_pam() */
460
461 /*
462 +------------------------------------------------------------------------------
463 | Function : sig_ctrl_psi_ptm
464 +------------------------------------------------------------------------------
465 | Description : Handles the internal signal SIG_CTRL_PSI_PTM
466 |
467 | Parameters : void
468 |
469 +------------------------------------------------------------------------------
470 */
471 GLOBAL void sig_ctrl_psi_ptm ( void )
472 {
473 UBYTE state;
474
475 TRACE_ISIG( "sig_ctrl_psi_ptm" );
476
477 state = GET_STATE( PSI ) ;
478 switch( state )
479 {
480 case PSI_IDLE:
481 SET_STATE( PSI, PSI_TRANSFER );
482 /* acquisition has been running, so we have to stop this acq.*/
483 if (psc_db->acq_type EQ PERIODICAL_PSI1_READING)
484 {
485 /* When entering Idle go for PSI1 acquisition
486 * acq_type is changed to PERIODICAL_PSI1_READING */
487 psi_stop_psi_reading(PERIODICAL_PSI1_READING);
488 }
489 else if (psc_db->acq_type NEQ NONE)
490 {
491 /* Limitation: partial acquisition of other PSIs not taken care */
492 psi_stop_psi_reading(NONE);
493 }
494
495 if(psc_db->send_psi_status AND psc_db->psi1_params.psi_status_supported)
496 {
497 /* MS should acquire PSI messages; we have to send PACKET PSI STATUS message*/
498 psi_send_psi_status();
499 }
500 /* PSI STATUS*/
501 break;
502 case PSI_NULL:
503 case PSI_BCCH_IDLE:
504 SET_STATE( PSI, PSI_BCCH_TRANSFER );
505 if(psc_db->acq_type EQ PERIODICAL_SI13_READING )
506 {
507 /* SI reading has been running and therefore it has to be restarted. */
508 sig_psi_ctrl_read_si( UPDATE_SI13 );
509 }
510 break;
511 default:
512 /* TRACE_EVENT_P1( "PSI_PTM PSI: %d",state);*/
513 break;
514 }
515 } /* sig_ctrl_psi_ptm() */
516
517
518
519 /*
520 +------------------------------------------------------------------------------
521 | Function : sig_ctrl_psi_suspend
522 +------------------------------------------------------------------------------
523 | Description : Handles the internal signal SIG_CTRL_PSI_SUSPEND
524 |
525 | Parameters : void
526 |
527 +------------------------------------------------------------------------------
528 */
529 GLOBAL void sig_ctrl_psi_suspend ( void )
530 {
531 TRACE_ISIG( "sig_ctrl_psi_suspend" );
532
533 SET_STATE(PSI, PSI_SUSPENDED);
534
535 if(psc_db->acq_type NEQ NONE) /* acquisition has been running, so we have to stop this acq.*/
536 {
537 psi_stop_psi_reading(NONE);
538 }
539 psi_stop_timer();
540
541 } /* sig_ctrl_psi_suspend() */
542
543
544
545 /*
546 +------------------------------------------------------------------------------
547 | Function : sig_ctrl_psi_resumpt
548 +------------------------------------------------------------------------------
549 | Description : Handles the internal signal SIG_CTRL_PSI_RESUMPT
550 |
551 | Parameters : void
552 |
553 +------------------------------------------------------------------------------
554 */
555 GLOBAL void sig_ctrl_psi_resumpt ( void )
556 {
557 TRACE_ISIG( "sig_ctrl_psi_resumpt" );
558
559 switch( GET_STATE( PSI ) )
560 {
561 case PSI_SUSPENDED:
562 if(grr_is_pbcch_present())
563 {
564 SET_STATE(PSI, PSI_IDLE);
565 }
566 else
567 {
568 SET_STATE(PSI, PSI_BCCH_IDLE);
569 }
570 /*
571 * start timer 30, 60 sec. to be able to read PSI1 or SI13
572 */
573 psi_start_60sec();
574 psi_start_30sec();
575 break;
576 default:
577 TRACE_ERROR( "SIG_CTRL_PSI_RESUMPT unexpected" );
578 break;
579 }
580 } /* sig_ctrl_psi_resumpt() */
581
582
583
584 /*
585 +------------------------------------------------------------------------------
586 | Function : sig_ctrl_psi_stop
587 +------------------------------------------------------------------------------
588 | Description : Handles the internal signal SIG_CTRL_PSI_STOP
589 |
590 | Parameters : void
591 |
592 +------------------------------------------------------------------------------
593 */
594 GLOBAL void sig_ctrl_psi_stop ( void)
595 {
596 TRACE_ISIG( "sig_ctrl_psi_stop" );
597
598 switch( GET_STATE( PSI ) )
599 {
600 case PSI_IDLE:
601 case PSI_TRANSFER:
602 SET_STATE( PSI, PSI_NULL );
603 if(psc_db->acq_type NEQ NONE) /* acquisition has been running, so we have to stop this acq.*/
604 {
605 TRACE_EVENT("Acq. running: send MPHP_SCELL_PBCCH_STOP_REQ");
606 psi_stop_psi_reading(NONE);
607 }
608 psi_stop_timer();
609 psi_init_params();
610 break;
611 case PSI_SUSPENDED:
612 SET_STATE( PSI, PSI_NULL );
613 psi_stop_timer();
614 psi_init_params();
615 break;
616 case PSI_BCCH_IDLE:
617 case PSI_BCCH_TRANSFER:
618 SET_STATE( PSI, PSI_NULL );
619 psi_stop_timer();
620 if(psc_db->acq_type NEQ COMPLETE) /* acquisition has been running, so we have to stop this acq.*/
621 {
622 TRACE_EVENT("Acq. running: send STOP SI READING");
623 psc_db->acq_type = COMPLETE;
624 /* BCCH reading is automatically stopped by RR/ALR */
625 }
626 psi_reset_si_entries();
627 break;
628 default:
629 TRACE_EVENT( "PSI stopped/not running" );
630 break;
631 }
632 } /* sig_ctrl_psi_stop() */
633
634
635 /*
636 +------------------------------------------------------------------------------
637 | Function : sig_ctrl_psi_sync_ok
638 +------------------------------------------------------------------------------
639 | Description : Handles the internal signal SIG_CTRL_PSI_SYNC_OK
640 | PSI can start PBCCH reading process
641 |
642 | Parameters : void
643 |
644 +------------------------------------------------------------------------------
645 */
646 GLOBAL void sig_ctrl_psi_sync_ok ( void)
647 {
648 TRACE_ISIG( "sig_ctrl_psi_sync_ok" );
649 switch( GET_STATE( PSI ) )
650 {
651 case PSI_IDLE:
652 psi_complete_acq(COMPLETE);
653 break;
654 default:
655 TRACE_ERROR( "SIG_CTRL_PSI_SYNC_OK unexpected" );
656 break;
657 }
658 } /* sig_ctrl_psi_sync_ok() */
659
660 /*
661 +------------------------------------------------------------------------------
662 | Function : SIG_CTRL_PSI_READ_FULL_PSI_IN_NEW_CELL
663 +------------------------------------------------------------------------------
664 | Description : Handles the internal signal SIG_CTRL_PSI_READ_FULL_PSI_IN_NEW_CELL
665 | PSI can starts PBCCH reading process in the possible new cell
666 |
667 | Parameters : void
668 |
669 +------------------------------------------------------------------------------
670 */
671 GLOBAL void sig_ctrl_psi_read_full_psi_in_new_cell ( void)
672 {
673 TRACE_ISIG( "sig_ctrl_psi_read_full_psi_in_new_cell" );
674 switch( GET_STATE( PSI ) )
675 {
676 case PSI_NULL:
677 SET_STATE(PSI, PSI_IDLE);
678
679 /*lint -fallthrough*/
680
681 case PSI_IDLE:
682 case PSI_TRANSFER:
683 case PSI_SUSPENDED:
684 case PSI_BCCH_IDLE:
685 case PSI_BCCH_TRANSFER:
686
687 psc_db->state_of_PSI[PSI13].state = RECEIPT_OK; /* we do not need to read PSI13 again*/
688 /*
689 * read PSI: update it with PBCCH desc
690 */
691 psi_update_data_to_request(INIT_NOT_NEEDED);
692
693 psi_complete_acq(FULL_PSI_IN_NEW_CELL);
694 break;
695 default:
696 TRACE_ERROR( "SIG_CTRL_PSI_READ_FULL_PSI_IN_NEW_CELL unexpected" );
697 break;
698 }
699 } /* sig_ctrl_psi_read_full_psi_in_new_cell() */
700
701 /*
702 +------------------------------------------------------------------------------
703 | Function : SIG_CTRL_PSI_REL_STATE
704 +------------------------------------------------------------------------------
705 | Description : Handles the internal signal sig_ctrl_psi_rel_state
706 | Check whether we have to start PBCCH request or not
707 |
708 | Parameters : T_RELEASE_STATE rel_state
709 |
710 +------------------------------------------------------------------------------
711 */
712 GLOBAL void sig_ctrl_psi_rel_state(T_RELEASE_STATE rel_state)
713 {
714 TRACE_ISIG("sig_ctrl_psi_rel_state");
715
716 if(rel_state EQ REL_PERFORMED)
717 {
718 grr_data->psi.is_pbcch_req_allowed = TRUE;
719 if(grr_data->psi.is_pbcch_req_needed)
720 {
721 TRACE_EVENT("Release of TBF, stop of RR task, etc. performed.There is a waiting PBCCH req. We can start it now");
722 grr_data->psi.is_pbcch_req_needed =FALSE;
723 {
724 PALLOC(mphp_scell_pbcch_req, MPHP_SCELL_PBCCH_REQ);
725 psi_prepare_scell_pbcch_req(mphp_scell_pbcch_req, grr_data->psi.reading_type);
726 PSEND(hCommL1,mphp_scell_pbcch_req);
727 }
728 }
729 /* else
730 {
731 TRACE_EVENT("Release performed.There is NO waiting PBCCH req.");
732 }
733 */
734 }
735 else
736 {
737 /*
738 * If a PBCCH req was running L1 stops automatically the reading procedure
739 * we have to set the grr_data->psi.is_pbcch_req_needed to TRUE to continue
740 * after performing release
741 *
742 * if(psc_db->acq_type NEQ NONE)
743 * {
744 * grr_data->psi.is_pbcch_req_needed = TRUE;
745 * }
746 *
747 * TRACE_EVENT("We may have to stop running PBCCH request.PBCCH req. NOT allowed");
748 */
749 grr_data->psi.is_pbcch_req_allowed = FALSE;
750 }
751
752 }
753
754
755 /*
756 +------------------------------------------------------------------------------
757 | Function : sig_ctrl_psi_resumpt_cc
758 +------------------------------------------------------------------------------
759 | Description : Handles the internal signal SIG_CTRL_PSI_RESUMPT_CC
760 |
761 | Parameters : void
762 |
763 +------------------------------------------------------------------------------
764 */
765 GLOBAL void sig_ctrl_psi_resumpt_cc ( void )
766 {
767 MCAST(si13,D_SYS_INFO_13);
768
769 TRACE_ISIG( "sig_ctrl_psi_resumpt_cc" );
770 /* because get_state(PSI) makes no difference of the psi status
771 *between the old and new cell, it must be directly from the datadase */
772
773 grr_set_pbcch( si13->si13_rest_oct.si13_info.v_pbcch_des );
774
775 if(( grr_t_status( T3176 ) > 0 ) /* in case of packet cell change failure, SI13 should be processed */
776 AND
777 (psc_db->psi_assigned_data.state EQ PSI_SUSPENDED))
778 {
779 if (grr_is_pbcch_present())
780 {
781 psc_db->psi_assigned_data.state = PSI_IDLE;
782 psi_start_60sec();
783 psi_start_30sec();
784 }
785 else
786 {
787 psc_db->psi_assigned_data.state = PSI_BCCH_IDLE;
788 }
789 }
790 } /* sig_ctrl_psi_resumpt_cc() */
791
792
793
794 /*
795 +------------------------------------------------------------------------------
796 | Function : sig_gfp_psi_1_ptm
797 +------------------------------------------------------------------------------
798 | Description : Handles
799 |
800 | Parameters :
801 |
802 +------------------------------------------------------------------------------
803 */
804 GLOBAL void sig_gfp_psi_1_ptm ( void )
805 {
806 MCAST(psi1, PSI_1);
807
808 TRACE_ISIG( "sig_gfp_psi_1_ptm" );
809
810
811 switch( GET_STATE( PSI ) )
812 {
813 case PSI_TRANSFER:
814 psi_stop_60sec(TRUE);
815 psi_stop_30sec(TRUE);
816 {
817 UBYTE pb, ab_type;
818
819 pb = psc_db->g_pwr_par.pb;
820 ab_type = psc_db->gprs_cell_opt.ab_type;
821
822 psi_handle_psi1(psi1);
823
824 if(
825 (ab_type NEQ psc_db->gprs_cell_opt.ab_type)
826 OR
827 (pb NEQ psc_db->g_pwr_par.pb)
828 )
829 {
830 /*
831 * update PACCH parameters
832 */
833 grr_update_pacch();
834 }
835 }
836 break;
837 case PSI_BCCH_TRANSFER:
838 psi_handle_psi1(psi1);
839 break;
840
841 default:
842 TRACE_ERROR( "SIG_GFP_PSI_1_PTM unexpected" );
843 break;
844 }
845 } /* sig_gfp_psi_1_ptm() */
846
847 /*
848 +------------------------------------------------------------------------------
849 | Function : sig_gfp_psi_2_ptm
850 +------------------------------------------------------------------------------
851 | Description : Handles
852 |
853 | Parameters : void
854 |
855 +------------------------------------------------------------------------------
856 */
857 GLOBAL void sig_gfp_psi_2_ptm (void)
858 {
859 MCAST(psi2, PSI_2);
860
861 TRACE_ISIG( "sig_gfp_psi_2_ptm " );
862
863 switch( GET_STATE( PSI ) )
864 {
865 case PSI_TRANSFER:
866 psi_handle_psi2(psi2);
867 break;
868 default:
869 TRACE_ERROR( "SIG_GFP_PSI_2_PTM unexpected" );
870 break;
871 }
872 } /* sig_gfp_psi_2_ptm () */
873
874
875
876 /*
877 +------------------------------------------------------------------------------
878 | Function : sig_gfp_psi_3_ptm
879 +------------------------------------------------------------------------------
880 | Description : Handles
881 |
882 | Parameters :
883 |
884 +------------------------------------------------------------------------------
885 */
886 GLOBAL void sig_gfp_psi_3_ptm (void)
887 {
888 MCAST(psi3, PSI_3);
889
890 TRACE_ISIG( "sig_gfp_psi_3_ptm " );
891
892 switch( GET_STATE( PSI ) )
893 {
894 case PSI_TRANSFER:
895 psi_handle_psi3(psi3);
896 break;
897 default:
898 TRACE_ERROR( "SIG_GFP_PSI_3_PTM unexpected" );
899 break;
900 }
901 } /* sig_gfp_psi_3_ptm () */
902
903
904
905
906 /*
907 +------------------------------------------------------------------------------
908 | Function : sig_gfp_psi_3_bis_ptm
909 +------------------------------------------------------------------------------
910 | Description : Handles
911 |
912 | Parameters :
913 |
914 +------------------------------------------------------------------------------
915 */
916 GLOBAL void sig_gfp_psi_3_bis_ptm ( void )
917 {
918 MCAST(psi3bis, PSI_3_BIS);
919
920 TRACE_ISIG( "sig_gfp_psi_3_bis_ptm " );
921
922
923 switch( GET_STATE( PSI ) )
924 {
925 case PSI_TRANSFER:
926 psi_handle_psi3bis(psi3bis);
927 break;
928 default:
929 TRACE_ERROR( "SIG_GFP_PSI_3_BIS_PTM unexpected" );
930 break;
931 }
932 } /* sig_gfp_psi_3_bis_ptm () */
933
934
935 #if defined (REL99) AND defined (TI_PS_FF_EMR)
936 /*
937 +------------------------------------------------------------------------------
938 | Function : sig_gfp_psi_3_ter_ptm
939 +------------------------------------------------------------------------------
940 | Description : Handles the internal signal SIG_GFP_PSI_3_TER_PTM
941 |
942 | Parameters :
943 |
944 +------------------------------------------------------------------------------
945 */
946 GLOBAL void sig_gfp_psi_3_ter_ptm ( void )
947 {
948 MCAST(psi3ter, PSI_3_TER);
949
950 TRACE_ISIG( "sig_gfp_psi_3_ter_ptm " );
951
952
953 switch( GET_STATE( PSI ) )
954 {
955 case PSI_TRANSFER:
956 psi_handle_psi3ter(psi3ter);
957 break;
958 default:
959 TRACE_ERROR( "SIG_GFP_PSI_3_TER_PTM unexpected" );
960 break;
961 }
962 } /* sig_gfp_psi_3_ter_ptm () */
963 #endif
964
965 /*
966 +------------------------------------------------------------------------------
967 | Function : sig_gff_psi_4
968 +------------------------------------------------------------------------------
969 | Description : Handles
970 |
971 | Parameters :
972 |
973 +------------------------------------------------------------------------------
974 */
975 GLOBAL void sig_gfp_psi_4_ptm ( void )
976 {
977 MCAST(psi4, PSI_4);
978
979 TRACE_ISIG( "sig_gfp_psi_4_ptm " );
980
981 switch( GET_STATE( PSI ) )
982 {
983 case PSI_TRANSFER:
984 psi_handle_psi4(psi4);
985 break;
986 default:
987 TRACE_ERROR( "SIG_GFP_PSI_4_PTM unexpected" );
988 break;
989 }
990 } /* sig_gfp_psi_4_ptm() */
991
992 #ifdef REL99
993 /*
994 +------------------------------------------------------------------------------
995 | Function : sig_gfp_psi_8_ptm
996 +------------------------------------------------------------------------------
997 | Description : Handles psi 8 messsage received on PACCH.
998 |
999 | Parameters :
1000 |
1001 +------------------------------------------------------------------------------
1002 */
1003 GLOBAL void sig_gfp_psi_8_ptm ( void )
1004 {
1005 MCAST(psi8, PSI_8);
1006
1007 TRACE_ISIG( "sig_gfp_psi_8_ptm " );
1008
1009 switch( GET_STATE( PSI ) )
1010 {
1011 case PSI_TRANSFER:
1012 psi_handle_psi8(psi8);
1013 break;
1014 default:
1015 TRACE_ERROR( "SIG_GFP_PSI_8_PTM unexpected" );
1016 break;
1017 }
1018 } /* sig_gfp_psi_8_ptm() */
1019 #endif
1020
1021 /*
1022 +------------------------------------------------------------------------------
1023 | Function : sig_gfp_psi_13_ptm
1024 +------------------------------------------------------------------------------
1025 | Description : Handles
1026 |
1027 | Parameters :
1028 |
1029 +------------------------------------------------------------------------------
1030 */
1031 GLOBAL void sig_gfp_psi_13_ptm(void)
1032 {
1033 MCAST(psi13,PSI_13);
1034
1035 UBYTE pb, ab_type;
1036
1037 TRACE_ISIG( "sig_gfp_psi_13_ptm" );
1038
1039 grr_data->psi.is_start_of_10_sec_allowed = TRUE;
1040
1041 pb = psc_db->g_pwr_par.pb;
1042 ab_type = psc_db->gprs_cell_opt.ab_type;
1043
1044 switch( GET_STATE( PSI ) )
1045 {
1046 case PSI_BCCH_TRANSFER:
1047 case PSI_TRANSFER:
1048 switch(psi_process_psi13(psi13))
1049 {
1050 case PSI13_OK:
1051 psi_stop_60sec(TRUE);
1052 psi_stop_30sec(TRUE);
1053
1054 if( ab_type NEQ psc_db->gprs_cell_opt.ab_type OR
1055 pb NEQ psc_db->g_pwr_par.pb )
1056 {
1057 grr_update_pacch();
1058 }
1059 sig_psi_ctrl_meas_param_valid_si13( FALSE );
1060 break;
1061 case PSI13_PARTIAL_SI:
1062 psi_stop_60sec(TRUE);
1063 psi_stop_30sec(TRUE);
1064 sig_psi_ctrl_read_si(psi13->si_change_ma);
1065 psc_db->acq_type = PARTIAL;
1066 psi_start_10sec();
1067 sig_psi_ctrl_meas_param_valid_si13( FALSE );
1068 break;
1069 case PSI13_COMPLETE_SI:
1070 psi_stop_60sec(TRUE);
1071 psi_stop_30sec(TRUE);
1072 psc_db->acq_type =COMPLETE;
1073 sig_psi_ctrl_read_si( COMPLETE_SI);
1074 psi_start_10sec();
1075 sig_psi_ctrl_meas_param_valid_si13( FALSE );
1076 TRACE_EVENT ("PSI 13 with complete SI");
1077 //psi_initiate_read_complete_si( );
1078 //sig_psi_ctrl_meas_param_valid_si13( FALSE );
1079 break;
1080 case PSI13_COMPLETE_PSI:
1081 SET_STATE( PSI, PSI_IDLE );
1082 psi_initiate_read_complete_psi( INIT_NEEDED );
1083 break;
1084 case PSI13_PBCCH_RELEASED:
1085 SET_STATE( PSI, PSI_NULL );
1086 psi_initiate_pbcch_switching( PSI_DC_PBCCH_RELEASED );
1087 break;
1088 case PSI13_PBCCH_ESTABLISHED:
1089 SET_STATE( PSI, PSI_NULL );
1090 psi_initiate_pbcch_switching( PSI_DC_PBCCH_ESTABLISHED );
1091 break;
1092 default:
1093 TRACE_ERROR("SIG_GFP_PSI_13_PTM: unexpected return value of type T_PSI13_RET");
1094 break;
1095 }
1096 break;
1097 default:
1098 TRACE_ERROR( "SIG_GFP_PSI_13_PTM unexpected" );
1099 break;
1100 }
1101 } /* sig_gfp_psi_13_ptm() */
1102
1103
1104
1105 /*
1106 +------------------------------------------------------------------------------
1107 | Function : sig_gfp_psi_1
1108 +------------------------------------------------------------------------------
1109 | Description : Handles
1110 |
1111 | Parameters :
1112 |
1113 +------------------------------------------------------------------------------
1114 */
1115 GLOBAL void sig_gfp_psi_1 ( void )
1116 {
1117 MCAST(psi1, PSI_1);
1118
1119 ACQ_TYPE old_acq_type = psc_db->acq_type;
1120 T_DB_MODE old_db_mode = grr_get_db_mode( );
1121
1122 TRACE_ISIG( "sig_gfp_psi_1" );
1123
1124 switch(psc_db->acq_type)
1125 {
1126 case FULL_PSI_IN_NEW_CELL:
1127 if( old_db_mode NEQ DB_MODE_CC_REQ )
1128 {
1129 grr_set_db_ptr( DB_MODE_SWAP );
1130 }
1131 break;
1132 }
1133
1134 switch( GET_STATE( PSI ) )
1135 {
1136 case PSI_IDLE:
1137 /*
1138 * Handle 60, 30, 10 sec. timer within psi_handle_psi1
1139 */
1140 grr_data->psi.is_start_of_10_sec_allowed = FALSE;
1141 psi_handle_psi1(psi1);
1142 break;
1143 case PSI_TRANSFER:
1144 /*
1145 * Handle 60, 30, 10 sec. timer within psi_handle_psi1
1146 */
1147 grr_data->psi.is_start_of_10_sec_allowed = TRUE;
1148 {
1149 UBYTE pb, ab_type;
1150
1151 pb = psc_db->g_pwr_par.pb;
1152 ab_type = psc_db->gprs_cell_opt.ab_type;
1153
1154 psi_handle_psi1(psi1);
1155
1156 if(
1157 (ab_type NEQ psc_db->gprs_cell_opt.ab_type)
1158 OR
1159 (pb NEQ psc_db->g_pwr_par.pb)
1160 )
1161 {
1162 /*
1163 * update PACCH parameters
1164 */
1165 grr_update_pacch();
1166 }
1167 }
1168 break;
1169 default:
1170 TRACE_ERROR( "SIG_GFP_PSI_1 unexpected" );
1171 break;
1172 }
1173 switch(old_acq_type)
1174 {
1175 case FULL_PSI_IN_NEW_CELL:
1176 if( old_db_mode NEQ DB_MODE_CC_REQ )
1177 {
1178 grr_set_db_ptr( DB_MODE_SWAP );
1179 }
1180 break;
1181 default:
1182 break;
1183 }
1184
1185 } /* sig_gfp_psi_1() */
1186
1187 /*
1188 +------------------------------------------------------------------------------
1189 | Function : sig_gfp_psi_2
1190 +------------------------------------------------------------------------------
1191 | Description : Handles
1192 |
1193 | Parameters : UBYTE received_in: relative position to B0
1194 |
1195 +------------------------------------------------------------------------------
1196 */
1197 GLOBAL void sig_gfp_psi_2 (UBYTE rel_pos_i)
1198 {
1199 MCAST (psi2, PSI_2);
1200
1201 ACQ_TYPE old_acq_type = psc_db->acq_type;
1202 T_DB_MODE old_db_mode = grr_get_db_mode( );
1203
1204 TRACE_ISIG( "sig_gfp_psi_2" );
1205
1206 psi_store_rel_pos(grr_data->psi.psi2_pos, rel_pos_i, MAX_NR_OF_INSTANCES_OF_PSI2); /*MODIF*/
1207
1208 switch(psc_db->acq_type)
1209 {
1210 case NONE:
1211 case PERIODICAL_PSI1_READING:
1212 /*
1213 * PSI2 was not requested
1214 */
1215
1216 #ifdef _SIMULATION_
1217 TRACE_ERROR("PSI2 not requested!");
1218 #endif /* #ifdef _SIMULATION_ */
1219 return;
1220 case FULL_PSI_IN_NEW_CELL:
1221 if( old_db_mode NEQ DB_MODE_CC_REQ )
1222 {
1223 grr_set_db_ptr( DB_MODE_SWAP );
1224 }
1225 break;
1226 }
1227
1228 switch( GET_STATE( PSI ) )
1229 {
1230 case PSI_IDLE:
1231 case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/
1232 psi_handle_psi2(psi2);
1233 break;
1234 default:
1235 TRACE_ERROR( "SIG_GFP_PSI_2 unexpected" );
1236 break;
1237 }
1238
1239 switch(old_acq_type)
1240 {
1241 case FULL_PSI_IN_NEW_CELL:
1242 if( old_db_mode NEQ DB_MODE_CC_REQ )
1243 {
1244 grr_set_db_ptr( DB_MODE_SWAP );
1245 }
1246 break;
1247 default:
1248 break;
1249 }
1250
1251 } /* sig_gfp_psi_2() */
1252
1253 /*
1254 +------------------------------------------------------------------------------
1255 | Function : sig_gfp_psi_3
1256 +------------------------------------------------------------------------------
1257 | Description : Handles
1258 |
1259 | Parameters : UBYTE received_in: relative position to B0
1260 |
1261 +------------------------------------------------------------------------------
1262 */
1263 GLOBAL void sig_gfp_psi_3 (UBYTE rel_pos_i)
1264 {
1265 MCAST (psi3, PSI_3);
1266
1267 ACQ_TYPE old_acq_type = psc_db->acq_type;
1268 T_DB_MODE old_db_mode = grr_get_db_mode( );
1269
1270 TRACE_ISIG( "sig_gfp_psi_3" );
1271 #if defined (REL99) AND defined (TI_PS_FF_EMR)
1272 psi_store_rel_pos(grr_data->psi.psi3_set_pos,
1273 rel_pos_i,
1274 MAX_NR_OF_INSTANCES_OF_PSI3TER+
1275 MAX_NR_OF_INSTANCES_OF_PSI3BIS+MAX_NR_OF_INSTANCES_OF_PSI3); /*MODIF*/
1276 #else
1277 psi_store_rel_pos(grr_data->psi.psi3bis_pos,
1278 rel_pos_i,
1279 MAX_NR_OF_INSTANCES_OF_PSI3BIS+MAX_NR_OF_INSTANCES_OF_PSI3); /*MODIF*/
1280 #endif
1281
1282 switch(psc_db->acq_type)
1283 {
1284 case NONE:
1285 case PERIODICAL_PSI1_READING:
1286 /*
1287 * PSI3 was not requested
1288 */
1289 #ifdef _SIMULATION_
1290 TRACE_ERROR("PSI3 not requested!");
1291 #endif /* #ifdef _SIMULATION_ */
1292 return;
1293 case FULL_PSI_IN_NEW_CELL:
1294 if( old_db_mode NEQ DB_MODE_CC_REQ )
1295 {
1296 grr_set_db_ptr( DB_MODE_SWAP );
1297 }
1298 break;
1299 }
1300
1301 switch( GET_STATE( PSI ) )
1302 {
1303 case PSI_IDLE:
1304 case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/
1305 psi_handle_psi3(psi3);
1306 break;
1307 default:
1308 TRACE_ERROR( "SIG_GFP_PSI_3 unexpected" );
1309 break;
1310 }
1311
1312 switch(old_acq_type)
1313 {
1314 case FULL_PSI_IN_NEW_CELL:
1315 if( old_db_mode NEQ DB_MODE_CC_REQ )
1316 {
1317 grr_set_db_ptr( DB_MODE_SWAP );
1318 }
1319 break;
1320 default:
1321 break;
1322 }
1323
1324 } /* sig_gfp_psi_3() */
1325
1326 /*
1327 +------------------------------------------------------------------------------
1328 | Function : sig_gfp_psi_3_bis
1329 +------------------------------------------------------------------------------
1330 | Description : Handles
1331 |
1332 | Parameters : UBYTE received_in: relative position to B0
1333 |
1334 +------------------------------------------------------------------------------
1335 */
1336 GLOBAL void sig_gfp_psi_3_bis (UBYTE rel_pos_i)
1337 {
1338 MCAST(psi3bis, PSI_3_BIS);
1339
1340 ACQ_TYPE old_acq_type = psc_db->acq_type;
1341 T_DB_MODE old_db_mode = grr_get_db_mode( );
1342
1343 TRACE_ISIG( "sig_gfp_psi_3_bis" );
1344 #if defined (REL99) AND defined (TI_PS_FF_EMR)
1345 psi_store_rel_pos(grr_data->psi.psi3_set_pos,
1346 rel_pos_i,
1347 MAX_NR_OF_INSTANCES_OF_PSI3TER+
1348 MAX_NR_OF_INSTANCES_OF_PSI3BIS+MAX_NR_OF_INSTANCES_OF_PSI3); /*MODIF*/
1349 #else
1350 psi_store_rel_pos(grr_data->psi.psi3bis_pos,
1351 rel_pos_i,
1352 MAX_NR_OF_INSTANCES_OF_PSI3BIS+MAX_NR_OF_INSTANCES_OF_PSI3); /*MODIF*/
1353 #endif
1354
1355 switch(psc_db->acq_type)
1356 {
1357 case NONE:
1358 case PERIODICAL_PSI1_READING:
1359 /*
1360 * PSI3BIS was not requested
1361 */
1362 #ifdef _SIMULATION_
1363 TRACE_ERROR("PSI3BIS not requested!");
1364 #endif /* #ifdef _SIMULATION_ */
1365 return;
1366 case FULL_PSI_IN_NEW_CELL:
1367 if( old_db_mode NEQ DB_MODE_CC_REQ )
1368 {
1369 grr_set_db_ptr( DB_MODE_SWAP );
1370 }
1371 break;
1372 }
1373
1374 switch( GET_STATE( PSI ) )
1375 {
1376 case PSI_IDLE:
1377 case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/
1378 psi_handle_psi3bis(psi3bis);
1379 break;
1380 default:
1381 TRACE_ERROR( "SIG_GFP_PSI_3_BIS unexpected" );
1382 break;
1383 }
1384
1385 switch(old_acq_type)
1386 {
1387 case FULL_PSI_IN_NEW_CELL:
1388 if( old_db_mode NEQ DB_MODE_CC_REQ )
1389 {
1390 grr_set_db_ptr( DB_MODE_SWAP );
1391 }
1392 break;
1393 default:
1394 break;
1395 }
1396
1397 } /* sig_gfp_psi_3_bis() */
1398
1399
1400 #if defined (REL99) AND defined (TI_PS_FF_EMR)
1401 /*
1402 +------------------------------------------------------------------------------
1403 | Function : sig_gfp_psi_3_ter
1404 +------------------------------------------------------------------------------
1405 | Description : Handles the internal signal SIG_GFP_PSI_3_TER
1406 |
1407 | Parameters : UBYTE received_in: relative position to B0
1408 |
1409 +------------------------------------------------------------------------------
1410 */
1411 GLOBAL void sig_gfp_psi_3_ter (UBYTE rel_pos_i)
1412 {
1413 MCAST(psi3ter, PSI_3_TER);
1414
1415 ACQ_TYPE old_acq_type = psc_db->acq_type;
1416 T_DB_MODE old_db_mode = grr_get_db_mode( );
1417
1418 TRACE_ISIG( "sig_gfp_psi_3_ter" );
1419
1420 psi_store_rel_pos(grr_data->psi.psi3_set_pos,
1421 rel_pos_i,
1422 MAX_NR_OF_INSTANCES_OF_PSI3TER+MAX_NR_OF_INSTANCES_OF_PSI3BIS
1423 +MAX_NR_OF_INSTANCES_OF_PSI3);
1424
1425 switch(psc_db->acq_type)
1426 {
1427 case NONE:
1428 case PERIODICAL_PSI1_READING:
1429 /*
1430 * PSI3TER was not requested
1431 */
1432 #ifdef _SIMULATION_
1433 TRACE_ERROR("PSI3TER not requested!");
1434 #endif /* #ifdef _SIMULATION_ */
1435 return;
1436 case FULL_PSI_IN_NEW_CELL:
1437 if( old_db_mode NEQ DB_MODE_CC_REQ )
1438 {
1439 grr_set_db_ptr( DB_MODE_SWAP );
1440 }
1441 break;
1442 }
1443
1444 switch( GET_STATE( PSI ) )
1445 {
1446 case PSI_IDLE:
1447 case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/
1448 psi_handle_psi3ter(psi3ter);
1449 break;
1450 default:
1451 TRACE_ERROR( "SIG_GFP_PSI_3_TER unexpected" );
1452 break;
1453 }
1454
1455 switch(old_acq_type)
1456 {
1457 case FULL_PSI_IN_NEW_CELL:
1458 if( old_db_mode NEQ DB_MODE_CC_REQ )
1459 {
1460 grr_set_db_ptr( DB_MODE_SWAP );
1461 }
1462 break;
1463 default:
1464 break;
1465 }
1466
1467 } /* sig_gfp_psi_3_ter() */
1468 #endif
1469
1470 /*
1471 +------------------------------------------------------------------------------
1472 | Function : sig_gfp_psi_4
1473 +------------------------------------------------------------------------------
1474 | Description : Handles
1475 |
1476 | Parameters : UBYTE received_in: relative position to B0
1477 |
1478 +------------------------------------------------------------------------------
1479 */
1480 GLOBAL void sig_gfp_psi_4 ( UBYTE rel_pos_i)
1481 {
1482 MCAST(psi4, PSI_4);
1483
1484 ACQ_TYPE old_acq_type = psc_db->acq_type;
1485 T_DB_MODE old_db_mode = grr_get_db_mode( );
1486
1487 TRACE_ISIG( "sig_gfp_psi_4" );
1488
1489 psi_store_rel_pos(grr_data->psi.psi4_pos, rel_pos_i, MAX_NR_OF_INSTANCES_OF_PSI4);
1490
1491 switch(psc_db->acq_type)
1492 {
1493 case NONE:
1494 case PERIODICAL_PSI1_READING:
1495 /*
1496 * PSI4 was not requested
1497 */
1498 #ifdef _SIMULATION_
1499 TRACE_ERROR("PSI4 not requested!");
1500 #endif /* #ifdef _SIMULATION_ */
1501 return;
1502 case FULL_PSI_IN_NEW_CELL:
1503 if( old_db_mode NEQ DB_MODE_CC_REQ )
1504 {
1505 grr_set_db_ptr( DB_MODE_SWAP );
1506 }
1507 break;
1508 }
1509
1510 switch( GET_STATE( PSI ) )
1511 {
1512 case PSI_IDLE:
1513 case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/
1514 psi_handle_psi4(psi4);
1515 break;
1516 default:
1517 TRACE_ERROR( "SIG_GFP_PSI_4 unexpected" );
1518 break;
1519 }
1520
1521 switch(old_acq_type)
1522 {
1523 case FULL_PSI_IN_NEW_CELL:
1524 if( old_db_mode NEQ DB_MODE_CC_REQ )
1525 {
1526 grr_set_db_ptr( DB_MODE_SWAP );
1527 }
1528 break;
1529 default:
1530 break;
1531 }
1532 } /* sig_gfp_psi_4() */
1533
1534 /*
1535 +------------------------------------------------------------------------------
1536 | Function : sig_gfp_psi_5
1537 +------------------------------------------------------------------------------
1538 | Description : Handles
1539 |
1540 | Parameters : UBYTE received_in: relative position to B0
1541 |
1542 +------------------------------------------------------------------------------
1543 */
1544 GLOBAL void sig_gfp_psi_5 ( UBYTE rel_pos_i)
1545 {
1546 MCAST(psi5, PSI_5);
1547
1548 ACQ_TYPE old_acq_type = psc_db->acq_type;
1549 T_DB_MODE old_db_mode = grr_get_db_mode( );
1550
1551 TRACE_ISIG( "sig_gfp_psi_5" );
1552
1553 psi_store_rel_pos(grr_data->psi.psi5_pos, rel_pos_i, MAX_NR_OF_INSTANCES_OF_PSI5); /*MODIF*/
1554
1555 switch(psc_db->acq_type)
1556 {
1557 case NONE:
1558 case PERIODICAL_PSI1_READING:
1559 /*
1560 * PSI5 was not requested
1561 */
1562 #ifdef _SIMULATION_
1563 TRACE_ERROR("PSI5 not requested!");
1564 #endif /* #ifdef _SIMULATION_ */
1565 return;
1566 case FULL_PSI_IN_NEW_CELL:
1567 if( old_db_mode NEQ DB_MODE_CC_REQ )
1568 {
1569 grr_set_db_ptr( DB_MODE_SWAP );
1570 }
1571 break;
1572 }
1573
1574 switch( GET_STATE( PSI ) )
1575 {
1576 case PSI_IDLE:
1577 case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/
1578 switch(psi_process_psi5(psi5))
1579 {
1580 case PSI5_REREAD:
1581 psi_reread_psi5();
1582 /*
1583 * NC measurement parameters and Extended Measurement Parameters are invalid.
1584 * We have to inform CS and MEAS-Service
1585 */
1586 sig_psi_ctrl_meas_param_invalid_psi5();
1587 break;
1588 case PSI5_MEAS_PARAM_VALID:
1589 sig_psi_ctrl_meas_param_valid_psi5();
1590
1591 /*lint -fallthrough*/
1592
1593 case PSI5_OK:
1594 /*
1595 * check the acquisition state: it is only for having a complete set of information
1596 */
1597 switch(psi_check_acq_state())
1598 {
1599 case ACQ_RUNNING:
1600 /*
1601 * Nothing to do
1602 */
1603 break;
1604 case ACQ_PART_OK:
1605 psi_stop_psi_reading(NONE);
1606 #ifdef _TARGET_
1607 TRACE_EVENT("PSI5->NEW_PCCCH");
1608 sig_psi_ctrl_new_pccch();
1609 #endif
1610 break;
1611 case ACQ_COMP_OK:
1612 case ACQ_NPSI_OK:
1613 psi_stop_psi_reading(NONE);
1614 /*
1615 * Access to the network is allowed
1616 */
1617 psi_send_access_enable_if_needed();
1618 break;
1619 default:
1620 TRACE_ERROR("Unexpected acq_ret in PSI5");
1621 break;
1622 }/*switch check_acq*/
1623 break;
1624 }
1625 break;
1626 default:
1627 TRACE_ERROR( "SIG_GFP_PSI_5 unexpected" );
1628 break;
1629 }
1630 switch(old_acq_type)
1631 {
1632 case FULL_PSI_IN_NEW_CELL:
1633 if( old_db_mode NEQ DB_MODE_CC_REQ )
1634 {
1635 grr_set_db_ptr( DB_MODE_SWAP );
1636 }
1637 break;
1638 default:
1639 break;
1640 }
1641 } /* sig_gfp_psi_5() */
1642
1643 #ifdef REL99
1644 /*
1645 +------------------------------------------------------------------------------
1646 | Function : sig_gfp_psi_8
1647 +------------------------------------------------------------------------------
1648 | Description : Handles PSI8 message received on PBCCH.
1649 |
1650 | Parameters : UBYTE received_in: relative position to B0
1651 |
1652 +------------------------------------------------------------------------------
1653 */
1654 GLOBAL void sig_gfp_psi_8 ( UBYTE rel_pos_i)
1655 {
1656 MCAST(psi8, PSI_8);
1657
1658 ACQ_TYPE old_acq_type = psc_db->acq_type;
1659 T_DB_MODE old_db_mode = grr_get_db_mode( );
1660
1661 TRACE_ISIG( "sig_gfp_psi_8" );
1662
1663 psi_store_rel_pos(grr_data->psi.psi8_pos, rel_pos_i, MAX_NR_OF_INSTANCES_OF_PSI8);
1664
1665 switch(psc_db->acq_type)
1666 {
1667 case NONE:
1668 case PERIODICAL_PSI1_READING:
1669 /*
1670 * PSI8 was not requested
1671 */
1672 #ifdef _SIMULATION_
1673 TRACE_ERROR("PSI8 not requested!");
1674 #endif /* #ifdef _SIMULATION_ */
1675 return;
1676 case FULL_PSI_IN_NEW_CELL:
1677 if( old_db_mode NEQ DB_MODE_CC_REQ )
1678 {
1679 grr_set_db_ptr( DB_MODE_SWAP );
1680 }
1681 break;
1682 }
1683
1684 switch( GET_STATE( PSI ) )
1685 {
1686 case PSI_IDLE:
1687 case PSI_TRANSFER: /* In case of acq on PBCCH, if we are in transfer mode*/
1688 psi_handle_psi8(psi8);
1689 break;
1690 default:
1691 TRACE_ERROR( "SIG_GFP_PSI_8 unexpected" );
1692 break;
1693 }
1694
1695 switch(old_acq_type)
1696 {
1697 case FULL_PSI_IN_NEW_CELL:
1698 if( old_db_mode NEQ DB_MODE_CC_REQ )
1699 {
1700 grr_set_db_ptr( DB_MODE_SWAP );
1701 }
1702 break;
1703 default:
1704 break;
1705 }
1706 } /* sig_gfp_psi_8() */
1707 #endif
1708
1709
1710 /*
1711 +------------------------------------------------------------------------------
1712 | Function : sig_gfp_psi_prach
1713 +------------------------------------------------------------------------------
1714 | Description : Handles
1715 |
1716 | Parameters : void
1717 |
1718 +------------------------------------------------------------------------------
1719 */
1720 GLOBAL void sig_gfp_psi_prach (void )
1721 {
1722 MCAST(prach, D_PRACH_PAR);
1723
1724 TRACE_ISIG( "sig_gfp_psi_prach" );
1725
1726 switch( GET_STATE( PSI ) )
1727 {
1728 case PSI_IDLE:
1729 psi_process_prach(&prach->prach_ctrl_par);
1730 if(psi_is_access_class_changed())
1731 {
1732 /*
1733 * Implies the CTRL to send CELL_IND
1734 */
1735 sig_psi_ctrl_access_changed();
1736 }
1737 break;
1738 default:
1739 TRACE_ERROR( "SIG_GFP_PSI_PRACH unexpected" );
1740 break;
1741 }
1742
1743 } /* sig_gfp_psi_prach() */
1744
1745
1746 /*
1747 +------------------------------------------------------------------------------
1748 | Function : sig_gfp_psi_scell_pbcch_stop_con
1749 +------------------------------------------------------------------------------
1750 | Description : Handles the internal signal SIG_GFP_PSI_SCELL_PBCCH_STOP_CON
1751 |
1752 | Parameters : T_MPHP_SCELL_PBCCH_STOP_CON *mphp_scell_pbcch_stop_con
1753 |
1754 +------------------------------------------------------------------------------
1755 */
1756 GLOBAL void sig_gfp_psi_scell_pbcch_stop_con ( T_MPHP_SCELL_PBCCH_STOP_CON *mphp_scell_pbcch_stop_con)
1757 {
1758 TRACE_ISIG( "sig_gfp_psi_scell_pbcch_stop_con" );
1759
1760 } /* sig_gfp_psi_scell_pbcch_stop_con() */
1761
1762 /*
1763 +------------------------------------------------------------------------------
1764 | Function : sig_gfp_psi_ncell_pbcch_ind
1765 +------------------------------------------------------------------------------
1766 | Description : Handles the internal signal SIG_GFP_PSI_NCELL_PBCCH_IND
1767 |
1768 | Parameters : T_MPHP_NCELL_PBCCH_IND *mphp_ncell_pbcch_ind
1769 |
1770 +------------------------------------------------------------------------------
1771 */
1772 GLOBAL void sig_gfp_psi_ncell_pbcch_ind ( T_MPHP_NCELL_PBCCH_IND *mphp_ncell_pbcch_ind)
1773 {
1774 TRACE_ISIG( "sig_gfp_psi_ncell_pbcch_ind" );
1775 /* Not needed */
1776 PFREE(mphp_ncell_pbcch_ind);
1777 } /* sig_gfp_psi_ncell_pbcch_ind() */
1778
1779 /*
1780 +------------------------------------------------------------------------------
1781 | Function : sig_gfp_psi_save_persistence_level
1782 +------------------------------------------------------------------------------
1783 | Description : Handles
1784 |
1785 | Parameters : T_pers_lev *pers_lev
1786 |
1787 +------------------------------------------------------------------------------
1788 */
1789 GLOBAL void sig_gfp_psi_save_persistence_level( T_pers_lev *pers_lev )
1790 {
1791 TRACE_ISIG( "sig_gfp_psi_save_persistence_level" );
1792
1793 switch( GET_STATE( PSI ) )
1794 {
1795 case PSI_IDLE:
1796 case PSI_TRANSFER:
1797 case PSI_SUSPENDED:
1798 case PSI_BCCH_IDLE:
1799 case PSI_BCCH_TRANSFER:
1800 grr_save_persistence_level(pers_lev);
1801 break;
1802 default:
1803 TRACE_ERROR( "SIG_GFP_PSI_SAVE_PERSISTENCE_LEVEL unexpected" );
1804 break;
1805 }
1806
1807 } /* sig_gfp_psi_save_persistence_level() */
1808
1809 /*
1810 +------------------------------------------------------------------------------
1811 | Function : sig_ctrl_psi_access_disabled
1812 +------------------------------------------------------------------------------
1813 | Description : Handles the internal signal SIG_CTRL_PSI_ACCESS_DISABLED
1814 |
1815 | Parameters : void
1816 |
1817 +------------------------------------------------------------------------------
1818 */
1819 GLOBAL void sig_ctrl_psi_access_disabled ( T_PSI_DISABLE_CAUSE dc )
1820 {
1821 TRACE_ISIG( "sig_ctrl_psi_access_disabled" );
1822
1823 switch( dc )
1824 {
1825 case PSI_DC_OTHER:
1826 psc_db->acq_type = COMPLETE;
1827
1828 psi_start_10sec( );
1829 break;
1830
1831 case PSI_DC_READ_PSI:
1832 psi_complete_acq(COMPLETE);
1833 psi_start_10sec();
1834 break;
1835 }
1836 } /* sig_ctrl_psi_access_disabled() */