pygpibtoolkit/prologix_emulator.py

Sun, 03 Jun 2018 18:04:43 +0200

author
David Douard <david.douard@logilab.fr>
date
Sun, 03 Jun 2018 18:04:43 +0200
changeset 105
89123c2af2fd
parent 102
91713944ebb0
permissions
-rw-r--r--

[prologix] small fix in the prologix emulator

101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
1 # This program is free software; you can redistribute it and/or modify it under
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
2 # the terms of the GNU General Public License as published by the Free Software
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
3 # Foundation; either version 2 of the License, or (at your option) any later
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
4 # version.
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
5 #
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
6 # This program is distributed in the hope that it will be useful, but WITHOUT
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
7 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
8 # FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
9 #
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
10 # You should have received a copy of the GNU General Public License along with
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
11 # this program; if not, write to the Free Software Foundation, Inc.,
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
12 # 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
13 """Copyright (c) 2007-2018 David Douard (Paris, FRANCE).
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
14 https://bitbucket.org/dddouard/pygpibtoolkit -- mailto:david.douard@sdfa3.org
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
15
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
16 prologix emulator
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
17 =================
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
18
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
19 Base class for writing an emulator of a Prologix dongle.
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
20
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
21 This aims at writing tests and virtual devices to check tools.
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
22
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
23 """
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
24
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
25 import os
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
26 import glob
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
27 import serial
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
28 import time
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
29 import subprocess
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
30 import tempfile
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
31 import threading
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
32 from queue import Queue
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
33 import logging
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
34 from logging import debug, info, warning, error # noqa
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
35 import random
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
36
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
37
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
38 logging.basicConfig()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
39 logger = logging.getLogger(__name__)
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
40
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
41 SOCAT = '/usr/bin/socat'
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
42
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
43
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
44 class PrologixEmulator:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
45 params = (
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
46 ('mode', 1),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
47 ('addr', 5),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
48 ('auto', 0),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
49 ('eoi', 0),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
50 ('eos', 0),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
51 ('eot_enable', 0),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
52 ('eot_char', 0),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
53 ('read_tmo_ms', 1),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
54 ('savecfg', 1),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
55 )
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
56 params_constraints = (
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
57 ('mode', [0, 1]),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
58 ('auto', [0, 1]),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
59 ('eoi', [0, 1]),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
60 ('eos', [0, 1]),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
61 ('eot_enable', [0, 1]),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
62 ('eot_char', [0, 1]),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
63 ('read_tmo_ms', (1, 3000)),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
64 ('savecfg', [0, 1]),
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
65 )
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
66
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
67 def __init__(self):
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
68 """
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
69 """
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
70 self.tmpdir = tempfile.mkdtemp()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
71 busside = os.path.join(self.tmpdir, 'bus')
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
72 serialside = os.path.join(self.tmpdir, 'serial')
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
73 self.socatp = subprocess.Popen([
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
74 SOCAT,
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
75 'PTY,raw,echo=0,link={}'.format(busside),
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
76 'PTY,raw,echo=0,link={}'.format(serialside)])
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
77 self.serialurl = serialside
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
78
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
79 time.sleep(0.1) # wait a bit for socat to be started
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
80 self.cnx = serial.Serial(busside, timeout=0)
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
81 self.devices = {}
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
82
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
83 self.running = True
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
84 self.output = Queue()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
85 self.mainloop = threading.Thread(target=self.run)
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
86 self.reset()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
87
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
88 self.mainloop.start()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
89
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
90 def attach_device(self, addr, device):
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
91 self.devices[addr] = device
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
92
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
93 def reset(self):
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
94 self.output.queue.clear() # should probably protect this...
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
95 self.params = dict(self.__class__.params)
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
96
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
97 def close(self):
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
98 self.running = False
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
99 self.socatp.kill()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
100 self.socatp.wait()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
101 self.mainloop.join()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
102
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
103 def run(self):
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
104 while self.running:
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
105 data = self.cnx.readline().strip()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
106 if data:
105
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
107 for row in data.splitlines():
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
108 if row[:2] == b'++':
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
109 self.parse_cmd(row)
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
110 else:
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
111 self.parse_data(row)
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
112 elif not self.output.empty():
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
113 data = self.output.get()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
114 logger.info('Sending %r' % data)
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
115 self.cnx.write(data)
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
116 else:
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
117 time.sleep(0.01)
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
118
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
119 def send(self, data):
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
120 for row in data.splitlines():
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
121 self.output.put(row)
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
122
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
123 def parse_data(self, row):
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
124 logger.info('Received %r' % row)
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
125 addr = self.params['addr']
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
126 if addr in self.devices:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
127 device = self.devices[addr]
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
128 device.parse(row)
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
129
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
130 def parse_cmd(self, row):
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
131 logger.info('Received CMD %r' % row)
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
132 cmd = row.decode().split()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
133 args = cmd[1:]
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
134 cmd = cmd[0][2:]
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
135 if hasattr(self, 'parse_cmd_{}'.format(cmd)):
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
136 return getattr(self, 'parse_cmd_{}'.format(cmd))(args)
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
137 elif cmd in self.params:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
138 self.parse_generic_cmd(cmd, args)
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
139 else:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
140 raise Exception()
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
141
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
142 def parse_generic_cmd(self, cmd, args):
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
143 if not args:
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
144 self.output.put(('%s\r\n' % self.params[cmd]).encode())
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
145 else:
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
146 try:
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
147 if len(args) == 1:
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
148 value = int(args[0])
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
149 if cmd in self.params_constraints:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
150 cstr = self.params_constraints[cmd]
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
151 if isinstance(cstr, list):
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
152 assert value in cstr
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
153 elif isinstance(cstr, tuple):
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
154 assert cstr[0] <= value <= cstr[1]
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
155 else:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
156 raise Exception()
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
157 logger.info('Set %s=%s' % (cmd, value))
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
158 self.params[cmd] = value
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
159 else:
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
160 raise Exception()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
161 except:
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
162 self.output.put(b'Error\r\n')
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
163
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
164 def parse_cmd_addr(self, args):
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
165 if not args:
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
166 addrs = self.params['addr']
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
167 if isinstance(addrs, int):
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
168 addrs = [addrs, None]
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
169 addrs = ' '.join(str(x) for x in addrs if x is not None)
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
170 self.output.put(('%s\r\n' % addrs).encode())
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
171 else:
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
172 try:
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
173 if len(args) in (1, 2):
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
174 values = [int(x) for x in args]
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
175 if len(values) == 1:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
176 values.append(None)
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
177 pad, sad = values
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
178 assert 0 <= pad <= 30
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
179 if sad:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
180 assert 96 <= sad <= 126
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
181 logger.info('Set addr=%s' % (values))
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
182 if sad:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
183 self.params['addr'] = values
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
184 else:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
185 self.params['addr'] = pad
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
186 else:
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
187 raise Exception()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
188 except:
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
189 self.output.put(b'Error\r\n')
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
190
105
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
191 def parse_cmd_ifc(self, args):
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
192 pass
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
193
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
194
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
195 class HPGLPlotingDevice:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
196 def __init__(self, emulator, address=5):
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
197 self.plotter_address = address
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
198 self.filenames = glob.glob('examples/hpgl_plots/*.plt')
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
199 self.emulator = emulator
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
200
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
201 def plot(self, fname=None):
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
202 if fname is None:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
203 fname = random.choice(self.filenames)
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
204 with open(fname) as fobj:
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
205 ret = fobj.read().strip()
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
206 if ret:
105
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
207 self.emulator.send(ret.encode())
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
208
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
209
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
210 def main():
102
91713944ebb0 [prologix] implement more prologix commands and add API to register emulated devices
David Douard <david.douard@logilab.fr>
parents: 101
diff changeset
211 emul = PrologixEmulator()
105
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
212 device = HPGLPlotingDevice(emul)
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
213 emul.attach_device(10, device)
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
214 from pygpibtoolkit.plotter.gpib_plotter import GPIBplotter
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
215 plotter = GPIBplotter(
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
216 device=emul.serialurl,
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
217 address=5,
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
218 timeout=0.06)
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
219 device.plot()
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
220
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
221 while True:
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
222 plot = plotter.load_plot()
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
223 if plot:
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
224 print('PLOT')
89123c2af2fd [prologix] small fix in the prologix emulator
David Douard <david.douard@logilab.fr>
parents: 102
diff changeset
225 break
101
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
226
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
227 emul.close()
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
228
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
229
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
230 if __name__ == '__main__':
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
231 logger.setLevel(logging.DEBUG)
975576e55563 [prologix] beginning of a proper prologix dongle emulator
David Douard <david.douard@logilab.fr>
parents:
diff changeset
232 main()

mercurial