80 lines
2.4 KiB
C
Raw Permalink Normal View History

2025-07-19 12:44:06 +08:00
#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
2025-07-23 16:17:41 +08:00
namespace XNSim
{
template <typename T>
using XNDDSOptional = eprosima::fastcdr::optional<T>;
2025-07-19 12:44:06 +08:00
using XNDDSParticipantPtr = XN_DDS::DomainParticipant *;
2025-07-23 16:17:41 +08:00
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;
2025-07-19 12:44:06 +08:00
using XNDDSParticipantQos = XN_DDS::DomainParticipantQos;
2025-07-23 16:17:41 +08:00
using XNDDSTopicQos = XN_DDS::TopicQos;
using XNDDSPublisherQos = XN_DDS::PublisherQos;
using XNDDSSubscriberQos = XN_DDS::SubscriberQos;
2025-07-19 12:44:06 +08:00
2025-07-23 16:17:41 +08:00
using XNDDSPublisherMap = std::unordered_map<XN_STRING, XNDDSPublisherPtr>;
2025-07-19 12:44:06 +08:00
using XNDDSSubscriberMap = std::unordered_map<XN_STRING, XNDDSSubscriberPtr>;
using XNDDSDataWriterMap = std::unordered_map<XN_STRING, XNDDSDataWriterPtr>;
struct PublisherInfo {
2025-07-23 16:17:41 +08:00
XNDDSPublisherPtr publisher;
XNDDSDataWriterPtr dataWriter;
2025-07-19 12:44:06 +08:00
};
struct SubscriberInfo {
2025-07-23 16:17:41 +08:00
XNDDSSubscriberPtr subscriber;
XNDDSDataReaderPtr dataReader;
2025-07-19 12:44:06 +08:00
};
struct TopicInfo {
2025-07-23 16:17:41 +08:00
XNDDSTopicPtr topic;
XNDDSPublisherMap publishers_;
XNDDSSubscriberMap subscribers_;
2025-07-19 12:44:06 +08:00
};
using XNDDSTopicMap = std::unordered_map<XN_STRING, TopicInfo>;
2025-07-23 16:17:41 +08:00
template <typename T>
using XNDDSCallBack = std::function<void(const T &)>;
2025-07-19 12:44:06 +08:00
template <typename T>
2025-07-23 16:17:41 +08:00
class DataReaderListenerImpl : public XN_DDS::DataReaderListener
{
2025-07-19 12:44:06 +08:00
public:
2025-07-23 16:17:41 +08:00
DataReaderListenerImpl(XNDDSCallBack<T> callback) : callback_(callback) {}
2025-07-19 12:44:06 +08:00
2025-07-23 16:17:41 +08:00
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_);
}
}
2025-07-19 12:44:06 +08:00
private:
2025-07-23 16:17:41 +08:00
T data_;
XNDDSCallBack<T> callback_;
2025-07-19 12:44:06 +08:00
};
} // namespace XNSim