diff --git a/plin/device.py b/plin/device.py index 392ed89..df5f88b 100644 --- a/plin/device.py +++ b/plin/device.py @@ -41,6 +41,10 @@ PLIOSETLEDSTATE = IOW(ord('u'), 40, PLINUSBLEDState) +class PLINException(Exception): + pass + + class PLIN: def __init__(self, interface: str): self.interface = interface @@ -72,12 +76,13 @@ def start(self, mode: PLINMode, baudrate: int = 19200): self.mode = mode self.baudrate = baudrate - if not self.fd: + if self.fd: + raise PLINException("Already connected to PLIN device!") + else: self.fd = os.open(self.interface, os.O_RDWR) - - self.reset() - buffer = PLINUSBInitHardware(self.baudrate, self.mode, 0) - self._ioctl(PLIOHWINIT, buffer) + self.reset() + buffer = PLINUSBInitHardware(self.baudrate, self.mode, 0) + self._ioctl(PLIOHWINIT, buffer) def stop(self): ''' @@ -85,6 +90,9 @@ def stop(self): ''' if self.fd: os.close(self.fd) + self.fd = None + else: + raise PLINException("Not connected to PLIN device!") def set_frame_entry(self, id: int, diff --git a/tests/integration/test_plin.py b/tests/integration/test_plin.py index c1b71ea..a6a1b70 100644 --- a/tests/integration/test_plin.py +++ b/tests/integration/test_plin.py @@ -3,6 +3,7 @@ from plin.enums import PLINMode, PLINMessageType, PLINFrameDirection, PLINFrameChecksumType from plin.structs import * + @pytest.fixture def plin_interface(): return "/dev/plin0" @@ -47,6 +48,24 @@ def test_start(plin_interface, plin): plin.stop() +def test_start_stop_start(plin_interface, plin): + expected_baudrate = 1000 + expected_mode = PLINMode.SLAVE + + plin.start(mode=expected_mode, baudrate=expected_baudrate) + assert plin.get_baudrate() == expected_baudrate + assert plin.get_mode() == expected_mode + plin.stop() + + expected_baudrate = 19200 + expected_mode = PLINMode.MASTER + + plin.start(mode=expected_mode, baudrate=expected_baudrate) + assert plin.get_baudrate() == expected_baudrate + assert plin.get_mode() == expected_mode + plin.stop() + + def test_read_nonblocking(plin_master_19200): assert None == plin_master_19200.read(block=False)