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

Annotation of /yoda/event/CRC.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 5.1 - (hide annotations) (download)
Sat Feb 4 12:37:42 2006 UTC (18 years, 10 months ago) by kusanagi
Branch: MAIN
Changes since 5.0: +4 -4 lines
File MIME type: text/plain
Several new features in this release:
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 kusanagi 1.1 /****************************************************************************
2     * F i l e D a t a
3 kusanagi 5.1 * $Id: CRC.c,v 5.0 2005/08/29 09:45:48 Maurizio Nagni Exp $
4     * $Revision: 5.0 $
5     * $Date: 2005/08/29 09:45:48 $
6 kusanagi 1.1 * $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 kusanagi 5.1 * $Author: Maurizio Nagni $
12 kusanagi 1.1 * :
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