diff gsm-fw/ccd/break_cond.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
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/ccd/break_cond.c	Thu Sep 04 05:48:57 2014 +0000
@@ -0,0 +1,238 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  
+|  Modul   : break_cond.c
++----------------------------------------------------------------------------- 
+|  Copyright 2004 Texas Instruments Deutschland GmbH
+|                 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 :  Definition of encoding and decoding functions for BREAK_COND
+|             elements 
++----------------------------------------------------------------------------- 
+*/ 
+
+
+/*
+ * standard definitions like GLOBAL, UCHAR, ERROR etc.
+ */
+#include "typedefs.h"
+#include "header.h"
+
+/*
+ * Prototypes of ccd (USE_DRIVER EQ undef) for prototypes only
+ * look at ccdapi.h
+ */
+#undef USE_DRIVER
+#include "ccdapi.h"
+
+/*
+ * Types and functions for bit access and manipulation
+ */
+#include "ccd_globs.h"
+#include "bitfun.h"
+
+/*
+ * Prototypes of ccd internal functions
+ */
+#include "ccd.h"
+
+/*
+ * Declaration of coder/decoder tables
+ */
+#include "ccdtable.h"
+#include "ccddata.h"
+
+#ifndef RUN_INT_RAM
+/*
++-----------------------------------------------------------------------------+
+| PROJECT : CCD (6144)                 MODULE  : CDC_GSM                      |
+| STATE   : code                       ROUTINE : cdc_break_cond_decode        |
++-----------------------------------------------------------------------------+
+
+  PURPOSE : Decoding of the BREAK_COND element. This element consists of a V 
+            component with a variable bit length and must be connected with a 
+            special condition. This condition has to be a simple value, which 
+            matches to the value range of BREAK_COND element itself.
+            This function performs a standard decoding for a given elem table
+            entry. This means for non structured elements that 1-n bits are
+            read from the bitstream and write to a C-Variable in a machine
+            dependent format.
+            After decoding of the requested number of bits the resulting value
+            will be compared with the constant given by the condition. In case
+            of equality the global variable globs->continue_array is set to 
+            FALSE. This breaks decoding of the current superior composition 
+            and finishes the array. 
+*/
+SHORT cdc_break_cond_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
+{
+  U8     break_ind = FALSE;
+  ULONG  cix_ref, num_prolog_steps, prolog_step_ref;
+
+#ifdef DEBUG_CCD
+  #ifndef CCD_SYMBOLS
+  TRACE_CCD (globs, "cdc_break_cond_decode()");
+  #else
+  TRACE_CCD (globs, "cdc_break_cond_decode() %s", ccddata_get_alias((USHORT) e_ref, 1));
+  #endif
+#endif
+
+  cix_ref = melem[e_ref].calcIdxRef;
+  num_prolog_steps = calcidx[cix_ref].numPrologSteps;
+  prolog_step_ref  = calcidx[cix_ref].prologStepRef;
+
+  /*
+   * if this element is conditional, check the condition
+   */
+  if (calcidx[cix_ref].numCondCalcs NEQ 0
+  AND ! ccd_conditionOK (e_ref, globs))
+    return 1;
+
+  /*
+   * if this element has a defined prologue
+   * we have to process it before decoding the bitstream
+   * If there are some epilogue expressions to be processed for this element
+   * (rare cases) the result here will be a reading of 0 to an internal
+   * register. The valid processing of expression takes place after the 
+   * decoding of the element. 
+   */
+  if (num_prolog_steps)
+  {
+    if (calc[prolog_step_ref].operation EQ 'P')
+    {
+      break_ind = TRUE;
+    }
+    
+    ccd_performOperations (num_prolog_steps, prolog_step_ref, globs);
+  }
+
+  globs->pstructOffs = melem[e_ref].structOffs;
+
+
+  if (globs->bitpos < globs->maxBitpos)
+  {
+ 
+    if (mvar[melem[e_ref].elemRef].cType EQ 'X')
+      bf_readBitChunk (mvar[melem[e_ref].elemRef].bSize, globs);
+    else
+      bf_readBits (mvar[melem[e_ref].elemRef].bSize, globs);
+    
+    if ( ( break_ind == TRUE ) && (num_prolog_steps > 0))
+    {
+      if ( calc[prolog_step_ref].operand == 
+           (U16) *(globs->pstruct + globs->pstructOffs) )
+      {
+        globs->continue_array = FALSE;
+      }
+    }
+
+    globs->pstructOffs += mvar[melem[e_ref].elemRef].cSize;
+  }
+  else
+    ccd_recordFault ( globs, 
+                      ERR_ELEM_LEN, 
+                      BREAK, 
+                      (USHORT) e_ref, 
+                      globs->pstruct + globs->pstructOffs);
+
+  /*
+   * process the epilogue expression for this element if there is any 
+   */
+  if (num_prolog_steps)
+  {
+    if (  (calc[prolog_step_ref+1].operation EQ 'K')
+       || (calc[prolog_step_ref+1].operation EQ 'C')
+       || (calc[prolog_step_ref+1].operation EQ 's'))
+    {
+      ccd_performOperations (num_prolog_steps, prolog_step_ref, globs);
+    }
+  }
+
+  return 1;
+}
+#endif /* !RUN_INT_RAM */
+
+#ifndef RUN_INT_RAM
+/*
++-----------------------------------------------------------------------------+
+| PROJECT : CCD (6144)                 MODULE  : CDC_GSM                      |
+| STATE   : code                       ROUTINE : cdc_break_cond_encode        |
++-----------------------------------------------------------------------------+
+
+  PURPOSE : encoding of the BREAK_COND element. This element consists of a V 
+            component with a variable bit length and must be connected with a 
+            special condition. This condition has to be a simple value, which 
+            matches to the value range of BREAK_COND element itself.
+
+*/
+
+SHORT cdc_break_cond_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
+{
+  U8     break_ind = FALSE;
+  ULONG  cix_ref, num_prolog_steps, prolog_step_ref;
+
+#ifdef DEBUG_CCD
+  #ifndef CCD_SYMBOLS
+  TRACE_CCD (globs, "cdc_break_cond_encode()");
+  #else
+  TRACE_CCD (globs, "cdc_break_cond_encode() %s", ccddata_get_alias((USHORT) e_ref, 1));
+  #endif
+#endif
+
+  cix_ref = melem[e_ref].calcIdxRef;
+  num_prolog_steps = calcidx[cix_ref].numPrologSteps;
+  prolog_step_ref  = calcidx[cix_ref].prologStepRef;
+
+  /*
+   * if this element is conditional, check the condition
+   */
+  if (calcidx[cix_ref].numCondCalcs NEQ 0
+  AND ! ccd_conditionOK (e_ref, globs))
+    return 1;
+
+  /*
+   * if this element have a defined Prolog
+   * we have to process it before decoding the bitstream
+   */
+  if (num_prolog_steps)
+  {
+    if (calc[prolog_step_ref].operation EQ 'P')
+    {
+      break_ind = TRUE;
+    }
+    
+    ccd_performOperations (num_prolog_steps, prolog_step_ref, globs);
+  }
+
+  /*
+   * Element is not a SPARE.
+   * Setup the readpointer into the C-structure for this element
+   */
+  globs->pstructOffs = melem[e_ref].structOffs;
+
+  if (mvar[melem[e_ref].elemRef].cType EQ 'X')
+    bf_writeBitChunk (mvar[melem[e_ref].elemRef].bSize, globs);
+  else
+    bf_writeBits (mvar[melem[e_ref].elemRef].bSize, globs);
+
+  if ( ( break_ind == TRUE ) && (num_prolog_steps > 0))
+  {
+    if ( calc[prolog_step_ref].operand == 
+         (U16) *(globs->pstruct + globs->pstructOffs) )
+    {
+      globs->continue_array = FALSE;
+    }
+  }
+
+  globs->pstructOffs += mvar[melem[e_ref].elemRef].cSize;
+
+  return 1;
+}
+#endif /* !RUN_INT_RAM */