diff gsm-fw/ccd/hl_flag.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/hl_flag.c	Thu Sep 04 05:48:57 2014 +0000
@@ -0,0 +1,345 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  
+|  Modul   : hl_flag.c
++----------------------------------------------------------------------------- 
+|  Copyright 2002 Texas Instruments Inc. 
+|                 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 HL_FLAG 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_hl_flag_decode    |
++--------------------------------------------------------------------+
+
+  PURPOSE : Decoding of the GSM Type HL_FLAG element. This element
+            consists of a single bit only. The decoded value will be 0
+            if the encoded value is L respectively 1 if the encoded
+            value is H.
+            
+*/
+
+SHORT cdc_hl_flag_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
+{
+  ULONG repeat, max_rep;
+  BOOL  is_variable = FALSE;
+  ULONG cix_ref, num_prolog_steps, prolog_step_ref;
+
+#ifdef DEBUG_CCD
+  #ifndef CCD_SYMBOLS
+  TRACE_CCD (globs, "cdc_hl_flag_decode()");
+  #else
+  TRACE_CCD (globs, "cdc_hl_flag_decode() %s", ccddata_get_alias((USHORT) e_ref, 1));
+  #endif
+#endif
+
+  globs->SeekTLVExt = FALSE;
+  cix_ref = melem[e_ref].calcIdxRef;
+  num_prolog_steps = calcidx[cix_ref].numPrologSteps;
+  prolog_step_ref  = calcidx[cix_ref].prologStepRef;
+  repeat     = 1;
+  
+  if (cix_ref != 0)
+  {
+    /*
+     * 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)
+    {
+      ccd_performOperations (num_prolog_steps, prolog_step_ref, globs);
+    }
+    if (melem[e_ref].repType NEQ ' ')
+    {
+      is_variable = ccd_calculateRep (e_ref, &repeat, &max_rep, globs);
+    }
+  }
+    /*
+     * Element is not a SPARE. Setup the struct pointer
+     */
+    globs->pstructOffs = melem[e_ref].structOffs;
+
+      
+      if (melem[e_ref].optional)
+      {
+        /*
+         * for optional elements we must set the valid-flag
+         * ??.
+         * Therefore we store the address of the valid flag.
+         */
+        *(globs->pstruct + globs->pstructOffs++) = TRUE;
+
+      }
+
+  globs->pstruct[globs->pstructOffs++] = (UBYTE) (bf_readBit(globs) == GET_HL_PREV(1));
+#ifdef DEBUG_CCD
+#ifdef CCD_SYMBOLS
+  TRACE_CCD (globs, "decoding var %s",ccddata_get_alias((USHORT) e_ref, 1));
+#else
+  TRACE_CCD (globs, "decoding var %d", melem[e_ref].elemRef);
+#endif
+#endif
+
+  return 1;
+}
+#endif /* !RUN_INT_RAM */
+
+#ifndef RUN_INT_RAM
+/*
++--------------------------------------------------------------------+
+| PROJECT : CCD (6144)              MODULE  : CDC_GSM                |
+| STATE   : code                    ROUTINE : cdc_hl_flag_encode     |
++--------------------------------------------------------------------+
+
+  PURPOSE : Encoding of the GSM Type HL_FLAG element. This element
+            consists of a single bit only. If the element is set to 1
+            a H bit will be coded. Otherwise a L bit will be coded if 
+            the element value to encode is set to 0.
+
+*/
+
+SHORT cdc_hl_flag_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
+{
+  ULONG  repeat=1, amount=1;
+  USHORT cSize = 0, startOffset;
+  ULONG  i;
+  ULONG  cix_ref, num_prolog_steps, prolog_step_ref;
+
+#ifdef DEBUG_CCD
+  #ifndef CCD_SYMBOLS
+  TRACE_CCD (globs, "cdc_hl_flag_encode()");
+  #else
+  TRACE_CCD (globs, "cdc_hl_flag_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 (cix_ref != 0)
+  {
+    /*
+     * 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)
+    {
+      ccd_performOperations (num_prolog_steps, prolog_step_ref, globs);
+    }
+  }
+
+  if (melem[e_ref].elemType NEQ 'S')
+  {
+    /*
+     * Element is not a SPARE.
+     * Setup the offset into the C-structure for this element
+     */
+    globs->pstructOffs = melem[e_ref].structOffs;
+
+    if (melem[e_ref].optional)
+    {
+      /*
+       * for optional elements check the valid-flag in the C-struct.
+       * Spare elements does not have a corresponding valid flag.
+       */
+      if (globs->pstruct[globs->pstructOffs++] == FALSE)
+      {
+        /*
+         * element is invalid so we must code a 0 bit
+         */
+        bf_writeBit (GET_HL(0), globs);
+
+        return 1;
+      }
+      
+      else
+      {
+#ifdef DEBUG_CCD
+        if (globs->pstruct [melem[e_ref].structOffs] != TRUE)
+        {
+          TRACE_CCD (globs, "Ambiguous value for valid flag!\n...assumed 1 for ccdID=%d",
+                     e_ref);
+        }
+#endif
+        /*
+         * element is valid so we must code a 1 bit
+         */
+        bf_writeBit (GET_HL(1), globs);
+      }
+    }
+
+    if (melem[e_ref].repType NEQ ' ')
+    {
+      /* As a default amount =1 due to initialization. */
+      if (melem[e_ref].repType EQ 'i')
+      {
+        /*
+         * for variable repeatable elements read the amount
+         * of repeats out of the C-Structure (c_xxx).
+         * If the number of repeats given by the C-Structure 
+         * exceeds the allowed value CCD gives a warning!
+         */
+        if (melem[e_ref].maxRepeat > 255)
+        {
+          ULONG count = (ULONG) (* (USHORT *)(globs->pstruct + globs->pstructOffs++));
+          repeat = MINIMUM (count, (ULONG) melem[e_ref].maxRepeat);
+          if (repeat < count) 
+            ccd_recordFault (globs, ERR_MAX_REPEAT, CONTINUE, 
+                             (USHORT) e_ref, globs->pstruct + globs->pstructOffs);
+        }
+        else
+        {
+          repeat = (ULONG) MINIMUM (globs->pstruct[globs->pstructOffs], 
+                                    melem[e_ref].maxRepeat);
+          if ( repeat < (ULONG)(globs->pstruct[globs->pstructOffs]) ) 
+            ccd_recordFault (globs, ERR_MAX_REPEAT, CONTINUE, 
+                             (USHORT) e_ref, globs->pstruct + globs->pstructOffs);
+        }
+        globs->pstructOffs++;
+      }
+      else
+      if (melem[e_ref].repType EQ 'v')
+      {
+        /*
+         * for variable repeatable elements read the amount
+         * of repeats out of the C-Structure (c_xxx).
+         * If the number of repetitions given by the C-Structure 
+         * exceeds the allowed value (maxRepeat) CCD gives a warning!
+         */
+        if (melem[e_ref].maxRepeat > 255)
+        {
+          ULONG count = (ULONG) (* (USHORT *)(globs->pstruct + globs->pstructOffs++));
+          amount = MINIMUM (count, (ULONG) melem[e_ref].maxRepeat);
+          if (amount < count) 
+            ccd_recordFault (globs, ERR_MAX_REPEAT, CONTINUE, 
+                             (USHORT) e_ref, globs->pstruct + globs->pstructOffs);
+        }
+        else
+        {
+          amount = (ULONG) MINIMUM (globs->pstruct[globs->pstructOffs], 
+                                    melem[e_ref].maxRepeat);
+          if ( amount < (ULONG) (globs->pstruct[globs->pstructOffs]) )
+            ccd_recordFault (globs, ERR_MAX_REPEAT, CONTINUE, 
+                             (USHORT) e_ref, globs->pstruct + globs->pstructOffs);
+        }
+        globs->pstructOffs++;
+      }
+      else
+      if (melem[e_ref].repType EQ 'c')
+      {
+        amount = (ULONG) melem[e_ref].maxRepeat;
+      }
+
+      if (melem[e_ref].repType EQ 'v' OR melem[e_ref].repType EQ 'i')
+      {
+        cSize = (USHORT)(((melem[e_ref].elemType EQ 'V')
+                         ? mvar[melem[e_ref].elemRef].cSize
+                         : mcomp[melem[e_ref].elemRef].cSize
+                        ));
+        startOffset = (USHORT) globs->pstructOffs;
+      }
+    }
+  
+    for (i=0; i < repeat; i++)
+    {
+      if (cSize)
+      {
+        /*
+         * calculate the offset if it is an array
+         */
+        globs->pstructOffs = (USHORT)(startOffset + (i * cSize));
+      }
+      /*
+       * encode the value
+       */
+      if (globs->pstruct[globs->pstructOffs++] EQ FALSE)
+      {
+        /*
+         * element is 0 so we must signalize L
+         */
+        bf_writeBit (GET_HL(0), globs);
+      }
+      else
+      {
+        /*
+         * element is 1 so we must signalize H
+         */
+        bf_writeBit (GET_HL(1), globs);
+      }
+      
+      globs->pstructOffs += mvar[melem[e_ref].elemRef].cSize;
+    }
+
+    if (melem[e_ref].repType EQ 'i')
+    {
+      /*
+       * for variable CNS1 fields we code a 0 flag to mark the end of the
+       * arrays
+       */
+      bf_writeBit (GET_HL(0), globs);
+    }
+  }
+
+  return 1;
+}
+#endif /* !RUN_INT_RAM */