artdaq  3.13.00
RequestReceiver.hh
1 #ifndef ARTDAQ_DAQRATE_REQUEST_RECEVIER_HH
2 #define ARTDAQ_DAQRATE_REQUEST_RECEVIER_HH
3 
4 #include "TRACE/tracemf.h" // Pre-empt TRACE/trace.h from Fragment.hh.
5 #include "artdaq-core/Data/Fragment.hh"
6 
7 #include "artdaq/DAQrate/RequestBuffer.hh"
8 
9 namespace fhicl {
10 class ParameterSet;
11 }
12 
13 #include "fhiclcpp/types/Atom.h"
14 #include "fhiclcpp/types/Comment.h"
15 #include "fhiclcpp/types/ConfigurationTable.h"
16 #include "fhiclcpp/types/Name.h"
17 
18 #include <boost/thread.hpp>
19 #include <mutex>
20 
21 namespace artdaq {
26 {
27 public:
31  struct Config
32  {
34  fhicl::Atom<bool> receive_requests{fhicl::Name{"receive_requests"}, fhicl::Comment{"Whether this RequestReceiver will listen for requests"}, false};
36  fhicl::Atom<int> request_port{fhicl::Name{"request_port"}, fhicl::Comment{"Port to listen for request messages on"}, 3001};
38  fhicl::Atom<std::string> request_addr{fhicl::Name{"request_address"}, fhicl::Comment{"Multicast address to listen for request messages on"}, "227.128.12.26"};
40  fhicl::Atom<std::string> output_address{fhicl::Name{"multicast_interface_ip"}, fhicl::Comment{"Use this hostname for multicast (to assign to the proper NIC)"}, "0.0.0.0"};
42  fhicl::Atom<size_t> end_of_run_timeout_ms{fhicl::Name{"end_of_run_quiet_timeout_ms"}, fhicl::Comment{"Amount of time (in ms) to wait for no new requests when a Stop transition is pending"}, 1000};
43  };
45  using Parameters = fhicl::WrappedTable<Config>;
46 
51 
57  RequestReceiver(const fhicl::ParameterSet& ps, std::shared_ptr<RequestBuffer> output_buffer);
58 
62  virtual ~RequestReceiver();
63 
67  void setupRequestListener();
68 
73  void stopRequestReception(bool force = false);
74 
78  void startRequestReception();
79 
83  void receiveRequestsLoop();
84 
89  bool isRunning() { return running_; }
90 
95  void SetRunNumber(uint32_t run) { run_number_ = run; }
96 
97  size_t GetReceivedMessageCount() { return requests_received_.load(); }
98 
99 private:
100  RequestReceiver(RequestReceiver const&) = delete;
101  RequestReceiver(RequestReceiver&&) = delete;
102  RequestReceiver& operator=(RequestReceiver const&) = delete;
103  RequestReceiver& operator=(RequestReceiver&&) = delete;
104 
105  bool running_{false};
106  std::atomic<bool> request_stop_requested_;
107  std::atomic<size_t> requests_received_;
108  std::atomic<bool> should_stop_;
109 
110  int request_port_{3001};
111  uint32_t run_number_{0};
112  std::string request_addr_;
113  std::string multicast_in_addr_;
114  bool receive_requests_;
115 
116  // Socket parameters
117  int request_socket_{-1};
118  std::chrono::steady_clock::time_point request_stop_timeout_;
119  size_t end_of_run_timeout_ms_{1000};
120  mutable std::mutex state_mutex_;
121  boost::thread requestThread_;
122 
123  std::shared_ptr<RequestBuffer> requests_;
124 };
125 } // namespace artdaq
126 
127 #endif // ARTDAQ_DAQRATE_REQUEST_RECEVIER_HH
void startRequestReception()
Enables (starts) the reception of data requests.
fhicl::Atom< size_t > end_of_run_timeout_ms
&quot;end_of_run_quiet_timeout_ms&quot; (Default: 1000) : Time, in milliseconds, that the entire system must be...
fhicl::Atom< std::string > request_addr
&quot;request_address&quot; (Default: &quot;227.128.12.26&quot;) : Address which CommandableFragmentGenerator will listen...
fhicl::Atom< std::string > output_address
&quot;multicast_interface_ip&quot; (Default: &quot;0.0.0.0&quot;) : Use this hostname for multicast(to assign to the prop...
fhicl::WrappedTable< Config > Parameters
Used for ParameterSet validation (if desired)
RequestReceiver()
RequestReceiver Default Constructor.
bool isRunning()
Determine if the RequestReceiver is receiving requests
void setupRequestListener()
Opens the socket used to listen for data requests.
void receiveRequestsLoop()
This function receives data request packets, adding new requests to the request list.
virtual ~RequestReceiver()
RequestReceiver Destructor.
Receive data requests and make them available to CommandableFragmentGenerator or other interested par...
void SetRunNumber(uint32_t run)
Sets the current run number
fhicl::Atom< int > request_port
&quot;request_port&quot; (Default: 3001) : Port on which data requests will be received
void stopRequestReception(bool force=false)
Disables (stops) the reception of data requests.
fhicl::Atom< bool > receive_requests
&quot;receive_requests&quot; (Default: false): Whether this RequestReceiver will listen for requests ...
Configuration of the RequestReceiver. May be used for parameter validation