|
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 |
}
|