1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
#include <iomanip>
#include <ostream>
#include "EventFilter/Phase2TrackerRawToDigi/interface/Phase2TrackerFEDDAQTrailer.h"
namespace Phase2Tracker {
std::ostream& operator<<(std::ostream& os, const FEDTTSBits& value) {
switch (value) {
case TTS_DISCONNECTED0:
os << "Disconected 0";
break;
case TTS_WARN_OVERFLOW:
os << "Warning overflow";
break;
case TTS_OUT_OF_SYNC:
os << "Out of sync";
break;
case TTS_BUSY:
os << "Busy";
break;
case TTS_READY:
os << "Ready";
break;
case TTS_ERROR:
os << "Error";
break;
case TTS_INVALID:
os << "Invalid";
break;
case TTS_DISCONNECTED1:
os << "Disconected 1";
break;
default:
os << "Unrecognized";
os << " (";
printHexValue(value, os);
os << ")";
break;
}
return os;
}
FEDTTSBits FEDDAQTrailer::ttsBits() const {
switch (ttsNibble()) {
case TTS_DISCONNECTED0:
case TTS_WARN_OVERFLOW:
case TTS_OUT_OF_SYNC:
case TTS_BUSY:
case TTS_READY:
case TTS_ERROR:
case TTS_DISCONNECTED1:
return FEDTTSBits(ttsNibble());
default:
return TTS_INVALID;
}
}
FEDDAQTrailer::FEDDAQTrailer(const uint32_t eventLengthIn64BitWords,
const uint16_t crc,
const FEDTTSBits ttsBits,
const bool slinkTransmissionError,
const bool badFEDID,
const bool slinkCRCError,
const uint8_t eventStatusNibble) {
//clear everything (T,x,$ all set to 0)
memset(trailer_, 0x0, 8);
//set the EoE nibble to indicate this is the last fragment
trailer_[7] = 0xA0;
//set variable fields vith values supplied
setEventLengthIn64BitWords(eventLengthIn64BitWords);
setEventStatusNibble(eventStatusNibble);
setTTSBits(ttsBits);
setCRC(crc);
setSLinkTransmissionErrorBit(slinkTransmissionError);
setBadSourceIDBit(badFEDID);
setSLinkCRCErrorBit(slinkCRCError);
}
void FEDDAQTrailer::setEventLengthIn64BitWords(const uint32_t eventLengthIn64BitWords) {
trailer_[4] = (eventLengthIn64BitWords & 0x000000FF);
trailer_[5] = ((eventLengthIn64BitWords & 0x0000FF00) >> 8);
trailer_[6] = ((eventLengthIn64BitWords & 0x00FF0000) >> 16);
}
void FEDDAQTrailer::setCRC(const uint16_t crc) {
trailer_[2] = (crc & 0x00FF);
trailer_[3] = ((crc >> 8) & 0x00FF);
}
void FEDDAQTrailer::setSLinkTransmissionErrorBit(const bool bitSet) {
if (bitSet)
trailer_[1] |= 0x80;
else
trailer_[1] &= (~0x80);
}
void FEDDAQTrailer::setBadSourceIDBit(const bool bitSet) {
if (bitSet)
trailer_[1] |= 0x40;
else
trailer_[1] &= (~0x40);
}
void FEDDAQTrailer::setSLinkCRCErrorBit(const bool bitSet) {
if (bitSet)
trailer_[0] |= 0x04;
else
trailer_[0] &= (~0x40);
}
void FEDDAQTrailer::setEventStatusNibble(const uint8_t eventStatusNibble) {
trailer_[1] = ((trailer_[1] & 0xF0) | (eventStatusNibble & 0x0F));
}
void FEDDAQTrailer::setTTSBits(const FEDTTSBits ttsBits) { trailer_[0] = ((trailer_[0] & 0x0F) | (ttsBits & 0xF0)); }
} // namespace Phase2Tracker
|