{# DDS接收器模板 #} {% if part == 'header' %} #pragma once #include #include #include #include /** * DDS数据接收器 * 用于接收{{ source_message.full_name }}消息 */ class DataReceiver { public: DataReceiver(); ~DataReceiver(); // 初始化DDS连接 bool initialize(const std::string& topic_name, int domain_id = 0); // 接收数据 std::vector receive(); // 关闭连接 void close(); private: dds::domain::DomainParticipant* participant_; dds::sub::Subscriber* subscriber_; dds::sub::DataReader* reader_; bool initialized_; }; {% else %} #include "receiver.h" #include DataReceiver::DataReceiver() : participant_(nullptr), subscriber_(nullptr), reader_(nullptr), initialized_(false) { } DataReceiver::~DataReceiver() { close(); } bool DataReceiver::initialize(const std::string& topic_name, int domain_id) { try { // 创建Domain Participant participant_ = new dds::domain::DomainParticipant(domain_id); // 创建Subscriber subscriber_ = new dds::sub::Subscriber(*participant_); // 创建Topic dds::topic::Topic topic( *participant_, topic_name ); // 创建DataReader reader_ = new dds::sub::DataReader( *subscriber_, topic ); initialized_ = true; return true; } catch (const std::exception& e) { close(); return false; } } std::vector DataReceiver::receive() { if (!initialized_) { throw std::runtime_error("DDS not initialized"); } // 等待数据 dds::sub::LoanedSamples samples = reader_->take(); if (samples.length() > 0) { const dds::core::BytesTopicType& data = samples[0].data(); // 转换为vector std::vector buffer(data.begin(), data.end()); return buffer; } return std::vector(); } void DataReceiver::close() { if (reader_) { delete reader_; reader_ = nullptr; } if (subscriber_) { delete subscriber_; subscriber_ = nullptr; } if (participant_) { delete participant_; participant_ = nullptr; } initialized_ = false; } {% endif %}