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 */ | 
