From 0786fa0158f75d9734e3253968cc2799b89cce86 Mon Sep 17 00:00:00 2001 From: atse Date: Mon, 26 Aug 2024 13:49:56 +0800 Subject: [PATCH] Put send_command in CtrlPanel --- pytec/pytec/gui/view/ctrl_panel.py | 43 ++++++++++++++++++++++++++++-- pytec/tec_qt.py | 38 ++------------------------ 2 files changed, 43 insertions(+), 38 deletions(-) diff --git a/pytec/pytec/gui/view/ctrl_panel.py b/pytec/pytec/gui/view/ctrl_panel.py index 81be5ee..49d891b 100644 --- a/pytec/pytec/gui/view/ctrl_panel.py +++ b/pytec/pytec/gui/view/ctrl_panel.py @@ -5,6 +5,7 @@ from pyqtgraph.parametertree import ( Parameter, registerParameterType, ) +from qasync import asyncSlot class MutexParameter(pTypes.ListParameter): @@ -48,14 +49,17 @@ class CtrlPanel(QObject): def __init__( self, + thermostat, + autotuners, trees_ui, param_tree, - sigTreeStateChanged_handle, sigActivated_handles, parent=None, ): super().__init__(parent) + self.thermostat = thermostat + self.autotuners = autotuners self.trees_ui = trees_ui self.NUM_CHANNELS = len(trees_ui) @@ -78,7 +82,7 @@ class CtrlPanel(QObject): tree.setHeaderHidden(True) tree.setParameters(self.params[i], showTop=False) self.params[i].setValue = self._setValue - self.params[i].sigTreeStateChanged.connect(sigTreeStateChanged_handle) + self.params[i].sigTreeStateChanged.connect(self.send_command) for handle in sigActivated_handles[i]: self.params[i].child(*handle[0]).sigActivated.connect(handle[1]) @@ -112,6 +116,41 @@ class CtrlPanel(QObject): def change_params_title(self, channel, path, title): self.params[channel].child(*path).setOpts(title=title) + @asyncSlot(object, object) + async def send_command(self, param, changes): + """Translates parameter tree changes into thermostat set_param calls""" + ch = param.channel + + for inner_param, change, data in changes: + if change == "value": + new_value = data + if "thermostat:set_param" in inner_param.opts: + if inner_param.opts.get("suffix", None) == "mA": + new_value /= 1000 # Given in mA + + thermostat_param = inner_param.opts["thermostat:set_param"] + + # Handle thermostat command irregularities + match inner_param.name(), new_value: + case "Postfilter Rate", None: + thermostat_param = thermostat_param.copy() + thermostat_param["field"] = "off" + new_value = "" + case "Control Method", "Constant Current": + return + case "Control Method", "Temperature PID": + new_value = "" + + inner_param.setOpts(lock=True) + await self.thermostat.set_param( + channel=ch, value=new_value, **thermostat_param + ) + inner_param.setOpts(lock=False) + + if "pid_autotune" in inner_param.opts: + auto_tuner_param = inner_param.opts["pid_autotune"] + self.autotuners.set_params(auto_tuner_param, ch, new_value) + @pyqtSlot("QVariantList") def update_pid(self, pid_settings): for settings in pid_settings: diff --git a/pytec/tec_qt.py b/pytec/tec_qt.py index 915601c..24f186c 100755 --- a/pytec/tec_qt.py +++ b/pytec/tec_qt.py @@ -95,9 +95,10 @@ class MainWindow(QtWidgets.QMainWindow): self.thermostat.info_box_trigger.connect(self.info_box.display_info_box) self.ctrl_panel_view = CtrlPanel( + self.thermostat, + self.autotuners, [self.ch0_tree, self.ch1_tree], get_ctrl_panel_config(args), - self.send_command, param_tree_sigActivated_handles, ) @@ -270,41 +271,6 @@ class MainWindow(QtWidgets.QMainWindow): await self._on_connection_changed(ThermostatConnectionState.DISCONNECTED) await self.thermostat.end_session() - @asyncSlot(object, object) - async def send_command(self, param, changes): - """Translates parameter tree changes into thermostat set_param calls""" - ch = param.channel - - for inner_param, change, data in changes: - if change == "value": - new_value = data - if "thermostat:set_param" in inner_param.opts: - if inner_param.opts.get("suffix", None) == "mA": - new_value /= 1000 # Given in mA - - thermostat_param = inner_param.opts["thermostat:set_param"] - - # Handle thermostat command irregularities - match inner_param.name(), new_value: - case "Postfilter Rate", None: - thermostat_param = thermostat_param.copy() - thermostat_param["field"] = "off" - new_value = "" - case "Control Method", "Constant Current": - return - case "Control Method", "Temperature PID": - new_value = "" - - inner_param.setOpts(lock=True) - await self.thermostat.set_param( - channel=ch, value=new_value, **thermostat_param - ) - inner_param.setOpts(lock=False) - - if "pid_autotune" in inner_param.opts: - auto_tuner_param = inner_param.opts["pid_autotune"] - self.autotuners.set_params(auto_tuner_param, ch, new_value) - @asyncSlot() async def pid_auto_tune_request(self, ch=0): match self.autotuners.get_state(ch):