Sun, 03 Jun 2018 18:04:43 +0200
[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() |