Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:10:56

0001 #include <iomanip>
0002 #include <ostream>
0003 #include "EventFilter/Phase2TrackerRawToDigi/interface/Phase2TrackerFEDDAQTrailer.h"
0004 
0005 namespace Phase2Tracker {
0006 
0007   std::ostream& operator<<(std::ostream& os, const FEDTTSBits& value) {
0008     switch (value) {
0009       case TTS_DISCONNECTED0:
0010         os << "Disconected 0";
0011         break;
0012       case TTS_WARN_OVERFLOW:
0013         os << "Warning overflow";
0014         break;
0015       case TTS_OUT_OF_SYNC:
0016         os << "Out of sync";
0017         break;
0018       case TTS_BUSY:
0019         os << "Busy";
0020         break;
0021       case TTS_READY:
0022         os << "Ready";
0023         break;
0024       case TTS_ERROR:
0025         os << "Error";
0026         break;
0027       case TTS_INVALID:
0028         os << "Invalid";
0029         break;
0030       case TTS_DISCONNECTED1:
0031         os << "Disconected 1";
0032         break;
0033       default:
0034         os << "Unrecognized";
0035         os << " (";
0036         printHexValue(value, os);
0037         os << ")";
0038         break;
0039     }
0040     return os;
0041   }
0042 
0043   FEDTTSBits FEDDAQTrailer::ttsBits() const {
0044     switch (ttsNibble()) {
0045       case TTS_DISCONNECTED0:
0046       case TTS_WARN_OVERFLOW:
0047       case TTS_OUT_OF_SYNC:
0048       case TTS_BUSY:
0049       case TTS_READY:
0050       case TTS_ERROR:
0051       case TTS_DISCONNECTED1:
0052         return FEDTTSBits(ttsNibble());
0053       default:
0054         return TTS_INVALID;
0055     }
0056   }
0057 
0058   FEDDAQTrailer::FEDDAQTrailer(const uint32_t eventLengthIn64BitWords,
0059                                const uint16_t crc,
0060                                const FEDTTSBits ttsBits,
0061                                const bool slinkTransmissionError,
0062                                const bool badFEDID,
0063                                const bool slinkCRCError,
0064                                const uint8_t eventStatusNibble) {
0065     //clear everything (T,x,$ all set to 0)
0066     memset(trailer_, 0x0, 8);
0067     //set the EoE nibble to indicate this is the last fragment
0068     trailer_[7] = 0xA0;
0069     //set variable fields vith values supplied
0070     setEventLengthIn64BitWords(eventLengthIn64BitWords);
0071     setEventStatusNibble(eventStatusNibble);
0072     setTTSBits(ttsBits);
0073     setCRC(crc);
0074     setSLinkTransmissionErrorBit(slinkTransmissionError);
0075     setBadSourceIDBit(badFEDID);
0076     setSLinkCRCErrorBit(slinkCRCError);
0077   }
0078 
0079   void FEDDAQTrailer::setEventLengthIn64BitWords(const uint32_t eventLengthIn64BitWords) {
0080     trailer_[4] = (eventLengthIn64BitWords & 0x000000FF);
0081     trailer_[5] = ((eventLengthIn64BitWords & 0x0000FF00) >> 8);
0082     trailer_[6] = ((eventLengthIn64BitWords & 0x00FF0000) >> 16);
0083   }
0084 
0085   void FEDDAQTrailer::setCRC(const uint16_t crc) {
0086     trailer_[2] = (crc & 0x00FF);
0087     trailer_[3] = ((crc >> 8) & 0x00FF);
0088   }
0089 
0090   void FEDDAQTrailer::setSLinkTransmissionErrorBit(const bool bitSet) {
0091     if (bitSet)
0092       trailer_[1] |= 0x80;
0093     else
0094       trailer_[1] &= (~0x80);
0095   }
0096 
0097   void FEDDAQTrailer::setBadSourceIDBit(const bool bitSet) {
0098     if (bitSet)
0099       trailer_[1] |= 0x40;
0100     else
0101       trailer_[1] &= (~0x40);
0102   }
0103 
0104   void FEDDAQTrailer::setSLinkCRCErrorBit(const bool bitSet) {
0105     if (bitSet)
0106       trailer_[0] |= 0x04;
0107     else
0108       trailer_[0] &= (~0x40);
0109   }
0110 
0111   void FEDDAQTrailer::setEventStatusNibble(const uint8_t eventStatusNibble) {
0112     trailer_[1] = ((trailer_[1] & 0xF0) | (eventStatusNibble & 0x0F));
0113   }
0114 
0115   void FEDDAQTrailer::setTTSBits(const FEDTTSBits ttsBits) { trailer_[0] = ((trailer_[0] & 0x0F) | (ttsBits & 0xF0)); }
0116 
0117 }  // namespace Phase2Tracker