00001 #ifndef artdaq_DAQrate_RequestSender_hh
00002 #define artdaq_DAQrate_RequestSender_hh
00003
00004 #include "artdaq/DAQdata/Globals.hh"
00005 #include "artdaq-core/Data/RawEvent.hh"
00006 #include "artdaq-utilities/Plugins/MetricManager.hh"
00007 #include "artdaq/DAQrate/detail/RequestMessage.hh"
00008 #include "fhiclcpp/ParameterSet.h"
00009
00010 #include <map>
00011 #include <memory>
00012 #include <chrono>
00013 #include <future>
00014 #include <stdint.h>
00015 #include <arpa/inet.h>
00016 #include <netinet/in.h>
00017 #include <sys/types.h>
00018 #include <sys/socket.h>
00019
00020 namespace artdaq
00021 {
00022
00026 class RequestSender
00027 {
00028 public:
00032 RequestSender() = delete;
00033
00037 RequestSender(RequestSender const&) = delete;
00038
00043 RequestSender& operator=(RequestSender const&) = delete;
00044
00063 RequestSender(const fhicl::ParameterSet& pset);
00067 virtual ~RequestSender();
00068
00069
00074 void SetRequestMode(detail::RequestMessageMode mode);
00075
00080 detail::RequestMessageMode GetRequestMode() const { return request_mode_; }
00081
00086 void SendRequest(bool endOfRunOnly = false);
00087
00093 void AddRequest(Fragment::sequence_id_t seqID, Fragment::timestamp_t timestamp);
00094
00099 void RemoveRequest(Fragment::sequence_id_t seqID);
00100
00105 void SendRoutingToken(int nSlots);
00106 private:
00107
00108
00109 bool send_requests_;
00110 mutable std::mutex request_mutex_;
00111 mutable std::mutex request_send_mutex_;
00112 std::map<Fragment::sequence_id_t, Fragment::timestamp_t> active_requests_;
00113 int request_port_;
00114 size_t request_delay_;
00115 size_t request_shutdown_timeout_us_;
00116 int request_socket_;
00117 struct sockaddr_in request_addr_;
00118 std::string multicast_out_addr_;
00119 detail::RequestMessageMode request_mode_;
00120
00121 bool send_routing_tokens_;
00122 int token_port_;
00123 int token_socket_;
00124 std::string token_address_;
00125 std::atomic<bool> request_sending_;
00126
00127 private:
00128 void setup_requests_(std::string trigger_addr);
00129
00130 void do_send_request_();
00131
00132 void setup_tokens_();
00133
00134 void send_routing_token_(int nSlots);
00135 };
00136 }
00137 #endif