76 lines
2.4 KiB
C++
76 lines
2.4 KiB
C++
#pragma once
|
|
|
|
// FastDDS头文件
|
|
#include <fastcdr/xcdr/optional.hpp>
|
|
#include <fastdds/dds/domain/DomainParticipant.hpp>
|
|
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
|
|
#include <fastdds/dds/publisher/DataWriter.hpp>
|
|
#include <fastdds/dds/publisher/Publisher.hpp>
|
|
#include <fastdds/dds/subscriber/DataReader.hpp>
|
|
#include <fastdds/dds/subscriber/DataReaderListener.hpp>
|
|
#include <fastdds/dds/subscriber/Subscriber.hpp>
|
|
#include <fastdds/dds/topic/TypeSupport.hpp>
|
|
#include <functional>
|
|
|
|
// FastDDS宏定义
|
|
#define XN_DDS eprosima::fastdds::dds
|
|
namespace XNSim {
|
|
template <typename T> using XNDDSOptional = eprosima::fastcdr::optional<T>;
|
|
|
|
using XNDDSParticipantPtr = XN_DDS::DomainParticipant *;
|
|
using XNDDSPublisherPtr = XN_DDS::Publisher *;
|
|
using XNDDSSubscriberPtr = XN_DDS::Subscriber *;
|
|
using XNDDSTopicPtr = XN_DDS::Topic *;
|
|
using XNDDSDataWriterPtr = XN_DDS::DataWriter *;
|
|
using XNDDSDataReaderPtr = XN_DDS::DataReader *;
|
|
using XNDDSTypeSupport = XN_DDS::TypeSupport;
|
|
using XNDDSDataWriterQos = XN_DDS::DataWriterQos;
|
|
using XNDDSDataReaderQos = XN_DDS::DataReaderQos;
|
|
using XNDDSParticipantQos = XN_DDS::DomainParticipantQos;
|
|
using XNDDSTopicQos = XN_DDS::TopicQos;
|
|
using XNDDSPublisherQos = XN_DDS::PublisherQos;
|
|
using XNDDSSubscriberQos = XN_DDS::SubscriberQos;
|
|
|
|
using XNDDSPublisherMap = std::unordered_map<XN_STRING, XNDDSPublisherPtr>;
|
|
using XNDDSSubscriberMap = std::unordered_map<XN_STRING, XNDDSSubscriberPtr>;
|
|
using XNDDSDataWriterMap = std::unordered_map<XN_STRING, XNDDSDataWriterPtr>;
|
|
|
|
struct PublisherInfo {
|
|
XNDDSPublisherPtr publisher;
|
|
XNDDSDataWriterPtr dataWriter;
|
|
};
|
|
|
|
struct SubscriberInfo {
|
|
XNDDSSubscriberPtr subscriber;
|
|
XNDDSDataReaderPtr dataReader;
|
|
};
|
|
|
|
struct TopicInfo {
|
|
XNDDSTopicPtr topic;
|
|
XNDDSPublisherMap publishers_;
|
|
XNDDSSubscriberMap subscribers_;
|
|
};
|
|
|
|
using XNDDSTopicMap = std::unordered_map<XN_STRING, TopicInfo>;
|
|
|
|
template <typename T> using XNDDSCallBack = std::function<void(const T &)>;
|
|
|
|
template <typename T>
|
|
class DataReaderListenerImpl : public XN_DDS::DataReaderListener {
|
|
public:
|
|
DataReaderListenerImpl(XNDDSCallBack<T> callback) : callback_(callback) {}
|
|
|
|
void on_data_available(XNDDSDataReaderPtr reader) override {
|
|
XN_DDS::SampleInfo info;
|
|
if (reader->take_next_sample(&data_, &info) == XN_DDS::RETCODE_OK &&
|
|
info.valid_data) {
|
|
callback_(data_);
|
|
}
|
|
}
|
|
|
|
private:
|
|
T data_;
|
|
XNDDSCallBack<T> callback_;
|
|
};
|
|
|
|
} // namespace XNSim
|