Sun, 03 Feb 2008 23:39:27 +0100
Refactored the preference system for the qt gpib plotter app. One can now set the colors for plotting pens.
import sys, os import time import gpib import gpib from prologix import GPIB class GPIBplotter(GPIB): _replies={ "OE": "0", "OH": "0,0,10000,7500", "OI": "7470A", "OP": "0,0,10000,7500", "OO": "0,1,0,0,0,0,0,0", "OF": "40,40", "OS": "24", } def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1, address=5): super(GPIBplotter, self).__init__(device, baudrate, timeout, address, mode=0) def plotStarted(self): pass def load_plot(self, wait_timeout=0): """ Make a full plot process. 'wait_timeout' is the first timeout. Same semantic as the 'timeout' property of a serial connection (if set to None, it will block until the GPIB device actually perform a plot command.) """ res = "" i=0 replies = self._replies.copy() if wait_timeout is not None and not isinstance(wait_timeout, (float, int)): raise TypeError, "wait_timeout (%s:%s) has wrong type"%(repr(wait_timeout), type(wait_timeout)) if wait_timeout<0: raise ValueError self._cnx.timeout = wait_timeout firstloop = True newdata = False while i<self._retries: l = self._cnx.readline().strip() if firstloop: self._cnx.timeout = self._timeout firstloop = False self.plotStarted() if l == "": if i == 0:# > (self._retries/2): # ie. we just received new stuffs (i is reset in the else block) for k, v in replies.items(): # check wether we should reply smthg eres = res.replace('\n', '').strip() if eres.endswith(k) or eres.endswith(k+';') or eres.endswith(k+';OE'): self._cnx.write("%s"%v) if k == "OS": replies[k] = "16" break self._cnx.write('\r') #time.sleep(0.1) i += 1 else: if not res: print "Plotting..." res += l + '\n' i = 0 #time.sleep(0.1) if res: print "DONE (received %d characters)"%len(res) return res if __name__ == '__main__': import optparse opt = optparse.OptionParser('A simple HP7470A GPIB plotter emulator for USB-GPIB bundle (ProLogix)') opt.add_option('-f', '--filename', default=None, dest='filename', help='Output filename. If not set, write to stdout') opt.add_option('-d', '--device', default='/dev/ttyUSB0', dest='device', help='Device of the RS232 connection (default: /dev/ttyUSB0)', ) opt.add_option('-a', '--address', default=0, dest='address', help='GPIB address of the device', ) opt.add_option('-l', '--loop', default=False, action="store_true", dest="loop", help="Continuously wait for new plots. If set, filename must be set and files will be created with _n at the end") opt.add_option('-v', '--verbose', default=False, action="store_true", dest="verbose", help="Verbose mode",) options, argv = opt.parse_args(sys.argv) if options.loop and not options.filename: opt.error('If loop is set, you *must* provide a filename') if options.filename: outf = open(options.filename, "w") else: outf = sys.stdout try: plotter = GPIBplotter(device=options.device, address=int(options.address), timeout=0.06) except (gpib.SerialException, gpib.ConnectionError), e: sys.stderr.write('Connection error:\n\t' + '\n\t'.join([str(x) for x in e.args]) + '\n') sys.stderr.write('Check your parameters\n') sys.exit(1) if options.verbose: sys.stderr.write('connection established\n') loop = True nloop = 0 while loop: plot = plotter.load_plot(wait_timeout=0.1) if options.verbose: sys.stderr.write('.') if plot: outf.write(plot) if options.verbose: sys.stderr.write('\n') sys.stderr.write('Received a new plot (written to %s)\n'%outf.name) if not options.loop: loop = False else: nloop += 1 fname, ext = os.path.splitext(options.filename) outf = open(fname + "_%d"%nloop + ext, 'w')