comparison src/g23m-gprs/grlc/grlc_pei.c @ 183:219afcfc6250

src/g23m-gprs: initial import from TCS3.2/LoCosto
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 13 Oct 2016 04:24:13 +0000
parents
children dcc3b8646a34
comparison
equal deleted inserted replaced
182:f02d0a0e1849 183:219afcfc6250
1 /*
2 +-----------------------------------------------------------------------------
3 | Project : GPRS (8441)
4 | Modul : GRLC
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 the process body interface
18 | for the entity GRLC
19 |
20 | Exported functions:
21 |
22 | pei_create - Create the Protocol Stack Entity
23 | pei_init - Initialize Protocol Stack Entity
24 | pei_primitive - Process Primitive
25 | pei_timeout - Process Timeout
26 | pei_exit - Close resources and terminate
27 | pei_run - Process Primitive
28 | pei_config - Dynamic Configuration
29 | pei_monitor - Monitoring of physical Parameters
30 |+-----------------------------------------------------------------------------
31 */
32
33 #define GRLC_PEI_C
34
35 #define ENTITY_GRLC
36
37 /*==== INCLUDES =============================================================*/
38
39 #include <stdio.h>
40 #include <string.h>
41 #include <stdlib.h>
42 #include <stddef.h> /* to get definition of offsetof(), for MAK_FUNC_S */
43 #include "typedefs.h" /* to get Condat data types */
44 #include "vsi.h" /* to get a lot of macros */
45 #include "macdef.h"
46 #include "gprs.h"
47
48 #include "custom.h" /*FMM*/ /*set FF_EM_MODE compile switch for SIMULATION and define WAP_NAME*/
49
50 #include "gsm.h" /* to get a lot of macros */
51 #include "ccdapi.h" /* to get CCD API */
52 #include "cnf_grlc.h" /* to get cnf-definitions */
53 #include "mon_grlc.h" /* to get mon-definitions */
54 #include "prim.h" /* to get the definitions of used SAP and directions */
55 #include "message.h"
56 #include "tok.h"
57 #include "pcm.h"
58 #include "grlc.h" /* to get the global entity definitions */
59 #include "grlc_f.h"
60 #include "grlc_gffp.h"
61 #include "grlc_tmp.h"
62 #include "grlc_rup.h"
63 #include "grlc_rdp.h"
64 #include "grlc_tpcs.h"
65 #include "grlc_measp.h"
66
67 #include "grlc_em.h"
68
69 /*==== DEFINITIONS ==========================================================*/
70
71 #define GRLC_TSTR_ILLEGAL_KEYW 0
72 #define GRLC_TSTR_OK 1
73
74 /*==== TYPES ================================================================*/
75
76 /*==== GLOBAL VARS ==========================================================*/
77
78 /*==== LOCAL VARS ===========================================================*/
79
80
81 /*
82 * Function is needed for grlc_table[].
83 */
84
85 LOCAL SHORT pei_signal (ULONG opc, void *data);
86
87 static BOOL first_access = TRUE;
88 static T_MONITOR grlc_mon;
89
90
91 /*
92 * Jumptables to primitive handler functions. One table per SAP.
93 *
94 * Use MAK_FUNC_0 for primitives which contains no SDU.
95 * Use MAK_FUNC_S for primitives which contains a SDU.
96 */
97
98
99 /*
100 * Function is needed for grlc_table[]. This declaration can be removed
101 * as soon as this function is no more called (i.e. all primitives are
102 * handled).
103 */
104 LOCAL void primitive_not_supported (void *data);
105
106 static const T_FUNC grlc_table[] =
107 {
108 MAK_FUNC_S(tm_grlc_data_req, GRLC_DATA_REQ),
109 MAK_FUNC_S(tm_grlc_unitdata_req, GRLC_UNITDATA_REQ),
110 MAK_FUNC_0(tm_grlc_activate_gmm_queue_req, GRLC_ACTIVATE_GMM_QUEUE_REQ),
111 MAK_FUNC_0(tm_grlc_flush_data_req, GRLC_FLUSH_DATA_REQ)
112 };
113
114 static const T_FUNC cgrlc_table[] =
115 {
116 MAK_FUNC_0(tm_cgrlc_enable_req, CGRLC_ENABLE_REQ), /* 0x00 */
117 MAK_FUNC_0(tm_cgrlc_disable_req, CGRLC_DISABLE_REQ), /* 0x01 */
118 MAK_FUNC_0(tm_cgrlc_ul_tbf_res, CGRLC_UL_TBF_RES), /* 0x02 */
119 MAK_FUNC_0(tm_cgrlc_dl_tbf_req, CGRLC_DL_TBF_REQ), /* 0x03 */
120 MAK_FUNC_0(tm_cgrlc_tbf_rel_req, CGRLC_TBF_REL_REQ), /* 0x04 */
121 MAK_FUNC_0(tm_cgrlc_tbf_rel_res, CGRLC_TBF_REL_RES), /* 0x05 */
122 MAK_FUNC_0(tm_cgrlc_data_req, CGRLC_DATA_REQ), /* 0x06 */
123 MAK_FUNC_0(tm_cgrlc_poll_req, CGRLC_POLL_REQ), /* 0x07 */
124 MAK_FUNC_0(tm_cgrlc_access_status_req, CGRLC_ACCESS_STATUS_REQ), /* 0x08 */
125 MAK_FUNC_0(tm_cgrlc_test_mode_req, CGRLC_TEST_MODE_REQ), /* 0x09 */
126 MAK_FUNC_0(tm_cgrlc_test_end_req, CGRLC_TEST_END_REQ), /* 0x0A */
127 MAK_FUNC_0(tm_cgrlc_ta_value_req, CGRLC_TA_VALUE_REQ), /* 0x0B */
128 MAK_FUNC_0(meas_int_level_req, CGRLC_INT_LEVEL_REQ), /* 0x0C */
129 MAK_FUNC_0(tm_cgrlc_pwr_ctrl_req, CGRLC_PWR_CTRL_REQ), /* 0x0D */
130 MAK_FUNC_0(tm_cgrlc_ready_timer_config_req, CGRLC_READY_TIMER_CONFIG_REQ), /* 0x0E */
131 MAK_FUNC_0(tm_cgrlc_force_to_standby_req, CGRLC_FORCE_TO_STANDBY_REQ) /* 0x0F */
132 };
133
134
135 #ifdef _SIMULATION_
136
137 static const T_FUNC mac_table[] =
138 {
139 MAK_FUNC_0(gff_mac_data_ind, MAC_DATA_IND),
140 MAK_FUNC_0(gff_mac_ready_ind, MAC_READY_IND),
141 MAK_FUNC_0(gff_mac_pwr_ctrl_ind, MAC_PWR_CTRL_IND)
142 };
143
144 static const T_FUNC l1test_table[] =
145 {
146 MAK_FUNC_N(primitive_not_supported, 0),
147 MAK_FUNC_N(primitive_not_supported, 0),
148 MAK_FUNC_N(primitive_not_supported, 0),
149 MAK_FUNC_N(primitive_not_supported, 0),
150 MAK_FUNC_0(gff_l1test_call_mphp_power_control, L1TEST_CALL_MPHP_POWER_CONTROL),
151 MAK_FUNC_N(primitive_not_supported, 0),
152 MAK_FUNC_N(primitive_not_supported, 0),
153 };
154
155 #endif /* #ifdef _SIMULATION_ */
156
157
158 #ifdef FF_EM_MODE
159 static const T_FUNC em_ul_table[] =
160 {
161 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x00 */
162 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x01 */
163 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x02 */
164 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x03 */
165 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x04 */
166 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x05 */
167 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x06 */
168 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x07 */
169 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x08 */
170 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x09 */
171 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0A */
172 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0B */
173 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0C */
174 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0D */
175 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0E */
176 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x0F */
177 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x10 */
178 MAK_FUNC_0(grlc_em_pco_trace_req, EM_PCO_TRACE_REQ ), /* 0x11*/ /*PCO output*/
179 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x12 */
180 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x13 */
181 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x14 */
182 MAK_FUNC_0(grlc_em_fmm_rlc_trans_info_req, EM_FMM_RLC_TRANS_INFO_REQ),/* 0x15 */
183 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x16 */
184 MAK_FUNC_N(primitive_not_supported, 0 ), /* 0x17 */
185 MAK_FUNC_0(grlc_em_grlc_info_req, EM_GRLC_INFO_REQ ) /* 0x18 */
186
187 };
188 #endif /* FF_EM_MODE */
189
190 /*==== END DIAGNOSTICS ======================================================*/
191
192 /*==== PRIVATE FUNCTIONS ====================================================*/
193
194 /*
195 +------------------------------------------------------------------------------
196 | Function : primitive_not_supported
197 +------------------------------------------------------------------------------
198 | Description : This function handles unsupported primitives.
199 |
200 | Parameters : -
201 |
202 | Return : -
203 |
204 +------------------------------------------------------------------------------
205 */
206 LOCAL void primitive_not_supported (void *data)
207 {
208 TRACE_FUNCTION ("primitive_not_supported");
209
210 PFREE (data);
211 }
212
213
214 /*==== PUBLIC FUNCTIONS =====================================================*/
215
216 /*
217 +------------------------------------------------------------------------------
218 | Function : pei_primitive
219 +------------------------------------------------------------------------------
220 | Description : This function is called by the frame when a primitive is
221 | received and needs to be processed.
222 |
223 | | |
224 | GRLC CGRLC UPLINK
225 | | |
226 | +------v-----------v-------+
227 | | |
228 | | GRLC |
229 | | |
230 | +--------------^------- ---+
231 | |
232 | L1 DOWNLINK
233 | |
234 |
235 |
236 | Parameters : prim - Pointer to the received primitive
237 |
238 | Return : PEI_OK - function succeeded
239 | PEI_ERROR - function failed
240 |
241 +------------------------------------------------------------------------------
242 */
243 LOCAL SHORT pei_primitive (void * primptr)
244 {
245 TRACE_FUNCTION ("pei_primitive");
246
247 if (primptr NEQ NULL)
248 {
249 T_PRIM *prim = (T_PRIM *)primptr;
250 ULONG opc = prim->custom.opc;
251 USHORT n;
252 const T_FUNC *table;
253
254 PTRACE_IN (opc);
255
256 /*
257 * This must be called for Partition Pool supervision. Will be replaced
258 * by another macro some time.
259 */
260 VSI_PPM_REC (&prim->custom, __FILE__, __LINE__);
261
262 switch (SAP_NR(opc))
263 {
264 case SAP_NR(CGRLC_UL):
265 table = cgrlc_table;
266 n = TAB_SIZE (cgrlc_table);
267 break;
268 #ifdef _SIMULATION_
269 case MAC_DL:
270 table = mac_table;
271 n = TAB_SIZE (mac_table);
272 break;
273 case SAP_NR(L1TEST_DL):
274 table = l1test_table;
275 n = TAB_SIZE (l1test_table);
276 break;
277 #endif
278 case SAP_NR(GRLC_UL):
279 table = grlc_table;
280 n = TAB_SIZE (grlc_table);
281 break;
282 #ifdef FF_EM_MODE
283 case EM_Ul:
284 table = em_ul_table;
285 n = TAB_SIZE (em_ul_table);
286 break;
287 #endif /* FF_EM_MODE */
288 default:
289 table = NULL;
290 n = 0;
291 break;
292 }
293
294 if (table != NULL)
295 {
296 if ((PRIM_NR(opc)) < n)
297 {
298 table += PRIM_NR(opc);
299 #ifdef PALLOC_TRANSITION
300 P_SDU(prim) = table->soff ? (T_sdu*) (((char*)&prim->data) + table->soff) : 0;
301 #ifndef NO_COPY_ROUTING
302 P_LEN(prim) = table->size + sizeof (T_PRIM_HEADER);
303 #endif /* NO_COPY_ROUTING */
304 #endif /* PALLOC_TRANSITION */
305 JUMP (table->func) (P2D(prim));
306 }
307 else
308 {
309 primitive_not_supported (P2D(prim));
310 }
311 return PEI_OK;
312 }
313 }
314 return PEI_OK;
315 }
316
317 /*
318 +------------------------------------------------------------------------------
319 | Function : pei_init
320 +------------------------------------------------------------------------------
321 | Description : This function is called by the frame. It is used to initialise
322 | the entitiy.
323 |
324 | Parameters : handle - task handle
325 |
326 | Return : PEI_OK - entity initialised
327 | PEI_ERROR - entity not (yet) initialised
328 |
329 +------------------------------------------------------------------------------
330 */
331 LOCAL SHORT pei_init (T_HANDLE handle)
332 {
333 TRACE_FUNCTION ("pei_init");
334
335 /*
336 * Initialize task handle
337 */
338 GRLC_handle = handle;
339
340
341 /*
342 * Open communication channels
343 */
344 if (hCommGRLC < VSI_OK)
345 {
346 if ((hCommGRLC = vsi_c_open (VSI_CALLER GRLC_NAME)) < VSI_OK)
347 return PEI_ERROR;
348 }
349 if (hCommGRR < VSI_OK)
350 {
351 if ((hCommGRR = vsi_c_open (VSI_CALLER GRR_NAME)) < VSI_OK)
352 return PEI_ERROR;
353 }
354 if (hCommGMM < VSI_OK)
355 {
356 if ((hCommGMM = vsi_c_open (VSI_CALLER GMM_NAME)) < VSI_OK)
357 return PEI_ERROR;
358 }
359 if (hCommLLC < VSI_OK)
360 {
361 if ((hCommLLC = vsi_c_open (VSI_CALLER LLC_NAME)) < VSI_OK)
362 return PEI_ERROR;
363 }
364 if (hCommL1 < VSI_OK)
365 {
366 if ((hCommL1 = vsi_c_open (VSI_CALLER L1_NAME)) < VSI_OK)
367 return PEI_ERROR;
368 }
369
370 if (hCommPL < VSI_OK)
371 {
372 if ((hCommPL = vsi_c_open (VSI_CALLER PL_NAME)) < VSI_OK)
373 return PEI_ERROR;
374 }
375
376 #ifdef FF_WAP /*FFM*/
377 if (hCommWAP < VSI_OK)
378 {
379 if ((hCommWAP = vsi_c_open (VSI_CALLER WAP_NAME)) < VSI_OK)
380 return PEI_ERROR;
381 }
382 #endif
383
384 /*
385 * call function pcm_Init to be sure that the global variable std
386 * is set before the initialisation of the GRLC services takes place
387 */
388 pcm_Init();
389
390 /*
391 * Initialize entity data (call init function of every service)
392 */
393 grlc_init();
394
395 /* {
396 PALLOC (tst_test_hw_req, TST_TEST_HW_REQ);
397 PSEND (hCommL1, tst_test_hw_req);
398 }*/
399 return (PEI_OK);
400 }
401
402 /*
403 +------------------------------------------------------------------------------
404 | Function : pei_timeout
405 +------------------------------------------------------------------------------
406 | Description : This function is called by the frame when a timer has expired.
407 |
408 | Parameters : index - timer index
409 |
410 | Return : PEI_OK - timeout processed
411 | PEI_ERROR - timeout not processed
412 |
413 +------------------------------------------------------------------------------
414 */
415 LOCAL SHORT pei_timeout (USHORT index)
416 {
417 TRACE_FUNCTION ("pei_timeout");
418
419 /*
420 * Process timeout
421 */
422 switch (index) /* SZML-GLBL/007 */
423 {
424 case T3164: ru_t3164(); break;
425 case T3166: ru_t3166(); break;
426 case T3168: tm_t3168(); break;
427 case T3180: ru_t3180(); break;
428 case T3182: ru_t3182(); break;
429 case T3184: ru_t3184(); break;
430 case T3188: tm_t3188(); break;
431 case T3190: rd_t3190(); break;
432 case T3192: rd_t3192(); break;
433 case T3314: ru_t3314(); break;
434 default: TRACE_EVENT_P1( "Unknown Timeout: %d", index ); break;
435 }
436
437 return PEI_OK;
438 }
439
440 /*
441 +------------------------------------------------------------------------------
442 | Function : pei_signal
443 +------------------------------------------------------------------------------
444 | Description : This function is called by the frame when a signal has been
445 | received.
446 |
447 | Parameters : opc - signal operation code
448 | *data - pointer to primitive
449 |
450 | Return : PEI_OK - signal processed
451 | PEI_ERROR - signal not processed
452 |
453 +------------------------------------------------------------------------------
454 */
455 LOCAL SHORT pei_signal (ULONG opc, void *data)
456 {
457
458 TRACE_FUNCTION ("pei_signal");
459 /*
460 * Process signal
461 */
462 switch (opc)
463 {
464 case MAC_DATA_IND:
465 gff_mac_data_ind(data);
466 break;
467
468 case MAC_READY_IND:
469 gff_mac_ready_ind(data);
470 break;
471 case MAC_PWR_CTRL_IND:
472 gff_mac_pwr_ctrl_ind(data);
473 break;
474 default:
475 TRACE_EVENT_P1( "Unknown Signal: %08X", opc );
476 break;
477 }
478
479
480 return(PEI_OK);
481 }
482
483 /*
484 +------------------------------------------------------------------------------
485 | Function : pei_exit
486 +------------------------------------------------------------------------------
487 | Description : This function is called by the frame when the entity is
488 | terminated. All open resources are freed.
489 |
490 | Parameters : -
491 |
492 | Return : PEI_OK - exit sucessful
493 | PEI_ERROR - exit not sueccessful
494 |
495 +------------------------------------------------------------------------------
496 */
497 LOCAL SHORT pei_exit (void)
498 {
499 TRACE_FUNCTION ("pei_exit");
500
501 /*
502 * Close communication channels
503 */
504 vsi_c_close (VSI_CALLER hCommGRLC);
505 hCommGRLC = VSI_ERROR;
506
507 vsi_c_close (VSI_CALLER hCommGRR);
508 hCommGRR = VSI_ERROR;
509
510 vsi_c_close (VSI_CALLER hCommGMM);
511 hCommGMM = VSI_ERROR;
512
513 vsi_c_close (VSI_CALLER hCommLLC);
514 hCommLLC = VSI_ERROR;
515
516 vsi_c_close (VSI_CALLER hCommL1);
517 hCommL1 = VSI_ERROR;
518
519 vsi_c_close (VSI_CALLER hCommPL);
520 hCommPL = VSI_ERROR;
521
522 ccd_exit();
523
524 #ifdef FF_WAP /*FFM*/
525 vsi_c_close (VSI_CALLER hCommWAP);
526 hCommWAP = VSI_ERROR;
527 #endif
528
529 return PEI_OK;
530 }
531
532 /*
533 +------------------------------------------------------------------------------
534 | Function : pei_run
535 +------------------------------------------------------------------------------
536 | Description : This function is called by the frame when entering the main
537 | loop. This fucntion is only required in the active variant.
538 |
539 | This function is not used.
540 |
541 | Parameters : handle - Communication handle
542 |
543 | Return : PEI_OK - sucessful
544 | PEI_ERROR - not successful
545 |
546 +------------------------------------------------------------------------------
547 */
548 LOCAL SHORT pei_run (T_HANDLE TaskHandle, T_HANDLE ComHandle )
549 {
550
551 return PEI_OK;
552 }
553
554 /*
555 +------------------------------------------------------------------------------
556 | Function : pei_config
557 +------------------------------------------------------------------------------
558 | Description : This function is called by the frame when a primitive is
559 | received indicating dynamic configuration.
560 |
561 | This function is not used in this entity.
562 |
563 | Parameters : handle - Communication handle
564 |
565 | Return : PEI_OK - sucessful
566 | PEI_ERROR - not successful
567 |
568 +------------------------------------------------------------------------------
569 */
570 #if !defined (NCONFIG)
571 LOCAL const KW_DATA kwtab[] =
572 {
573 GRLC_STR_TPC_PWR_PAR, GRLC_NUM_TPC_PWR_PAR,
574 GRLC_STR_TPC_FIX_PCL, GRLC_NUM_TPC_FIX_PCL,
575 #if !defined (NTRACE)
576 GRLC_STR_TPC_TRACE, GRLC_NUM_TPC_TRACE,
577 GRLC_STR_IM_TRACE, GRLC_NUM_IM_TRACE,
578 #endif /* #if !defined (NTRACE) */
579 GRLC_STR_CCD_USAGE, GRLC_NUM_CCD_USAGE,
580 "", 0
581 };
582 #endif /* #if !defined (NCONFIG) */
583
584 LOCAL SHORT pei_config (char *inString)
585 {
586 #if !defined (NCONFIG)
587 char * s = inString;
588 char * keyw;
589 char * val [10];
590
591 TRACE_FUNCTION( "pei_config" );
592
593 TRACE_EVENT_P1( "[PEI_CONFIG]: %s", inString );
594
595 tok_init(s);
596
597 /*
598 * Parse next keyword and number of variables
599 */
600 while ((tok_next(&keyw,val)) NEQ TOK_EOCS)
601 {
602 UBYTE ncomment = GRLC_TSTR_OK;
603
604 switch ((tok_key((KW_DATA *)kwtab,keyw)))
605 {
606 case GRLC_NUM_TPC_PWR_PAR:
607 sig_pei_config_tpc_set_pwr_par( ( UBYTE )atoi( val[0] ),
608 ( UBYTE )atoi( val[1] ) );
609 break;
610
611 case GRLC_NUM_TPC_FIX_PCL:
612 sig_pei_config_tpc_fix_pcl( ( UBYTE )atoi( val[0] ) );
613 break;
614
615 #if !defined (NTRACE)
616
617 case GRLC_NUM_TPC_TRACE:
618 grlc_data->tpc.n_tpc_trace = atoi( val[0] );
619 break;
620
621 case GRLC_NUM_IM_TRACE:
622 grlc_data->meas.v_im_trace = atoi( val[0] );
623 break;
624
625 #endif /* #if !defined (NTRACE) */
626
627 case GRLC_NUM_CCD_USAGE:
628 grlc_data->grlc_wo_ccd = atoi( val[0] );
629 break;
630
631 default:
632 ncomment = GRLC_TSTR_ILLEGAL_KEYW;
633 break;
634 }
635
636 TRACE_EVENT_P2( "[PEI_CONFIG]: %s -> %s",
637 keyw,
638 ncomment EQ GRLC_TSTR_OK ? "OK" : "Illegal Keyword" );
639 }
640
641 #endif /* #if !defined (NCONFIG) */
642
643 return PEI_OK;
644 }
645
646 /*
647 +------------------------------------------------------------------------------
648 | Function : pei_config
649 +------------------------------------------------------------------------------
650 | Description : This function is called by the frame in case sudden entity
651 | specific data is requested (e.g. entity Version).
652 |
653 | Parameters : out_monitor - return the address of the data to be
654 | monitoredCommunication handle
655 |
656 | Return : PEI_OK - sucessful (address in out_monitor is valid)
657 | PEI_ERROR - not successful
658 |
659 +------------------------------------------------------------------------------
660 */
661 LOCAL SHORT pei_monitor (void ** out_monitor)
662 {
663 TRACE_FUNCTION ("pei_monitor");
664
665 grlc_mon.version = "GRLC 1.0";
666 *out_monitor = &grlc_mon;
667
668 return PEI_OK;
669 }
670
671 /*
672 +------------------------------------------------------------------------------
673 | Function : pei_create
674 +------------------------------------------------------------------------------
675 | Description : This function is called by the frame when the process is
676 | created.
677 |
678 | Parameters : out_name - Pointer to the buffer in which to locate
679 | the name of this entity
680 |
681 | Return : PEI_OK - entity created successfuly
682 | PEI_ERROR - entity could not be created
683 |
684 +------------------------------------------------------------------------------
685 */
686 GLOBAL SHORT pei_create (T_PEI_INFO **info)
687 {
688
689 static T_PEI_INFO pei_info =
690 {
691 "GRLC", /* name */
692 { /* pei-table */
693 pei_init,
694 pei_exit,
695 pei_primitive,
696 pei_timeout,
697 pei_signal,
698 pei_run,
699 pei_config,
700 pei_monitor
701 },
702 2048, /* stack size */
703 PEI_PRIM_QUEUE_SIZE, /* queue entries */
704 226, /* priority (1->low, 255->high): GRR 204 RR 205 ALR 225 */
705 TIMER_COUNT, /* number of timers */
706 #ifdef _TARGET_
707 PASSIVE_BODY|COPY_BY_REF|TRC_NO_SUSPEND|PRIM_NO_SUSPEND
708 #else
709 PASSIVE_BODY|COPY_BY_REF
710 #endif
711 };
712
713
714 TRACE_FUNCTION ("pei_create");
715
716 /*
717 * Close Resources if open
718 */
719 if (first_access)
720 first_access = FALSE;
721 else
722 pei_exit();
723
724 /*
725 * Export startup configuration data
726 */
727 *info = &pei_info;
728
729
730
731 return PEI_OK;
732 }
733
734 /*==== END OF FILE ==========================================================*/