From e64e17aa25ca760a51bafabe0d5904733b2cf9f4 Mon Sep 17 00:00:00 2001 From: Antonio cuadros Date: Fri, 16 Jul 2021 13:55:07 +0200 Subject: [PATCH] Update callbacks on AgentAPI --- micro_ros_agent/include/agent/Agent.hpp | 43 +++++++++++++++++++------ micro_ros_agent/src/agent/Agent.cpp | 25 ++++---------- 2 files changed, 39 insertions(+), 29 deletions(-) diff --git a/micro_ros_agent/include/agent/Agent.hpp b/micro_ros_agent/include/agent/Agent.hpp index 72cc0a1..0b62aa7 100644 --- a/micro_ros_agent/include/agent/Agent.hpp +++ b/micro_ros_agent/include/agent/Agent.hpp @@ -32,6 +32,30 @@ public: ~Agent() = default; + /** + * @brief Agent class shall not be copy constructible. + */ + UXR_AGENT_EXPORT Agent( + const Agent &) = delete; + + UXR_AGENT_EXPORT Agent( + Agent &&) = delete; + + /** + * @brief Agent class shall not be copy assignable. + */ + UXR_AGENT_EXPORT Agent& operator =( + const Agent &) = delete; + + UXR_AGENT_EXPORT Agent& operator =( + Agent &&) = delete; + + static Agent& getInstance() + { + static Agent instance; + return instance; + } + bool create( int argc, char** argv); @@ -41,26 +65,25 @@ public: void add_callbacks(); private: - eprosima::uxr::AgentInstance& xrce_dds_agent_instance_; std::map> graph_manager_map_; - std::shared_ptr find_or_create_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id); - void remove_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id); // TODO: check grap_manager on agent closing + bool started = false; }; template -class AgentAPI : Agent +class AgentAPI { public: - AgentAPI() : Agent(){}; + AgentAPI() + : agent_instance_(agent_instance_.getInstance()) + {}; ~AgentAPI() = default; void create(uint16_t port) { xrce_dds_agent_instance_API.configure(port); - add_callbacks(); } void create(std::string dev, const std::string baudrate); @@ -74,34 +97,34 @@ public: void run() { + agent_instance_.add_callbacks(); xrce_dds_agent_instance_API.run(); } - + void stop() { xrce_dds_agent_instance_API.stop(); } private: + Agent& agent_instance_; eprosima::uxr::AgentInstanceAPI xrce_dds_agent_instance_API; }; template<> inline UXR_AGENT_EXPORT void AgentAPI::create(std::string dev, const std::string baudrate) { xrce_dds_agent_instance_API.configure(dev, baudrate); - add_callbacks(); } template<> inline UXR_AGENT_EXPORT void AgentAPI::create(std::vector devs, const std::string baudrate) { xrce_dds_agent_instance_API.configure(devs, baudrate); - add_callbacks(); + } template<> inline UXR_AGENT_EXPORT void AgentAPI::create(const std::string baudrate) { xrce_dds_agent_instance_API.configure(baudrate); - add_callbacks(); } } // namespace agent diff --git a/micro_ros_agent/src/agent/Agent.cpp b/micro_ros_agent/src/agent/Agent.cpp index 7af6cac..847cadd 100644 --- a/micro_ros_agent/src/agent/Agent.cpp +++ b/micro_ros_agent/src/agent/Agent.cpp @@ -29,17 +29,13 @@ bool Agent::create( int argc, char** argv) { - bool result = xrce_dds_agent_instance_.create(argc, argv); - if (result) - { - add_callbacks(); - } - - return result; + return xrce_dds_agent_instance_.create(argc, argv); } void Agent::add_callbacks() { + if (!started) + { /** * Add CREATE_PARTICIPANT callback. */ @@ -108,7 +104,6 @@ void Agent::add_callbacks() const eprosima::fastdds::dds::DomainParticipant* participant, const eprosima::fastdds::dds::DataWriter* datawriter) -> void { - auto graph_manager_ = find_or_create_graph_manager(participant->get_domain_id()); // TODO(jamoralp): Workaround for Fast-DDS bug #9977. Remove when fixed @@ -174,6 +169,9 @@ void Agent::add_callbacks() eprosima::uxr::Middleware::Kind::FASTDDS, eprosima::uxr::middleware::CallbackKind::DELETE_DATAREADER, std::move(on_delete_datareader)); + + started = true; + } } void Agent::run() @@ -198,17 +196,6 @@ auto it = graph_manager_map_.find(domain_id); } } -void Agent::remove_graph_manager(eprosima::fastdds::dds::DomainId_t domain_id) -{ - auto it = graph_manager_map_.find(domain_id); - - if (it != graph_manager_map_.end()) - { - it->second = nullptr; - graph_manager_map_.erase(it); - } -} - } // namespace agent } // namespace uros #endif // _UROS_AGENT_AGENT_CPP \ No newline at end of file