Skip to content

Commit f6e6f3f

Browse files
committed
Moved all device specific information to one dictionary.
1 parent 5aa73f8 commit f6e6f3f

File tree

4 files changed

+65
-51
lines changed

4 files changed

+65
-51
lines changed

docs/library.rst

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,19 +124,19 @@ Additionally, the ``with`` statement is supported for easy opening and closing.
124124
>>> with Interface('/dev/ttyACM0') as interface:
125125
>>> interface.ping(10)
126126
127-
The class instance has a public member variable named ``methods`` which
128-
contains the definitions of the exported methods.
127+
The class instance has a public member variable named ``device`` which
128+
contains the device definitions and its exported methods.
129129

130130
.. code:: python
131131
132-
>>> list(interface.methods)
132+
>>> list(interface.device['methods'])
133133
['inc', 'set_led']
134134
135135
Example of a method definition.
136136

137137
.. code:: python
138138
139-
>>> interface.methods['inc']
139+
>>> interface.device['methods']['inc']
140140
{
141141
'doc': 'Increment a value.',
142142
'index': 2,
@@ -145,13 +145,13 @@ Example of a method definition.
145145
{
146146
'doc': 'Value.',
147147
'name': 'a',
148-
'fmt': b'h',
148+
'fmt': 'h',
149149
'typename': 'int'
150150
}
151151
],
152152
'return': {
153153
'doc': 'a + 1.',
154-
'fmt': b'h',
154+
'fmt': 'h',
155155
'typename': 'int'}
156156
}
157157

simple_rpc/cli.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ def rpc_list(
6161
"""
6262
with Interface(device, baudrate, wait) as interface:
6363
if not save:
64-
for method in interface.methods.values():
64+
for method in interface.device['methods'].values():
6565
handle.write(_describe_method(method) + '\n\n\n')
6666
else:
6767
interface.save(save)

simple_rpc/simple_rpc.py

Lines changed: 36 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,12 @@ def __init__(
3434

3535
self._connection = serial_for_url(
3636
device, do_not_open=True, baudrate=baudrate)
37-
self._load = load
38-
# TODO: Put all of these in one object.
39-
self._version = (0, 0, 0)
40-
self._endianness = '<'
41-
self._size_t = 'H'
42-
self.methods = {}
37+
self._load = load # TODO: Content checking.
38+
self.device = {
39+
'version': (0, 0, 0),
40+
'endianness': '<',
41+
'size_t': 'H',
42+
'methods': {}}
4343

4444
if autoconnect:
4545
self.open()
@@ -73,7 +73,9 @@ def _write(self: object, obj_type: any, obj: any) -> None:
7373
:arg obj_type: Type of the parameter.
7474
:arg obj: Value of the parameter.
7575
"""
76-
write(self._connection, self._endianness, self._size_t, obj_type, obj)
76+
write(
77+
self._connection, self.device['endianness'], self.device['size_t'],
78+
obj_type, obj)
7779

7880
def _read_byte_string(self: object) -> bytes:
7981
return read_byte_string(self._connection)
@@ -85,7 +87,9 @@ def _read(self: object, obj_type: any) -> any:
8587
8688
:returns: Return value.
8789
"""
88-
return read(self._connection, self._endianness, self._size_t, obj_type)
90+
return read(
91+
self._connection, self.device['endianness'], self.device['size_t'],
92+
obj_type)
8993

9094
def _get_methods(self: object) -> dict:
9195
"""Get remote procedure call methods.
@@ -97,14 +101,15 @@ def _get_methods(self: object) -> dict:
97101
if self._read_byte_string().decode() != _protocol:
98102
raise ValueError('missing protocol header')
99103

100-
self._version = tuple(self._read('B') for _ in range(3))
101-
if self._version[0] != _version[0] or self._version[1] > _version[1]:
104+
version = tuple(self._read('B') for _ in range(3))
105+
if version[0] != _version[0] or version[1] > _version[1]:
102106
raise ValueError(
103107
'version mismatch (device: {}, client: {})'.format(
104-
'.'.join(map(str, self._version)),
108+
'.'.join(map(str, version)),
105109
'.'.join(map(str, _version))))
110+
self.device['version'] = version
106111

107-
self._endianness, self._size_t = (
112+
self.device['endianness'], self.device['size_t'] = (
108113
chr(c) for c in self._read_byte_string())
109114

110115
methods = {}
@@ -126,16 +131,16 @@ def open(self: object) -> None:
126131
if self._load:
127132
self.load()
128133
else:
129-
self.methods = self._get_methods()
130-
for method in self.methods.values():
134+
self.device['methods'] = self._get_methods()
135+
for method in self.device['methods'].values():
131136
setattr(
132137
self, method['name'], MethodType(make_function(method), self))
133138

134139
def close(self: object) -> None:
135140
"""Disconnect from device."""
136-
for method in self.methods:
141+
for method in self.device['methods']:
137142
delattr(self, method)
138-
self.methods.clear()
143+
self.device['methods'].clear()
139144

140145
def call_method(self: object, name: str, *args: list) -> any:
141146
"""Execute a method.
@@ -145,9 +150,9 @@ def call_method(self: object, name: str, *args: list) -> any:
145150
146151
:returns: Return value of the method.
147152
"""
148-
if name not in self.methods:
153+
if name not in self.device['methods']:
149154
raise ValueError('invalid method name: {}'.format(name))
150-
method = self.methods[name]
155+
method = self.device['methods'][name]
151156

152157
parameters = method['parameters']
153158
if len(args) != len(parameters):
@@ -174,21 +179,22 @@ def save(self: object, handle: TextIO) -> None:
174179
:arg handle: Open file handle.
175180
"""
176181
dump(
177-
{
178-
'version': self._version,
179-
'endianness': self._endianness,
180-
'size_t': self._size_t,
181-
'methods': self.methods
182-
},
182+
#{
183+
# 'version': self._version,
184+
# 'endianness': self._endianness,
185+
# 'size_t': self._size_t,
186+
# 'methods': self.methods
187+
#},
188+
self.device,
183189
handle, width=76, default_flow_style=False)
184190

185191
def load(self: object) -> None:
186192
"""Load the interface definition from a file."""
187-
definition = load(self._load)
188-
self._version = definition['version']
189-
self._endianness = definition['endianness']
190-
self._size_t = definition['size_t']
191-
self.methods = definition['methods']
193+
self.device = load(self._load)
194+
#self._version = definition['version']
195+
#self._endianness = definition['endianness']
196+
#self._size_t = definition['size_t']
197+
#self.methods = definition['methods']
192198

193199

194200
class SerialInterface(_Interface):
@@ -225,7 +231,7 @@ def _auto_open_wrapper(
225231

226232
@wraps(_Interface.is_open)
227233
def is_open(self: object) -> bool:
228-
return len(self.methods) > 0
234+
return len(self.device['methods']) > 0
229235

230236
open = _auto_open(_Interface.open)
231237
call_method = _auto_open(_Interface.call_method)

tests/test_device.py

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,53 +9,61 @@
99
class _TestDevice(object):
1010
def test_pre_open(self: object) -> None:
1111
assert not self._interface.is_open()
12-
assert self._interface.methods == {}
12+
assert self._interface.device['methods'] == {}
1313

1414
def test_open(self: object) -> None:
1515
self._interface.open()
1616
assert self._interface.is_open()
17-
assert self._interface.methods != {}
17+
assert self._interface.device['methods'] != {}
1818

1919
def test_version(self: object) -> None:
20-
assert self._interface._version == _version
20+
assert self._interface.device['version'] == _version
2121

2222
def test_ping(self: object) -> None:
2323
assert self._interface.ping(3) == 3
2424

2525
def test_type_1(self: object) -> None:
26-
assert self._interface.methods['ping']['return']['typename'] == 'int'
26+
assert (
27+
self._interface.device['methods']['ping']['return']['typename']
28+
== 'int')
2729

2830
def test_fmt_1(self: object) -> None:
29-
assert self._interface.methods['ping']['return']['fmt'] == 'B'
31+
assert (
32+
self._interface.device['methods']['ping']['return']['fmt'] == 'B')
3033

3134
def test_param_1(self: object) -> None:
3235
assert (
33-
self._interface.methods['ping']['parameters'][0]['typename'] ==
34-
'int')
36+
self._interface.device['methods']['ping']['parameters'][0]['typename']
37+
== 'int')
3538

3639
def test_param_2(self: object) -> None:
37-
assert self._interface.methods['ping']['parameters'][0]['fmt'] == 'B'
40+
assert (
41+
self._interface.device['methods']['ping']['parameters'][0]['fmt']
42+
== 'B')
3843

3944
def test_param_3(self: object) -> None:
4045
assert (
41-
self._interface.methods['ping']['parameters'][0]['name'] == 'data')
46+
self._interface.device['methods']['ping']['parameters'][0]['name']
47+
== 'data')
4248

4349
def test_doc_1(self: object) -> None:
44-
assert self._interface.methods['ping']['doc'] == 'Echo a value.'
50+
assert (
51+
self._interface.device['methods']['ping']['doc']
52+
== 'Echo a value.')
4553

4654
def test_doc_2(self: object) -> None:
4755
assert (
48-
self._interface.methods['ping']['parameters'][0]['doc'] ==
49-
'Value.')
56+
self._interface.device['methods']['ping']['parameters'][0]['doc']
57+
== 'Value.')
5058

5159
def test_close(self: object) -> None:
5260
assert self._interface.is_open()
53-
assert self._interface.methods != {}
61+
assert self._interface.device['methods'] != {}
5462
self._interface.close()
5563

5664
def test_post_close(self: object) -> None:
5765
assert not self._interface.is_open()
58-
assert self._interface.methods == {}
66+
assert self._interface.device['methods'] == {}
5967

6068

6169
@mark.test_device('serial')

0 commit comments

Comments
 (0)