From 11aec9576849a659e9010767297f69cd4de47674 Mon Sep 17 00:00:00 2001
From: Florent Lamiraux <florent@laas.fr>
Date: Wed, 30 Jun 2021 15:09:24 +0000
Subject: [PATCH] [RosQueuedSubsribe] Add command listTopics

  to get the name of topics corresponding to each signal.
---
 src/dynamic_graph/ros/__init__.py            | 1 +
 src/ros_queued_subscribe-python-module-py.cc | 2 +-
 src/ros_queued_subscribe.cpp                 | 8 ++++++++
 src/ros_queued_subscribe.hh                  | 3 +++
 src/ros_queued_subscribe.hxx                 | 1 +
 5 files changed, 14 insertions(+), 1 deletion(-)

diff --git a/src/dynamic_graph/ros/__init__.py b/src/dynamic_graph/ros/__init__.py
index 96018be..7f58645 100644
--- a/src/dynamic_graph/ros/__init__.py
+++ b/src/dynamic_graph/ros/__init__.py
@@ -3,3 +3,4 @@ from .ros import RosPublish as RosImport
 from .ros import RosSubscribe as RosExport
 from .ros_publish import RosPublish
 from .ros_subscribe import RosSubscribe
+from .ros_queued_subscribe import RosQueuedSubscribe
diff --git a/src/ros_queued_subscribe-python-module-py.cc b/src/ros_queued_subscribe-python-module-py.cc
index 9ee6b14..c14f8e6 100644
--- a/src/ros_queued_subscribe-python-module-py.cc
+++ b/src/ros_queued_subscribe-python-module-py.cc
@@ -13,7 +13,7 @@ BOOST_PYTHON_MODULE(wrap)
     .def("rm", &dg::RosQueuedSubscribe::rm, "Remove a signal reading data from a ROS topic",
         bp::args("signal_name"))
     .def("list", &dg::RosQueuedSubscribe::list, "List signals reading data from a ROS topic")
-
+    .def("listTopics", &dg::RosQueuedSubscribe::listTopics, "List subscribed topics from ROS in the same order as list command")
     .def("clearQueue", &dg::RosQueuedSubscribe::clearQueue,
         "Empty the queue of a given signal", bp::args("signal_name"))
     .def("queueSize", &dg::RosQueuedSubscribe::queueSize,
diff --git a/src/ros_queued_subscribe.cpp b/src/ros_queued_subscribe.cpp
index f9ecaf5..f5226af 100644
--- a/src/ros_queued_subscribe.cpp
+++ b/src/ros_queued_subscribe.cpp
@@ -99,6 +99,14 @@ std::vector<std::string> RosQueuedSubscribe::list() {
   return result;
 }
 
+std::vector<std::string> RosQueuedSubscribe::listTopics()
+{
+  std::vector<std::string> result(topics_.size());
+  std::transform(topics_.begin(), topics_.end(),
+      result.begin(), [](const auto& pair) { return pair.second; });
+  return result;
+}
+
 void RosQueuedSubscribe::clear() {
   std::map<std::string, bindedSignal_t>::iterator it = bindedSignal_.begin();
   for (; it != bindedSignal_.end();) {
diff --git a/src/ros_queued_subscribe.hh b/src/ros_queued_subscribe.hh
index ff0eb9f..a54b683 100644
--- a/src/ros_queued_subscribe.hh
+++ b/src/ros_queued_subscribe.hh
@@ -137,6 +137,7 @@ class RosQueuedSubscribe : public dynamicgraph::Entity {
 
   void rm(const std::string& signal);
   std::vector<std::string> list();
+  std::vector<std::string> listTopics();
   void clear();
   void clearQueue(const std::string& signal);
   void readQueue(int beginReadingAt);
@@ -146,6 +147,7 @@ class RosQueuedSubscribe : public dynamicgraph::Entity {
   void add(const std::string& type, const std::string& signal, const std::string& topic);
 
   std::map<std::string, bindedSignal_t>& bindedSignal() { return bindedSignal_; }
+  std::map<std::string, std::string>& topics() { return topics_; }
 
   ros::NodeHandle& nh() { return nh_; }
 
@@ -162,6 +164,7 @@ class RosQueuedSubscribe : public dynamicgraph::Entity {
   static const std::string docstring_;
   ros::NodeHandle& nh_;
   std::map<std::string, bindedSignal_t> bindedSignal_;
+  std::map<std::string, std::string> topics_;
 
   int readQueue_;
   // Signal<bool, int> readQueue_;
diff --git a/src/ros_queued_subscribe.hxx b/src/ros_queued_subscribe.hxx
index 99e6394..f8994a2 100644
--- a/src/ros_queued_subscribe.hxx
+++ b/src/ros_queued_subscribe.hxx
@@ -54,6 +54,7 @@ struct Add {
 
     RosQueuedSubscribe::bindedSignal_t bindedSignal(bs);
     rosSubscribe.bindedSignal()[signal] = bindedSignal;
+    rosSubscribe.topics()[signal] = topic;
   }
 };
 
-- 
GitLab