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

1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
1 import sys, os
0
9af1509775b6 initial import
David Douard <david.douard@logilab.fr>
parents:
diff changeset
2 import time
1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
3 import gpib
0
9af1509775b6 initial import
David Douard <david.douard@logilab.fr>
parents:
diff changeset
4
1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
5 class GPIBplotter(gpib.GPIB):
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
6 replies={
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
7 "OE": "0",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
8 "OH": "0,0,10000,7500",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
9 "OI": "7470A",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
10 "OP": "0,0,10000,7500",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
11 "OO": "0,1,0,0,0,0,0,0",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
12 "OF": "40,40",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
13 "OS": "24",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
14 }
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
15 def __init__(self, device="/dev/ttyUSB0", baudrate=115200, timeout=0.1,
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
16 address=0):
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
17 super(GPIBplotter, self).__init__(device, baudrate, timeout, address, mode=0)
0
9af1509775b6 initial import
David Douard <david.douard@logilab.fr>
parents:
diff changeset
18
1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
19 def load_plot(self, wait_timeout=0):
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
20 """
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
21 Make a full plot process.
0
9af1509775b6 initial import
David Douard <david.douard@logilab.fr>
parents:
diff changeset
22
1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
23 'wait_timeout' is the first timeout. Same semantic as the
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
24 'timeout' property of a serial connection (if set to None, it
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
25 will block until the GPIB device actually perform a plot
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
26 command.)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
27 """
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
28 res = ""
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
29 i=0
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
30 replies = self._replies.copy()
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
31 if wait_timeout is not None or not isinstance(wait_timeout, int):
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
32 raise TypeError
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
33 if wait_timeout<0:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
34 raise ValueError
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
35
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
36 self._cnx.timeout = wait_timeout
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
37 firstloop = True
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
38 while i<self._retries:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
39 l = self._cnx.readline().strip()
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
40 if firstloop:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
41 self._cnx.timeout = self._timeout
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
42 firstloop = False
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
43 if l == "":
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
44 i += 1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
45 for k, v in replies.items():
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
46 if res.endswith(k) or res.endswith(k+';'):
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
47 self._cnx.write("%s"%v)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
48 if k == "OS":
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
49 replies[k] = "16"
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
50 break
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
51 self._cnx.write('\r')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
52 if i > self._retries/2:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
53 time.sleep(self._timeout)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
54 continue
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
55 res += l + "\n"
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
56 i = 0
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
57 return res
0
9af1509775b6 initial import
David Douard <david.douard@logilab.fr>
parents:
diff changeset
58
1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
59 if __name__ == '__main__':
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
60 import optparse
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
61 opt = optparse.OptionParser('A simple HP7470A GPIB plotter emulator for USB-GPIB bundle (ProLogix)')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
62 opt.add_option('-f', '--filename', default=None,
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
63 dest='filename',
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
64 help='Output filename. If not set, write to stdout')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
65 opt.add_option('-d', '--device', default='/dev/ttyUSB0',
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
66 dest='device',
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
67 help='Device of the RS232 connection (default: /dev/ttyUSB0)',
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
68 )
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
69 opt.add_option('-a', '--address', default=0,
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
70 dest='address',
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
71 help='GPIB address of the device',
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
72 )
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
73 opt.add_option('-l', '--loop', default=False,
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
74 action="store_true",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
75 dest="loop",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
76 help="Continuously wait for new plots. If set, filename must be set and files will be created with _n at the end")
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
77 opt.add_option('-v', '--verbose', default=False,
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
78 action="store_true",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
79 dest="verbose",
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
80 help="Verbose mode",)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
81
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
82 options, argv = opt.parse_args(sys.argv)
0
9af1509775b6 initial import
David Douard <david.douard@logilab.fr>
parents:
diff changeset
83
1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
84 if options.loop and not options.filename:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
85 opt.error('If loop is set, you *must* provide a filename')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
86
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
87 if options.filename:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
88 outf = open(options.filename, "w")
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
89 else:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
90 outf = sys.stdout
0
9af1509775b6 initial import
David Douard <david.douard@logilab.fr>
parents:
diff changeset
91
9af1509775b6 initial import
David Douard <david.douard@logilab.fr>
parents:
diff changeset
92
1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
93 try:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
94 plotter = GPIBplotter(device=options.device, address=options.address)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
95 except (gpib.SerialException, gpib.ConnectionError), e:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
96 sys.stderr.write('Connection error:\n\t' + '\n\t'.join([str(x) for x in e.args]) + '\n')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
97 sys.stderr.write('Check your parameters\n')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
98 sys.exit(1)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
99 if options.verbose:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
100 sys.stderr.write('connection established\n')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
101
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
102 loop = True
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
103 nloop = 0
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
104 while loop:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
105 plot = plotter.load_plot(wait_timeout=1)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
106 if options.verbose:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
107 sys.stderr.write('.')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
108 if plot:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
109 outf.write(plot)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
110 if options.verbose:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
111 sys.stderr.write('\n')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
112 sys.stderr.write('Received a new plot (written to %s)\n'%outf.name)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
113 if not options.loop:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
114 loop = False
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
115 else:
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
116 nloop += 1
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
117 fname, ext = os.path.splitext(options.filename)
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
118 outf = open(fname + "_%d"%nloop + ext, 'w')
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
119
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
120
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
121
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
122
0670b1f5c155 make 7470 plotter emulator more user friendly & several file renames
David Douard <david.douard@logilab.fr>
parents: 0
diff changeset
123

mercurial