comparison gsm-fw/ccd/bitfun.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
comparison
equal deleted inserted replaced
647:a60b375014e3 648:970d6199f2c5
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul : bitfun.c
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : Definition of constants, types and global variables and bit
18 | stream manipulation functions for CCD
19 +-----------------------------------------------------------------------------
20 */
21
22 #define __BITFUN_C__
23
24
25
26 #ifdef DEBUG_CCD
27 #include <stdio.h>
28 #endif
29
30 #include "typedefs.h"
31 #include "header.h"
32
33 #include "string.h"
34 #include "ccd_globs.h"
35 #include "bitfun.h"
36 #include "ccd.h"
37
38
39 EXTERN int abs(int);
40
41 #ifndef RUN_FLASH
42 /*
43 * For each bitlength between 0 and 32 this table contains the
44 * valid masks for right-justificated values
45 */
46
47 const ULONG ccd_bitfun_mask[] =
48 {
49 0x00000000,
50 0x00000001, 0x00000003, 0x00000007, 0x0000000f,
51 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
52 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
53 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
54 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
55 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
56 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
57 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff
58 };
59
60 /*
61 * Table of one-bit values (2^X)
62 */
63
64 const UBYTE ccd_bitfun_shift[] =
65 {
66 128, 64, 32, 16, 8, 4, 2, 1
67 };
68 #else
69 extern const ULONG ccd_bitfun_mask[];
70 extern const UBYTE ccd_bitfun_shift[];
71 #endif
72
73 /*
74 * maschine-dependent implementation
75 * define M_INTEL or M_MOTOROLA dependend on the target system
76 */
77
78 #ifdef M_INTEL
79 #define MSB_POS 1
80 #define LSB_POS 0
81 #define MSW_POS 2
82 #define LSW_POS 0
83 #else
84 #ifdef M_MOTOROLA
85 #define MSB_POS 0
86 #define LSB_POS 1
87 #define MSW_POS 0
88 #define LSW_POS 2
89 #endif
90 #endif
91
92
93 typedef union
94 { /* Conversion structure */
95 UBYTE c[2]; /* 2 bytes <-> USHORT */
96 USHORT s;
97 }
98 t_conv16;
99
100 typedef union
101 { /* Conversion structure */
102 UBYTE c[4]; /* 4 Byte <-> ULONG */
103 ULONG l;
104 }
105 t_conv32;
106
107 #ifndef RUN_FLASH
108 #ifdef DEBUG_CCD
109 /*
110 +--------------------------------------------------------------------+
111 | PROJECT : CCD (6144) MODULE : BITFUN |
112 | STATE : code ROUTINE : ccd_BITIMAGE |
113 +--------------------------------------------------------------------+
114
115 PURPOSE : convert a ULONG value to a ascii-bitstring with the
116 length len.
117 */
118
119
120 char *ccd_BITIMAGE (ULONG val, ULONG len, T_CCD_Globs *globs)
121 {
122
123 int i;
124 for (i=31; i >= 0; i--)
125 {
126 globs->buf [i] = (char)(val & 1)+'0';
127 val >>= 1;
128 }
129 globs->buf [32] = '\0';
130
131 return globs->buf+(32-len);
132 }
133
134 #endif
135 #endif /* !RUN_FLASH */
136
137 #ifndef RUN_FLASH
138 /*
139 +--------------------------------------------------------------------+
140 | PROJECT : CCD (6144) MODULE : BITFUN |
141 | STATE : code ROUTINE : fmemcpy |
142 +--------------------------------------------------------------------+
143
144 PURPOSE : copies len bytes from source to dest
145 for FAR addresses.
146 */
147
148 void fmemcpy (UBYTE * d, UBYTE *s, USHORT len)
149 {
150 while (len--)
151 *d++ = *s++;
152 }
153 #endif /* !RUN_FLASH */
154
155 #ifndef RUN_FLASH
156 /*
157 +--------------------------------------------------------------------+
158 | PROJECT : CCD (6144) MODULE : BITFUN |
159 | STATE : code ROUTINE : bf_writeBitChunk |
160 +--------------------------------------------------------------------+
161
162 PURPOSE : The global pointer globs->pstruct+globs->pstructOffs references
163 a buffer struct containing the len, offset and content
164 of a bitbuffer. This funtions copies the bits to the
165 bitstream buffer at the actual position.
166 */
167
168 void bf_writeBitChunk (ULONG len, T_CCD_Globs *globs)
169 {
170 ULONG offs;
171 ULONG bytesToCopy=0;
172 signed char theShift;
173 U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
174 U8 ByteOffs = globs->byteoffs;
175 U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
176
177 /*
178 * Read the length of the buffer (the l_buf component) and
179 * compare it with the parameter given.
180 */
181 len = MINIMUM (len, *((USHORT *)MsgStruct));
182 if (!len)
183 return;
184 bytesToCopy = (ULONG) ((len + ByteOffs + 7)>> 3);
185 offs = (ULONG)(*(USHORT *)(MsgStruct + 2));
186 theShift = (signed char) (offs - ByteOffs);
187
188 #ifdef DEBUG_CCD
189 TRACE_CCD (globs, "reading 2+2+%ld bytes from struct %08X, writing %d bits at byte %d.%d",
190 bytesToCopy, MsgStruct + 4, len, globs->bytepos, globs->byteoffs);
191 #endif
192
193 if ((abs(theShift) & 7) EQ 0)
194 {
195 MsgStruct += (4+(offs>>3));
196 /*
197 * the bits in the Buffer are in the right position
198 * -> quick memcopy.
199 */
200 /*
201 * write the first byte, clean the leading bits
202 */
203 *MsgBuf |= (*MsgStruct & (UBYTE) ccd_bitfun_mask[8 - (offs&7)]);
204 /*
205 * copy the remaining bytes
206 */
207 if (bytesToCopy)
208 {
209 memcpy ((UBYTE *) &MsgBuf[1],
210 MsgStruct + 1,
211 (size_t)bytesToCopy-1);
212 }
213 if ((ByteOffs+len)&7)
214 {
215 MsgBuf[bytesToCopy-1] &= ~ccd_bitfun_mask[8-((ByteOffs+len)&7)];
216 }
217 }
218 else
219 {
220 t_conv16 conv;
221 /*
222 * shift every single byte
223 */
224 MsgStruct += (4+(offs>>3));
225 if (bytesToCopy > 1)
226 {
227 --bytesToCopy;
228 }
229 if (theShift > 0)
230 {
231 /*
232 * shift all bytes leftwise
233 */
234 /*
235 * the first byte must be masked
236 */
237 theShift &= 7;
238 conv.c[MSB_POS] = *MsgStruct++ & (UBYTE) ccd_bitfun_mask[8-(offs&7)];
239 conv.c[LSB_POS] = *MsgStruct;
240 conv.s <<= theShift;
241 *MsgBuf++ |= conv.c[MSB_POS];
242 *MsgBuf = conv.c[LSB_POS];
243 --bytesToCopy;
244
245 while (bytesToCopy)
246 {
247 conv.c[MSB_POS] = *MsgStruct++;
248 conv.c[LSB_POS] = *MsgStruct;
249 conv.s <<= theShift;
250 *MsgBuf++ |= conv.c[MSB_POS];
251 *MsgBuf = conv.c[LSB_POS];
252 --bytesToCopy;
253 }
254
255 conv.c[MSB_POS] = *MsgStruct++;
256 conv.c[LSB_POS] = *MsgStruct;
257 conv.s <<= theShift;
258 *MsgBuf |= conv.c[MSB_POS];
259
260 if ((ByteOffs+len)&7)
261 {
262 *MsgBuf &= ~ccd_bitfun_mask[8-((ByteOffs+len)&7)];
263 }
264 }
265 else
266 {
267 /*
268 * shift all bytes rightwise
269 */
270 /*
271 * the first byte must be masked, we dont want to store the
272 * leading garbage before the valid bits
273 */
274 theShift = (-theShift & 7);
275 conv.c[MSB_POS] = *MsgStruct++ & (UBYTE) ccd_bitfun_mask[8-(offs&7)];
276 conv.c[LSB_POS] = *MsgStruct;
277 conv.s >>= theShift;
278 *MsgBuf++ |= conv.c[MSB_POS];
279 *MsgBuf = conv.c[LSB_POS];
280 --bytesToCopy;
281
282 while (bytesToCopy)
283 {
284 conv.c[MSB_POS] = *MsgStruct++;
285 conv.c[LSB_POS] = *MsgStruct;
286 conv.s >>= theShift;
287 *MsgBuf++ |= conv.c[MSB_POS];
288 *MsgBuf = conv.c[LSB_POS];
289 --bytesToCopy;
290 }
291
292 conv.c[MSB_POS] = *MsgStruct++;
293 conv.c[LSB_POS] = *MsgStruct;
294 conv.s >>= theShift;
295 *MsgBuf |= conv.c[MSB_POS];
296
297 if ((ByteOffs+len)&7)
298 {
299 *MsgBuf &= ~ccd_bitfun_mask[8-((ByteOffs+len)&7)];
300 }
301 }
302 }
303 bf_incBitpos (len, globs);
304 globs->pstructOffs = MsgStruct - globs->pstruct - 1;
305 }
306 #endif /* !RUN_FLASH */
307
308 #ifndef RUN_FLASH
309 /*
310 +--------------------------------------------------------------------+
311 | PROJECT : CCD (6144) MODULE : BITFUN |
312 | STATE : code ROUTINE : bf_writeBits |
313 +--------------------------------------------------------------------+
314
315 PURPOSE : The pointer globs->pstruct + globs->pstructOffs refers to
316 a var in the message C-structure. This function writes the
317 numeric content of the var into the bit stream referenced
318 by globs->bitbuf. According to the required lenght
319 (len) the type of the var is interpreted as BYTE/SHORT
320 or LONG.
321 */
322
323 void bf_writeBits (ULONG len, T_CCD_Globs *globs)
324 {
325 /*
326 * Bit field is given by its lenght, offset bit and buffer.
327 */
328 if (len > 32)
329 {
330 bf_writeBitChunk (len, globs);
331 return;
332 }
333 else
334 {
335 UBYTE *MsgStruct = (UBYTE*)(globs->pstruct + globs->pstructOffs);
336 U8 ByteOffs = globs->byteoffs;
337 UBYTE *MsgBuf = (UBYTE*)(globs->bitbuf + globs->bytepos);
338 U32 wBits;
339
340 wBits = len + ByteOffs;
341
342 if (len > 24)
343 {
344 t_conv32 conv32;
345 UBYTE FirstByte;
346
347 conv32.l = *((ULONG *) MsgStruct);
348 conv32.l &= (ULONG) ccd_bitfun_mask[len];
349 conv32.l <<= (32-len);
350
351 FirstByte = conv32.c[MSW_POS + MSB_POS];
352 FirstByte >>= ByteOffs;
353 FirstByte &= (UBYTE) ccd_bitfun_mask[8-ByteOffs];
354 *MsgBuf++ |= FirstByte;
355
356 conv32.l <<= (8-ByteOffs);
357
358 *MsgBuf++ = conv32.c[MSW_POS + MSB_POS] ;
359 *MsgBuf++ = conv32.c[MSW_POS + LSB_POS] ;
360 *MsgBuf++ = conv32.c[LSW_POS + MSB_POS] ;
361
362 if (wBits > 32)
363 *MsgBuf = conv32.c[LSW_POS + LSB_POS] ;
364 }
365 /*
366 * Bit field given in a C variable is shorter than a USHORT.
367 */
368 #ifdef DEBUG_CCD
369 TRACE_CCD (globs, "write %d bits at byte %d.%d", len, globs->bytepos, ByteOffs);
370 #endif
371 if (len > 8)
372 {
373 t_conv32 conv;
374
375 conv.l = (len > 16) ? *(ULONG *) MsgStruct
376 : (ULONG) * (USHORT *) MsgStruct;
377 conv.l &= ccd_bitfun_mask[len];
378 #ifdef DEBUG_CCD
379 TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE (conv.l, len, globs));
380 #endif
381 conv.l <<= (32 - wBits);
382 *MsgBuf |= conv.c[MSW_POS + MSB_POS];
383 MsgBuf[1] |= conv.c[MSW_POS + LSB_POS];
384 if (wBits > 16)
385 {
386 MsgBuf[2] |= conv.c[LSW_POS + MSB_POS];
387 if (wBits > 24)
388 {
389 MsgBuf[3] |= conv.c[LSW_POS + LSB_POS];
390 }
391 }
392 }
393 else
394 {
395 t_conv16 conv;
396
397 conv.s = (USHORT) (*MsgStruct);
398 conv.s &= (USHORT) ccd_bitfun_mask[len];
399 #ifdef DEBUG_CCD
400 TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG) conv.s, len, globs));
401 #endif
402 conv.s <<= (16 - wBits);
403 *MsgBuf |= conv.c[MSB_POS];
404
405 if (wBits > 8)
406 {
407 MsgBuf[1] |= conv.c[LSB_POS];
408 }
409 }
410 bf_incBitpos (len, globs);
411 }
412 }
413 #endif /* !RUN_FLASH */
414
415 #ifndef RUN_INT_RAM
416 /*
417 +--------------------------------------------------------------------+
418 | PROJECT : CCD (6144) MODULE : BITFUN |
419 | STATE : code ROUTINE : bf_writeBitStr_PER |
420 +--------------------------------------------------------------------+
421
422 PURPOSE : The pointer globs->pstruct + globs->pstructOffs refers to
423 a var in the message C-structure. This function writes the
424 numeric content of the var into the bit stream referenced
425 by globs->bitbuf.
426 */
427
428 void bf_writeBitStr_PER (USHORT len, T_CCD_Globs *globs)
429 {
430 USHORT bytesToCopy;
431 t_conv16 Last2Bytes;
432 U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
433 U8 ByteOffs = globs->byteoffs;
434 U8 *MsgBuf;
435 MsgBuf = (U8*)(globs->bitbuf + globs->bytepos + ((ByteOffs + len) >> 3));
436 /*
437 * Store the data for a later compensation of buffer overwritting.
438 * bytepos is always greater than 1, since the first byte with bytepos=0
439 * is dedicated to message identifier.
440 */
441 Last2Bytes.c[MSB_POS] = MsgBuf[0];
442 Last2Bytes.c[LSB_POS] = MsgBuf[1];
443
444 MsgBuf -= (ByteOffs + len) >> 3;
445 bytesToCopy = (len+7) >> 3;
446
447 #ifdef DEBUG_CCD
448 TRACE_CCD (globs, "copying %d byte(s) from struct 0x%08X, writing %d bits at byte %d.%d",
449 bytesToCopy, MsgStruct, len, globs->bytepos, globs->byteoffs);
450 {
451 int i=0;
452 int j=0;
453 char s[64], c[4];
454 int leftBytes = bytesToCopy;
455
456 TRACE_CCD (globs, " Bit string to be encoded:");
457
458 s[0] = '\0';
459 for (i = 0; leftBytes > 0 ; i++)
460 {
461 for (j = 0; (j < 16 && (leftBytes-- > 0)) ; j++)
462 {
463 sprintf(c, " %02x", *(MsgStruct+(16*i)+j));
464 strcat (s, c);
465 }
466 TRACE_CCD (globs, "%s", s);
467 s[0] = '\0';
468 }
469 }
470 #endif
471
472 /*
473 * The bits will be appended to the bit buffer at byte boundary.
474 */
475 if (ByteOffs EQ 0)
476 {
477 /*
478 * CCD assumes that the bits to be copied are left adjusted
479 * int their place in the C-structure.
480 */
481 memcpy ((UBYTE *) MsgBuf,
482 MsgStruct,
483 (size_t)bytesToCopy);
484 MsgBuf += bytesToCopy;
485 }
486 else
487 {
488 t_conv16 conv;
489
490 /*
491 * Write byte for byte while compensating non-zero value of globs->byteoffs.
492 */
493 while (bytesToCopy--)
494 {
495 conv.c[MSB_POS] = *MsgStruct++;
496 conv.c[LSB_POS] = *MsgStruct;
497 conv.s >>= ByteOffs;
498 conv.s &= (USHORT) ccd_bitfun_mask[16-ByteOffs];
499 *MsgBuf++ |= conv.c[MSB_POS];
500 *MsgBuf |= conv.c[LSB_POS];
501 }
502 }
503
504 bf_incBitpos (len, globs);
505
506 /*
507 * Undo overwriting of bits which do not belong to the bit string.
508 */
509 MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
510 MsgBuf[0] &= ~ccd_bitfun_mask[8-globs->byteoffs];
511 Last2Bytes.c[MSB_POS] &= (UBYTE) ccd_bitfun_mask[8-globs->byteoffs];
512 MsgBuf[0] |= Last2Bytes.c[MSB_POS];
513 MsgBuf[1] = Last2Bytes.c[LSB_POS];
514
515 }
516 #endif /* !RUN_INT_RAM */
517
518 #ifndef RUN_FLASH
519 /*
520 +--------------------------------------------------------------------+
521 | PROJECT : CCD (6144) MODULE : BITFUN |
522 | STATE : code ROUTINE : bf_writePadBits |
523 +--------------------------------------------------------------------+
524
525 PURPOSE : The global pointer globs->bitbuf points to the bit stream
526 buffer. This function adds 0-7 zero bits to the bit stream
527 from the point globs->byteoffs refer to.
528 */
529
530 void bf_writePadBits (T_CCD_Globs *globs)
531 {
532 if (globs->byteoffs NEQ 0)
533 {
534 globs->bitbuf[globs->bytepos] &=
535 (UBYTE) ~ccd_bitfun_mask[8-globs->byteoffs];
536 #ifdef DEBUG_CCD
537 TRACE_CCD (globs, "writing %d pad bit(s) at byte %d.%d",
538 8-globs->byteoffs, globs->bytepos, globs->byteoffs);
539 #endif
540
541 bf_incBitpos (8-globs->byteoffs, globs);
542 }
543 }
544 #endif /* !RUN_FLASH */
545
546 #ifndef RUN_FLASH
547 /*
548 +--------------------------------------------------------------------+
549 | PROJECT : CCD (6144) MODULE : BITFUN |
550 | STATE : code ROUTINE : bf_readBit |
551 +--------------------------------------------------------------------+
552
553 PURPOSE : The global pointer globs->bitbuf points to the bit stream
554 buffer. This function reads the bit to which the global
555 positioning pointers are pointing to.
556 */
557
558 BOOL bf_readBit (T_CCD_Globs *globs)
559 {
560 UBYTE ret;
561
562 ret = globs->bitbuf[globs->bytepos] & ccd_bitfun_shift[globs->byteoffs];
563 bf_incBitpos (1, globs);
564 #ifdef DEBUG_CCD
565 TRACE_CCD (globs, "reading 1 bit (%d) at byte %d.%d", (ret>0)?1:0, globs->bytepos, globs->byteoffs);
566 #endif
567
568 return (ret > 0);
569 }
570 #endif /* !RUN_FLASH */
571
572 #ifndef RUN_FLASH
573 /*
574 +--------------------------------------------------------------------+
575 | PROJECT : CCD (6144) MODULE : BITFUN |
576 | STATE : code ROUTINE : bf_writeBit |
577 +--------------------------------------------------------------------+
578
579 PURPOSE : The global pointer globs->bitbuf points to the bit stream
580 buffer. This function writes a given value into the bit
581 to which the global positioning pointers are pointing to.
582 */
583
584 void bf_writeBit (BOOL Bit, T_CCD_Globs *globs)
585 {
586 globs->bitbuf[globs->bytepos] = Bit ? (globs->bitbuf[globs->bytepos] |
587 ccd_bitfun_shift[globs->byteoffs])
588 : (globs->bitbuf[globs->bytepos] & ~ccd_bitfun_shift[globs->byteoffs]);
589
590 #ifdef DEBUG_CCD
591 TRACE_CCD (globs, "writing 1 bit (%d) at byte %d.%d", Bit, globs->bytepos, globs->byteoffs);
592 #endif
593
594 bf_incBitpos (1, globs);
595 }
596 #endif /* !RUN_FLASH */
597
598 #ifndef RUN_FLASH
599 /*
600 +--------------------------------------------------------------------+
601 | PROJECT : CCD (6144) MODULE : BITFUN |
602 | STATE : code ROUTINE : bf_rShift8Bit |
603 +--------------------------------------------------------------------+
604
605 PURPOSE : shifts a bitfield in the bitstream by 8 bits rightwise.
606 The function is used only for octet aligned types.
607 Hence offset is not involved in calculation.
608 */
609 void bf_rShift8Bit
610 (
611 USHORT srcBitPos,
612 USHORT bitLen,
613 T_CCD_Globs *globs
614 )
615 {
616 register UBYTE bytesToCopy;
617 USHORT bytepos;
618
619 /*
620 * destination > source -> start with last byte
621 */
622 bytepos = srcBitPos >> 3;
623 bytesToCopy = bitLen >> 3;
624
625 #ifdef DEBUG_CCD
626 TRACE_CCD (globs, "shifting %d bits rightwise for 8 bits", bitLen);
627 #endif
628
629 while (bytesToCopy)
630 {
631 globs->bitbuf[bytepos+bytesToCopy] = globs->bitbuf[bytepos+bytesToCopy-1];
632 bytesToCopy--;
633 }
634 globs->bitbuf[bytepos] = 0;
635 }
636 #endif /* !RUN_FLASH */
637
638 #ifndef RUN_FLASH
639 /*
640 +--------------------------------------------------------------------+
641 | PROJECT : CCD (6144) MODULE : BITFUN |
642 | STATE : code ROUTINE : bf_readBitChunk |
643 +--------------------------------------------------------------------+
644
645 PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
646 stores them to the T_MSGBUF struct, containig the len
647 the offset and a bitbuffer.
648 */
649
650 void bf_readBitChunk (ULONG len, T_CCD_Globs *globs)
651 {
652 ULONG bytesToCopy;
653 U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
654 U8 ByteOffs = globs->byteoffs;
655 U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
656
657 *(U16*) (MsgStruct) = (U16) len;
658 MsgStruct += 2;
659 *(U16*) (MsgStruct) = (U16)ByteOffs;
660 MsgStruct += 2;
661 bytesToCopy = (ULONG) ((len >> 3)+(len&7?1:0)+(ByteOffs?1:0));
662
663 #ifdef DEBUG_CCD
664 TRACE_CCD (globs, "reading %ld bits from byte %d.%d, writing 2+2+%ld bytes to struct %08X",
665 len, globs->bytepos, globs->byteoffs, bytesToCopy, MsgStruct);
666 #endif
667 memcpy ((UBYTE *) MsgStruct,
668 MsgBuf,
669 (size_t)bytesToCopy);
670
671 #if 0
672 #ifdef DEBUG_CCD
673 {
674 int i;
675 for (i=0; i<bytesToCopy; i++)
676 {
677 TRACE_CCD (globs, "buf[%d] = 0x%02x", i, MsgStruct[i]);
678 }
679 }
680 #endif
681 #endif
682 /*
683 * cutoff the leading and trailing bits wich are obsolete
684 */
685 *MsgStruct &= ccd_bitfun_mask [8-ByteOffs];
686 if ((len+ByteOffs)&7)
687 {
688 MsgStruct += (bytesToCopy-1);
689 *MsgStruct &= ~ccd_bitfun_mask [8-((len+ByteOffs)&7)];
690 }
691
692 #if 0
693 #ifdef DEBUG_CCD
694 {
695 int i;
696 for (i=0; i<bytesToCopy; i++)
697 {
698 TRACE_CCD (globs, "buf[%d] = 0x%02x", i, MsgStruct[i]);
699 }
700 }
701 #endif
702 #endif
703 bf_incBitpos (len, globs);
704 }
705 #endif /* !RUN_FLASH */
706
707 #ifndef RUN_INT_RAM
708 /*
709 +--------------------------------------------------------------------+
710 | PROJECT : CCD (6144) MODULE : BITFUN |
711 | STATE : code ROUTINE : bf_readBitStr_PER |
712 +--------------------------------------------------------------------+
713
714 PURPOSE : The pointer globs->pstruct + globs->pstructOffs refers to
715 a var in the message C-structure. This function reads len
716 bits from the bit stream (globs->bitbuf) and stores them
717 left adjusted to the bytes in the message C-structure.
718 */
719
720 void bf_readBitStr_PER (USHORT len, T_CCD_Globs *globs)
721 {
722 USHORT bytesToCopy;
723 t_conv16 Last2Bytes;
724 U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
725 U8 *MsgStructEnd = (U8*)(globs->pstruct + globs->pstructOffs + (len >> 3));
726 U8 ByteOffs = globs->byteoffs;
727 U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
728
729 bytesToCopy = (len+7) >> 3;
730
731 /*
732 * Store the data for a later compensation of buffer overwritting.
733 */
734 Last2Bytes.c[MSB_POS] = MsgStructEnd[0];
735 Last2Bytes.c[LSB_POS] = MsgStructEnd[1];
736
737 /*
738 * The bits will be read from the bit buffer at byte boundary.
739 */
740 if (ByteOffs EQ 0)
741 {
742
743 #ifdef DEBUG_CCD
744 TRACE_CCD (globs, "reading %d bits from byte %d.%d, copying %d bytes to struct at 0x%08X",
745 len, globs->bytepos, globs->byteoffs, bytesToCopy, MsgStruct);
746 #endif
747
748 /*
749 * CCD assumes that the caller function needs the bit string to be
750 * left adjusted in the C-structure.
751 */
752 memcpy ((UBYTE *) MsgStruct,//(globs->pstruct + globs->pstructOffs),
753 MsgBuf,
754 (size_t)bytesToCopy);
755 }
756 else
757 {
758 t_conv16 conv;
759
760 /*
761 * Read byte for byte while compensating the non-zero globs->byteoffs.
762 */
763 while (bytesToCopy--)
764 {
765 conv.c[MSB_POS] = *MsgBuf++;
766 conv.c[LSB_POS] = *MsgBuf;
767 conv.s <<= ByteOffs;
768 conv.s &= (USHORT) ~ccd_bitfun_mask[8-(len&7)];
769 *MsgStruct++ = conv.c[MSB_POS];
770 *MsgStruct = conv.c[LSB_POS];
771 }
772 }
773
774 /*
775 * Undo overwriting in C-Structure. This is specially necessary
776 * for later reading of valid flags for optional elments.
777 */
778 MsgStructEnd[0] &= (UBYTE) ~ccd_bitfun_mask[8-(len&7)];
779 Last2Bytes.c[MSB_POS] &= (UBYTE) ccd_bitfun_mask[8-(len&7)];
780 MsgStructEnd[0] |= Last2Bytes.c[MSB_POS];
781 MsgStructEnd[1] = Last2Bytes.c[LSB_POS];
782
783 #ifdef DEBUG_CCD
784 {
785 int i=0;
786 int j=0;
787 char s[64], c[4];
788 int leftBytes = (len+7) >> 3;;
789
790 MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
791 TRACE_CCD (globs, " Decoded bit string:");
792
793 s[0] = '\0';
794 for (i = 0; leftBytes > 0 ; i++)
795 {
796 for (j = 0; (j < 16 && (leftBytes-- > 0)) ; j++)
797 {
798 sprintf(c, " %02x", *(MsgStruct+(16*i)+j));
799 strcat (s, c);
800 }
801 TRACE_CCD (globs, "%s", s);
802 s[0] = '\0';
803 }
804 }
805 #endif
806
807 globs->pstructOffs += ((len+7) >> 3);
808 bf_incBitpos (len, globs);
809 }
810 #endif /* !RUN_INT_RAM */
811
812 #ifndef RUN_FLASH
813 /*
814 +--------------------------------------------------------------------+
815 | PROJECT : CCD (6144) MODULE : BITFUN |
816 | STATE : code ROUTINE : bf_readBits |
817 +--------------------------------------------------------------------+
818
819 PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
820 stores them typed (dependent on the length) to vars in
821 the C-struct referenced by the global var
822 globs->pstruct+globs->pstructOff.
823 */
824
825 void bf_readBits (ULONG len, T_CCD_Globs *globs)
826 {
827 /*
828 * Bit field is given by its lenght, offset bit and buffer.
829 */
830 if (len > 32)
831 {
832 bf_readBitChunk (len, globs);
833 return;
834 }
835 else
836 {
837 t_conv16 conv16;
838 t_conv32 conv32;
839 U8 *MsgStruct = (U8*)(globs->pstruct + globs->pstructOffs);
840 U8 ByteOffs = globs->byteoffs;
841 U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
842
843 #ifdef DEBUG_CCD
844 TRACE_CCD (globs, "reading %d bits form byte %d.%d,", len, globs->bytepos, globs->byteoffs);
845 #endif
846
847 /*
848 * Bit field is given in a C variable shorter than a USHORT.
849 */
850 if (len <= 8)
851 {
852 if (globs->lastbytepos16 != globs->bytepos)
853 {
854 conv16.c[MSB_POS] = *MsgBuf++;
855 conv16.c[LSB_POS] = *MsgBuf;
856 globs->lastbytepos16 = globs->bytepos;
857 globs->last16Bit = conv16.s;
858 }
859 else
860 conv16.s = globs->last16Bit;
861 conv16.s >>= (16 - (ByteOffs + len));
862 conv16.s &= (USHORT) ccd_bitfun_mask[len];
863 *MsgStruct = (UBYTE) conv16.s;
864 #ifdef DEBUG_CCD
865 TRACE_CCD (globs, "writing 1 bytes (%0X) to struct %08X", *MsgStruct, MsgStruct);
866 #endif
867 }
868 else if (len + ByteOffs <= 32)
869 {
870 if (globs->lastbytepos32 != globs->bytepos)
871 {
872 conv32.c[MSW_POS + MSB_POS] = *MsgBuf++;
873 conv32.c[MSW_POS + LSB_POS] = *MsgBuf++;
874 conv32.c[LSW_POS + MSB_POS] = *MsgBuf++;
875 conv32.c[LSW_POS + LSB_POS] = *MsgBuf;
876 globs->lastbytepos32 = globs->bytepos;
877 globs->last32Bit = conv32.l;
878 }
879 else
880 conv32.l = globs->last32Bit;
881 conv32.l >>= (32 - (ByteOffs + len));
882 conv32.l &= ccd_bitfun_mask[len];
883 if (len > 16)
884 {
885 *((ULONG *) MsgStruct) = conv32.l;
886 #ifdef DEBUG_CCD
887 TRACE_CCD (globs, "writing 4 bytes (%08X) to struct %08X",
888 conv32.l,
889 MsgStruct);
890 #endif
891 }
892 else
893 {
894 *((USHORT *) MsgStruct) = (USHORT) conv32.l;
895 #ifdef DEBUG_CCD
896 TRACE_CCD (globs, "writing 2 bytes (%04X) to struct %08X",
897 (USHORT) conv32.l,
898 MsgStruct);
899 #endif
900 }
901 }
902 else
903 {
904 UBYTE FirstByte;
905
906 FirstByte = *MsgBuf++;
907 FirstByte <<= ByteOffs;
908 FirstByte &= (UBYTE) ~ccd_bitfun_mask[ByteOffs];
909
910 if (globs->lastbytepos32 != globs->bytepos)
911 {
912 conv32.c[MSW_POS + MSB_POS] = *MsgBuf++;
913 conv32.c[MSW_POS + LSB_POS] = *MsgBuf++;
914 conv32.c[LSW_POS + MSB_POS] = *MsgBuf++;
915 conv32.c[LSW_POS + LSB_POS] = *MsgBuf;
916 globs->lastbytepos32 = globs->bytepos;
917 globs->last32Bit = conv32.l;
918 }
919 else
920 {
921 conv32.l = globs->last32Bit;
922 }
923 if (!ByteOffs)
924 {
925 conv32.l >>= 8;
926 }
927 else
928 {
929 conv32.l >>= (8-ByteOffs);
930 }
931 conv32.c[MSW_POS + MSB_POS] &= (UBYTE) ccd_bitfun_mask[ByteOffs];
932 conv32.c[MSW_POS + MSB_POS] |= FirstByte;
933 conv32.l >>= (32-len);
934 conv32.l &= (ULONG) ccd_bitfun_mask[len];
935
936 *((ULONG *) MsgStruct) = conv32.l;
937 #ifdef DEBUG_CCD
938 TRACE_CCD ( globs, "writing 4 bytes (%08X) to struct %08X",
939 conv32.l,
940 MsgStruct);
941 #endif
942 }
943 bf_incBitpos (len, globs); return;
944 }
945 }
946 #endif /* !RUN_FLASH */
947
948 #ifndef RUN_INT_RAM
949 /*
950 +--------------------------------------------------------------------+
951 | PROJECT : CCD (6144) MODULE : BITFUN |
952 | STATE : code ROUTINE : bf_writeVal |
953 +--------------------------------------------------------------------+
954
955 PURPOSE : writes value into the next (bSize) bits of the air message
956 buffer(globs->bitbuf). This function does not use the data
957 in the C-structure. This is done by the caller function
958 while calculating value.
959 */
960 void bf_writeVal (ULONG value, ULONG bSize, T_CCD_Globs *globs)
961 {
962 ULONG BitSum;
963 U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
964 U8 ByteOffs = globs->byteoffs;
965
966 #ifdef DEBUG_CCD
967 TRACE_CCD (globs, "writeVal %d bits at byte %d.%d", bSize, globs->bytepos, ByteOffs);
968 #endif
969 /*
970 * value will be written into a temporary buffer. This buffer will
971 * then be prepared for an ORing with the bit buffer of air message.
972 * BitSum is helpful to find out the right size for temporary buffer.
973 */
974 BitSum = bSize + (ULONG)ByteOffs;
975
976 /*
977 * Write in 1 to 8 bits (bSize is 1-8).
978 */
979 if (BitSum <= 8)
980 {
981 UBYTE TmpBuf;
982
983 #ifdef DEBUG_CCD
984 TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG)(value & ccd_bitfun_mask[bSize]), bSize, globs));
985 #endif
986 TmpBuf = (UBYTE) value;
987 TmpBuf &= (UBYTE) ccd_bitfun_mask[bSize];
988 TmpBuf <<= (8 - BitSum);
989 *MsgBuf |= TmpBuf;
990 }
991 else
992 {
993 /*
994 * Write in 9 to 16 bits (bSize is 9-16).
995 */
996 if (BitSum <= 16)
997 {
998 t_conv16 conv;
999
1000 conv.s = (USHORT) value;
1001 conv.s &= (USHORT) ccd_bitfun_mask[bSize];
1002 #ifdef DEBUG_CCD
1003 TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG) conv.s, bSize, globs));
1004 #endif
1005 conv.s <<= (16 - BitSum);
1006 MsgBuf[0] |= conv.c[MSB_POS];
1007 MsgBuf[1] |= conv.c[LSB_POS];
1008 }
1009
1010 /*
1011 * Write in 17 to 25 bits (bSize is 17-25).
1012 */
1013 else if (BitSum <= 32)
1014 {
1015 t_conv32 conv;
1016
1017 conv.l = value;
1018 conv.l &= ccd_bitfun_mask[bSize];
1019 #ifdef DEBUG_CCD
1020 TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG)conv.l, bSize, globs));
1021 #endif
1022 conv.l <<= (32 - BitSum);
1023 MsgBuf[0] |= conv.c[MSW_POS + MSB_POS];
1024 MsgBuf[1] |= conv.c[MSW_POS + LSB_POS];
1025 MsgBuf[2] |= conv.c[LSW_POS + MSB_POS];
1026 if (BitSum > 24)
1027 {
1028 MsgBuf[3] |= conv.c[LSW_POS + LSB_POS];
1029 }
1030 }
1031 /*
1032 * Write in 25 to 32 bits (bSize is 25-32).
1033 */
1034 else if ( BitSum < 40)
1035 {
1036 UBYTE FirstByte;
1037 t_conv32 conv;
1038
1039 conv.l = value;
1040 conv.l <<= (32 - bSize);
1041 FirstByte = conv.c[MSW_POS + MSB_POS];
1042 FirstByte >>= ByteOffs;
1043 FirstByte &= (UBYTE) ccd_bitfun_mask[8-ByteOffs];
1044 MsgBuf[0] |= FirstByte;
1045
1046 conv.l <<= (8 - ByteOffs);
1047 MsgBuf[1] |= conv.c[MSW_POS + MSB_POS];
1048 MsgBuf[2] |= conv.c[MSW_POS + LSB_POS];
1049 MsgBuf[3] |= conv.c[LSW_POS + MSB_POS];
1050 MsgBuf[4] |= conv.c[LSW_POS + LSB_POS];
1051 #ifdef DEBUG_CCD
1052 conv.l &= (ULONG) ~ccd_bitfun_mask[24-ByteOffs];
1053 TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE ((ULONG) FirstByte, (ULONG)(8-ByteOffs), globs));
1054 TRACE_CCD (globs, " (.%s)", ccd_BITIMAGE (conv.l, (ULONG)(24-ByteOffs), globs));
1055 #endif
1056 }
1057 /*
1058 * This case is currently not supported.
1059 * Integer values are written to and read from up to 32 bits.
1060 */
1061 else
1062 {
1063 return;
1064 }
1065 }
1066
1067 bf_incBitpos (bSize, globs);
1068 }
1069 #endif /* !RUN_INT_RAM */
1070
1071 #ifndef RUN_INT_RAM
1072 /*
1073 +--------------------------------------------------------------------+
1074 | PROJECT : CCD (6144) MODULE : BITFUN |
1075 | STATE : code ROUTINE : bf_getBits |
1076 +--------------------------------------------------------------------+
1077
1078 PURPOSE : reads len Bits from the Bitstream (globs->bitbuf) and
1079 stores them in a variable. The caller function can now
1080 interpret or process the content of the returned variable.
1081 */
1082
1083 ULONG bf_getBits (ULONG len, T_CCD_Globs *globs)
1084 {
1085 U8 ByteOffs = globs->byteoffs;
1086 U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
1087
1088 #ifdef DEBUG_CCD
1089 TRACE_CCD (globs, "reading %ld bits form byte %d.%d,", len, globs->bytepos, globs->byteoffs);
1090 #endif
1091
1092 /*
1093 * Read up to 8 bits from the air message buffer.
1094 */
1095 if (len <= 8)
1096 {
1097 t_conv16 conv16;
1098
1099 if (globs->lastbytepos16 != globs->bytepos)
1100 {
1101 conv16.c[MSB_POS] = *MsgBuf++;
1102 conv16.c[LSB_POS] = *MsgBuf;
1103 globs->lastbytepos16 = globs->bytepos;
1104 globs->last16Bit = conv16.s;
1105 }
1106 else
1107 {
1108 conv16.s = globs->last16Bit;
1109 }
1110 conv16.s >>= (16 - (ByteOffs + len));
1111 conv16.s &= (USHORT) ccd_bitfun_mask[len];
1112 #ifdef DEBUG_CCD
1113 TRACE_CCD (globs, "read value: %d", conv16.s);
1114 #endif
1115 bf_incBitpos (len, globs);
1116 return (ULONG) conv16.s;
1117 }
1118
1119 /*
1120 * Read between 8 and 24 bits from the air message buffer.
1121 */
1122 else if (len <= 24)
1123 {
1124 t_conv32 conv32;
1125
1126 if (globs->lastbytepos32 != globs->bytepos)
1127 {
1128 conv32.c[MSW_POS + MSB_POS] = *MsgBuf++;
1129 conv32.c[MSW_POS + LSB_POS] = *MsgBuf++;
1130 conv32.c[LSW_POS + MSB_POS] = *MsgBuf++;
1131 conv32.c[LSW_POS + LSB_POS] = *MsgBuf;
1132 globs->lastbytepos32 = globs->bytepos;
1133 globs->last32Bit = conv32.l;
1134 }
1135 else
1136 {
1137 conv32.l = globs->last32Bit;
1138 }
1139 conv32.l >>= (32 - (ByteOffs + len));
1140 conv32.l &= ccd_bitfun_mask[len];
1141 #ifdef DEBUG_CCD
1142 TRACE_CCD (globs, "read value: %ld", conv32.l);
1143 #endif
1144 bf_incBitpos (len, globs);
1145 return conv32.l;
1146 }
1147
1148 /*
1149 * Read between 24 and 32 bits from the air message buffer.
1150 */
1151 else if ( len <= 32)
1152 {
1153 UBYTE FirstByte;
1154 t_conv32 conv;
1155
1156 FirstByte = *MsgBuf++;
1157 FirstByte <<= ByteOffs;
1158 FirstByte &= (UBYTE) ~ccd_bitfun_mask[ByteOffs];
1159
1160 if (globs->lastbytepos32 != globs->bytepos)
1161 {
1162 conv.c[MSW_POS + MSB_POS] = *MsgBuf++;
1163 conv.c[MSW_POS + LSB_POS] = *MsgBuf++;
1164 conv.c[LSW_POS + MSB_POS] = *MsgBuf++;
1165 conv.c[LSW_POS + LSB_POS] = *MsgBuf;
1166 globs->lastbytepos32 = globs->bytepos;
1167 globs->last32Bit = conv.l;
1168 }
1169 else
1170 {
1171 conv.l = globs->last32Bit;
1172 }
1173 if (!ByteOffs)
1174 {
1175 conv.l >>= 8;
1176 }
1177 else
1178 {
1179 conv.l >>= (8-ByteOffs);
1180 }
1181 conv.c[MSW_POS + MSB_POS] &= (UBYTE) ccd_bitfun_mask[ByteOffs];
1182 conv.c[MSW_POS + MSB_POS] |= FirstByte;
1183 conv.l >>= (32-len);
1184 conv.l &= (ULONG) ccd_bitfun_mask[len];
1185
1186 #ifdef DEBUG_CCD
1187 TRACE_CCD (globs, "read value: %ld", conv.l);
1188 #endif
1189 bf_incBitpos (len, globs);
1190 return conv.l;
1191 }
1192
1193 /*
1194 * This case is currently not supported.
1195 * Integer values are written to and read from up to 32 bits.
1196 */
1197 else
1198 {
1199 return 0;
1200 }
1201 }
1202 #endif /* !RUN_INT_RAM */
1203
1204 #ifndef RUN_INT_RAM
1205 /*
1206 +--------------------------------------------------------------------+
1207 | PROJECT : CCD (6144) MODULE : BITFUN |
1208 | STATE : code ROUTINE : bf_decodeLongNumber |
1209 +--------------------------------------------------------------------+
1210
1211 PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
1212 return this number as a 32 Bit number. The Position
1213 of the readpointer of the bitstream is incremented by
1214 the len.
1215 */
1216
1217 ULONG bf_decodeLongNumber (UBYTE len, T_CCD_Globs *globs)
1218 {
1219 U32 number;
1220 t_conv16 conv16;
1221 t_conv32 conv32;
1222 U8 ByteOffs = globs->byteoffs;
1223 U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
1224
1225 #ifdef DEBUG_CCD
1226 TRACE_CCD (globs, "reading %d bits form byte %d.%d,", len, globs->bytepos, globs->byteoffs);
1227 #endif
1228
1229 if (len <= 8)
1230 {
1231 if (globs->lastbytepos16 != globs->bytepos)
1232 {
1233 conv16.c[MSB_POS] = *MsgBuf++;
1234 conv16.c[LSB_POS] = *MsgBuf;
1235 globs->lastbytepos16 = globs->bytepos;
1236 globs->last16Bit = conv16.s;
1237 }
1238 else
1239 conv16.s = globs->last16Bit;
1240 conv16.s >>= (16 - (ByteOffs + len));
1241 conv16.s &= (USHORT) ccd_bitfun_mask[len];
1242 number = (ULONG) conv16.s;
1243 }
1244 else
1245 {
1246 if (globs->lastbytepos32 != globs->bytepos)
1247 {
1248 conv32.c[MSW_POS + MSB_POS] = *MsgBuf++;
1249 conv32.c[MSW_POS + LSB_POS] = *MsgBuf++;
1250 conv32.c[LSW_POS + MSB_POS] = *MsgBuf++;
1251 conv32.c[LSW_POS + LSB_POS] = *MsgBuf;
1252 globs->lastbytepos32 = globs->bytepos;
1253 globs->last32Bit = conv32.l;
1254 }
1255 else
1256 conv32.l = globs->last32Bit;
1257 conv32.l >>= (32 - (ByteOffs + len));
1258 conv32.l &= ccd_bitfun_mask[len];
1259 number = conv32.l;
1260 }
1261
1262 bf_incBitpos (len, globs);
1263
1264 #ifdef DEBUG_CCD
1265 TRACE_CCD (globs, " (%08X)", number);
1266 #endif
1267
1268 return number;
1269 }
1270 #endif /* !RUN_INT_RAM */
1271
1272 #ifndef RUN_FLASH
1273 /*
1274 +--------------------------------------------------------------------+
1275 | PROJECT : CCD (6144) MODULE : BITFUN |
1276 | STATE : code ROUTINE : bf_decodeShortNumber|
1277 +--------------------------------------------------------------------+
1278
1279 PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
1280 returns the resulting value as an ULONG.
1281 */
1282
1283 ULONG bf_decodeShortNumber (const ULONG len, T_CCD_Globs *globs)
1284 {
1285 UBYTE *p;
1286 t_conv32 conv32;
1287
1288 p = globs->bitbuf + globs->bytepos;
1289
1290 conv32.c[MSW_POS + MSB_POS] = *p++;
1291 conv32.c[MSW_POS + LSB_POS] = *p++;
1292 conv32.c[LSW_POS + MSB_POS] = *p++;
1293 conv32.c[LSW_POS + LSB_POS] = *p;
1294 conv32.l >>= (32 - (globs->byteoffs + len));
1295 conv32.l &= ccd_bitfun_mask[len];
1296 bf_incBitpos (len, globs);
1297 #ifdef DEBUG_CCD
1298 TRACE_CCD (globs, "reading %d bits as LONG (%d) at byte %d.%d", len, (ULONG) conv32.l, globs->bytepos, globs->byteoffs);
1299 #endif
1300 return (ULONG) conv32.l;
1301 }
1302 #endif /* !RUN_FLASH */
1303
1304 #ifndef RUN_FLASH
1305 /*
1306 +--------------------------------------------------------------------+
1307 | PROJECT : CCD (6144) MODULE : BITFUN |
1308 | STATE : code ROUTINE : bf_decodeByteNumber |
1309 +--------------------------------------------------------------------+
1310
1311 PURPOSE : reads (len) Bits from the Bitsream (globs->bitbuf) and
1312 returns the resulting value as an UBYTE.
1313 */
1314
1315 UBYTE bf_decodeByteNumber (const ULONG len, T_CCD_Globs *globs)
1316 {
1317 UBYTE *p;
1318 t_conv16 conv16;
1319
1320 p = globs->bitbuf + globs->bytepos;
1321
1322 conv16.c[MSB_POS] = *p++;
1323 conv16.c[LSB_POS] = *p;
1324 conv16.s >>= (16 - (globs->byteoffs + len));
1325 conv16.s &= (USHORT) ccd_bitfun_mask[len];
1326 bf_incBitpos (len, globs);
1327 #ifdef DEBUG_CCD
1328 TRACE_CCD (globs, "reading %d bits as BYTE (%d) at byte %d.%d", len, (UBYTE) conv16.s, globs->bytepos, globs->byteoffs);
1329 #endif
1330 return (UBYTE) conv16.s;
1331 }
1332 #endif /* !RUN_FLASH */
1333
1334 #ifndef RUN_INT_RAM
1335 /*
1336 +--------------------------------------------------------------------+
1337 | PROJECT : CCD (6144) MODULE : BITFUN |
1338 | STATE : code ROUTINE : bf_codeShortNumber |
1339 +--------------------------------------------------------------------+
1340
1341 PURPOSE : Converts the value (val) into a MSB/LSB-Bitstring and
1342 writes it to the aktual position into the bitstream
1343 globs->bitbuf. The maximum value of (len) is 16.
1344 If the value of (val) is greater then (2^len)-1 it
1345 will be truncated.
1346 */
1347
1348 void bf_codeShortNumber (UBYTE len, USHORT val, T_CCD_Globs *globs)
1349 {
1350 UBYTE *p;
1351 t_conv32 conv32;
1352
1353 #ifdef DEBUG_CCD
1354 TRACE_CCD (globs, "codeShortNumber: writing %d bits (.%s) at byte %d.%d",
1355 len, ccd_BITIMAGE (val, (ULONG) len, globs), globs->bytepos, globs->byteoffs);
1356 #endif
1357 p = globs->bitbuf + globs->bytepos;
1358 conv32.l = (ULONG) val;
1359 conv32.l <<= (32 - len - globs->byteoffs);
1360 *p++ |= conv32.c[MSW_POS + MSB_POS];
1361 *p = conv32.c[MSW_POS + LSB_POS];
1362 if ((globs->byteoffs + len) > 16)
1363 *++p = conv32.c[LSW_POS + MSB_POS];
1364 bf_incBitpos (len, globs);
1365 }
1366 #endif /* !RUN_INT_RAM */
1367
1368 #ifndef RUN_FLASH
1369 /*
1370 +--------------------------------------------------------------------+
1371 | PROJECT : CCD (6144) MODULE : BITFUN |
1372 | STATE : code ROUTINE : bf_recodeShortNumber|
1373 +--------------------------------------------------------------------+
1374
1375 PURPOSE: Converts the value (val) into a MSB/LSB-Bitstring and
1376 writes it at the position (pos) into the bitstream
1377 globs->bitbuf. The rest of the bitstream and the actual
1378 position will not changed. The maximum value of (len)
1379 is 16.
1380 If the value of (val) is greater then (2^len)-1
1381 it will be truncated.
1382 */
1383
1384 void bf_recodeShortNumber (USHORT pos, UBYTE len, USHORT val, T_CCD_Globs *globs)
1385 {
1386 UBYTE *p;
1387 USHORT oldbitpos;
1388 t_conv32 conv32;
1389 USHORT wBits;
1390
1391 oldbitpos = globs->bitpos;
1392 bf_setBitpos (pos, globs);
1393 #ifdef DEBUG_CCD
1394 TRACE_CCD (globs, "bf_recodeShortNumber:rewriting %d bits (.%s) at byte %d.%d",
1395 len, ccd_BITIMAGE ((ULONG) val, len, globs), globs->bytepos, globs->byteoffs);
1396 #endif
1397 wBits = len + globs->byteoffs;
1398 p = globs->bitbuf + globs->bytepos;
1399 conv32.l = (ULONG) val;
1400 conv32.l <<= (32 - wBits);
1401
1402 /*
1403 * Since the bits to write are cleared (memclr) in the bitstream,
1404 * it is ok to perform an OR operation on them.
1405 */
1406 *p++ |= conv32.c[MSW_POS + MSB_POS];
1407 if (wBits > 8)
1408 {
1409 *p++ |= conv32.c[MSW_POS + LSB_POS];
1410 if (wBits > 16)
1411 {
1412 *p++ |= conv32.c[LSW_POS + MSB_POS];
1413 if (wBits > 24)
1414 *p |= conv32.c[LSW_POS + LSB_POS];
1415 }
1416 }
1417
1418 bf_setBitpos (oldbitpos, globs);
1419 }
1420 #endif /* !RUN_FLASH */
1421
1422 #ifndef RUN_FLASH
1423 /*
1424 +--------------------------------------------------------------------+
1425 | PROJECT : CCD (6144) MODULE : BITFUN |
1426 | STATE : code ROUTINE : bf_recodeByteNumber |
1427 +--------------------------------------------------------------------+
1428
1429 PURPOSE: Converts the value (val) into a MSB/LSB-Bitstring and
1430 writes it at the position (pos) into the bitstream
1431 globs->bitbuf. The rest of the bitstream and the actual
1432 position will not changed. The maximum value of (len)
1433 is 8.
1434 If the value of (val) is greater then (2^len)-1
1435 it will be truncated.
1436 */
1437
1438 void bf_recodeByteNumber (USHORT pos, UBYTE len, UBYTE val, T_CCD_Globs *globs)
1439 {
1440 UBYTE *p;
1441 USHORT oldbitpos;
1442 t_conv16 conv16;
1443
1444 oldbitpos = globs->bitpos;
1445 bf_setBitpos (pos, globs);
1446 #ifdef DEBUG_CCD
1447 TRACE_CCD (globs, "bf_recodeByteNumber:rewriting %d bits (.%s) at byte %d.%d",
1448 len, ccd_BITIMAGE ((ULONG) val, len, globs), globs->bytepos, globs->byteoffs);
1449 #endif
1450 p = globs->bitbuf + globs->bytepos;
1451 conv16.s = (USHORT) val;
1452 conv16.s <<= (16 - len - globs->byteoffs);
1453 /*
1454 * if the bits to write are cleared (memclr) in the bitstream
1455 * we can perform an OR operation on it
1456 */
1457 *p++ |= conv16.c[MSB_POS];
1458 if ((len + globs->byteoffs) > 8)
1459 *p |= conv16.c[LSB_POS];
1460
1461 bf_setBitpos (oldbitpos, globs);
1462 }
1463 #endif /* !RUN_FLASH */
1464
1465 #ifndef RUN_FLASH
1466 /*
1467 +--------------------------------------------------------------------+
1468 | PROJECT : CCD (6144) MODULE : BITFUN |
1469 | STATE : code ROUTINE : bf_recodeBit |
1470 +--------------------------------------------------------------------+
1471
1472 PURPOSE: Writes the value of (Bit) at the position (pos)
1473 into the bitstream globs->bitbuf. The rest of the bitstream
1474 and the actual position will not changed.
1475 */
1476
1477 void bf_recodeBit (USHORT pos, UBYTE Bit, T_CCD_Globs *globs)
1478 {
1479 U16 oldbitpos = globs->bitpos;;
1480
1481 bf_setBitpos (pos, globs);
1482 globs->bitbuf[globs->bytepos] = Bit ? (globs->bitbuf[globs->bytepos] |
1483 ccd_bitfun_shift[globs->byteoffs])
1484 : (globs->bitbuf[globs->bytepos] &
1485 ~ccd_bitfun_shift[globs->byteoffs]);
1486 bf_setBitpos (oldbitpos, globs);
1487 #ifdef DEBUG_CCD
1488 TRACE_CCD (globs, "recode 1 bit (.%d) at bitpos %d", Bit, pos);
1489 #endif
1490 }
1491 #endif /* !RUN_FLASH */
1492
1493 #ifndef RUN_FLASH
1494 /*
1495 +--------------------------------------------------------------------+
1496 | PROJECT : CCD (6144) MODULE : BITFUN |
1497 | STATE : code ROUTINE : bf_codeByteNumber |
1498 +--------------------------------------------------------------------+
1499
1500 PURPOSE: Converts the value (val) into a Bitstring with the
1501 length (len) and writes it at the actual position
1502 into the bitstream globs->bitbuf. The maximum value of
1503 (len) is 8.
1504 If the value is greater then (2^len)-1 it will be
1505 truncated.
1506
1507 */
1508
1509 void bf_codeByteNumber (UBYTE len, UBYTE val, T_CCD_Globs *globs)
1510 {
1511 UBYTE *p;
1512 t_conv16 conv16;
1513
1514 #ifdef DEBUG_CCD
1515 TRACE_CCD (globs, "codeByteNumber:writing %d bits (.%s) at byte %d.%d",
1516 len, ccd_BITIMAGE (val, (ULONG) len, globs), globs->bytepos, globs->byteoffs);
1517 #endif
1518 p = globs->bitbuf + globs->bytepos;
1519
1520 conv16.s = (USHORT) val;
1521 conv16.s <<= (16 - len - globs->byteoffs);
1522 *p++ |= conv16.c[MSB_POS];
1523 if ((globs->byteoffs + len) > 8)
1524 *p |= conv16.c[LSB_POS];
1525 bf_incBitpos (len, globs);
1526 }
1527 #endif /* !RUN_FLASH */
1528
1529 #ifndef RUN_FLASH
1530 /*
1531 +--------------------------------------------------------------------+
1532 | PROJECT : CCD (6144) MODULE : BITFUN |
1533 | STATE : code ROUTINE : bf_codeLongNumber |
1534 +--------------------------------------------------------------------+
1535
1536 PURPOSE : This funtion writes the numeric content of
1537 the var to the aktual position into the bitstream
1538 referenced by globs->bitbuf.
1539 */
1540
1541 void bf_codeLongNumber (UBYTE len, ULONG val, T_CCD_Globs *globs)
1542 {
1543 UBYTE wBits = len + globs->byteoffs;
1544 U8 *MsgBuf = (U8*)(globs->bitbuf + globs->bytepos);
1545
1546 #ifdef DEBUG_CCD
1547 TRACE_CCD (globs, "codeLongNumber: writing %d bits (.%s) at byte %d.%d",
1548 len, ccd_BITIMAGE (val, (ULONG) len, globs), globs->bytepos, globs->byteoffs);
1549 #endif
1550
1551 if (len > 8)
1552 {
1553 t_conv32 conv;
1554
1555 conv.l = val;
1556 conv.l &= ccd_bitfun_mask[len];
1557 conv.l <<= (32 - wBits);
1558 MsgBuf[0] |= conv.c[MSW_POS + MSB_POS];
1559 MsgBuf[1] = conv.c[MSW_POS + LSB_POS];
1560 if (wBits > 16)
1561 {
1562 MsgBuf[2] = conv.c[LSW_POS + MSB_POS];
1563 if (wBits > 24)
1564 {
1565 MsgBuf[3] = conv.c[LSW_POS + LSB_POS];
1566 }
1567 }
1568 }
1569 else
1570 {
1571 t_conv16 conv;
1572
1573 conv.s = (USHORT) val;
1574 conv.s &= (USHORT) ccd_bitfun_mask[len];
1575 conv.s <<= (16 - wBits);
1576 MsgBuf[0] |= conv.c[MSB_POS];
1577 if (wBits > 8)
1578 {
1579 MsgBuf[1] = conv.c[LSB_POS];
1580 }
1581 }
1582
1583 bf_incBitpos (len, globs);
1584 }
1585 #endif /* !RUN_FLASH */
1586
1587 #if 0 /* not used - maybe for the future */
1588 #ifndef RUN_FLASH
1589 /*
1590 +--------------------------------------------------------------------+
1591 | PROJECT : CCD (6144) MODULE : BITFUN |
1592 | STATE : code ROUTINE : bf_swapBits |
1593 +--------------------------------------------------------------------+
1594
1595 PURPOSE : reads (len) Bits from the Bitsream (1-8) and swap
1596 this part with the next (len) bits in the bitstream.
1597 The read/write pointer of the bitstream left unchanged.
1598 This function is used for swapping the nibbles in some
1599 ugly coded GSM messages.
1600 */
1601
1602 void bf_swapBits (ULONG len, T_CCD_Globs *globs)
1603 {
1604 UBYTE s1, s2;
1605 USHORT s21;
1606 USHORT startpos = globs->bitpos;
1607 UBYTE *p;
1608 t_conv32 conv32;
1609
1610 if (len > 0 AND len <= 8)
1611 {
1612 #ifdef DEBUG_CCD
1613 TRACE_CCD (globs, "swapping %d bits", len);
1614 #endif
1615
1616 /*
1617 * read bitstring#1
1618 */
1619 s1 = bf_decodeByteNumber (len, globs);
1620 /*
1621 * read bitstring#2
1622 */
1623 s2 = bf_decodeByteNumber (len, globs);
1624 /*
1625 * concat bitstring#2 and bitstring#1
1626 */
1627 s21 = (USHORT) s2 <<len;
1628 s21 |= s1;
1629
1630 /*
1631 * recode it into the bitstream
1632 */
1633 bf_setBitpos (startpos, globs);
1634 p = globs->bitbuf + globs->bytepos;
1635 conv32.l = (ULONG) s21;
1636 conv32.l <<= (32 - len) - globs->byteoffs;
1637 *p++ |= conv32.c[MSW_POS + MSB_POS];
1638 *p++ |= conv32.c[MSW_POS + LSB_POS];
1639 *p++ |= conv32.c[LSW_POS + MSB_POS];
1640 *p |= conv32.c[LSW_POS + LSB_POS];
1641
1642 bf_setBitpos (startpos, globs);
1643 bf_recodeShortNumber (startpos, (UBYTE) (len<<1), s21, globs);
1644 bf_setBitpos (startpos, globs);
1645 }
1646 }
1647
1648 #endif /* !RUN_FLASH */
1649 #endif