SRS-control 0.1.4
Loading...
Searching...
No Matches
Handler.hpp
Go to the documentation of this file.
1#pragma once
2
8#include <atomic>
9#include <boost/asio/awaitable.hpp>
10#include <boost/asio/steady_timer.hpp>
11#include <chrono>
12#include <cstddef>
13#include <cstdint>
14#include <gsl/gsl-lite.hpp>
15#include <memory>
16#include <span>
17#include <spdlog/logger.h>
18#include <string>
19#include <vector>
20
21#ifdef USE_ONEAPI_TBB
22#include <oneapi/tbb/concurrent_queue.h>
23#else
24#include <tbb/concurrent_queue.h>
25#endif
26
27namespace srs
28{
29 class App;
30}
31
32namespace srs::workflow
33{
34 class Handler;
35
37 {
38 public:
39 explicit DataMonitor(Handler* processor, io_context_type* io_context);
40 void show_data_speed(bool val = true) { is_shown_ = val; }
41 void set_display_period(std::chrono::milliseconds duration) { period_ = duration; }
42 void start();
43 void stop();
44 // void update(const StructData& data_struct) {}
46
47 // getters:
48 [[nodiscard]] auto get_received_bytes_MBps() const -> double { return current_received_bytes_MBps_; }
49 [[nodiscard]] auto get_processed_hit_rate() const -> double { return current_hits_ps_; }
50
51 private:
52 bool is_shown_ = true;
53 gsl::not_null<Handler*> processor_;
54 gsl::not_null<io_context_type*> io_context_;
55 std::shared_ptr<spdlog::logger> console_;
56 asio::steady_timer clock_;
57 std::chrono::time_point<std::chrono::steady_clock> last_print_time_ = std::chrono::steady_clock::now();
58 std::chrono::milliseconds period_ = common::DEFAULT_DISPLAY_PERIOD;
63 uint64_t last_frame_counts_ = 0;
67 double current_hits_ps_ = 0.;
68 std::string read_speed_string_;
70 std::string drop_speed_string_;
71 std::string unit_string_;
72
73 void set_speed_string();
74 auto print_cycle() -> asio::awaitable<void>;
75 };
76
77 class Handler
78 {
79 public:
80 explicit Handler(App* control, std::size_t n_lines = 1);
81
82 Handler(const Handler&) = delete;
83 Handler(Handler&&) = delete;
84 Handler& operator=(const Handler&) = delete;
86 ~Handler();
87
88 // From socket interface. Need to be fast return
89 void read_data_once(std::span<BufferElementType> read_data);
90
91 void abort() { data_queue_.abort(); }
92
93 void start();
94
95 // getters:
96 [[nodiscard]] auto get_read_data_bytes() const -> uint64_t { return total_read_data_bytes_.load(); }
97 [[nodiscard]] auto get_processed_hit_number() const -> uint64_t { return total_processed_hit_numer_.load(); }
98 [[nodiscard]] auto get_drop_data_bytes() const -> uint64_t { return total_drop_data_bytes_.load(); }
99 [[nodiscard]] auto get_frame_counts() const -> uint64_t { return total_frame_counts_.load(); }
100 [[nodiscard]] auto get_data_monitor() const -> const auto& { return monitor_; }
101 [[nodiscard]] auto get_data_workflow() const -> const TaskDiagram&;
102 [[nodiscard]] auto get_app() -> auto& { return *app_; }
103 [[nodiscard]] auto get_n_lines() const -> auto { return n_lines_; }
104 auto get_writer() -> auto* { return &writers_; }
105
106 // setters:
107 void set_n_pipelines(std::size_t n_lines) { n_lines_ = n_lines; }
109 void set_show_data_speed(bool val = true) { monitor_.show_data_speed(val); }
110 void set_monitor_display_period(std::chrono::milliseconds duration) { monitor_.set_display_period(duration); }
111 void set_output_filenames(const std::vector<std::string>& filenames)
112 {
113 writers_.set_output_filenames(filenames);
114 }
115
116 void stop();
117
118 private:
119 using enum common::DataPrintMode;
120
121 std::size_t n_lines_ = 1;
122 std::atomic<bool> is_stopped_{ true };
123 std::size_t received_data_size_{};
125 std::atomic<uint64_t> total_read_data_bytes_ = 0;
126 std::atomic<uint64_t> total_drop_data_bytes_ = 0;
127 std::atomic<uint64_t> total_processed_hit_numer_ = 0;
128 std::atomic<uint64_t> total_frame_counts_ = 0;
129 gsl::not_null<App*> app_;
132
133 // Data buffer
134 tbb::concurrent_bounded_queue<process::SerializableMsgBuffer> data_queue_;
135 std::unique_ptr<TaskDiagram> task_diagram_ = nullptr;
136
138 };
139
140} // namespace srs::workflow
The primary interface class of SRS-Control.
std::string write_speed_string_
Definition Handler.hpp:69
void set_display_period(std::chrono::milliseconds duration)
Definition Handler.hpp:41
std::chrono::milliseconds period_
Definition Handler.hpp:58
std::string drop_speed_string_
Definition Handler.hpp:70
std::chrono::time_point< std::chrono::steady_clock > last_print_time_
Definition Handler.hpp:57
asio::steady_timer clock_
Definition Handler.hpp:56
auto get_processed_hit_rate() const -> double
Definition Handler.hpp:49
gsl::not_null< Handler * > processor_
Definition Handler.hpp:53
DataMonitor(Handler *processor, io_context_type *io_context)
Definition Handler.cpp:32
void show_data_speed(bool val=true)
Definition Handler.hpp:40
std::shared_ptr< spdlog::logger > console_
Definition Handler.hpp:55
auto print_cycle() -> asio::awaitable< void >
Definition Handler.cpp:39
auto get_received_bytes_MBps() const -> double
Definition Handler.hpp:48
gsl::not_null< io_context_type * > io_context_
Definition Handler.hpp:54
std::string read_speed_string_
Definition Handler.hpp:68
void read_data_once(std::span< BufferElementType > read_data)
Definition Handler.cpp:190
std::size_t received_data_size_
Definition Handler.hpp:123
auto get_data_workflow() const -> const TaskDiagram &
Definition Handler.cpp:181
tbb::concurrent_bounded_queue< process::SerializableMsgBuffer > data_queue_
Definition Handler.hpp:134
void set_monitor_display_period(std::chrono::milliseconds duration)
Definition Handler.hpp:110
auto get_app() -> auto &
Definition Handler.hpp:102
std::atomic< uint64_t > total_read_data_bytes_
Definition Handler.hpp:125
Handler(const Handler &)=delete
auto get_frame_counts() const -> uint64_t
Definition Handler.hpp:99
auto get_processed_hit_number() const -> uint64_t
Definition Handler.hpp:97
void set_n_pipelines(std::size_t n_lines)
Definition Handler.hpp:107
auto get_data_monitor() const -> const auto &
Definition Handler.hpp:100
writer::Manager writers_
Definition Handler.hpp:130
Handler & operator=(Handler &&)=delete
Handler(App *control, std::size_t n_lines=1)
Definition Handler.cpp:121
std::unique_ptr< TaskDiagram > task_diagram_
Definition Handler.hpp:135
Handler & operator=(const Handler &)=delete
std::atomic< uint64_t > total_processed_hit_numer_
Definition Handler.hpp:127
gsl::not_null< App * > app_
Definition Handler.hpp:129
Handler(Handler &&)=delete
common::DataPrintMode print_mode_
Definition Handler.hpp:124
std::atomic< bool > is_stopped_
Definition Handler.hpp:122
auto get_read_data_bytes() const -> uint64_t
Definition Handler.hpp:96
auto get_n_lines() const -> auto
Definition Handler.hpp:103
std::atomic< uint64_t > total_drop_data_bytes_
Definition Handler.hpp:126
auto get_writer() -> auto *
Definition Handler.hpp:104
void set_output_filenames(const std::vector< std::string > &filenames)
Definition Handler.hpp:111
void set_print_mode(common::DataPrintMode mode)
Definition Handler.hpp:108
std::atomic< uint64_t > total_frame_counts_
Definition Handler.hpp:128
void set_show_data_speed(bool val=true)
Definition Handler.hpp:109
auto get_drop_data_bytes() const -> uint64_t
Definition Handler.hpp:98
constexpr auto DEFAULT_DISPLAY_PERIOD
DataPrintMode
Print mode of the status line.
@ print_speed
Print the data reading rate.
asio::thread_pool io_context_type