1 #include "AliHLTDDLDecoder.h"
2 #include "AliHLTAltroData.h"
9 AliHLTDDLDecoder::AliHLTDDLDecoder() : f32DtaPtr(0), f8DtaPtr(0),fN32HeaderWords(8), fN32RcuTrailerWords(2), fNDDLBlocks(0),
10 fBufferPos(0), fN40AltroWords(0), fN40RcuAltroWords(0), fSize(0), fSegmentation(0),
11 f32LastDDLBlockSize(5), f32PayloadSize(0),fBufferIndex(0), fN10bitWords(0)
16 AliHLTDDLDecoder::~AliHLTDDLDecoder()
22 AliHLTDDLDecoder::CheckPayload()
24 if(fN40AltroWords != fN40RcuAltroWords)
38 AliHLTDDLDecoder::Decode()
43 if((CheckPayload() == true) && (fSize > 32) )
49 for(fI=0; fI < fNDDLBlocks; fI++)
61 cout <<"ERROR: data integrity check failed, discarding data" << endl;
62 cout << "Size of datablock is " << fSize << endl;
63 cout << "fN40AltroWords = " << fN40AltroWords << endl;
64 cout << "fN40RcuAltroWords = " << fN40RcuAltroWords << endl;
72 tmpMarker = (buffer[index] << 4 ) | ((buffer[index-1] & tmpMask) >> 6);
77 AliHLTDDLDecoder::NextChannel(AliHLTAltroData *altroDataPtr)
81 if(fBufferPos > fN32HeaderWords)
83 // tmp = GetMarker(fBuffer, fBufferPos);
85 if((fBuffer[fBufferPos] << 4 ) | ((fBuffer[fBufferPos-1] & 0x3c0) >> 6) == 0x2aaa)
87 altroDataPtr->fIsComplete = true;
92 altroDataPtr->fIsComplete = false;
94 printf("\nERROR!!!! marker = 0x%x\n", tmp);
97 // printf("\nmarker = 0x%x", GetMarker(fBuffer, fBufferPos));
102 // printf("\nmarker = 0x%x", tmp);
103 altroDataPtr->fIsComplete = true;
108 altroDataPtr->fIsComplete = false;
110 // printf("\nERROR!!!! marker = 0x%x\n", tmp);
115 fNAltro10bitWords = ( (fBuffer[fBufferPos] & 0x3f) << 4 ) | ((fBuffer[fBufferPos -1] & (0xF << 6)) >> 6) ;
117 fHadd = ((fBuffer[fBufferPos] & 0x3)) << 10 | ( fBuffer[fBufferPos-1] );
120 if(fNAltro10bitWords%4 == 0)
122 // altroDataPtr->fBunchPos = fBufferPos;
123 fBufferPos = fBufferPos - fNAltro10bitWords;
127 // altroDataPtr->fBunchPos = fBufferPos -(4 - fNAltro10bitWords%4);
128 fBufferPos = fBufferPos - fNAltro10bitWords -(4 - fNAltro10bitWords%4);
131 altroDataPtr->fData = &fBuffer[fBufferPos];
133 altroDataPtr->fDataSize = fNAltro10bitWords ;
134 altroDataPtr->fHadd = fHadd;
147 AliHLTDDLDecoder::NextBunch()
155 AliHLTDDLDecoder::GetFailureRate()
158 cout << "Number of Complete channles = " << fComplete <<endl;
159 cout << "Number of InComplete channles = " << fInComplete <<endl;
160 tmp = (100*(float)fInComplete)/((float)fComplete + (float)fInComplete);
162 cout <<"There are "<< tmp <<"% incomplete channels"<<endl;
168 AliHLTDDLDecoder::GetMarker(UInt_t *buffer, int index)
172 tmpMarker = (buffer[index] << 4 ) | ((buffer[index-1] & tmpMask) >> 6);
177 AliHLTDDLDecoder::PrintInfo(AliHLTAltroData &altrodata, int n, int nPerLine)
179 cout << "altrodata.fDataSize = " << altrodata.fDataSize << endl;
180 cout << "altrodata.fHadd = " << altrodata.fHadd <<endl;
181 for(int i= 0; i< n; i++)
183 if( (i%nPerLine == 0) && (i != 0) )
187 printf("%d\t", altrodata.fData[i]);
193 AliHLTDDLDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size)
197 f32PayloadSize = fSize/4 - (fN32HeaderWords + fN32RcuTrailerWords);
198 fN40AltroWords = (32*f32PayloadSize)/40;
199 f32LastDDLBlockSize = f32PayloadSize%DDL_32BLOCK_SIZE;
200 fNDDLBlocks = f32PayloadSize/5;
201 f8DtaPtr =f8DtaPtr + fSize;
202 f32DtaPtr = (UInt_t *) f8DtaPtr;
203 f32DtaPtr = f32DtaPtr - fN32RcuTrailerWords;
204 fN40RcuAltroWords = *f32DtaPtr;
205 f32DtaPtr = (UInt_t *)dtaPtr + fN32HeaderWords;
206 fBufferPos = fN40AltroWords*4 - 1;
210 AliHLTDDLDecoder::DecodeDDLBlock()
212 fBuffer[fBufferIndex] = *f32DtaPtr & 0x3ff; //s0
214 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xffc00) >> 10; //s1
216 fBuffer[fBufferIndex] = (*f32DtaPtr & 0x3ff00000) >> 20; //s2
218 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xc0000000) >> 30; //s3_1
220 fBuffer[fBufferIndex] = fBuffer[fBufferIndex] | ((*f32DtaPtr & 0xff) << 2); //s3_2
222 fBuffer[fBufferIndex] = (*f32DtaPtr & 0x3ff00) >> 8; //s4
224 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xffc0000) >> 18; //s5
226 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xf0000000) >> 28; //s6_1
228 fBuffer[fBufferIndex] = fBuffer[fBufferIndex] | ((*f32DtaPtr & 0x3f) << 4); //s6_2
230 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xffc0) >> 6; //s7
232 fBuffer[fBufferIndex] = (*f32DtaPtr & 0x3ff0000) >> 16; //s8
234 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xFC000000) >> 26; //s9_1
236 fBuffer[fBufferIndex] = fBuffer[fBufferIndex] | ((*f32DtaPtr & 0xf) << 6); //s9_2
238 fBuffer[fBufferIndex] = (*f32DtaPtr & 0x3ff0) >> 4; //s10
240 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xffc000) >> 14; //s11
242 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xff000000) >> 24; //s12_1
244 fBuffer[fBufferIndex] = fBuffer[fBufferIndex] | ((*f32DtaPtr & 0x3) << 8); //s12_2
246 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xffc) >> 2; //s13
248 fBuffer[fBufferIndex] = (*f32DtaPtr & 0x3ff000) >> 12; //s14
250 fBuffer[fBufferIndex] = (*f32DtaPtr & 0xffc00000) >> 22; //s15
251 fN10bitWords =fN10bitWords + 16 ;
258 AliHLTDDLDecoder::DecodeLastDDLBlock()
260 for(unsigned fI=0; fI < f32LastDDLBlockSize; fI++)
262 fDDLBlockDummy[fI] = *f32DtaPtr;
266 f32DtaPtr = fDDLBlockDummy;
272 AliHLTDDLDecoder::SetNTrailerWords(int n)
274 fN32RcuTrailerWords = n;