From b1859161de54b8e3e38f489d40fc382c47968fbb Mon Sep 17 00:00:00 2001
From: Florent Lamiraux <florent@laas.fr>
Date: Thu, 11 Jul 2013 14:28:03 +0200
Subject: [PATCH] Enhance SignalBase API

  - add isPlugged and getPlugged methods,
  - add property getter name.
---
 src/dynamic-graph-py.cc          |  6 ++++
 src/dynamic_graph/signal_base.py | 17 +++++++++++
 src/signal-base-py.cc            | 51 ++++++++++++++++++++++++++++++--
 3 files changed, 71 insertions(+), 3 deletions(-)

diff --git a/src/dynamic-graph-py.cc b/src/dynamic-graph-py.cc
index acaaf29..2b0ac14 100644
--- a/src/dynamic-graph-py.cc
+++ b/src/dynamic-graph-py.cc
@@ -40,6 +40,8 @@ namespace dynamicgraph {
       extern PyObject* setValue(PyObject* self, PyObject* args);
       extern PyObject* recompute(PyObject* self, PyObject* args);
       extern PyObject* unplug(PyObject* self, PyObject* args);
+      extern PyObject* isPlugged(PyObject* self, PyObject* args);
+      extern PyObject* getPlugged(PyObject* self, PyObject* args);
     }
     namespace entity {
       extern PyObject* create(PyObject* self, PyObject* args);
@@ -166,6 +168,10 @@ static PyMethodDef dynamicGraphMethods[] = {
    METH_VARARGS, "Recompute the signal at given time"},
   {"signal_base_unplug", dynamicgraph::python::signalBase::unplug,
    METH_VARARGS, "Unplug the signal"},
+  {"signal_base_isPlugged", dynamicgraph::python::signalBase::isPlugged,
+   METH_VARARGS, "Whether the signal is plugged"},
+  {"signal_base_getPlugged", dynamicgraph::python::signalBase::getPlugged,
+   METH_VARARGS, "To which signal the signal is plugged"},
   // Entity
   {"create_entity", dynamicgraph::python::entity::create, METH_VARARGS,
    "create an Entity C++ object"},
diff --git a/src/dynamic_graph/signal_base.py b/src/dynamic_graph/signal_base.py
index a191001..c0dbfa2 100644
--- a/src/dynamic_graph/signal_base.py
+++ b/src/dynamic_graph/signal_base.py
@@ -225,6 +225,13 @@ class SignalBase (object) :
         """
         return wrap.signal_base_get_name(self.obj)
 
+    @property
+    def name (self) :
+        """
+        Get name of signal
+        """
+        return wrap.signal_base_get_name(self.obj)
+
     def getClassName(self):
         """
         Get class name of signal
@@ -241,6 +248,16 @@ class SignalBase (object) :
         Unplug a PTR signal.
         """
         return wrap.signal_base_unplug(self.obj)
+    def isPlugged(self):
+        """
+        Return whether a signal is plugged.
+        """
+        return wrap.signal_base_isPlugged(self.obj)
+    def getPlugged(self):
+        """
+        Return the plugged signal.
+        """
+        return SignalBase (obj = wrap.signal_base_getPlugged(self.obj))
 
     def __str__(self):
         """
diff --git a/src/signal-base-py.cc b/src/signal-base-py.cc
index 2a4aaf2..925dc96 100644
--- a/src/signal-base-py.cc
+++ b/src/signal-base-py.cc
@@ -319,6 +319,51 @@ namespace dynamicgraph {
 	} CATCH_ALL_EXCEPTIONS ();
 	return Py_BuildValue("");
       }
-    }
-  }
-}
+
+      PyObject* isPlugged (PyObject*, PyObject* args)
+      {
+	void * pointer = NULL;
+	PyObject* object = NULL;
+	if (!PyArg_ParseTuple(args,"O", &object))
+	  return NULL;
+	if (!PyCObject_Check(object))
+	  return NULL;
+
+	pointer = PyCObject_AsVoidPtr(object);
+	SignalBase<int>* signal = (SignalBase<int>*)pointer;
+	bool plugged = false;
+	try {
+	  plugged = signal->isPluged();
+	} CATCH_ALL_EXCEPTIONS ();
+	if (plugged) return PyBool_FromLong(1); else return PyBool_FromLong(0);
+
+      }
+
+      PyObject* getPlugged (PyObject*, PyObject* args)
+      {
+	void * pointer = NULL;
+	PyObject* object = NULL;
+	if (!PyArg_ParseTuple(args,"O", &object))
+	  return NULL;
+	if (!PyCObject_Check(object))
+	  return NULL;
+
+	pointer = PyCObject_AsVoidPtr(object);
+	SignalBase<int>* signal = (SignalBase<int>*)pointer;
+	SignalBase<int>* otherSignal = 0;
+	try {
+	  bool plugged = signal->isPluged ();
+	  otherSignal = signal->getPluged();
+	  if (!plugged || otherSignal == 0) {
+	    std::string msg = std::string ("Signal ") + signal->getName()
+	      + std::string (" is not plugged.");
+	    throw std::runtime_error (msg);
+	  }
+	} CATCH_ALL_EXCEPTIONS ();
+	// Return the pointer to the signal without destructor since the signal
+	// is not owned by the calling object.
+	return PyCObject_FromVoidPtr((void*)otherSignal, NULL);
+      }
+    } // namespace signalBase
+  } // namespace python
+} // namespace dynamicgraph
-- 
GitLab