9#ifndef FLXLIBS_INCLUDE_FLXLIBS_AVAILABLEPARSEROPERATIONS_HPP_
10#define FLXLIBS_INCLUDE_FLXLIBS_AVAILABLEPARSEROPERATIONS_HPP_
18#include "packetformat/block_format.hpp"
31print_bytes(std::ostream& ostr,
const char* title,
const unsigned char* data, std::size_t length,
bool format =
true)
33 ostr << title << std::endl;
34 ostr << std::setfill(
'0');
35 for (
size_t i = 0; i < length; ++i) {
36 ostr << std::hex << std::setw(2) << static_cast<int>(data[i]);
38 ostr << (((i + 1) % 16 == 0) ?
"\n" :
" ");
49 const std::size_t& buffer_size)
51 auto bytes_to_copy =
size;
52 while (bytes_to_copy > 0) {
53 auto n = std::min(bytes_to_copy, buffer_size - buffer_pos);
54 std::memcpy(
static_cast<char*
>(buffer) + buffer_pos, data, n);
57 if (buffer_pos == buffer_size) {
63template<
class TargetStruct>
64inline std::function<void(
const felix::packetformat::chunk&
chunk)>
66 std::chrono::milliseconds timeout = std::chrono::milliseconds(100))
68 return [&](
const felix::packetformat::chunk&
chunk) {
70 auto subchunk_data =
chunk.subchunks();
71 auto subchunk_sizes =
chunk.subchunk_lengths();
72 auto n_subchunks =
chunk.subchunk_number();
73 std::size_t target_size =
sizeof(TargetStruct);
76 if (
chunk.length() != target_size) {
80 uint32_t bytes_copied_chunk = 0;
81 for (
unsigned i = 0; i < n_subchunks; i++) {
83 subchunk_data[i], subchunk_sizes[i],
static_cast<void*
>(&payload.data), bytes_copied_chunk, target_size);
84 bytes_copied_chunk += subchunk_sizes[i];
87 (*cb)(std::move(payload));
88 }
catch (
const std::exception& e) {
89 TLOG() <<
"Caught " << e.what();
95template<
class TargetStruct>
96inline std::function<void(
const felix::packetformat::shortchunk& shortchunk)>
98 std::chrono::milliseconds timeout = std::chrono::milliseconds(100))
100 return [&](
const felix::packetformat::shortchunk& shortchunk) {
102 std::size_t target_size =
sizeof(TargetStruct);
103 if (shortchunk.length != target_size) {
108 TargetStruct payload;
109 std::memcpy(
static_cast<char*
>(payload), shortchunk.data, target_size);
111 (*cb)(std::move(payload));
112 }
catch (
const std::exception& e) {
113 TLOG() <<
"Caught " << e.what();
119template<
class TargetStruct>
120inline std::function<void(
const felix::packetformat::chunk&
chunk)>
122 std::chrono::milliseconds timeout = std::chrono::milliseconds(100))
124 return [&](
const felix::packetformat::chunk&
chunk) {
126 auto subchunk_data =
chunk.subchunks();
127 auto subchunk_sizes =
chunk.subchunk_lengths();
128 auto n_subchunks =
chunk.subchunk_number();
129 auto target_size =
sizeof(TargetStruct);
132 if (
chunk.length() != target_size) {
136 TargetStruct* payload =
new TargetStruct[
sizeof(TargetStruct)];
138 uint_fast32_t bytes_copied_chunk = 0;
139 for (
unsigned i = 0; i < n_subchunks; i++) {
142 static_cast<void*
>(payload),
145 bytes_copied_chunk += subchunk_sizes[i];
148 (*cb)(std::move(payload));
149 }
catch (
const std::exception& e) {
150 TLOG() <<
"Caught " << e.what();
156template<
class TargetWithDatafield>
157inline std::function<void(
const felix::packetformat::chunk&)>
159 std::chrono::milliseconds timeout = std::chrono::milliseconds(100))
161 return [&](
const felix::packetformat::chunk&
chunk) {
162 auto subchunk_data =
chunk.subchunks();
163 auto subchunk_sizes =
chunk.subchunk_lengths();
164 auto n_subchunks =
chunk.subchunk_number();
165 TargetWithDatafield twd;
166 twd.get_data().reserve(
chunk.length());
167 uint32_t bytes_copied_chunk = 0;
168 for (
unsigned i = 0; i < n_subchunks; ++i) {
171 static_cast<void*
>(twd.get_data().data()),
174 bytes_copied_chunk += subchunk_sizes[i];
176 twd.set_data_size(bytes_copied_chunk);
178 (*cb)(std::move(twd));
179 }
catch (
const std::exception& e) {
180 TLOG() <<
"Caught " << e.what();
185template<
class TargetWithDatafield>
186inline std::function<void(
const felix::packetformat::shortchunk&)>
188 std::chrono::milliseconds timeout = std::chrono::milliseconds(100))
190 return [&](
const felix::packetformat::shortchunk& shortchunk) {
191 TargetWithDatafield twd;
192 twd.get_data().reserve(shortchunk.length);
193 std::memcpy(
static_cast<void*
>(twd.get_data().data()), shortchunk.data, shortchunk.length);
194 twd.set_data_size(shortchunk.length);
196 (*cb)(std::move(twd));
197 }
catch (
const std::exception& e) {
198 TLOG() <<
"Caught " << e.what();
203inline std::function<void(
const felix::packetformat::chunk&
chunk)>
206 std::chrono::milliseconds timeout = std::chrono::milliseconds(100))
208 return [&](
const felix::packetformat::chunk&
chunk) {
209 auto subchunk_data =
chunk.subchunks();
210 auto subchunk_sizes =
chunk.subchunk_lengths();
211 auto n_subchunks =
chunk.subchunk_number();
212 auto chunk_length =
chunk.length();
214 char* payload =
static_cast<char*
>(malloc(chunk_length *
sizeof(
char)));
215 uint32_t bytes_copied_chunk = 0;
216 for (
unsigned i = 0; i < n_subchunks; ++i) {
218 subchunk_data[i], subchunk_sizes[i],
static_cast<void*
>(payload), bytes_copied_chunk, chunk_length);
219 bytes_copied_chunk += subchunk_sizes[i];
223 (*cb)(std::move(payload_wrapper));
224 }
catch (
const std::exception& e) {
225 TLOG() <<
"Caught " << e.what();
230inline std::function<void(
const felix::packetformat::shortchunk& shortchunk)>
233 std::chrono::milliseconds timeout = std::chrono::milliseconds(100))
235 return [&](
const felix::packetformat::shortchunk& shortchunk) {
236 auto shortchunk_length = shortchunk.length;
237 char* payload =
static_cast<char*
>(malloc(shortchunk_length *
sizeof(
char)));
238 std::memcpy(payload, shortchunk.data, shortchunk_length);
241 (*cb)(std::move(payload_wrapper));
242 }
catch (
const std::exception& e) {
243 TLOG() <<
"Caught " << e.what();
248inline std::function<void(
const felix::packetformat::chunk&
chunk)>
250 std::chrono::milliseconds timeout = std::chrono::milliseconds(100))
252 return [&](
const felix::packetformat::chunk&
chunk) {
254 auto payload =
chunk;
255 (*cb)(std::move(payload));
256 }
catch (
const std::exception& e) {
257 TLOG() <<
"Caught " << e.what();
std::function< void(const felix::packetformat::chunk &chunk)> varsizedChunkIntoWrapper(std::shared_ptr< std::function< void(fdreadoutlibs::types::VariableSizePayloadTypeAdapter &&)> > &cb, std::chrono::milliseconds timeout=std::chrono::milliseconds(100))
std::function< void(const felix::packetformat::chunk &chunk)> errorChunkIntoSink(std::shared_ptr< std::function< void(felix::packetformat::chunk &&)> > &cb, std::chrono::milliseconds timeout=std::chrono::milliseconds(100))
void print_bytes(std::ostream &ostr, const char *title, const unsigned char *data, std::size_t length, bool format=true)
std::function< void(const felix::packetformat::chunk &chunk)> fixsizedChunkInto(std::shared_ptr< std::function< void(TargetStruct &&)> > &cb, std::chrono::milliseconds timeout=std::chrono::milliseconds(100))
void dump_to_buffer(const char *data, std::size_t size, void *buffer, uint32_t buffer_pos, const std::size_t &buffer_size)
std::function< void(const felix::packetformat::shortchunk &shortchunk)> varsizedShortchunkIntoWrapper(std::shared_ptr< std::function< void(fdreadoutlibs::types::VariableSizePayloadTypeAdapter &&)> > &cb, std::chrono::milliseconds timeout=std::chrono::milliseconds(100))
std::function< void(const felix::packetformat::shortchunk &shortchunk)> fixsizedShortchunkInto(std::shared_ptr< std::function< void(TargetStruct &&)> > &cb, std::chrono::milliseconds timeout=std::chrono::milliseconds(100))
std::function< void(const felix::packetformat::chunk &chunk)> fixsizedChunkViaHeap(std::shared_ptr< std::function< void(TargetStruct &&)> > &cb, std::chrono::milliseconds timeout=std::chrono::milliseconds(100))
std::function< void(const felix::packetformat::shortchunk &)> varsizedShortchunkIntoWithDatafield(std::shared_ptr< std::function< void(TargetWithDatafield &&)> > &cb, std::chrono::milliseconds timeout=std::chrono::milliseconds(100))
std::function< void(const felix::packetformat::chunk &)> varsizedChunkIntoWithDatafield(std::shared_ptr< std::function< void(TargetWithDatafield &&)> > &cb, std::chrono::milliseconds timeout=std::chrono::milliseconds(100))
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk int ParserOps couldn t push to queue !Failed chunk
FELIX Initialization std::string initerror FELIX queue timed std::string queuename Unexpected chunk size
FELIX Initialization std::string initerror FELIX queue timed std::string queuename UnexpectedChunk
void error(const Issue &issue)
Convencience wrapper to take ownership over char pointers with corresponding allocated memory size.