12#ifndef O2_MCH_RAW_USER_LOGIC_ELINK_ENCODER_H
13#define O2_MCH_RAW_USER_LOGIC_ELINK_ENCODER_H
24#include <fmt/printf.h>
31template <
typename CHARGESUM,
int VERSION>
37 void addChannelData(uint8_t chId,
const std::vector<SampaCluster>&
data);
39 void addHeartbeat(
uint20_t bunchCrossing);
41 size_t moveToBuffer(std::vector<uint64_t>&
buffer, uint16_t gbtId);
48 std::vector<uint10_t> mBuffer;
51template <
typename CHARGESUM,
int VERSION>
61template <
typename CHARGESUM,
int VERSION>
63 const std::vector<SampaCluster>&
data)
66 throw std::invalid_argument(
"cannot add empty data");
68 assertNotMixingClusters<CHARGESUM>(
data);
80template <
typename CHARGESUM,
int VERSION>
87 for (
auto chipAddress : std::array<uint8_t, 2>{0, 1}) {
94template <
typename CHARGESUM,
int VERSION>
101template <
typename CHARGESUM,
int VERSION>
104 if (mBuffer.empty()) {
110 header.linkID = gbtId;
111 header.dsID = mElinkId;
112 header.incomplete = 0;
115 uint16_t b14 =
static_cast<uint16_t
>((header.word >> 50) & 0xFFFF);
void addPadding(std::vector< uint10_t > &b10)
void fillUserLogicBuffer10(std::vector< uint10_t > &b10, gsl::span< const SampaCluster > clusters, uint8_t elinkId, DualSampaChannelId chId, bool addSync)
void append(std::vector< uint10_t > &b10, uint50_t value)
int assertIsInRange(std::string what, uint64_t value, uint64_t min, uint64_t max)
void appendSync(std::vector< uint10_t > &b10)
void b10to64(std::vector< uint10_t > b10, std::vector< uint64_t > &b64, uint16_t prefix14)
SampaHeader sampaHeartbeat(uint8_t elinkId, uint20_t bunchCrossing)
Heartbeat packet.