line source
/*
+-----------------------------------------------------------------------------
| Project :
| Modul : bitfun.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 constants, types and global variables and bit
| stream manipulation functions for CCD
+-----------------------------------------------------------------------------
*/
#define __BITFUN_C__
#ifdef DEBUG_CCD
#include <stdio.h>
#endif
#include "typedefs.h"
#include "header.h"
#include "string.h"
#include "ccd_globs.h"
#include "bitfun.h"
#include "ccd.h"
EXTERN int abs(int);
#ifndef RUN_FLASH
/*
* For each bitlength between 0 and 32 this table contains the
* valid masks for right-justificated values
*/
const ULONG ccd_bitfun_mask[] =
{
0x00000000,
0x00000001, 0x00000003, 0x00000007, 0x0000000f,
0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff
};
/*
* Table of one-bit values (2^X)
*/
const UBYTE ccd_bitfun_shift[] =
{
128, 64, 32, 16, 8, 4, 2, 1
};
#else
extern const ULONG ccd_bitfun_mask[];
extern const UBYTE ccd_bitfun_shift[];
#endif
/*
* maschine-dependent implementation
* define M_INTEL or M_MOTOROLA dependend on the target system
*/
#ifdef M_INTEL
#define MSB_POS 1
#define LSB_POS 0
#define MSW_POS 2
#define LSW_POS 0
#else
#ifdef M_MOTOROLA
#define MSB_POS 0
#define LSB_POS 1
#define MSW_POS 0
#define LSW_POS 2
#endif
#endif
typedef union
{ /* Conversion structure */
UBYTE c[2]; /* 2 bytes <-> USHORT */
USHORT s;
}
t_conv16;
typedef union
{ /* Conversion structure */
UBYTE c[4]; /* 4 Byte <-> ULONG */
ULONG l;
}
t_conv32;
#ifndef RUN_FLASH
#ifdef DEBUG_CCD
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : ccd_BITIMAGE |
+--------------------------------------------------------------------+
PURPOSE : convert a ULONG value to a ascii-bitstring with the
length len.
*/
char *ccd_BITIMAGE (ULONG val, ULONG len, T_CCD_Globs *globs)
{
int i;
for (i=31; i >= 0; i--)
{
globs->buf [i] = (char)(val & 1)+'0';
val >>= 1;
}
globs->buf [32] = '\0';
return globs->buf+(32-len);
}
#endif
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : fmemcpy |
+--------------------------------------------------------------------+
PURPOSE : copies len bytes from source to dest
for FAR addresses.
*/
void fmemcpy (UBYTE * d, UBYTE *s, USHORT len)
{
while (len--)
*d++ = *s++;
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_writeBitChunk |
+--------------------------------------------------------------------+
PURPOSE : The global pointer globs->pstruct+globs->pstructOffs references
a buffer struct containing the len, offset and content
of a bitbuffer. This funtions copies the bits to the
bitstream buffer at the actual position.
*/
void bf_writeBitChunk (ULONG len, T_CCD_Globs *globs)
{
ULONG offs;
ULONG bytesToCopy=0;
signed char theShift;
U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
U8 ByteOffs = globs->byteoffs;
U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
/*
* Read the length of the buffer (the l_buf component) and
* compare it with the parameter given.
*/
len = MINIMUM (len, *((USHORT *)MsgStruct));
if (!len)
return;
bytesToCopy = (ULONG) ((len + ByteOffs + 7)>> 3);
offs = (ULONG)(*(USHORT *)(MsgStruct + 2));
theShift = (signed char) (offs - ByteOffs);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "reading 2+2+%ld bytes from struct %08X, writing %d bits at byte %d.%d",
bytesToCopy, MsgStruct + 4, len, globs->bytepos, globs->byteoffs);
#endif
if ((abs(theShift) & 7) EQ 0)
{
MsgStruct += (4+(offs>>3));
/*
* the bits in the Buffer are in the right position
* -> quick memcopy.
*/
/*
* write the first byte, clean the leading bits
*/
*MsgBuf |= (*MsgStruct & (UBYTE) ccd_bitfun_mask[8 - (offs&7)]);
/*
* copy the remaining bytes
*/
if (bytesToCopy)
{
memcpy ((UBYTE *) &MsgBuf[1],
MsgStruct + 1,
(size_t)bytesToCopy-1);
}
if ((ByteOffs+len)&7)
{
MsgBuf[bytesToCopy-1] &= ~ccd_bitfun_mask[8-((ByteOffs+len)&7)];
}
}
else
{
t_conv16 conv;
/*
* shift every single byte
*/
MsgStruct += (4+(offs>>3));
if (bytesToCopy > 1)
{
--bytesToCopy;
}
if (theShift > 0)
{
/*
* shift all bytes leftwise
*/
/*
* the first byte must be masked
*/
theShift &= 7;
conv.c[MSB_POS] = *MsgStruct++ & (UBYTE) ccd_bitfun_mask[8-(offs&7)];
conv.c[LSB_POS] = *MsgStruct;
conv.s <<= theShift;
*MsgBuf++ |= conv.c[MSB_POS];
*MsgBuf = conv.c[LSB_POS];
--bytesToCopy;
while (bytesToCopy)
{
conv.c[MSB_POS] = *MsgStruct++;
conv.c[LSB_POS] = *MsgStruct;
conv.s <<= theShift;
*MsgBuf++ |= conv.c[MSB_POS];
*MsgBuf = conv.c[LSB_POS];
--bytesToCopy;
}
conv.c[MSB_POS] = *MsgStruct++;
conv.c[LSB_POS] = *MsgStruct;
conv.s <<= theShift;
*MsgBuf |= conv.c[MSB_POS];
if ((ByteOffs+len)&7)
{
*MsgBuf &= ~ccd_bitfun_mask[8-((ByteOffs+len)&7)];
}
}
else
{
/*
* shift all bytes rightwise
*/
/*
* the first byte must be masked, we dont want to store the
* leading garbage before the valid bits
*/
theShift = (-theShift & 7);
conv.c[MSB_POS] = *MsgStruct++ & (UBYTE) ccd_bitfun_mask[8-(offs&7)];
conv.c[LSB_POS] = *MsgStruct;
conv.s >>= theShift;
*MsgBuf++ |= conv.c[MSB_POS];
*MsgBuf = conv.c[LSB_POS];
--bytesToCopy;
while (bytesToCopy)
{
conv.c[MSB_POS] = *MsgStruct++;
conv.c[LSB_POS] = *MsgStruct;
conv.s >>= theShift;
*MsgBuf++ |= conv.c[MSB_POS];
*MsgBuf = conv.c[LSB_POS];
--bytesToCopy;
}
conv.c[MSB_POS] = *MsgStruct++;
conv.c[LSB_POS] = *MsgStruct;
conv.s >>= theShift;
*MsgBuf |= conv.c[MSB_POS];
if ((ByteOffs+len)&7)
{
*MsgBuf &= ~ccd_bitfun_mask[8-((ByteOffs+len)&7)];
}
}
}
bf_incBitpos (len, globs);
globs->pstructOffs = MsgStruct - globs->pstruct - 1;
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_writeBits |
+--------------------------------------------------------------------+
PURPOSE : The pointer globs->pstruct + globs->pstructOffs refers to
a var in the message C-structure. This function writes the
numeric content of the var into the bit stream referenced
by globs->bitbuf. According to the required lenght
(len) the type of the var is interpreted as BYTE/SHORT
or LONG.
*/
void bf_writeBits (ULONG len, T_CCD_Globs *globs)
{
/*
* Bit field is given by its lenght, offset bit and buffer.
*/
if (len > 32)
{
bf_writeBitChunk (len, globs);
return;
}
else
{
UBYTE *MsgStruct = (UBYTE*)(globs->pstruct + globs->pstructOffs);
U8 ByteOffs = globs->byteoffs;
UBYTE *MsgBuf = (UBYTE*)(globs->bitbuf + globs->bytepos);
U32 wBits;
wBits = len + ByteOffs;
if (len > 24)
{
t_conv32 conv32;
UBYTE FirstByte;
conv32.l = *((ULONG *) MsgStruct);
conv32.l &= (ULONG) ccd_bitfun_mask[len];
conv32.l <<= (32-len);
FirstByte = conv32.c[MSW_POS + MSB_POS];
FirstByte >>= ByteOffs;
FirstByte &= (UBYTE) ccd_bitfun_mask[8-ByteOffs];
*MsgBuf++ |= FirstByte;
conv32.l <<= (8-ByteOffs);
*MsgBuf++ = conv32.c[MSW_POS + MSB_POS] ;
*MsgBuf++ = conv32.c[MSW_POS + LSB_POS] ;
*MsgBuf++ = conv32.c[LSW_POS + MSB_POS] ;
if (wBits > 32)
*MsgBuf = conv32.c[LSW_POS + LSB_POS] ;
}
/*
* Bit field given in a C variable is shorter than a USHORT.
*/
#ifdef DEBUG_CCD
TRACE_CCD (globs, "write %d bits at byte %d.%d", len, globs->bytepos, ByteOffs);
#endif
if (len > 8)
{
t_conv32 conv;
conv.l = (len > 16) ? *(ULONG *) MsgStruct
: (ULONG) * (USHORT *) MsgStruct;
conv.l &= ccd_bitfun_mask[len];
#ifdef DEBUG_CCD
TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE (conv.l, len, globs));
#endif
conv.l <<= (32 - wBits);
*MsgBuf |= conv.c[MSW_POS + MSB_POS];
MsgBuf[1] |= conv.c[MSW_POS + LSB_POS];
if (wBits > 16)
{
MsgBuf[2] |= conv.c[LSW_POS + MSB_POS];
if (wBits > 24)
{
MsgBuf[3] |= conv.c[LSW_POS + LSB_POS];
}
}
}
else
{
t_conv16 conv;
conv.s = (USHORT) (*MsgStruct);
conv.s &= (USHORT) ccd_bitfun_mask[len];
#ifdef DEBUG_CCD
TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG) conv.s, len, globs));
#endif
conv.s <<= (16 - wBits);
*MsgBuf |= conv.c[MSB_POS];
if (wBits > 8)
{
MsgBuf[1] |= conv.c[LSB_POS];
}
}
bf_incBitpos (len, globs);
}
}
#endif /* !RUN_FLASH */
#ifndef RUN_INT_RAM
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_writeBitStr_PER |
+--------------------------------------------------------------------+
PURPOSE : The pointer globs->pstruct + globs->pstructOffs refers to
a var in the message C-structure. This function writes the
numeric content of the var into the bit stream referenced
by globs->bitbuf.
*/
void bf_writeBitStr_PER (USHORT len, T_CCD_Globs *globs)
{
USHORT bytesToCopy;
t_conv16 Last2Bytes;
U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
U8 ByteOffs = globs->byteoffs;
U8 *MsgBuf;
MsgBuf = (U8*)(globs->bitbuf + globs->bytepos + ((ByteOffs + len) >> 3));
/*
* Store the data for a later compensation of buffer overwritting.
* bytepos is always greater than 1, since the first byte with bytepos=0
* is dedicated to message identifier.
*/
Last2Bytes.c[MSB_POS] = MsgBuf[0];
Last2Bytes.c[LSB_POS] = MsgBuf[1];
MsgBuf -= (ByteOffs + len) >> 3;
bytesToCopy = (len+7) >> 3;
#ifdef DEBUG_CCD
TRACE_CCD (globs, "copying %d byte(s) from struct 0x%08X, writing %d bits at byte %d.%d",
bytesToCopy, MsgStruct, len, globs->bytepos, globs->byteoffs);
{
int i=0;
int j=0;
char s[64], c[4];
int leftBytes = bytesToCopy;
TRACE_CCD (globs, " Bit string to be encoded:");
s[0] = '\0';
for (i = 0; leftBytes > 0 ; i++)
{
for (j = 0; (j < 16 && (leftBytes-- > 0)) ; j++)
{
sprintf(c, " %02x", *(MsgStruct+(16*i)+j));
strcat (s, c);
}
TRACE_CCD (globs, "%s", s);
s[0] = '\0';
}
}
#endif
/*
* The bits will be appended to the bit buffer at byte boundary.
*/
if (ByteOffs EQ 0)
{
/*
* CCD assumes that the bits to be copied are left adjusted
* int their place in the C-structure.
*/
memcpy ((UBYTE *) MsgBuf,
MsgStruct,
(size_t)bytesToCopy);
MsgBuf += bytesToCopy;
}
else
{
t_conv16 conv;
/*
* Write byte for byte while compensating non-zero value of globs->byteoffs.
*/
while (bytesToCopy--)
{
conv.c[MSB_POS] = *MsgStruct++;
conv.c[LSB_POS] = *MsgStruct;
conv.s >>= ByteOffs;
conv.s &= (USHORT) ccd_bitfun_mask[16-ByteOffs];
*MsgBuf++ |= conv.c[MSB_POS];
*MsgBuf |= conv.c[LSB_POS];
}
}
bf_incBitpos (len, globs);
/*
* Undo overwriting of bits which do not belong to the bit string.
*/
MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
MsgBuf[0] &= ~ccd_bitfun_mask[8-globs->byteoffs];
Last2Bytes.c[MSB_POS] &= (UBYTE) ccd_bitfun_mask[8-globs->byteoffs];
MsgBuf[0] |= Last2Bytes.c[MSB_POS];
MsgBuf[1] = Last2Bytes.c[LSB_POS];
}
#endif /* !RUN_INT_RAM */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_writePadBits |
+--------------------------------------------------------------------+
PURPOSE : The global pointer globs->bitbuf points to the bit stream
buffer. This function adds 0-7 zero bits to the bit stream
from the point globs->byteoffs refer to.
*/
void bf_writePadBits (T_CCD_Globs *globs)
{
if (globs->byteoffs NEQ 0)
{
globs->bitbuf[globs->bytepos] &=
(UBYTE) ~ccd_bitfun_mask[8-globs->byteoffs];
#ifdef DEBUG_CCD
TRACE_CCD (globs, "writing %d pad bit(s) at byte %d.%d",
8-globs->byteoffs, globs->bytepos, globs->byteoffs);
#endif
bf_incBitpos (8-globs->byteoffs, globs);
}
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_readBit |
+--------------------------------------------------------------------+
PURPOSE : The global pointer globs->bitbuf points to the bit stream
buffer. This function reads the bit to which the global
positioning pointers are pointing to.
*/
BOOL bf_readBit (T_CCD_Globs *globs)
{
UBYTE ret;
ret = globs->bitbuf[globs->bytepos] & ccd_bitfun_shift[globs->byteoffs];
bf_incBitpos (1, globs);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "reading 1 bit (%d) at byte %d.%d", (ret>0)?1:0, globs->bytepos, globs->byteoffs);
#endif
return (ret > 0);
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_writeBit |
+--------------------------------------------------------------------+
PURPOSE : The global pointer globs->bitbuf points to the bit stream
buffer. This function writes a given value into the bit
to which the global positioning pointers are pointing to.
*/
void bf_writeBit (BOOL Bit, T_CCD_Globs *globs)
{
globs->bitbuf[globs->bytepos] = Bit ? (globs->bitbuf[globs->bytepos] |
ccd_bitfun_shift[globs->byteoffs])
: (globs->bitbuf[globs->bytepos] & ~ccd_bitfun_shift[globs->byteoffs]);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "writing 1 bit (%d) at byte %d.%d", Bit, globs->bytepos, globs->byteoffs);
#endif
bf_incBitpos (1, globs);
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_rShift8Bit |
+--------------------------------------------------------------------+
PURPOSE : shifts a bitfield in the bitstream by 8 bits rightwise.
The function is used only for octet aligned types.
Hence offset is not involved in calculation.
*/
void bf_rShift8Bit
(
USHORT srcBitPos,
USHORT bitLen,
T_CCD_Globs *globs
)
{
register UBYTE bytesToCopy;
USHORT bytepos;
/*
* destination > source -> start with last byte
*/
bytepos = srcBitPos >> 3;
bytesToCopy = bitLen >> 3;
#ifdef DEBUG_CCD
TRACE_CCD (globs, "shifting %d bits rightwise for 8 bits", bitLen);
#endif
while (bytesToCopy)
{
globs->bitbuf[bytepos+bytesToCopy] = globs->bitbuf[bytepos+bytesToCopy-1];
bytesToCopy--;
}
globs->bitbuf[bytepos] = 0;
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_readBitChunk |
+--------------------------------------------------------------------+
PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
stores them to the T_MSGBUF struct, containig the len
the offset and a bitbuffer.
*/
void bf_readBitChunk (ULONG len, T_CCD_Globs *globs)
{
ULONG bytesToCopy;
U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
U8 ByteOffs = globs->byteoffs;
U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
*(U16*) (MsgStruct) = (U16) len;
MsgStruct += 2;
*(U16*) (MsgStruct) = (U16)ByteOffs;
MsgStruct += 2;
bytesToCopy = (ULONG) ((len >> 3)+(len&7?1:0)+(ByteOffs?1:0));
#ifdef DEBUG_CCD
TRACE_CCD (globs, "reading %ld bits from byte %d.%d, writing 2+2+%ld bytes to struct %08X",
len, globs->bytepos, globs->byteoffs, bytesToCopy, MsgStruct);
#endif
memcpy ((UBYTE *) MsgStruct,
MsgBuf,
(size_t)bytesToCopy);
#if 0
#ifdef DEBUG_CCD
{
int i;
for (i=0; i<bytesToCopy; i++)
{
TRACE_CCD (globs, "buf[%d] = 0x%02x", i, MsgStruct[i]);
}
}
#endif
#endif
/*
* cutoff the leading and trailing bits wich are obsolete
*/
*MsgStruct &= ccd_bitfun_mask [8-ByteOffs];
if ((len+ByteOffs)&7)
{
MsgStruct += (bytesToCopy-1);
*MsgStruct &= ~ccd_bitfun_mask [8-((len+ByteOffs)&7)];
}
#if 0
#ifdef DEBUG_CCD
{
int i;
for (i=0; i<bytesToCopy; i++)
{
TRACE_CCD (globs, "buf[%d] = 0x%02x", i, MsgStruct[i]);
}
}
#endif
#endif
bf_incBitpos (len, globs);
}
#endif /* !RUN_FLASH */
#ifndef RUN_INT_RAM
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_readBitStr_PER |
+--------------------------------------------------------------------+
PURPOSE : The pointer globs->pstruct + globs->pstructOffs refers to
a var in the message C-structure. This function reads len
bits from the bit stream (globs->bitbuf) and stores them
left adjusted to the bytes in the message C-structure.
*/
void bf_readBitStr_PER (USHORT len, T_CCD_Globs *globs)
{
USHORT bytesToCopy;
t_conv16 Last2Bytes;
U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
U8 *MsgStructEnd = (U8*)(globs->pstruct + globs->pstructOffs + (len >> 3));
U8 ByteOffs = globs->byteoffs;
U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
bytesToCopy = (len+7) >> 3;
/*
* Store the data for a later compensation of buffer overwritting.
*/
Last2Bytes.c[MSB_POS] = MsgStructEnd[0];
Last2Bytes.c[LSB_POS] = MsgStructEnd[1];
/*
* The bits will be read from the bit buffer at byte boundary.
*/
if (ByteOffs EQ 0)
{
#ifdef DEBUG_CCD
TRACE_CCD (globs, "reading %d bits from byte %d.%d, copying %d bytes to struct at 0x%08X",
len, globs->bytepos, globs->byteoffs, bytesToCopy, MsgStruct);
#endif
/*
* CCD assumes that the caller function needs the bit string to be
* left adjusted in the C-structure.
*/
memcpy ((UBYTE *) MsgStruct,//(globs->pstruct + globs->pstructOffs),
MsgBuf,
(size_t)bytesToCopy);
}
else
{
t_conv16 conv;
/*
* Read byte for byte while compensating the non-zero globs->byteoffs.
*/
while (bytesToCopy--)
{
conv.c[MSB_POS] = *MsgBuf++;
conv.c[LSB_POS] = *MsgBuf;
conv.s <<= ByteOffs;
conv.s &= (USHORT) ~ccd_bitfun_mask[8-(len&7)];
*MsgStruct++ = conv.c[MSB_POS];
*MsgStruct = conv.c[LSB_POS];
}
}
/*
* Undo overwriting in C-Structure. This is specially necessary
* for later reading of valid flags for optional elments.
*/
MsgStructEnd[0] &= (UBYTE) ~ccd_bitfun_mask[8-(len&7)];
Last2Bytes.c[MSB_POS] &= (UBYTE) ccd_bitfun_mask[8-(len&7)];
MsgStructEnd[0] |= Last2Bytes.c[MSB_POS];
MsgStructEnd[1] = Last2Bytes.c[LSB_POS];
#ifdef DEBUG_CCD
{
int i=0;
int j=0;
char s[64], c[4];
int leftBytes = (len+7) >> 3;;
MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
TRACE_CCD (globs, " Decoded bit string:");
s[0] = '\0';
for (i = 0; leftBytes > 0 ; i++)
{
for (j = 0; (j < 16 && (leftBytes-- > 0)) ; j++)
{
sprintf(c, " %02x", *(MsgStruct+(16*i)+j));
strcat (s, c);
}
TRACE_CCD (globs, "%s", s);
s[0] = '\0';
}
}
#endif
globs->pstructOffs += ((len+7) >> 3);
bf_incBitpos (len, globs);
}
#endif /* !RUN_INT_RAM */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_readBits |
+--------------------------------------------------------------------+
PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
stores them typed (dependent on the length) to vars in
the C-struct referenced by the global var
globs->pstruct+globs->pstructOff.
*/
void bf_readBits (ULONG len, T_CCD_Globs *globs)
{
/*
* Bit field is given by its lenght, offset bit and buffer.
*/
if (len > 32)
{
bf_readBitChunk (len, globs);
return;
}
else
{
t_conv16 conv16;
t_conv32 conv32;
U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
U8 ByteOffs = globs->byteoffs;
U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "reading %d bits form byte %d.%d,", len, globs->bytepos, globs->byteoffs);
#endif
/*
* Bit field is given in a C variable shorter than a USHORT.
*/
if (len <= 8)
{
if (globs->lastbytepos16 != globs->bytepos)
{
conv16.c[MSB_POS] = *MsgBuf++;
conv16.c[LSB_POS] = *MsgBuf;
globs->lastbytepos16 = globs->bytepos;
globs->last16Bit = conv16.s;
}
else
conv16.s = globs->last16Bit;
conv16.s >>= (16 - (ByteOffs + len));
conv16.s &= (USHORT) ccd_bitfun_mask[len];
*MsgStruct = (UBYTE) conv16.s;
#ifdef DEBUG_CCD
TRACE_CCD (globs, "writing 1 bytes (%0X) to struct %08X", *MsgStruct, MsgStruct);
#endif
}
else if (len + ByteOffs <= 32)
{
if (globs->lastbytepos32 != globs->bytepos)
{
conv32.c[MSW_POS + MSB_POS] = *MsgBuf++;
conv32.c[MSW_POS + LSB_POS] = *MsgBuf++;
conv32.c[LSW_POS + MSB_POS] = *MsgBuf++;
conv32.c[LSW_POS + LSB_POS] = *MsgBuf;
globs->lastbytepos32 = globs->bytepos;
globs->last32Bit = conv32.l;
}
else
conv32.l = globs->last32Bit;
conv32.l >>= (32 - (ByteOffs + len));
conv32.l &= ccd_bitfun_mask[len];
if (len > 16)
{
*((ULONG *) MsgStruct) = conv32.l;
#ifdef DEBUG_CCD
TRACE_CCD (globs, "writing 4 bytes (%08X) to struct %08X",
conv32.l,
MsgStruct);
#endif
}
else
{
*((USHORT *) MsgStruct) = (USHORT) conv32.l;
#ifdef DEBUG_CCD
TRACE_CCD (globs, "writing 2 bytes (%04X) to struct %08X",
(USHORT) conv32.l,
MsgStruct);
#endif
}
}
else
{
UBYTE FirstByte;
FirstByte = *MsgBuf++;
FirstByte <<= ByteOffs;
FirstByte &= (UBYTE) ~ccd_bitfun_mask[ByteOffs];
if (globs->lastbytepos32 != globs->bytepos)
{
conv32.c[MSW_POS + MSB_POS] = *MsgBuf++;
conv32.c[MSW_POS + LSB_POS] = *MsgBuf++;
conv32.c[LSW_POS + MSB_POS] = *MsgBuf++;
conv32.c[LSW_POS + LSB_POS] = *MsgBuf;
globs->lastbytepos32 = globs->bytepos;
globs->last32Bit = conv32.l;
}
else
{
conv32.l = globs->last32Bit;
}
if (!ByteOffs)
{
conv32.l >>= 8;
}
else
{
conv32.l >>= (8-ByteOffs);
}
conv32.c[MSW_POS + MSB_POS] &= (UBYTE) ccd_bitfun_mask[ByteOffs];
conv32.c[MSW_POS + MSB_POS] |= FirstByte;
conv32.l >>= (32-len);
conv32.l &= (ULONG) ccd_bitfun_mask[len];
*((ULONG *) MsgStruct) = conv32.l;
#ifdef DEBUG_CCD
TRACE_CCD ( globs, "writing 4 bytes (%08X) to struct %08X",
conv32.l,
MsgStruct);
#endif
}
bf_incBitpos (len, globs); return;
}
}
#endif /* !RUN_FLASH */
#ifndef RUN_INT_RAM
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_writeVal |
+--------------------------------------------------------------------+
PURPOSE : writes value into the next (bSize) bits of the air message
buffer(globs->bitbuf). This function does not use the data
in the C-structure. This is done by the caller function
while calculating value.
*/
void bf_writeVal (ULONG value, ULONG bSize, T_CCD_Globs *globs)
{
ULONG BitSum;
U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
U8 ByteOffs = globs->byteoffs;
#ifdef DEBUG_CCD
TRACE_CCD (globs, "writeVal %d bits at byte %d.%d", bSize, globs->bytepos, ByteOffs);
#endif
/*
* value will be written into a temporary buffer. This buffer will
* then be prepared for an ORing with the bit buffer of air message.
* BitSum is helpful to find out the right size for temporary buffer.
*/
BitSum = bSize + (ULONG)ByteOffs;
/*
* Write in 1 to 8 bits (bSize is 1-8).
*/
if (BitSum <= 8)
{
UBYTE TmpBuf;
#ifdef DEBUG_CCD
TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG)(value & ccd_bitfun_mask[bSize]), bSize, globs));
#endif
TmpBuf = (UBYTE) value;
TmpBuf &= (UBYTE) ccd_bitfun_mask[bSize];
TmpBuf <<= (8 - BitSum);
*MsgBuf |= TmpBuf;
}
else
{
/*
* Write in 9 to 16 bits (bSize is 9-16).
*/
if (BitSum <= 16)
{
t_conv16 conv;
conv.s = (USHORT) value;
conv.s &= (USHORT) ccd_bitfun_mask[bSize];
#ifdef DEBUG_CCD
TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG) conv.s, bSize, globs));
#endif
conv.s <<= (16 - BitSum);
MsgBuf[0] |= conv.c[MSB_POS];
MsgBuf[1] |= conv.c[LSB_POS];
}
/*
* Write in 17 to 25 bits (bSize is 17-25).
*/
else if (BitSum <= 32)
{
t_conv32 conv;
conv.l = value;
conv.l &= ccd_bitfun_mask[bSize];
#ifdef DEBUG_CCD
TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG)conv.l, bSize, globs));
#endif
conv.l <<= (32 - BitSum);
MsgBuf[0] |= conv.c[MSW_POS + MSB_POS];
MsgBuf[1] |= conv.c[MSW_POS + LSB_POS];
MsgBuf[2] |= conv.c[LSW_POS + MSB_POS];
if (BitSum > 24)
{
MsgBuf[3] |= conv.c[LSW_POS + LSB_POS];
}
}
/*
* Write in 25 to 32 bits (bSize is 25-32).
*/
else if ( BitSum < 40)
{
UBYTE FirstByte;
t_conv32 conv;
conv.l = value;
conv.l <<= (32 - bSize);
FirstByte = conv.c[MSW_POS + MSB_POS];
FirstByte >>= ByteOffs;
FirstByte &= (UBYTE) ccd_bitfun_mask[8-ByteOffs];
MsgBuf[0] |= FirstByte;
conv.l <<= (8 - ByteOffs);
MsgBuf[1] |= conv.c[MSW_POS + MSB_POS];
MsgBuf[2] |= conv.c[MSW_POS + LSB_POS];
MsgBuf[3] |= conv.c[LSW_POS + MSB_POS];
MsgBuf[4] |= conv.c[LSW_POS + LSB_POS];
#ifdef DEBUG_CCD
conv.l &= (ULONG) ~ccd_bitfun_mask[24-ByteOffs];
TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG) FirstByte, (ULONG)(8-ByteOffs), globs));
TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE (conv.l, (ULONG)(24-ByteOffs), globs));
#endif
}
/*
* This case is currently not supported.
* Integer values are written to and read from up to 32 bits.
*/
else
{
return;
}
}
bf_incBitpos (bSize, globs);
}
#endif /* !RUN_INT_RAM */
#ifndef RUN_INT_RAM
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_getBits |
+--------------------------------------------------------------------+
PURPOSE : reads len Bits from the Bitstream (globs->bitbuf) and
stores them in a variable. The caller function can now
interpret or process the content of the returned variable.
*/
ULONG bf_getBits (ULONG len, T_CCD_Globs *globs)
{
U8 ByteOffs = globs->byteoffs;
U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "reading %ld bits form byte %d.%d,", len, globs->bytepos, globs->byteoffs);
#endif
/*
* Read up to 8 bits from the air message buffer.
*/
if (len <= 8)
{
t_conv16 conv16;
if (globs->lastbytepos16 != globs->bytepos)
{
conv16.c[MSB_POS] = *MsgBuf++;
conv16.c[LSB_POS] = *MsgBuf;
globs->lastbytepos16 = globs->bytepos;
globs->last16Bit = conv16.s;
}
else
{
conv16.s = globs->last16Bit;
}
conv16.s >>= (16 - (ByteOffs + len));
conv16.s &= (USHORT) ccd_bitfun_mask[len];
#ifdef DEBUG_CCD
TRACE_CCD (globs, "read value: %d", conv16.s);
#endif
bf_incBitpos (len, globs);
return (ULONG) conv16.s;
}
/*
* Read between 8 and 24 bits from the air message buffer.
*/
else if (len <= 24)
{
t_conv32 conv32;
if (globs->lastbytepos32 != globs->bytepos)
{
conv32.c[MSW_POS + MSB_POS] = *MsgBuf++;
conv32.c[MSW_POS + LSB_POS] = *MsgBuf++;
conv32.c[LSW_POS + MSB_POS] = *MsgBuf++;
conv32.c[LSW_POS + LSB_POS] = *MsgBuf;
globs->lastbytepos32 = globs->bytepos;
globs->last32Bit = conv32.l;
}
else
{
conv32.l = globs->last32Bit;
}
conv32.l >>= (32 - (ByteOffs + len));
conv32.l &= ccd_bitfun_mask[len];
#ifdef DEBUG_CCD
TRACE_CCD (globs, "read value: %ld", conv32.l);
#endif
bf_incBitpos (len, globs);
return conv32.l;
}
/*
* Read between 24 and 32 bits from the air message buffer.
*/
else if ( len <= 32)
{
UBYTE FirstByte;
t_conv32 conv;
FirstByte = *MsgBuf++;
FirstByte <<= ByteOffs;
FirstByte &= (UBYTE) ~ccd_bitfun_mask[ByteOffs];
if (globs->lastbytepos32 != globs->bytepos)
{
conv.c[MSW_POS + MSB_POS] = *MsgBuf++;
conv.c[MSW_POS + LSB_POS] = *MsgBuf++;
conv.c[LSW_POS + MSB_POS] = *MsgBuf++;
conv.c[LSW_POS + LSB_POS] = *MsgBuf;
globs->lastbytepos32 = globs->bytepos;
globs->last32Bit = conv.l;
}
else
{
conv.l = globs->last32Bit;
}
if (!ByteOffs)
{
conv.l >>= 8;
}
else
{
conv.l >>= (8-ByteOffs);
}
conv.c[MSW_POS + MSB_POS] &= (UBYTE) ccd_bitfun_mask[ByteOffs];
conv.c[MSW_POS + MSB_POS] |= FirstByte;
conv.l >>= (32-len);
conv.l &= (ULONG) ccd_bitfun_mask[len];
#ifdef DEBUG_CCD
TRACE_CCD (globs, "read value: %ld", conv.l);
#endif
bf_incBitpos (len, globs);
return conv.l;
}
/*
* This case is currently not supported.
* Integer values are written to and read from up to 32 bits.
*/
else
{
return 0;
}
}
#endif /* !RUN_INT_RAM */
#ifndef RUN_INT_RAM
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_decodeLongNumber |
+--------------------------------------------------------------------+
PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
return this number as a 32 Bit number. The Position
of the readpointer of the bitstream is incremented by
the len.
*/
ULONG bf_decodeLongNumber (UBYTE len, T_CCD_Globs *globs)
{
U32 number;
t_conv16 conv16;
t_conv32 conv32;
U8 ByteOffs = globs->byteoffs;
U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "reading %d bits form byte %d.%d,", len, globs->bytepos, globs->byteoffs);
#endif
if (len <= 8)
{
if (globs->lastbytepos16 != globs->bytepos)
{
conv16.c[MSB_POS] = *MsgBuf++;
conv16.c[LSB_POS] = *MsgBuf;
globs->lastbytepos16 = globs->bytepos;
globs->last16Bit = conv16.s;
}
else
conv16.s = globs->last16Bit;
conv16.s >>= (16 - (ByteOffs + len));
conv16.s &= (USHORT) ccd_bitfun_mask[len];
number = (ULONG) conv16.s;
}
else
{
if (globs->lastbytepos32 != globs->bytepos)
{
conv32.c[MSW_POS + MSB_POS] = *MsgBuf++;
conv32.c[MSW_POS + LSB_POS] = *MsgBuf++;
conv32.c[LSW_POS + MSB_POS] = *MsgBuf++;
conv32.c[LSW_POS + LSB_POS] = *MsgBuf;
globs->lastbytepos32 = globs->bytepos;
globs->last32Bit = conv32.l;
}
else
conv32.l = globs->last32Bit;
conv32.l >>= (32 - (ByteOffs + len));
conv32.l &= ccd_bitfun_mask[len];
number = conv32.l;
}
bf_incBitpos (len, globs);
#ifdef DEBUG_CCD
TRACE_CCD (globs, " (%08X)", number);
#endif
return number;
}
#endif /* !RUN_INT_RAM */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_decodeShortNumber|
+--------------------------------------------------------------------+
PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
returns the resulting value as an ULONG.
*/
ULONG bf_decodeShortNumber (const ULONG len, T_CCD_Globs *globs)
{
UBYTE *p;
t_conv32 conv32;
p = globs->bitbuf + globs->bytepos;
conv32.c[MSW_POS + MSB_POS] = *p++;
conv32.c[MSW_POS + LSB_POS] = *p++;
conv32.c[LSW_POS + MSB_POS] = *p++;
conv32.c[LSW_POS + LSB_POS] = *p;
conv32.l >>= (32 - (globs->byteoffs + len));
conv32.l &= ccd_bitfun_mask[len];
bf_incBitpos (len, globs);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "reading %d bits as LONG (%d) at byte %d.%d", len, (ULONG) conv32.l, globs->bytepos, globs->byteoffs);
#endif
return (ULONG) conv32.l;
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_decodeByteNumber |
+--------------------------------------------------------------------+
PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
returns the resulting value as an UBYTE.
*/
UBYTE bf_decodeByteNumber (const ULONG len, T_CCD_Globs *globs)
{
UBYTE *p;
t_conv16 conv16;
p = globs->bitbuf + globs->bytepos;
conv16.c[MSB_POS] = *p++;
conv16.c[LSB_POS] = *p;
conv16.s >>= (16 - (globs->byteoffs + len));
conv16.s &= (USHORT) ccd_bitfun_mask[len];
bf_incBitpos (len, globs);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "reading %d bits as BYTE (%d) at byte %d.%d", len, (UBYTE) conv16.s, globs->bytepos, globs->byteoffs);
#endif
return (UBYTE) conv16.s;
}
#endif /* !RUN_FLASH */
#ifndef RUN_INT_RAM
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_codeShortNumber |
+--------------------------------------------------------------------+
PURPOSE : Converts the value (val) into a MSB/LSB-Bitstring and
writes it to the aktual position into the bitstream
globs->bitbuf. The maximum value of (len) is 16.
If the value of (val) is greater then (2^len)-1 it
will be truncated.
*/
void bf_codeShortNumber (UBYTE len, USHORT val, T_CCD_Globs *globs)
{
UBYTE *p;
t_conv32 conv32;
#ifdef DEBUG_CCD
TRACE_CCD (globs, "codeShortNumber: writing %d bits (.%s) at byte %d.%d",
len, ccd_BITIMAGE (val, (ULONG) len, globs), globs->bytepos, globs->byteoffs);
#endif
p = globs->bitbuf + globs->bytepos;
conv32.l = (ULONG) val;
conv32.l <<= (32 - len - globs->byteoffs);
*p++ |= conv32.c[MSW_POS + MSB_POS];
*p = conv32.c[MSW_POS + LSB_POS];
if ((globs->byteoffs + len) > 16)
*++p = conv32.c[LSW_POS + MSB_POS];
bf_incBitpos (len, globs);
}
#endif /* !RUN_INT_RAM */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_recodeShortNumber|
+--------------------------------------------------------------------+
PURPOSE: Converts the value (val) into a MSB/LSB-Bitstring and
writes it at the position (pos) into the bitstream
globs->bitbuf. The rest of the bitstream and the actual
position will not changed. The maximum value of (len)
is 16.
If the value of (val) is greater then (2^len)-1
it will be truncated.
*/
void bf_recodeShortNumber (USHORT pos, UBYTE len, USHORT val, T_CCD_Globs *globs)
{
UBYTE *p;
USHORT oldbitpos;
t_conv32 conv32;
USHORT wBits;
oldbitpos = globs->bitpos;
bf_setBitpos (pos, globs);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "bf_recodeShortNumber:rewriting %d bits (.%s) at byte %d.%d",
len, ccd_BITIMAGE ((ULONG) val, len, globs), globs->bytepos, globs->byteoffs);
#endif
wBits = len + globs->byteoffs;
p = globs->bitbuf + globs->bytepos;
conv32.l = (ULONG) val;
conv32.l <<= (32 - wBits);
/*
* Since the bits to write are cleared (memclr) in the bitstream,
* it is ok to perform an OR operation on them.
*/
*p++ |= conv32.c[MSW_POS + MSB_POS];
if (wBits > 8)
{
*p++ |= conv32.c[MSW_POS + LSB_POS];
if (wBits > 16)
{
*p++ |= conv32.c[LSW_POS + MSB_POS];
if (wBits > 24)
*p |= conv32.c[LSW_POS + LSB_POS];
}
}
bf_setBitpos (oldbitpos, globs);
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_recodeByteNumber |
+--------------------------------------------------------------------+
PURPOSE: Converts the value (val) into a MSB/LSB-Bitstring and
writes it at the position (pos) into the bitstream
globs->bitbuf. The rest of the bitstream and the actual
position will not changed. The maximum value of (len)
is 8.
If the value of (val) is greater then (2^len)-1
it will be truncated.
*/
void bf_recodeByteNumber (USHORT pos, UBYTE len, UBYTE val, T_CCD_Globs *globs)
{
UBYTE *p;
USHORT oldbitpos;
t_conv16 conv16;
oldbitpos = globs->bitpos;
bf_setBitpos (pos, globs);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "bf_recodeByteNumber:rewriting %d bits (.%s) at byte %d.%d",
len, ccd_BITIMAGE ((ULONG) val, len, globs), globs->bytepos, globs->byteoffs);
#endif
p = globs->bitbuf + globs->bytepos;
conv16.s = (USHORT) val;
conv16.s <<= (16 - len - globs->byteoffs);
/*
* if the bits to write are cleared (memclr) in the bitstream
* we can perform an OR operation on it
*/
*p++ |= conv16.c[MSB_POS];
if ((len + globs->byteoffs) > 8)
*p |= conv16.c[LSB_POS];
bf_setBitpos (oldbitpos, globs);
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_recodeBit |
+--------------------------------------------------------------------+
PURPOSE: Writes the value of (Bit) at the position (pos)
into the bitstream globs->bitbuf. The rest of the bitstream
and the actual position will not changed.
*/
void bf_recodeBit (USHORT pos, UBYTE Bit, T_CCD_Globs *globs)
{
U16 oldbitpos = globs->bitpos;;
bf_setBitpos (pos, globs);
globs->bitbuf[globs->bytepos] = Bit ? (globs->bitbuf[globs->bytepos] |
ccd_bitfun_shift[globs->byteoffs])
: (globs->bitbuf[globs->bytepos] &
~ccd_bitfun_shift[globs->byteoffs]);
bf_setBitpos (oldbitpos, globs);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "recode 1 bit (.%d) at bitpos %d", Bit, pos);
#endif
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_codeByteNumber |
+--------------------------------------------------------------------+
PURPOSE: Converts the value (val) into a Bitstring with the
length (len) and writes it at the actual position
into the bitstream globs->bitbuf. The maximum value of
(len) is 8.
If the value is greater then (2^len)-1 it will be
truncated.
*/
void bf_codeByteNumber (UBYTE len, UBYTE val, T_CCD_Globs *globs)
{
UBYTE *p;
t_conv16 conv16;
#ifdef DEBUG_CCD
TRACE_CCD (globs, "codeByteNumber:writing %d bits (.%s) at byte %d.%d",
len, ccd_BITIMAGE (val, (ULONG) len, globs), globs->bytepos, globs->byteoffs);
#endif
p = globs->bitbuf + globs->bytepos;
conv16.s = (USHORT) val;
conv16.s <<= (16 - len - globs->byteoffs);
*p++ |= conv16.c[MSB_POS];
if ((globs->byteoffs + len) > 8)
*p |= conv16.c[LSB_POS];
bf_incBitpos (len, globs);
}
#endif /* !RUN_FLASH */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_codeLongNumber |
+--------------------------------------------------------------------+
PURPOSE : This funtion writes the numeric content of
the var to the aktual position into the bitstream
referenced by globs->bitbuf.
*/
void bf_codeLongNumber (UBYTE len, ULONG val, T_CCD_Globs *globs)
{
UBYTE wBits = len + globs->byteoffs;
U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
#ifdef DEBUG_CCD
TRACE_CCD (globs, "codeLongNumber: writing %d bits (.%s) at byte %d.%d",
len, ccd_BITIMAGE (val, (ULONG) len, globs), globs->bytepos, globs->byteoffs);
#endif
if (len > 8)
{
t_conv32 conv;
conv.l = val;
conv.l &= ccd_bitfun_mask[len];
conv.l <<= (32 - wBits);
MsgBuf[0] |= conv.c[MSW_POS + MSB_POS];
MsgBuf[1] = conv.c[MSW_POS + LSB_POS];
if (wBits > 16)
{
MsgBuf[2] = conv.c[LSW_POS + MSB_POS];
if (wBits > 24)
{
MsgBuf[3] = conv.c[LSW_POS + LSB_POS];
}
}
}
else
{
t_conv16 conv;
conv.s = (USHORT) val;
conv.s &= (USHORT) ccd_bitfun_mask[len];
conv.s <<= (16 - wBits);
MsgBuf[0] |= conv.c[MSB_POS];
if (wBits > 8)
{
MsgBuf[1] = conv.c[LSB_POS];
}
}
bf_incBitpos (len, globs);
}
#endif /* !RUN_FLASH */
#if 0 /* not used - maybe for the future */
#ifndef RUN_FLASH
/*
+--------------------------------------------------------------------+
| PROJECT : CCD (6144) MODULE : BITFUN |
| STATE : code ROUTINE : bf_swapBits |
+--------------------------------------------------------------------+
PURPOSE : reads (len) Bits from the Bitsream (1-8) and swap
this part with the next (len) bits in the bitstream.
The read/write pointer of the bitstream left unchanged.
This function is used for swapping the nibbles in some
ugly coded GSM messages.
*/
void bf_swapBits (ULONG len, T_CCD_Globs *globs)
{
UBYTE s1, s2;
USHORT s21;
USHORT startpos = globs->bitpos;
UBYTE *p;
t_conv32 conv32;
if (len > 0 AND len <= 8)
{
#ifdef DEBUG_CCD
TRACE_CCD (globs, "swapping %d bits", len);
#endif
/*
* read bitstring#1
*/
s1 = bf_decodeByteNumber (len, globs);
/*
* read bitstring#2
*/
s2 = bf_decodeByteNumber (len, globs);
/*
* concat bitstring#2 and bitstring#1
*/
s21 = (USHORT) s2 <<len;
s21 |= s1;
/*
* recode it into the bitstream
*/
bf_setBitpos (startpos, globs);
p = globs->bitbuf + globs->bytepos;
conv32.l = (ULONG) s21;
conv32.l <<= (32 - len) - globs->byteoffs;
*p++ |= conv32.c[MSW_POS + MSB_POS];
*p++ |= conv32.c[MSW_POS + LSB_POS];
*p++ |= conv32.c[LSW_POS + MSB_POS];
*p |= conv32.c[LSW_POS + LSB_POS];
bf_setBitpos (startpos, globs);
bf_recodeShortNumber (startpos, (UBYTE) (len<<1), s21, globs);
bf_setBitpos (startpos, globs);
}
}
#endif /* !RUN_FLASH */
#endif