CbmRoot
Loading...
Searching...
No Matches
TimeslicedDigiBuilder.h
Go to the documentation of this file.
1/* Copyright (C) 2025 Jagiellonian University, Krakow
2 SPDX-License-Identifier: GPL-3.0-only
3 Authors: Bartosz Sobol [committer] */
4
5#pragma once
6
7#include <StorableTimeslice.hpp>
8
9#include <boost/archive/binary_oarchive.hpp>
10#include <boost/iostreams/device/back_inserter.hpp>
11#include <boost/iostreams/stream.hpp>
12
13#include <log.hpp>
14#include <vector>
15
16#include <fmt/format.h>
17
19
20 public:
21 TimeslicedDigiBuilder(const std::size_t bufferInitCapacity = 1 << 27 /* 128MB */);
22
23 void init(uint32_t numCoreMicroslices, uint64_t index = UINT64_MAX, uint64_t tsPos = UINT64_MAX);
24
25 template<typename ADigis>
26 void addDigisToTs(const ADigis& digis, const fles::Subsystem subsystem)
27 {
28 L_(trace) << fmt::format("[TimeslicedDigiBuilder::addDigisToTs] Adding {} digis for subsystem {} to timeslice {}",
29 digis.size(), to_string(subsystem), fTs->index());
30
31 if (fTs == nullptr) {
32 throw std::runtime_error("[TimeslicedDigiBuilder::addDigisToTs] Underlying timeslice not initialized");
33 }
34
35 fBuffer.clear();
36
37 boost::iostreams::stream stream{boost::iostreams::back_inserter(fBuffer)};
38 boost::archive::binary_oarchive{stream} << digis;
39 stream.flush();
40
41 fles::MicrosliceDescriptor msDesc{.hdr_id = 0xDD,
42 .hdr_ver = 0x01,
43 .eq_id = 0xF000,
44 .flags = 0x0000,
45 .sys_id = static_cast<uint8_t>(subsystem),
46 .sys_ver = 0xF0,
47 .idx = fTs->start_time(),
48 .crc = 0x00000000,
49 .size = static_cast<uint32_t>(fBuffer.size()),
50 .offset = 0};
51
52 fTs->append_microslice(fTs->append_component(1), 0, msDesc, (uint8_t*) (fBuffer.data()));
53 }
54
55 fles::StorableTimeslice* getRelease();
56
57 private:
58 std::vector<char> fBuffer;
59 std::unique_ptr<fles::StorableTimeslice> fTs;
60};
#define L_(level)
std::unique_ptr< fles::StorableTimeslice > fTs
void addDigisToTs(const ADigis &digis, const fles::Subsystem subsystem)
fles::StorableTimeslice * getRelease()
std::vector< char > fBuffer
TimeslicedDigiBuilder(const std::size_t bufferInitCapacity=1<< 27)
void init(uint32_t numCoreMicroslices, uint64_t index=UINT64_MAX, uint64_t tsPos=UINT64_MAX)