FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/ccd/csn1_choice_x.c @ 648:970d6199f2c5
gsm-fw/ccd/*.[ch]: initial import from the LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Thu, 04 Sep 2014 05:48:57 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
647:a60b375014e3 | 648:970d6199f2c5 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : CCD | |
4 | Modul : csn1_choice_x.c | |
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 : Definition of encoding and decoding functions for CSN1_CHOICE2 | |
18 | elements | |
19 +----------------------------------------------------------------------------- | |
20 */ | |
21 /* | |
22 * standard definitions like GLOBAL, UCHAR, ERROR etc. | |
23 */ | |
24 #include "typedefs.h" | |
25 #include "header.h" | |
26 | |
27 | |
28 /* | |
29 * Prototypes of ccd (USE_DRIVER EQ undef) for prototypes only | |
30 * look at ccdapi.h | |
31 */ | |
32 #undef USE_DRIVER | |
33 #include "ccdapi.h" | |
34 | |
35 /* | |
36 * Types and functions for bit access and manipulation | |
37 */ | |
38 #include "ccd_globs.h" | |
39 #include "bitfun.h" | |
40 | |
41 /* | |
42 * Prototypes of ccd internal functions | |
43 */ | |
44 #include "ccd.h" | |
45 #include "ccd_codingtypes.h" | |
46 /* | |
47 * Declaration of coder/decoder tables | |
48 */ | |
49 #include "ccdtable.h" | |
50 #include "ccddata.h" | |
51 | |
52 EXTERN T_FUNC_POINTER codec[MAX_CODEC_ID+1][2]; | |
53 | |
54 #ifndef RUN_INT_RAM | |
55 /* Attention for RUN_...: static function */ | |
56 | |
57 static void decode_csn1_choice_alternative(const ULONG e_ref, T_ENUM union_tag, | |
58 T_CCD_Globs *globs); | |
59 static void encode_csn1_choice_alternative(const ULONG e_ref, T_ENUM union_tag, | |
60 T_CCD_Globs *globs); | |
61 #endif /* !RUN_INT_RAM */ | |
62 | |
63 | |
64 #ifndef RUN_INT_RAM | |
65 /* Attention for RUN_...: static function */ | |
66 /* | |
67 +--------------------------------------------------------------------+ | |
68 | PROJECT : CCD (6144) MODULE : csn1_choice1 | | |
69 | STATE : code ROUTINE : decode_csn1_choice_alternative | | |
70 +--------------------------------------------------------------------+ | |
71 | |
72 PURPOSE : Decode a chosen alternative of a CSN.1 CHOICE type | |
73 Use the parameter union_tag to read the CHOICE index. | |
74 Because of union_tag it is easy to calculate the elemRef | |
75 for the chosen element which is to be decoded. Then the | |
76 appropriate decoding function for the chosen element is | |
77 called. | |
78 */ | |
79 static void decode_csn1_choice_alternative(const ULONG e_ref, T_ENUM union_tag, | |
80 T_CCD_Globs *globs) | |
81 { | |
82 ULONG elem_ref, mcomp_ref; | |
83 UBYTE *act_structpos; | |
84 | |
85 mcomp_ref= melem[e_ref].elemRef; | |
86 /* | |
87 * Write the CHOICE tag value in the C-structure. | |
88 * Calculate the elem_ref for the chosen element. | |
89 */ | |
90 *(T_ENUM *) (globs->pstruct+globs->pstructOffs) = union_tag; | |
91 elem_ref = mcomp[mcomp_ref].componentRef + (ULONG) union_tag; | |
92 | |
93 #ifdef DEBUG_CCD | |
94 #ifndef CCD_SYMBOLS | |
95 TRACE_CCD (globs, "decode_csn1_choice_alternative()"); | |
96 #else | |
97 TRACE_CCD (globs, "decode_csn1_choice_alternative() %s", ccddata_get_alias((USHORT)e_ref, 1)); | |
98 #endif | |
99 #endif | |
100 | |
101 /* | |
102 * Store the actual structure position. | |
103 */ | |
104 act_structpos = globs->pstruct; | |
105 globs->pstruct += (globs->pstructOffs + sizeof(T_ENUM)); | |
106 /* | |
107 * Use the jump-table for selecting the decode function | |
108 * Call the decode function for the chosen element. | |
109 */ | |
110 (void) codec[melem[elem_ref].codingType][DECODE_FUN] | |
111 (mcomp_ref, elem_ref, globs); | |
112 /* | |
113 * Restore the write pointer to prepare decoding of the next element | |
114 */ | |
115 globs->pstruct = act_structpos; | |
116 } | |
117 #endif /* !RUN_INT_RAM */ | |
118 | |
119 | |
120 #ifndef RUN_INT_RAM | |
121 /* Attention for RUN_...: static function */ | |
122 /* | |
123 +--------------------------------------------------------------------+ | |
124 | PROJECT : CCD (6144) MODULE : csn1_choice1 | | |
125 | STATE : code ROUTINE : encode_csn1_choice_alternative | | |
126 +--------------------------------------------------------------------+ | |
127 | |
128 PURPOSE : Encode a chosen alternative of a CSN.1 CHOICE type. | |
129 | |
130 Because of union_tag it is easy to calculate the e_ref for | |
131 the chosen element to be encoded. Then the appropriate | |
132 encoding function for the chosen element is called. | |
133 */ | |
134 static void encode_csn1_choice_alternative (const ULONG e_ref, T_ENUM union_tag, | |
135 T_CCD_Globs *globs) | |
136 { | |
137 ULONG elem_ref, mcomp_ref; | |
138 UBYTE *act_structpos; | |
139 | |
140 mcomp_ref= melem[e_ref].elemRef; | |
141 | |
142 /* | |
143 * Calculate the elem_ref for the chosen element. | |
144 */ | |
145 elem_ref = mcomp[mcomp_ref].componentRef + (ULONG) union_tag; | |
146 | |
147 #ifdef DEBUG_CCD | |
148 #ifndef CCD_SYMBOLS | |
149 TRACE_CCD (globs, "encode_csn1_choice_alternative()"); | |
150 #else | |
151 TRACE_CCD (globs, "encode_csn1_choice_alternative() %s", ccddata_get_alias((USHORT)e_ref, 1)); | |
152 #endif | |
153 #endif | |
154 | |
155 /* | |
156 * Store the actual structure position. | |
157 */ | |
158 act_structpos = globs->pstruct; | |
159 globs->pstruct += (globs->pstructOffs + sizeof(T_ENUM)); | |
160 /* | |
161 * Use the jump-table for selecting the encode function | |
162 * Call the encode function for the chosen element. | |
163 */ | |
164 (void) codec[melem[elem_ref].codingType][ENCODE_FUN] | |
165 (mcomp_ref, elem_ref, globs); | |
166 /* | |
167 * Restore the write pointer to prepare decoding of the next element | |
168 */ | |
169 globs->pstruct = act_structpos; | |
170 } | |
171 #endif /* !RUN_INT_RAM */ | |
172 | |
173 | |
174 #ifndef RUN_INT_RAM/* | |
175 +-----------------------------------------------------------------------+ | |
176 | PROJECT : CCD (6144) MODULE : CCD | | |
177 | STATE : code ROUTINE : cdc_csn1_choice_x_decode | | |
178 +-----------------------------------------------------------------------+ | |
179 | |
180 PURPOSE : Decode CSN.1 CHOICE type | |
181 In the header file the structure containing an element of | |
182 coding type CSN1_CHOICE is represented by a structure | |
183 type declaration. | |
184 This structure type is composed at least of a control item | |
185 preceding an item of an union type. The control item | |
186 indicates the CHOICE index. The item of the union type | |
187 represents the CHOICE alternatives. | |
188 The CHOICE index is "num" bits long. It is read from the | |
189 message bit string and the result is written to the control | |
190 item. CCD determes "elemRef" depending on this control item | |
191 and processes the union element according to table entry | |
192 of "elemRef" . | |
193 */ | |
194 | |
195 SHORT cdc_csn1_choice_x_decode (const ULONG c_ref, const ULONG e_ref, | |
196 ULONG num, T_CCD_Globs *globs) | |
197 { | |
198 ULONG union_tag, num_of_alt, num_of_comps; | |
199 ULONG cix_ref, num_prolog_steps, prolog_step_ref; | |
200 | |
201 #ifdef DEBUG_CCD | |
202 #ifndef CCD_SYMBOLS | |
203 TRACE_CCD (globs, "cdc_csn1_choice1_decode()"); | |
204 #else | |
205 TRACE_CCD (globs, "cdc_csn1_choice1_decode() %s", ccddata_get_alias((USHORT)e_ref, 1)); | |
206 #endif | |
207 #endif | |
208 | |
209 cix_ref = melem[e_ref].calcIdxRef; | |
210 num_prolog_steps = calcidx[cix_ref].numPrologSteps; | |
211 prolog_step_ref = calcidx[cix_ref].prologStepRef; | |
212 | |
213 /* | |
214 * If this element is conditional, check the condition. | |
215 */ | |
216 if (calcidx[cix_ref].numCondCalcs NEQ 0 | |
217 AND ! ccd_conditionOK (e_ref, globs)) | |
218 return 1; | |
219 | |
220 /* | |
221 * If this element has a defined prologue | |
222 * we have to process it before decoding the bitstream. | |
223 */ | |
224 if (num_prolog_steps) | |
225 { | |
226 ccd_performOperations (num_prolog_steps, prolog_step_ref, globs); | |
227 } | |
228 | |
229 globs->pstructOffs = melem[e_ref].structOffs; | |
230 | |
231 if (melem[e_ref].optional) | |
232 { | |
233 /* Postpone optional flag setting for non-code transparent | |
234 * pointer types ('P', 'Q', 'R'). | |
235 * For these types, the optional flag is the pointer itself. | |
236 * These types cannot be set yet, as the pointer may be | |
237 * preceeded by a counter octet, a union tag id octet etc. | |
238 */ | |
239 if (melem[e_ref].elemType < 'P' OR melem[e_ref].elemType > 'R') | |
240 globs->pstruct[globs->pstructOffs++] = (UBYTE) TRUE; | |
241 } | |
242 | |
243 /* | |
244 * Get the number of alternatives from the C-structure. | |
245 */ | |
246 num_of_comps = mcomp[melem[e_ref].elemRef].numOfComponents; | |
247 /* Determine number of possible alternatives */ | |
248 num_of_alt = num <<1; | |
249 | |
250 /* read the bit representing the CHOICE index*/ | |
251 union_tag = bf_getBits(num, globs); | |
252 | |
253 /* Check number of alternatives */ | |
254 if (!num_of_comps) | |
255 { | |
256 /* Don't do anything for empty choices */ | |
257 return 1; | |
258 } | |
259 else if (num_of_comps != num_of_alt) | |
260 { | |
261 /* if the number of components doesn't match to number of possible | |
262 * examine whether the CHOICE index demands an impossible alternative | |
263 */ | |
264 if (union_tag > num_of_comps) | |
265 { | |
266 /* if CHOICE index demands an impossible alternative | |
267 * return an error and break decoding | |
268 */ | |
269 ccd_recordFault (globs, ERR_CSN1_CHOICE, BREAK, (USHORT) e_ref, | |
270 globs->pstruct+globs->pstructOffs); | |
271 } | |
272 else | |
273 { | |
274 ccd_recordFault (globs, ERR_CSN1_CHOICE, CONTINUE, (USHORT) e_ref, | |
275 globs->pstruct+globs->pstructOffs); | |
276 } | |
277 } | |
278 | |
279 /* | |
280 * Decode a chosen alternative of an CSN.1 CHOICE type | |
281 */ | |
282 decode_csn1_choice_alternative(e_ref, (T_ENUM) union_tag, globs); | |
283 return 1; | |
284 } | |
285 #endif /* !RUN_INT_RAM */ | |
286 | |
287 | |
288 | |
289 #ifndef RUN_INT_RAM | |
290 | |
291 /* | |
292 +----------------------------------------------------------------------+ | |
293 | PROJECT : CCD (6144) MODULE : csn1_choice1 | | |
294 | STATE : code ROUTINE : cdc_csn1_choice_x_encode | | |
295 +----------------------------------------------------------------------+ | |
296 | |
297 PURPOSE : Encoding of CHOICE1 type for UMTS | |
298 In the header file the structure containing an element of | |
299 coding type CSN1_CHOICE is represented by a structure | |
300 type declaration. | |
301 This structure type is composed at least of a control item | |
302 preceding an item of an union type. The control item | |
303 indicates the CHOICE index. The item of the union type | |
304 represents the CHOICE alternatives. | |
305 The CHOICE index is "num" bit long. Tts value is read | |
306 from the message structureand the result is written to the | |
307 bit string. CCD determines "elemRef" depending on this index | |
308 and processes the union element according to table entry | |
309 of "elemRef" . | |
310 */ | |
311 SHORT cdc_csn1_choice_x_encode (const ULONG c_ref, const ULONG e_ref, | |
312 ULONG num, T_CCD_Globs *globs) | |
313 { | |
314 ULONG union_tag, num_of_alt, num_of_comps; | |
315 ULONG cix_ref, num_prolog_steps, prolog_step_ref; | |
316 | |
317 #ifdef DEBUG_CCD | |
318 #ifndef CCD_SYMBOLS | |
319 TRACE_CCD (globs, "cdc_csn1_choice_encode()"); | |
320 #else | |
321 TRACE_CCD (globs, "cdc_csn1_choice_encode() %s", | |
322 mcomp[melem[e_ref].elemRef].name); | |
323 #endif | |
324 #endif | |
325 | |
326 cix_ref = melem[e_ref].calcIdxRef; | |
327 num_prolog_steps = calcidx[cix_ref].numPrologSteps; | |
328 prolog_step_ref = calcidx[cix_ref].prologStepRef; | |
329 | |
330 /* | |
331 * If this element is conditional, check the condition. | |
332 */ | |
333 if (calcidx[cix_ref].numCondCalcs NEQ 0 | |
334 AND ! ccd_conditionOK (e_ref, globs)) | |
335 return 1; | |
336 | |
337 /* | |
338 * If this element has a defined prologue | |
339 * we have to process it before decoding the bitstream. | |
340 */ | |
341 if (num_prolog_steps) | |
342 { | |
343 ccd_performOperations (num_prolog_steps, prolog_step_ref, globs); | |
344 } | |
345 | |
346 /* | |
347 * Setup the offset into the C-structure for this element | |
348 */ | |
349 globs->pstructOffs = melem[e_ref].structOffs; | |
350 | |
351 if (melem[e_ref].optional) | |
352 { | |
353 /* | |
354 * For optional elements check the valid-flag in the C-struct. | |
355 * Postpone optional flag setting for non-code transparent | |
356 * pointer types ('P', 'Q', 'R'). | |
357 * For these types, the optional flag is the pointer itself. | |
358 * These types cannot be set yet, as the pointer may be | |
359 * preceeded by a counter octet, a union tag id octet etc. | |
360 */ | |
361 if (melem[e_ref].elemType < 'P' OR melem[e_ref].elemType > 'R') | |
362 { | |
363 if (globs->pstruct[globs->pstructOffs++] EQ FALSE) | |
364 return 1; | |
365 } | |
366 } | |
367 /* | |
368 * Get the number of alternatives from the C-structure. | |
369 */ | |
370 num_of_comps = mcomp[melem[e_ref].elemRef].numOfComponents; | |
371 /* Determine number of possible alternatives */ | |
372 num_of_alt = num <<1; | |
373 /* | |
374 * Get the value of CHOICE index (= union controller) from the C-structure. | |
375 * Check its correctness. Write it in the air message. | |
376 * Afterwards encode the chosen CHOICE altervative. | |
377 */ | |
378 union_tag = (ULONG) globs->pstruct[globs->pstructOffs]; | |
379 /* | |
380 * Check its correctness. | |
381 */ | |
382 if (union_tag >= num_of_alt) | |
383 { | |
384 /* | |
385 * CHOICE index goes beyond the number of alternatives determined by | |
386 * selected coding type => return Error and break encoding process | |
387 */ | |
388 ccd_recordFault (globs, ERR_CSN1_CHOICE, BREAK, | |
389 (USHORT) e_ref, globs->pstruct+globs->pstructOffs); | |
390 } | |
391 | |
392 /* | |
393 * Write the CHOICE tag value in the C-structure. | |
394 */ | |
395 bf_writeVal (union_tag, num, globs); | |
396 | |
397 /* Check number of alternatives */ | |
398 if (!num_of_comps) | |
399 { | |
400 /* Don't do anything for empty choices */ | |
401 return 1; | |
402 } | |
403 else if (num_of_comps != num_of_alt) | |
404 { | |
405 /* if the number of components doesn't match to number of possible | |
406 alternatives return a warning */ | |
407 ccd_recordFault (globs, ERR_CSN1_CHOICE, CONTINUE, | |
408 (USHORT) e_ref, globs->pstruct+globs->pstructOffs); | |
409 if (union_tag > num_of_comps) | |
410 { | |
411 /* if the CHOICE index demands an impossible one handle this choice | |
412 as no_code element */ | |
413 #ifdef DEBUG_CCD | |
414 #ifndef CCD_SYMBOLS | |
415 TRACE_CCD (globs, "cdc_No_encode()"); | |
416 #else | |
417 TRACE_CCD (globs, "cdc_No_encode() %s", ccddata_get_alias((USHORT) e_ref, 1)); | |
418 #endif | |
419 #endif | |
420 return 1; | |
421 } | |
422 } | |
423 | |
424 /* | |
425 * Encode a chosen alternative of an CSN.1 CHOICE type | |
426 */ | |
427 encode_csn1_choice_alternative (e_ref, (T_ENUM) union_tag, globs); | |
428 | |
429 return 1; | |
430 } | |
431 #endif /* !RUN_INT_RAM */ | |
432 | |
433 |