|
35 | 35 | _INITIAL_REFRESH_MAX_RETRY_DELAY_SECONDS = 60.0 |
36 | 36 | _CAMERA_STREAM_READ_TIMEOUT_SECONDS = 30.0 |
37 | 37 | _CAMERA_RECONNECT_DELAY_SECONDS = 2.0 |
38 | | -_NAV_MAP_WAIT_TIMEOUT_SECONDS = 1.0 |
39 | | -_NAV_MAP_RECONNECT_DELAY_SECONDS = 2.0 |
40 | | -_NAV_MAP_FEED_FREQUENCY_HZ = 2.0 |
41 | 38 | _AUTH_BACKOFF_BASE_DELAY_SECONDS = 15.0 |
42 | 39 | _AUTH_BACKOFF_MAX_DELAY_SECONDS = 300.0 |
43 | 40 | _APP_INTENT_RPC_PATH = "/Anki.Vector.external_interface.ExternalInterface/AppIntent" |
@@ -97,25 +94,19 @@ def __init__(self, hass: HomeAssistant, entry: ConfigEntry) -> None: |
97 | 94 | self.lift_height_mm: float | None = None |
98 | 95 | self.camera_frame: bytes | None = None |
99 | 96 | self.camera_frame_updated_monotonic: float | None = None |
100 | | - self.nav_map_frame: bytes | None = None |
101 | | - self.nav_map_frame_updated_monotonic: float | None = None |
102 | 97 | self._client: Any | None = None |
103 | 98 | self._robot_config: Any | None = None |
104 | 99 | self._pyddlvector: Any | None = None |
105 | 100 | self._messaging: Any | None = None |
106 | | - self._latest_robot_state: Any | None = None |
107 | 101 | self._activity_tracker: Any | None = None |
108 | 102 | self._telemetry_filter: Any | None = None |
109 | 103 | self._event_listener_task: asyncio.Task[None] | None = None |
110 | 104 | self._camera_stream_task: asyncio.Task[None] | None = None |
111 | | - self._nav_map_stream_task: asyncio.Task[None] | None = None |
112 | 105 | self._wake_enable_stream_task: asyncio.Task[None] | None = None |
113 | 106 | self._wake_camera_restart_task: asyncio.Task[None] | None = None |
114 | 107 | self._camera_stream_lock = asyncio.Lock() |
115 | | - self._nav_map_stream_lock = asyncio.Lock() |
116 | 108 | self._image_stream_enable_lock = asyncio.Lock() |
117 | 109 | self._camera_frame_event = asyncio.Event() |
118 | | - self._nav_map_frame_event = asyncio.Event() |
119 | 110 | self._settings_lock = asyncio.Lock() |
120 | 111 | self._auth_backoff_delay_seconds = _AUTH_BACKOFF_BASE_DELAY_SECONDS |
121 | 112 | self._auth_backoff_lock = asyncio.Lock() |
@@ -266,15 +257,6 @@ async def async_shutdown(self) -> None: |
266 | 257 | finally: |
267 | 258 | self._camera_stream_task = None |
268 | 259 |
|
269 | | - if self._nav_map_stream_task is not None: |
270 | | - self._nav_map_stream_task.cancel() |
271 | | - try: |
272 | | - await self._nav_map_stream_task |
273 | | - except asyncio.CancelledError: |
274 | | - pass |
275 | | - finally: |
276 | | - self._nav_map_stream_task = None |
277 | | - |
278 | 260 | if self._wake_enable_stream_task is not None: |
279 | 261 | self._wake_enable_stream_task.cancel() |
280 | 262 | try: |
@@ -403,7 +385,6 @@ async def _async_event_listener_loop(self) -> None: |
403 | 385 | has_changes = False |
404 | 386 | if event_type == "robot_state": |
405 | 387 | robot_state = event.robot_state |
406 | | - self._latest_robot_state = robot_state |
407 | 388 | previous_activity = self.current_activity |
408 | 389 | if self._activity_tracker is not None: |
409 | 390 | next_activity = _normalize_activity_state( |
@@ -821,95 +802,6 @@ async def async_get_latest_camera_frame( |
821 | 802 |
|
822 | 803 | return self.camera_frame |
823 | 804 |
|
824 | | - async def async_start_nav_map_stream(self) -> None: |
825 | | - """Ensure persistent nav map stream task is running.""" |
826 | | - async with self._nav_map_stream_lock: |
827 | | - if ( |
828 | | - self._nav_map_stream_task is not None |
829 | | - and not self._nav_map_stream_task.done() |
830 | | - ): |
831 | | - return |
832 | | - self._nav_map_stream_task = self.hass.async_create_background_task( |
833 | | - self._async_nav_map_stream_loop(), |
834 | | - name=f"vector_nav_map_stream_{self.entry.entry_id}", |
835 | | - ) |
836 | | - |
837 | | - async def async_get_latest_nav_map_frame( |
838 | | - self, |
839 | | - *, |
840 | | - wait_timeout: float = _NAV_MAP_WAIT_TIMEOUT_SECONDS, |
841 | | - ) -> bytes | None: |
842 | | - """Return latest nav map PNG frame, optionally waiting for first frame.""" |
843 | | - await self.async_start_nav_map_stream() |
844 | | - |
845 | | - if self.nav_map_frame is not None: |
846 | | - return self.nav_map_frame |
847 | | - |
848 | | - try: |
849 | | - await asyncio.wait_for( |
850 | | - self._nav_map_frame_event.wait(), timeout=wait_timeout |
851 | | - ) |
852 | | - except TimeoutError: |
853 | | - return None |
854 | | - |
855 | | - return self.nav_map_frame |
856 | | - |
857 | | - def _nav_map_robot_pose_provider(self) -> Any | None: |
858 | | - """Return current robot pose in nav-map coordinates when available.""" |
859 | | - if self._pyddlvector is None: |
860 | | - return None |
861 | | - if not hasattr(self._pyddlvector, "nav_map_robot_pose_from_state"): |
862 | | - return None |
863 | | - robot_state = self._latest_robot_state |
864 | | - if robot_state is None: |
865 | | - return None |
866 | | - return self._pyddlvector.nav_map_robot_pose_from_state(robot_state) |
867 | | - |
868 | | - async def _async_nav_map_stream_loop(self) -> None: |
869 | | - """Keep nav-map feed stream and cache latest rendered PNG frame.""" |
870 | | - while True: |
871 | | - try: |
872 | | - client, _ = await self._async_get_client() |
873 | | - pyddlvector, _ = await self._async_get_modules() |
874 | | - if not hasattr(pyddlvector, "iter_nav_map_frames"): |
875 | | - _LOGGER.debug( |
876 | | - "pyddlvector does not provide iter_nav_map_frames; nav map camera disabled" |
877 | | - ) |
878 | | - return |
879 | | - |
880 | | - async for frame in pyddlvector.iter_nav_map_frames( |
881 | | - client, |
882 | | - frequency=_NAV_MAP_FEED_FREQUENCY_HZ, |
883 | | - read_timeout=_CAMERA_STREAM_READ_TIMEOUT_SECONDS, |
884 | | - reconnect_delay=_NAV_MAP_RECONNECT_DELAY_SECONDS, |
885 | | - robot_pose_provider=self._nav_map_robot_pose_provider, |
886 | | - ): |
887 | | - frame_bytes = bytes(getattr(frame, "data", b"")) |
888 | | - if not frame_bytes: |
889 | | - continue |
890 | | - self.nav_map_frame = frame_bytes |
891 | | - self.nav_map_frame_updated_monotonic = time.monotonic() |
892 | | - self._nav_map_frame_event.set() |
893 | | - except asyncio.CancelledError: |
894 | | - raise |
895 | | - except Exception as err: |
896 | | - if _is_unauthenticated_error(err): |
897 | | - await self._async_handle_auth_failure("nav map stream", err) |
898 | | - continue |
899 | | - details = str(err).strip() |
900 | | - if details: |
901 | | - _LOGGER.debug("Vector nav map stream interrupted: %s", details) |
902 | | - else: |
903 | | - _LOGGER.debug( |
904 | | - "Vector nav map stream interrupted (%s)", |
905 | | - err.__class__.__name__, |
906 | | - exc_info=True, |
907 | | - ) |
908 | | - await asyncio.sleep(_NAV_MAP_RECONNECT_DELAY_SECONDS) |
909 | | - continue |
910 | | - |
911 | | - await asyncio.sleep(_NAV_MAP_RECONNECT_DELAY_SECONDS) |
912 | | - |
913 | 805 | async def _async_camera_stream_loop(self) -> None: |
914 | 806 | """Keep persistent camera feed stream and cache latest frame.""" |
915 | 807 | while True: |
|
0 commit comments