From 30ba8260d06b200d83f537b3f9cb25f3b482c0bf 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 066c23c..d633065 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 e229e28..fe75fab 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)