1 #include "artdaq/TransferPlugins/TransferInterface.hh"
3 #include "artdaq-core/Data/Fragment.hh"
4 #include "artdaq-core/Utilities/ExceptionHandler.hh"
6 #include "cetlib/BasicPluginFactory.h"
7 #include "cetlib/exception.h"
8 #include "cetlib/filepath_maker.h"
9 #include "fhiclcpp/ParameterSet.h"
10 #include "fhiclcpp/make_ParameterSet.h"
12 #include <boost/asio.hpp>
13 #include "boost/bind.hpp"
24 fhicl::ParameterSet ReadParameterSet(
const std::string fhicl_filename)
26 if (std::getenv(
"FHICL_FILE_PATH") ==
nullptr)
29 <<
"INFO: environment variable FHICL_FILE_PATH was not set. Using \".\"\n";
30 setenv(
"FHICL_FILE_PATH",
".", 0);
33 fhicl::ParameterSet pset;
34 cet::filepath_lookup_after1 lookup_policy(
"FHICL_FILE_PATH");
35 fhicl::make_ParameterSet(fhicl_filename, lookup_policy, pset);
41 int do_check(
const artdaq::Fragment& frag);
43 int main(
int argc,
char* argv[])
47 std::cerr <<
"Usage: transfer_plugin_receiver <fhicl document>" << std::endl;
51 std::string fhicl_filename = boost::lexical_cast<std::string>(argv[1]);
53 std::unique_ptr<artdaq::TransferInterface> transfer;
54 auto pset = ReadParameterSet(fhicl_filename);
58 static cet::BasicPluginFactory bpf(
"transfer",
"make");
61 bpf.makePlugin<std::unique_ptr<artdaq::TransferInterface>,
62 const fhicl::ParameterSet&,
64 pset.get<std::string>(
"transfer_plugin_type"),
70 artdaq::ExceptionHandler(artdaq::ExceptionHandlerRethrow::yes,
71 "Error creating transfer plugin");
77 artdaq::Fragment myfrag;
78 size_t timeout = 10 * 1e6;
80 auto retval = transfer->receiveFragment(myfrag, timeout);
84 std::cout <<
"Returned from call to transfer_->receiveFragmentFrom; fragment with seqID == " <<
85 myfrag.sequenceID() <<
", fragID == " << myfrag.fragmentID() <<
" has size " <<
86 myfrag.sizeBytes() <<
" bytes" << std::endl;
90 std::cerr <<
"RECV_TIMEOUT received from call to transfer->receiveFragmentFrom" << std::endl;
94 if (do_check(myfrag) != 0)
96 std::cerr <<
"Error: do_check indicates fragment failed to transmit correctly" << std::endl;
100 std::cerr <<
"Success: do_check indicates fragment transmitted correctly" << std::endl;
112 int do_check(
const artdaq::Fragment& frag)
114 uint64_t variable_to_compare = 0;
116 for (
auto ptr_into_frag = reinterpret_cast<const uint64_t*>(frag.dataBeginBytes());
117 ptr_into_frag !=
reinterpret_cast<const uint64_t*
>(frag.dataEndBytes());
118 ++ptr_into_frag , ++variable_to_compare)
120 if (variable_to_compare != *ptr_into_frag)
122 std::cerr <<
"ERROR for fragment with sequence ID " << frag.sequenceID() <<
", fragment ID " <<
123 frag.fragmentID() <<
": expected ADC value of " << variable_to_compare <<
", got " << *ptr_into_frag << std::endl;
static const int RECV_TIMEOUT
Value to be returned upon receive timeout. Because receivers otherwise return rank, this is also the limit on the number of ranks that artdaq currently supports.
This TransferInterface is a Receiver.
Role
Used to determine if a TransferInterface is a Sender or Receiver.