diff --git a/pytec/pytec/gui/view/ctrl_panel.py b/pytec/pytec/gui/view/ctrl_panel.py index 0c8d9d2..3de91d6 100644 --- a/pytec/pytec/gui/view/ctrl_panel.py +++ b/pytec/pytec/gui/view/ctrl_panel.py @@ -4,6 +4,7 @@ from pyqtgraph.parametertree import ( Parameter, registerParameterType, ) +from qasync import asyncSlot class MutexParameter(pTypes.ListParameter): @@ -47,14 +48,17 @@ class CtrlPanel(QObject): def __init__( self, + thermostat, + autotuner, trees_ui, param_tree, - sigTreeStateChanged_handle, sigActivated_handles, parent=None, ): super().__init__(parent) + self.thermostat = thermostat + self.autotuner = autotuner self.trees_ui = trees_ui self.NUM_CHANNELS = len(trees_ui) @@ -77,7 +81,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]) @@ -111,6 +115,44 @@ 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": + if inner_param.opts.get("param", None) is not None: + if inner_param.opts.get("suffix", None) == "mA": + data /= 1000 # Given in mA + + thermostat_param = inner_param.opts["param"] + if thermostat_param[1] == "ch": + thermostat_param[1] = ch + + if inner_param.name() == "Postfilter Rate" and data is None: + set_param_args = (*thermostat_param[:2], "off") + else: + set_param_args = (*thermostat_param, data) + param.child(*param.childPath(inner_param)).setOpts(lock=True) + await self.thermostat.set_param(*set_param_args) + param.child(*param.childPath(inner_param)).setOpts(lock=False) + + if inner_param.opts.get("pid_autotune", None) is not None: + auto_tuner_param = inner_param.opts["pid_autotune"][0] + if inner_param.opts["pid_autotune"][1] != "ch": + ch = inner_param.opts["pid_autotune"][1] + self.autotuners.set_params(auto_tuner_param, ch, data) + + if inner_param.opts.get("activaters", None) is not None: + activater = inner_param.opts["activaters"][ + inner_param.opts["limits"].index(data) + ] + if activater is not None: + if activater[1] == "ch": + activater[1] = ch + await self.thermostat.set_param(*activater) + @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 a8726cd..370cdae 100755 --- a/pytec/tec_qt.py +++ b/pytec/tec_qt.py @@ -97,9 +97,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, ) @@ -280,44 +281,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": - if inner_param.opts.get("param", None) is not None: - if inner_param.opts.get("suffix", None) == "mA": - data /= 1000 # Given in mA - - thermostat_param = inner_param.opts["param"] - if thermostat_param[1] == "ch": - thermostat_param[1] = ch - - if inner_param.name() == "Postfilter Rate" and data is None: - set_param_args = (*thermostat_param[:2], "off") - else: - set_param_args = (*thermostat_param, data) - param.child(*param.childPath(inner_param)).setOpts(lock=True) - await self.thermostat.set_param(*set_param_args) - param.child(*param.childPath(inner_param)).setOpts(lock=False) - - if inner_param.opts.get("pid_autotune", None) is not None: - auto_tuner_param = inner_param.opts["pid_autotune"][0] - if inner_param.opts["pid_autotune"][1] != "ch": - ch = inner_param.opts["pid_autotune"][1] - self.autotuners.set_params(auto_tuner_param, ch, data) - - if inner_param.opts.get("activaters", None) is not None: - activater = inner_param.opts["activaters"][ - inner_param.opts["limits"].index(data) - ] - if activater is not None: - if activater[1] == "ch": - activater[1] = ch - await self.thermostat.set_param(*activater) - @asyncSlot() async def pid_auto_tune_request(self, ch=0): match self.autotuners.get_state(ch):