artdaq  v3_12_02
RTIDDS.hh
1 #ifndef artdaq_RTIDDS_RTIDDS_hh
2 #define artdaq_RTIDDS_RTIDDS_hh
3 
4 #include "TRACE/tracemf.h" // Pre-empt TRACE/trace.h from Fragment.hh.
5 #include "artdaq-core/Data/Fragment.hh"
6 
7 #include <ndds/ndds_cpp.h>
8 
9 #include <mutex>
10 #include <queue>
11 #include <string>
12 
13 namespace artdaq {
14 class RTIDDS;
15 }
16 
21 {
22 public:
26  enum class IOType
27  {
28  reader,
29  writer
30  };
31 
38  RTIDDS(std::string name, IOType iotype, std::string max_size = "1000000");
39 
43  virtual ~RTIDDS() = default;
44 
45  // JCF, Apr-7-2016
46  // Are copy constructor, assignment operators, etc., logical absurdities?
47 
54  void transfer_fragment_min_blocking_mode_via_DDS_(artdaq::Fragment const& fragment);
55 
63  void transfer_fragment_reliable_mode_via_DDS_(artdaq::Fragment&& fragment);
64 
68  class OctetsListener : public DDSDataReaderListener
69  {
70  public:
75  void on_data_available(DDSDataReader* reader);
76 
83  bool receiveFragmentFromDDS(artdaq::Fragment& fragment,
84  const size_t receiveTimeout);
85 
86  private:
87  DDS_Octets dds_octets_;
88  std::queue<DDS_Octets> dds_octets_queue_;
89 
90  std::mutex queue_mutex_;
91  };
92 
94 
95 private:
96  std::string name_;
97  IOType iotype_;
98  std::string max_size_;
99 
100  std::unique_ptr<DDSDomainParticipant, std::function<void(DDSDomainParticipant*)>> participant_;
101 
102  DDSTopic* topic_octets_;
103  DDSOctetsDataWriter* octets_writer_;
104  DDSDataReader* octets_reader_;
105 
106  static void participantDeleter(DDSDomainParticipant* participant);
107 };
108 
109 #endif
DDS Transport Implementation.
Definition: RTIDDS.hh:20
virtual ~RTIDDS()=default
Default virtrual Destructor.
void transfer_fragment_min_blocking_mode_via_DDS_(artdaq::Fragment const &fragment)
Copy a Fragment to DDS.
Definition: RTIDDS.cc:109
A class that reads data from DDS.
Definition: RTIDDS.hh:68
OctetsListener octets_listener_
The receiver.
Definition: RTIDDS.hh:93
void on_data_available(DDSDataReader *reader)
Action to perform when data is available.
Definition: RTIDDS.cc:161
bool receiveFragmentFromDDS(artdaq::Fragment &fragment, const size_t receiveTimeout)
Receive a Fragment from DDS.
Definition: RTIDDS.cc:211
RTIDDS(std::string name, IOType iotype, std::string max_size="1000000")
Construct a RTIDDS transmitter.
Definition: RTIDDS.cc:11
void transfer_fragment_reliable_mode_via_DDS_(artdaq::Fragment &&fragment)
Move a Fragment to DDS.
Definition: RTIDDS.cc:107
IOType
Whether this DDS instance is a reader or a writer.
Definition: RTIDDS.hh:26