From d4f46b994b8a49499c0f420bec8a51091059dbe5 Mon Sep 17 00:00:00 2001 From: atse Date: Tue, 9 Jul 2024 13:04:19 +0800 Subject: [PATCH] Fix Autotuner state for forceful disconnect --- pytec/pytec/gui/model/thermostat.py | 6 ++++++ pytec/tec_qt.py | 12 +++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/pytec/pytec/gui/model/thermostat.py b/pytec/pytec/gui/model/thermostat.py index 073ab99..38a832c 100644 --- a/pytec/pytec/gui/model/thermostat.py +++ b/pytec/pytec/gui/model/thermostat.py @@ -35,6 +35,7 @@ class Thermostat(QObject, metaclass=PropertyMeta): self._report_mode_task = None self._poll_for_report = True self._update_params_task = None + self.connection_errored = False super().__init__(parent) async def run(self): @@ -51,6 +52,10 @@ class Thermostat(QObject, metaclass=PropertyMeta): self._update_params_task = asyncio.create_task(self.update_params()) await asyncio.sleep(self._update_s) + @pyqtSlot() + def timed_out(self): + self.connection_errored = True + async def get_hw_rev(self): self.hw_rev = await self._client.hw_rev() return self.hw_rev @@ -101,6 +106,7 @@ class Thermostat(QObject, metaclass=PropertyMeta): async def end_session(self): await self._client.end_session() + self.connection_errored = False async def set_ipv4(self, ipv4): await self._client.set_param("ipv4", ipv4) diff --git a/pytec/tec_qt.py b/pytec/tec_qt.py index 58a03a4..96665af 100755 --- a/pytec/tec_qt.py +++ b/pytec/tec_qt.py @@ -78,6 +78,9 @@ class MainWindow(QtWidgets.QMainWindow): self, self.client, self.report_refresh_spin.value() ) + self.client.connection_error.connect(self.thermostat.timed_out) + self.client.connection_error.connect(self.bail) + self.autotuners = PIDAutoTuner(self, self.client, 2) def get_ctrl_panel_config(args): @@ -190,9 +193,12 @@ class MainWindow(QtWidgets.QMainWindow): self.thermostat_ctrl_menu.fan_pwm_warning.setToolTip("") self.clear_graphs() self.report_box.setChecked(False) - if not Thermostat.connecting or Thermostat.connected: - for ch in range(self.NUM_CHANNELS): - if self.autotuners.get_state(ch) != PIDAutotuneState.STATE_OFF: + for ch in range(self.NUM_CHANNELS): + if self.autotuners.get_state(ch) != PIDAutotuneState.STATE_OFF: + if self.thermostat.connection_errored: + # Don't send any commands, just reset local state + self.autotuners.autotuners[ch].setOff() + else: await self.autotuners.stop_pid_from_running(ch) await self.thermostat.set_report_mode(False) self.thermostat.stop_watching()