|
From: Dan L. <dl...@gm...> - 2008-09-10 18:25:09
|
Hi all,
I've been using Python to write GPIB code for a long time. I recently got
sick of Cygwin and decide to try things under Linux. I was really
pleasantly surprised with how easy it was to get my PCI-GPIB card
working!!!
I have made some improvements to the Python bindings, which I have
attached here as a patch:
* gpib.dev() = ibdev (sorely needed, IMHO!)
* gpib.listener() = ibln
* gpib.ask() = ibask
* all the TNONE, T10us, etc. constants for timeouts
I've also cleaned up some of the cruftier code to match normal CPython
coding standards, and I combined read/readbin and write/writebin in a sane
way that should just Do The Right Thing. As far as I can tell, those were
written as a sort of workaround by someone who wasn't used to Python's
handling of strings with embedded NUL characters. The distinction is
definitely not important in Python.
My main goal was to get PyVISA working under Linux... however I've found
that the Natl Instruments VISA libraries are binary-only, bloated, and
only designed to run on 32-bit systems. Ugh. So I have also written a
Python module called "fakevisa" which mimics the interface of PyVISA, but
can only access GPIB devices since it depends only on linux-gpib. Now my
existing PyVISA scripts work pretty much fine without needing to actually
install the VISA libs. If anyone is interested in the code, let me know.
Dan
Patch:
Index: gpibinter.c
===================================================================
--- gpibinter.c (revision 1509)
+++ gpibinter.c (working copy)
@@ -10,76 +10,62 @@
/* ----------------------------------------------------- */
-static char gpib_find__doc__[] =
+static char gpib_dev__doc__[] =
""
;
-static PyObject* gpib_find(PyObject *self, PyObject *args)
+static PyObject *gpib_dev(PyObject *self, PyObject *args)
{
- char *name;
- int ud;
+ int minor, pad, sad, timeout, send_eoi, eos_mode, ud;
- if (!PyArg_ParseTuple(args, "s",&name))
+ if (!PyArg_ParseTuple(args,
"iiiiii",&minor,&pad,&sad,&timeout,&send_eoi,&eos_mode))
return NULL;
- if((ud = ibfind(name)) & ERR){
- PyErr_SetString(GpibError,"Find Error: can't find device!");
+ ud = ibdev(minor, pad, sad, timeout, send_eoi, eos_mode);
+ if(ud & ERR)
+ {
+ PyErr_SetString(GpibError,"ibdev Error: ibdev() failed");
return NULL;
}
- return Py_BuildValue("i",ud);
+ return PyInt_FromLong(ud);
}
-static char gpib_read__doc__[] =
+static char gpib_find__doc__[] =
""
;
-static PyObject* gpib_read(PyObject *self, PyObject *args)
+static PyObject* gpib_find(PyObject *self, PyObject *args)
{
- char *result;
- int device;
- int len;
- PyObject *retval;
+ char *name;
+ int ud;
- if (!PyArg_ParseTuple(args, "ii",&device,&len))
+ if (!PyArg_ParseTuple(args, "s",&name))
return NULL;
- result = malloc(len + 1);
- if(result == NULL)
- {
- PyErr_SetString(GpibError,"Read Error: can't get Memory ");
- return NULL;
+ if((ud = ibfind(name)) & ERR){
+ PyErr_SetString(GpibError,"Find Error: can't find device!");
+ return NULL;
}
- if( ibrd(device,result,len) & ERR )
- {
- PyErr_SetString(GpibError,"Read Error: ibrd() failed");
- free(result);
- return NULL;
- }
- result[ibcnt] = '\0';
-
- retval = Py_BuildValue("s", result);
- free(result);
- return retval;
+ return PyInt_FromLong(ud);
}
-static char gpib_readbin__doc__[] =
+static char gpib_read__doc__[] =
""
;
-
-static PyObject* gpib_readbin(PyObject *self, PyObject *args)
+static PyObject* gpib_read(PyObject *self, PyObject *args)
{
char *result;
- PyObject *retval;
int device;
int len;
+ PyObject *retval;
if (!PyArg_ParseTuple(args, "ii",&device,&len))
return NULL;
- result = malloc(len + 1);
+ result = PyMem_Malloc(len);
if(result == NULL)
{
PyErr_SetString(GpibError,"Read Error: can't get Memory ");
@@ -93,12 +79,11 @@
return NULL;
}
- retval = Py_BuildValue("s#", result, ibcnt);
+ retval = PyString_FromStringAndSize(result, ibcnt);
free(result);
return retval;
}
-
static char gpib_write__doc__[] =
""
;
@@ -107,40 +92,62 @@
{
char *command;
int device;
+ int cmdlength;
+ int length=0;
- if (!PyArg_ParseTuple(args, "is",&device,&command))
+ if (!PyArg_ParseTuple(args, "is#|
i",&device,&command,&cmdlength,&length))
return NULL;
- if( ibwrt(device,command,strlen(command)) & ERR ){
+ if (!length)
+ length = cmdlength;
+ if( ibwrt(device,command,length) & ERR ){
PyErr_SetString(GpibError,"Write Error: ibwrt");
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
-static char gpib_writebin__doc__[] =
+static char gpib_listener__doc__[] =
""
;
-static PyObject* gpib_writebin(PyObject *self, PyObject *args)
+static PyObject* gpib_listener(PyObject *self, PyObject *args)
{
- char *command;
int device;
- int length;
- int cmdlength;
+ int pad;
+ int sad;
+ short found_listener;
- if (!PyArg_ParseTuple(args,
"is#i",&device,&command,&cmdlength,&length))
+ if (!PyArg_ParseTuple(args, "iii",&device,&pad,&sad))
return NULL;
- if( ibwrt(device,command,length) & ERR ){
- PyErr_SetString(GpibError,"Write Error: ibwrt");
+ if( ibln(device,pad,sad,&found_listener) & ERR ){
+ PyErr_SetString(GpibError,"Listener Error: ibln");
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ return PyBool_FromLong(found_listener);
}
+static char gpib_ask__doc__[] =
+""
+;
+
+static PyObject* gpib_ask(PyObject *self, PyObject *args)
+{
+ int device;
+ int option;
+ int result;
+
+ if (!PyArg_ParseTuple(args, "ii",&device,&option))
+ return NULL;
+ if ( ibask(device,option,&result) & ERR){
+ PyErr_SetString(GpibError,"Ask Error: ibask");
+ return NULL;
+ }
+
+ return PyInt_FromLong(result);
+}
+
static char gpib_cmd__doc__[] =
""
;
@@ -157,8 +164,7 @@
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static char gpib_ren__doc__[] =
@@ -178,8 +184,7 @@
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static char gpib_clear__doc__[] =
@@ -199,8 +204,7 @@
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static char gpib_close__doc__[] =
@@ -219,8 +223,7 @@
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static char gpib_wait__doc__[] =
@@ -249,8 +252,7 @@
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static char gpib_tmo__doc__[] =
@@ -269,8 +271,7 @@
PyErr_SetString(GpibError,"Timeout Error: ibtmo() failed");
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static char gpib_rsp__doc__[] =
@@ -309,8 +310,7 @@
return NULL;
}
- Py_INCREF(Py_None);
- return Py_None;
+ Py_RETURN_NONE;
}
static char gpib_ibsta__doc__[] =
@@ -319,11 +319,7 @@
static PyObject* gpib_ibsta(PyObject *self, PyObject *args)
{
-
- if (!PyArg_ParseTuple(args, ""))
- return NULL;
-
- return Py_BuildValue("i",ibsta);
+ return PyInt_FromLong(ibsta);
}
static char gpib_ibcnt__doc__[] =
@@ -332,31 +328,30 @@
static PyObject* gpib_ibcnt(PyObject *self, PyObject *args)
{
-
- if (!PyArg_ParseTuple(args, ""))
- return NULL;
-
- return Py_BuildValue("i",ibcnt);
+ return PyInt_FromLong(ibcnt);
}
/* List of methods defined in the module */
static struct PyMethodDef gpib_methods[] = {
- {"find", gpib_find, 1, gpib_find__doc__},
- {"read", gpib_read, 1, gpib_read__doc__},
- {"readbin", gpib_readbin, 1, gpib_readbin__doc__},
- {"write", gpib_write, 1, gpib_write__doc__},
- {"writebin", gpib_writebin, 1, gpib_writebin__doc__},
- {"cmd", gpib_cmd, 1, gpib_cmd__doc__},
- {"ren", gpib_ren, 1, gpib_ren__doc__},
- {"clear", gpib_clear, 1, gpib_clear__doc__},
- {"close", gpib_close, 1, gpib_close__doc__},
- {"wait", gpib_wait, 1, gpib_wait__doc__},
- {"tmo", gpib_tmo, 1, gpib_tmo__doc__},
- {"rsp", gpib_rsp, 1, gpib_rsp__doc__},
- {"trg", gpib_trg, 1, gpib_trg__doc__},
- {"ibsta", gpib_ibsta, 1, gpib_ibsta__doc__},
- {"ibcnt", gpib_ibcnt, 1, gpib_ibcnt__doc__},
+ {"dev", gpib_dev, METH_VARARGS, gpib_dev__doc__},
+ {"find", gpib_find, METH_VARARGS, gpib_find__doc__},
+ {"read", gpib_read, METH_VARARGS, gpib_read__doc__},
+ {"readbin", gpib_read, METH_VARARGS, gpib_read__doc__},
+ {"write", gpib_write, METH_VARARGS, gpib_write__doc__},
+ {"writebin", gpib_write, METH_VARARGS, gpib_write__doc__},
+ {"listener", gpib_listener, METH_VARARGS, gpib_listener__doc__},
+ {"ask", gpib_ask, METH_VARARGS, gpib_ask__doc__},
+ {"cmd", gpib_cmd, METH_VARARGS, gpib_cmd__doc__},
+ {"ren", gpib_ren, METH_VARARGS, gpib_ren__doc__},
+ {"clear", gpib_clear, METH_VARARGS, gpib_clear__doc__},
+ {"close", gpib_close, METH_VARARGS, gpib_close__doc__},
+ {"wait", gpib_wait, METH_VARARGS, gpib_wait__doc__},
+ {"tmo", gpib_tmo, METH_VARARGS, gpib_tmo__doc__},
+ {"rsp", gpib_rsp, METH_VARARGS, gpib_rsp__doc__},
+ {"trg", gpib_trg, METH_VARARGS, gpib_trg__doc__},
+ {"ibsta", gpib_ibsta, METH_NOARGS, gpib_ibsta__doc__},
+ {"ibcnt", gpib_ibcnt, METH_NOARGS, gpib_ibcnt__doc__},
{NULL, NULL} /* sentinel */
};
@@ -379,13 +374,30 @@
/* Add some symbolic constants to the module */
d = PyModule_GetDict(m);
- GpibError = PyString_FromString("gpib.error");
+ GpibError = PyErr_NewException("gpib.GpibError", PyExc_IOError,
NULL); /*PyString_FromString("gpib.error");*/
PyDict_SetItemString(d, "error", GpibError);
+
+ /* XXXX Add constants here */
+ PyDict_SetItemString(d, "TNONE", PyInt_FromLong(0));
+ PyDict_SetItemString(d, "T10us", PyInt_FromLong(1));
+ PyDict_SetItemString(d, "T30us", PyInt_FromLong(2));
+ PyDict_SetItemString(d, "T100us", PyInt_FromLong(3));
+ PyDict_SetItemString(d, "T300us", PyInt_FromLong(4));
+ PyDict_SetItemString(d, "T1ms", PyInt_FromLong(5));
+ PyDict_SetItemString(d, "T3ms", PyInt_FromLong(6));
+ PyDict_SetItemString(d, "T10ms", PyInt_FromLong(7));
+ PyDict_SetItemString(d, "T30ms", PyInt_FromLong(8));
+ PyDict_SetItemString(d, "T100ms", PyInt_FromLong(9));
+ PyDict_SetItemString(d, "T300ms", PyInt_FromLong(10));
+ PyDict_SetItemString(d, "T1s", PyInt_FromLong(11));
+ PyDict_SetItemString(d, "T3s", PyInt_FromLong(12));
+ PyDict_SetItemString(d, "T10s", PyInt_FromLong(13));
+ PyDict_SetItemString(d, "T30s", PyInt_FromLong(14));
+ PyDict_SetItemString(d, "T100s", PyInt_FromLong(15));
+ PyDict_SetItemString(d, "T300s", PyInt_FromLong(16));
+ PyDict_SetItemString(d, "T1000s", PyInt_FromLong(17));
- /* XXXX Add constants here */
-
- /* Check for errors */
+ /* Check for errors */
if (PyErr_Occurred())
Py_FatalError("can't initialize module gpib");
}
-
Index: Gpib.py
===================================================================
--- Gpib.py (revision 1509)
+++ Gpib.py (working copy)
@@ -26,6 +26,14 @@
self.res = gpib.readbin(self.id,len)
return self.res
+ def listener(self):
+ self.res = gpib.listener(self.id,self.id,-1)
+ return self.res
+
+ def ask(self,option):
+ self.res = gpib.ask(self.id,option)
+ reutnr self.res
+
def clear(self):
gpib.clear(self.id)
|