FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/ccd/ccd_elem.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 : | |
4 | Modul : ccd_elem.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 : Condat Conder Decoder - | |
18 | Definition of encoding and decoding functions of | |
19 | information elements of air interface messages | |
20 +----------------------------------------------------------------------------- | |
21 */ | |
22 | |
23 #define CCD_ELEM_C | |
24 | |
25 #include <stdio.h> | |
26 #include <string.h> | |
27 | |
28 #include "typedefs.h" | |
29 #include "ccd_globs.h" | |
30 #include "ccd.h" | |
31 #include "ccdtable.h" | |
32 #include "ccddata.h" | |
33 #include "ccdapi.h" | |
34 #include "bitfun.h" | |
35 | |
36 #ifndef RUN_INT_RAM | |
37 /* | |
38 +--------------------------------------------------------------------+ | |
39 | PROJECT : CCD (6144) MODULE : ccd_elem | | |
40 | STATE : code ROUTINE : ccd_decodeElem | | |
41 +--------------------------------------------------------------------+ | |
42 | |
43 PARAMETERS: ULONG ccdid | |
44 - Enumeration of the information element to be | |
45 decoded in the file ccdid.h. This number is also | |
46 the reference number of the IE in the melem table. | |
47 | |
48 USHORT l_buf | |
49 - Number of bits in the encoded IE. | |
50 | |
51 USHORT o_buf | |
52 - Offset of the bitstream buffer in bits. | |
53 | |
54 U8 *buf | |
55 - Bitstream buffer of the encoded IE. | |
56 | |
57 U8 *eStruct | |
58 - reference to the C-Structure containing the | |
59 C-Representation of the decoded IE. | |
60 | |
61 PURPOSE: decodes a bitstream containing an encoded information | |
62 element. The results are written to a corresponding | |
63 C-Structure, the C-Representation of the IE. | |
64 */ | |
65 int CCDDATA_PREF(ccd_decodeElem) (ULONG ccdid, | |
66 USHORT l_buf, | |
67 USHORT o_buf, | |
68 UCHAR* buf, | |
69 UCHAR* eStruct) | |
70 { | |
71 int jmp_ret; | |
72 USHORT mcompRef; | |
73 T_CCD_Globs *globs; | |
74 T_CCD_ERR_LIST_HEAD* eentry; | |
75 T_CCD_STORE_LIST* stoentry; | |
76 | |
77 globs = ccd_GetGlobVars (&eentry, &stoentry); | |
78 | |
79 #ifdef DEBUG_CCD | |
80 ccd_dump_msg(l_buf, o_buf, buf, globs); | |
81 #endif | |
82 | |
83 /* | |
84 * setup the structure-buffer. */ | |
85 globs->pstruct = eStruct; | |
86 globs->pstructOffs = 0; | |
87 | |
88 ccd_common_decode_init(l_buf, o_buf, buf, globs); | |
89 ccd_err_reset (eentry); | |
90 globs->ccd_recurs_level =1; | |
91 | |
92 if ((mcompRef = melem[ccdid].elemRef) EQ NO_REF) | |
93 { | |
94 ccd_recordFault (globs, ERR_INVALID_CCDID, BREAK, ccdid, NULL); | |
95 ccd_FreeGlobVars (globs); | |
96 ccd_err_free (eentry); | |
97 return (BYTE)globs->CCD_Error; | |
98 } | |
99 | |
100 | |
101 #ifdef DEBUG_CCD | |
102 #ifdef CCD_SYMBOLS | |
103 TRACE_CCD (globs, "CCD decode: Element = %s", | |
104 mcomp[mcompRef].name); | |
105 #else | |
106 TRACE_CCD (globs, "CCD decode: CCD_Id = %x", ccdid); | |
107 #endif | |
108 #endif | |
109 | |
110 #ifdef ERR_TRC_STK_CCD | |
111 /* save the value for tracing in error case */ | |
112 globs->error_stack[0] = mcompRef; | |
113 #endif /* ERR_TRC_STK_CCD */ | |
114 | |
115 /* | |
116 * Clean up the entite C-structure before decoding. | |
117 * Do not overwrite the MsgId (1. Byte) | |
118 */ | |
119 #ifdef DEBUG_CCD | |
120 TRACE_CCD (globs, "CCD Cleaning struct %ld bytes", | |
121 mcomp[mcompRef].cSize); | |
122 #endif | |
123 memset ((UBYTE *) globs->pstruct, 0, | |
124 (size_t)(mcomp[mcompRef].cSize)); | |
125 | |
126 /* | |
127 * clear the UPN stack | |
128 */ | |
129 globs->SP=0; | |
130 globs->StackOvfl=FALSE; | |
131 globs->KeepReg[0] = 0; | |
132 | |
133 /* | |
134 * inform the GSM-CODEC about the begin of a new message | |
135 */ | |
136 cdc_GSM_start (globs); | |
137 | |
138 jmp_ret = setjmp (globs->jmp_mark); | |
139 | |
140 if (jmp_ret EQ 0) | |
141 { | |
142 globs->jmp_mark_set = TRUE; | |
143 ccd_decodeComposition ((ULONG) mcompRef, globs); | |
144 } | |
145 | |
146 #ifdef DEBUG_CCD | |
147 TRACE_CCD (globs, "CCD-ERROR = %d", globs->CCD_Error); | |
148 TRACE_CCD (globs, "-------------------------------------------------"); | |
149 #endif /* DEBUG_CCD */ | |
150 | |
151 ccd_FreeGlobVars (globs); | |
152 ccd_err_free (eentry); | |
153 | |
154 return (BYTE) globs->CCD_Error; | |
155 } | |
156 #endif /* !RUN_INT_RAM */ | |
157 | |
158 #ifndef RUN_INT_RAM | |
159 /* | |
160 +--------------------------------------------------------------------+ | |
161 | PROJECT : CCD (6144) MODULE : ccd_elem | | |
162 | STATE : code ROUTINE : ccd_encodeElem | | |
163 +--------------------------------------------------------------------+ | |
164 | |
165 PARAMETERS: ULONG ccdid | |
166 - Enumeration of the information element to be | |
167 encoded in the file ccdid.h. This number is also | |
168 the reference number of the IE in the melem table | |
169 | |
170 USHORT l_buf | |
171 - Number of bits in the encoded IE. | |
172 | |
173 USHORT o_buf | |
174 - Offset of the bitstream buffer in bits. | |
175 | |
176 U8 *buf | |
177 - Bitstream buffer of the encoded IE. | |
178 | |
179 UBYTE * eStruct | |
180 - reference to the C-Structure containing the | |
181 C-Representation of the decoded IE. | |
182 | |
183 PURPOSE: encodes a C-Structure containing the C-Representation of | |
184 an information element to a bitstream. | |
185 */ | |
186 int CCDDATA_PREF(ccd_encodeElem) (ULONG ccdid, | |
187 USHORT* l_buf, | |
188 USHORT o_buf, | |
189 UCHAR* buf, | |
190 UCHAR* eStruct) | |
191 { | |
192 int jmp_ret; | |
193 USHORT maxBytes, mcompRef; | |
194 T_CCD_Globs *globs; | |
195 T_CCD_ERR_LIST_HEAD* eentry; | |
196 T_CCD_STORE_LIST* stoentry; | |
197 | |
198 globs = ccd_GetGlobVars (&eentry, &stoentry); | |
199 ccd_err_reset (eentry); | |
200 | |
201 #ifdef DEBUG_CCD | |
202 { | |
203 /* to avoid the vsprintf if the traces won't appear anyhow */ | |
204 ULONG mask; | |
205 if (vsi_gettracemask (globs->me, globs->me, &mask) != VSI_ERROR) | |
206 { | |
207 globs->TraceIt = mask & TC_CCD; | |
208 } | |
209 } | |
210 #endif | |
211 | |
212 /* | |
213 * Set a sign that no call to setjmp() is done. So ccd_setError | |
214 * performs no longjmp in case of an error. | |
215 */ | |
216 globs->jmp_mark_set = FALSE; | |
217 | |
218 /* Setup the bitbuffer. */ | |
219 globs->bitbuf = buf; | |
220 globs->bitpos = 0; | |
221 | |
222 /* Setup the structure-buffer. */ | |
223 globs->pstruct = eStruct; | |
224 globs->pstructOffs = 0; | |
225 | |
226 /* Cleanup the read-caches. */ | |
227 globs->lastbytepos16 = globs->lastbytepos32 = 0xffff; | |
228 | |
229 /* Setup the bitoffset. */ | |
230 globs->bitoffs = o_buf; | |
231 bf_incBitpos (o_buf, globs); | |
232 globs->bitbuf[globs->bytepos] = 0; | |
233 | |
234 globs->CCD_Error = ccdOK; | |
235 globs->ccd_recurs_level =1; | |
236 | |
237 if ((mcompRef = melem[ccdid].elemRef) EQ NO_REF) | |
238 { | |
239 ccd_recordFault (globs, ERR_INVALID_CCDID, BREAK, ccdid, NULL); | |
240 ccd_FreeGlobVars (globs); | |
241 ccd_err_free (eentry); | |
242 return (BYTE)globs->CCD_Error; | |
243 } | |
244 | |
245 #ifdef DEBUG_CCD | |
246 #ifdef CCD_SYMBOLS | |
247 TRACE_CCD (globs, "CCD encode: Element = %s", | |
248 mcomp[mcompRef].name); | |
249 #else | |
250 TRACE_CCD (globs, "CCD encode: CCD_Id = %x", ccdid); | |
251 #endif | |
252 #endif | |
253 | |
254 #ifdef ERR_TRC_STK_CCD | |
255 /* Save the value for tracing in error case. */ | |
256 globs->error_stack[0] = mcompRef; | |
257 #endif | |
258 | |
259 maxBytes = (USHORT) (mcomp[mcompRef].bSize+7)>>3; | |
260 #ifdef DEBUG_CCD | |
261 TRACE_CCD (globs, "-------------------------------------------------"); | |
262 TRACE_CCD (globs, "CCD: Code Elem"); | |
263 TRACE_CCD (globs, "Cleaning %d bits (%d bytes) of the bitstream", | |
264 mcomp[mcompRef].bSize, maxBytes); | |
265 #endif | |
266 | |
267 /* | |
268 * Clean up the bit buffer for the encoded message before encoding. | |
269 */ | |
270 memset ((U8 *) &buf[o_buf>>3], 0, (size_t) maxBytes); | |
271 | |
272 /* Store the length of ereased buffer to support error handling. */ | |
273 globs->buflen = (USHORT) mcomp[mcompRef].bSize; | |
274 | |
275 /* | |
276 * Clear the UPN stack. | |
277 */ | |
278 globs->SP=0; | |
279 globs->StackOvfl=FALSE; | |
280 globs->KeepReg[0] = 0; | |
281 | |
282 /* | |
283 * Inform the GSM-CODEC about the begin of a new message. | |
284 */ | |
285 cdc_GSM_start (globs); | |
286 | |
287 jmp_ret = setjmp (globs->jmp_mark); | |
288 | |
289 if (jmp_ret EQ 0) | |
290 { | |
291 globs->jmp_mark_set = TRUE; | |
292 ccd_encodeComposition ((ULONG) mcompRef, globs); | |
293 } | |
294 | |
295 *l_buf = (USHORT)(globs->bitpos - globs->bitoffs); | |
296 | |
297 #ifdef DEBUG_CCD | |
298 { | |
299 int i, j, buflen; | |
300 char s[64], c[4]; | |
301 | |
302 buflen = (*l_buf + o_buf + 7) >> 3; | |
303 | |
304 TRACE_CCD (globs, "-------------------------------------------------"); | |
305 TRACE_CCD (globs, " After ENCODING: lbuf= %d, obuf= %d", *l_buf, o_buf); | |
306 TRACE_CCD (globs, " Hex dump of encoded message:"); | |
307 | |
308 s[0] = '\0'; | |
309 for (i = o_buf >> 3; i < buflen; i+=16) | |
310 { | |
311 for (j = 0; j < 16; j++) | |
312 { | |
313 if ((i+j) < buflen) | |
314 { | |
315 sprintf(c, " %02x", buf[i+j]); | |
316 strcat (s, c); | |
317 } | |
318 } | |
319 TRACE_CCD (globs, "%s", s); | |
320 s[0] = '\0'; | |
321 } | |
322 } | |
323 #endif | |
324 | |
325 #ifdef DEBUG_CCD | |
326 TRACE_CCD (globs, "CCD-ERROR = %d", globs->CCD_Error); | |
327 TRACE_CCD (globs, "-------------------------------------------------"); | |
328 #endif /* DEBUG_CCD */ | |
329 | |
330 ccd_FreeGlobVars (globs); | |
331 ccd_err_free (eentry); | |
332 | |
333 return (BYTE) globs->CCD_Error; | |
334 } | |
335 #endif /* !RUN_INT_RAM */ |