SRS-control 0.1.4
 
Loading...
Searching...
No Matches
Application.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <thread>
4
5#include <boost/asio/ip/udp.hpp>
6#include <boost/asio/signal_set.hpp>
7#include <boost/asio/thread_pool.hpp>
8
9// #include <srs/devices/Fec.hpp>
13
14namespace srs
15{
16 namespace workflow
17 {
18 class Handler;
19 } // namespace workflow
20
21 namespace connection
22 {
23 class DataReader;
24 }
25
26 class App;
27
29 {
30 public:
31 explicit AppExitHelper(App* app)
32 : app_{ app }
33 {
34 }
35
36 AppExitHelper(const AppExitHelper&) = default;
40 ~AppExitHelper() noexcept;
41
42 private:
44 };
45
46 class App
47 {
48 public:
49 App();
50
51 App(const App&) = delete;
52 App(App&&) = delete;
53 App& operator=(const App&) = delete;
54 App& operator=(App&&) = delete;
55 ~App() noexcept;
56
57 // public APIs
58 void init();
59 void configure_fec() {}
60 void switch_on();
61 void switch_off();
62 void read_data(bool is_non_stop = true);
63
64 void notify_status_change() { status_.status_change.notify_all(); }
65 void start_workflow(bool is_blocking = true);
66 void wait_for_finish();
67 auto wait_for_status(auto&& condition,
68 std::chrono::seconds time_duration = common::DEFAULT_STATUS_WAITING_TIME_SECONDS) -> bool
69 {
70 return status_.wait_for_status(std::forward<decltype(condition)>(condition), time_duration);
71 }
72
73 // setters:
74 void set_remote_endpoint(std::string_view remote_ip, int port_number);
75 void set_fec_data_receiv_port(int port_num) { configurations_.fec_data_receive_port = port_num; }
76 void set_status_acq_on(bool val = true) { status_.is_acq_on.store(val); }
77 void set_status_acq_off(bool val = true) { status_.is_acq_off.store(val); }
78 void set_status_is_reading(bool val = true) { status_.is_reading.store(val); }
79 void set_print_mode(common::DataPrintMode mode);
80 void set_output_filenames(const std::vector<std::string>& filenames);
81 void set_error_string(std::string_view err_msg) { error_string_ = err_msg; }
82
83 // getters:
84 [[nodiscard]] auto get_channel_address() const -> uint16_t { return channel_address_; }
85 // [[nodiscard]] auto get_fec_config() const -> const auto& { return fec_config_; }
86 [[nodiscard]] auto get_status() const -> const auto& { return status_; }
87 [[nodiscard]] auto get_io_context() -> auto& { return io_context_; }
89 [[nodiscard]] auto get_error_string() const -> const std::string& { return error_string_; }
90 [[nodiscard]] auto get_workflow_handler() const -> const auto& { return *workflow_handler_; };
91
92 // called by ExitHelper
93 void end_of_work();
94
95 private:
96 using udp = asio::ip::udp;
97
101 std::string error_string_;
102
103 // Destructors are called in the inversed order
105 asio::executor_work_guard<io_context_type::executor_type> io_work_guard_;
106 udp::endpoint remote_endpoint_;
107 asio::signal_set signal_set_{ io_context_, SIGINT, SIGTERM };
108 std::jthread working_thread_;
110 std::unique_ptr<workflow::Handler> workflow_handler_;
111 std::shared_ptr<connection::DataReader> data_reader_;
112
113 void exit();
115 };
116
117} // namespace srs
AppExitHelper(AppExitHelper &&)=delete
~AppExitHelper() noexcept
AppExitHelper & operator=(AppExitHelper &&)=delete
AppExitHelper(App *app)
AppExitHelper & operator=(const AppExitHelper &)=default
AppExitHelper(const AppExitHelper &)=default
asio::executor_work_guard< io_context_type::executor_type > io_work_guard_
void set_fec_data_receiv_port(int port_num)
void init()
auto get_data_reader() -> connection::DataReader *
App & operator=(const App &)=delete
Config configurations_
void exit()
void set_status_acq_on(bool val=true)
auto get_status() const -> const auto &
uint16_t channel_address_
std::string error_string_
std::shared_ptr< connection::DataReader > data_reader_
Status status_
asio::signal_set signal_set_
AppExitHelper exit_helper_
auto get_error_string() const -> const std::string &
void notify_status_change()
auto get_workflow_handler() const -> const auto &
std::jthread working_thread_
std::unique_ptr< workflow::Handler > workflow_handler_
auto get_channel_address() const -> uint16_t
asio::ip::udp udp
App & operator=(App &&)=delete
void set_status_is_reading(bool val=true)
auto wait_for_status(auto &&condition, std::chrono::seconds time_duration=common::DEFAULT_STATUS_WAITING_TIME_SECONDS) -> bool
App(const App &)=delete
auto get_io_context() -> auto &
udp::endpoint remote_endpoint_
void configure_fec()
io_context_type io_context_
App(App &&)=delete
void wait_for_reading_finish()
void set_error_string(std::string_view err_msg)
void set_status_acq_off(bool val=true)
asio::thread_pool io_context_type
constexpr auto DEFAULT_CHANNEL_ADDRE
constexpr auto DEFAULT_STATUS_WAITING_TIME_SECONDS