/[PAMELA software]/yoda/event/CRC.c
ViewVC logotype

Contents of /yoda/event/CRC.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 6.0 - (show annotations) (download)
Tue Feb 7 17:11:06 2006 UTC (18 years, 9 months ago) by kusanagi
Branch: MAIN
CVS Tags: YODA6_2/01, YODA6_2/00, YODA6_3/19, YODA6_3/18, YODA6_3/13, YODA6_3/12, YODA6_3/11, YODA6_3/10, YODA6_3/17, YODA6_3/16, YODA6_3/15, YODA6_3/14, YODA6_3/06, YODA6_1/00, YODA6_0/00, YODA6_3/04, YODA6_3/05, YODA6_3/20, YODA6_3/07, YODA6_3/00, YODA6_3/01, YODA6_3/02, YODA6_3/03, YODA6_3/08, YODA6_3/09, HEAD
Changes since 5.1: +4 -4 lines
File MIME type: text/plain
Several new features in this revision:
a) all the packets are conform to the Mass Memory Format specifications (http://people.roma2.infn.it/~cpu/Mass_Memory_Format.html)
b) unpacking either using the old files structure OR the new one file unpacking.
c) parametrized root files compression factor
d) deleting of the following packet: TofTest, TrkTest, TrkEvent.
e) the Tracker routines now work without the use of temp files.

The point a) allow Yoda to unpack in the root file all the packets generated by the CPU. According to the MassMemoryFormat; that is three possible data are available:

1) almost explicit structure of the packet (like for Log, Tracker, Mcmd, etc....);
2) dummy data collection structure (InitHeader, InitTrailer, CalibHeader, CalibTrailer);
3) just the data of the packet (almost all Alarm and Init procedures). The class regarding this packets have only one parameters, a TArrayC class, which contain the data-block included in the packet (tat is the data below the packet Header).

The point b) has been implemented as a consequence of an agreement about a more compact structure of the unpacked data. Up to now the structure of each unpacked data consisted of a folder, named after the packet type, and three files: xxx.Header.root, xxx.NamePacket.root, xxx.Registry.root.
Starting from this release YODA, by default will unpack the data in a unique root file. The structure of this file will consist of:
- several TTree(s) named after the packet type;
- into each TTree are foreseen three TBranche(s):
    - 'Header'  (the old xxx.Header.root file)
    - 'NameOfThePacket' (the old xxx.Event.root file or the xxx.Event.DETECTOR.root)
    - 'Registry' (the old xxx.Registry.root file)

Anyway is still possible, but deprecated, to unpack using the old structure, passing to the "yoda" command the optional parameter "-multifile"

The point c) has been implemented because is well know that writing time in a TTree is as much fast as much lower is the compression factor for the root file; anyway for a PAMELA dat file, a compression equal to 0 will generate a root file which will be more than two times the original size. To modify the compression parameter just add the optional parameter "-c [0-9]" to the yoda command line.

1 /****************************************************************************
2 * F i l e D a t a
3 * $Id: CRC.c,v 5.1 2006/02/04 12:37:42 kusanagi Exp $
4 * $Revision: 5.1 $
5 * $Date: 2006/02/04 12:37:42 $
6 * $RCSfile: CRC.c,v $
7 *
8 ****************************************************************************
9 * S W D e v e l o p m e n t E n v i r o n m e n t
10 *
11 * $Author: kusanagi $
12 * :
13 ****************************************************************************
14 * U p d a t i n g
15
16 *****************************************************************************/
17
18
19 /*============================= Include File ================================*/
20 #include <CRC.h>
21
22 /*============================ Global define ================================*/
23
24
25 /*============================== global types ==============================*/
26
27
28
29 /*****************************************************************************/
30 /*=========================== Structure define ==============================*/
31
32
33 /*****************************************************************************/
34 /*============================ Enumerate define =============================*/
35
36 /*****************************************************************************/
37
38 /*=== Common I N T E R N A L ==*/
39
40 /*****************************************************************************/
41
42 /*************************************************************************/
43 /* @Constant: Ccrc_lookup */
44 /* @Purpose : */
45 /* CRC-TABLE CRCINIT=0x0000 POLY=0x1021 CCITT V.41 */
46 /* */
47 /* @@ */
48 /*************************************************************************/
49
50 static const unsigned int Crc_lookup[256] = {
51 0x0000,0x1021,0x2042,0x3063,0x4084,0x50A5,0x60C6,0x70E7,
52 0x8108,0x9129,0xA14A,0xB16B,0xC18C,0xD1AD,0xE1CE,0xF1EF,
53 0x1231,0x0210,0x3273,0x2252,0x52B5,0x4294,0x72F7,0x62D6,
54 0x9339,0x8318,0xB37B,0xA35A,0xD3BD,0xC39C,0xF3FF,0xE3DE,
55 0x2462,0x3443,0x0420,0x1401,0x64E6,0x74C7,0x44A4,0x5485,
56 0xA56A,0xB54B,0x8528,0x9509,0xE5EE,0xF5CF,0xC5AC,0xD58D,
57 0x3653,0x2672,0x1611,0x0630,0x76D7,0x66F6,0x5695,0x46B4,
58 0xB75B,0xA77A,0x9719,0x8738,0xF7DF,0xE7FE,0xD79D,0xC7BC,
59 0x48C4,0x58E5,0x6886,0x78A7,0x0840,0x1861,0x2802,0x3823,
60 0xC9CC,0xD9ED,0xE98E,0xF9AF,0x8948,0x9969,0xA90A,0xB92B,
61 0x5AF5,0x4AD4,0x7AB7,0x6A96,0x1A71,0x0A50,0x3A33,0x2A12,
62 0xDBFD,0xCBDC,0xFBBF,0xEB9E,0x9B79,0x8B58,0xBB3B,0xAB1A,
63 0x6CA6,0x7C87,0x4CE4,0x5CC5,0x2C22,0x3C03,0x0C60,0x1C41,
64 0xEDAE,0xFD8F,0xCDEC,0xDDCD,0xAD2A,0xBD0B,0x8D68,0x9D49,
65 0x7E97,0x6EB6,0x5ED5,0x4EF4,0x3E13,0x2E32,0x1E51,0x0E70,
66 0xFF9F,0xEFBE,0xDFDD,0xCFFC,0xBF1B,0xAF3A,0x9F59,0x8F78,
67 0x9188,0x81A9,0xB1CA,0xA1EB,0xD10C,0xC12D,0xF14E,0xE16F,
68 0x1080,0x00A1,0x30C2,0x20E3,0x5004,0x4025,0x7046,0x6067,
69 0x83B9,0x9398,0xA3FB,0xB3DA,0xC33D,0xD31C,0xE37F,0xF35E,
70 0x02B1,0x1290,0x22F3,0x32D2,0x4235,0x5214,0x6277,0x7256,
71 0xB5EA,0xA5CB,0x95A8,0x8589,0xF56E,0xE54F,0xD52C,0xC50D,
72 0x34E2,0x24C3,0x14A0,0x0481,0x7466,0x6447,0x5424,0x4405,
73 0xA7DB,0xB7FA,0x8799,0x97B8,0xE75F,0xF77E,0xC71D,0xD73C,
74 0x26D3,0x36F2,0x0691,0x16B0,0x6657,0x7676,0x4615,0x5634,
75 0xD94C,0xC96D,0xF90E,0xE92F,0x99C8,0x89E9,0xB98A,0xA9AB,
76 0x5844,0x4865,0x7806,0x6827,0x18C0,0x08E1,0x3882,0x28A3,
77 0xCB7D,0xDB5C,0xEB3F,0xFB1E,0x8BF9,0x9BD8,0xABBB,0xBB9A,
78 0x4A75,0x5A54,0x6A37,0x7A16,0x0AF1,0x1AD0,0x2AB3,0x3A92,
79 0xFD2E,0xED0F,0xDD6C,0xCD4D,0xBDAA,0xAD8B,0x9DE8,0x8DC9,
80 0x7C26,0x6C07,0x5C64,0x4C45,0x3CA2,0x2C83,0x1CE0,0x0CC1,
81 0xEF1F,0xFF3E,0xCF5D,0xDF7C,0xAF9B,0xBFBA,0x8FD9,0x9FF8,
82 0x6E17,0x7E36,0x4E55,0x5E74,0x2E93,0x3EB2,0x0ED1,0x1EF0
83 };
84
85
86
87
88
89
90
91
92 /*****************************************************************************/
93 /*
94 * TRK_crc8_8
95 *
96 * calculate single 8 bit crc
97 *
98 * Input parameters:
99 * old = old value
100 * data = new value
101 * outcrc = pointer to calculated crc
102 *
103 * Output parameters: status_code
104 *
105 */
106 /*****************************************************************************/
107
108 typedef union {
109 BYTE word;
110
111 //#ifdef ERC32
112 /* ERC 32 arch is BIG endian */
113 /* struct bit_field_w
114 {
115 unsigned b7:1;
116 unsigned b6:1;
117 unsigned b5:1;
118 unsigned b4:1;
119 unsigned b3:1;
120 unsigned b2:1;
121 unsigned b1:1;
122 unsigned b0:1;
123 } bit;
124 #else*/
125 /* IA32 arch is LITTLE endian */
126 struct bit_field_w
127 {
128 unsigned b0:1;
129 unsigned b1:1;
130 unsigned b2:1;
131 unsigned b3:1;
132 unsigned b4:1;
133 unsigned b5:1;
134 unsigned b6:1;
135 unsigned b7:1;
136 } bit;
137 //#endif
138 } CM_crc8_8_word ;
139
140
141 #define CM_CRC8_8(old,data,crc,c,d,r) do { \
142 c.word = (old); \
143 d.word = (data); \
144 r.bit.b0 = c.bit.b0 ^ c.bit.b6 ^ c.bit.b7 ^ d.bit.b0 ^ d.bit.b6 ^ d.bit.b7; \
145 r.bit.b1 = c.bit.b0 ^ c.bit.b1 ^ c.bit.b6 ^ d.bit.b0 ^ d.bit.b1 ^ d.bit.b6; \
146 r.bit.b2 = c.bit.b0 ^ c.bit.b1 ^ c.bit.b2 ^ c.bit.b6 ^ d.bit.b0 ^ d.bit.b1 ^d.bit.b2 ^ d.bit.b6; \
147 r.bit.b3 = c.bit.b1 ^ c.bit.b2 ^ c.bit.b3 ^ c.bit.b7 ^ d.bit.b1 ^ d.bit.b2 ^d.bit.b3 ^ d.bit.b7; \
148 r.bit.b4 = c.bit.b2 ^ c.bit.b3 ^ c.bit.b4 ^ d.bit.b2 ^ d.bit.b3 ^ d.bit.b4; \
149 r.bit.b5 = c.bit.b3 ^ c.bit.b4 ^ c.bit.b5 ^ d.bit.b3 ^ d.bit.b4 ^ d.bit.b5; \
150 r.bit.b6 = c.bit.b4 ^ c.bit.b5 ^ c.bit.b6 ^ d.bit.b4 ^ d.bit.b5 ^ d.bit.b6; \
151 r.bit.b7 = c.bit.b5 ^ c.bit.b6 ^ c.bit.b7 ^ d.bit.b5 ^ d.bit.b6 ^ d.bit.b7; \
152 crc = r.word; \
153 } while(0)
154
155
156 BYTE CM_crc8_8(BYTE old,BYTE data) {
157 CM_crc8_8_word c,d,r;
158 BYTE Crc;
159
160 CM_CRC8_8(old,data,Crc,c,d,r);
161
162 return Crc;
163 }
164
165 /**
166 Compute a 8 CRC based over a \a buffer data of length \a length, whith a starting crc of \a oldcrc
167 and returns the 32 bit crc on the whole buffer
168 */
169 UINT32 CM_Compute_CRC8_8(UINT32 oldcrc /** the starting CRC value. changing this value also change the returning value. usually 0. */
170 ,BYTE *buffer /** the starting pointer to start crc computing */
171 ,UINT32 length /** the length in byte of the buffer */
172 )
173 {
174 int i;
175 BYTE tmpcrc,crc = oldcrc;
176 CM_crc8_8_word c,d,r;
177
178 for (i=0; i < length; i++) {
179 tmpcrc=crc;
180 CM_CRC8_8(tmpcrc,*buffer,crc,c,d,r);
181 buffer++;
182 }
183 return crc;
184 }
185
186
187 /*****************************************************************************/
188 /* @Function: CM_Crc16 */
189 /* @Purpose : */
190 /* This function calculates the CRC. */
191 /* */
192 /* @@ */
193 /* @Parameter Name @Mode @Description */
194 /* @@ */
195 /*****************************************************************************/
196
197 /* adrs_ptr: is BYTE*
198 * crc : is UINT16
199 */
200 #define CM_MACRO_CRC16(Crc16,adrs_ptr) do { \
201 Crc16 = \
202 (UINT32)(Crc16 << 8) ^ \
203 (UINT32)(Crc_lookup[ (UINT32) ( ((Crc16 >> 8) & 0xFF) ^ *adrs_ptr) ]); \
204 } while(0)
205
206 UINT16 CM_CRC16(BYTE* adrs, UINT16 Crc)
207 {
208 UINT32 Crc16Value=Crc;
209 // Calculating the CRC16 by using a LookUp table
210 CM_MACRO_CRC16(Crc16Value,adrs);
211 return ((UINT16)Crc16Value);
212 }
213
214 UINT16 CM_Compute_CRC16(UINT16 oldcrc,BYTE *buffer,UINT32 length) {
215 unsigned int i;
216 UINT32 Crc16Value=oldcrc;
217 for (i=0; i < length; i++) {
218 CM_MACRO_CRC16(Crc16Value,buffer);
219 buffer++;
220 }
221 return ((UINT16)Crc16Value);
222 }
223
224 BYTE* charToUnsignedChar(char *buffer, UINT32 length){
225 BYTE buff[length];
226 unsigned int i;
227 for (i=0; i < length; i++){
228 buff[i] = (BYTE)buffer[i];
229 }
230 return buff;
231 }
232

  ViewVC Help
Powered by ViewVC 1.1.23