Skip to content

Commit

Permalink
Added open() and close() functions for more flexibility.
Browse files Browse the repository at this point in the history
  • Loading branch information
jfjlaros committed Feb 10, 2019
1 parent 657c2dc commit 8beb351
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 24 deletions.
15 changes: 7 additions & 8 deletions simple_rpc/cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,9 @@ def rpc_list(handle, device, baudrate, wait):
:arg int baudrate: Baud rate.
:arg int wait: Time in seconds before communication starts.
"""
interface = Interface(device, baudrate, wait)

for method in interface.methods.values():
handle.write(_describe_method(method) + '\n\n\n')
with Interface(device, baudrate, wait) as interface:
for method in interface.methods.values():
handle.write(_describe_method(method) + '\n\n\n')


def rpc_call(handle, device, baudrate, wait, name, args):
Expand All @@ -62,11 +61,11 @@ def rpc_call(handle, device, baudrate, wait, name, args):
:arg str name: Method name.
:arg list args: Method parameters.
"""
interface = Interface(device, baudrate, wait)
with Interface(device, baudrate, wait) as interface:
result = interface.call_method(name, *args)

result = interface.call_method(name, *args)
if result != None:
handle.write('{}\n'.format(result))
if result != None:
handle.write('{}\n'.format(result))


def main():
Expand Down
69 changes: 54 additions & 15 deletions simple_rpc/simple_rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,29 +117,28 @@ def _parse_line(index, line):


class Interface(object):
def __init__(self, device, baudrate=9600, wait=1):
def __init__(self, device, baudrate=9600, wait=1, autoconnect=True):
"""Initialise the class.
:arg str device: Serial device name.
:arg int baudrate: Baud rate.
:arg int wait: Time in seconds before communication starts.
:arg bool autoconnect: Automatically connect.
"""
try:
self._connection = Serial(device, baudrate)
except SerialException as error:
raise IOError(error.strerror.split(':')[0])
sleep(wait)
self._device = device
self._wait = wait

self.methods = self._get_methods()
for method in self.methods.values():
setattr(
self, method['name'], MethodType(_make_function(method), self))
self._connection = Serial(baudrate=baudrate)
self.methods = {}

device_version = self.call_method('version')
if device_version != _version:
raise ValueError(
'version mismatch (device: {}, client: {})'.format(
device_version, _version))
if autoconnect:
self.open()

def __enter__(self):
return self

def __exit__(self, exc_type, exc_val, exc_tb):
self.close()

def _read_str(self):
"""Read a delimited string from serial.
Expand Down Expand Up @@ -207,6 +206,46 @@ def _get_methods(self):

return methods

def open(self):
"""Connect to serial device."""
if self._connection.isOpen():
return

self._connection.port = self._device
try:
self._connection.open()
except SerialException as error:
raise IOError(error.strerror.split(':')[0])
sleep(self._wait)

self.methods = self._get_methods()
for method in self.methods.values():
setattr(
self, method['name'], MethodType(_make_function(method), self))

device_version = self.call_method('version')
if device_version != _version:
raise ValueError(
'version mismatch (device: {}, client: {})'.format(
device_version, _version))

def close(self):
"""Disconnect from serial device."""
if not self._connection.isOpen():
return

for method in self.methods:
delattr(self, method)

self.methods = {}

if (self._connection):
self._connection.close()

def is_open(self):
return self._connection.isOpen()


def call_method(self, name, *args):
"""Execute a method.
Expand Down
16 changes: 15 additions & 1 deletion tests/test_lib.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,17 @@
from simple_rpc.simple_rpc import _version


_interface = Interface('/dev/ttyACM0')
_interface = Interface('/dev/ttyACM0', autoconnect=False)


class TestLib(object):
def test_open(self):
assert not _interface.is_open()
assert _interface.methods == {}
_interface.open()
assert _interface.is_open()
assert _interface.methods != {}

def test_version(self):
assert _interface.version() == _version

Expand Down Expand Up @@ -49,3 +56,10 @@ def test_doc_3(self):

def test_doc_4(self):
assert _interface.methods['ping']['parameters'][0]['doc'] == 'Value.'

def test_close(self):
assert _interface.is_open()
assert _interface.methods != {}
_interface.close()
assert not _interface.is_open()
assert _interface.methods == {}

0 comments on commit 8beb351

Please sign in to comment.