Blame src/ieee1284module.c

Packit d36e9b
/*
Packit d36e9b
 * ieee1284 - Python bindings for libieee1284
Packit d36e9b
 * Copyright (C) 2004  Tim Waugh <twaugh@redhat.com>
Packit d36e9b
 *
Packit d36e9b
 * This program is free software; you can redistribute it and/or modify
Packit d36e9b
 * it under the terms of the GNU General Public License as published by
Packit d36e9b
 * the Free Software Foundation; either version 2 of the License, or
Packit d36e9b
 * (at your option) any later version.
Packit d36e9b
 *
Packit d36e9b
 * This program is distributed in the hope that it will be useful,
Packit d36e9b
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit d36e9b
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit d36e9b
 * GNU General Public License for more details.
Packit d36e9b
 *
Packit d36e9b
 * You should have received a copy of the GNU General Public License
Packit d36e9b
 * along with this program; if not, write to the Free Software
Packit d36e9b
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
Packit d36e9b
 */
Packit d36e9b
Packit d36e9b
#include <Python.h>
Packit d36e9b
#include <structmember.h>
Packit d36e9b
#include "ieee1284.h"
Packit d36e9b
Packit d36e9b
static PyObject *pyieee1284_error;
Packit d36e9b
Packit d36e9b
typedef struct {
Packit d36e9b
	PyObject_HEAD
Packit d36e9b
	struct parport *port;
Packit d36e9b
} ParportObject;
Packit d36e9b
Packit d36e9b
static int
Packit d36e9b
Parport_init (ParportObject *self, PyObject *args, PyObject *kwds)
Packit d36e9b
{
Packit d36e9b
	PyErr_SetString (PyExc_TypeError,
Packit d36e9b
			 "You cannot create this; use find_ports instead.");
Packit d36e9b
	return -1;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static void
Packit d36e9b
Parport_dealloc (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	if (self->port)
Packit d36e9b
		ieee1284_unref (self->port);
Packit d36e9b
Packit d36e9b
	self->ob_type->tp_free ((PyObject *) self);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_getname (ParportObject *self, void *closure)
Packit d36e9b
{
Packit d36e9b
	return PyString_FromString (self->port->name);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_getbase_addr (ParportObject *self, void *closure)
Packit d36e9b
{
Packit d36e9b
	return PyInt_FromLong (self->port->base_addr);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_gethibase_addr (ParportObject *self, void *closure)
Packit d36e9b
{
Packit d36e9b
	return PyInt_FromLong (self->port->hibase_addr);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_getfilename (ParportObject *self, void *closure)
Packit d36e9b
{
Packit d36e9b
	if (self->port->filename)
Packit d36e9b
		return PyString_FromString (self->port->filename);
Packit d36e9b
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyGetSetDef Parport_getseters[] = {
Packit d36e9b
	{ "name",
Packit d36e9b
	  (getter) Parport_getname, NULL,
Packit d36e9b
	  NULL },
Packit d36e9b
	{ "base_addr",
Packit d36e9b
	  (getter) Parport_getbase_addr, NULL,
Packit d36e9b
	  NULL },
Packit d36e9b
	{ "hibase_addr",
Packit d36e9b
	  (getter) Parport_gethibase_addr, NULL,
Packit d36e9b
	  NULL },
Packit d36e9b
	{ "filename",
Packit d36e9b
	  (getter) Parport_getfilename, NULL,
Packit d36e9b
	  NULL },
Packit d36e9b
	{ NULL }
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
/***/
Packit d36e9b
Packit d36e9b
static void
Packit d36e9b
handle_error (int err)
Packit d36e9b
{
Packit d36e9b
	switch (err) {
Packit d36e9b
	case E1284_OK:
Packit d36e9b
		return;
Packit d36e9b
	case E1284_NOMEM:
Packit d36e9b
		PyErr_NoMemory ();
Packit d36e9b
		return;
Packit d36e9b
	case E1284_SYS:
Packit d36e9b
		PyErr_SetFromErrno (PyExc_OSError);
Packit d36e9b
		return;
Packit d36e9b
	case E1284_NOTIMPL:
Packit d36e9b
		PyErr_SetString (pyieee1284_error,
Packit d36e9b
				 "Not implemented in libieee1284");
Packit d36e9b
		return;
Packit d36e9b
	case E1284_NOTAVAIL:
Packit d36e9b
		PyErr_SetString (pyieee1284_error,
Packit d36e9b
				 "Not available on this system");
Packit d36e9b
		return;
Packit d36e9b
	case E1284_TIMEDOUT:
Packit d36e9b
		PyErr_SetString (pyieee1284_error,
Packit d36e9b
				 "Operation timed out");
Packit d36e9b
		return;
Packit d36e9b
	case E1284_REJECTED:
Packit d36e9b
		PyErr_SetString (pyieee1284_error,
Packit d36e9b
				 "IEEE 1284 negotiation rejected");
Packit d36e9b
		return;
Packit d36e9b
	case E1284_NEGFAILED:
Packit d36e9b
		PyErr_SetString (pyieee1284_error,
Packit d36e9b
				 "Negotiation went wrong");
Packit d36e9b
		return;
Packit d36e9b
	case E1284_INIT:
Packit d36e9b
		PyErr_SetString (pyieee1284_error,
Packit d36e9b
				 "Error initialising port");
Packit d36e9b
		return;
Packit d36e9b
	case E1284_NOID:
Packit d36e9b
		PyErr_SetString (pyieee1284_error,
Packit d36e9b
				 "No IEEE 1284 ID available");
Packit d36e9b
		return;
Packit d36e9b
	case E1284_INVALIDPORT:
Packit d36e9b
		PyErr_SetString (pyieee1284_error,
Packit d36e9b
				 "Port is invalid (perhaps not opened?)");
Packit d36e9b
		return;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	PyErr_SetString (pyieee1284_error, "Unknown error");
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_get_deviceid (ParportObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	int daisy = -1;
Packit d36e9b
	int flags = 0;
Packit d36e9b
	char buffer[2000];
Packit d36e9b
	ssize_t r;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "|ii", &daisy, &flags))
Packit d36e9b
		return NULL;
Packit d36e9b
Packit d36e9b
	r = ieee1284_get_deviceid (self->port, daisy, flags, buffer,
Packit d36e9b
				   sizeof (buffer));
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	return PyString_FromStringAndSize (buffer, r);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_open (ParportObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	int flags = 0;
Packit d36e9b
	int capabilities = 0;
Packit d36e9b
	int r;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "|i", &flags))
Packit d36e9b
		return NULL;
Packit d36e9b
Packit d36e9b
	r = ieee1284_open (self->port, flags, &capabilities);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	return PyInt_FromLong (capabilities);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_close (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	int r = ieee1284_close (self->port);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_claim (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	int r = ieee1284_claim (self->port);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_release (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	ieee1284_release (self->port);
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_read_data (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	unsigned char b[2];
Packit d36e9b
	int r = ieee1284_read_data (self->port);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	return PyInt_FromLong (r);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_write_data (ParportObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	long byte;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "i", &byte))
Packit d36e9b
		return NULL;
Packit d36e9b
Packit d36e9b
	ieee1284_write_data (self->port, (unsigned char) byte);
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_data_dir (ParportObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	int r;
Packit d36e9b
	long reverse;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "i", &reverse))
Packit d36e9b
		return NULL;
Packit d36e9b
Packit d36e9b
	r = ieee1284_data_dir (self->port, reverse);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_read_status (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	unsigned char b[2];
Packit d36e9b
	int r = ieee1284_read_status (self->port);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	return PyInt_FromLong (r);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_wait_status (ParportObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	int mask, val;
Packit d36e9b
	float f;
Packit d36e9b
	struct timeval timeout;
Packit d36e9b
	int r;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "iif", &mask, &val, &f))
Packit d36e9b
		return NULL;
Packit d36e9b
Packit d36e9b
	timeout.tv_sec = (int) f;
Packit d36e9b
	timeout.tv_usec = (int) ((f - timeout.tv_sec) * 1000000);
Packit d36e9b
	r = ieee1284_wait_status (self->port, mask, val, &timeout);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_read_control (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	unsigned char b[2];
Packit d36e9b
	int r = ieee1284_read_control (self->port);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	return PyInt_FromLong (r);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_write_control (ParportObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	long byte;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "i", &byte))
Packit d36e9b
		return NULL;
Packit d36e9b
Packit d36e9b
	ieee1284_write_control (self->port, (unsigned char) byte);
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_frob_control (ParportObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	long mask, val;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "ii", &mask, &val))
Packit d36e9b
		return NULL;
Packit d36e9b
Packit d36e9b
	ieee1284_frob_control (self->port,
Packit d36e9b
			       (unsigned char) mask,
Packit d36e9b
			       (unsigned char) val);
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_negotiate (ParportObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	long mode;
Packit d36e9b
	int r;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "i", &mode))
Packit d36e9b
		return NULL;
Packit d36e9b
Packit d36e9b
	r = ieee1284_negotiate (self->port, mode);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_terminate (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	ieee1284_terminate (self->port);
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_ecp_fwd_to_rev (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	int r = ieee1284_ecp_fwd_to_rev (self->port);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_ecp_rev_to_fwd (ParportObject *self)
Packit d36e9b
{
Packit d36e9b
	int r = ieee1284_ecp_rev_to_fwd (self->port);
Packit d36e9b
	if (r < 0) {
Packit d36e9b
		handle_error (r);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
	Py_INCREF (Py_None);
Packit d36e9b
	return Py_None;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
Parport_set_timeout (ParportObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	float f;
Packit d36e9b
	struct timeval timeout, *oldto;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "f", &f))
Packit d36e9b
		return NULL;
Packit d36e9b
Packit d36e9b
	timeout.tv_sec = (int) f;
Packit d36e9b
	timeout.tv_usec = (int) ((f - timeout.tv_sec) * 1000000);
Packit d36e9b
	oldto = ieee1284_set_timeout (self->port, &timeout);
Packit d36e9b
	f = oldto->tv_sec + oldto->tv_usec * 1000000;
Packit d36e9b
	return PyFloat_FromDouble (f);
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
#define READ_FUNCTION(x)					\
Packit d36e9b
static PyObject *						\
Packit d36e9b
Parport_##x (ParportObject *self, PyObject *args)		\
Packit d36e9b
{								\
Packit d36e9b
	int flags = 0;						\
Packit d36e9b
	size_t len;						\
Packit d36e9b
	ssize_t got;						\
Packit d36e9b
	char *buffer;						\
Packit d36e9b
	PyObject *ret;						\
Packit d36e9b
								\
Packit d36e9b
	if (!PyArg_ParseTuple (args, "i|i", &len, &flags))	\
Packit d36e9b
		return NULL;					\
Packit d36e9b
								\
Packit d36e9b
	buffer = malloc (len);					\
Packit d36e9b
	got = ieee1284_##x (self->port, flags, buffer, len);	\
Packit d36e9b
	if (got < 0) {						\
Packit d36e9b
		handle_error (got);				\
Packit d36e9b
		free (buffer);					\
Packit d36e9b
		return NULL;					\
Packit d36e9b
	}							\
Packit d36e9b
								\
Packit d36e9b
	ret = PyString_FromStringAndSize (buffer, got);		\
Packit d36e9b
	free (buffer);						\
Packit d36e9b
	return ret;						\
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
#define READ_METHOD(x)						\
Packit d36e9b
	{ #x, (PyCFunction) Parport_##x, METH_VARARGS,		\
Packit d36e9b
	  #x "(length[,flags]) -> string\n"			\
Packit d36e9b
	  "Reads data using specified transfer method." },
Packit d36e9b
Packit d36e9b
#define WRITE_FUNCTION(x)						\
Packit d36e9b
static PyObject *							\
Packit d36e9b
Parport_##x (ParportObject *self, PyObject *args)			\
Packit d36e9b
{									\
Packit d36e9b
	int flags = 0;							\
Packit d36e9b
	int len;							\
Packit d36e9b
	char *buffer;							\
Packit d36e9b
	ssize_t wrote;							\
Packit d36e9b
	PyObject *ret;							\
Packit d36e9b
									\
Packit d36e9b
	if (!PyArg_ParseTuple (args, "s#|i", &buffer, &len, &flags))	\
Packit d36e9b
		return NULL;						\
Packit d36e9b
									\
Packit d36e9b
	wrote = ieee1284_##x (self->port, flags, buffer, len);		\
Packit d36e9b
	if (write < 0) {						\
Packit d36e9b
		handle_error (wrote);					\
Packit d36e9b
		return NULL;						\
Packit d36e9b
	}								\
Packit d36e9b
									\
Packit d36e9b
	return PyInt_FromLong (wrote);					\
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
#define WRITE_METHOD(x)						\
Packit d36e9b
	{ #x, (PyCFunction) Parport_##x, METH_VARARGS,		\
Packit d36e9b
	  #x "(string[,flags]) -> int\n"			\
Packit d36e9b
	  "Writes data using specified transfer method.\n"	\
Packit d36e9b
	  "Returns the number of bytes written." },
Packit d36e9b
Packit d36e9b
READ_FUNCTION(nibble_read)
Packit d36e9b
READ_FUNCTION(byte_read)
Packit d36e9b
READ_FUNCTION(epp_read_data)
Packit d36e9b
READ_FUNCTION(epp_read_addr)
Packit d36e9b
READ_FUNCTION(ecp_read_data)
Packit d36e9b
READ_FUNCTION(ecp_read_addr)
Packit d36e9b
WRITE_FUNCTION(compat_write)
Packit d36e9b
WRITE_FUNCTION(epp_write_data)
Packit d36e9b
WRITE_FUNCTION(epp_write_addr)
Packit d36e9b
WRITE_FUNCTION(ecp_write_data)
Packit d36e9b
WRITE_FUNCTION(ecp_write_addr)
Packit d36e9b
Packit d36e9b
PyMethodDef Parport_methods[] = {
Packit d36e9b
	{ "get_deviceid", (PyCFunction) Parport_get_deviceid, METH_VARARGS,
Packit d36e9b
	  "get_deviceid(daisy, flags) -> string\n"
Packit d36e9b
	  "Returns an IEEE 1284 Device ID of the device." },
Packit d36e9b
	{ "open", (PyCFunction) Parport_open, METH_VARARGS,
Packit d36e9b
	  "open(flags) -> int\n"
Packit d36e9b
	  "Opens a port and returns a capabilities bitmask." },
Packit d36e9b
	{ "close", (PyCFunction) Parport_close, METH_NOARGS,
Packit d36e9b
	  "close() -> None\n"
Packit d36e9b
	  "Closes a port." },
Packit d36e9b
	{ "claim", (PyCFunction) Parport_claim, METH_NOARGS,
Packit d36e9b
	  "claim() -> None\n"
Packit d36e9b
	  "Claims a port." },
Packit d36e9b
	{ "release", (PyCFunction) Parport_release, METH_NOARGS,
Packit d36e9b
	  "release() -> None\n"
Packit d36e9b
	  "Releases a port." },
Packit d36e9b
	{ "read_data", (PyCFunction) Parport_read_data, METH_NOARGS,
Packit d36e9b
	  "read_data() -> int\n"
Packit d36e9b
	  "Reads the byte on the data lines." },
Packit d36e9b
	{ "write_data", (PyCFunction) Parport_write_data, METH_VARARGS,
Packit d36e9b
	  "write_data(byte) -> None\n"
Packit d36e9b
	  "Writes the byte to the data lines." },
Packit d36e9b
	{ "data_dir", (PyCFunction) Parport_data_dir, METH_VARARGS,
Packit d36e9b
	  "data_dir(reverse) -> None\n"
Packit d36e9b
	  "Sets the direction of the data lines." },
Packit d36e9b
	{ "read_status", (PyCFunction) Parport_read_status, METH_NOARGS,
Packit d36e9b
	  "read_status() -> int\n"
Packit d36e9b
	  "Reads the values on the status lines." },
Packit d36e9b
	{ "wait_status", (PyCFunction) Parport_wait_status, METH_VARARGS,
Packit d36e9b
	  "wait_status(mask,val,timeout) -> None\n"
Packit d36e9b
	  "Waits for timeout (in seconds), until the status lines are as\n"
Packit d36e9b
	  "specified." },
Packit d36e9b
	{ "read_control", (PyCFunction) Parport_read_control, METH_NOARGS,
Packit d36e9b
	  "read_control() -> int\n"
Packit d36e9b
	  "Reads the values on the control lines." },
Packit d36e9b
	{ "write_control", (PyCFunction) Parport_write_control, METH_VARARGS,
Packit d36e9b
	  "write_control(byte) -> None\n"
Packit d36e9b
	  "Writes the values to the data lines." },
Packit d36e9b
	{ "frob_control", (PyCFunction) Parport_frob_control, METH_VARARGS,
Packit d36e9b
	  "frob_control(mask,val) -> None\n"
Packit d36e9b
	  "Frobnicates the values on the data lines." },
Packit d36e9b
	{ "negotiate", (PyCFunction) Parport_negotiate, METH_VARARGS,
Packit d36e9b
	  "negotiate(mode) -> None\n"
Packit d36e9b
	  "Negotiates to the desired IEEE 1284 transer mode." },
Packit d36e9b
	{ "terminate", (PyCFunction) Parport_terminate, METH_NOARGS,
Packit d36e9b
	  "terminate() -> None\n"
Packit d36e9b
	  "Terminates the current IEEE 1284 transer mode." },
Packit d36e9b
	{ "ecp_fwd_to_rev", (PyCFunction) Parport_ecp_fwd_to_rev, METH_NOARGS,
Packit d36e9b
	  "ecp_fwd_to_rev() -> None\n"
Packit d36e9b
	  "Switches to ECP reverse mode." },
Packit d36e9b
	{ "ecp_rev_to_fwd", (PyCFunction) Parport_ecp_rev_to_fwd, METH_NOARGS,
Packit d36e9b
	  "ecp_rev_to_fwd() -> None\n"
Packit d36e9b
	  "Switches to ECP forward mode." },
Packit d36e9b
	{ "set_timeout", (PyCFunction) Parport_set_timeout, METH_VARARGS,
Packit d36e9b
	  "set_timeout(float) -> float\n"
Packit d36e9b
	  "Sets transfer timeout, in seconds.  Returns old timeout value." },
Packit d36e9b
READ_METHOD(nibble_read)
Packit d36e9b
READ_METHOD(byte_read)
Packit d36e9b
READ_METHOD(epp_read_data)
Packit d36e9b
READ_METHOD(epp_read_addr)
Packit d36e9b
READ_METHOD(ecp_read_data)
Packit d36e9b
READ_METHOD(ecp_read_addr)
Packit d36e9b
WRITE_METHOD(compat_write)
Packit d36e9b
WRITE_METHOD(epp_write_data)
Packit d36e9b
WRITE_METHOD(epp_write_addr)
Packit d36e9b
WRITE_METHOD(ecp_write_data)
Packit d36e9b
WRITE_METHOD(ecp_write_addr)
Packit d36e9b
	{ NULL }
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
/***/
Packit d36e9b
Packit d36e9b
static PyTypeObject ParportType = {
Packit d36e9b
	PyObject_HEAD_INIT(NULL)
Packit d36e9b
	0,					/* ob_size */
Packit d36e9b
	"ieee1284.Parport",			/* tp_name */
Packit d36e9b
	sizeof (ParportObject),			/* tp_basicsize */
Packit d36e9b
	0,					/* tp_itemsize */
Packit d36e9b
	(destructor)Parport_dealloc,		/* tp_dealloc */
Packit d36e9b
	0,					/* tp_print */
Packit d36e9b
	0,					/* tp_getattr */
Packit d36e9b
	0,					/* tp_setattr */
Packit d36e9b
	0,					/* tp_compare */
Packit d36e9b
	0,					/* tp_repr */
Packit d36e9b
	0,					/* tp_as_number */
Packit d36e9b
	0,					/* tp_as_sequence */
Packit d36e9b
	0,					/* tp_as_mapping */
Packit d36e9b
	0,					/* tp_hash */
Packit d36e9b
	0,					/* tp_call */
Packit d36e9b
	0,					/* tp_str */
Packit d36e9b
	0,					/* tp_getattro */
Packit d36e9b
	0,					/* tp_setattro */
Packit d36e9b
	0,					/* tp_as_buffer */
Packit d36e9b
	Py_TPFLAGS_DEFAULT,			/* tp_flags */
Packit d36e9b
	"parallel port object",			/* tp_doc */
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
parport_object (struct parport *port)
Packit d36e9b
{
Packit d36e9b
	ParportObject *ret;
Packit d36e9b
	ret = (ParportObject *) ParportType.tp_new (&ParportType,
Packit d36e9b
						    Py_None,
Packit d36e9b
						    Py_None);
Packit d36e9b
	ret->port = port;
Packit d36e9b
	ieee1284_ref (port);
Packit d36e9b
	return (PyObject *) ret;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyObject *
Packit d36e9b
pyieee1284_find_ports (PyObject *self, PyObject *args)
Packit d36e9b
{
Packit d36e9b
	struct parport_list pl;
Packit d36e9b
	int flags = 0;
Packit d36e9b
	int err;
Packit d36e9b
	int i;
Packit d36e9b
	PyObject *ret;
Packit d36e9b
	if (!PyArg_ParseTuple (args, "|i", &flags))
Packit d36e9b
	    return NULL;
Packit d36e9b
Packit d36e9b
	err = ieee1284_find_ports (&pl, flags);
Packit d36e9b
Packit d36e9b
	if (err) {
Packit d36e9b
		handle_error (err);
Packit d36e9b
		return NULL;
Packit d36e9b
	}
Packit d36e9b
Packit d36e9b
Packit d36e9b
	ret = PyDict_New ();
Packit d36e9b
	for (i = 0; i <  pl.portc; i++) {
Packit d36e9b
		struct parport *port = pl.portv[i];
Packit d36e9b
		char *name = strdup (port->name);
Packit d36e9b
		PyObject *portobj = parport_object (port);
Packit d36e9b
		PyDict_SetItemString (ret, name, portobj);
Packit d36e9b
		free (name);
Packit d36e9b
		Py_DECREF (portobj);
Packit d36e9b
	}
Packit d36e9b
	ieee1284_free_ports (&pl);
Packit d36e9b
	return ret;
Packit d36e9b
}
Packit d36e9b
Packit d36e9b
static PyMethodDef Ieee1284Methods[] = {
Packit d36e9b
	{"find_ports", pyieee1284_find_ports, METH_VARARGS,
Packit d36e9b
	 "find_ports(flags) -> dict\n"
Packit d36e9b
	 "Returns a dict, indexed by name, of parallel ports."},
Packit d36e9b
	{NULL, NULL, 0, NULL}
Packit d36e9b
};
Packit d36e9b
Packit d36e9b
#ifndef PyMODINIT_FUNC
Packit d36e9b
#define PyMODINIT_FUNC void
Packit d36e9b
#endif
Packit d36e9b
PyMODINIT_FUNC
Packit d36e9b
initieee1284 (void)
Packit d36e9b
{
Packit d36e9b
	PyObject *m = Py_InitModule ("ieee1284", Ieee1284Methods);
Packit d36e9b
	PyObject *d = PyModule_GetDict (m);
Packit d36e9b
	PyObject *c;
Packit d36e9b
Packit d36e9b
	ParportType.tp_new = PyType_GenericNew;
Packit d36e9b
	ParportType.tp_init = (initproc) Parport_init;
Packit d36e9b
	ParportType.tp_getset = Parport_getseters;
Packit d36e9b
	ParportType.tp_methods = Parport_methods;
Packit d36e9b
	if (PyType_Ready (&ParportType) < 0)
Packit d36e9b
		return;
Packit d36e9b
Packit d36e9b
	Py_INCREF (&ParportType);
Packit d36e9b
	PyModule_AddObject (m, "Parport", (PyObject *) &ParportType);
Packit d36e9b
Packit d36e9b
	pyieee1284_error = PyErr_NewException("ieee1284.error", NULL, NULL);
Packit d36e9b
	Py_INCREF (pyieee1284_error);
Packit d36e9b
	PyModule_AddObject (m, "error", pyieee1284_error);
Packit d36e9b
Packit d36e9b
#define CONSTANT(x)					\
Packit d36e9b
        do {						\
Packit d36e9b
		c = PyInt_FromLong (x);			\
Packit d36e9b
		PyDict_SetItemString (d, #x, c);	\
Packit d36e9b
		Py_DECREF (c);				\
Packit d36e9b
	} while (0)
Packit d36e9b
Packit d36e9b
	CONSTANT (F1284_FRESH);
Packit d36e9b
	CONSTANT (F1284_EXCL);
Packit d36e9b
	CONSTANT (CAP1284_RAW);
Packit d36e9b
	CONSTANT (CAP1284_NIBBLE);
Packit d36e9b
	CONSTANT (CAP1284_BYTE);
Packit d36e9b
	CONSTANT (CAP1284_COMPAT);
Packit d36e9b
	CONSTANT (CAP1284_BECP);
Packit d36e9b
	CONSTANT (CAP1284_ECP);
Packit d36e9b
	CONSTANT (CAP1284_ECPRLE);
Packit d36e9b
	CONSTANT (CAP1284_ECPSWE);
Packit d36e9b
	CONSTANT (CAP1284_EPP);
Packit d36e9b
	CONSTANT (CAP1284_EPPSL);
Packit d36e9b
	CONSTANT (CAP1284_EPPSWE);
Packit d36e9b
	CONSTANT (CAP1284_IRQ);
Packit d36e9b
	CONSTANT (CAP1284_DMA);
Packit d36e9b
	CONSTANT (S1284_NFAULT);
Packit d36e9b
	CONSTANT (S1284_SELECT);
Packit d36e9b
	CONSTANT (S1284_PERROR);
Packit d36e9b
	CONSTANT (S1284_NACK);
Packit d36e9b
	CONSTANT (S1284_BUSY);
Packit d36e9b
	CONSTANT (S1284_INVERTED);
Packit d36e9b
	CONSTANT (C1284_NSTROBE);
Packit d36e9b
	CONSTANT (C1284_NAUTOFD);
Packit d36e9b
	CONSTANT (C1284_NINIT);
Packit d36e9b
	CONSTANT (C1284_NSELECTIN);
Packit d36e9b
	CONSTANT (C1284_INVERTED);
Packit d36e9b
	CONSTANT (M1284_NIBBLE);
Packit d36e9b
	CONSTANT (M1284_BYTE);
Packit d36e9b
	CONSTANT (M1284_COMPAT);
Packit d36e9b
	CONSTANT (M1284_BECP);
Packit d36e9b
	CONSTANT (M1284_ECP);
Packit d36e9b
	CONSTANT (M1284_ECPRLE);
Packit d36e9b
	CONSTANT (M1284_ECPSWE);
Packit d36e9b
	CONSTANT (M1284_EPP);
Packit d36e9b
	CONSTANT (M1284_EPPSL);
Packit d36e9b
	CONSTANT (M1284_EPPSWE);
Packit d36e9b
	CONSTANT (M1284_FLAG_DEVICEID);
Packit d36e9b
	CONSTANT (M1284_FLAG_EXT_LINK);
Packit d36e9b
	CONSTANT (F1284_NONBLOCK);
Packit d36e9b
	CONSTANT (F1284_SWE);
Packit d36e9b
	CONSTANT (F1284_RLE);
Packit d36e9b
	CONSTANT (F1284_FASTEPP);
Packit d36e9b
}