00001 #include "artdaq/TransferPlugins/TransferInterface.hh"
00002
00003 #include "artdaq/RTIDDS/RTIDDS.hh"
00004
00005 #include "artdaq-core/Utilities/ExceptionHandler.hh"
00006 #include <memory>
00007 #include <iostream>
00008
00009
00010 namespace fhicl
00011 {
00012 class ParameterSet;
00013 }
00014
00015
00016
00017 namespace artdaq
00018 {
00022 class RTIDDSTransfer : public TransferInterface
00023 {
00024 public:
00028 virtual ~RTIDDSTransfer() = default;
00029
00037 RTIDDSTransfer(fhicl::ParameterSet const& ps, Role role) :
00038 TransferInterface(ps, role)
00039 , rtidds_reader_(std::make_unique<artdaq::RTIDDS>("RTIDDSTransfer_reader", artdaq::RTIDDS::IOType::reader))
00040 , rtidds_writer_(std::make_unique<artdaq::RTIDDS>("RTIDDSTransfer_writer", artdaq::RTIDDS::IOType::writer)) { }
00041
00048 int receiveFragment(artdaq::Fragment& fragment,
00049 size_t receiveTimeout) override;
00050
00057 CopyStatus copyFragment(artdaq::Fragment& fragment,
00058 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override;
00059
00066 CopyStatus moveFragment(artdaq::Fragment&& fragment,
00067 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override;
00068
00073 bool isRunning() override
00074 {
00075 switch (role())
00076 {
00077 case TransferInterface::Role::kSend:
00078 return rtidds_writer_ != nullptr;
00079 case TransferInterface::Role::kReceive:
00080 return rtidds_reader_ != nullptr;
00081 }
00082 }
00083 private:
00084 std::unique_ptr<artdaq::RTIDDS> rtidds_reader_;
00085 std::unique_ptr<artdaq::RTIDDS> rtidds_writer_;
00086 };
00087 }
00088
00089 int artdaq::RTIDDSTransfer::receiveFragment(artdaq::Fragment& fragment,
00090 size_t receiveTimeout)
00091 {
00092 bool receivedFragment = false;
00093
00094
00095
00096
00097
00098 try
00099 {
00100 receivedFragment = rtidds_reader_->octets_listener_.receiveFragmentFromDDS(fragment, receiveTimeout);
00101 }
00102 catch (...)
00103 {
00104 ExceptionHandler(ExceptionHandlerRethrow::yes,
00105 "Error in RTIDDS transfer plugin: caught exception in call to OctetsListener::receiveFragmentFromDDS, rethrowing");
00106 }
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 return receivedFragment ? source_rank() : TransferInterface::RECV_TIMEOUT;
00124 }
00125
00126 artdaq::TransferInterface::CopyStatus
00127 artdaq::RTIDDSTransfer::moveFragment(artdaq::Fragment&& fragment, size_t send_timeout_usec)
00128 {
00129 (void)&send_timeout_usec;
00130
00131 rtidds_writer_->moveFragmentToDDS_(std::move(fragment));
00132 return CopyStatus::kSuccess;
00133 }
00134
00135 artdaq::TransferInterface::CopyStatus
00136 artdaq::RTIDDSTransfer::copyFragment(artdaq::Fragment& fragment,
00137 size_t send_timeout_usec)
00138 {
00139 (void) &send_timeout_usec;
00140
00141 rtidds_writer_->copyFragmentToDDS_(fragment);
00142 return CopyStatus::kSuccess;
00143 }
00144
00145 DEFINE_ARTDAQ_TRANSFER(artdaq::RTIDDSTransfer)
00146
00147
00148
00149