30 mRawMemoryBuffer = rawmemory;
37 if (headerversion < RDHDecoder::getVersion<o2::header::RDHLowest>() || headerversion > RDHDecoder::getVersion<o2::header::RDHHighest>()) {
56 mRawHeaderInitialized =
false;
57 mPayloadInitialized =
false;
64 mCurrentTrailer.
reset();
66 bool isDataTerminated =
false;
70 auto nextheader =
decodeRawHeader(mRawMemoryBuffer.data() + mCurrentPosition);
78 auto nextpagecounter = RDHDecoder::getPageCounter(nextheader);
79 if (nextpagecounter == 0) {
80 isDataTerminated =
true;
82 isDataTerminated =
false;
85 isDataTerminated =
true;
88 }
while (!isDataTerminated);
100 if (doResetPayload) {
103 mRawHeaderInitialized =
false;
104 mPayloadInitialized =
false;
107 mRawHeader =
decodeRawHeader(mRawMemoryBuffer.data() + mCurrentPosition);
108 auto feeID = RDHDecoder::getFEEID(mRawHeader);
109 if (mCurrentFEE < 0 || mCurrentFEE != feeID) {
114 if (RDHDecoder::getOffsetToNext(mRawHeader) == RDHDecoder::getHeaderSize(mRawHeader)) {
117 mCurrentPosition += RDHDecoder::getHeaderSize(mRawHeader);
118 mRawHeader =
decodeRawHeader(mRawMemoryBuffer.data() + mCurrentPosition);
119 feeID = RDHDecoder::getFEEID(mRawHeader);
120 if (mCurrentFEE < 0 || mCurrentFEE != feeID) {
126 mRawHeaderInitialized =
true;
130 if (mCurrentPosition + RDHDecoder::getMemorySize(mRawHeader) > mRawMemoryBuffer.size()) {
133 if (mCurrentPosition + RDHDecoder::getOffsetToNext(mRawHeader) < mRawMemoryBuffer.size()) {
134 mCurrentPosition += RDHDecoder::getOffsetToNext(mRawHeader);
135 if (mCurrentPosition + 64 < mRawMemoryBuffer.size()) {
138 auto nextheader =
decodeRawHeader(mRawMemoryBuffer.data() + mCurrentPosition);
145 mCurrentPosition = mRawMemoryBuffer.size();
149 }
else if (mCurrentPosition + RDHDecoder::getHeaderSize(mRawHeader) > mRawMemoryBuffer.size()) {
152 if (mCurrentPosition + RDHDecoder::getOffsetToNext(mRawHeader) < mRawMemoryBuffer.size()) {
153 mCurrentPosition += RDHDecoder::getOffsetToNext(mRawHeader);
155 mCurrentPosition = mRawMemoryBuffer.size();
159 mRawBuffer.
readFromMemoryBuffer(gsl::span<const char>(mRawMemoryBuffer.data() + mCurrentPosition + RDHDecoder::getHeaderSize(mRawHeader), RDHDecoder::getMemorySize(mRawHeader) - RDHDecoder::getHeaderSize(mRawHeader)));
161 gsl::span<const uint32_t> payloadWithoutTrailer;
162 auto feeID = RDHDecoder::getFEEID(mRawHeader);
163 if (feeID >= mMinSRUDDL && feeID <= mMaxSRUDDL) {
182 mCurrentTrailer = trailer;
186 payloadWithoutTrailer = gsl::span<const uint32_t>(mRawBuffer.
getDataWords().data(), mRawBuffer.
getDataWords().size() - trailer.getTrailerSize());
187 if (trailer.getTrailerWordCorruptions()) {
192 if (mCurrentPosition + RDHDecoder::getOffsetToNext(mRawHeader) < mRawMemoryBuffer.size()) {
193 mCurrentPosition += RDHDecoder::getOffsetToNext(mRawHeader);
195 mCurrentPosition = mRawMemoryBuffer.size();
211 mCurrentPosition += RDHDecoder::getOffsetToNext(mRawHeader);
216 if (!mRawHeaderInitialized) {
224 if (!mPayloadInitialized) {
Error handling of the RCU trailer.
void reset()
Reset the RCU trailer.
void setPayloadSize(uint32_t size)
set the payload size in number of DDL (32-bit) words
static RCUTrailer constructFromPayloadWords(const gsl::span< const uint32_t > payloadwords)
Decode RCU trailer from payload.
uint32_t getPayloadSize() const
Get size of the payload as number of DDL (32-bit) words.
static bool checkLastTrailerWord(uint32_t trailerword)
Check whether the word is a valid last trailer word.
std::vector< uint32_t > encode() const
Encode RCU trailer as array of DDL (32-bit) words.
bool isInitialized() const
checlks whether the RCU trailer is initialzied
Buffer for EMCAL raw pages.
void readFromMemoryBuffer(const gsl::span< const char > rawmemory)
Read page from raw memory buffer.
const gsl::span< const uint32_t > getDataWords() const
Get all data words from the raw buffer.
void flush()
Flush the buffer Does not overwrite the word buffer but just resets the counter and iterator.
Error handling of the raw reader.
@ TRAILER_INCOMPLETE
Incomplete trailer words (i.e. registers)
@ HEADER_DECODING
Header cannot be decoded (format incorrect)
@ TRAILER_DECODING
Inconsistent trailer in memory (several trailer words missing the trailer marker)
@ PAGE_NOTFOUND
Page was not found (page index outside range)
@ HEADER_INVALID
Header in memory not belonging to requested superpage.
@ PAGE_START_INVALID
Page position starting outside payload size.
@ PAYLOAD_DECODING
Payload cannot be decoded (format incorrect)
@ PAYLOAD_INVALID
Payload in memory not belonging to requested superpage.
void reset()
Resetting payload words and page counter.
void increasePageCount()
Increase the page counter of the current payload.
void appendPayloadWords(const gsl::span< const uint32_t > payloadwords)
Append many words to the current payload (usually of a given DMA page)
bool hasNext() const
check if more pages are available in the raw file
const o2::header::RDHAny & getRawHeader() const
access to the raw header of the current page
RawReaderMemory(const gsl::span< const char > rawmemory)
Constructor.
void setRawMemory(const gsl::span< const char > rawmemory)
set new raw memory chunk
const RawBuffer & getRawBuffer() const
access to the raw buffer (single DMA page)
void init()
Initialize the raw stream.
void next()
Read next payload from the stream.
void nextPage(bool resetPayload=true)
Read the next page from the stream (single DMA page)
o2::header::RDHAny decodeRawHeader(const void *headerwords)
Decode raw header words.
static bool checkRDH(const RDHv4 &rdh, bool verbose=true, bool checkZeros=false)
static constexpr int getVersion()
get numeric version of the RDH