diff options
Diffstat (limited to 'pyparallel/src/win32/_pyparallel.c')
-rw-r--r-- | pyparallel/src/win32/_pyparallel.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/pyparallel/src/win32/_pyparallel.c b/pyparallel/src/win32/_pyparallel.c new file mode 100644 index 0000000..7f906c5 --- /dev/null +++ b/pyparallel/src/win32/_pyparallel.c @@ -0,0 +1,91 @@ +// Parallel port extension for Win32 +// "inp" and "outp" are used to access the parallelport hardware +// needs giveio.sys driver on NT/2k/XP +// +// (C) 2002 Chris Liechti <cliechti@gmx.net> +// this is distributed under a free software license, see license.txt + +#include <Python.h> +#include <windows.h> +#include <conio.h> +#include "loaddrv.h" + +#define DRIVERNAME "giveio.sys" +#define SERVICENAME "giveio" + +/* module-functions */ + +static PyObject* +py_outp(PyObject *self, PyObject *args) +{ + int port, value; + if(!PyArg_ParseTuple(args, "ii", &port, &value)) + return 0; + _outp(port, value); + Py_INCREF(Py_None); + return Py_None; +} + +static PyObject* +py_inp(PyObject *self, PyObject *args) +{ + int port, value; + if(!PyArg_ParseTuple(args, "i", &port)) + return 0; + value = _inp(port); + return Py_BuildValue("i", value); +} + + + +static PyMethodDef pypar_methods[] = { + {"outp", py_outp, METH_VARARGS}, + {"inp", py_inp, METH_VARARGS}, + {0, 0} +}; + +/* module entry-point (module-initialization) function */ +void init_pyparallel(void) { + int dwStatus; + //~ char buf[256]; + OSVERSIONINFO vi; + + /* Create the module and add the functions */ + PyObject *m = Py_InitModule("_pyparallel", pypar_methods); + + //detect OS, on NT,2k,XP the driver needs to be loaded + vi.dwOSVersionInfoSize = sizeof(vi); + GetVersionEx(&vi); + if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) { + HANDLE h; + //try to open driver + h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) { + //failed, try to load sys file fom disk + dwStatus = LoadDriverInit(); //init loaddriver module + //~ printf("init %d\n", dwStatus); + //driver not running, try to start it + //~ dwStatus = getcwd(buf, sizeof buf); + //~ snprintf(buf, sizeof buf, "%s\\%s", buf, SERVICENAME); + //~ printf("path %d %s %s\n", dwStatus, buf, SERVICENAME); + //~ dwStatus = DriverInstall(buf, SERVICENAME); + //install the driver. this returns an error if already installed + //but who cares? + dwStatus = DriverInstall(DRIVERNAME, SERVICENAME); + dwStatus = DriverStart(SERVICENAME);//now start the driver + LoadDriverCleanup(); //close loaddriver module + //retry to open the file + h = CreateFile("\\\\.\\giveio", GENERIC_READ, 0, NULL, + OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); + if (h == INVALID_HANDLE_VALUE) { + //if it fails again, then we have a problem... -> exception + PyErr_Format(PyExc_ImportError, "Couldn't access giveio device"); + } + } + //close again immediately. + //the process is now tagged to have the rights it needs, + //the giveio driver remembers that + if (h != NULL) CloseHandle(h); //close the driver's file + } +} |