RTC Toolkit  0.1.0-alpha
ddsSubscriber.hpp
Go to the documentation of this file.
1 
8 #ifndef RTCKT_TELSUB_DDSSUBSCRIBER_HPP
9 #define RTCKT_TELSUB_DDSSUBSCRIBER_HPP
10 
11 #include <memory>
12 #include <map>
13 #include <set>
14 #include <list>
17 #include <ndds/ndds_cpp.h>
18 #include <ndds/ndds_namespace_cpp.h>
19 
20 namespace rtctk::telSub {
21 
26 class DdsSubscriber final : public DdsSubscriberIf {
27 public:
28 
29  DdsSubscriber(const DdsParams& params);
30  virtual ~DdsSubscriber() noexcept;
31 
32  DdsSubscriber(DdsSubscriber&& rhs) = default;
34 
35  std::error_code TakeSamples(
36  std::vector<std::vector<const rtctk::AgnosticTopic*>>& samples,
37  std::chrono::nanoseconds timeout
38  ) const noexcept override;
39 
40  std::error_code ReturnSamples(
41  const std::vector<const rtctk::AgnosticTopic*>& samples
42  ) const noexcept override;
43 
44  size_t GetNumberOfTopics() const noexcept override;
45  const std::string& GetTopicName(size_t index) const noexcept override;
46 
47 private:
48 
49  // Do not allow copying of this object.
50  DdsSubscriber(const DdsSubscriber& rhs) = delete;
51  DdsSubscriber& operator=(const DdsSubscriber& rhs) = delete;
52 
53  void Initialise(const DdsParams& params);
54  void Finalise();
55 
56  struct ReaderContext {
57  ReaderContext() : m_topic_name(""), m_reader(nullptr), m_topic(nullptr) {};
58 
62  std::string m_topic_name;
63 
67  rtctk::AgnosticTopicDataReader* m_reader;
68 
72  DDSTopic* m_topic;
73  };
74 
75  struct SampleMetaData {
79  rtctk::AgnosticTopicSeq m_data_seq;
80 
84  DDS_SampleInfoSeq m_info_seq;
85 
89  rtctk::AgnosticTopicDataReader* m_reader;
90 
95  std::set<const rtctk::AgnosticTopic*> m_unreleased;
96  };
97 
98  DDSDomainParticipantFactory* m_factory;
99  DDSDomainParticipant* m_participant;
100  DDSSubscriber* m_subscriber;
101  std::unique_ptr<DdsReaderListener> m_listener;
102  std::vector<ReaderContext> m_readers;
103  std::map<DDSCondition*, std::vector<ReaderContext>::iterator> m_reader_context_lut;
104  std::unique_ptr<DDSWaitSet> m_waitset;
105  mutable std::list<SampleMetaData> m_sample_metadata;
106  mutable std::map<const rtctk::AgnosticTopic*, std::list<SampleMetaData>::iterator> m_sample_lut;
107 };
108 
109 } // namespace rtctk::telSub
110 #endif // RTCKT_TELSUB_DDSSUBSCRIBER_HPP
rtctk::telSub::DdsSubscriber
Implements DDS communication using RTI DDS.
Definition: ddsSubscriber.hpp:26
rtctk::telSub::DdsSubscriber::DdsSubscriber
DdsSubscriber(const DdsParams &params)
Constructs a DDS subscriber from given configuration parameters.
Definition: ddsSubscriber.cpp:39
rtctk::telSub::DdsSubscriber::TakeSamples
std::error_code TakeSamples(std::vector< std::vector< const rtctk::AgnosticTopic * >> &samples, std::chrono::nanoseconds timeout) const noexcept override
Retrieves the buffers for the next data samples received from DDS.
Definition: ddsSubscriber.cpp:346
rtctk::telSub::DdsSubscriberIf
Base class abstracting DDS communication code.
Definition: ddsSubscriberIf.hpp:39
rtctk::telSub::DdsSubscriber::GetTopicName
const std::string & GetTopicName(size_t index) const noexcept override
Returns a string containing the name of a configured topic.
Definition: ddsSubscriber.cpp:455
rtctk::telSub::DdsSubscriber::DdsSubscriber
DdsSubscriber(DdsSubscriber &&rhs)=default
rtctk::telSub::DdsSubscriber::operator=
DdsSubscriber & operator=(DdsSubscriber &&rhs)=default
rtctk::telSub::DdsSubscriber::ReturnSamples
std::error_code ReturnSamples(const std::vector< const rtctk::AgnosticTopic * > &samples) const noexcept override
Releases buffers for previously retrieved data samples.
Definition: ddsSubscriber.cpp:419
rtctk::telSub
Definition: businessLogic.cpp:35
rtctk::telSub::DdsParams
Parameter set to be passed to classes deriving from DdsSubscriberIf.
Definition: ddsSubscriberIf.hpp:27
std
Definition: mudpiProcessingError.hpp:109
ddsSubscriberIf.hpp
Declares DdsSubscriberIf.
ddsReaderListener.hpp
DDS Reader Listener.
rtctk::telSub::DdsSubscriber::GetNumberOfTopics
size_t GetNumberOfTopics() const noexcept override
Returns the number of configured topics.
Definition: ddsSubscriber.cpp:451
rtctk::telSub::DdsSubscriber::~DdsSubscriber
virtual ~DdsSubscriber() noexcept
Destroys the DDS subscriber and releases all RTI DDS resources.
Definition: ddsSubscriber.cpp:63