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 transfer_fragment_min_blocking_mode(artdaq::Fragment const& fragment,
00058 size_t send_timeout_usec = std::numeric_limits<size_t>::max()) override;
00059
00065 CopyStatus transfer_fragment_reliable_mode(artdaq::Fragment&& fragment) override;
00066
00071 bool isRunning() override
00072 {
00073 switch (role())
00074 {
00075 case TransferInterface::Role::kSend:
00076 return rtidds_writer_ != nullptr;
00077 case TransferInterface::Role::kReceive:
00078 return rtidds_reader_ != nullptr;
00079 }
00080 }
00081 private:
00082 std::unique_ptr<artdaq::RTIDDS> rtidds_reader_;
00083 std::unique_ptr<artdaq::RTIDDS> rtidds_writer_;
00084 };
00085 }
00086
00087 int artdaq::RTIDDSTransfer::receiveFragment(artdaq::Fragment& fragment,
00088 size_t receiveTimeout)
00089 {
00090 bool receivedFragment = false;
00091
00092
00093
00094
00095
00096 try
00097 {
00098 receivedFragment = rtidds_reader_->octets_listener_.receiveFragmentFromDDS(fragment, receiveTimeout);
00099 }
00100 catch (...)
00101 {
00102 ExceptionHandler(ExceptionHandlerRethrow::yes,
00103 "Error in RTIDDS transfer plugin: caught exception in call to OctetsListener::receiveFragmentFromDDS, rethrowing");
00104 }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121 return receivedFragment ? source_rank() : TransferInterface::RECV_TIMEOUT;
00122 }
00123
00124 artdaq::TransferInterface::CopyStatus
00125 artdaq::RTIDDSTransfer::transfer_fragment_reliable_mode(artdaq::Fragment&& fragment)
00126 {
00127 rtidds_writer_->transfer_fragment_reliable_mode_via_DDS_(std::move(fragment));
00128 return CopyStatus::kSuccess;
00129 }
00130
00131 artdaq::TransferInterface::CopyStatus
00132 artdaq::RTIDDSTransfer::transfer_fragment_min_blocking_mode(artdaq::Fragment const& fragment,
00133 size_t send_timeout_usec)
00134 {
00135 (void) &send_timeout_usec;
00136
00137 rtidds_writer_->transfer_fragment_min_blocking_mode_via_DDS_(fragment);
00138 return CopyStatus::kSuccess;
00139 }
00140
00141 DEFINE_ARTDAQ_TRANSFER(artdaq::RTIDDSTransfer)
00142
00143
00144
00145