Project
Loading...
Searching...
No Matches
RawBuffer.cxx
Go to the documentation of this file.
1// Copyright 2019-2020 CERN and copyright holders of ALICE O2.
2// See https://alice-o2.web.cern.ch/copyright for details of the copyright holders.
3// All rights not expressly granted are reserved.
4//
5// This software is distributed under the terms of the GNU General Public
6// License v3 (GPL Version 3), copied verbatim in the file "COPYING".
7//
8// In applying this license CERN does not waive the privileges and immunities
9// granted to it by virtue of its status as an Intergovernmental Organization
10// or submit itself to any jurisdiction.
11#include <fstream>
12#include <iostream>
13#include <cstring>
14#include <fairlogger/Logger.h>
16
17using namespace o2::emcal;
18
20{
21 mCurrentDataWord = 0;
22 mNDataWords = 0;
23 memset(mDataWords.data(), 0, sizeof(uint32_t) * mDataWords.size());
24}
25
26void RawBuffer::readFromStream(std::istream& in, uint32_t payloadsize)
27{
28 flush();
29 uint32_t word(0);
30 auto address = reinterpret_cast<char*>(&word);
31 int nbyte = 0;
32 while (nbyte < payloadsize) {
33 in.read(address, sizeof(word));
34 nbyte += sizeof(word);
35 if ((word & 0xFFFFFF) == 0x1d3082) {
36 LOG(error) << "Found stop word" << std::endl;
37 // Termination word
38 // should normally not be decoded in case the payload size
39 // is determined correctly
40 break;
41 }
42 mDataWords[mNDataWords++] = word;
43 }
44}
45
46void RawBuffer::readFromMemoryBuffer(const gsl::span<const char> rawmemory)
47{
48 flush();
49 auto address = reinterpret_cast<const uint32_t*>(rawmemory.data());
50 for (auto iword = 0; iword < rawmemory.size() / sizeof(uint32_t); iword++) {
51 // Run2 code, probably not needed for run3
52 // if ((address[iword] & 0xFFF) == 0x082) {
53 // Termination word
54 // should normally not be decoded in case the payload size
55 // is determined correctly
56 //std::cout << "Found termination word" << std::endl;
57 //break;
58 // }
59 mDataWords[mNDataWords++] = address[iword];
60 }
61}
62
63uint32_t RawBuffer::getWord(int index) const
64{
65 if (index >= mNDataWords) {
66 throw std::runtime_error("Index out of range");
67 }
68 return mDataWords[index];
69}
70
72{
73 if (!hasNext()) {
74 throw std::runtime_error("No more data words in buffer");
75 }
76 return mDataWords[mCurrentDataWord++];
77}
void readFromMemoryBuffer(const gsl::span< const char > rawmemory)
Read page from raw memory buffer.
Definition RawBuffer.cxx:46
bool hasNext() const
Check whether the next data word exists.
Definition RawBuffer.h:78
uint32_t getWord(int index) const
Get the data word at a given index.
Definition RawBuffer.cxx:63
uint32_t getNextDataWord()
Get the next data word in the superpage.
Definition RawBuffer.cxx:71
void readFromStream(std::istream &in, uint32_t payloadsize)
Read page from stream.
Definition RawBuffer.cxx:26
void flush()
Flush the buffer Does not overwrite the word buffer but just resets the counter and iterator.
Definition RawBuffer.cxx:19
GLuint GLuint64EXT address
Definition glcorearb.h:5846
GLuint index
Definition glcorearb.h:781
LOG(info)<< "Compressed in "<< sw.CpuTime()<< " s"