GUI: Control Panel changes #2

Open
atse wants to merge 21 commits from gui_dev-ctrl_panel into gui_dev
3 changed files with 98 additions and 70 deletions
Showing only changes of commit 6a38f9b5a6 - Show all commits

View File

@ -116,23 +116,23 @@ 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 Settings", "Kp").setValue( self.params[channel].child("pid", "kp").setValue(
settings["parameters"]["kp"] settings["parameters"]["kp"]
) )
self.params[channel].child("PID Settings", "Ki").setValue( self.params[channel].child("pid", "ki").setValue(
settings["parameters"]["ki"] settings["parameters"]["ki"]
) )
self.params[channel].child("PID Settings", "Kd").setValue( self.params[channel].child("pid", "kd").setValue(
settings["parameters"]["kd"] settings["parameters"]["kd"]
) )
self.params[channel].child( self.params[channel].child(
"PID Settings", "PID Output Clamping", "Minimum" "pid", "pid_output_clamping", "output_min"
).setValue(settings["parameters"]["output_min"] * 1000) ).setValue(settings["parameters"]["output_min"] * 1000)
self.params[channel].child( self.params[channel].child(
"PID Settings", "PID Output Clamping", "Maximum" "pid", "pid_output_clamping", "output_max"
).setValue(settings["parameters"]["output_max"] * 1000) ).setValue(settings["parameters"]["output_max"] * 1000)
self.params[channel].child( self.params[channel].child(
"Output Settings", "Control Method", "Set Temperature" "output", "control_method", "target"
).setValue(settings["target"]) ).setValue(settings["target"])
@pyqtSlot("QVariantList") @pyqtSlot("QVariantList")
@ -140,20 +140,18 @@ class CtrlPanel(QObject):
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( self.params[channel].child("output", "control_method").setValue(
"Output Settings", "Control Method" "temperature_pid" if settings["pid_engaged"] else "constant_current"
).setValue(
"Temperature PID" if settings["pid_engaged"] else "Constant Current"
) )
self.params[channel].child( self.params[channel].child(
"Output Settings", "Control Method", "Set Current" "output", "control_method", "i_set"
).setValue(settings["i_set"] * 1000) ).setValue(settings["i_set"] * 1000)
if settings["temperature"] is not None: if settings["temperature"] is not None:
self.params[channel].child("Temperature").setValue( self.params[channel].child("temperature").setValue(
settings["temperature"] settings["temperature"]
) )
if settings["tec_i"] is not None: 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 settings["tec_i"] * 1000
) )
@ -162,13 +160,13 @@ class CtrlPanel(QObject):
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 Settings", "T₀").setValue( self.params[channel].child("thermistor", "t0").setValue(
sh_param["params"]["t0"] - 273.15 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"] sh_param["params"]["r0"]
) )
self.params[channel].child("Thermistor Settings", "B").setValue( self.params[channel].child("thermistor", "b").setValue(
sh_param["params"]["b"] sh_param["params"]["b"]
) )
@ -179,15 +177,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( self.params[channel].child("output", "limits", "max_v").setValue(
"Output Settings", "Limits", "Max Voltage Difference" pwm_params["max_v"]["value"]
).setValue(pwm_params["max_v"]["value"]) )
self.params[channel].child( self.params[channel].child("output", "limits", "max_i_pos").setValue(
"Output Settings", "Limits", "Max Cooling Current" pwm_params["max_i_pos"]["value"] * 1000
).setValue(pwm_params["max_i_pos"]["value"] * 1000) )
self.params[channel].child( self.params[channel].child("output", "limits", "max_i_neg").setValue(
"Output Settings", "Limits", "Max Heating Current" pwm_params["max_i_neg"]["value"] * 1000
).setValue(pwm_params["max_i_neg"]["value"] * 1000) )
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:
@ -199,6 +197,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( self.params[channel].child("thermistor", "rate").setValue(
"Thermistor Settings", "Postfilter Rate" postfilter_params["rate"]
).setValue(postfilter_params["rate"]) )

View File

@ -1,37 +1,42 @@
{ {
"ctrl_panel": [ "ctrl_panel": [
{ {
"name": "Temperature", "name": "temperature",
"title": "Temperature",
"type": "float", "type": "float",
"format": "{value:.4f} °C", "format": "{value:.4f} °C",
"readonly": true "readonly": true
}, },
{ {
"name": "Current through TEC", "name": "tec_i",
"title": "Current through TEC",
"type": "float", "type": "float",
"suffix": "mA", "suffix": "mA",
"decimals": 6, "decimals": 6,
"readonly": true "readonly": true
}, },
{ {
"name": "Output Settings", "name": "output",
"title": "Output Settings",
"expanded": true, "expanded": true,
"type": "group", "type": "group",
"children": [ "children": [
{ {
"name": "Control Method", "name": "control_method",
"title": "Control Method",
"type": "mutex", "type": "mutex",
"limits": [ "limits": {
"Constant Current", "Constant Current": "constant_current",
"Temperature PID" "Temperature PID": "temperature_pid"
], },
"thermostat:set_param": { "thermostat:set_param": {
"topic": "pwm", "topic": "pwm",
"field": "pid" "field": "pid"
}, },
"children": [ "children": [
{ {
"name": "Set Current", "name": "i_set",
"title": "Set Current",
"type": "float", "type": "float",
"value": 0, "value": 0,
"step": 100, "step": 100,
@ -49,7 +54,8 @@
"lock": false "lock": false
}, },
{ {
"name": "Set Temperature", "name": "target",
"title": "Set Temperature",
"type": "float", "type": "float",
"value": 25, "value": 25,
"step": 0.1, "step": 0.1,
@ -67,12 +73,14 @@
] ]
}, },
{ {
"name": "Limits", "name": "limits",
"title": "Limits",
"expanded": true, "expanded": true,
"type": "group", "type": "group",
"children": [ "children": [
{ {
"name": "Max Cooling Current", "name": "max_i_pos",
"title": "Max Cooling Current",
"type": "float", "type": "float",
"value": 0, "value": 0,
"step": 100, "step": 100,
@ -89,7 +97,8 @@
"lock": false "lock": false
}, },
{ {
"name": "Max Heating Current", "name": "max_i_neg",
"title": "Max Heating Current",
"type": "float", "type": "float",
"value": 0, "value": 0,
"step": 100, "step": 100,
@ -106,7 +115,8 @@
"lock": false "lock": false
}, },
{ {
"name": "Max Voltage Difference", "name": "max_v",
"title": "Max Voltage Difference",
"type": "float", "type": "float",
"value": 0, "value": 0,
"step": 0.1, "step": 0.1,
@ -127,13 +137,15 @@
] ]
}, },
{ {
"name": "Thermistor Settings", "name": "thermistor",
"title": "Thermistor Settings",
"expanded": true, "expanded": true,
"type": "group", "type": "group",
"tip": "Settings of the connected Thermistor", "tip": "Settings of the connected Thermistor",
"children": [ "children": [
{ {
"name": "T₀", "name": "t0",
"title": "T₀",
"type": "float", "type": "float",
"value": 25, "value": 25,
"step": 0.1, "step": 0.1,
@ -149,7 +161,8 @@
"lock": false "lock": false
}, },
{ {
"name": "R₀", "name": "r0",
"title": "R₀",
"type": "float", "type": "float",
"value": 10000, "value": 10000,
"step": 1, "step": 1,
@ -162,7 +175,8 @@
"lock": false "lock": false
}, },
{ {
"name": "B", "name": "b",
"title": "B",
"type": "float", "type": "float",
"value": 3950, "value": 3950,
"step": 1, "step": 1,
@ -175,7 +189,8 @@
"lock": false "lock": false
}, },
{ {
"name": "Postfilter Rate", "name": "rate",
"title": "Postfilter Rate",
"type": "list", "type": "list",
"value": 16.67, "value": 16.67,
"thermostat:set_param": { "thermostat:set_param": {
@ -194,12 +209,14 @@
] ]
}, },
{ {
"name": "PID Settings", "name": "pid",
"title": "PID Settings",
"expanded": true, "expanded": true,
"type": "group", "type": "group",
"children": [ "children": [
{ {
"name": "Kp", "name": "kp",
"title": "Kp",
"type": "float", "type": "float",
"step": 0.1, "step": 0.1,
"suffix": "", "suffix": "",
@ -210,7 +227,8 @@
"lock": false "lock": false
}, },
{ {
"name": "Ki", "name": "ki",
"title": "Ki",
"type": "float", "type": "float",
"step": 0.1, "step": 0.1,
"suffix": "Hz", "suffix": "Hz",
@ -221,7 +239,8 @@
"lock": false "lock": false
}, },
{ {
"name": "Kd", "name": "kd",
"title": "Kd",
"type": "float", "type": "float",
"step": 0.1, "step": 0.1,
"suffix": "s", "suffix": "s",
@ -232,12 +251,14 @@
"lock": false "lock": false
}, },
{ {
"name": "PID Output Clamping", "name": "pid_output_clamping",
"title": "PID Output Clamping",
"expanded": true, "expanded": true,
"type": "group", "type": "group",
"children": [ "children": [
{ {
"name": "Minimum", "name": "output_min",
"title": "Minimum",
"type": "float", "type": "float",
"step": 100, "step": 100,
"limits": [ "limits": [
@ -253,7 +274,8 @@
"lock": false "lock": false
}, },
{ {
"name": "Maximum", "name": "output_max",
"title": "Maximum",
"type": "float", "type": "float",
"step": 100, "step": 100,
"limits": [ "limits": [
@ -271,12 +293,14 @@
] ]
}, },
{ {
"name": "PID Auto Tune", "name": "pid_autotune",
"title": "PID Auto Tune",
"expanded": false, "expanded": false,
"type": "group", "type": "group",
"children": [ "children": [
{ {
"name": "Target Temperature", "name": "target_temp",
"title": "Target Temperature",
"type": "float", "type": "float",
"value": 20, "value": 20,
"step": 0.1, "step": 0.1,
@ -284,7 +308,8 @@
"pid_autotune": "target_temp" "pid_autotune": "target_temp"
}, },
{ {
"name": "Test Current", "name": "test_current",
"title": "Test Current",
"type": "float", "type": "float",
"value": 0, "value": 0,
"decimals": 6, "decimals": 6,
@ -297,7 +322,8 @@
"pid_autotune": "test_current" "pid_autotune": "test_current"
}, },
{ {
"name": "Temperature Swing", "name": "temp_swing",
"title": "Temperature Swing",
"type": "float", "type": "float",
"value": 1.5, "value": 1.5,
"step": 0.1, "step": 0.1,
@ -306,7 +332,8 @@
"pid_autotune": "temp_swing" "pid_autotune": "temp_swing"
}, },
{ {
"name": "Lookback", "name": "lookback",
"title": "Lookback",
"type": "float", "type": "float",
"value": 3.0, "value": 3.0,
"step": 0.1, "step": 0.1,
@ -314,7 +341,8 @@
"pid_autotune": "lookback" "pid_autotune": "lookback"
}, },
{ {
"name": "Run", "name": "run_pid",
"title": "Run",
"type": "action", "type": "action",
"tip": "Run" "tip": "Run"
} }
@ -323,12 +351,14 @@
] ]
}, },
{ {
"name": "Save to flash", "name": "save",
"title": "Save to flash",
"type": "action", "type": "action",
"tip": "Save settings to thermostat, applies on reset" "tip": "Save settings to thermostat, applies on reset"
}, },
{ {
"name": "Load from flash", "name": "load",
"title": "Load from flash",
"type": "action", "type": "action",
"tip": "Load settings from flash" "tip": "Load settings from flash"
} }

View File

@ -78,10 +78,10 @@ class MainWindow(QtWidgets.QMainWindow):
param_tree_sigActivated_handles = [ param_tree_sigActivated_handles = [
[ [
[["Save to flash"], partial(self.thermostat.save_cfg, ch)], [["save"], partial(self.thermostat.save_cfg, ch)],
[["Load from flash"], partial(self.thermostat.load_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), partial(self.pid_auto_tune_request, ch),
], ],
] ]
@ -275,13 +275,13 @@ class MainWindow(QtWidgets.QMainWindow):
# Handle thermostat command irregularities # Handle thermostat command irregularities
match inner_param.name(), new_value: match inner_param.name(), new_value:
case "Postfilter Rate", None: case "rate", None:
thermostat_param = thermostat_param.copy() thermostat_param = thermostat_param.copy()
thermostat_param["field"] = "off" thermostat_param["field"] = "off"
new_value = "" new_value = ""
case "Control Method", "Constant Current": case "control_method", "constant_current":
return return
case "Control Method", "Temperature PID": case "control_method", "temperature_pid":
new_value = "" new_value = ""
inner_param.setOpts(lock=True) inner_param.setOpts(lock=True)
@ -312,11 +312,11 @@ class MainWindow(QtWidgets.QMainWindow):
match self.autotuners.get_state(ch): match self.autotuners.get_state(ch):
case PIDAutotuneState.STATE_OFF: case PIDAutotuneState.STATE_OFF:
self.ctrl_panel_view.change_params_title( 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: case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN:
self.ctrl_panel_view.change_params_title( 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) ch_tuning.append(ch)