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