artdaq  v2_02_03
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Pages
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 <string>
9 #include <queue>
10 #include <mutex>
11 
12 
13 namespace artdaq
14 {
15  class RTIDDS;
16 }
17 
22 {
23 public:
24 
28  enum class IOType
29  {
30  reader,
31  writer
32  };
33 
40  RTIDDS(std::string name, IOType iotype, std::string max_size = "1000000");
41 
45  virtual ~RTIDDS() = default;
46 
47  // JCF, Apr-7-2016
48  // Are copy constructor, assignment operators, etc., logical absurdities?
49 
56  void copyFragmentToDDS_(artdaq::Fragment& fragment);
57 
65  void moveFragmentToDDS_(artdaq::Fragment&& fragment);
66 
70  class OctetsListener: public DDSDataReaderListener
71  {
72  public:
73 
78  void on_data_available(DDSDataReader* reader);
79 
86  bool receiveFragmentFromDDS(artdaq::Fragment& fragment,
87  const size_t receiveTimeout);
88 
89  private:
90 
91  DDS_Octets dds_octets_;
92  std::queue<DDS_Octets> dds_octets_queue_;
93 
94  std::mutex queue_mutex_;
95  };
96 
98 
99 private:
100 
101  std::string name_;
102  IOType iotype_;
103  std::string max_size_;
104 
105  std::unique_ptr<DDSDomainParticipant, std::function<void(DDSDomainParticipant * )>> participant_;
106 
107  DDSTopic* topic_octets_;
108  DDSOctetsDataWriter* octets_writer_;
109  DDSDataReader* octets_reader_;
110 
111  static void participantDeleter(DDSDomainParticipant* participant);
112 };
113 
114 #endif
DDS Transport Implementation.
Definition: RTIDDS.hh:21
virtual ~RTIDDS()=default
Default virtrual Destructor.
void moveFragmentToDDS_(artdaq::Fragment &&fragment)
Move a Fragment to DDS.
Definition: RTIDDS.cc:110
A class that reads data from DDS.
Definition: RTIDDS.hh:70
OctetsListener octets_listener_
The receiver.
Definition: RTIDDS.hh:97
void on_data_available(DDSDataReader *reader)
Action to perform when data is available.
Definition: RTIDDS.cc:164
bool receiveFragmentFromDDS(artdaq::Fragment &fragment, const size_t receiveTimeout)
Receive a Fragment from DDS.
Definition: RTIDDS.cc:216
RTIDDS(std::string name, IOType iotype, std::string max_size="1000000")
Construct a RTIDDS transmitter.
Definition: RTIDDS.cc:9
void copyFragmentToDDS_(artdaq::Fragment &fragment)
Copy a Fragment to DDS.
Definition: RTIDDS.cc:112
IOType
Whether this DDS instance is a reader or a writer.
Definition: RTIDDS.hh:28