1 #ifndef artdaq_DAQrate_RequestSender_hh
2 #define artdaq_DAQrate_RequestSender_hh
4 #include "artdaq-core/Data/RawEvent.hh"
5 #include "artdaq-utilities/Plugins/MetricManager.hh"
6 #include "artdaq/DAQdata/Globals.hh"
7 #include "artdaq/DAQrate/detail/RequestMessage.hh"
8 #include "fhiclcpp/ParameterSet.h"
9 #include "fhiclcpp/types/Table.h"
11 #include <arpa/inet.h>
12 #include <netinet/in.h>
14 #include <sys/socket.h>
15 #include <sys/types.h>
37 fhicl::Atom<bool>
use_routing_master{fhicl::Name{
"use_routing_master"}, fhicl::Comment{
"True if using the Routing Master"},
false};
39 fhicl::Atom<int>
routing_token_port{fhicl::Name{
"routing_token_port"}, fhicl::Comment{
"Port to send tokens on"}, 35555};
41 fhicl::Atom<std::string>
routing_token_host{fhicl::Name{
"routing_master_hostname"}, fhicl::Comment{
"Hostname or IP of RoutingMaster"},
"localhost"};
50 fhicl::Atom<bool>
send_requests{fhicl::Name{
"send_requests"}, fhicl::Comment{
"Enable sending Data Request messages"},
false};
52 fhicl::Atom<int>
request_port{fhicl::Name{
"request_port"}, fhicl::Comment{
"Port to send DataRequests on"}, 3001};
54 fhicl::Atom<size_t>
request_delay_ms{fhicl::Name{
"request_delay_ms"}, fhicl::Comment{
"How long to wait before sending new DataRequests"}, 10};
56 fhicl::Atom<size_t>
request_shutdown_timeout_us{fhicl::Name{
"request_shutdown_timeout_us"}, fhicl::Comment{
"How long to wait for pending requests to be sent at shutdown"}, 100000};
58 fhicl::Atom<std::string>
output_address{fhicl::Name{
"multicast_interface_ip"}, fhicl::Comment{
"Use this hostname for multicast output(to assign to the proper NIC)"},
"0.0.0.0"};
60 fhicl::Atom<std::string>
request_address{fhicl::Name{
"request_address"}, fhicl::Comment{
"Multicast address to send DataRequests to"},
"227.128.12.26"};
61 fhicl::Table<RoutingTokenConfig>
routing_token_config{fhicl::Name{
"routing_token_config"}, fhicl::Comment{
"FHiCL table containing RoutingToken configuration"}};
115 void AddRequest(Fragment::sequence_id_t seqID, Fragment::timestamp_t timestamp);
160 std::atomic<bool> initialized_;
161 mutable std::mutex request_mutex_;
162 mutable std::mutex request_send_mutex_;
163 std::map<Fragment::sequence_id_t, Fragment::timestamp_t> active_requests_;
164 std::string request_address_;
166 size_t request_delay_;
167 size_t request_shutdown_timeout_us_;
169 struct sockaddr_in request_addr_;
170 std::string multicast_out_addr_;
173 bool send_routing_tokens_;
176 std::string token_address_;
177 std::atomic<int> request_sending_;
178 std::atomic<size_t> tokens_sent_;
179 uint32_t run_number_;
182 void setup_requests_();
184 void do_send_request_();
186 void setup_tokens_();
188 void send_routing_token_(
int nSlots,
int run_number);
void RemoveRequest(Fragment::sequence_id_t seqID)
Remove a request from the request list.
size_t GetSentTokenCount() const
Get the count of number of tokens sent.
fhicl::Atom< bool > use_routing_master
"use_routing_master" (Default: false) : Whether to send tokens to a RoutingMaster ...
detail::RequestMessageMode GetRequestMode() const
Get the mode for RequestMessages.
fhicl::Atom< int > request_port
"request_port" (Default: 3001): Port to send DataRequests on
The RequestSender contains methods used to send data requests and Routing tokens. ...
void SendRoutingToken(int nSlots, int run_number)
Send a RoutingToken message indicating that slots are available.
virtual ~RequestSender()
RequestSender Destructor.
void SendRequest(bool endOfRunOnly=false)
Send a request message containing all current requests.
fhicl::Atom< bool > send_requests
"send_requests" (Default: false): Whether to send DataRequests when new sequence IDs are seen ...
Configuration for Routing token sending
RequestSender()=delete
Default Constructor is deleted.
void SetRunNumber(uint32_t run)
Set the run number to be used in request messages.
fhicl::WrappedTable< Config > Parameters
Used for ParameterSet validation (if desired)
fhicl::Atom< std::string > output_address
"multicast_interface_ip" (Default: "0.0.0.0"): Use this hostname for multicast output (to assign to t...
void SetRequestMode(detail::RequestMessageMode mode)
Set the mode for RequestMessages. Used to indicate when RequestSender should enter "EndOfRun" mode...
RequestMessageMode
Mode used to indicate current run conditions to the request receiver.
fhicl::Atom< size_t > request_shutdown_timeout_us
"request_shutdown_timeout_us" (Default: 100000 us): How long to wait for pending requests to be sent ...
fhicl::Table< RoutingTokenConfig > routing_token_config
Configuration for sending RoutingTokens. See artdaq::RequestSender::RoutingTokenConfig.
bool RoutingTokenSendsEnabled()
Determine if routing token sends are enabled.
fhicl::Atom< std::string > routing_token_host
"routing_master_hostname" (Default: "localhost") : Hostname or IP of RoutingMaster ...
RequestSender & operator=(RequestSender const &)=delete
Copy Assignment operator is deleted.
fhicl::Atom< size_t > request_delay_ms
"request_delay_ms" (Default: 10): How long to wait before sending new DataRequests ...
bool RequestsInFlight()
Determine if the RequestSender is currently sending any requests.
fhicl::Atom< int > routing_token_port
"routing_token_port" (Default: 35555) : Port to send tokens on
fhicl::Atom< std::string > request_address
"request_address" (Default: "227.128.12.26"): Multicast address to send DataRequests to ...
void AddRequest(Fragment::sequence_id_t seqID, Fragment::timestamp_t timestamp)
Add a request to the request list.
Configuration of the RequestSender. May be used for parameter validation