static PyObject *Wiimote_get_mesg(Wiimote *self) { union cwiid_mesg *mesg; int mesg_count; struct timespec t; PyObject *PyMesg; if (!self->wiimote) { SET_CLOSED_ERROR; return NULL; } if (cwiid_get_mesg(self->wiimote, &mesg_count, &mesg, &t)) { if (errno == EAGAIN) { Py_RETURN_NONE; } else { PyErr_SetString(PyExc_RuntimeError, "Error getting wiimote message list"); return NULL; } } PyMesg = ConvertMesgArray(mesg_count, mesg); free(mesg); return PyMesg; }
static void CallbackBridge(cwiid_wiimote_t *wiimote, int mesg_count, union cwiid_mesg mesg[], struct timespec *t) { PyObject *ArgTuple; PyObject *PySelf; PyGILState_STATE gstate; gstate = PyGILState_Ensure(); ArgTuple = ConvertMesgArray(mesg_count, mesg); /* Put id and the list of messages as the arguments to the callback */ PySelf = (PyObject *) cwiid_get_data(wiimote); PyObject_CallFunction(((Wiimote *)PySelf)->callback, "(O)", ArgTuple); Py_XDECREF(ArgTuple); PyGILState_Release(gstate); }
int py_plugin_exec(struct plugin *plugin, int mesg_count, union cwiid_mesg mesg[]) { PyObject *PyArgs, *PyMesg, *PyData, *PyButtonData, *PyAxisData, *PyObj; int i; if (!(PyMesg = ConvertMesgArray(mesg_count, mesg))) { PyErr_Print(); return -1; } if (!(PyArgs = Py_BuildValue("(O)", PyMesg))) { PyErr_Print(); Py_DECREF(PyMesg); return -1; } Py_DECREF(PyMesg); if (!(PyData = PyObject_CallObject(((struct py_plugin *)plugin->p)->exec, PyArgs))) { PyErr_Print(); Py_DECREF(PyArgs); return -1; } Py_DECREF(PyArgs); if (!PyArg_ParseTuple(PyData, "OO", &PyButtonData, &PyAxisData)) { PyErr_Print(); Py_DECREF(PyData); return -1; } if (!(PySequence_Check(PyButtonData) && PySequence_Check(PyAxisData))) { wminput_err("Type error on wminput_exec: exec not sequences"); Py_DECREF(PyData); return -1; } if (PySequence_Size(PyButtonData) != plugin->info->button_count) { wminput_err("Type error on wminput_exec: bad button sequence"); Py_DECREF(PyData); return -1; } plugin->data->buttons = 0; for (i=0; i < plugin->info->button_count; i++) { if (!(PyObj = PySequence_GetItem(PyButtonData, i))) { PyErr_Print(); Py_DECREF(PyData); return -1; } if (PyObj == Py_True) { plugin->data->buttons |= 1<<i; } else if (PyObj != Py_False) { wminput_err("Type error on wminput_exec: bad button value"); Py_DECREF(PyObj); Py_DECREF(PyData); return -1; } Py_DECREF(PyObj); } if (PySequence_Size(PyAxisData) != plugin->info->axis_count) { wminput_err("Error on wminput_exec: bad axis sequence"); Py_DECREF(PyData); return -1; } for (i=0; i < plugin->info->axis_count; i++) { if (!(PyObj = PySequence_GetItem(PyAxisData, i))) { PyErr_Print(); Py_DECREF(PyData); return -1; } if (PyObj == Py_None) { plugin->data->axes[i].valid = 0; } else if (!PyInt_Check(PyObj)) { wminput_err("Type error on wminput_exec: bad axis value"); Py_DECREF(PyObj); Py_DECREF(PyData); return -1; } else { plugin->data->axes[i].valid = 1; plugin->data->axes[i].value = PyInt_AsLong(PyObj); } Py_DECREF(PyObj); } Py_DECREF(PyData); return 0; }