diff -r a04bea92c509 -r 78e3e839658b prologix.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/prologix.py Mon Dec 17 18:59:45 2007 +0100 @@ -0,0 +1,117 @@ +""" +Prologix +======== + +Module defining a communication object to talk to Prologix USB-GPIB controler. + +""" +import serial +import time + +import gpib +from gpib import ConnectionError + +GPIB_CONTROLLER = 1 +GPIB_DEVICE = 0 + +class GPIB(object): + _retries = 15 + def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1, + address=0, mode=1): + """ + Create a new GPIB controller for the Prologix USB-GPIB device + located on serial device 'device'. + """ + self._cnx = serial.Serial(port=device, baudrate=baudrate, timeout=timeout) + self._timeout = timeout + + self.set_mode(mode) + self.set_address(address) + + def set_address(self, address): + """ + Set the address of the GPIB device: + + - if the device is the Controller In Charge, this is the + address of the device commands are sent to, + + - if the device is in GPIB_DEVICE mode, this is its address. + """ + self._set_cmd('addr', address) + self._adress = address + + def set_mode(self, mode): + """ + Set GPIB device mode to 'mode': + + - GPIB_CONTROLLER: set the device as the Controller In Charge + on the GPIB bus + + - GPIB_DEVICE: set the device as a standard GPIB device on the + bus. + """ + self._set_cmd('mode', mode) + self._mode = mode + + def set_controller(self): + """ + Set GPIB device the Controller In Charge on the GPIB bus. + """ + self.set_mode(1) + + def set_device(self): + """ + Set the GPIB device as a simple device on the GPIB bus. + """ + self.set_mode(0) + + def send_command(self, cmd): + """ + Send the specified GPIB command on the bus (must be the CIC), + and read the answer. + """ + assert self._mode == 1 + self._cnx.write(cmd+'\r') + time.sleep(self._timeout) # required? + ret = self._cnx.readlines() + return ''.join(ret) + + def check_srq(self): + """ + Check the SRQ line + """ + assert self._mode == 1, "must be the Controller In Charge" + self._cnx.write('++srq\r') + ret = self._cnx.readline().strip() + if ret: + return bool(int(ret)) + return None + + def poll(self): + """ + Poll every address, and return a dictionnary + {add: status, ...} + """ + assert self._mode == 1, "must be the Controller In Charge" + dico = {} + for add in range(31): + self._cnx.write('++spoll %d\r'%i) + ret = self._cnx.readline().strip() + if ret: + dico[i] = int(ret) + return dico + + def _read(self): + for i in range(self._retries): + rdata = self._cnx.readline() + if rdata.strip() != "": + break + time.sleep(self._timeout) + return rdata + + def _set_cmd(self, cmd, value): + self._cnx.write('++%s %d\r'%(cmd, value)) + self._cnx.write('++%s\r'%(cmd)) + rval = self._read().strip() + if not rval.isdigit() or int(rval) != value: + raise ConnectionError("Can't set GPIB %s to %s [ret=%s]"%(cmd, value, repr(rval)))