provide API to retrieve topic information
This commit is contained in:
		
							parent
							
								
									44c296f7ab
								
							
						
					
					
						commit
						c2c275b78e
					
				
					 2 changed files with 67 additions and 0 deletions
				
			
		| 
						 | 
					@ -188,6 +188,12 @@ public:
 | 
				
			||||||
  rcl_interfaces::msg::ListParametersResult list_parameters(
 | 
					  rcl_interfaces::msg::ListParametersResult list_parameters(
 | 
				
			||||||
    const std::vector<std::string> & prefixes, uint64_t depth) const;
 | 
					    const std::vector<std::string> & prefixes, uint64_t depth) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::map<std::string, std::string> get_topic_names_and_types() const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  size_t count_publishers(const std::string & topic_name) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  size_t count_subscribers(const std::string & topic_name) const;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
private:
 | 
					private:
 | 
				
			||||||
  RCLCPP_DISABLE_COPY(Node);
 | 
					  RCLCPP_DISABLE_COPY(Node);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -426,4 +426,65 @@ Node::list_parameters(
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  return result;
 | 
					  return result;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					std::map<std::string, std::string>
 | 
				
			||||||
 | 
					Node::get_topic_names_and_types() const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  rmw_topic_names_and_types_t topic_names_and_types;
 | 
				
			||||||
 | 
					  topic_names_and_types.topic_count = 0;
 | 
				
			||||||
 | 
					  topic_names_and_types.topic_names = nullptr;
 | 
				
			||||||
 | 
					  topic_names_and_types.type_names = nullptr;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  auto ret = rmw_get_topic_names_and_types(node_handle_.get(), &topic_names_and_types);
 | 
				
			||||||
 | 
					  if (ret != RMW_RET_OK) {
 | 
				
			||||||
 | 
					    // *INDENT-OFF*
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					      std::string("could not get topic names and types: ") + rmw_get_error_string_safe());
 | 
				
			||||||
 | 
					    // *INDENT-ON*
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  std::map<std::string, std::string> topics;
 | 
				
			||||||
 | 
					  for (size_t i = 0; i < topic_names_and_types.topic_count; ++i) {
 | 
				
			||||||
 | 
					    topics[topic_names_and_types.topic_names[i]] = topic_names_and_types.type_names[i];
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  ret = rmw_destroy_topic_names_and_types(&topic_names_and_types);
 | 
				
			||||||
 | 
					  if (ret != RMW_RET_OK) {
 | 
				
			||||||
 | 
					    // *INDENT-OFF*
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					      std::string("could not destroy topic names and types: ") + rmw_get_error_string_safe());
 | 
				
			||||||
 | 
					    // *INDENT-ON*
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return topics;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					size_t
 | 
				
			||||||
 | 
					Node::count_publishers(const std::string & topic_name) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t count;
 | 
				
			||||||
 | 
					  auto ret = rmw_count_publishers(node_handle_.get(), topic_name.c_str(), &count);
 | 
				
			||||||
 | 
					  if (ret != RMW_RET_OK) {
 | 
				
			||||||
 | 
					    // *INDENT-OFF*
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					      std::string("could not count publishers: ") + rmw_get_error_string_safe());
 | 
				
			||||||
 | 
					    // *INDENT-ON*
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return count;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					size_t
 | 
				
			||||||
 | 
					Node::count_subscribers(const std::string & topic_name) const
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  size_t count;
 | 
				
			||||||
 | 
					  auto ret = rmw_count_subscribers(node_handle_.get(), topic_name.c_str(), &count);
 | 
				
			||||||
 | 
					  if (ret != RMW_RET_OK) {
 | 
				
			||||||
 | 
					    // *INDENT-OFF*
 | 
				
			||||||
 | 
					    throw std::runtime_error(
 | 
				
			||||||
 | 
					      std::string("could not count subscribers: ") + rmw_get_error_string_safe());
 | 
				
			||||||
 | 
					    // *INDENT-ON*
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return count;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* RCLCPP_RCLCPP_NODE_IMPL_HPP_ */
 | 
					#endif /* RCLCPP_RCLCPP_NODE_IMPL_HPP_ */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue