fInComplete(0),
fDecodeIfCorruptedTrailer(kTRUE),
fIsDecoded(kFALSE),
- fIsFatalCorruptedTrailer(kTRUE)
+ fIsFatalCorruptedTrailer(kTRUE)
+ // fIsFirstChannelOfPayload(kTRUE)
{
// Default constructor
}
if( ((CheckPayloadTrailer() == kTRUE) || fDecodeIfCorruptedTrailer == kTRUE ) && (fSize > 32) )
{
- // fDDLBlockCnt = 0;
fOutBufferIndex = 0;
for(Int_t i = 0; i < fNDDLBlocks; i++)
DecodeLastDDLBlock();
fOutBufferIndex = fN40AltroWords*4 - 1;
-
- // DumpData(fOutBuffer, 400,4);
-
fIsDecoded = kTRUE;
return kTRUE;
}
}
+
+
Bool_t AliAltroDecoder::NextChannel(AliAltroData *altroDataPtr)
{
// Reads the next altro channel in the RCU payload after the RCU payload
if(fIsFatalCorruptedTrailer == kTRUE)
{
- // printf("\n AliAltroDecoder::NextChannel(), WARNING, attempt to decode badly corrupted data\n");
- // printf("\n AliAltroDecoder::NextChannel(), Please check on the return value (-1 if fataly corrupted) of the SetMemory() function\n");
return kFALSE;
}
if(fIsDecoded != kTRUE)
{
- // cout <<"AliAltroDecoder::NextChanne, WARNING, buffer was not decoded, decoding now.. "<< endl;
Decode();
}
// we are reading backwards, so the index is already 1 inside the block
if(fOutBufferIndex >= 7)
{
- if((fOutBuffer[fOutBufferIndex] << 4 ) | ((fOutBuffer[fOutBufferIndex-1] & 0x3c0) >> 6) == 0x2aaa)
+ if(((fOutBuffer[fOutBufferIndex] << 4 ) | ((fOutBuffer[fOutBufferIndex-1] & 0x3c0) >> 6)) == 0x2aaa)
{
altroDataPtr->SetIsComplete(kTRUE);
fComplete ++;
fOutBufferIndex --;
fNAltro10bitWords = ( (fOutBuffer[fOutBufferIndex] & 0x3f) << 4 ) | ((fOutBuffer[fOutBufferIndex -1] & (0xF << 6)) >> 6) ;
fOutBufferIndex --;
- altroDataPtr->SetHadd( ((fOutBuffer[fOutBufferIndex] & 0x3)) << 10 | ( fOutBuffer[fOutBufferIndex-1] ) );
+ altroDataPtr->SetHadd( ((fOutBuffer[fOutBufferIndex] & 0x3)) << 10 | ( fOutBuffer[fOutBufferIndex-1] ), fOutBufferIndex);
fOutBufferIndex --;
{
fOutBufferIndex = fOutBufferIndex - fNAltro10bitWords -(4 - fNAltro10bitWords%4);
}
-
if(fOutBufferIndex >= 0)
{
-
- //cout << " AliAltroDecoder::NextChannel fOutBufferIndex =" << fOutBufferIndex << endl;
- // printf( "AliAltroDecoder::NextChannel fOutBufferIndex = %d", fOutBufferIndex);
altroDataPtr->SetData( &fOutBuffer[fOutBufferIndex] );
- if(fOutBufferIndex > 0) fOutBufferIndex --;
+ fOutBufferIndex --;
altroDataPtr->SetDataSize( fNAltro10bitWords );
return kTRUE;
}
return kFALSE;
}
-
}
else
{
}
+
void AliAltroDecoder::PrintInfo(AliAltroData &altrodata, Int_t n, Int_t nPerLine)
{
// prints data and address information contained in altrodata
// Sets the pointer to the memory block that should be decoded
// Returns a negative value if an inconsistency in the data is detected
+ // fIsFirstChannelOfPayload = kTRUE;
+ int iRet = 0;
+ fIsDecoded = kFALSE;
+
if(dtaPtr == 0)
{
- printf("\nAliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size) FATAL ERROR, dtaPtr = ZERO !!!!!!!!!!!!\n");
- printf("Please check your code that you don't give a zero pointer to the decoder \n");
+ // printf("\nAliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size) FATAL ERROR, dtaPtr = ZERO !!!!!!!!!!!!\n");
+ // printf("Please check your code that you don't give a zero pointer to the decoder \n");
return -99;
}
- if (size<fkN32HeaderWords+4)
+ if ((Int_t)size<(fkN32HeaderWords+1)*4)
{
- printf("\nAliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size) FATAL ERROR, too little data (%d)\n", size);
- printf("Data buffer must contain the CDH and at least one 32bit RCU trailer word\n");
+ // printf("\nAliAltroDecoder::SetMemory(UChar_t *dtaPtr, UInt_t size) FATAL ERROR, too little data (%d)\n", size);
+ // printf("Data buffer must contain the CDH and at least one 32bit RCU trailer word\n");
return -99;
}
-
- int iRet = 0;
UInt_t tmpTrailerSize;
- fIsDecoded = kFALSE;
f8DtaPtr =dtaPtr;
fSize = size;
f8DtaPtr =f8DtaPtr + fSize;
}
+
+
+
+
+
+
void AliAltroDecoder::DecodeLastDDLBlock()
{
// Decode one 160 bit DDL block into 16 integers.
// In order to use the same decoding function (DecodeDDLBlock())
// a copy of the the last DDL block is made and
- // if the las block does not align with 160 bits then it is padded with zeroes
+ // if the last block does not align with 160 bits then it is padded with zeroes
for(Int_t i=0; i < f32LastDDLBlockSize; i++)
{
f32DtaPtr=(UInt_t*)(f8DtaPtr-fSize+f8PayloadSize+fkN32HeaderWords*4);
}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Int_t AliAltroDecoder::CopyBackward(Byte_t* pBuffer, Int_t bufferSize)
{
// Copy the original 10/40 bit encecoded data of the current channel.
// with the 8 LSBs of the decoded 10 bit word at the beginning of
// the current channel
//assert(*pSrc==fOutBuffer[currentIndex]&0xff);
- if (*pSrc==fOutBuffer[currentIndex]&0xff) {
+ if (*pSrc==(fOutBuffer[currentIndex]&0xff)) {
// try to verfify the length of the channel
UInt_t lenCheck=*(pSrc+iCopy+2)|(*(pSrc+iCopy+3)&0x3)<<8;
Int_t AliAltroDecoder::GetRCUTrailerSize() const
{
// Provide size of RCU trailer.
- if (!f8DtaPtr) return 0;
+ if (!f8DtaPtr || !fIsDecoded || fSize==0) return 0;
assert(fSize>(f8PayloadSize+fkN32HeaderWords*sizeof(UInt_t)));
return fSize-(f8PayloadSize+fkN32HeaderWords*sizeof(UInt_t));
}