Example #1
0
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;
}
Example #2
0
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);
}
Example #3
0
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;
}