From f4d8c010240b79fb737ecdbea7ed05d619c29dd7 Mon Sep 17 00:00:00 2001 From: Andrew Kay Date: Wed, 10 Mar 2021 18:00:32 -0600 Subject: [PATCH] Support new interface reset response --- pycoax/coax/serial_interface.py | 17 ++++++++++++----- pycoax/examples/01_reset.py | 5 +++-- pycoax/examples/common.py | 5 +++-- pycoax/tests/test_serial_interface.py | 22 +++++++++++++++++++--- 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/pycoax/coax/serial_interface.py b/pycoax/coax/serial_interface.py index 6fe7c66..f828ae8 100644 --- a/pycoax/coax/serial_interface.py +++ b/pycoax/coax/serial_interface.py @@ -19,6 +19,9 @@ class SerialInterface(Interface): self.slip_serial = SlipSerial(self.serial) + self.legacy_firmware_detected = None + self.legacy_firmware_version = None + def reset(self): original_serial_timeout = self.serial.timeout @@ -38,13 +41,17 @@ class SerialInterface(Interface): if message[0] != 0x01: raise _convert_error(message) - if len(message) != 4: + if message[1:] == b'\x32\x70': + self.legacy_firmware_detected = False + self.legacy_firmware_version = None + elif len(message) == 4: + (major, minor, patch) = struct.unpack('BBB', message[1:]) + + self.legacy_firmware_detected = True + self.legacy_firmware_version = '{}.{}.{}'.format(major, minor, patch) + else: raise InterfaceError(f'Invalid reset response: {message}') - (major, minor, patch) = struct.unpack('BBB', message[1:]) - - return '{}.{}.{}'.format(major, minor, patch) - def transmit_receive(self, transmit_words, transmit_repeat_count=None, transmit_repeat_offset=1, receive_length=None, receive_timeout=None): diff --git a/pycoax/examples/01_reset.py b/pycoax/examples/01_reset.py index 45933f4..0d023b1 100755 --- a/pycoax/examples/01_reset.py +++ b/pycoax/examples/01_reset.py @@ -7,6 +7,7 @@ with create_serial() as serial: print('Resetting interface...') - version = interface.reset() + interface.reset() - print(f'Firmware version is {version}') + if interface.legacy_firmware_detected: + print(f'Firmware version is {interface.legacy_firmware_version}') diff --git a/pycoax/examples/common.py b/pycoax/examples/common.py index 68d4f6f..6ef91f9 100644 --- a/pycoax/examples/common.py +++ b/pycoax/examples/common.py @@ -28,9 +28,10 @@ def create_interface(serial, reset=True, poll_flush=True): if reset: print('Resetting interface...') - version = interface.reset() + interface.reset() - print(f'Firmware version is {version}') + if interface.legacy_firmware_detected: + print(f'Firmware version is {interface.legacy_firmware_version}') if poll_flush: print('POLLing...') diff --git a/pycoax/tests/test_serial_interface.py b/pycoax/tests/test_serial_interface.py index dbb7a87..042f6d7 100644 --- a/pycoax/tests/test_serial_interface.py +++ b/pycoax/tests/test_serial_interface.py @@ -15,7 +15,7 @@ class SerialInterfaceResetTestCase(unittest.TestCase): self.interface = SerialInterface(self.serial) self.interface._write_message = Mock() - self.interface._read_message = Mock(return_value=bytes.fromhex('01 01 02 03')) + self.interface._read_message = Mock(return_value=bytes.fromhex('01 32 70')) def test_message_is_sent(self): # Act @@ -24,8 +24,24 @@ class SerialInterfaceResetTestCase(unittest.TestCase): # Assert self.interface._write_message.assert_called_with(bytes.fromhex('01')) - def test_version_is_formatted_correctly(self): - self.assertEqual(self.interface.reset(), '1.2.3') + def test_non_legacy_response_is_handled_correctly(self): + # Act + self.interface.reset() + + # Assert + self.assertFalse(self.interface.legacy_firmware_detected) + self.assertIsNone(self.interface.legacy_firmware_version) + + def test_legacy_response_is_handled_correctly(self): + # Arrange + self.interface._read_message = Mock(return_value=bytes.fromhex('01 01 02 03')) + + # Act + self.interface.reset() + + # Assert + self.assertTrue(self.interface.legacy_firmware_detected) + self.assertEqual(self.interface.legacy_firmware_version, '1.2.3') def test_timeout_is_restored_after_reset(self): # Arrange