Psyllid  v1.12.4
Project 8 Data Acquisisition Software
daq_control.hh
Go to the documentation of this file.
1 /*
2  * daq_control.hh
3  *
4  * Created on: Jan 22, 2016
5  * Author: nsoblath
6  */
7 
8 #ifndef PSYLLID_DAQ_CONTROL_HH_
9 #define PSYLLID_DAQ_CONTROL_HH_
10 
11 #include "control_access.hh"
12 #include "stream_manager.hh" // for midge_package
13 #include "psyllid_error.hh"
14 
15 #include "cancelable.hh"
16 #include "member_variables.hh"
17 
18 #include <atomic>
19 #include <condition_variable>
20 #include <future>
21 #include <memory>
22 #include <mutex>
23 #include <thread>
24 
25 namespace psyllid
26 {
27  class message_relayer;
28 
60  class daq_control : public scarab::cancelable, public control_access
61  {
62  public:
63  class run_error : public error
64  {
65  public:
66  run_error() {}
67  virtual ~run_error() {}
68  };
69  class status_error : public error
70  {
71  public:
73  virtual ~status_error() {}
74  };
75 
76  public:
77  daq_control( const scarab::param_node& a_master_config, std::shared_ptr< stream_manager > a_mgr );
78  virtual ~daq_control();
79 
81  void initialize();
82 
84  void execute( std::condition_variable& a_ready_condition_variable, std::mutex& a_ready_mutex );
85 
89  void activate();
93  void reactivate();
97  void deactivate();
98 
99  bool is_ready_at_startup() const;
100 
105  void start_run();
106 
110  void stop_run();
111 
112  public:
113  void apply_config( const std::string& a_node_name, const scarab::param_node& a_config );
114  void dump_config( const std::string& a_node_name, scarab::param_node& a_config );
115 
118  bool run_command( const std::string& a_node_name, const std::string& a_cmd, const scarab::param_node& a_args );
119 
120  public:
121  dripline::reply_ptr_t handle_activate_daq_control( const dripline::request_ptr_t a_request );
122  dripline::reply_ptr_t handle_reactivate_daq_control( const dripline::request_ptr_t a_request );
123  dripline::reply_ptr_t handle_deactivate_daq_control( const dripline::request_ptr_t a_request );
124 
125  dripline::reply_ptr_t handle_start_run_request( const dripline::request_ptr_t a_request );
126 
127  dripline::reply_ptr_t handle_stop_run_request( const dripline::request_ptr_t a_request );
128 
129  dripline::reply_ptr_t handle_apply_config_request( const dripline::request_ptr_t a_request );
130  dripline::reply_ptr_t handle_dump_config_request( const dripline::request_ptr_t a_request );
131  dripline::reply_ptr_t handle_run_command_request( const dripline::request_ptr_t a_request );
132 
133  dripline::reply_ptr_t handle_set_filename_request( const dripline::request_ptr_t a_request );
134  dripline::reply_ptr_t handle_set_description_request( const dripline::request_ptr_t a_request );
135  dripline::reply_ptr_t handle_set_duration_request( const dripline::request_ptr_t a_request );
136  dripline::reply_ptr_t handle_set_use_monarch_request( const dripline::request_ptr_t a_request );
137 
138  dripline::reply_ptr_t handle_get_status_request( const dripline::request_ptr_t a_request );
139  dripline::reply_ptr_t handle_get_filename_request( const dripline::request_ptr_t a_request );
140  dripline::reply_ptr_t handle_get_description_request( const dripline::request_ptr_t a_request );
141  dripline::reply_ptr_t handle_get_duration_request( const dripline::request_ptr_t a_request );
142  dripline::reply_ptr_t handle_get_use_monarch_request( const dripline::request_ptr_t a_request );
143 
144  private:
145  void do_cancellation( int a_code );
146 
147  void do_run( unsigned a_duration );
148 
149  std::condition_variable f_activation_condition;
150  std::mutex f_daq_mutex;
151 
152  std::shared_ptr< stream_manager > f_node_manager;
153 
154  scarab::param_node f_daq_config;
155 
158 
159  std::condition_variable f_run_stopper; // ends the run after a given amount of time
160  std::mutex f_run_stop_mutex; // mutex used by the run_stopper
161  bool f_do_break_run; // bool to confirm that the run should stop; protected by f_run_stop_mutex
162 
163  std::future< void > f_run_return;
164 
166 
167  public:
168  void set_filename( const std::string& a_filename, unsigned a_file_num = 0 );
169  const std::string& get_filename( unsigned a_file_num = 0 );
170 
171  void set_description( const std::string& a_desc, unsigned a_file_num = 0 );
172  const std::string& get_description( unsigned a_file_num = 0 );
173 
174  mv_accessible( unsigned, run_duration );
175 
176  mv_accessible( bool, use_monarch );
177 
178  public:
179  enum class status:uint32_t
180  {
181  deactivated = 0,
182  activating = 2,
183  activated = 4,
184  running = 5,
185  deactivating = 6,
186  canceled = 8,
187  do_restart = 9,
188  done = 10,
189  error = 200
190  };
191 
192  static uint32_t status_to_uint( status a_status );
193  static status uint_to_status( uint32_t a_value );
194  static std::string interpret_status( status a_status );
195 
196  status get_status() const;
197  void set_status( status a_status );
198 
199  private:
200  std::atomic< status > f_status;
201 
202 
203  };
204 
206  {
207  return f_status.load();
208  }
209 
210  inline void daq_control::set_status( status a_status )
211  {
212  f_status.store( a_status );
213  return;
214  }
215 
216 
217 } /* namespace psyllid */
218 
219 #endif /* PSYLLID_DAQ_CONTROL_HH_ */
dripline::reply_ptr_t handle_reactivate_daq_control(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:604
virtual ~daq_control()
Definition: daq_control.cc:66
std::future< void > f_run_return
Definition: daq_control.hh:163
dripline::reply_ptr_t handle_apply_config_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:684
dripline::reply_ptr_t handle_get_use_monarch_request(const dripline::request_ptr_t a_request)
const std::string & get_filename(unsigned a_file_num=0)
static status uint_to_status(uint32_t a_value)
static std::string interpret_status(status a_status)
const std::string & get_description(unsigned a_file_num=0)
void do_run(unsigned a_duration)
Definition: daq_control.cc:355
dripline::reply_ptr_t handle_stop_run_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:671
void dump_config(const std::string &a_node_name, scarab::param_node &a_config)
Definition: daq_control.cc:531
std::condition_variable f_run_stopper
Definition: daq_control.hh:159
void initialize()
Pre-execution initialization (call after setting the control_access pointer)
Definition: daq_control.cc:70
std::atomic< status > f_status
Definition: daq_control.hh:200
Controls psyllid&#39;s status and forwards requests to the DAQ nodes.
Definition: daq_control.hh:60
bool run_command(const std::string &a_node_name, const std::string &a_cmd, const scarab::param_node &a_args)
Definition: daq_control.cc:561
dripline::reply_ptr_t handle_start_run_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:630
dripline::reply_ptr_t handle_set_use_monarch_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:930
void apply_config(const std::string &a_node_name, const scarab::param_node &a_config)
Definition: daq_control.cc:506
status get_status() const
Definition: daq_control.hh:205
dripline::reply_ptr_t handle_get_duration_request(const dripline::request_ptr_t a_request)
std::map< std::string, std::pair< node_binding *, midge::node *> > active_node_bindings
daq_control(const scarab::param_node &a_master_config, std::shared_ptr< stream_manager > a_mgr)
Definition: daq_control.cc:39
dripline::reply_ptr_t handle_activate_daq_control(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:591
Gives other classes access to daq_control.
std::shared_ptr< stream_manager > f_node_manager
Definition: daq_control.hh:152
static uint32_t status_to_uint(status a_status)
midge_package f_midge_pkg
Definition: daq_control.hh:156
dripline::reply_ptr_t handle_get_status_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:944
dripline::reply_ptr_t handle_run_command_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:817
void set_status(status a_status)
Definition: daq_control.hh:210
void set_description(const std::string &a_desc, unsigned a_file_num=0)
void execute(std::condition_variable &a_ready_condition_variable, std::mutex &a_ready_mutex)
Run the DAQ control thread.
Definition: daq_control.cc:76
std::mutex f_run_stop_mutex
Definition: daq_control.hh:160
dripline::reply_ptr_t handle_get_filename_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:959
void do_cancellation(int a_code)
Definition: daq_control.cc:481
dripline::reply_ptr_t handle_set_description_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:888
scarab::param_node f_daq_config
Definition: daq_control.hh:154
std::condition_variable f_activation_condition
Definition: daq_control.hh:149
active_node_bindings * f_node_bindings
Definition: daq_control.hh:157
std::mutex f_daq_mutex
Definition: daq_control.hh:150
dripline::reply_ptr_t handle_dump_config_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:758
bool is_ready_at_startup() const
Definition: daq_control.cc:324
void set_filename(const std::string &a_filename, unsigned a_file_num=0)
message_relayer * f_msg_relay
Definition: daq_control.hh:165
dripline::reply_ptr_t handle_set_duration_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:910
dripline::reply_ptr_t handle_get_description_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:981
dripline::reply_ptr_t handle_deactivate_daq_control(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:617
dripline::reply_ptr_t handle_set_filename_request(const dripline::request_ptr_t a_request)
Definition: daq_control.cc:867