From 0f320576712f07d2115f4bd925bd098aa5ccfea8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=A5=E9=A2=A8=E5=90=B9=E5=90=B9=E5=90=B9=E9=A2=A8?= <111693063+magexiao6@users.noreply.github.com> Date: Mon, 1 Dec 2025 11:58:06 +0800 Subject: [PATCH 1/2] Update app.py --- TUSS4470_shield_002/web/app.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TUSS4470_shield_002/web/app.py b/TUSS4470_shield_002/web/app.py index 21416d9..df11bfd 100644 --- a/TUSS4470_shield_002/web/app.py +++ b/TUSS4470_shield_002/web/app.py @@ -57,8 +57,8 @@ async def lifespan(app: FastAPI): async def update_settings(new_settings: Settings): settings = Settings.model_validate( { - **app.state.settings.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True), - **new_settings.model_dump(exclude_none=True, exclude_unset=True, exclude_defaults=True), + **app.state.settings.model_dump(exclude_none=True, exclude_unset=True), + **new_settings.model_dump(exclude_none=True, exclude_unset=True), } ) From 7f1acdde90d47e13f5df583f3319f2c2fe89fd91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=A5=E9=A2=A8=E5=90=B9=E5=90=B9=E5=90=B9=E9=A2=A8?= <111693063+magexiao6@users.noreply.github.com> Date: Mon, 1 Dec 2025 12:00:23 +0800 Subject: [PATCH 2/2] Enhance update_settings to manage dynamic settings Refactor update_settings to handle dynamic field changes and determine if a restart is needed based on new settings. --- TUSS4470_shield_002/web/echo.py | 35 +++++++++++++++++++++++++++++++-- 1 file changed, 33 insertions(+), 2 deletions(-) diff --git a/TUSS4470_shield_002/web/echo.py b/TUSS4470_shield_002/web/echo.py index a9faded..564d3ff 100644 --- a/TUSS4470_shield_002/web/echo.py +++ b/TUSS4470_shield_002/web/echo.py @@ -165,8 +165,39 @@ def __init__( def update_settings(self, new_settings): log.info("EchoReader updating settings...") - self.settings = new_settings - self._restart_event.set() # Signal restart + restart_fields = { + "connection_type", + "udp_port", + "serial_port", + "baud_rate", + "num_samples", + } + + field_names = new_settings.model_fields.keys() + new_values = {key: getattr(new_settings, key) for key in field_names} + + restart_needed = False + if self.settings is None: + restart_needed = True + changed_fields = restart_fields + else: + changed_fields = { + key for key, value in new_values.items() if getattr(self.settings, key) != value + } + restart_needed = bool(restart_fields & changed_fields) + + if self.settings is None: + self.settings = new_settings + else: + for key, value in new_values.items(): + setattr(self.settings, key, value) + + if restart_needed: + log.info( + "Restart requested due to changes in: %s", + ", ".join(sorted(restart_fields & changed_fields)), + ) + self._restart_event.set() # Signal restart def __enter__(self): self._task = asyncio.create_task(self.run_forever())