gpib_plotter.py

Mon, 10 Dec 2007 21:22:33 +0100

author
David Douard <david.douard@logilab.fr>
date
Mon, 10 Dec 2007 21:22:33 +0100
changeset 4
269aacbb2bf2
parent 1
0670b1f5c155
child 8
aa3d55f78563
permissions
-rw-r--r--

small cleanup

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')
                
        
    

mercurial