FreeCalypso > hg > freecalypso-sw
diff gsm-fw/ccd/gsm5_v.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/gsm5_v.c Thu Sep 04 05:48:57 2014 +0000 @@ -0,0 +1,210 @@ +/* ++----------------------------------------------------------------------------- +| Project : +| Modul : gsm5_v.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 : Definition of encoding and decoding functions for GSM5_V 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_gsm5v_decode | ++--------------------------------------------------------------------+ + + PURPOSE : Decoding of the GSM Type 5V element. This element + consists of the not decoded bits of the bitstream. + In the target C-structure this element is a bitbuffer + (T_xxx_BUF) in wich the bitstream content are written. + +*/ + +SHORT cdc_gsm5v_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs) +{ +#ifdef DEBUG_CCD + #ifndef CCD_SYMBOLS + TRACE_CCD (globs, "cdc_gsm5v_decode()"); + #else + TRACE_CCD (globs, "cdc_gsm5v_decode() %s", ccddata_get_alias((USHORT) e_ref, 1)); + #endif +#endif + + if (globs->bitpos >= globs->buflen) + { + return 1; + } + else + { + ULONG cix_ref; + + cix_ref = melem[e_ref].calcIdxRef; + + /* + * if this element is conditional, check the condition + */ + if (calcidx[cix_ref].numCondCalcs NEQ 0 + AND ! ccd_conditionOK (e_ref, globs)) + { + return 1; + } + else + { + ULONG bits_to_read; + ULONG num_prolog_steps, prolog_step_ref; + + num_prolog_steps = calcidx[cix_ref].numPrologSteps; + prolog_step_ref = calcidx[cix_ref].prologStepRef; + + /* If there is a prologue given for this element, process it. */ + if (num_prolog_steps) + { + ccd_performOperations (num_prolog_steps, prolog_step_ref, globs); + } + + /* + * Setup the offset into the C-structure for this element + */ + globs->pstructOffs = melem[e_ref].structOffs; + + if (melem[e_ref].optional) + { + /* + * for optional elements set the valid-flag in the C-struct. + */ + globs->pstruct[globs->pstructOffs++] = TRUE; + } + + if (globs->maxBitpos < globs->buflen - 16*globs->numEOCPending) + { + ccd_recordFault (globs, ERR_LEN_MISMATCH, CONTINUE, (USHORT) e_ref, + globs->pstruct + globs->pstructOffs); + } + + bits_to_read = (ULONG)(globs->buflen - globs->bitpos - 16*globs->numEOCPending); + bf_readBitChunk (bits_to_read, globs); + } + } + + return 1; +} +#endif /* !RUN_INT_RAM */ + +#ifndef RUN_INT_RAM +/* ++--------------------------------------------------------------------+ +| PROJECT : CCD (6144) MODULE : CDC_GSM | +| STATE : code ROUTINE : cdc_gsm5v_encode | ++--------------------------------------------------------------------+ + + PURPOSE : Encoding of the GSM Type 5V element. This element + consists of the not decoded bits of the bitstream. + In the target C-structure this element is a bitbuffer + (T_xxx_BUF) from wich the bitstream content is read. + +*/ + +SHORT cdc_gsm5v_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs) +{ + ULONG cix_ref, num_prolog_steps, prolog_step_ref; + +#ifdef DEBUG_CCD + #ifndef CCD_SYMBOLS + TRACE_CCD (globs, "cdc_gsm5v_encode()"); + #else + TRACE_CCD (globs, "cdc_gsm5v_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) + { + ccd_performOperations (num_prolog_steps, prolog_step_ref, globs); + } + + /* + * 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) + { + return 1; + } +#ifdef DEBUG_CCD + else 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 + } + + bf_writeBitChunk (mvar[melem[e_ref].elemRef].bSize, globs); + + return 1; +} +#endif /* !RUN_INT_RAM */