From 437c9cec340e0a8375ed405a578ce7a5ae7a0238 Mon Sep 17 00:00:00 2001 From: atse Date: Thu, 11 Jul 2024 10:25:52 +0800 Subject: [PATCH] ctrl_panel: Refer to Parameters by concise `name`s For displayed string representations, use the `title` key, or for `ListParameter`s, use the dictionary mapping method instead. --- pytec/pytec/gui/view/ctrl_panel.py | 54 ++++++++------- pytec/pytec/gui/view/param_tree.json | 98 ++++++++++++++++++---------- pytec/tec_qt.py | 14 ++-- 3 files changed, 97 insertions(+), 69 deletions(-) diff --git a/pytec/pytec/gui/view/ctrl_panel.py b/pytec/pytec/gui/view/ctrl_panel.py index 4dc9346..a728de1 100644 --- a/pytec/pytec/gui/view/ctrl_panel.py +++ b/pytec/pytec/gui/view/ctrl_panel.py @@ -116,23 +116,23 @@ class CtrlPanel(QObject): for settings in pid_settings: channel = settings["channel"] with QSignalBlocker(self.params[channel]): - self.params[channel].child("PID Settings", "Kp").setValue( + self.params[channel].child("pid", "kp").setValue( settings["parameters"]["kp"] ) - self.params[channel].child("PID Settings", "Ki").setValue( + self.params[channel].child("pid", "ki").setValue( settings["parameters"]["ki"] ) - self.params[channel].child("PID Settings", "Kd").setValue( + self.params[channel].child("pid", "kd").setValue( settings["parameters"]["kd"] ) self.params[channel].child( - "PID Settings", "PID Output Clamping", "Minimum" + "pid", "pid_output_clamping", "output_min" ).setValue(settings["parameters"]["output_min"] * 1000) self.params[channel].child( - "PID Settings", "PID Output Clamping", "Maximum" + "pid", "pid_output_clamping", "output_max" ).setValue(settings["parameters"]["output_max"] * 1000) self.params[channel].child( - "Output Settings", "Control Method", "Set Temperature" + "output", "control_method", "target" ).setValue(settings["target"]) @pyqtSlot("QVariantList") @@ -140,20 +140,18 @@ class CtrlPanel(QObject): for settings in report_data: channel = settings["channel"] with QSignalBlocker(self.params[channel]): - self.params[channel].child( - "Output Settings", "Control Method" - ).setValue( - "Temperature PID" if settings["pid_engaged"] else "Constant Current" + self.params[channel].child("output", "control_method").setValue( + "temperature_pid" if settings["pid_engaged"] else "constant_current" ) self.params[channel].child( - "Output Settings", "Control Method", "Set Current" + "output", "control_method", "i_set" ).setValue(settings["i_set"] * 1000) if settings["temperature"] is not None: - self.params[channel].child("Temperature").setValue( + self.params[channel].child("temperature").setValue( settings["temperature"] ) if settings["tec_i"] is not None: - self.params[channel].child("Current through TEC").setValue( + self.params[channel].child("tec_i").setValue( settings["tec_i"] * 1000 ) @@ -162,13 +160,13 @@ class CtrlPanel(QObject): for sh_param in sh_data: channel = sh_param["channel"] with QSignalBlocker(self.params[channel]): - self.params[channel].child("Thermistor Settings", "T₀").setValue( + self.params[channel].child("thermistor", "t0").setValue( sh_param["params"]["t0"] - 273.15 ) - self.params[channel].child("Thermistor Settings", "R₀").setValue( + self.params[channel].child("thermistor", "r0").setValue( sh_param["params"]["r0"] ) - self.params[channel].child("Thermistor Settings", "B").setValue( + self.params[channel].child("thermistor", "b").setValue( sh_param["params"]["b"] ) @@ -179,15 +177,15 @@ class CtrlPanel(QObject): for pwm_params in pwm_data: channel = pwm_params["channel"] with QSignalBlocker(self.params[channel]): - self.params[channel].child( - "Output Settings", "Limits", "Max Voltage Difference" - ).setValue(pwm_params["max_v"]["value"]) - self.params[channel].child( - "Output Settings", "Limits", "Max Cooling Current" - ).setValue(pwm_params["max_i_pos"]["value"] * 1000) - self.params[channel].child( - "Output Settings", "Limits", "Max Heating Current" - ).setValue(pwm_params["max_i_neg"]["value"] * 1000) + self.params[channel].child("output", "limits", "max_v").setValue( + pwm_params["max_v"]["value"] + ) + self.params[channel].child("output", "limits", "max_i_pos").setValue( + pwm_params["max_i_pos"]["value"] * 1000 + ) + self.params[channel].child("output", "limits", "max_i_neg").setValue( + pwm_params["max_i_neg"]["value"] * 1000 + ) for limit in "max_i_pos", "max_i_neg", "max_v": if pwm_params[limit]["value"] == 0.0: @@ -199,6 +197,6 @@ class CtrlPanel(QObject): for postfilter_params in postfilter_data: channel = postfilter_params["channel"] with QSignalBlocker(self.params[channel]): - self.params[channel].child( - "Thermistor Settings", "Postfilter Rate" - ).setValue(postfilter_params["rate"]) + self.params[channel].child("thermistor", "rate").setValue( + postfilter_params["rate"] + ) diff --git a/pytec/pytec/gui/view/param_tree.json b/pytec/pytec/gui/view/param_tree.json index ab46a9b..6a23913 100644 --- a/pytec/pytec/gui/view/param_tree.json +++ b/pytec/pytec/gui/view/param_tree.json @@ -1,30 +1,34 @@ { "ctrl_panel": [ { - "name": "Temperature", + "name": "temperature", + "title": "Temperature", "type": "float", "format": "{value:.4f} °C", "readonly": true }, { - "name": "Current through TEC", + "name": "tec_i", + "title": "Current through TEC", "type": "float", "suffix": "mA", "decimals": 6, "readonly": true }, { - "name": "Output Settings", + "name": "output", + "title": "Output Settings", "expanded": true, "type": "group", "children": [ { - "name": "Control Method", + "name": "control_method", + "title": "Control Method", "type": "mutex", - "limits": [ - "Constant Current", - "Temperature PID" - ], + "limits": { + "Constant Current": "constant_current", + "Temperature PID": "temperature_pid" + }, "activaters": [ null, [ @@ -35,7 +39,8 @@ ], "children": [ { - "name": "Set Current", + "name": "i_set", + "title": "Set Current", "type": "float", "value": 0, "step": 100, @@ -54,7 +59,8 @@ "lock": false }, { - "name": "Set Temperature", + "name": "target", + "title": "Set Temperature", "type": "float", "value": 25, "step": 0.1, @@ -73,12 +79,14 @@ ] }, { - "name": "Limits", + "name": "limits", + "title": "Limits", "expanded": true, "type": "group", "children": [ { - "name": "Max Cooling Current", + "name": "max_i_pos", + "title": "Max Cooling Current", "type": "float", "value": 0, "step": 100, @@ -96,7 +104,8 @@ "lock": false }, { - "name": "Max Heating Current", + "name": "max_i_neg", + "title": "Max Heating Current", "type": "float", "value": 0, "step": 100, @@ -114,7 +123,8 @@ "lock": false }, { - "name": "Max Voltage Difference", + "name": "max_v", + "title": "Max Voltage Difference", "type": "float", "value": 0, "step": 0.1, @@ -136,13 +146,15 @@ ] }, { - "name": "Thermistor Settings", + "name": "thermistor", + "title": "Thermistor Settings", "expanded": true, "type": "group", "tip": "Settings of the connected Thermistor", "children": [ { - "name": "T₀", + "name": "t0", + "title": "T₀", "type": "float", "value": 25, "step": 0.1, @@ -159,7 +171,8 @@ "lock": false }, { - "name": "R₀", + "name": "r0", + "title": "R₀", "type": "float", "value": 10000, "step": 1, @@ -173,7 +186,8 @@ "lock": false }, { - "name": "B", + "name": "b", + "title": "B", "type": "float", "value": 3950, "step": 1, @@ -187,7 +201,8 @@ "lock": false }, { - "name": "Postfilter Rate", + "name": "rate", + "title": "Postfilter Rate", "type": "list", "value": 16.67, "param": [ @@ -207,12 +222,14 @@ ] }, { - "name": "PID Settings", + "name": "pid", + "title": "PID Settings", "expanded": true, "type": "group", "children": [ { - "name": "Kp", + "name": "kp", + "title": "Kp", "type": "float", "step": 0.1, "suffix": "", @@ -224,7 +241,8 @@ "lock": false }, { - "name": "Ki", + "name": "ki", + "title": "Ki", "type": "float", "step": 0.1, "suffix": "Hz", @@ -236,7 +254,8 @@ "lock": false }, { - "name": "Kd", + "name": "kd", + "title": "Kd", "type": "float", "step": 0.1, "suffix": "s", @@ -248,12 +267,14 @@ "lock": false }, { - "name": "PID Output Clamping", + "name": "pid_output_clamping", + "title": "PID Output Clamping", "expanded": true, "type": "group", "children": [ { - "name": "Minimum", + "name": "output_min", + "title": "Minimum", "type": "float", "step": 100, "limits": [ @@ -270,7 +291,8 @@ "lock": false }, { - "name": "Maximum", + "name": "output_max", + "title": "Maximum", "type": "float", "step": 100, "limits": [ @@ -289,12 +311,14 @@ ] }, { - "name": "PID Auto Tune", + "name": "pid_autotune", + "title": "PID Auto Tune", "expanded": false, "type": "group", "children": [ { - "name": "Target Temperature", + "name": "target_temp", + "title": "Target Temperature", "type": "float", "value": 20, "step": 0.1, @@ -305,7 +329,8 @@ ] }, { - "name": "Test Current", + "name": "test_current", + "title": "Test Current", "type": "float", "value": 0, "decimals": 6, @@ -321,7 +346,8 @@ ] }, { - "name": "Temperature Swing", + "name": "temp_swing", + "title": "Temperature Swing", "type": "float", "value": 1.5, "step": 0.1, @@ -333,7 +359,8 @@ ] }, { - "name": "Lookback", + "name": "lookback", + "title": "Lookback", "type": "float", "value": 3.0, "step": 0.1, @@ -344,7 +371,8 @@ ] }, { - "name": "Run", + "name": "run_pid", + "title": "Run", "type": "action", "tip": "Run" } @@ -353,12 +381,14 @@ ] }, { - "name": "Save to flash", + "name": "save", + "title": "Save to flash", "type": "action", "tip": "Save settings to thermostat, applies on reset" }, { - "name": "Load from flash", + "name": "load", + "title": "Load from flash", "type": "action", "tip": "Load settings from flash" } diff --git a/pytec/tec_qt.py b/pytec/tec_qt.py index 0dba9d4..6047e34 100644 --- a/pytec/tec_qt.py +++ b/pytec/tec_qt.py @@ -78,10 +78,10 @@ class MainWindow(QtWidgets.QMainWindow): param_tree_sigActivated_handles = [ [ - [["Save to flash"], partial(self.thermostat.save_cfg, ch)], - [["Load from flash"], partial(self.thermostat.load_cfg, ch)], + [["save"], partial(self.thermostat.save_cfg, ch)], + [["load"], partial(self.thermostat.load_cfg, ch)], [ - ["PID Settings", "PID Auto Tune", "Run"], + ["pid", "pid_autotune", "run_pid"], partial(self.pid_auto_tune_request, ch), ], ] @@ -274,7 +274,7 @@ class MainWindow(QtWidgets.QMainWindow): if thermostat_param[1] == "ch": thermostat_param[1] = ch - if inner_param.name() == "Postfilter Rate" and data is None: + if inner_param.name() == "rate" and data is None: set_param_args = (*thermostat_param[:2], "off") else: set_param_args = (*thermostat_param, data) @@ -290,7 +290,7 @@ class MainWindow(QtWidgets.QMainWindow): if inner_param.opts.get("activaters", None) is not None: activater = inner_param.opts["activaters"][ - inner_param.opts["limits"].index(data) + inner_param.reverse[0].index(data) # ListParameter.reverse = list of codename values ] if activater is not None: if activater[1] == "ch": @@ -315,11 +315,11 @@ class MainWindow(QtWidgets.QMainWindow): match self.autotuners.get_state(ch): case PIDAutotuneState.STATE_OFF: self.ctrl_panel_view.change_params_title( - ch, ("PID Settings", "PID Auto Tune", "Run"), "Run" + ch, ("pid", "pid_autotune", "run_pid"), "Run" ) case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN: self.ctrl_panel_view.change_params_title( - ch, ("PID Settings", "PID Auto Tune", "Run"), "Stop" + ch, ("pid", "pid_autotune", "run_pid"), "Stop" ) ch_tuning.append(ch)