diff ccd/ccd_elem.c @ 0:75a11d740a02

initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 00:02:41 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ccd/ccd_elem.c	Thu Jun 09 00:02:41 2016 +0000
@@ -0,0 +1,335 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  
+|  Modul   : ccd_elem.c
++----------------------------------------------------------------------------- 
+|  Copyright 2002 Texas Instruments Berlin, AG 
+|                 All rights reserved. 
+| 
+|                 This file is confidential and a trade secret of Texas 
+|                 Instruments Berlin, AG 
+|                 The receipt of or possession of this file does not convey 
+|                 any rights to reproduce or disclose its contents or to 
+|                 manufacture, use, or sell anything it may describe, in 
+|                 whole, or in part, without the specific written consent of 
+|                 Texas Instruments Berlin, AG. 
++----------------------------------------------------------------------------- 
+|  Purpose :  Condat Conder Decoder - 
+|             Definition of encoding and decoding functions of 
+|             information elements of air interface messages
++----------------------------------------------------------------------------- 
+*/ 
+
+#define CCD_ELEM_C
+
+#include <stdio.h>
+#include <string.h>
+
+#include "typedefs.h"
+#include "ccd_globs.h"
+#include "ccd.h"
+#include "ccdtable.h"
+#include "ccddata.h"
+#include "ccdapi.h"
+#include "bitfun.h"
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : CCD (6144)               MODULE  : ccd_elem              |
+| STATE   : code                     ROUTINE : ccd_decodeElem        |
++--------------------------------------------------------------------+
+
+ PARAMETERS:   ULONG  ccdid
+                - Enumeration of the information element to be 
+                  decoded in the file ccdid.h. This number is also
+                  the reference number of the IE in the melem table.
+
+               USHORT l_buf
+                - Number of bits in the encoded IE.
+
+               USHORT o_buf
+                - Offset of the bitstream buffer in bits.
+
+               U8 *buf
+                - Bitstream buffer of the encoded IE.
+
+               U8 *eStruct
+                - reference to the C-Structure containing the
+                  C-Representation of the decoded IE.
+
+ PURPOSE:      decodes a bitstream containing an encoded information
+               element. The results are written to a corresponding 
+               C-Structure, the C-Representation of the IE.
+*/
+int CCDDATA_PREF(ccd_decodeElem) (ULONG  ccdid,
+                                   USHORT  l_buf,
+                                   USHORT  o_buf,
+                                   UCHAR*  buf,
+                                   UCHAR*  eStruct)
+{
+  int    jmp_ret;
+  USHORT mcompRef;
+  T_CCD_Globs *globs;
+  T_CCD_ERR_LIST_HEAD* eentry;
+  T_CCD_STORE_LIST* stoentry;
+
+  globs = ccd_GetGlobVars (&eentry, &stoentry);
+
+#ifdef DEBUG_CCD
+  ccd_dump_msg(l_buf, o_buf, buf, globs);
+#endif
+
+  /*
+   * setup the structure-buffer. */
+  globs->pstruct = eStruct;
+  globs->pstructOffs = 0;
+
+  ccd_common_decode_init(l_buf, o_buf, buf, globs);
+  ccd_err_reset (eentry);
+  globs->ccd_recurs_level =1;
+
+  if ((mcompRef = melem[ccdid].elemRef) EQ NO_REF)
+  {
+    ccd_recordFault (globs, ERR_INVALID_CCDID, BREAK, ccdid, NULL);
+    ccd_FreeGlobVars (globs);
+    ccd_err_free (eentry);
+    return (BYTE)globs->CCD_Error;
+  }
+
+
+#ifdef DEBUG_CCD
+#ifdef CCD_SYMBOLS
+  TRACE_CCD (globs, "CCD decode: Element = %s",
+  mcomp[mcompRef].name);
+#else
+  TRACE_CCD (globs, "CCD decode: CCD_Id = %x", ccdid);
+#endif
+#endif
+
+#ifdef ERR_TRC_STK_CCD
+    /* save the value for tracing in error case */
+    globs->error_stack[0] = mcompRef;
+#endif /* ERR_TRC_STK_CCD */
+
+/* 
+ * Clean up the entite C-structure before decoding.
+ * Do not overwrite the MsgId (1. Byte)
+ */
+#ifdef DEBUG_CCD
+  TRACE_CCD (globs, "CCD Cleaning struct %ld bytes",
+             mcomp[mcompRef].cSize);
+#endif
+  memset ((UBYTE *) globs->pstruct, 0,
+          (size_t)(mcomp[mcompRef].cSize));
+
+  /*
+   * clear the UPN stack
+   */
+  globs->SP=0;
+  globs->StackOvfl=FALSE;
+  globs->KeepReg[0] = 0;
+
+  /*
+   * inform the GSM-CODEC about the begin of a new message
+   */
+  cdc_GSM_start (globs);
+
+  jmp_ret = setjmp (globs->jmp_mark);
+
+  if (jmp_ret EQ 0)
+  {
+    globs->jmp_mark_set = TRUE;
+    ccd_decodeComposition ((ULONG) mcompRef, globs);
+  }
+
+#ifdef DEBUG_CCD
+  TRACE_CCD (globs, "CCD-ERROR = %d", globs->CCD_Error);
+  TRACE_CCD (globs, "-------------------------------------------------");
+#endif /* DEBUG_CCD */
+
+  ccd_FreeGlobVars (globs);
+  ccd_err_free (eentry);
+
+  return (BYTE) globs->CCD_Error;
+}
+#endif /* !RUN_INT_RAM */
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : CCD (6144)               MODULE  : ccd_elem              |
+| STATE   : code                     ROUTINE : ccd_encodeElem        |
++--------------------------------------------------------------------+
+
+ PARAMETERS:   ULONG  ccdid
+                - Enumeration of the information element to be 
+                  encoded in the file ccdid.h. This number is also 
+                  the reference number of the IE in the melem table
+
+               USHORT l_buf
+                - Number of bits in the encoded IE.
+
+               USHORT o_buf
+                - Offset of the bitstream buffer in bits.
+
+               U8 *buf
+                - Bitstream buffer of the encoded IE.
+
+               UBYTE    * eStruct
+                - reference to the C-Structure containing the
+                  C-Representation of the decoded IE.
+
+ PURPOSE:      encodes a C-Structure containing the C-Representation of
+               an information element to a bitstream.
+*/
+int CCDDATA_PREF(ccd_encodeElem) (ULONG  ccdid,
+                                    USHORT* l_buf,
+                                    USHORT  o_buf,
+                                    UCHAR*  buf,
+                                    UCHAR*  eStruct)
+{
+  int    jmp_ret;
+  USHORT maxBytes, mcompRef;
+  T_CCD_Globs *globs;
+  T_CCD_ERR_LIST_HEAD* eentry;
+  T_CCD_STORE_LIST* stoentry;
+
+  globs = ccd_GetGlobVars (&eentry, &stoentry);
+  ccd_err_reset (eentry);
+
+#ifdef DEBUG_CCD
+  {
+    /* to avoid the vsprintf if the traces won't appear anyhow */
+    ULONG mask;
+    if (vsi_gettracemask (globs->me, globs->me, &mask) != VSI_ERROR)
+    {
+      globs->TraceIt = mask & TC_CCD;
+    }
+  }
+#endif
+  
+  /*
+   * Set a sign that no call to setjmp() is done. So ccd_setError 
+   * performs no longjmp in case of an error.
+   */
+  globs->jmp_mark_set = FALSE;
+
+  /* Setup the bitbuffer. */
+  globs->bitbuf = buf;
+  globs->bitpos = 0;
+
+  /* Setup the structure-buffer. */
+  globs->pstruct = eStruct;
+  globs->pstructOffs = 0;
+
+  /* Cleanup the read-caches. */
+  globs->lastbytepos16 = globs->lastbytepos32 = 0xffff;
+
+  /* Setup the bitoffset. */
+  globs->bitoffs = o_buf;
+  bf_incBitpos (o_buf, globs);
+  globs->bitbuf[globs->bytepos] = 0;
+
+  globs->CCD_Error = ccdOK;
+  globs->ccd_recurs_level =1;
+
+  if ((mcompRef = melem[ccdid].elemRef) EQ NO_REF)
+  {
+    ccd_recordFault (globs, ERR_INVALID_CCDID, BREAK, ccdid, NULL);
+    ccd_FreeGlobVars (globs);
+    ccd_err_free (eentry);
+    return (BYTE)globs->CCD_Error;
+  }
+
+#ifdef DEBUG_CCD
+#ifdef CCD_SYMBOLS
+  TRACE_CCD (globs, "CCD encode: Element = %s",
+  mcomp[mcompRef].name);
+#else
+  TRACE_CCD (globs, "CCD encode: CCD_Id = %x", ccdid);
+#endif
+#endif
+
+#ifdef ERR_TRC_STK_CCD
+  /* Save the value for tracing in error case. */
+  globs->error_stack[0] = mcompRef;
+#endif
+ 
+  maxBytes = (USHORT) (mcomp[mcompRef].bSize+7)>>3;
+  #ifdef DEBUG_CCD
+  TRACE_CCD (globs, "-------------------------------------------------");
+  TRACE_CCD (globs, "CCD: Code Elem");
+  TRACE_CCD (globs, "Cleaning %d bits (%d bytes) of the bitstream",
+    mcomp[mcompRef].bSize, maxBytes);
+#endif
+
+  /* 
+   * Clean up the bit buffer for the encoded message before encoding.
+   */
+  memset ((U8 *) &buf[o_buf>>3], 0, (size_t) maxBytes);
+
+  /* Store the length of ereased buffer to support error handling. */
+  globs->buflen = (USHORT) mcomp[mcompRef].bSize;
+
+  /*
+   * Clear the UPN stack.
+   */
+  globs->SP=0;
+  globs->StackOvfl=FALSE;
+  globs->KeepReg[0] = 0;
+
+  /*
+   * Inform the GSM-CODEC about the begin of a new message.
+   */
+  cdc_GSM_start (globs);
+
+  jmp_ret = setjmp (globs->jmp_mark);
+
+  if (jmp_ret EQ 0)
+  {
+    globs->jmp_mark_set = TRUE;
+    ccd_encodeComposition ((ULONG) mcompRef, globs);
+  }
+
+  *l_buf = (USHORT)(globs->bitpos - globs->bitoffs);
+
+#ifdef DEBUG_CCD
+{
+  int i, j, buflen;
+  char s[64], c[4];  
+
+  buflen = (*l_buf + o_buf + 7) >> 3;
+
+  TRACE_CCD (globs, "-------------------------------------------------");
+  TRACE_CCD (globs, " After ENCODING: lbuf= %d, obuf= %d", *l_buf, o_buf);
+  TRACE_CCD (globs, " Hex dump of encoded message:"); 
+
+  s[0] = '\0';
+  for (i = o_buf >> 3; i < buflen; i+=16)
+  {
+    for (j = 0; j < 16; j++)
+    {
+      if ((i+j) < buflen)
+      {
+        sprintf(c, " %02x", buf[i+j]);
+        strcat (s, c);
+      }
+    }
+    TRACE_CCD (globs, "%s", s);
+    s[0] = '\0';
+  }
+}
+#endif
+
+#ifdef DEBUG_CCD
+  TRACE_CCD (globs, "CCD-ERROR = %d", globs->CCD_Error);
+  TRACE_CCD (globs, "-------------------------------------------------");
+#endif /* DEBUG_CCD */
+
+  ccd_FreeGlobVars (globs);
+  ccd_err_free (eentry);
+
+  return (BYTE) globs->CCD_Error;
+}
+#endif /* !RUN_INT_RAM */