diff --git a/pytec/pytec/gui/model/thermostat.py b/pytec/pytec/gui/model/thermostat.py index 433a2e5..9033e22 100644 --- a/pytec/pytec/gui/model/thermostat.py +++ b/pytec/pytec/gui/model/thermostat.py @@ -3,9 +3,16 @@ from qasync import asyncSlot from pytec.gui.model.property import Property, PropertyMeta import asyncio import logging +from enum import Enum from pytec.aioclient import AsyncioClient +class ThermostatConnectionState(Enum): + DISCONNECTED = False + CONNECTING = "connecting" + CONNECTED = True + + class Thermostat(QObject, metaclass=PropertyMeta): hw_rev = Property(dict) fan = Property(dict) diff --git a/pytec/tec_qt.py b/pytec/tec_qt.py index 06320b0..4781d2b 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 @@ -167,37 +167,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) @@ -233,11 +250,7 @@ class MainWindow(QtWidgets.QMainWindow): @asyncSlot() async def on_connect_btn_clicked(self): if (self._connecting_task is None) and (not self.thermostat.connected()): - 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) - + await self._on_connection_changed(ThermostatConnectionState.CONNECTING) self._connecting_task = asyncio.create_task( self.thermostat.start_session( host=self.conn_menu.host_set_line.text(), @@ -251,11 +264,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: @@ -263,7 +276,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) @@ -399,14 +412,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