From bf339f6fac9aaf02ad131d770d3fd7d9ee3fc573 Mon Sep 17 00:00:00 2001 From: Sindre Hansen Date: Thu, 19 Jan 2023 09:24:15 +0100 Subject: [PATCH 1/5] Add hotfix for connecting to Blunux >3.0 Starting with Blunux 3.0 the drone requires a TCP connection before starting the service responsible for publishing UDP messages. --- blueye/sdk/drone.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/blueye/sdk/drone.py b/blueye/sdk/drone.py index 84e3ba9f..1ecc7d59 100755 --- a/blueye/sdk/drone.py +++ b/blueye/sdk/drone.py @@ -253,8 +253,14 @@ def connect(self, timeout: float = None): - *timeout* (float): Seconds to wait for connection """ - self._wait_for_udp_communication(timeout, self._ip) self._update_drone_info() + if version.parse(self.software_version_short) > version.parse("3.0"): + # Blunux 3.0 requires a TCP message before enabling UDP communication + temp_tcp_client = TcpClient() + temp_tcp_client.connect() + temp_tcp_client.stop() + temp_tcp_client._sock.close() + self._wait_for_udp_communication(timeout, self._ip) self._start_state_watcher_thread() if self._slave_mode_enabled: # No need to touch the TCP stuff if we're in slave mode so we return early From c835f45c945065d154ceab2bc180acf70a3759f8 Mon Sep 17 00:00:00 2001 From: Sindre Hansen Date: Thu, 19 Jan 2023 09:27:48 +0100 Subject: [PATCH 2/5] Bump patch version --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 74db1562..cc3d5876 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "blueye.sdk" -version = "1.0.1" +version = "1.0.2" description = "SDK for controlling a Blueye underwater drone" authors = ["Sindre Hansen ", "Johannes Schrimpf ", From 322df520a260d71b43fa165e920af6779e47b979 Mon Sep 17 00:00:00 2001 From: Sindre Hansen Date: Thu, 19 Jan 2023 11:52:14 +0100 Subject: [PATCH 3/5] Fix import order --- blueye/sdk/drone.py | 6 +++++- tests/test_sdk.py | 5 +++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/blueye/sdk/drone.py b/blueye/sdk/drone.py index 1ecc7d59..96411878 100755 --- a/blueye/sdk/drone.py +++ b/blueye/sdk/drone.py @@ -7,7 +7,11 @@ import requests from blueye.protocol import TcpClient, UdpClient -from blueye.protocol.exceptions import MismatchedReply, NoConnectionToDrone, ResponseTimeout +from blueye.protocol.exceptions import ( + MismatchedReply, + NoConnectionToDrone, + ResponseTimeout, +) from packaging import version from .camera import Camera diff --git a/tests/test_sdk.py b/tests/test_sdk.py index 2c6d8a8a..3edaf184 100644 --- a/tests/test_sdk.py +++ b/tests/test_sdk.py @@ -1,12 +1,13 @@ from time import time from unittest.mock import PropertyMock -import blueye.sdk import pytest import requests -from blueye.sdk import Drone from freezegun import freeze_time +import blueye.sdk +from blueye.sdk import Drone + class TestLights: def test_lights_returns_value(self, mocked_drone): From ac41591a521d0e088e2d1e2de2ad883ec58b54cc Mon Sep 17 00:00:00 2001 From: Sindre Hansen Date: Thu, 19 Jan 2023 12:24:07 +0100 Subject: [PATCH 4/5] Fix version conditional --- blueye/sdk/drone.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/blueye/sdk/drone.py b/blueye/sdk/drone.py index 96411878..eee8e5fb 100755 --- a/blueye/sdk/drone.py +++ b/blueye/sdk/drone.py @@ -258,7 +258,7 @@ def connect(self, timeout: float = None): """ self._update_drone_info() - if version.parse(self.software_version_short) > version.parse("3.0"): + if version.parse(self.software_version_short) >= version.parse("3.0"): # Blunux 3.0 requires a TCP message before enabling UDP communication temp_tcp_client = TcpClient() temp_tcp_client.connect() From e79d5d35a23579616b940cf729c7c3bab2d8d514 Mon Sep 17 00:00:00 2001 From: Sindre Hansen Date: Thu, 19 Jan 2023 12:26:54 +0100 Subject: [PATCH 5/5] Create helper function for temp TCP connection To more easily be able to write a test for it --- blueye/sdk/drone.py | 12 ++++++++---- tests/test_sdk.py | 11 ++++++++++- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/blueye/sdk/drone.py b/blueye/sdk/drone.py index eee8e5fb..6787604d 100755 --- a/blueye/sdk/drone.py +++ b/blueye/sdk/drone.py @@ -248,6 +248,12 @@ def _start_state_watcher_thread(self): # Ignore multiple starts pass + def _create_temporary_tcp_client(self): + temp_tcp_client = TcpClient() + temp_tcp_client.connect() + temp_tcp_client.stop() + temp_tcp_client._sock.close() + def connect(self, timeout: float = None): """Start receiving telemetry info from the drone, and publishing watchdog messages @@ -260,10 +266,8 @@ def connect(self, timeout: float = None): self._update_drone_info() if version.parse(self.software_version_short) >= version.parse("3.0"): # Blunux 3.0 requires a TCP message before enabling UDP communication - temp_tcp_client = TcpClient() - temp_tcp_client.connect() - temp_tcp_client.stop() - temp_tcp_client._sock.close() + self._create_temporary_tcp_client() + self._wait_for_udp_communication(timeout, self._ip) self._start_state_watcher_thread() if self._slave_mode_enabled: diff --git a/tests/test_sdk.py b/tests/test_sdk.py index 3edaf184..77906956 100644 --- a/tests/test_sdk.py +++ b/tests/test_sdk.py @@ -1,5 +1,5 @@ from time import time -from unittest.mock import PropertyMock +from unittest.mock import Mock, PropertyMock import pytest import requests @@ -93,6 +93,15 @@ def test_verify_sw_version_raises_connection_error_when_not_connected(mocked_dro mocked_drone._verify_required_blunux_version("1.4.7") +def test_if_blunux_newer_than_3_create_tcp_first(mocked_drone: Drone): + mocked_drone.software_version_short = "3.0" + mocked_drone._create_temporary_tcp_client = Mock() + mocked_drone._update_drone_info = Mock() # To avoid overwriting the version number + mocked_drone.connect() + + mocked_drone._create_temporary_tcp_client.assert_called_once() + + def test_depth_reading(mocked_drone): depth = 10000 mocked_drone._state_watcher._general_state = {"depth": depth}