17 #include "interface/shared/frl_header.h"
18 #include "interface/shared/fed_header.h"
19 #include "interface/shared/fed_trailer.h"
20 #include "interface/shared/i2oXFunctionCodes.h"
21 #include "interface/evb/i2oEVBMsgs.h"
24 #include "xdaq/Application.h"
25 #include "toolbox/mem/Reference.h"
26 #include "xcept/tools.h"
32 #define FED_HCTRLID 0x50000000
33 #define FED_TCTRLID 0xa0000000
34 #define REAL_SOID_MASK 0x0003FF00
35 #define FED_RBIT_MASK 0x0000C004
47 bool FUResource::doFedIdCheck_ =
true;
48 bool FUResource::useEvmBoard_ =
true;
58 FUResource::FUResource(
UInt_t fuResourceId
61 , xdaq::Application *app)
63 , fuResourceId_(fuResourceId)
70 , nextEventWillHaveCRCError_(
false)
115 LOG4CPLUS_ERROR(
log_,
"Failed to release superFragHead: "
116 <<xcept::stdformat_exception_history(e));
147 LOG4CPLUS_WARN(
log_,
"THIS SHOULD *NEVER* HAPPEN!.");
154 MemRef_t* next=itBufRef->getNextReference();
155 itBufRef->setNextReference(0);
160 LOG4CPLUS_ERROR(
log_,
"EVENT LOST:"
161 <<xcept::stdformat_exception_history(e));
163 itBufRef->setNextReference(next);
177 oss<<
"Failed to mark super fragment in shared mem buffer."
187 oss<<
"Failed to mark fed in buffer."
205 if (iBlock_==nBlock_) {
210 I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME *
block=
211 (I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME*)bufRef->getDataLocation();
213 UInt_t iBlock =block->blockNb;
214 UInt_t nBlock =block->nbBlocksInSuperFragment;
215 UInt_t iSuperFrag =block->superFragmentNb;
216 UInt_t nSuperFrag =block->nbSuperFragmentsInEvent;
218 UInt_t fuResourceId=block->fuTransactionId;
219 UInt_t buResourceId=block->buResourceId;
220 UInt_t evtNumber =block->eventNumber;
222 oss <<
"TransId:" << fuResourceId <<
" BUResourceId:"
223 << buResourceId <<
" eventNumber:" << evtNumber <<
" ";
225 if (fuResourceId!=fuResourceId_) {
228 oss<<
"RU/FU fuResourceId mismatch."
229 <<
" Received:"<<fuResourceId
230 <<
" Expected:"<<fuResourceId_;
235 if (iBlock!=iBlock_) {
237 oss<<
"RU/FU block number mismatch."
238 <<
" Received:"<<iBlock
239 <<
" Expected:"<<iBlock_;
244 if (iSuperFrag!=iSuperFrag_) {
246 oss<<
"RU/FU superfragment number mismatch."
247 <<
" Received:"<<iSuperFrag
248 <<
" Expected:"<<iSuperFrag_;
258 if (nBlock!=nBlock_) {
260 oss<<
"RU/FU number of blocks mismatch."
261 <<
" Received:"<<nBlock
262 <<
" Expected:"<<nBlock_;
270 if (iBlock==0&&iSuperFrag==0) {
271 evtNumber_ =evtNumber;
272 buResourceId_=buResourceId;
273 nSuperFrag_ =nSuperFrag;
275 shmCell_->setEvtNumber(evtNumber);
276 shmCell_->setBuResourceId(buResourceId);
279 if(nSuperFrag_>nSuperFragMax_) {
281 oss<<
"Invalid maximum number of superfragments."
282 <<
" fuResourceId:"<<fuResourceId_
283 <<
" evtNumber:"<<evtNumber_
284 <<
" nSuperFrag:"<<nSuperFrag_
285 <<
" nSuperFragMax:"<<nSuperFragMax_;
293 if (evtNumber!=evtNumber_) {
295 oss<<
"RU/FU evtNumber mismatch."
296 <<
" Received:"<<evtNumber
297 <<
" Expected:"<<evtNumber_;
302 if (buResourceId!=buResourceId_) {
304 oss<<
"RU/FU buResourceId mismatch."
305 <<
" Received:"<<buResourceId
306 <<
" Expected:"<<buResourceId_;
311 if (nSuperFrag!=nSuperFrag_) {
313 oss<<
"RU/FU number of superfragments mismatch."
314 <<
" Received:"<<nSuperFrag
315 <<
" Expected:"<<nSuperFrag_;
323 checkDataBlockPayload(bufRef);
326 oss<<
"data block payload failed check."
327 <<
" evtNumber:"<<evtNumber_
328 <<
" buResourceId:"<<buResourceId_
329 <<
" iSuperFrag:"<<iSuperFrag_;
333 appendBlockToSuperFrag(bufRef);
339 bool lastBlockInSuperFrag=(iBlock==nBlock-1);
340 if (lastBlockInSuperFrag) {
345 fillSuperFragPayload();
349 oss<<
"Invalid super fragment."
350 <<
" evtNumber:"<<evtNumber_
351 <<
" buResourceId:"<<buResourceId_
352 <<
" iSuperFrag:"<<iSuperFrag_;
353 removeLastAppendedBlockFromSuperFrag();
363 oss<<
"Failed to release super fragment."
364 <<
" evtNumber:"<<evtNumber_
365 <<
" buResourceId:"<<buResourceId_
366 <<
" iSuperFrag:"<<iSuperFrag_;
388 frlh_t *frlHeader =0;
393 frameSize =
sizeof(I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME);
395 blockAddr =(
UChar_t*)bufRef->getDataLocation();
396 frlHeaderAddr=blockAddr+frameSize;
397 frlHeader =(frlh_t*)frlHeaderAddr;
399 I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME *
block
400 =(I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME*)blockAddr;
404 if(evtNumber_!=frlHeader->trigno) {
406 std::stringstream oss;
407 oss<<
"FRL header \"trigno\" does not match "
408 <<
"FU \"evtNumber\"."
409 <<
" trigno:"<<frlHeader->trigno
410 <<
" evtNumber:"<<evtNumber_;
416 if(block->eventNumber!=frlHeader->trigno) {
418 std::stringstream oss;
419 oss<<
"FRL header \"trigno\" does not match "
420 <<
"RU builder header \"eventNumber\"."
421 <<
" trigno:"<<frlHeader->trigno
422 <<
" eventNumber:"<<block->eventNumber;
428 if(block->blockNb!=frlHeader->segno) {
430 std::stringstream oss;
431 oss<<
"FRL header \"segno\" does not match"
432 <<
"RU builder header \"blockNb\"."
433 <<
" segno:"<<frlHeader->segno
434 <<
" blockNb:"<<block->blockNb;
440 if(block->blockNb!=iBlock_) {
442 std::stringstream oss;
443 oss<<
"Incorrect block number."
444 <<
" Expected:"<<iBlock_
445 <<
" Received:"<<block->blockNb;
451 bufSize =bufRef->getDataSize();
452 segSizeExpected=bufSize-frameSize-
sizeof(frlh_t);
453 segSize =frlHeader->segsize & FRL_SEGSIZE_MASK;
454 if(segSize!=segSizeExpected) {
456 std::stringstream oss;
457 oss<<
"FRL header segment size is not as expected."
458 <<
" Expected:"<<segSizeExpected
459 <<
" Received:"<<segSize;
465 bool fuLastBlockInSuperFrag =(block->blockNb==(block->nbBlocksInSuperFragment-1));
466 bool frlLastBlockInSuperFrag=((frlHeader->segsize & FRL_LAST_SEGM)!=0);
467 if (fuLastBlockInSuperFrag!=frlLastBlockInSuperFrag) {
469 std::stringstream oss;
470 oss<<
"FU / FRL header end-of-superfragment mismatch."
471 <<
" FU header:"<<fuLastBlockInSuperFrag
472 <<
" FRL header:"<<frlLastBlockInSuperFrag;
511 current->setNextReference(0);
522 frlh_t *frlHeader =0;
526 UInt_t frameSize=
sizeof(I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME);
530 blockAddr =(
UChar_t*)bufRef->getDataLocation();
531 frlHeaderAddr =blockAddr+frameSize;
532 frlHeader =(frlh_t*)frlHeaderAddr;
534 bufRef =bufRef->getNextReference();
542 oss<<
"Event size exceeds maximum size."
562 frlh_t *frlHeader =0;
568 blockAddr =(
UChar_t*)bufRef->getDataLocation();
569 frlHeaderAddr=blockAddr+
sizeof(I2O_EVENT_DATA_BLOCK_MESSAGE_FRAME);
570 fedAddr =frlHeaderAddr+
sizeof(frlh_t);
571 frlHeader =(frlh_t*)frlHeaderAddr;
572 nbBytes =frlHeader->segsize & FRL_SEGSIZE_MASK;
579 oss<<
"Reached end of buffer."
587 if (0==startPos) startPos=bufferPos;
590 bufRef=bufRef->getNextReference();
596 oss<<
"Failed to mark super fragment in shared mem buffer."
630 fedTrailerAddr=superFragAddr+superFragSize-
sizeof(
fedt_t);
632 while (fedTrailerAddr>superFragAddr) {
634 fedTrailer =(
fedt_t*)fedTrailerAddr;
636 sumOfFedSizes+=fedSize;
642 oss<<
"Missing FED trailer id."
648 fedHeaderAddr=fedTrailerAddr-fedSize+
sizeof(
fedt_t);
651 if(fedHeaderAddr<superFragAddr) {
654 oss<<
"FED header address out-of-bounds."
664 oss<<
"FED payload out-of-bounds."
670 fedHeader =(
fedh_t*)fedHeaderAddr;
676 oss<<
"Missing FED header id."
689 oss<<
"FU / FED evtNumber mismatch."
699 LOG4CPLUS_WARN(
log_,
"Invalid fedid. Data will still be logged"
708 LOG4CPLUS_ERROR(
log_,
"Duplicated fedid. Data will be lost for"
714 if (fedId<1024)
fedSize_[fedId]=fedSize;
742 std::ostringstream oss;
743 oss <<
"crc check failed."
748 LOG4CPLUS_INFO(
log_,oss.str());
750 sentinelException, oss.str());
751 app_->notifyQualified(
"error",sentinelException);
763 oss<<
"Failed to mark fed in buffer."
766 <<
" fedSize:"<<fedSize
767 <<
" fedAddr:0x"<<hex<<(
unsigned long)fedHeaderAddr<<dec;
772 fedTrailerAddr=fedTrailerAddr-fedSize;
776 if ((fedTrailerAddr+
sizeof(
fedh_t))!=superFragAddr) {
777 std::stringstream oss;
778 oss<<
"First FED in superfragment ouf-of-bound."
static bool doFedIdCheck_
void process(MemRef_t *bufRef)
struct fedt_struct fedt_t
unsigned int size() const
bool gtpe_board_sense(const unsigned char *p)
void appendBlockToSuperFrag(MemRef_t *bufRef)
UInt_t nbErrors(bool reset=true)
unsigned int get(const unsigned char *, bool)
UInt_t nbBytes(bool reset=true)
unsigned char * writeData(unsigned char *data, unsigned int dataSize)
static unsigned int gtpEvmId_
toolbox::mem::Reference MemRef_t
void fillSuperFragPayload()
bool markFed(unsigned int i, unsigned int size, unsigned char *addr)
MemRef_t * superFragHead_
unsigned int fedId() const
evf::FUShmRawCell * shmCell_
static unsigned int gtpDaqId_
static unsigned int gtpeId_
void checkDataBlockPayload(MemRef_t *bufRef)
MemRef_t * superFragTail_
unsigned int getlbn(const unsigned char *)
void removeLastAppendedBlockFromSuperFrag()
unsigned short compute_crc(unsigned char *buffer, unsigned int bufSize)
unsigned char * superFragAddr(unsigned int i) const
bool markSuperFrag(unsigned int i, unsigned int size, unsigned char *addr)
void setEvtNumber(unsigned int evt)
bool evm_board_sense(const unsigned char *p, size_t size)
unsigned int payloadSize() const
evf::FUShmRawCell * shmCell()
unsigned char *const getPayload()
unsigned int superFragSize(unsigned int i) const
void setFuResourceId(unsigned int id)
void processDataBlock(MemRef_t *bufRef)
static unsigned int gtpeId_
void setLumiSection(unsigned int)
static unsigned int gtpEvmId_
unsigned int nFed() const
unsigned int nSuperFrag() const
UInt_t nbCrcErrors(bool reset=true)
unsigned int gtpe_get(const unsigned char *)
bool daq_board_sense(const unsigned char *p)
bool nextEventWillHaveCRCError_
void reset(double vett[256])
void allocate(FUShmRawCell *shmCell)
void putHeader(unsigned int l1id, unsigned int bxid)