From 26c3d330c4896f255f7465035938239f77abb8a7 Mon Sep 17 00:00:00 2001 From: atse Date: Fri, 23 Aug 2024 11:56:02 +0800 Subject: [PATCH] State dependend UI --- pytec/tec_qt.py | 95 +++++++++++++++++++++++++++---------------------- 1 file changed, 53 insertions(+), 42 deletions(-) diff --git a/pytec/tec_qt.py b/pytec/tec_qt.py index 5c31b51..df7369f 100755 --- a/pytec/tec_qt.py +++ b/pytec/tec_qt.py @@ -7,7 +7,7 @@ from pytec.gui.view.live_plot_view import LiveDataPlotter from pytec.gui.view.ctrl_panel import CtrlPanel from pytec.gui.view.info_box import InfoBox from pytec.gui.model.pid_autotuner import PIDAutoTuner -from pytec.gui.model.thermostat import Thermostat +from pytec.gui.model.thermostat import Thermostat, ThermostatConnectionState import json from autotune import PIDAutotuneState from qasync import asyncSlot, asyncClose @@ -176,37 +176,54 @@ class MainWindow(QtWidgets.QMainWindow): self.channel_graphs.clear_graphs() async def _on_connection_changed(self, result): - self.graph_group.setEnabled(result) - self.report_group.setEnabled(result) - self.thermostat_settings.setEnabled(result) + match result: + case ThermostatConnectionState.CONNECTED: + self.graph_group.setEnabled(True) + self.report_group.setEnabled(True) + self.thermostat_settings.setEnabled(True) - self.conn_menu.host_set_line.setEnabled(not result) - self.conn_menu.port_set_spin.setEnabled(not result) - self.connect_btn.setText("Disconnect" if result else "Connect") - if result: - self.hw_rev_data = await self.thermostat.get_hw_rev() - logging.debug(self.hw_rev_data) + self.conn_menu.host_set_line.setEnabled(False) + self.conn_menu.port_set_spin.setEnabled(False) + self.connect_btn.setText("Disconnect") - self._status(self.hw_rev_data) - self.thermostat.start_watching() - else: - self.status_lbl.setText("Disconnected") - self.background_task_lbl.setText("Ready.") - self.loading_spinner.hide() - self.loading_spinner.stop() - self.thermostat_ctrl_menu.fan_pwm_warning.setPixmap(QtGui.QPixmap()) - self.thermostat_ctrl_menu.fan_pwm_warning.setToolTip("") - self.clear_graphs() - self.report_box.setChecked(False) - 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() + self.hw_rev_data = await self.thermostat.get_hw_rev() + logging.debug(self.hw_rev_data) + + self._status(self.hw_rev_data) + self.thermostat.start_watching() + + case ThermostatConnectionState.CONNECTING: + self.status_lbl.setText("Connecting...") + self.connect_btn.setText("Stop") + self.conn_menu.host_set_line.setEnabled(False) + self.conn_menu.port_set_spin.setEnabled(False) + + case ThermostatConnectionState.DISCONNECTED: + self.graph_group.setEnabled(False) + self.report_group.setEnabled(False) + self.thermostat_settings.setEnabled(False) + + self.conn_menu.host_set_line.setEnabled(True) + self.conn_menu.port_set_spin.setEnabled(True) + self.connect_btn.setText("Connect") + + self.status_lbl.setText("Disconnected") + self.background_task_lbl.setText("Ready.") + self.loading_spinner.hide() + self.loading_spinner.stop() + self.thermostat_ctrl_menu.fan_pwm_warning.setPixmap(QtGui.QPixmap()) + self.thermostat_ctrl_menu.fan_pwm_warning.setToolTip("") + self.clear_graphs() + self.report_box.setChecked(False) + 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() def _status(self, hw_rev_d: dict): logging.debug(hw_rev_d) @@ -239,19 +256,13 @@ class MainWindow(QtWidgets.QMainWindow): except: pass - def _connecting(self): - self.status_lbl.setText("Connecting...") - self.connect_btn.setText("Stop") - self.conn_menu.host_set_line.setEnabled(False) - self.conn_menu.port_set_spin.setEnabled(False) - @asyncSlot() async def on_connect_btn_clicked(self): if (self._connecting_task is None) and (not self.thermostat.connected()): host = self.conn_menu.host_set_line.text() port = self.conn_menu.port_set_spin.value() - self._connecting() + await self._on_connection_changed(ThermostatConnectionState.CONNECTING) self._connecting_task = asyncio.create_task( self.thermostat.start_session(host=host, port=port) ) @@ -262,11 +273,11 @@ class MainWindow(QtWidgets.QMainWindow): if isinstance(exc, asyncio.CancelledError): return raise - else: - await self._on_connection_changed(True) finally: self._connecting_task = None + await self._on_connection_changed(ThermostatConnectionState.CONNECTED) + elif self._connecting_task is not None: self._connecting_task.cancel() else: @@ -274,7 +285,7 @@ class MainWindow(QtWidgets.QMainWindow): @asyncSlot() async def bail(self): - await self._on_connection_changed(False) + await self._on_connection_changed(ThermostatConnectionState.DISCONNECTED) await self.thermostat.end_session() @asyncSlot(object, object) @@ -413,14 +424,14 @@ class MainWindow(QtWidgets.QMainWindow): async def dfu_request(self, _): assert self.thermostat.connected() - await self._on_connection_changed(False) + await self._on_connection_changed(ThermostatConnectionState.DISCONNECTED) await self.thermostat.dfu() @asyncSlot(bool) async def reset_request(self, _): assert self.thermostat.connected() - await self._on_connection_changed(False) + await self._on_connection_changed(ThermostatConnectionState.DISCONNECTED) await self.thermostat.reset() await asyncio.sleep(0.1) # Wait for the reset to start