plotter/gpib_plotter.py

Sun, 03 Feb 2008 23:39:27 +0100

author
David Douard <david.douard@logilab.fr>
date
Sun, 03 Feb 2008 23:39:27 +0100
changeset 35
3b7a38af5c42
parent 32
59da528bc470
permissions
-rw-r--r--

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

mercurial