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/strand.hpp>
8#include <boost/asio/thread_pool.hpp>
9
10// #include <srs/devices/Fec.hpp>
14
15namespace srs
16{
17 namespace workflow
18 {
19 class Handler;
20 } // namespace workflow
21
22 namespace connection
23 {
24 class DataReader;
25 }
26
27 class App;
28
30 {
31 public:
32 explicit AppExitHelper(App* app)
33 : app_{ app }
34 {
35 }
36
37 AppExitHelper(const AppExitHelper&) = default;
41 ~AppExitHelper() noexcept;
42
43 private:
45 };
46
47 class App
48 {
49 public:
50 App();
51
52 App(const App&) = delete;
53 App(App&&) = delete;
54 App& operator=(const App&) = delete;
55 App& operator=(App&&) = delete;
56 ~App() noexcept;
57
58 // public APIs
59 void init();
60 void configure_fec() {}
61 void switch_on();
62 void switch_off();
63 void read_data(bool is_non_stop = true);
64
65 void notify_status_change() { status_.status_change.notify_all(); }
66 void start_workflow(bool is_blocking = true);
67 void wait_for_finish();
68 auto wait_for_status(auto&& condition,
69 std::chrono::seconds time_duration = common::DEFAULT_STATUS_WAITING_TIME_SECONDS) -> bool
70 {
71 return status_.wait_for_status(std::forward<decltype(condition)>(condition), time_duration);
72 }
73
74 // setters:
75 void set_remote_endpoint(std::string_view remote_ip, int port_number);
76 void set_fec_data_receiv_port(int port_num) { configurations_.fec_data_receive_port = port_num; }
77 void set_status_acq_on(bool val = true) { status_.is_acq_on.store(val); }
78 void set_status_acq_off(bool val = true) { status_.is_acq_off.store(val); }
79 void set_status_is_reading(bool val = true) { status_.is_reading.store(val); }
80 void set_print_mode(common::DataPrintMode mode);
81 void set_output_filenames(const std::vector<std::string>& filenames);
82 void set_error_string(std::string_view err_msg) { error_string_ = err_msg; }
83 void set_options(Config options) { configurations_ = std::move(options); }
84
85 // getters:
86 [[nodiscard]] auto get_channel_address() const -> uint16_t { return channel_address_; }
87 // [[nodiscard]] auto get_fec_config() const -> const auto& { return fec_config_; }
88 [[nodiscard]] auto get_status() const -> const auto& { return status_; }
89 [[nodiscard]] auto get_io_context() -> auto& { return io_context_; }
90 [[nodiscard]] auto get_fec_strand() -> auto& { return fec_strand_; }
92 [[nodiscard]] auto get_error_string() const -> const std::string& { return error_string_; }
93 [[nodiscard]] auto get_workflow_handler() const -> const auto& { return *workflow_handler_; };
94
95 // called by ExitHelper
96 void end_of_work();
97
98 private:
99 using udp = asio::ip::udp;
100
104 std::string error_string_;
105
106 // Destructors are called in the inversed order
108 asio::executor_work_guard<io_context_type::executor_type> io_work_guard_;
109 udp::endpoint remote_endpoint_;
110 std::vector<udp::endpoint> remote_fec_endpoints_;
111 asio::signal_set signal_set_{ io_context_, SIGINT, SIGTERM };
112 asio::strand<io_context_type::executor_type> fec_strand_;
113 std::jthread working_thread_;
115 std::unique_ptr<workflow::Handler> workflow_handler_;
116 std::shared_ptr<connection::DataReader> data_reader_;
117
118 void exit();
121 void add_remote_fec_endpoint(std::string_view remote_ip, int port_number);
122 };
123
124} // 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_
void add_remote_fec_endpoint(std::string_view remote_ip, int port_number)
asio::signal_set signal_set_
AppExitHelper exit_helper_
auto get_error_string() const -> const std::string &
std::vector< udp::endpoint > remote_fec_endpoints_
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
auto get_fec_strand() -> auto &
asio::strand< io_context_type::executor_type > fec_strand_
App(const App &)=delete
auto get_io_context() -> auto &
udp::endpoint remote_endpoint_
void set_options(Config options)
void set_remote_fec_endpoints()
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