12#ifndef O2_MCH_RAW_ENCODER_GBT_ENCODER_H
13#define O2_MCH_RAW_ENCODER_GBT_ENCODER_H
21#include <fmt/printf.h>
42template <
typename FORMAT,
typename CHARGESUM,
int VERSION = 0>
59 void addChannelData(uint8_t elinkGroupId, uint8_t elinkIndexInGroup, uint8_t chId,
const std::vector<SampaCluster>&
data);
88 uint16_t
linkId()
const {
return mLinkId; }
91 size_t size()
const {
return mGbtWords.size(); }
95 std::array<ElinkEncoder<FORMAT, CHARGESUM, VERSION>, 40> mElinks;
96 std::vector<uint64_t> mGbtWords;
100inline int phase(
int i,
bool forceNoPhase)
117template <
typename FORMAT,
typename CHARGESUM,
int VERSION>
120template <
typename FORMAT,
typename CHARGESUM,
int VERSION>
127 impl::assertIsInRange(
"linkId", linkId, 0, 11);
130template <
typename FORMAT,
typename CHARGESUM,
int VERSION>
132 const std::vector<SampaCluster>&
data)
135 impl::assertIsInRange(
"elinkGroupId", elinkGroupId, 0, 7);
136 impl::assertIsInRange(
"elinkIndexInGroup", elinkIndexInGroup, 0, 4);
137 mElinks.at(elinkGroupId * 5 + elinkIndexInGroup).addChannelData(chId,
data);
140template <
typename FORMAT,
typename CHARGESUM,
int VERSION>
144 impl::assertIsInRange(
"elinkGroupId", elinkGroupId, 0, 7);
145 impl::assertIsInRange(
"elinkIndexInGroup", elinkIndexInGroup, 0, 4);
146 mElinks.at(elinkGroupId * 5 + elinkIndexInGroup).addHeartbeat(bunchCrossing);
149template <
typename FORMAT,
typename CHARGESUM,
int VERSION>
152 auto s = gsl::span(mElinks.begin(), mElinks.end());
153 mElinkMerger(mLinkId, s, mGbtWords);
154 for (
auto& elink : mElinks) {
157 return impl::moveBuffer(mGbtWords,
buffer);
A GBTEncoder manages 40 ElinkEncoder to encode the data of one GBT.
void resetLocalBunchCrossing()
size_t size() const
return the number of bytes our current buffer is
void addHeartbeat(uint8_t elinkGroupId, uint8_t elinkIndexInGroup, uint20_t bunchCrossing)
void addChannelData(uint8_t elinkGroupId, uint8_t elinkIndexInGroup, uint8_t chId, const std::vector< SampaCluster > &data)
size_t moveToBuffer(std::vector< std::byte > &buffer)
uint16_t linkId() const
returns the GBT id
GBTEncoder(uint16_t linkId)