1 #include "artdaq/TransferPlugins/TransferInterface.hh"
2 #include "artdaq-core/Data/Fragment.hh"
3 #include "artdaq-core/Utilities/ExceptionHandler.hh"
5 #include "cetlib/BasicPluginFactory.h"
6 #include "cetlib/filepath_maker.h"
7 #include "fhiclcpp/ParameterSet.h"
8 #include "fhiclcpp/make_ParameterSet.h"
10 #include <boost/asio.hpp>
11 #include "boost/bind.hpp"
12 #include <boost/lexical_cast.hpp>
27 fhicl::ParameterSet ReadParameterSet(
const std::string fhicl_filename)
29 if (std::getenv(
"FHICL_FILE_PATH") ==
nullptr)
32 <<
"INFO: environment variable FHICL_FILE_PATH was not set. Using \".\"\n";
33 setenv(
"FHICL_FILE_PATH",
".", 0);
36 fhicl::ParameterSet pset;
37 cet::filepath_lookup_after1 lookup_policy(
"FHICL_FILE_PATH");
38 fhicl::make_ParameterSet(fhicl_filename, lookup_policy, pset);
44 int main(
int argc,
char* argv[])
48 std::cerr <<
"Usage: <fhicl document> <number of sends (should be greater than 1) > <fragment payload size>" << std::endl;
52 std::string fhicl_filename = boost::lexical_cast<std::string>(argv[1]);
53 size_t num_sends = boost::lexical_cast<
size_t>(argv[2]);
54 size_t fragment_size = boost::lexical_cast<
size_t>(argv[3]);
58 std::cerr <<
"Logic in the program requires requested # of sends to be greater than 1" << std::endl;
62 std::unique_ptr<artdaq::TransferInterface> transfer;
64 auto pset = ReadParameterSet(fhicl_filename);
68 static cet::BasicPluginFactory bpf(
"transfer",
"make");
71 bpf.makePlugin<std::unique_ptr<artdaq::TransferInterface>,
72 const fhicl::ParameterSet&,
74 pset.get<std::string>(
"transfer_plugin_type"),
80 artdaq::ExceptionHandler(artdaq::ExceptionHandlerRethrow::no,
81 "Error creating transfer plugin");
85 std::unique_ptr<artdaq::Fragment> frag = artdaq::Fragment::FragmentBytes(fragment_size);
87 struct ArbitraryMetadata
89 const uint64_t val1 = 0;
90 const uint32_t val2 = 0;
93 ArbitraryMetadata arbitraryMetadata;
95 frag->setMetadata(arbitraryMetadata);
100 std::iota(reinterpret_cast<uint64_t*>(frag->dataBeginBytes()),
101 reinterpret_cast<uint64_t*>(frag->dataEndBytes()),
104 size_t timeout = pset.get<
size_t>(
"send_timeout_usecs", std::numeric_limits<size_t>::max());
106 for (
size_t i_i = 0; i_i < num_sends; ++i_i)
108 frag->setSequenceID(i_i + 1);
109 frag->setFragmentID(0);
110 frag->setUserType(artdaq::Fragment::FirstUserFragmentType);
112 transfer->copyFragment(*frag, timeout);
115 std::cout <<
"# of sent fragments attempted == " << num_sends << std::endl;
This TransferInterface is a Sender.
Role
Used to determine if a TransferInterface is a Sender or Receiver.