pygpibtoolkit/gpibmockup.py

Mon, 04 Jun 2018 22:27:41 +0200

author
David Douard <david.douard@logilab.fr>
date
Mon, 04 Jun 2018 22:27:41 +0200
changeset 108
dadf7c8d43ad
parent 91
f2a8f688dbc0
permissions
-rw-r--r--

[plotter] use OSError instead of more specific SerialException

79
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
1 # This program is free software; you can redistribute it and/or modify it under
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
2 # the terms of the GNU General Public License as published by the Free Software
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
3 # Foundation; either version 2 of the License, or (at your option) any later
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
4 # version.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
5 #
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
6 # This program is distributed in the hope that it will be useful, but WITHOUT
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
7 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
8 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
9 #
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
10 # You should have received a copy of the GNU General Public License along with
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
11 # this program; if not, write to the Free Software Foundation, Inc.,
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
12 # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
13 """ Copyright (c) 2007-2008 David Douard (Paris, FRANCE).
91
f2a8f688dbc0 project moved to bitbucket
David Douard <david.douard@logilab.fr>
parents: 79
diff changeset
14 https://bitbucket.org/dddouard/pygpibtoolkit -- mailto:david.douard@sdfa3.org
79
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
15
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
16 Module defining a mockup GPIB communication object.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
17
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
18 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
19
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
20 class BaseMockup(object):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
21 _idnstr = "BaseMockup"
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
22 _idncmd = "*IDN?"
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
23
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
24 _cmds = {}
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
25
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
26 def __init__(self):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
27 #self._current_cmd = None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
28 self._current_data = None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
29
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
30 def cmd(self, cmd, *args):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
31 if cmd == self._idncmd:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
32 return self._idnstr
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
33 try:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
34 if ' ' in cmd:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
35 cmd, cmdargs = cmd.split(None, 1)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
36 args = args + (cmdargs,)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
37 _cmd = getattr(self, cmd)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
38 self._current_data = _cmd(*args)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
39 except AttributeError:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
40 if cmd in self._cmds:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
41 self._current_data = iter(self._cmds[cmd])
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
42 else:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
43 raise ValueError('Unknown command %s'%repr(cmd))
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
44 else:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
45 if isinstance(self._current_data, basestring):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
46 ret = self._current_data
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
47 self._current_data = None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
48 return ret
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
49 elif self._current_data is None:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
50 return None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
51 else:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
52 try:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
53 return self._current_data.next()
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
54 except StopIteration:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
55 self._current_data = None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
56 return None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
57 return None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
58
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
59 def read(self):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
60 try:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
61 return self._current_data.next()
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
62 except StopIteration:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
63 self._current_data = None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
64 return None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
65 except:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
66 return None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
67
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
68 GPIB_CONTROLLER = 1
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
69 GPIB_DEVICE = 0
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
70
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
71 class GPIB(object):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
72 _retries = 15
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
73 def __init__(self, address=0, mode=1, **kw):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
74 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
75 Create a new mockup GPIB controller.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
76 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
77 self.set_mode(mode)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
78 self.set_address(address)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
79 self._devices = {}
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
80
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
81 def adddevice(self, add, mockup):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
82 self._devices[add] = mockup
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
83
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
84 def set_address(self, address, check=True):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
85 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
86 Set the address of the GPIB device:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
87
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
88 - if the device is the Controller In Charge, this is the
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
89 address of the device commands are sent to,
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
90
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
91 - if the device is in GPIB_DEVICE mode, this is its address.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
92 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
93 self._address = address
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
94
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
95 def set_mode(self, mode):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
96 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
97 Set GPIB device mode to 'mode':
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
98
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
99 - GPIB_CONTROLLER: set the device as the Controller In Charge
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
100 on the GPIB bus
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
101
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
102 - GPIB_DEVICE: set the device as a standard GPIB device on the
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
103 bus.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
104 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
105 self._mode = mode
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
106
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
107 def set_controller(self):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
108 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
109 Set GPIB device the Controller In Charge on the GPIB bus.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
110 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
111 self.set_mode(1)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
112
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
113 def set_device(self):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
114 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
115 Set the GPIB device as a simple device on the GPIB bus.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
116 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
117 self.set_mode(0)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
118
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
119 def send_command(self, cmd, address=None):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
120 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
121 Send the specified GPIB command on the bus (must be the CIC),
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
122 and read the answer.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
123 Eventually, set the addressed device first.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
124 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
125 assert self._mode == 1
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
126 if address is not None:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
127 self.set_address(address)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
128
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
129 if self._address in self._devices:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
130 return self._devices[self._address].cmd(cmd)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
131 return None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
132
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
133 def read_eoi(self, address=None):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
134 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
135 Read the HPIB buffer from device, till EOI is performed, or timeout.
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
136 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
137 if address is not None:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
138 self.set_address(address)
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
139 if self._address in self._devices:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
140 return "".join(self._devices[self._address].read())
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
141 ret = ""
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
142 return ret
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
143
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
144 def check_srq(self):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
145 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
146 Check the SRQ line
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
147 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
148 assert self._mode == 1, "must be the Controller In Charge"
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
149 return None
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
150
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
151 def poll(self, addresses=None):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
152 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
153 Poll every address, and return a dictionnary
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
154 {add: status, ...}
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
155 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
156 assert self._mode == 1, "must be the Controller In Charge"
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
157 ret = {}
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
158 if addresses is None:
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
159 for add, mock in self._devices.items():
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
160 ret[add] = mock._idnstr
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
161 return ret
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
162 return {}
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
163
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
164 def reset(self):
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
165 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
166 Perform a reset of the USB device
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
167
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
168 """
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
169 pass
b8eec4f9db52 many improvements:
David Douard <david.douard@logilab.fr>
parents:
diff changeset
170

mercurial