dynamic-graph-py.cc 3.66 KB
Newer Older
florent's avatar
florent committed
1
2
3
4
5
6
7
/*
 *  Copyright 2010 (C) CNRS
 *  Author: Florent Lamiraux
 */

#include <Python.h>
#include <iostream>
florent's avatar
florent committed
8
#include <sstream>
florent's avatar
florent committed
9
10
#include <string>

11
#include <dynamic-graph/exception-factory.h>
florent's avatar
florent committed
12
#include <dynamic-graph/interpreter.h>
13
#include <dynamic-graph/shell-functions.h>
florent's avatar
florent committed
14

15
16
namespace dynamicgraph {
  namespace python {
17

18
19
20
21
22
23
24
25
26
27
    // Declare functions defined in other source files
    namespace signalBase {
      extern PyObject* create(PyObject* self, PyObject* args);
      extern PyObject* getTime(PyObject* self, PyObject* args);
    }
    namespace entity {
      extern PyObject* create(PyObject* self, PyObject* args);
      extern PyObject* getName(PyObject* self, PyObject* args);
      extern PyObject* getSignal(PyObject* self, PyObject* args);
      extern PyObject* displaySignals(PyObject* self, PyObject* args);
florent's avatar
florent committed
28

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
    }

    PyObject* error;

    static dynamicgraph::Interpreter interpreter;

    /**
       \brief plug a signal into another one.
    */
    PyObject*
    plug(PyObject* self, PyObject* args)
    {
      char* out = NULL;
      char* in = NULL;
      if (!PyArg_ParseTuple(args,"ss", &out, &in))
	return NULL;

      std::stringstream ss;
      std::ostringstream os;
      ss << std::string(out) << " " << std::string(in);
      std::istringstream cmdArg(ss.str());
      try {
	interpreter.cmdPlug(std::string("plug"), cmdArg, os);
      } catch (dynamicgraph::ExceptionFactory& exc) {
	PyErr_SetString(error, exc.getStringMessage().c_str());
	return NULL;
      }
florent's avatar
florent committed
56

57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
      return Py_BuildValue("");
    }

    PyObject*
    enableTrace(PyObject* self, PyObject* args)
    {
      char* trueFalse = NULL;
      char* filename = NULL;
      std::stringstream ss;
      std::ostringstream os;

      if (PyArg_ParseTuple(args,"ss", &trueFalse, &filename)) {
	ss << std::string(trueFalse) << " " << std::string(filename);
      } else if (PyArg_ParseTuple(args,"s", &trueFalse)) {
	ss << std::string(trueFalse);
      } else {
	return NULL;
      }

      std::istringstream cmdArg(ss.str());
      try {
	ShellFunctions::cmdEnableTrace(std::string("debugtrace"), cmdArg, os);
      } catch (dynamicgraph::ExceptionFactory& exc) {
	PyErr_SetString(error, exc.getStringMessage().c_str());
	return NULL;
      }

      return Py_BuildValue("");
    }
  }
florent's avatar
florent committed
87
88
89
90
91
}

/**
   \brief List of python functions
*/
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
static PyMethodDef dynamicGraphMethods[] = {
  {"plug",  dynamicgraph::python::plug, METH_VARARGS,
   "plug an output signal into an input signal"},
  {"debugtrace",  dynamicgraph::python::enableTrace, METH_VARARGS,
   "Enable or disable tracing debug info in a file"},
  // Signals
  {"create_signal_base", dynamicgraph::python::signalBase::create, METH_VARARGS,
   "create a SignalBase C++ object"},
  {"signalbase_get_time", dynamicgraph::python::signalBase::getTime,
   METH_VARARGS, "Get time of  a SignalBase"},
  // Entity
  {"create_entity", dynamicgraph::python::entity::create, METH_VARARGS,
   "create an Entity C++ object"},
  {"entity_get_name", dynamicgraph::python::entity::getName, METH_VARARGS,
   "get the name of an Entity"},
  {"entity_get_signal", dynamicgraph::python::entity::getSignal, METH_VARARGS,
   "get signal by name from an Entity"},
  {"entity_display_signals", dynamicgraph::python::entity::displaySignals,
   METH_VARARGS,
   "Display the list of signals of an entity in standard output"},
florent's avatar
florent committed
112
113
114
115
116
117
118
119
  {NULL, NULL, 0, NULL}        /* Sentinel */
};

PyMODINIT_FUNC
initwrap(void)
{
    PyObject *m;

120
    m = Py_InitModule("wrap", dynamicGraphMethods);
florent's avatar
florent committed
121
122
    if (m == NULL)
        return;
123

124
125
126
127
    dynamicgraph::python::error =
      PyErr_NewException("dynamic_graph.wrap.error", NULL, NULL);
    Py_INCREF(dynamicgraph::python::error);
    PyModule_AddObject(m, "error", dynamicgraph::python::error);
florent's avatar
florent committed
128
}