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