From: Martin Ling Date: Tue, 16 Apr 2013 01:55:39 +0000 (+0100) Subject: python: support datafeed callbacks implemented in python. X-Git-Tag: dsupstream~135 X-Git-Url: https://sigrok.org/gitweb/?a=commitdiff_plain;h=0849c7d3104efc098aa282d7e8b841506c386ea3;p=libsigrok.git python: support datafeed callbacks implemented in python. --- diff --git a/bindings/python/libsigrok_python.i b/bindings/python/libsigrok_python.i index b3898724..6b2c9eea 100644 --- a/bindings/python/libsigrok_python.i +++ b/bindings/python/libsigrok_python.i @@ -18,3 +18,49 @@ */ %include "../swig/libsigrok.i" + +%{ + +void sr_datafeed_python_callback(const struct sr_dev_inst *sdi, + const struct sr_datafeed_packet *packet, void *cb_data) +{ + PyObject *sdi_obj; + PyObject *packet_obj; + PyObject *arglist; + PyObject *result; + PyGILState_STATE gstate; + PyObject *python_callback; + + python_callback = (PyObject *) cb_data; + gstate = PyGILState_Ensure(); + + sdi_obj = SWIG_NewPointerObj(SWIG_as_voidptr(sdi), + SWIGTYPE_p_sr_dev_inst, 0); + + packet_obj = SWIG_NewPointerObj(SWIG_as_voidptr(packet), + SWIGTYPE_p_sr_datafeed_packet, 0); + + arglist = Py_BuildValue("(OO)", sdi_obj, packet_obj); + + result = PyEval_CallObject(python_callback, arglist); + + Py_XDECREF(arglist); + Py_XDECREF(sdi_obj); + Py_XDECREF(packet_obj); + Py_XDECREF(result); + + PyGILState_Release(gstate); +} + +void sr_session_datafeed_python_callback_add(PyObject *cb) +{ + if (!PyCallable_Check(cb)) + PyErr_SetString(PyExc_TypeError, "Object passed is not callable"); + else + sr_session_datafeed_callback_add( + sr_datafeed_python_callback, cb); +} + +%} + +void sr_session_datafeed_python_callback_add(PyObject *cb);