ctrl_panel: Use new locking mechanism from Kirdy

This commit is contained in:
atse 2024-08-02 13:01:30 +08:00
parent 0f768f30e8
commit ae9bd1a859
1 changed files with 34 additions and 54 deletions

View File

@ -30,6 +30,11 @@ class CtrlPanel(QObject):
self.trees_ui = trees_ui self.trees_ui = trees_ui
self.NUM_CHANNELS = len(trees_ui) self.NUM_CHANNELS = len(trees_ui)
def _set_value_with_lock(self, value):
if not self.opts.get("lock"):
self.setValue(value)
Parameter.set_value_with_lock = _set_value_with_lock
self.params = [ self.params = [
Parameter.create( Parameter.create(
name=f"Thermostat Channel {ch} Parameters", name=f"Thermostat Channel {ch} Parameters",
@ -47,7 +52,6 @@ class CtrlPanel(QObject):
set_tree_label_tips(tree) set_tree_label_tips(tree)
for ch, param in enumerate(self.params): for ch, param in enumerate(self.params):
self.params[ch].setValue = self._setValue
param.sigTreeStateChanged.connect(sigTreeStateChanged_handle) param.sigTreeStateChanged.connect(sigTreeStateChanged_handle)
for handle in sigActivated_handles[ch]: for handle in sigActivated_handles[ch]:
@ -77,32 +81,6 @@ class CtrlPanel(QObject):
font.setBold(True) font.setBold(True)
item.setFont(0, font) item.setFont(0, font)
def _setValue(self, value, blockSignal=None):
"""
Implement 'lock' mechanism for Parameter Type
Modified from the source
"""
try:
if blockSignal is not None:
self.sigValueChanged.disconnect(blockSignal)
value = self._interpretValue(value)
if fn.eq(self.opts["value"], value):
return value
if "lock" in self.opts.keys():
if self.opts["lock"]:
return value
self.opts["value"] = value
self.sigValueChanged.emit(
self, value
) # value might change after signal is received by tree item
finally:
if blockSignal is not None:
self.sigValueChanged.connect(blockSignal)
return self.opts["value"]
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)
@ -111,57 +89,59 @@ class CtrlPanel(QObject):
for settings in pid_settings: for settings in pid_settings:
channel = settings["channel"] channel = settings["channel"]
with QSignalBlocker(self.params[channel]): with QSignalBlocker(self.params[channel]):
self.params[channel].child("pid", "kp").setValue( self.params[channel].child("pid", "kp").set_value_with_lock(
settings["parameters"]["kp"] settings["parameters"]["kp"]
) )
self.params[channel].child("pid", "ki").setValue( self.params[channel].child("pid", "ki").set_value_with_lock(
settings["parameters"]["ki"] settings["parameters"]["ki"]
) )
self.params[channel].child("pid", "kd").setValue( self.params[channel].child("pid", "kd").set_value_with_lock(
settings["parameters"]["kd"] settings["parameters"]["kd"]
) )
self.params[channel].child( self.params[channel].child(
"pid", "pid_output_clamping", "output_min" "pid", "pid_output_clamping", "output_min"
).setValue(settings["parameters"]["output_min"]) ).set_value_with_lock(settings["parameters"]["output_min"])
self.params[channel].child( self.params[channel].child(
"pid", "pid_output_clamping", "output_max" "pid", "pid_output_clamping", "output_max"
).setValue(settings["parameters"]["output_max"]) ).set_value_with_lock(settings["parameters"]["output_max"])
self.params[channel].child( self.params[channel].child(
"output", "control_method", "target" "output", "control_method", "target"
).setValue(settings["target"]) ).set_value_with_lock(settings["target"])
@pyqtSlot("QVariantList") @pyqtSlot("QVariantList")
def update_report(self, report_data): def update_report(self, report_data):
for settings in report_data: for settings in report_data:
channel = settings["channel"] channel = settings["channel"]
with QSignalBlocker(self.params[channel]): with QSignalBlocker(self.params[channel]):
self.params[channel].child("output", "control_method").setValue( self.params[channel].child(
"output", "control_method"
).set_value_with_lock(
"temperature_pid" if settings["pid_engaged"] else "constant_current" "temperature_pid" if settings["pid_engaged"] else "constant_current"
) )
self.params[channel].child( self.params[channel].child(
"output", "control_method", "i_set" "output", "control_method", "i_set"
).setValue(settings["i_set"]) ).set_value_with_lock(settings["i_set"])
if settings["temperature"] is not None: if settings["temperature"] is not None:
self.params[channel].child("readings", "temperature").setValue( self.params[channel].child(
settings["temperature"] "readings", "temperature"
) ).set_value_with_lock(settings["temperature"])
if settings["tec_i"] is not None: if settings["tec_i"] is not None:
self.params[channel].child("readings", "tec_i").setValue( self.params[channel].child(
settings["tec_i"] "readings", "tec_i"
) ).set_value_with_lock(settings["tec_i"])
@pyqtSlot("QVariantList") @pyqtSlot("QVariantList")
def update_thermistor(self, sh_data): def update_thermistor(self, sh_data):
for sh_param in sh_data: for sh_param in sh_data:
channel = sh_param["channel"] channel = sh_param["channel"]
with QSignalBlocker(self.params[channel]): with QSignalBlocker(self.params[channel]):
self.params[channel].child("thermistor", "t0").setValue( self.params[channel].child("thermistor", "t0").set_value_with_lock(
sh_param["params"]["t0"] - 273.15 sh_param["params"]["t0"] - 273.15
) )
self.params[channel].child("thermistor", "r0").setValue( self.params[channel].child("thermistor", "r0").set_value_with_lock(
sh_param["params"]["r0"] sh_param["params"]["r0"]
) )
self.params[channel].child("thermistor", "b").setValue( self.params[channel].child("thermistor", "b").set_value_with_lock(
sh_param["params"]["b"] sh_param["params"]["b"]
) )
@ -172,15 +152,15 @@ class CtrlPanel(QObject):
for pwm_params in pwm_data: for pwm_params in pwm_data:
channel = pwm_params["channel"] channel = pwm_params["channel"]
with QSignalBlocker(self.params[channel]): with QSignalBlocker(self.params[channel]):
self.params[channel].child("output", "limits", "max_v").setValue( self.params[channel].child(
pwm_params["max_v"]["value"] "output", "limits", "max_v"
) ).set_value_with_lock(pwm_params["max_v"]["value"])
self.params[channel].child("output", "limits", "max_i_pos").setValue( self.params[channel].child(
pwm_params["max_i_pos"]["value"] "output", "limits", "max_i_pos"
) ).set_value_with_lock(pwm_params["max_i_pos"]["value"])
self.params[channel].child("output", "limits", "max_i_neg").setValue( self.params[channel].child(
pwm_params["max_i_neg"]["value"] "output", "limits", "max_i_neg"
) ).set_value_with_lock(pwm_params["max_i_neg"]["value"])
for limit in "max_i_pos", "max_i_neg", "max_v": for limit in "max_i_pos", "max_i_neg", "max_v":
if pwm_params[limit]["value"] == 0.0: if pwm_params[limit]["value"] == 0.0:
@ -192,6 +172,6 @@ class CtrlPanel(QObject):
for postfilter_params in postfilter_data: for postfilter_params in postfilter_data:
channel = postfilter_params["channel"] channel = postfilter_params["channel"]
with QSignalBlocker(self.params[channel]): with QSignalBlocker(self.params[channel]):
self.params[channel].child("thermistor", "rate").setValue( self.params[channel].child("thermistor", "rate").set_value_with_lock(
postfilter_params["rate"] postfilter_params["rate"]
) )