SRS-control 0.1.4
Loading...
Searching...
No Matches
JsonWriter.hpp
Go to the documentation of this file.
1#pragma once
2
8#include <boost/asio/any_io_executor.hpp>
9#include <boost/asio/experimental/coro.hpp>
10#include <boost/asio/thread_pool.hpp>
11#include <boost/asio/use_awaitable.hpp>
12#include <boost/thread/future.hpp>
13#include <cassert>
14#include <cstddef>
15#include <cstdint>
16#include <fstream>
17#include <glaze/core/opts.hpp>
18#include <glaze/core/write.hpp>
19#include <glaze/glaze.hpp>
20#include <map>
21#include <spdlog/spdlog.h>
22#include <string>
23#include <string_view>
24#include <vector>
25
26namespace srs::writer
27{
29 {
31 std::size_t marker_size{};
32 std::size_t hit_size{};
33 std ::map<std::string, std::vector<uint64_t>> marker_data{ { "vmm_id", {} }, { "srs_timestamp", {} } };
34 std ::map<std::string, std::vector<uint16_t>> hit_data{ { "is_over_threshold", {} },
35 { "channel_num", {} },
36 { "tdc", {} },
37 { "offset", {} },
38 { "vmm_id", {} },
39 { "adc", {} },
40 { "bc_id", {} } };
41
42 void set_value(const StructData& data_struct);
43
44 private:
45 void fill_hit_data(const std::vector<HitData>& hits);
46 void fill_marker_data(const std::vector<MarkerData>& markers);
47 };
48
49 class Json : public process::WriterTask<DataWriterOption::json, const StructData*, std::size_t>
50 {
51 public:
52 static constexpr auto IsStructType = true;
53 struct Bool
54 {
55 bool value = true;
56 explicit operator bool() const { return value; }
57 };
58
59 explicit Json(const std::string& filename, process::DataConvertOptions convert_mode, std::size_t n_lines = 1);
60
61 Json(const Json&) = delete;
62 Json(Json&&) = default;
63 Json& operator=(const Json&) = delete;
64 Json& operator=(Json&&) = default;
65 ~Json();
66
67 [[nodiscard]] auto operator()(std::size_t line_number = 0) const -> OutputType
68 {
69 return output_data_[line_number];
70 }
71
72 [[nodiscard]] auto get_filename() const -> const std::string& { return filename_; }
73
74 auto run(const OutputTo<InputType> auto& prev_data_converter, std::size_t line_number = 0) -> RunResult
75 {
76 assert(line_number < get_n_lines());
77 const auto* data_struct = prev_data_converter(line_number);
78 write_json(*data_struct, line_number);
79 return this->operator()(line_number);
80 }
81
82 private:
83 static constexpr auto name_ = std::string_view{};
84 std::vector<Bool> is_first_item_;
85 std::string filename_;
86 std::vector<OutputType> output_data_;
87 std::vector<std::fstream> file_streams_;
88 std::vector<CompactExportData> data_buffers_;
89 std::vector<std::string> string_buffers_;
90
91 void write_json(const StructData& data_struct, std::size_t line_num);
92 };
93
94} // namespace srs::writer
std::expected< OutputType, std::string_view > RunResult
Json(const Json &)=delete
std::vector< Bool > is_first_item_
Json & operator=(const Json &)=delete
Json & operator=(Json &&)=default
std::vector< std::string > string_buffers_
Json(const std::string &filename, process::DataConvertOptions convert_mode, std::size_t n_lines=1)
static constexpr auto IsStructType
std::vector< CompactExportData > data_buffers_
auto operator()(std::size_t line_number=0) const -> OutputType
auto get_filename() const -> const std::string &
Json(Json &&)=default
std::vector< std::fstream > file_streams_
std::string filename_
static constexpr auto name_
void write_json(const StructData &data_struct, std::size_t line_num)
auto run(const OutputTo< InputType > auto &prev_data_converter, std::size_t line_number=0) -> RunResult
std::vector< OutputType > output_data_
void fill_hit_data(const std::vector< HitData > &hits)
std ::map< std::string, std::vector< uint64_t > > marker_data
std ::map< std::string, std::vector< uint16_t > > hit_data
void fill_marker_data(const std::vector< MarkerData > &markers)
void set_value(const StructData &data_struct)