Put send_command in CtrlPanel

This commit is contained in:
atse 2024-08-26 13:49:56 +08:00
parent 8a4a963f9b
commit 6699458939
2 changed files with 46 additions and 41 deletions

View File

@ -5,6 +5,7 @@ from pyqtgraph.parametertree import (
Parameter, Parameter,
registerParameterType, registerParameterType,
) )
from qasync import asyncSlot
class MutexParameter(pTypes.ListParameter): class MutexParameter(pTypes.ListParameter):
@ -48,14 +49,17 @@ class CtrlPanel(QObject):
def __init__( def __init__(
self, self,
thermostat,
autotuners,
trees_ui, trees_ui,
param_tree, param_tree,
sigTreeStateChanged_handle,
sigActivated_handles, sigActivated_handles,
parent=None, parent=None,
): ):
super().__init__(parent) super().__init__(parent)
self.thermostat = thermostat
self.autotuners = autotuners
self.trees_ui = trees_ui self.trees_ui = trees_ui
self.NUM_CHANNELS = len(trees_ui) self.NUM_CHANNELS = len(trees_ui)
@ -78,7 +82,7 @@ class CtrlPanel(QObject):
tree.setHeaderHidden(True) tree.setHeaderHidden(True)
tree.setParameters(self.params[i], showTop=False) tree.setParameters(self.params[i], showTop=False)
self.params[i].setValue = self._setValue 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]: for handle in sigActivated_handles[i]:
self.params[i].child(*handle[0]).sigActivated.connect(handle[1]) self.params[i].child(*handle[0]).sigActivated.connect(handle[1])
@ -112,6 +116,44 @@ class CtrlPanel(QObject):
def change_params_title(self, channel, path, title): def change_params_title(self, channel, path, title):
self.params[channel].child(*path).setOpts(title=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") @pyqtSlot("QVariantList")
def update_pid(self, pid_settings): def update_pid(self, pid_settings):
for settings in pid_settings: for settings in pid_settings:

View File

@ -95,9 +95,10 @@ class MainWindow(QtWidgets.QMainWindow):
self.thermostat.info_box_trigger.connect(self.info_box.display_info_box) self.thermostat.info_box_trigger.connect(self.info_box.display_info_box)
self.ctrl_panel_view = CtrlPanel( self.ctrl_panel_view = CtrlPanel(
self.thermostat,
self.autotuners,
[self.ch0_tree, self.ch1_tree], [self.ch0_tree, self.ch1_tree],
get_ctrl_panel_config(args), get_ctrl_panel_config(args),
self.send_command,
param_tree_sigActivated_handles, param_tree_sigActivated_handles,
) )
@ -270,44 +271,6 @@ class MainWindow(QtWidgets.QMainWindow):
await self._on_connection_changed(ThermostatConnectionState.DISCONNECTED) await self._on_connection_changed(ThermostatConnectionState.DISCONNECTED)
await self.thermostat.end_session() 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() @asyncSlot()
async def pid_auto_tune_request(self, ch=0): async def pid_auto_tune_request(self, ch=0):
match self.autotuners.get_state(ch): match self.autotuners.get_state(ch):