From 93dbfda89dfccb13135347f09d787673fb04f544 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 11:23:32 +0000 Subject: [PATCH 1/2] Initial plan From 0be0bde5bd7fc160aae3ce996dcf0309ec8c2701 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 19 Feb 2026 11:27:40 +0000 Subject: [PATCH 2/2] Fix EchoReader to retry with backoff on exceptions instead of blocking Co-authored-by: JohnCHarrington <1857365+JohnCHarrington@users.noreply.github.com> --- python/src/open_echo/web.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/python/src/open_echo/web.py b/python/src/open_echo/web.py index 921fc89..9a7ac06 100644 --- a/python/src/open_echo/web.py +++ b/python/src/open_echo/web.py @@ -85,6 +85,7 @@ async def process_echo(self, echo: EchoPacket): async def run_forever(self): """Continuously read serial data and emit processed arrays. Supports live settings update and restart.""" + retry_delay = 1 # seconds; doubles on each consecutive failure up to 30s max while True: if self.settings is None: log.warning("Settings not initialized, waiting...") @@ -99,12 +100,15 @@ async def run_forever(self): async for pkt in reader: await self.process_echo(pkt) if self._restart_event.is_set(): - print("Restart event set, breaking loop") + log.info("Restart event set, breaking loop") break + retry_delay = 1 # reset backoff on clean exit + await self._restart_event.wait() except Exception as e: log.error(f"❌ Error in EchoReader: {e}", exc_info=e) - - await self._restart_event.wait() + log.info(f"Retrying in {retry_delay}s...") + await asyncio.sleep(retry_delay) + retry_delay = min(retry_delay * 2, 30) connection_manager = ConnectionManager()