#pragma once
#include <memory>
#include <string>
#include <fastdds/dds/domain/DomainParticipant.hpp>
#include <fastdds/dds/domain/DomainParticipantFactory.hpp>
namespace ibmw::extensions::dds_extension {
enum class DdsBusTransportPolicy {
kDefault,
kShmOnly,
kTcpOnly,
};
struct DdsBusTransportConfig {
DdsBusTransportPolicy policy = DdsBusTransportPolicy::kDefault;
uint16_t tcp_listen_port = 0;
uint16_t tcp_peer_port = 0;
std::string tcp_addr = "127.0.0.1";
};
struct DdsBusXmlProfileConfig {
std::string file;
std::string participant_profile;
};
class DdsBus {
public:
DdsBus(uint32_t domain_id,
const std::string& participant_name,
const DdsBusTransportConfig& transport_config = {});
DdsBus(uint32_t domain_id,
const std::string& participant_name,
const DdsBusTransportConfig& transport_config,
const DdsBusXmlProfileConfig& xml_profile_config);
~DdsBus();
void Initialize();
void Shutdown();
void AbandonShutdown();
eprosima::fastdds::dds::DomainParticipant* GetParticipant() const {
return participant_;
}
uint32_t GetDomainId() const { return domain_id_; }
private:
void ApplyTransportPolicy(eprosima::fastdds::dds::DomainParticipantQos& pqos);
uint32_t domain_id_;
std::string participant_name_;
DdsBusTransportConfig transport_config_;
DdsBusXmlProfileConfig xml_profile_config_;
eprosima::fastdds::dds::DomainParticipant* participant_ = nullptr;
eprosima::fastdds::dds::DomainParticipantFactory* factory_ = nullptr;
bool abandon_shutdown_ = false;
};
}