--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gpib_plotter.py Mon Dec 10 21:18:31 2007 +0100 @@ -0,0 +1,123 @@ +import sys, os +import time +import gpib + +class GPIBplotter(gpib.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=0): + super(GPIBplotter, self).__init__(device, baudrate, timeout, address, mode=0) + + 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 or not isinstance(wait_timeout, int): + raise TypeError + if wait_timeout<0: + raise ValueError + + self._cnx.timeout = wait_timeout + firstloop = True + while i<self._retries: + l = self._cnx.readline().strip() + if firstloop: + self._cnx.timeout = self._timeout + firstloop = False + if l == "": + i += 1 + for k, v in replies.items(): + if res.endswith(k) or res.endswith(k+';'): + self._cnx.write("%s"%v) + if k == "OS": + replies[k] = "16" + break + self._cnx.write('\r') + if i > self._retries/2: + time.sleep(self._timeout) + continue + res += l + "\n" + i = 0 + 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=options.address) + 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=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') + + + + +