From 9acff865473b120ec6e6357f7528e179fc842396 Mon Sep 17 00:00:00 2001 From: linuswck Date: Mon, 13 May 2024 10:35:21 +0800 Subject: [PATCH] Restructure GUI Code, Improve and Fix Bugs - Bugs fix: 1. Params Tree user input will not get overwritten by incoming report thermostat_data_model. 2. PID Autotune Sampling Period is now set according to Thermostat sampling interval 3. PID Autotune won't get stuck in Fail State 4. Various types disconnection related Bugs 5. Number of Samples stored in the plot cannot be set 6. Limit the max settable output current to be 2000mA - Improvement: 1. Params Tree settings can be changed with external json 2. Use a Tab system to show a single channel of config instead of two 3. Expose PID Autotune lookback params 4. Icon is changed to Artiq logo - Restructure: 1. Restructure the code to follow Model-View-Delegate Design Pattern --- .gitignore | 1 + pytec/autotune.py | 1 + pytec/model/pid_autotuner.py | 72 ++ pytec/model/property.py | 126 +++ pytec/model/thermostat_data_model.py | 138 +++ pytec/pyproject.toml | 3 + pytec/resources/artiq.ico | Bin 0 -> 134526 bytes pytec/tec_qt.py | 1073 ++++++---------------- pytec/thermostat-icon-640x640.png | Bin 250092 -> 0 bytes pytec/ui_tec_qt.py | 268 ------ pytec/view/conn_menu.py | 56 ++ pytec/view/ctrl_panel.py | 202 ++++ pytec/view/info_box.py | 14 + pytec/view/live_plot_view.py | 168 ++++ pytec/view/net_settings_input_diag.py | 36 + pytec/view/param_tree.json | 365 ++++++++ pytec/view/plot_options_menu.py | 21 + pytec/{ => view}/tec_qt.ui | 107 ++- pytec/view/thermostat_ctrl_menu.py | 145 +++ pytec/{ => view}/waitingspinnerwidget.py | 0 pytec/view/zero_limits_warning.py | 41 + 21 files changed, 1772 insertions(+), 1065 deletions(-) create mode 100644 pytec/model/pid_autotuner.py create mode 100644 pytec/model/property.py create mode 100644 pytec/model/thermostat_data_model.py create mode 100644 pytec/resources/artiq.ico delete mode 100644 pytec/thermostat-icon-640x640.png delete mode 100644 pytec/ui_tec_qt.py create mode 100644 pytec/view/conn_menu.py create mode 100644 pytec/view/ctrl_panel.py create mode 100644 pytec/view/info_box.py create mode 100644 pytec/view/live_plot_view.py create mode 100644 pytec/view/net_settings_input_diag.py create mode 100644 pytec/view/param_tree.json create mode 100644 pytec/view/plot_options_menu.py rename pytec/{ => view}/tec_qt.ui (82%) create mode 100644 pytec/view/thermostat_ctrl_menu.py rename pytec/{ => view}/waitingspinnerwidget.py (100%) create mode 100644 pytec/view/zero_limits_warning.py diff --git a/.gitignore b/.gitignore index ff69d57..e0a8987 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ target/ result +*.pyc \ No newline at end of file diff --git a/pytec/autotune.py b/pytec/autotune.py index c7d4dda..da5ede8 100644 --- a/pytec/autotune.py +++ b/pytec/autotune.py @@ -67,6 +67,7 @@ class PIDAutotune: def setReady(self): self._state = PIDAutotuneState.STATE_READY + self._peak_count = 0 def setOff(self): self._state = PIDAutotuneState.STATE_OFF diff --git a/pytec/model/pid_autotuner.py b/pytec/model/pid_autotuner.py new file mode 100644 index 0000000..2a0e08f --- /dev/null +++ b/pytec/model/pid_autotuner.py @@ -0,0 +1,72 @@ +from PyQt6.QtCore import QObject, pyqtSlot +from qasync import asyncSlot +from autotune import PIDAutotuneState, PIDAutotune + + +class PIDAutoTuner(QObject): + def __init__(self, parent, client, num_of_channel): + super().__init__() + + self._client = client + self.autotuners = [PIDAutotune(25) for _ in range(num_of_channel)] + self.target_temp = [20.0 for _ in range(num_of_channel)] + self.test_current = [1.0 for _ in range(num_of_channel)] + self.temp_swing = [1.5 for _ in range(num_of_channel)] + self.lookback = [3.0 for _ in range(num_of_channel)] + self.sampling_interval = [1 / 16.67 for _ in range(num_of_channel)] + + @pyqtSlot(list) + def update_sampling_interval(self, interval): + self.sampling_interval = interval + + def set_params(self, params_name, ch, val): + getattr(self, params_name)[ch] = val + + def get_state(self, ch): + return self.autotuners[ch].state() + + def load_params_and_set_ready(self, ch): + self.autotuners[ch].setParam( + self.target_temp[ch], + self.test_current[ch] / 1000, + self.temp_swing[ch], + 1 / self.sampling_interval[ch], + self.lookback[ch], + ) + self.autotuners[ch].setReady() + + async def stop_pid_from_running(self, ch): + self.autotuners[ch].setOff() + await self._client.set_param("pwm", ch, "i_set", 0) + + @asyncSlot(list) + async def tick(self, report): + for channel_report in report: + # TODO: Skip when PID Autotune or emit error message if NTC is not connected + if channel_report["temperature"] is None: + continue + + ch = channel_report["channel"] + match self.autotuners[ch].state(): + case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN: + self.autotuners[ch].run( + channel_report["temperature"], channel_report["time"] + ) + await self._client.set_param( + "pwm", ch, "i_set", self.autotuners[ch].output() + ) + case PIDAutotuneState.STATE_SUCCEEDED: + kp, ki, kd = self.autotuners[ch].get_tec_pid() + self.autotuners[ch].setOff() + + await self._client.set_param("pid", ch, "kp", kp) + await self._client.set_param("pid", ch, "ki", ki) + await self._client.set_param("pid", ch, "kd", kd) + await self._client.set_param("pwm", ch, "pid") + + await self._client.set_param( + "pid", ch, "target", self.target_temp[ch] + ) + case PIDAutotuneState.STATE_FAILED: + self.autotuners[ch].setOff() + await self._client.set_param("pwm", ch, "i_set", 0) diff --git a/pytec/model/property.py b/pytec/model/property.py new file mode 100644 index 0000000..badea1c --- /dev/null +++ b/pytec/model/property.py @@ -0,0 +1,126 @@ +# A Custom Class that allows defining a QObject Property Dynamically +# Adapted from: https://stackoverflow.com/questions/48425316/how-to-create-pyqt-properties-dynamically + +from functools import wraps + +from PyQt6.QtCore import QObject, pyqtProperty, pyqtSignal + + +class PropertyMeta(type(QObject)): + """Lets a class succinctly define Qt properties.""" + + def __new__(cls, name, bases, attrs): + for key in list(attrs.keys()): + attr = attrs[key] + if not isinstance(attr, Property): + continue + + types = {list: "QVariantList", dict: "QVariantMap"} + type_ = types.get(attr.type_, attr.type_) + + notifier = pyqtSignal(type_) + attrs[f"{key}_update"] = notifier + attrs[key] = PropertyImpl(type_=type_, name=key, notify=notifier) + + return super().__new__(cls, name, bases, attrs) + + +class Property: + """Property definition. + + Instances of this class will be replaced with their full + implementation by the PropertyMeta metaclass. + """ + + def __init__(self, type_): + self.type_ = type_ + + +class PropertyImpl(pyqtProperty): + """Property implementation: gets, sets, and notifies of change.""" + + def __init__(self, type_, name, notify): + super().__init__(type_, self.getter, self.setter, notify=notify) + self.name = name + + def getter(self, instance): + return getattr(instance, f"_{self.name}") + + def setter(self, instance, value): + signal = getattr(instance, f"{self.name}_update") + + if type(value) in {list, dict}: + value = make_notified(value, signal) + + setattr(instance, f"_{self.name}", value) + signal.emit(value) + + +class MakeNotified: + """Adds notifying signals to lists and dictionaries. + + Creates the modified classes just once, on initialization. + """ + + change_methods = { + list: [ + "__delitem__", + "__iadd__", + "__imul__", + "__setitem__", + "append", + "extend", + "insert", + "pop", + "remove", + "reverse", + "sort", + ], + dict: [ + "__delitem__", + "__ior__", + "__setitem__", + "clear", + "pop", + "popitem", + "setdefault", + "update", + ], + } + + def __init__(self): + if not hasattr(dict, "__ior__"): + # Dictionaries don't have | operator in Python < 3.9. + self.change_methods[dict].remove("__ior__") + self.notified_class = { + type_: self.make_notified_class(type_) for type_ in [list, dict] + } + + def __call__(self, seq, signal): + """Returns a notifying version of the supplied list or dict.""" + notified_class = self.notified_class[type(seq)] + notified_seq = notified_class(seq) + notified_seq.signal = signal + return notified_seq + + @classmethod + def make_notified_class(cls, parent): + notified_class = type(f"notified_{parent.__name__}", (parent,), {}) + for method_name in cls.change_methods[parent]: + original = getattr(notified_class, method_name) + notified_method = cls.make_notified_method(original, parent) + setattr(notified_class, method_name, notified_method) + return notified_class + + @staticmethod + def make_notified_method(method, parent): + @wraps(method) + def notified_method(self, *args, **kwargs): + result = getattr(parent, method.__name__)(self, *args, **kwargs) + self.signal.emit(self) + return result + + return notified_method + + +make_notified = MakeNotified() diff --git a/pytec/model/thermostat_data_model.py b/pytec/model/thermostat_data_model.py new file mode 100644 index 0000000..d1a47aa --- /dev/null +++ b/pytec/model/thermostat_data_model.py @@ -0,0 +1,138 @@ +from pytec.aioclient import Client +from PyQt6.QtCore import pyqtSignal, QObject, pyqtSlot +from qasync import asyncSlot +from model.property import Property, PropertyMeta +import asyncio +import logging + + +class WrappedClient(QObject, Client): + connection_error = pyqtSignal() + + async def _read_line(self): + try: + return await super()._read_line() + except (Exception, TimeoutError, asyncio.exceptions.TimeoutError): + logging.error("Client connection error, disconnecting", exc_info=True) + self.connection_error.emit() + + +class Thermostat(QObject, metaclass=PropertyMeta): + hw_rev = Property(dict) + fan = Property(dict) + thermistor = Property(list) + pid = Property(list) + pwm = Property(list) + postfilter = Property(list) + interval = Property(list) + report = Property(list) + info_box_trigger = pyqtSignal(str, str) + + def __init__(self, parent, client, update_s): + self._update_s = update_s + self._client = client + self._watch_task = None + self._report_mode_task = None + self._poll_for_report = True + super().__init__(parent) + + async def run(self): + self.task = asyncio.create_task(self.update_params()) + while True: + if self.task.done(): + if self.task.exception() is not None: + try: + raise self.task.exception() + except ( + Exception, + TimeoutError, + asyncio.exceptions.TimeoutError, + ): + logging.error( + "Encountered an error while updating parameter tree.", + exc_info=True, + ) + _ = self.task.result() + self.task = asyncio.create_task(self.update_params()) + await asyncio.sleep(self._update_s) + + async def get_hw_rev(self): + self.hw_rev = await self._client.hw_rev() + return self.hw_rev + + async def update_params(self): + self.fan = await self._client.get_fan() + self.pwm = await self._client.get_pwm() + if self._poll_for_report: + self.report = await self._client.report() + self.interval = [ + self.report[i]["interval"] for i in range(len(self.report)) + ] + self.pid = await self._client.get_pid() + self.thermistor = await self._client.get_steinhart_hart() + self.postfilter = await self._client.get_postfilter() + + def connected(self): + return self._client.connected + + def connecting(self): + return self._client.connecting + + def start_watching(self): + self._watch_task = asyncio.create_task(self.run()) + + @asyncSlot() + async def stop_watching(self): + if self._watch_task is not None: + await self.set_report_mode(False) + self._watch_task.cancel() + self._watch_task = None + self.task.cancel() + self.task = None + + async def set_report_mode(self, enabled: bool): + self._poll_for_report = not enabled + if enabled: + self._report_mode_task = asyncio.create_task(self.report_mode()) + else: + self._client.stop_report_mode() + + async def report_mode(self): + async for report in self._client.report_mode(): + self.report_update.emit(report) + self.interval = [ + self.report[i]["interval"] for i in range(len(self.report)) + ] + + async def disconnect(self): + await self._client.end_session() + + async def set_ipv4(self, ipv4): + await self._client.set_param("ipv4", ipv4) + + async def get_ipv4(self): + return await self._client.ipv4() + + @asyncSlot() + async def save_cfg(self, ch): + await self._client.save_config(ch) + self.info_box_trigger.emit( + "Config loaded", f"Channel {ch} Config has been loaded from flash." + ) + + @asyncSlot() + async def load_cfg(self, ch): + await self._client.load_config(ch) + self.info_box_trigger.emit( + "Config loaded", f"Channel {ch} Config has been loaded from flash." + ) + + async def dfu(self): + await self._client.dfu() + + async def reset(self): + await self._client.reset() + + @pyqtSlot(float) + def set_update_s(self, update_s): + self._update_s = update_s diff --git a/pytec/pyproject.toml b/pytec/pyproject.toml index e36fa60..73ce527 100644 --- a/pytec/pyproject.toml +++ b/pytec/pyproject.toml @@ -16,3 +16,6 @@ tec_qt = "tec_qt:main" [tool.setuptools] packages.find = {} py-modules = ["aioexample", "autotune", "example", "plot", "tec_qt", "ui_tec_qt", "waitingspinnerwidget"] + +[tool.setuptools.package-data] +"*" = ["*.*"] diff --git a/pytec/resources/artiq.ico b/pytec/resources/artiq.ico new file mode 100644 index 0000000000000000000000000000000000000000..edb222d44f14e25f253f7b3ae8ee1d0c169edc38 GIT binary patch literal 134526 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 literal 0 HcmV?d00001 diff --git a/pytec/tec_qt.py b/pytec/tec_qt.py index 8c69c76..4acd26d 100644 --- a/pytec/tec_qt.py +++ b/pytec/tec_qt.py @@ -1,332 +1,165 @@ -from PyQt6 import QtWidgets, QtGui, QtCore -from PyQt6.QtCore import pyqtSignal, QObject, QSignalBlocker, pyqtSlot -import pyqtgraph.parametertree.parameterTypes as pTypes -from pyqtgraph.parametertree import Parameter, ParameterTree, ParameterItem, registerParameterType -import pyqtgraph as pg -pg.setConfigOptions(antialias=True) -from pglive.sources.data_connector import DataConnector -from pglive.kwargs import Axis -from pglive.sources.live_plot import LiveLinePlot -from pglive.sources.live_plot_widget import LivePlotWidget -from pglive.sources.live_axis import LiveAxis -import sys -import argparse -import logging -import asyncio -from pytec.aioclient import Client, StoppedConnecting -import qasync +from view.zero_limits_warning import zero_limits_warning_view +from view.net_settings_input_diag import net_settings_input_diag +from view.thermostat_ctrl_menu import thermostat_ctrl_menu +from view.conn_menu import conn_menu +from view.plot_options_menu import plot_options_menu +from view.live_plot_view import LiveDataPlotter +from view.ctrl_panel import ctrl_panel +from view.info_box import info_box +from model.pid_autotuner import PIDAutoTuner +from model.thermostat_data_model import WrappedClient, Thermostat +import json +from autotune import PIDAutotuneState from qasync import asyncSlot, asyncClose -from autotune import PIDAutotune, PIDAutotuneState +import qasync +from pytec.aioclient import StoppedConnecting +import asyncio +import logging +import argparse +from PyQt6 import QtWidgets, QtGui, uic +from PyQt6.QtCore import QSignalBlocker, pyqtSlot +import pyqtgraph as pg +from functools import partial +import importlib.resources -# pyuic6 -x tec_qt.ui -o ui_tec_qt.py -from ui_tec_qt import Ui_MainWindow -"""Number of channels provided by the Thermostat""" -NUM_CHANNELS: int = 2 +pg.setConfigOptions(antialias=True) + def get_argparser(): - parser = argparse.ArgumentParser(description="ARTIQ master") + parser = argparse.ArgumentParser(description="Thermostat Control Panel") - parser.add_argument("--connect", default=None, action="store_true", - help="Automatically connect to the specified Thermostat in IP:port format") - parser.add_argument('IP', metavar="ip", default=None, nargs='?') - parser.add_argument('PORT', metavar="port", default=None, nargs='?') - parser.add_argument("-l", "--log", dest="logLevel", choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], - help="Set the logging level") + parser.add_argument( + "--connect", + default=None, + action="store_true", + help="Automatically connect to the specified Thermostat in IP:port format", + ) + parser.add_argument("IP", metavar="ip", default=None, nargs="?") + parser.add_argument("PORT", metavar="port", default=None, nargs="?") + parser.add_argument( + "-l", + "--log", + dest="logLevel", + choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"], + help="Set the logging level", + ) + parser.add_argument( + "-p", + "--param_tree", + default=importlib.resources.files("view").joinpath("param_tree.json"), + help="Param Tree Description JSON File", + ) return parser -class MutexParameter(pTypes.ListParameter): - """ - Mutually exclusive parameter where only one of its children is visible at a time, list selectable. - - The ordering of the list items determines which children will be visible. - """ - def __init__(self, **opts): - super().__init__(**opts) - - self.sigValueChanged.connect(self.show_chosen_child) - self.sigValueChanged.emit(self, self.opts['value']) - - def _get_param_from_value(self, value): - if isinstance(self.opts['limits'], dict): - values_list = list(self.opts['limits'].values()) - else: - values_list = self.opts['limits'] - - return self.children()[values_list.index(value)] - - @pyqtSlot(object, object) - def show_chosen_child(self, value): - for param in self.children(): - param.hide() - - child_to_show = self._get_param_from_value(value.value()) - child_to_show.show() - - if child_to_show.opts.get('triggerOnShow', None): - child_to_show.sigValueChanged.emit(child_to_show, child_to_show.value()) - - -registerParameterType('mutex', MutexParameter) - - -class WrappedClient(QObject, Client): - connection_error = pyqtSignal() - - async def _read_line(self): - try: - return await super()._read_line() - except (OSError, TimeoutError, asyncio.TimeoutError) as e: # TODO: Remove asyncio.TimeoutError in Python 3.11 - logging.error("Client connection error, disconnecting", exc_info=True) - self.connection_error.emit() - - -class ClientWatcher(QObject): - fan_update = pyqtSignal(dict) - pwm_update = pyqtSignal(list) - report_update = pyqtSignal(list) - pid_update = pyqtSignal(list) - thermistor_update = pyqtSignal(list) - postfilter_update = pyqtSignal(list) - - def __init__(self, parent, client, update_s): - self._update_s = update_s - self._client = client - self._watch_task = None - self._report_mode_task = None - self._poll_for_report = True - super().__init__(parent) - - async def run(self): - loop = asyncio.get_running_loop() - while True: - time = loop.time() - await self.update_params() - await asyncio.sleep(self._update_s - (loop.time() - time)) - - async def update_params(self): - self.fan_update.emit(await self._client.get_fan()) - self.pwm_update.emit(await self._client.get_pwm()) - if self._poll_for_report: - self.report_update.emit(await self._client.report()) - self.pid_update.emit(await self._client.get_pid()) - self.thermistor_update.emit(await self._client.get_steinhart_hart()) - self.postfilter_update.emit(await self._client.get_postfilter()) - - def start_watching(self): - self._watch_task = asyncio.create_task(self.run()) - - @pyqtSlot() - def stop_watching(self): - if self._watch_task is not None: - self._watch_task.cancel() - self._watch_task = None - - async def set_report_mode(self, enabled: bool): - self._poll_for_report = not enabled - if enabled: - self._report_mode_task = asyncio.create_task(self.report_mode()) - else: - self._client.stop_report_mode() - if self._report_mode_task is not None: - await self._report_mode_task - self._report_mode_task = None - - async def report_mode(self): - async for report in self._client.report_mode(): - self.report_update.emit(report) - - @pyqtSlot(float) - def set_update_s(self, update_s): - self._update_s = update_s - - -class ChannelGraphs: - """Manager of a channel's two graphs and their elements.""" - - """The maximum number of sample points to store.""" - DEFAULT_MAX_SAMPLES = 1000 - - def __init__(self, t_widget, i_widget): - self._t_widget = t_widget - self._i_widget = i_widget - - self._t_plot = LiveLinePlot() - self._i_plot = LiveLinePlot(name="Measured") - self._iset_plot = LiveLinePlot(name="Set", pen=pg.mkPen('r')) - - self._t_line = self._t_widget.getPlotItem().addLine(label='{value} °C') - self._t_line.setVisible(False) - self._t_setpoint_plot = LiveLinePlot() # Hack for keeping setpoint line in plot range - - for graph in t_widget, i_widget: - time_axis = LiveAxis('bottom', text="Time since Thermostat reset", **{Axis.TICK_FORMAT: Axis.DURATION}) - time_axis.showLabel() - graph.setAxisItems({'bottom': time_axis}) - - graph.add_crosshair(pg.mkPen(color='red', width=1), {'color': 'green'}) - - # Enable linking of axes in the graph widget's context menu - graph.register(graph.getPlotItem().titleLabel.text) # Slight hack getting the title - - temperature_axis = LiveAxis('left', text="Temperature", units="°C") - temperature_axis.showLabel() - t_widget.setAxisItems({'left': temperature_axis}) - - current_axis = LiveAxis('left', text="Current", units="A") - current_axis.showLabel() - i_widget.setAxisItems({'left': current_axis}) - i_widget.addLegend(brush=(50, 50, 200, 150)) - - t_widget.addItem(self._t_plot) - t_widget.addItem(self._t_setpoint_plot) - i_widget.addItem(self._i_plot) - i_widget.addItem(self._iset_plot) - - self.t_connector = DataConnector(self._t_plot, max_points=self.DEFAULT_MAX_SAMPLES) - self.t_setpoint_connector = DataConnector(self._t_setpoint_plot, max_points=1) - self.i_connector = DataConnector(self._i_plot, max_points=self.DEFAULT_MAX_SAMPLES) - self.iset_connector = DataConnector(self._iset_plot, max_points=self.DEFAULT_MAX_SAMPLES) - - self.max_samples = self.DEFAULT_MAX_SAMPLES - - def plot_append(self, report): - temperature = report['temperature'] - current = report['tec_i'] - iset = report['i_set'] - time = report['time'] - - if temperature is not None: - self.t_connector.cb_append_data_point(temperature, time) - if self._t_line.isVisible(): - self.t_setpoint_connector.cb_append_data_point(self._t_line.value(), time) - else: - self.t_setpoint_connector.cb_append_data_point(temperature, time) - if current is not None: - self.i_connector.cb_append_data_point(current, time) - self.iset_connector.cb_append_data_point(iset, time) - - def clear(self): - for connector in self.t_connector, self.i_connector, self.iset_connector: - connector.clear() - - def set_t_line(self, temp=None, visible=None): - if visible is not None: - self._t_line.setVisible(visible) - if temp is not None: - self._t_line.setValue(temp) - - # PyQtGraph normally does not update this text when the line - # is not visible, so make sure that the temperature label - # gets updated always, and doesn't stay at an old value. - self._t_line.label.setText(f"{temp} °C") - - -class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): - - """The maximum number of sample points to store.""" - DEFAULT_MAX_SAMPLES = 1000 - - """Thermostat parameters that are particular to a channel""" - THERMOSTAT_PARAMETERS = [[ - {'name': 'Temperature', 'type': 'float', 'format': '{value:.4f} °C', 'readonly': True}, - {'name': 'Current through TEC', 'type': 'float', 'suffix': 'mA', 'decimals': 6, 'readonly': True}, - {'name': 'Output Config', 'expanded': True, 'type': 'group', 'children': [ - {'name': 'Control Method', 'type': 'mutex', 'limits': ['Constant Current', 'Temperature PID'], - 'activaters': [None, ('pwm', ch, 'pid')], 'children': [ - {'name': 'Set Current', 'type': 'float', 'value': 0, 'step': 100, 'limits': (-3000, 3000), 'triggerOnShow': True, - 'decimals': 6, 'suffix': 'mA', 'param': ('pwm', ch, 'i_set')}, - {'name': 'Set Temperature', 'type': 'float', 'value': 25, 'step': 0.1, 'limits': (-273, 300), - 'format': '{value:.4f} °C', 'param': ('pid', ch, 'target')}, - ]}, - {'name': 'Limits', 'expanded': False, 'type': 'group', 'children': [ - {'name': 'Max Cooling Current', 'type': 'float', 'value': 0, 'step': 100, 'decimals': 6, 'limits': (0, 3000), - 'suffix': 'mA', 'param': ('pwm', ch, 'max_i_pos')}, - {'name': 'Max Heating Current', 'type': 'float', 'value': 0, 'step': 100, 'decimals': 6, 'limits': (0, 3000), - 'suffix': 'mA', 'param': ('pwm', ch, 'max_i_neg')}, - {'name': 'Max Voltage Difference', 'type': 'float', 'value': 0, 'step': 0.1, 'limits': (0, 5), 'siPrefix': True, - 'suffix': 'V', 'param': ('pwm', ch, 'max_v')}, - ]} - ]}, - {'name': 'Thermistor Config', 'expanded': False, 'type': 'group', 'children': [ - {'name': 'T₀', 'type': 'float', 'value': 25, 'step': 0.1, 'limits': (-100, 100), - 'format': '{value:.4f} °C', 'param': ('s-h', ch, 't0')}, - {'name': 'R₀', 'type': 'float', 'value': 10000, 'step': 1, 'siPrefix': True, 'suffix': 'Ω', - 'param': ('s-h', ch, 'r0')}, - {'name': 'B', 'type': 'float', 'value': 3950, 'step': 1, 'suffix': 'K', 'decimals': 4, 'param': ('s-h', ch, 'b')}, - {'name': 'Postfilter Rate', 'type': 'list', 'value': 16.67, 'param': ('postfilter', ch, 'rate'), - 'limits': {'Off': None, '16.67 Hz': 16.67, '20 Hz': 20.0, '21.25 Hz': 21.25, '27 Hz': 27.0}}, - ]}, - {'name': 'PID Config', 'expanded': False, 'type': 'group', 'children': [ - {'name': 'Kp', 'type': 'float', 'step': 0.1, 'suffix': '', 'param': ('pid', ch, 'kp')}, - {'name': 'Ki', 'type': 'float', 'step': 0.1, 'suffix': 'Hz', 'param': ('pid', ch, 'ki')}, - {'name': 'Kd', 'type': 'float', 'step': 0.1, 'suffix': 's', 'param': ('pid', ch, 'kd')}, - {'name': "PID Output Clamping", 'expanded': True, 'type': 'group', 'children': [ - {'name': 'Minimum', 'type': 'float', 'step': 100, 'limits': (-3000, 3000), 'decimals': 6, 'suffix': 'mA', 'param': ('pid', ch, 'output_min')}, - {'name': 'Maximum', 'type': 'float', 'step': 100, 'limits': (-3000, 3000), 'decimals': 6, 'suffix': 'mA', 'param': ('pid', ch, 'output_max')}, - ]}, - {'name': 'PID Auto Tune', 'expanded': False, 'type': 'group', 'children': [ - {'name': 'Target Temperature', 'type': 'float', 'value': 20, 'step': 0.1, 'format': '{value:.4f} °C'}, - {'name': 'Test Current', 'type': 'float', 'value': 1000, 'decimals': 6, 'step': 100, 'limits': (-3000, 3000), 'suffix': 'mA'}, - {'name': 'Temperature Swing', 'type': 'float', 'value': 1.5, 'step': 0.1, 'prefix': '±', 'format': '{value:.4f} °C'}, - {'name': 'Run', 'type': 'action', 'tip': 'Run'}, - ]}, - ]}, - {'name': 'Save to flash', 'type': 'action', 'tip': 'Save config to thermostat, applies on reset'}, - {'name': 'Load from flash', 'type': 'action', 'tip': 'Load config from flash'} - ] for ch in range(NUM_CHANNELS)] +class MainWindow(QtWidgets.QMainWindow): + NUM_CHANNELS = 2 def __init__(self, args): - super().__init__() + super(MainWindow, self).__init__() - self.setupUi(self) + ui_file_path = importlib.resources.files("view").joinpath("tec_qt.ui") + uic.loadUi(ui_file_path, self) - self.ch0_t_graph.setTitle("Channel 0 Temperature") - self.ch0_i_graph.setTitle("Channel 0 Current") - self.ch1_t_graph.setTitle("Channel 1 Temperature") - self.ch1_i_graph.setTitle("Channel 1 Current") + self.show() - self.max_samples = self.DEFAULT_MAX_SAMPLES - - self._set_up_connection_menu() - self._set_up_thermostat_menu() - self._set_up_plot_menu() + self.hw_rev_data = None + self.info_box = info_box() self.client = WrappedClient(self) self.client.connection_error.connect(self.bail) - self.client_watcher = ClientWatcher(self, self.client, self.report_refresh_spin.value()) - self.client_watcher.fan_update.connect(self.fan_update) - self.client_watcher.report_update.connect(self.update_report) - self.client_watcher.pid_update.connect(self.update_pid) - self.client_watcher.pwm_update.connect(self.update_pwm) - self.client_watcher.thermistor_update.connect(self.update_thermistor) - self.client_watcher.postfilter_update.connect(self.update_postfilter) - self.report_apply_btn.clicked.connect( - lambda: self.client_watcher.set_update_s(self.report_refresh_spin.value()) + + self.thermostat = Thermostat( + self, self.client, self.report_refresh_spin.value() ) - self.params = [ - Parameter.create(name=f"Thermostat Channel {ch} Parameters", type='group', value=ch, children=self.THERMOSTAT_PARAMETERS[ch]) - for ch in range(NUM_CHANNELS) - ] - self._set_param_tree() + self.autotuners = PIDAutoTuner(self, self.client, 2) - self.channel_graphs = [ - ChannelGraphs(getattr(self, f'ch{ch}_t_graph'), getattr(self, f'ch{ch}_i_graph')) - for ch in range(NUM_CHANNELS) - ] + def get_ctrl_panel_config(args): + with open(args.param_tree, "r") as f: + return json.load(f)["ctrl_panel"] - self.autotuners = [ - PIDAutotune(25) - for _ in range(NUM_CHANNELS) + param_tree_sigActivated_handles = [ + [ + [["Save to flash"], partial(self.thermostat.save_cfg, ch)], + [["Load from flash"], partial(self.thermostat.load_cfg, ch)], + [ + ["PID Config", "PID Auto Tune", "Run"], + partial(self.pid_auto_tune_request, ch), + ], + ] + for ch in range(self.NUM_CHANNELS) ] + self.thermostat.info_box_trigger.connect(self.info_box.display_info_box) + + self.zero_limits_warning = zero_limits_warning_view( + self.style(), self.limits_warning + ) + self.ctrl_panel_view = ctrl_panel( + [self.ch0_tree, self.ch1_tree], + get_ctrl_panel_config(args), + self.send_command, + param_tree_sigActivated_handles, + ) + self.ctrl_panel_view.set_zero_limits_warning_sig.connect( + self.zero_limits_warning.set_limits_warning + ) + + self.thermostat.fan_update.connect(self.fan_update) + self.thermostat.report_update.connect(self.ctrl_panel_view.update_report) + self.thermostat.report_update.connect(self.autotuners.tick) + self.thermostat.report_update.connect(self.pid_autotune_handler) + self.thermostat.pid_update.connect(self.ctrl_panel_view.update_pid) + self.thermostat.pwm_update.connect(self.ctrl_panel_view.update_pwm) + self.thermostat.thermistor_update.connect( + self.ctrl_panel_view.update_thermistor + ) + self.thermostat.postfilter_update.connect( + self.ctrl_panel_view.update_postfilter + ) + self.thermostat.interval_update.connect( + self.autotuners.update_sampling_interval + ) + self.report_apply_btn.clicked.connect( + lambda: self.thermostat.set_update_s(self.report_refresh_spin.value()) + ) + + self.channel_graphs = LiveDataPlotter( + [ + [getattr(self, f"ch{ch}_t_graph"), getattr(self, f"ch{ch}_i_graph")] + for ch in range(self.NUM_CHANNELS) + ] + ) + + self.thermostat.report_update.connect(self.channel_graphs.update_report) + self.thermostat.pid_update.connect(self.channel_graphs.update_pid) + + self.plot_options_menu = plot_options_menu() + self.plot_options_menu.clear.triggered.connect(self.clear_graphs) + self.plot_options_menu.samples_spinbox.valueChanged.connect( + self.channel_graphs.set_max_samples + ) + self.plot_settings.setMenu(self.plot_options_menu) + + self.conn_menu = conn_menu() + self.connect_btn.setMenu(self.conn_menu) + + self.thermostat_ctrl_menu = thermostat_ctrl_menu(self.style()) + self.thermostat_ctrl_menu.fan_set_act.connect(self.fan_set_request) + self.thermostat_ctrl_menu.fan_auto_set_act.connect(self.fan_auto_set_request) + self.thermostat_ctrl_menu.reset_act.connect(self.reset_request) + self.thermostat_ctrl_menu.dfu_act.connect(self.dfu_request) + self.thermostat_ctrl_menu.save_cfg_act.connect(self.save_cfg_request) + self.thermostat_ctrl_menu.load_cfg_act.connect(self.load_cfg_request) + self.thermostat_ctrl_menu.net_cfg_act.connect(self.net_settings_request) + + self.thermostat.hw_rev_update.connect(self.thermostat_ctrl_menu.hw_rev) + self.thermostat_settings.setMenu(self.thermostat_ctrl_menu) self.loading_spinner.hide() - self.hw_rev_data = None - if args.connect: if args.IP: self.host_set_line.setText(args.IP) @@ -334,365 +167,97 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): self.port_set_spin.setValue(int(args.PORT)) self.connect_btn.click() - def _set_up_connection_menu(self): - self.connection_menu = QtWidgets.QMenu() - self.connection_menu.setTitle('Connection Settings') - - self.host_set_line = QtWidgets.QLineEdit() - self.host_set_line.setMinimumSize(QtCore.QSize(160, 0)) - self.host_set_line.setMaximumSize(QtCore.QSize(160, 16777215)) - self.host_set_line.setMaxLength(15) - self.host_set_line.setClearButtonEnabled(True) - - def connect_on_enter_press(): - self.connect_btn.click() - self.connection_menu.hide() - self.host_set_line.returnPressed.connect(connect_on_enter_press) - - self.host_set_line.setText("192.168.1.26") - self.host_set_line.setPlaceholderText("IP for the Thermostat") - - host = QtWidgets.QWidgetAction(self.connection_menu) - host.setDefaultWidget(self.host_set_line) - self.connection_menu.addAction(host) - self.connection_menu.host = host - - self.port_set_spin = QtWidgets.QSpinBox() - self.port_set_spin.setMinimumSize(QtCore.QSize(70, 0)) - self.port_set_spin.setMaximumSize(QtCore.QSize(70, 16777215)) - self.port_set_spin.setMaximum(65535) - self.port_set_spin.setValue(23) - - def connect_only_if_enter_pressed(): - if not self.port_set_spin.hasFocus(): # Don't connect if the spinbox only lost focus - return; - connect_on_enter_press() - self.port_set_spin.editingFinished.connect(connect_only_if_enter_pressed) - - port = QtWidgets.QWidgetAction(self.connection_menu) - port.setDefaultWidget(self.port_set_spin) - self.connection_menu.addAction(port) - self.connection_menu.port = port - - self.exit_button = QtWidgets.QPushButton() - self.exit_button.setText("Exit GUI") - self.exit_button.pressed.connect(QtWidgets.QApplication.instance().quit) - - exit_action = QtWidgets.QWidgetAction(self.exit_button) - exit_action.setDefaultWidget(self.exit_button) - self.connection_menu.addAction(exit_action) - self.connection_menu.exit_action = exit_action - - self.connect_btn.setMenu(self.connection_menu) - - def _set_up_thermostat_menu(self): - self.thermostat_menu = QtWidgets.QMenu() - self.thermostat_menu.setTitle('Thermostat settings') - - self.fan_group = QtWidgets.QWidget() - self.fan_group.setEnabled(False) - self.fan_group.setMinimumSize(QtCore.QSize(40, 0)) - self.fan_layout = QtWidgets.QHBoxLayout(self.fan_group) - self.fan_layout.setSpacing(9) - self.fan_lbl = QtWidgets.QLabel(parent=self.fan_group) - self.fan_lbl.setMinimumSize(QtCore.QSize(40, 0)) - self.fan_lbl.setMaximumSize(QtCore.QSize(40, 16777215)) - self.fan_lbl.setBaseSize(QtCore.QSize(40, 0)) - self.fan_layout.addWidget(self.fan_lbl) - self.fan_power_slider = QtWidgets.QSlider(parent=self.fan_group) - self.fan_power_slider.setMinimumSize(QtCore.QSize(200, 0)) - self.fan_power_slider.setMaximumSize(QtCore.QSize(200, 16777215)) - self.fan_power_slider.setBaseSize(QtCore.QSize(200, 0)) - self.fan_power_slider.setRange(1, 100) - self.fan_power_slider.setOrientation(QtCore.Qt.Orientation.Horizontal) - self.fan_layout.addWidget(self.fan_power_slider) - self.fan_auto_box = QtWidgets.QCheckBox(parent=self.fan_group) - self.fan_auto_box.setMinimumSize(QtCore.QSize(70, 0)) - self.fan_auto_box.setMaximumSize(QtCore.QSize(70, 16777215)) - self.fan_layout.addWidget(self.fan_auto_box) - self.fan_pwm_warning = QtWidgets.QLabel(parent=self.fan_group) - self.fan_pwm_warning.setMinimumSize(QtCore.QSize(16, 0)) - self.fan_layout.addWidget(self.fan_pwm_warning) - - self.fan_power_slider.valueChanged.connect(self.fan_set) - self.fan_auto_box.stateChanged.connect(self.fan_auto_set) - - self.fan_lbl.setToolTip("Adjust the fan") - self.fan_lbl.setText("Fan:") - self.fan_auto_box.setText("Auto") - - fan = QtWidgets.QWidgetAction(self.thermostat_menu) - fan.setDefaultWidget(self.fan_group) - self.thermostat_menu.addAction(fan) - self.thermostat_menu.fan = fan - - @asyncSlot(bool) - async def reset_thermostat(_): - await self._on_connection_changed(False) - await self.client.reset() - await asyncio.sleep(0.1) # Wait for the reset to start - - self.connect_btn.click() # Reconnect - - self.actionReset.triggered.connect(reset_thermostat) - self.thermostat_menu.addAction(self.actionReset) - - @asyncSlot(bool) - async def dfu_mode(_): - await self._on_connection_changed(False) - await self.client.dfu() - - # TODO: add a firmware flashing GUI? - - self.actionEnter_DFU_Mode.triggered.connect(dfu_mode) - self.thermostat_menu.addAction(self.actionEnter_DFU_Mode) - - @asyncSlot(bool) - async def network_settings(_): - ask_network = QtWidgets.QInputDialog(self) - ask_network.setWindowTitle("Network Settings") - ask_network.setLabelText("Set the Thermostat's IPv4 address, netmask and gateway (optional)") - ask_network.setTextValue((await self.client.ipv4())['addr']) - - @pyqtSlot(str) - def set_ipv4(ipv4_settings): - sure = QtWidgets.QMessageBox(self) - sure.setWindowTitle("Set network?") - sure.setText(f"Setting this as network and disconnecting:
{ipv4_settings}") - - @asyncSlot(object) - async def really_set(button): - await self.client.set_param("ipv4", ipv4_settings) - await self.client.disconnect() - - await self._on_connection_changed(False) - - sure.buttonClicked.connect(really_set) - sure.show() - ask_network.textValueSelected.connect(set_ipv4) - ask_network.show() - - self.actionNetwork_Settings.triggered.connect(network_settings) - self.thermostat_menu.addAction(self.actionNetwork_Settings) - - @asyncSlot(bool) - async def load(_): - await self.client.load_config() - loaded = QtWidgets.QMessageBox(self) - loaded.setWindowTitle("Config loaded") - loaded.setText(f"All channel configs have been loaded from flash.") - loaded.setIcon(QtWidgets.QMessageBox.Icon.Information) - loaded.show() - - self.actionLoad_all_configs.triggered.connect(load) - self.thermostat_menu.addAction(self.actionLoad_all_configs) - - @asyncSlot(bool) - async def save(_): - await self.client.save_config() - saved = QtWidgets.QMessageBox(self) - saved.setWindowTitle("Config saved") - saved.setText(f"All channel configs have been saved to flash.") - saved.setIcon(QtWidgets.QMessageBox.Icon.Information) - saved.show() - - self.actionSave_all_configs.triggered.connect(save) - self.thermostat_menu.addAction(self.actionSave_all_configs) - - def about_thermostat(): - QtWidgets.QMessageBox.about( - self, - "About Thermostat", - f""" -

Sinara 8451 Thermostat v{self.hw_rev_data['rev']['major']}.{self.hw_rev_data['rev']['minor']}

- -
- -

Settings:

- Default fan curve: - a = {self.hw_rev_data['settings']['fan_k_a']}, - b = {self.hw_rev_data['settings']['fan_k_b']}, - c = {self.hw_rev_data['settings']['fan_k_c']} -
- Fan PWM range: - {self.hw_rev_data['settings']['min_fan_pwm']} \u2013 {self.hw_rev_data['settings']['max_fan_pwm']} -
- Fan PWM frequency: {self.hw_rev_data['settings']['fan_pwm_freq_hz']} Hz -
- Fan available: {self.hw_rev_data['settings']['fan_available']} -
- Fan PWM recommended: {self.hw_rev_data['settings']['fan_pwm_recommended']} - """ - ) - - self.actionAbout_Thermostat.triggered.connect(about_thermostat) - self.thermostat_menu.addAction(self.actionAbout_Thermostat) - - self.thermostat_settings.setMenu(self.thermostat_menu) - - def _set_up_plot_menu(self): - self.plot_menu = QtWidgets.QMenu() - self.plot_menu.setTitle("Plot Settings") - - clear = QtGui.QAction("Clear graphs", self.plot_menu) - clear.triggered.connect(self.clear_graphs) - self.plot_menu.addAction(clear) - self.plot_menu.clear = clear - - self.samples_spinbox = QtWidgets.QSpinBox() - self.samples_spinbox.setRange(2, 100000) - self.samples_spinbox.setSuffix(' samples') - self.samples_spinbox.setValue(self.max_samples) - self.samples_spinbox.valueChanged.connect(self.set_max_samples) - - limit_samples = QtWidgets.QWidgetAction(self.plot_menu) - limit_samples.setDefaultWidget(self.samples_spinbox) - self.plot_menu.addAction(limit_samples) - self.plot_menu.limit_samples = limit_samples - - self.plot_settings.setMenu(self.plot_menu) - - @pyqtSlot(list) - def set_limits_warning(self, channels_zeroed_limits: list): - channel_disabled = [False, False] - - report_str = "The following output limit(s) are set to zero:\n" - for ch, zeroed_limits in enumerate(channels_zeroed_limits): - if {'max_i_pos', 'max_i_neg'}.issubset(zeroed_limits): - report_str += "Max Cooling Current, Max Heating Current" - channel_disabled[ch] = True - - if 'max_v' in zeroed_limits: - if channel_disabled[ch]: - report_str += ", " - report_str += "Max Voltage Difference" - channel_disabled[ch] = True - - if channel_disabled[ch]: - report_str += f" for Channel {ch}\n" - - report_str += "\nThese limit(s) are restricting the channel(s) from producing current." - - if True in channel_disabled: - pixmapi = getattr(QtWidgets.QStyle.StandardPixmap, "SP_MessageBoxWarning") - icon = self.style().standardIcon(pixmapi) - self.limits_warning.setPixmap(icon.pixmap(16, 16)) - self.limits_warning.setToolTip(report_str) - else: - self.limits_warning.setPixmap(QtGui.QPixmap()) - self.limits_warning.setToolTip(None) - - @pyqtSlot(int) - def set_max_samples(self, samples: int): - for channel_graph in self.channel_graphs: - channel_graph.t_connector.max_points = samples - channel_graph.i_connector.max_points = samples - channel_graph.iset_connector.max_points = samples - def clear_graphs(self): - for channel_graph in self.channel_graphs: - channel_graph.clear() + self.channel_graphs.clear_graphs() async def _on_connection_changed(self, result): self.graph_group.setEnabled(result) self.report_group.setEnabled(result) self.thermostat_settings.setEnabled(result) - self.host_set_line.setEnabled(not result) - self.port_set_spin.setEnabled(not result) + self.conn_menu.host_set_line.setEnabled(not result) + self.conn_menu.port_set_spin.setEnabled(not result) self.connect_btn.setText("Disconnect" if result else "Connect") if result: - self.hw_rev_data = await self.client.hw_rev() + self.hw_rev_data = await self.thermostat.get_hw_rev() + logging.debug(self.hw_rev_data) + self._status(self.hw_rev_data) - self.client_watcher.start_watching() - # await self.client.set_param("fan", 1) + self.thermostat.start_watching() else: self.status_lbl.setText("Disconnected") - self.fan_pwm_warning.setPixmap(QtGui.QPixmap()) - self.fan_pwm_warning.setToolTip("") + self.background_task_lbl.setText("Ready.") + self.loading_spinner.hide() + self.loading_spinner.stop() + self.thermostat_ctrl_menu.fan_pwm_warning.setPixmap(QtGui.QPixmap()) + self.thermostat_ctrl_menu.fan_pwm_warning.setToolTip("") self.clear_graphs() self.report_box.setChecked(False) - await self.client_watcher.set_report_mode(False) - self.client_watcher.stop_watching() - self.status_lbl.setText("Disconnected") - - def _set_fan_pwm_warning(self): - if self.fan_power_slider.value() != 100: - pixmapi = getattr(QtWidgets.QStyle.StandardPixmap, "SP_MessageBoxWarning") - icon = self.style().standardIcon(pixmapi) - self.fan_pwm_warning.setPixmap(icon.pixmap(16, 16)) - self.fan_pwm_warning.setToolTip("Throttling the fan (not recommended on this hardware rev)") - else: - self.fan_pwm_warning.setPixmap(QtGui.QPixmap()) - self.fan_pwm_warning.setToolTip("") + if not Thermostat.connecting or Thermostat.connected: + for ch in range(self.NUM_CHANNELS): + if self.autotuners.get_state(ch) != PIDAutotuneState.STATE_OFF: + await self.autotuners.stop_pid_from_running(ch) + await self.thermostat.set_report_mode(False) + self.thermostat.stop_watching() def _status(self, hw_rev_d: dict): logging.debug(hw_rev_d) - self.status_lbl.setText(f"Connected to Thermostat v{hw_rev_d['rev']['major']}.{hw_rev_d['rev']['minor']}") - self.fan_group.setEnabled(hw_rev_d["settings"]["fan_available"]) + self.status_lbl.setText( + f"Connected to Thermostat v{hw_rev_d['rev']['major']}.{hw_rev_d['rev']['minor']}" + ) - @pyqtSlot(dict) - def fan_update(self, fan_settings: dict): + @pyqtSlot("QVariantMap") + def fan_update(self, fan_settings): logging.debug(fan_settings) if fan_settings is None: return - with QSignalBlocker(self.fan_power_slider): - self.fan_power_slider.setValue(fan_settings["fan_pwm"] or 100) # 0 = PWM off = full strength - with QSignalBlocker(self.fan_auto_box): - self.fan_auto_box.setChecked(fan_settings["auto_mode"]) + with QSignalBlocker(self.thermostat_ctrl_menu.fan_power_slider): + self.thermostat_ctrl_menu.fan_power_slider.setValue( + fan_settings["fan_pwm"] or 100 + ) # 0 = PWM off = full strength + with QSignalBlocker(self.thermostat_ctrl_menu.fan_auto_box): + self.thermostat_ctrl_menu.fan_auto_box.setChecked(fan_settings["auto_mode"]) if not self.hw_rev_data["settings"]["fan_pwm_recommended"]: - self._set_fan_pwm_warning() - - @asyncSlot(int) - async def fan_set(self, value): - if not self.client.connected(): - return - if self.fan_auto_box.isChecked(): - with QSignalBlocker(self.fan_auto_box): - self.fan_auto_box.setChecked(False) - await self.client.set_fan(value) - if not self.hw_rev_data["settings"]["fan_pwm_recommended"]: - self._set_fan_pwm_warning() - - @asyncSlot(int) - async def fan_auto_set(self, enabled): - if not self.client.connected(): - return - if enabled: - await self.client.set_fan("auto") - self.fan_update(await self.client.get_fan()) - else: - await self.client.set_fan(self.fan_power_slider.value()) + self.thermostat_ctrl_menu.set_fan_pwm_warning() @asyncSlot(int) async def on_report_box_stateChanged(self, enabled): - await self.client_watcher.set_report_mode(enabled) + await self.thermostat.set_report_mode(enabled) @asyncClose async def closeEvent(self, event): - await self.bail() + try: + await self.bail() + except: + pass @asyncSlot() async def on_connect_btn_clicked(self): - host, port = self.host_set_line.text(), self.port_set_spin.value() + host, port = ( + self.conn_menu.host_set_line.text(), + self.conn_menu.port_set_spin.value(), + ) try: if not (self.client.connecting() or self.client.connected()): self.status_lbl.setText("Connecting...") self.connect_btn.setText("Stop") - self.host_set_line.setEnabled(False) - self.port_set_spin.setEnabled(False) + self.conn_menu.host_set_line.setEnabled(False) + self.conn_menu.port_set_spin.setEnabled(False) try: - await self.client.start_session(host=host, port=port, timeout=30) + await self.client.start_session(host=host, port=port, timeout=5) except StoppedConnecting: return await self._on_connection_changed(True) else: await self.bail() - except (OSError, TimeoutError, asyncio.TimeoutError) as e: # TODO: Remove asyncio.TimeoutError in Python 3.11 - logging.error(f"Failed communicating to {host}:{port}: {e}") - await self.bail() + # TODO: Remove asyncio.TimeoutError in Python 3.11 + except (OSError, TimeoutError, asyncio.TimeoutError): + try: + await self.bail() + except ConnectionResetError: + pass @asyncSlot() async def bail(self): @@ -702,181 +267,146 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): @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 change == "value": if inner_param.opts.get("param", None) is not None: - if 'Current' in inner_param.name(): - data /= 1000 # Given in mA + if inner_param.opts.get("suffix", None) == "mA": + data /= 1000 # Given in mA thermostat_param = inner_param.opts["param"] - if inner_param.name() == 'Postfilter Rate' and data == None: - set_param_args = (*thermostat_param[:2], 'off') + 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.client.set_param(*set_param_args) - if inner_param.opts.get('activaters', None) is not None: - activater = inner_param.opts['activaters'][inner_param.opts['limits'].index(data)] + 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.client.set_param(*activater) + @asyncSlot() + async def pid_auto_tune_request(self, ch=0): + match self.autotuners.get_state(ch): + case PIDAutotuneState.STATE_OFF | PIDAutotuneState.STATE_FAILED: + self.autotuners.load_params_and_set_ready(ch) - def _set_param_tree(self): - for i, tree in enumerate((self.ch0_tree, self.ch1_tree)): - tree.setHeaderHidden(True) - tree.setParameters(self.params[i], showTop=False) - self.params[i].sigTreeStateChanged.connect(self.send_command) - - @asyncSlot() - async def save(_, ch=i): - await self.client.save_config(ch) - saved = QtWidgets.QMessageBox(self) - saved.setWindowTitle("Config saved") - saved.setText(f"Channel {ch} Config has been saved to flash.") - saved.setIcon(QtWidgets.QMessageBox.Icon.Information) - saved.show() - - self.params[i].child('Save to flash').sigActivated.connect(save) - - @asyncSlot() - async def load(_, ch=i): - await self.client.load_config(ch) - loaded = QtWidgets.QMessageBox(self) - loaded.setWindowTitle("Config loaded") - loaded.setText(f"Channel {ch} Config has been loaded from flash.") - loaded.setIcon(QtWidgets.QMessageBox.Icon.Information) - loaded.show() - - self.params[i].child('Load from flash').sigActivated.connect(load) - - @asyncSlot() - async def autotune(param, ch=i): - match self.autotuners[ch].state(): - case PIDAutotuneState.STATE_OFF: - self.autotuners[ch].setParam( - param.parent().child('Target Temperature').value(), - param.parent().child('Test Current').value() / 1000, - param.parent().child('Temperature Swing').value(), - self.report_refresh_spin.value(), - 3) - self.autotuners[ch].setReady() - param.setOpts(title="Stop") - self.client_watcher.report_update.connect(self.autotune_tick) - self.loading_spinner.show() - self.loading_spinner.start() - if self.autotuners[1 - ch].state() == PIDAutotuneState.STATE_OFF: - self.background_task_lbl.setText("Autotuning channel {ch}...".format(ch=ch)) - else: - self.background_task_lbl.setText("Autotuning channel 0 and 1...") - case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN: - self.autotuners[ch].setOff() - param.setOpts(title="Run") - await self.client.set_param('pwm', ch, 'i_set', 0) - self.client_watcher.report_update.disconnect(self.autotune_tick) - if self.autotuners[1 - ch].state() == PIDAutotuneState.STATE_OFF: - self.background_task_lbl.setText("Ready.") - self.loading_spinner.stop() - self.loading_spinner.hide() - else: - self.background_task_lbl.setText("Autotuning channel {ch}...".format(ch=1-ch)) - - self.params[i].child('PID Config', 'PID Auto Tune', 'Run').sigActivated.connect(autotune) + case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN: + await self.autotuners.stop_pid_from_running(ch) + # To Update the UI elements + self.pid_autotune_handler([]) @asyncSlot(list) - async def autotune_tick(self, report): - for channel_report in report: - channel = channel_report['channel'] - match self.autotuners[channel].state(): + async def pid_autotune_handler(self, _): + ch_tuning = [] + for ch in range(self.NUM_CHANNELS): + match self.autotuners.get_state(ch): + case PIDAutotuneState.STATE_OFF: + self.ctrl_panel_view.change_params_title( + ch, ("PID Config", "PID Auto Tune", "Run"), "Run" + ) case PIDAutotuneState.STATE_READY | PIDAutotuneState.STATE_RELAY_STEP_UP | PIDAutotuneState.STATE_RELAY_STEP_DOWN: - self.autotuners[channel].run(channel_report['temperature'], channel_report['time']) - await self.client.set_param('pwm', channel, 'i_set', self.autotuners[channel].output()) + self.ctrl_panel_view.change_params_title( + ch, ("PID Config", "PID Auto Tune", "Run"), "Stop" + ) + ch_tuning.append(ch) + case PIDAutotuneState.STATE_SUCCEEDED: - kp, ki, kd = self.autotuners[channel].get_tec_pid() - self.autotuners[channel].setOff() - self.params[channel].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run") - await self.client.set_param('pid', channel, 'kp', kp) - await self.client.set_param('pid', channel, 'ki', ki) - await self.client.set_param('pid', channel, 'kd', kd) - await self.client.set_param('pwm', channel, 'pid') - await self.client.set_param('pid', channel, 'target', self.params[channel].child("PID Config", "PID Auto Tune", "Target Temperature").value()) - self.client_watcher.report_update.disconnect(self.autotune_tick) - if self.autotuners[1 - channel].state() == PIDAutotuneState.STATE_OFF: - self.background_task_lbl.setText("Ready.") - self.loading_spinner.stop() - self.loading_spinner.hide() - else: - self.background_task_lbl.setText("Autotuning channel {ch}...".format(ch=1-ch)) + self.info_box.display_info_box( + "PID Autotune Success", + f"Channel {ch} PID Config has been loaded to Thermostat. Regulating temperature.", + ) + self.info_box.show() + case PIDAutotuneState.STATE_FAILED: - self.autotuners[channel].setOff() - self.params[channel].child('PID Config', 'PID Auto Tune', 'Run').setOpts(title="Run") - await self.client.set_param('pwm', channel, 'i_set', 0) - self.client_watcher.report_update.disconnect(self.autotune_tick) - if self.autotuners[1 - channel].state() == PIDAutotuneState.STATE_OFF: - self.background_task_lbl.setText("Ready.") - self.loading_spinner.stop() - self.loading_spinner.hide() - else: - self.background_task_lbl.setText("Autotuning channel {ch}...".format(ch=1-ch)) + self.info_box.display_info_box( + "PID Autotune Failed", f"Channel {ch} PID Autotune is failed." + ) + self.info_box.show() - @pyqtSlot(list) - def update_pid(self, pid_settings): - for settings in pid_settings: - channel = settings["channel"] - with QSignalBlocker(self.params[channel]): - self.params[channel].child("PID Config", "Kp").setValue(settings["parameters"]["kp"]) - self.params[channel].child("PID Config", "Ki").setValue(settings["parameters"]["ki"]) - self.params[channel].child("PID Config", "Kd").setValue(settings["parameters"]["kd"]) - self.params[channel].child("PID Config", "PID Output Clamping", "Minimum").setValue(settings["parameters"]["output_min"] * 1000) - self.params[channel].child("PID Config", "PID Output Clamping", "Maximum").setValue(settings["parameters"]["output_max"] * 1000) - self.params[channel].child("Output Config", "Control Method", "Set Temperature").setValue(settings["target"]) - self.channel_graphs[channel].set_t_line(temp=round(settings["target"], 6)) + if len(ch_tuning) == 0: + self.background_task_lbl.setText("Ready.") + self.loading_spinner.hide() + self.loading_spinner.stop() + else: + self.background_task_lbl.setText( + "Autotuning channel {ch}...".format(ch=ch_tuning) + ) + self.loading_spinner.start() + self.loading_spinner.show() - @pyqtSlot(list) - def update_report(self, report_data): - for settings in report_data: - channel = settings["channel"] - self.channel_graphs[channel].plot_append(settings) - with QSignalBlocker(self.params[channel]): - self.params[channel].child("Output Config", "Control Method").setValue("Temperature PID" if settings["pid_engaged"] else "Constant Current") - self.channel_graphs[channel].set_t_line(visible=settings['pid_engaged']) - self.params[channel].child("Output Config", "Control Method", "Set Current").setValue(settings["i_set"] * 1000) - if settings['temperature'] is not None: - self.params[channel].child("Temperature").setValue(settings['temperature']) - if settings['tec_i'] is not None: - self.params[channel].child("Current through TEC").setValue(settings['tec_i'] * 1000) + @asyncSlot(int) + async def fan_set_request(self, value): + if not self.client.connected(): + return + if self.thermostat_ctrl_menu.fan_auto_box.isChecked(): + with QSignalBlocker(self.thermostat_ctrl_menu.fan_auto_box): + self.thermostat_ctrl_menu.fan_auto_box.setChecked(False) + await self.client.set_fan(value) + if not self.hw_rev_data["settings"]["fan_pwm_recommended"]: + self.thermostat_ctrl_menu.set_fan_pwm_warning() - @pyqtSlot(list) - def update_thermistor(self, sh_data): - for sh_param in sh_data: - channel = sh_param["channel"] - with QSignalBlocker(self.params[channel]): - self.params[channel].child("Thermistor Config", "T₀").setValue(sh_param["params"]["t0"] - 273.15) - self.params[channel].child("Thermistor Config", "R₀").setValue(sh_param["params"]["r0"]) - self.params[channel].child("Thermistor Config", "B").setValue(sh_param["params"]["b"]) + @asyncSlot(int) + async def fan_auto_set_request(self, enabled): + if not self.client.connected(): + return + if enabled: + await self.client.set_fan("auto") + self.fan_update(await self.client.get_fan()) + else: + await self.client.set_fan( + self.thermostat_ctrl_menu.fan_power_slider.value() + ) - @pyqtSlot(list) - def update_pwm(self, pwm_data): - channels_zeroed_limits = [set() for i in range(NUM_CHANNELS)] + @asyncSlot(int) + async def save_cfg_request(self, ch): + await self.thermostat.save_cfg(str(ch)) - for pwm_params in pwm_data: - channel = pwm_params["channel"] - with QSignalBlocker(self.params[channel]): - self.params[channel].child("Output Config", "Limits", "Max Voltage Difference").setValue(pwm_params["max_v"]["value"]) - self.params[channel].child("Output Config", "Limits", "Max Cooling Current").setValue(pwm_params["max_i_pos"]["value"] * 1000) - self.params[channel].child("Output Config", "Limits", "Max Heating Current").setValue(pwm_params["max_i_neg"]["value"] * 1000) + @asyncSlot(int) + async def load_cfg_request(self, ch): + await self.thermostat.load_cfg(str(ch)) - for limit in "max_i_pos", "max_i_neg", "max_v": - if pwm_params[limit]["value"] == 0.0: - channels_zeroed_limits[channel].add(limit) + @asyncSlot(bool) + async def dfu_request(self, _): + await self._on_connection_changed(False) + await self.thermostat.dfu() - self.set_limits_warning(channels_zeroed_limits) + @asyncSlot(bool) + async def reset_request(self, _): + await self._on_connection_changed(False) + await self.thermostat.reset() + await asyncio.sleep(0.1) # Wait for the reset to start - @pyqtSlot(list) - def update_postfilter(self, postfilter_data): - for postfilter_params in postfilter_data: - channel = postfilter_params["channel"] - with QSignalBlocker(self.params[channel]): - self.params[channel].child("Thermistor Config", "Postfilter Rate").setValue(postfilter_params["rate"]) + self.connect_btn.click() # Reconnect + + @asyncSlot(bool) + async def net_settings_request(self, _): + ipv4 = await self.thermostat.get_ipv4() + self.net_settings_input_diag = net_settings_input_diag(ipv4["addr"]) + self.net_settings_input_diag.set_ipv4_act.connect(self.set_net_settings_request) + + @asyncSlot(str) + async def set_net_settings_request(self, ipv4_settings): + await self.thermostat.set_ipv4(ipv4_settings) + await self.thermostat._client.end_session() + await self._on_connection_changed(False) async def coro_main(): @@ -888,6 +418,9 @@ async def coro_main(): app = QtWidgets.QApplication.instance() app.aboutToQuit.connect(app_quit_event.set) + app.setWindowIcon( + QtGui.QIcon(str(importlib.resources.files("resources").joinpath("artiq.ico"))) + ) main_window = MainWindow(args) main_window.show() @@ -899,5 +432,5 @@ def main(): qasync.run(coro_main()) -if __name__ == '__main__': +if __name__ == "__main__": main() diff --git a/pytec/thermostat-icon-640x640.png b/pytec/thermostat-icon-640x640.png deleted file mode 100644 index 12037a6e23633faf9dbc9d1349f2322a3771c64b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 250092 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�Sv@k+^gBDG{+jTQLw+tusY?xZ2j_z} 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 T#L*l4?^m)?pCzlrzXbmu_+fU8 diff --git a/pytec/ui_tec_qt.py b/pytec/ui_tec_qt.py deleted file mode 100644 index c7c2a5a..0000000 --- a/pytec/ui_tec_qt.py +++ /dev/null @@ -1,268 +0,0 @@ -# Form implementation generated from reading ui file 'tec_qt.ui' -# -# Created by: PyQt6 UI code generator 6.5.2 -# -# WARNING: Any manual changes made to this file will be lost when pyuic6 is -# run again. Do not edit this file unless you know what you are doing. - - -from PyQt6 import QtCore, QtGui, QtWidgets - - -class Ui_MainWindow(object): - def setupUi(self, MainWindow): - MainWindow.setObjectName("MainWindow") - MainWindow.resize(1280, 720) - MainWindow.setMinimumSize(QtCore.QSize(1280, 720)) - MainWindow.setMaximumSize(QtCore.QSize(3840, 2160)) - icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap("thermostat-icon-640x640.png"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) - MainWindow.setWindowIcon(icon) - self.main_widget = QtWidgets.QWidget(parent=MainWindow) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(1) - sizePolicy.setVerticalStretch(1) - sizePolicy.setHeightForWidth(self.main_widget.sizePolicy().hasHeightForWidth()) - self.main_widget.setSizePolicy(sizePolicy) - self.main_widget.setObjectName("main_widget") - self.gridLayout_2 = QtWidgets.QGridLayout(self.main_widget) - self.gridLayout_2.setContentsMargins(3, 3, 3, 3) - self.gridLayout_2.setSpacing(3) - self.gridLayout_2.setObjectName("gridLayout_2") - self.main_layout = QtWidgets.QVBoxLayout() - self.main_layout.setSpacing(0) - self.main_layout.setObjectName("main_layout") - self.graph_group = QtWidgets.QFrame(parent=self.main_widget) - self.graph_group.setEnabled(False) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(1) - sizePolicy.setVerticalStretch(1) - sizePolicy.setHeightForWidth(self.graph_group.sizePolicy().hasHeightForWidth()) - self.graph_group.setSizePolicy(sizePolicy) - self.graph_group.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.graph_group.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.graph_group.setObjectName("graph_group") - self.graphs_layout = QtWidgets.QGridLayout(self.graph_group) - self.graphs_layout.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetDefaultConstraint) - self.graphs_layout.setContentsMargins(3, 3, 3, 3) - self.graphs_layout.setSpacing(2) - self.graphs_layout.setObjectName("graphs_layout") - self.ch1_tree = ParameterTree(parent=self.graph_group) - self.ch1_tree.setObjectName("ch1_tree") - self.graphs_layout.addWidget(self.ch1_tree, 1, 0, 1, 1) - self.ch0_tree = ParameterTree(parent=self.graph_group) - self.ch0_tree.setObjectName("ch0_tree") - self.graphs_layout.addWidget(self.ch0_tree, 0, 0, 1, 1) - self.ch1_t_graph = LivePlotWidget(parent=self.graph_group) - self.ch1_t_graph.setObjectName("ch1_t_graph") - self.graphs_layout.addWidget(self.ch1_t_graph, 1, 1, 1, 1) - self.ch0_t_graph = LivePlotWidget(parent=self.graph_group) - self.ch0_t_graph.setObjectName("ch0_t_graph") - self.graphs_layout.addWidget(self.ch0_t_graph, 0, 1, 1, 1) - self.ch0_i_graph = LivePlotWidget(parent=self.graph_group) - self.ch0_i_graph.setObjectName("ch0_i_graph") - self.graphs_layout.addWidget(self.ch0_i_graph, 0, 2, 1, 1) - self.ch1_i_graph = LivePlotWidget(parent=self.graph_group) - self.ch1_i_graph.setObjectName("ch1_i_graph") - self.graphs_layout.addWidget(self.ch1_i_graph, 1, 2, 1, 1) - self.graphs_layout.setColumnMinimumWidth(0, 100) - self.graphs_layout.setColumnMinimumWidth(1, 100) - self.graphs_layout.setColumnMinimumWidth(2, 100) - self.graphs_layout.setRowMinimumHeight(0, 100) - self.graphs_layout.setRowMinimumHeight(1, 100) - self.graphs_layout.setColumnStretch(0, 1) - self.graphs_layout.setColumnStretch(1, 1) - self.graphs_layout.setColumnStretch(2, 1) - self.graphs_layout.setRowStretch(0, 1) - self.graphs_layout.setRowStretch(1, 1) - self.main_layout.addWidget(self.graph_group) - self.bottom_settings_group = QtWidgets.QFrame(parent=self.main_widget) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.bottom_settings_group.sizePolicy().hasHeightForWidth()) - self.bottom_settings_group.setSizePolicy(sizePolicy) - self.bottom_settings_group.setMinimumSize(QtCore.QSize(0, 40)) - self.bottom_settings_group.setMaximumSize(QtCore.QSize(16777215, 40)) - self.bottom_settings_group.setFrameShape(QtWidgets.QFrame.Shape.StyledPanel) - self.bottom_settings_group.setFrameShadow(QtWidgets.QFrame.Shadow.Raised) - self.bottom_settings_group.setObjectName("bottom_settings_group") - self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.bottom_settings_group) - self.horizontalLayout_2.setContentsMargins(3, 3, 3, 3) - self.horizontalLayout_2.setSpacing(3) - self.horizontalLayout_2.setObjectName("horizontalLayout_2") - self.settings_layout = QtWidgets.QHBoxLayout() - self.settings_layout.setObjectName("settings_layout") - self.connect_btn = QtWidgets.QToolButton(parent=self.bottom_settings_group) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.connect_btn.sizePolicy().hasHeightForWidth()) - self.connect_btn.setSizePolicy(sizePolicy) - self.connect_btn.setMinimumSize(QtCore.QSize(100, 0)) - self.connect_btn.setMaximumSize(QtCore.QSize(100, 16777215)) - self.connect_btn.setBaseSize(QtCore.QSize(100, 0)) - self.connect_btn.setPopupMode(QtWidgets.QToolButton.ToolButtonPopupMode.MenuButtonPopup) - self.connect_btn.setToolButtonStyle(QtCore.Qt.ToolButtonStyle.ToolButtonFollowStyle) - self.connect_btn.setObjectName("connect_btn") - self.settings_layout.addWidget(self.connect_btn) - self.status_lbl = QtWidgets.QLabel(parent=self.bottom_settings_group) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.status_lbl.sizePolicy().hasHeightForWidth()) - self.status_lbl.setSizePolicy(sizePolicy) - self.status_lbl.setMinimumSize(QtCore.QSize(240, 0)) - self.status_lbl.setMaximumSize(QtCore.QSize(120, 16777215)) - self.status_lbl.setBaseSize(QtCore.QSize(120, 50)) - self.status_lbl.setObjectName("status_lbl") - self.settings_layout.addWidget(self.status_lbl) - self.thermostat_settings = QtWidgets.QToolButton(parent=self.bottom_settings_group) - self.thermostat_settings.setEnabled(False) - self.thermostat_settings.setText("⚙") - self.thermostat_settings.setPopupMode(QtWidgets.QToolButton.ToolButtonPopupMode.InstantPopup) - self.thermostat_settings.setObjectName("thermostat_settings") - self.settings_layout.addWidget(self.thermostat_settings) - self.plot_settings = QtWidgets.QToolButton(parent=self.bottom_settings_group) - self.plot_settings.setPopupMode(QtWidgets.QToolButton.ToolButtonPopupMode.InstantPopup) - self.plot_settings.setObjectName("plot_settings") - self.settings_layout.addWidget(self.plot_settings) - self.limits_warning = QtWidgets.QLabel(parent=self.bottom_settings_group) - self.limits_warning.setToolTipDuration(1000000000) - self.limits_warning.setObjectName("limits_warning") - self.settings_layout.addWidget(self.limits_warning) - self.background_task_lbl = QtWidgets.QLabel(parent=self.bottom_settings_group) - self.background_task_lbl.setObjectName("background_task_lbl") - self.settings_layout.addWidget(self.background_task_lbl) - self.loading_spinner = QtWaitingSpinner(parent=self.bottom_settings_group) - self.loading_spinner.setObjectName("loading_spinner") - self.settings_layout.addWidget(self.loading_spinner) - spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Policy.Expanding, QtWidgets.QSizePolicy.Policy.Minimum) - self.settings_layout.addItem(spacerItem) - self.report_group = QtWidgets.QWidget(parent=self.bottom_settings_group) - self.report_group.setEnabled(False) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Minimum, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.report_group.sizePolicy().hasHeightForWidth()) - self.report_group.setSizePolicy(sizePolicy) - self.report_group.setMinimumSize(QtCore.QSize(40, 0)) - self.report_group.setObjectName("report_group") - self.horizontalLayout_4 = QtWidgets.QHBoxLayout(self.report_group) - self.horizontalLayout_4.setContentsMargins(0, 0, 0, 0) - self.horizontalLayout_4.setSpacing(0) - self.horizontalLayout_4.setObjectName("horizontalLayout_4") - self.report_layout = QtWidgets.QHBoxLayout() - self.report_layout.setSizeConstraint(QtWidgets.QLayout.SizeConstraint.SetDefaultConstraint) - self.report_layout.setContentsMargins(0, -1, -1, -1) - self.report_layout.setSpacing(6) - self.report_layout.setObjectName("report_layout") - self.report_lbl = QtWidgets.QLabel(parent=self.report_group) - self.report_lbl.setAlignment(QtCore.Qt.AlignmentFlag.AlignRight|QtCore.Qt.AlignmentFlag.AlignTrailing|QtCore.Qt.AlignmentFlag.AlignVCenter) - self.report_lbl.setObjectName("report_lbl") - self.report_layout.addWidget(self.report_lbl) - self.report_refresh_spin = QtWidgets.QDoubleSpinBox(parent=self.report_group) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.report_refresh_spin.sizePolicy().hasHeightForWidth()) - self.report_refresh_spin.setSizePolicy(sizePolicy) - self.report_refresh_spin.setMinimumSize(QtCore.QSize(70, 0)) - self.report_refresh_spin.setMaximumSize(QtCore.QSize(70, 16777215)) - self.report_refresh_spin.setBaseSize(QtCore.QSize(70, 0)) - self.report_refresh_spin.setDecimals(1) - self.report_refresh_spin.setMinimum(0.1) - self.report_refresh_spin.setSingleStep(0.1) - self.report_refresh_spin.setStepType(QtWidgets.QAbstractSpinBox.StepType.AdaptiveDecimalStepType) - self.report_refresh_spin.setProperty("value", 1.0) - self.report_refresh_spin.setObjectName("report_refresh_spin") - self.report_layout.addWidget(self.report_refresh_spin) - self.report_box = QtWidgets.QCheckBox(parent=self.report_group) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.report_box.sizePolicy().hasHeightForWidth()) - self.report_box.setSizePolicy(sizePolicy) - self.report_box.setMaximumSize(QtCore.QSize(80, 16777215)) - self.report_box.setBaseSize(QtCore.QSize(80, 0)) - self.report_box.setObjectName("report_box") - self.report_layout.addWidget(self.report_box) - self.report_apply_btn = QtWidgets.QPushButton(parent=self.report_group) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Expanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.report_apply_btn.sizePolicy().hasHeightForWidth()) - self.report_apply_btn.setSizePolicy(sizePolicy) - self.report_apply_btn.setMinimumSize(QtCore.QSize(80, 0)) - self.report_apply_btn.setMaximumSize(QtCore.QSize(80, 16777215)) - self.report_apply_btn.setBaseSize(QtCore.QSize(80, 0)) - self.report_apply_btn.setObjectName("report_apply_btn") - self.report_layout.addWidget(self.report_apply_btn) - self.report_layout.setStretch(1, 1) - self.report_layout.setStretch(2, 1) - self.report_layout.setStretch(3, 1) - self.horizontalLayout_4.addLayout(self.report_layout) - self.settings_layout.addWidget(self.report_group) - self.horizontalLayout_2.addLayout(self.settings_layout) - self.main_layout.addWidget(self.bottom_settings_group) - self.gridLayout_2.addLayout(self.main_layout, 0, 1, 1, 1) - MainWindow.setCentralWidget(self.main_widget) - self.actionReset = QtGui.QAction(parent=MainWindow) - self.actionReset.setMenuRole(QtGui.QAction.MenuRole.NoRole) - self.actionReset.setObjectName("actionReset") - self.actionEnter_DFU_Mode = QtGui.QAction(parent=MainWindow) - self.actionEnter_DFU_Mode.setMenuRole(QtGui.QAction.MenuRole.NoRole) - self.actionEnter_DFU_Mode.setObjectName("actionEnter_DFU_Mode") - self.actionNetwork_Settings = QtGui.QAction(parent=MainWindow) - self.actionNetwork_Settings.setMenuRole(QtGui.QAction.MenuRole.NoRole) - self.actionNetwork_Settings.setObjectName("actionNetwork_Settings") - self.actionAbout_Thermostat = QtGui.QAction(parent=MainWindow) - self.actionAbout_Thermostat.setMenuRole(QtGui.QAction.MenuRole.NoRole) - self.actionAbout_Thermostat.setObjectName("actionAbout_Thermostat") - self.actionLoad_all_configs = QtGui.QAction(parent=MainWindow) - self.actionLoad_all_configs.setMenuRole(QtGui.QAction.MenuRole.NoRole) - self.actionLoad_all_configs.setObjectName("actionLoad_all_configs") - self.actionSave_all_configs = QtGui.QAction(parent=MainWindow) - self.actionSave_all_configs.setMenuRole(QtGui.QAction.MenuRole.NoRole) - self.actionSave_all_configs.setObjectName("actionSave_all_configs") - - self.retranslateUi(MainWindow) - QtCore.QMetaObject.connectSlotsByName(MainWindow) - - def retranslateUi(self, MainWindow): - _translate = QtCore.QCoreApplication.translate - MainWindow.setWindowTitle(_translate("MainWindow", "Thermostat Control Panel")) - self.connect_btn.setText(_translate("MainWindow", "Connect")) - self.status_lbl.setText(_translate("MainWindow", "Disconnected")) - self.plot_settings.setToolTip(_translate("MainWindow", "Plot Settings")) - self.plot_settings.setText(_translate("MainWindow", "📉")) - self.background_task_lbl.setText(_translate("MainWindow", "Ready.")) - self.report_lbl.setText(_translate("MainWindow", "Poll every: ")) - self.report_refresh_spin.setSuffix(_translate("MainWindow", " s")) - self.report_box.setText(_translate("MainWindow", "Report")) - self.report_apply_btn.setText(_translate("MainWindow", "Apply")) - self.actionReset.setText(_translate("MainWindow", "Reset")) - self.actionReset.setToolTip(_translate("MainWindow", "Reset the Thermostat")) - self.actionEnter_DFU_Mode.setText(_translate("MainWindow", "Enter DFU Mode")) - self.actionEnter_DFU_Mode.setToolTip(_translate("MainWindow", "Reset thermostat and enter USB device firmware update (DFU) mode")) - self.actionNetwork_Settings.setText(_translate("MainWindow", "Network Settings")) - self.actionNetwork_Settings.setToolTip(_translate("MainWindow", "Configure IPv4 address, netmask length, and optional default gateway")) - self.actionAbout_Thermostat.setText(_translate("MainWindow", "About Thermostat")) - self.actionAbout_Thermostat.setToolTip(_translate("MainWindow", "Show Thermostat hardware revision, and settings related to i")) - self.actionLoad_all_configs.setText(_translate("MainWindow", "Load all channel configs from flash")) - self.actionLoad_all_configs.setToolTip(_translate("MainWindow", "Restore configuration for all channels from flash")) - self.actionSave_all_configs.setText(_translate("MainWindow", "Save all channel configs to flash")) - self.actionSave_all_configs.setToolTip(_translate("MainWindow", "Save configuration for all channels to flash")) -from pglive.sources.live_plot_widget import LivePlotWidget -from pyqtgraph.parametertree import ParameterTree -from waitingspinnerwidget import QtWaitingSpinner - - -if __name__ == "__main__": - import sys - app = QtWidgets.QApplication(sys.argv) - MainWindow = QtWidgets.QMainWindow() - ui = Ui_MainWindow() - ui.setupUi(MainWindow) - MainWindow.show() - sys.exit(app.exec()) diff --git a/pytec/view/conn_menu.py b/pytec/view/conn_menu.py new file mode 100644 index 0000000..80da10c --- /dev/null +++ b/pytec/view/conn_menu.py @@ -0,0 +1,56 @@ +from PyQt6 import QtWidgets, QtCore + + +class conn_menu(QtWidgets.QMenu): + def __init__(self): + super().__init__() + self.setTitle("Connection Settings") + + self.host_set_line = QtWidgets.QLineEdit() + self.host_set_line.setMinimumSize(QtCore.QSize(160, 0)) + self.host_set_line.setMaximumSize(QtCore.QSize(160, 16777215)) + self.host_set_line.setMaxLength(15) + self.host_set_line.setClearButtonEnabled(True) + + def connect_on_enter_press(): + self.connect_btn.click() + self.hide() + + self.host_set_line.returnPressed.connect(connect_on_enter_press) + + self.host_set_line.setText("192.168.1.26") + self.host_set_line.setPlaceholderText("IP for the Thermostat") + + host = QtWidgets.QWidgetAction(self) + host.setDefaultWidget(self.host_set_line) + self.addAction(host) + self.host = host + + self.port_set_spin = QtWidgets.QSpinBox() + self.port_set_spin.setMinimumSize(QtCore.QSize(70, 0)) + self.port_set_spin.setMaximumSize(QtCore.QSize(70, 16777215)) + self.port_set_spin.setMaximum(65535) + self.port_set_spin.setValue(23) + + def connect_only_if_enter_pressed(): + if ( + not self.port_set_spin.hasFocus() + ): # Don't connect if the spinbox only lost focus + return + connect_on_enter_press() + + self.port_set_spin.editingFinished.connect(connect_only_if_enter_pressed) + + port = QtWidgets.QWidgetAction(self) + port.setDefaultWidget(self.port_set_spin) + self.addAction(port) + self.port = port + + self.exit_button = QtWidgets.QPushButton() + self.exit_button.setText("Exit GUI") + self.exit_button.pressed.connect(QtWidgets.QApplication.instance().quit) + + exit_action = QtWidgets.QWidgetAction(self.exit_button) + exit_action.setDefaultWidget(self.exit_button) + self.addAction(exit_action) + self.exit_action = exit_action diff --git a/pytec/view/ctrl_panel.py b/pytec/view/ctrl_panel.py new file mode 100644 index 0000000..9ad5a99 --- /dev/null +++ b/pytec/view/ctrl_panel.py @@ -0,0 +1,202 @@ +from PyQt6.QtCore import pyqtSignal, QObject, QSignalBlocker, pyqtSlot +import pyqtgraph.parametertree.parameterTypes as pTypes +from pyqtgraph.parametertree import ( + Parameter, + registerParameterType, +) + + +class MutexParameter(pTypes.ListParameter): + """ + Mutually exclusive parameter where only one of its children is visible at a time, list selectable. + + The ordering of the list items determines which children will be visible. + """ + + def __init__(self, **opts): + super().__init__(**opts) + + self.sigValueChanged.connect(self.show_chosen_child) + self.sigValueChanged.emit(self, self.opts["value"]) + + def _get_param_from_value(self, value): + if isinstance(self.opts["limits"], dict): + values_list = list(self.opts["limits"].values()) + else: + values_list = self.opts["limits"] + + return self.children()[values_list.index(value)] + + @pyqtSlot(object, object) + def show_chosen_child(self, value): + for param in self.children(): + param.hide() + + child_to_show = self._get_param_from_value(value.value()) + child_to_show.show() + + if child_to_show.opts.get("triggerOnShow", None): + child_to_show.sigValueChanged.emit(child_to_show, child_to_show.value()) + + +registerParameterType("mutex", MutexParameter) + + +class ctrl_panel(QObject): + set_zero_limits_warning_sig = pyqtSignal(list) + + def __init__( + self, + trees_ui, + param_tree, + sigTreeStateChanged_handle, + sigActivated_handles, + parent=None, + ): + super().__init__(parent) + + self.trees_ui = trees_ui + self.NUM_CHANNELS = len(trees_ui) + + self.THERMOSTAT_PARAMETERS = [param_tree for i in range(self.NUM_CHANNELS)] + + self.params = [ + Parameter.create( + name=f"Thermostat Channel {ch} Parameters", + type="group", + value=ch, + children=self.THERMOSTAT_PARAMETERS[ch], + ) + for ch in range(self.NUM_CHANNELS) + ] + + for i, param in enumerate(self.params): + param.channel = i + + for i, tree in enumerate(self.trees_ui): + tree.setHeaderHidden(True) + tree.setParameters(self.params[i], showTop=False) + self.params[i].setValue = self._setValue + self.params[i].sigTreeStateChanged.connect(sigTreeStateChanged_handle) + + for handle in sigActivated_handles[i]: + self.params[i].child(*handle[0]).sigActivated.connect(handle[1]) + + 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): + self.params[channel].child(*path).setOpts(title=title) + + @pyqtSlot("QVariantList") + def update_pid(self, pid_settings): + for settings in pid_settings: + channel = settings["channel"] + with QSignalBlocker(self.params[channel]): + self.params[channel].child("PID Config", "Kp").setValue( + settings["parameters"]["kp"] + ) + self.params[channel].child("PID Config", "Ki").setValue( + settings["parameters"]["ki"] + ) + self.params[channel].child("PID Config", "Kd").setValue( + settings["parameters"]["kd"] + ) + self.params[channel].child( + "PID Config", "PID Output Clamping", "Minimum" + ).setValue(settings["parameters"]["output_min"] * 1000) + self.params[channel].child( + "PID Config", "PID Output Clamping", "Maximum" + ).setValue(settings["parameters"]["output_max"] * 1000) + self.params[channel].child( + "Output Config", "Control Method", "Set Temperature" + ).setValue(settings["target"]) + + @pyqtSlot("QVariantList") + def update_report(self, report_data): + for settings in report_data: + channel = settings["channel"] + with QSignalBlocker(self.params[channel]): + self.params[channel].child("Output Config", "Control Method").setValue( + "Temperature PID" if settings["pid_engaged"] else "Constant Current" + ) + self.params[channel].child( + "Output Config", "Control Method", "Set Current" + ).setValue(settings["i_set"] * 1000) + if settings["temperature"] is not None: + self.params[channel].child("Temperature").setValue( + settings["temperature"] + ) + if settings["tec_i"] is not None: + self.params[channel].child("Current through TEC").setValue( + settings["tec_i"] * 1000 + ) + + @pyqtSlot("QVariantList") + def update_thermistor(self, sh_data): + for sh_param in sh_data: + channel = sh_param["channel"] + with QSignalBlocker(self.params[channel]): + self.params[channel].child("Thermistor Config", "T₀").setValue( + sh_param["params"]["t0"] - 273.15 + ) + self.params[channel].child("Thermistor Config", "R₀").setValue( + sh_param["params"]["r0"] + ) + self.params[channel].child("Thermistor Config", "B").setValue( + sh_param["params"]["b"] + ) + + @pyqtSlot("QVariantList") + def update_pwm(self, pwm_data): + channels_zeroed_limits = [set() for i in range(self.NUM_CHANNELS)] + + for pwm_params in pwm_data: + channel = pwm_params["channel"] + with QSignalBlocker(self.params[channel]): + self.params[channel].child( + "Output Config", "Limits", "Max Voltage Difference" + ).setValue(pwm_params["max_v"]["value"]) + self.params[channel].child( + "Output Config", "Limits", "Max Cooling Current" + ).setValue(pwm_params["max_i_pos"]["value"] * 1000) + self.params[channel].child( + "Output Config", "Limits", "Max Heating Current" + ).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: + channels_zeroed_limits[channel].add(limit) + self.set_zero_limits_warning_sig.emit(channels_zeroed_limits) + + @pyqtSlot("QVariantList") + def update_postfilter(self, postfilter_data): + for postfilter_params in postfilter_data: + channel = postfilter_params["channel"] + with QSignalBlocker(self.params[channel]): + self.params[channel].child( + "Thermistor Config", "Postfilter Rate" + ).setValue(postfilter_params["rate"]) diff --git a/pytec/view/info_box.py b/pytec/view/info_box.py new file mode 100644 index 0000000..3d5c491 --- /dev/null +++ b/pytec/view/info_box.py @@ -0,0 +1,14 @@ +from PyQt6 import QtWidgets +from PyQt6.QtCore import pyqtSlot + + +class info_box(QtWidgets.QMessageBox): + def __init__(self): + super().__init__() + self.setIcon(QtWidgets.QMessageBox.Icon.Information) + + @pyqtSlot(str, str) + def display_info_box(self, title, text): + self.setWindowTitle(title) + self.setText(text) + self.show() diff --git a/pytec/view/live_plot_view.py b/pytec/view/live_plot_view.py new file mode 100644 index 0000000..e9ea57a --- /dev/null +++ b/pytec/view/live_plot_view.py @@ -0,0 +1,168 @@ +from PyQt6.QtCore import QObject, pyqtSlot +from pglive.sources.data_connector import DataConnector +from pglive.kwargs import Axis +from pglive.sources.live_plot import LiveLinePlot +from pglive.sources.live_axis import LiveAxis +from collections import deque +import pyqtgraph as pg + +pg.setConfigOptions(antialias=True) + + +class LiveDataPlotter(QObject): + def __init__(self, live_plots): + super().__init__() + + self.NUM_CHANNELS = len(live_plots) + self.graphs = [] + + for i, live_plot in enumerate(live_plots): + live_plot[0].setTitle(f"Channel {i} Temperature") + live_plot[1].setTitle(f"Channel {i} Current") + self.graphs.append(_TecGraphs(live_plot[0], live_plot[1])) + + def _config_connector_max_pts(self, connector, samples): + connector.max_points = samples + connector.x = deque(maxlen=int(connector.max_points)) + connector.y = deque(maxlen=int(connector.max_points)) + + @pyqtSlot(int) + def set_max_samples(self, samples: int): + for graph in self.graphs: + self._config_connector_max_pts(graph.t_connector, samples) + self._config_connector_max_pts(graph.i_connector, samples) + self._config_connector_max_pts(graph.iset_connector, samples) + + @pyqtSlot() + def clear_graphs(self): + for graph in self.graphs: + graph.clear() + + @pyqtSlot(list) + def update_pid(self, pid_settings): + for settings in pid_settings: + channel = settings["channel"] + self.graphs[channel].update_pid(settings) + + @pyqtSlot(list) + def update_report(self, report_data): + for settings in report_data: + channel = settings["channel"] + self.graphs[channel].update_report(settings) + + +class _TecGraphs: + """The maximum number of sample points to store.""" + + DEFAULT_MAX_SAMPLES = 1000 + + def __init__(self, t_widget, i_widget): + self._t_widget = t_widget + self._i_widget = i_widget + + self._t_plot = LiveLinePlot() + self._i_plot = LiveLinePlot(name="Measured") + self._iset_plot = LiveLinePlot(name="Set", pen=pg.mkPen("r")) + + self._t_line = self._t_widget.getPlotItem().addLine(label="{value} °C") + self._t_line.setVisible(False) + self._t_setpoint_plot = ( + LiveLinePlot() + ) # Hack for keeping setpoint line in plot range + + for graph in t_widget, i_widget: + time_axis = LiveAxis( + "bottom", + text="Time since Thermostat reset", + **{Axis.TICK_FORMAT: Axis.DURATION}, + ) + time_axis.showLabel() + graph.setAxisItems({"bottom": time_axis}) + + graph.add_crosshair(pg.mkPen(color="red", width=1), {"color": "green"}) + + # Enable linking of axes in the graph widget's context menu + graph.register( + graph.getPlotItem().titleLabel.text + ) # Slight hack getting the title + + temperature_axis = LiveAxis("left", text="Temperature", units="°C") + temperature_axis.showLabel() + t_widget.setAxisItems({"left": temperature_axis}) + + current_axis = LiveAxis("left", text="Current", units="A") + current_axis.showLabel() + i_widget.setAxisItems({"left": current_axis}) + i_widget.addLegend(brush=(50, 50, 200, 150)) + + t_widget.addItem(self._t_plot) + t_widget.addItem(self._t_setpoint_plot) + i_widget.addItem(self._i_plot) + i_widget.addItem(self._iset_plot) + + self.t_connector = DataConnector( + self._t_plot, max_points=self.DEFAULT_MAX_SAMPLES + ) + self.t_setpoint_connector = DataConnector(self._t_setpoint_plot, max_points=1) + self.i_connector = DataConnector( + self._i_plot, max_points=self.DEFAULT_MAX_SAMPLES + ) + self.iset_connector = DataConnector( + self._iset_plot, max_points=self.DEFAULT_MAX_SAMPLES + ) + + self.max_samples = self.DEFAULT_MAX_SAMPLES + + def plot_append(self, report): + temperature = report["temperature"] + current = report["tec_i"] + iset = report["i_set"] + time = report["time"] + + if temperature is not None: + self.t_connector.cb_append_data_point(temperature, time) + if self._t_line.isVisible(): + self.t_setpoint_connector.cb_append_data_point( + self._t_line.value(), time + ) + else: + self.t_setpoint_connector.cb_append_data_point(temperature, time) + if current is not None: + self.i_connector.cb_append_data_point(current, time) + self.iset_connector.cb_append_data_point(iset, time) + + def set_max_sample(self, samples: int): + for connector in self.t_connector, self.i_connector, self.iset_connector: + connector.max_points(samples) + + def clear(self): + for connector in self.t_connector, self.i_connector, self.iset_connector: + connector.clear() + + def set_t_line(self, temp=None, visible=None): + if visible is not None: + self._t_line.setVisible(visible) + if temp is not None: + self._t_line.setValue(temp) + + # PyQtGraph normally does not update this text when the line + # is not visible, so make sure that the temperature label + # gets updated always, and doesn't stay at an old value. + self._t_line.label.setText(f"{temp} °C") + + def set_max_samples(self, samples: int): + for graph in self.graphs: + graph.t_connector.max_points = samples + graph.i_connector.max_points = samples + graph.iset_connector.max_points = samples + + def clear_graphs(self): + for graph in self.graphs: + graph.clear() + + def update_pid(self, pid_settings): + self.set_t_line(temp=round(pid_settings["target"], 6)) + + def update_report(self, report_data): + self.plot_append(report_data) + self.set_t_line(visible=report_data["pid_engaged"]) diff --git a/pytec/view/net_settings_input_diag.py b/pytec/view/net_settings_input_diag.py new file mode 100644 index 0000000..fb1c242 --- /dev/null +++ b/pytec/view/net_settings_input_diag.py @@ -0,0 +1,36 @@ +from PyQt6 import QtWidgets +from PyQt6.QtWidgets import QAbstractButton +from PyQt6.QtCore import pyqtSignal, pyqtSlot + + +class net_settings_input_diag(QtWidgets.QInputDialog): + set_ipv4_act = pyqtSignal(str) + + def __init__(self, current_ipv4_settings): + super().__init__() + self.setWindowTitle("Network Settings") + self.setLabelText( + "Set the Thermostat's IPv4 address, netmask and gateway (optional)" + ) + self.setTextValue(current_ipv4_settings) + self._new_ipv4 = "" + + @pyqtSlot(str) + def set_ipv4(ipv4_settings): + self._new_ipv4 = ipv4_settings + + sure = QtWidgets.QMessageBox(self) + sure.setWindowTitle("Set network?") + sure.setText( + f"Setting this as network and disconnecting:
{ipv4_settings}" + ) + + sure.buttonClicked.connect(self._emit_sig) + sure.show() + + self.textValueSelected.connect(set_ipv4) + self.show() + + @pyqtSlot(QAbstractButton) + def _emit_sig(self, _): + self.set_ipv4_act.emit(self._new_ipv4) diff --git a/pytec/view/param_tree.json b/pytec/view/param_tree.json new file mode 100644 index 0000000..e495b84 --- /dev/null +++ b/pytec/view/param_tree.json @@ -0,0 +1,365 @@ +{ + "ctrl_panel":[ + { + "name":"Temperature", + "type":"float", + "format":"{value:.4f} °C", + "readonly":true + }, + { + "name":"Current through TEC", + "type":"float", + "suffix":"mA", + "decimals":6, + "readonly":true + }, + { + "name":"Output Config", + "expanded":true, + "type":"group", + "children":[ + { + "name":"Control Method", + "type":"mutex", + "limits":[ + "Constant Current", + "Temperature PID" + ], + "activaters":[ + null, + [ + "pwm", + "ch", + "pid" + ] + ], + "children":[ + { + "name":"Set Current", + "type":"float", + "value":0, + "step":100, + "limits":[ + -2000, + 2000 + ], + "triggerOnShow":true, + "decimals":6, + "suffix":"mA", + "param":[ + "pwm", + "ch", + "i_set" + ], + "lock":false + }, + { + "name":"Set Temperature", + "type":"float", + "value":25, + "step":0.1, + "limits":[ + -273, + 300 + ], + "format":"{value:.4f} °C", + "param":[ + "pid", + "ch", + "target" + ], + "lock":false + } + ] + }, + { + "name":"Limits", + "expanded":true, + "type":"group", + "children":[ + { + "name":"Max Cooling Current", + "type":"float", + "value":0, + "step":100, + "decimals":6, + "limits":[ + 0, + 2000 + ], + "suffix":"mA", + "param":[ + "pwm", + "ch", + "max_i_pos" + ], + "lock":false + }, + { + "name":"Max Heating Current", + "type":"float", + "value":0, + "step":100, + "decimals":6, + "limits":[ + 0, + 2000 + ], + "suffix":"mA", + "param":[ + "pwm", + "ch", + "max_i_neg" + ], + "lock":false + }, + { + "name":"Max Voltage Difference", + "type":"float", + "value":0, + "step":0.1, + "limits":[ + 0, + 5 + ], + "siPrefix":true, + "suffix":"V", + "param":[ + "pwm", + "ch", + "max_v" + ], + "lock":false + } + ] + } + ] + }, + { + "name":"Thermistor Config", + "expanded":true, + "type":"group", + "children":[ + { + "name":"T₀", + "type":"float", + "value":25, + "step":0.1, + "limits":[ + -100, + 100 + ], + "format":"{value:.4f} °C", + "param":[ + "s-h", + "ch", + "t0" + ], + "lock":false + }, + { + "name":"R₀", + "type":"float", + "value":10000, + "step":1, + "siPrefix":true, + "suffix":"Ω", + "param":[ + "s-h", + "ch", + "r0" + ], + "lock":false + }, + { + "name":"B", + "type":"float", + "value":3950, + "step":1, + "suffix":"K", + "decimals":4, + "param":[ + "s-h", + "ch", + "b" + ], + "lock":false + }, + { + "name":"Postfilter Rate", + "type":"list", + "value":16.67, + "param":[ + "postfilter", + "ch", + "rate" + ], + "limits":{ + "Off":null, + "16.67 Hz":16.67, + "20 Hz":20.0, + "21.25 Hz":21.25, + "27 Hz":27.0 + }, + "lock":false + } + ] + }, + { + "name":"PID Config", + "expanded":true, + "type":"group", + "children":[ + { + "name":"Kp", + "type":"float", + "step":0.1, + "suffix":"", + "param":[ + "pid", + "ch", + "kp" + ], + "lock":false + }, + { + "name":"Ki", + "type":"float", + "step":0.1, + "suffix":"Hz", + "param":[ + "pid", + "ch", + "ki" + ], + "lock":false + }, + { + "name":"Kd", + "type":"float", + "step":0.1, + "suffix":"s", + "param":[ + "pid", + "ch", + "kd" + ], + "lock":false + }, + { + "name":"PID Output Clamping", + "expanded":true, + "type":"group", + "children":[ + { + "name":"Minimum", + "type":"float", + "step":100, + "limits":[ + -2000, + 2000 + ], + "decimals":6, + "suffix":"mA", + "param":[ + "pid", + "ch", + "output_min" + ], + "lock":false + }, + { + "name":"Maximum", + "type":"float", + "step":100, + "limits":[ + -2000, + 2000 + ], + "decimals":6, + "suffix":"mA", + "param":[ + "pid", + "ch", + "output_max" + ], + "lock":false + } + ] + }, + { + "name":"PID Auto Tune", + "expanded":false, + "type":"group", + "children":[ + { + "name":"Target Temperature", + "type":"float", + "value":20, + "step":0.1, + "format":"{value:.4f} °C", + "pid_autotune":[ + "target_temp", + "ch" + ] + }, + { + "name":"Test Current", + "type":"float", + "value":0, + "decimals":6, + "step":100, + "limits":[ + -2000, + 2000 + ], + "suffix":"mA", + "pid_autotune":[ + "test_current", + "ch" + ] + }, + { + "name":"Temperature Swing", + "type":"float", + "value":1.5, + "step":0.1, + "prefix":"±", + "format":"{value:.4f} °C", + "pid_autotune":[ + "temp_swing", + "ch" + ] + }, + { + "name":"Lookback", + "type":"float", + "value":3.0, + "step":0.1, + "format":"{value:.4f} s", + "pid_autotune":[ + "lookback", + "ch" + ] + }, + { + "name":"Run", + "type":"action", + "tip":"Run" + } + ] + } + ] + }, + { + "name":"Save to flash", + "type":"action", + "tip":"Save config to thermostat, applies on reset" + }, + { + "name":"Load from flash", + "type":"action", + "tip":"Load config from flash" + } + ] + } \ No newline at end of file diff --git a/pytec/view/plot_options_menu.py b/pytec/view/plot_options_menu.py new file mode 100644 index 0000000..427684a --- /dev/null +++ b/pytec/view/plot_options_menu.py @@ -0,0 +1,21 @@ +from PyQt6 import QtWidgets, QtGui + + +class plot_options_menu(QtWidgets.QMenu): + def __init__(self, max_samples=1000): + super().__init__() + self.setTitle("Plot Settings") + + clear = QtGui.QAction("Clear graphs", self) + self.addAction(clear) + self.clear = clear + + self.samples_spinbox = QtWidgets.QSpinBox() + self.samples_spinbox.setRange(2, 100000) + self.samples_spinbox.setSuffix(" samples") + self.samples_spinbox.setValue(max_samples) + + limit_samples = QtWidgets.QWidgetAction(self) + limit_samples.setDefaultWidget(self.samples_spinbox) + self.addAction(limit_samples) + self.limit_samples = limit_samples diff --git a/pytec/tec_qt.ui b/pytec/view/tec_qt.ui similarity index 82% rename from pytec/tec_qt.ui rename to pytec/view/tec_qt.ui index bcfde55..c7d8b35 100644 --- a/pytec/tec_qt.ui +++ b/pytec/view/tec_qt.ui @@ -27,7 +27,7 @@ - thermostat-icon-640x640.pngthermostat-icon-640x640.png + ../resources/artiq.ico../resources/artiq.ico @@ -69,14 +69,14 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised - QLayout::SetDefaultConstraint + QLayout::SizeConstraint::SetDefaultConstraint 3 @@ -93,12 +93,6 @@ 2 - - - - - - @@ -111,6 +105,65 @@ + + + + + 0 + 0 + + + + 0 + + + + + 0 + 0 + + + + Channel 0 + + + + + + + 0 + 0 + + + + + + + + + + 0 + 0 + + + + Channel 1 + + + + + + + 0 + 0 + + + + + + + + @@ -135,10 +188,10 @@ - QFrame::StyledPanel + QFrame::Shape::StyledPanel - QFrame::Raised + QFrame::Shadow::Raised @@ -188,10 +241,10 @@ Connect - QToolButton::MenuButtonPopup + QToolButton::ToolButtonPopupMode::MenuButtonPopup - Qt::ToolButtonFollowStyle + Qt::ToolButtonStyle::ToolButtonFollowStyle @@ -235,7 +288,7 @@ - QToolButton::InstantPopup + QToolButton::ToolButtonPopupMode::InstantPopup @@ -248,7 +301,7 @@ 📉 - QToolButton::InstantPopup + QToolButton::ToolButtonPopupMode::InstantPopup @@ -272,7 +325,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -321,7 +374,7 @@ 6 - QLayout::SetDefaultConstraint + QLayout::SizeConstraint::SetDefaultConstraint 0 @@ -332,7 +385,7 @@ Poll every: - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + Qt::AlignmentFlag::AlignRight|Qt::AlignmentFlag::AlignTrailing|Qt::AlignmentFlag::AlignVCenter @@ -375,7 +428,7 @@ 0.100000000000000 - QAbstractSpinBox::AdaptiveDecimalStepType + QAbstractSpinBox::StepType::AdaptiveDecimalStepType 1.000000000000000 @@ -460,7 +513,7 @@ Reset the Thermostat - QAction::NoRole + QAction::MenuRole::NoRole @@ -471,7 +524,7 @@ Reset thermostat and enter USB device firmware update (DFU) mode - QAction::NoRole + QAction::MenuRole::NoRole @@ -482,7 +535,7 @@ Configure IPv4 address, netmask length, and optional default gateway - QAction::NoRole + QAction::MenuRole::NoRole @@ -493,7 +546,7 @@ Show Thermostat hardware revision, and settings related to i - QAction::NoRole + QAction::MenuRole::NoRole @@ -504,7 +557,7 @@ Restore configuration for all channels from flash - QAction::NoRole + QAction::MenuRole::NoRole @@ -515,7 +568,7 @@ Save configuration for all channels to flash - QAction::NoRole + QAction::MenuRole::NoRole @@ -535,7 +588,7 @@ QtWaitingSpinner QWidget -
waitingspinnerwidget
+
view.waitingspinnerwidget
1
diff --git a/pytec/view/thermostat_ctrl_menu.py b/pytec/view/thermostat_ctrl_menu.py new file mode 100644 index 0000000..e22dfba --- /dev/null +++ b/pytec/view/thermostat_ctrl_menu.py @@ -0,0 +1,145 @@ +from PyQt6 import QtWidgets, QtGui, QtCore +from PyQt6.QtCore import pyqtSignal, pyqtSlot + + +class thermostat_ctrl_menu(QtWidgets.QMenu): + fan_set_act = pyqtSignal(int) + fan_auto_set_act = pyqtSignal(int) + + connect_act = pyqtSignal() + reset_act = pyqtSignal(bool) + dfu_act = pyqtSignal(bool) + load_cfg_act = pyqtSignal(int) + save_cfg_act = pyqtSignal(int) + net_cfg_act = pyqtSignal(bool) + + def __init__(self, style): + super().__init__() + self._style = style + self.setTitle("Thermostat settings") + + self.hw_rev_data = dict() + + self.fan_group = QtWidgets.QWidget() + self.fan_group.setEnabled(False) + self.fan_group.setMinimumSize(QtCore.QSize(40, 0)) + self.fan_layout = QtWidgets.QHBoxLayout(self.fan_group) + self.fan_layout.setSpacing(9) + self.fan_lbl = QtWidgets.QLabel(parent=self.fan_group) + self.fan_lbl.setMinimumSize(QtCore.QSize(40, 0)) + self.fan_lbl.setMaximumSize(QtCore.QSize(40, 16777215)) + self.fan_lbl.setBaseSize(QtCore.QSize(40, 0)) + self.fan_layout.addWidget(self.fan_lbl) + self.fan_power_slider = QtWidgets.QSlider(parent=self.fan_group) + self.fan_power_slider.setMinimumSize(QtCore.QSize(200, 0)) + self.fan_power_slider.setMaximumSize(QtCore.QSize(200, 16777215)) + self.fan_power_slider.setBaseSize(QtCore.QSize(200, 0)) + self.fan_power_slider.setRange(1, 100) + self.fan_power_slider.setOrientation(QtCore.Qt.Orientation.Horizontal) + self.fan_layout.addWidget(self.fan_power_slider) + self.fan_auto_box = QtWidgets.QCheckBox(parent=self.fan_group) + self.fan_auto_box.setMinimumSize(QtCore.QSize(70, 0)) + self.fan_auto_box.setMaximumSize(QtCore.QSize(70, 16777215)) + self.fan_layout.addWidget(self.fan_auto_box) + self.fan_pwm_warning = QtWidgets.QLabel(parent=self.fan_group) + self.fan_pwm_warning.setMinimumSize(QtCore.QSize(16, 0)) + self.fan_layout.addWidget(self.fan_pwm_warning) + + self.fan_power_slider.valueChanged.connect(self.fan_set_act) + self.fan_auto_box.stateChanged.connect(self.fan_auto_set_act) + + self.fan_lbl.setToolTip("Adjust the fan") + self.fan_lbl.setText("Fan:") + self.fan_auto_box.setText("Auto") + + fan = QtWidgets.QWidgetAction(self) + fan.setDefaultWidget(self.fan_group) + self.addAction(fan) + self.fan = fan + + self.actionReset = QtGui.QAction("Reset Thermostat", self) + self.actionReset.triggered.connect(self.reset_act) + self.addAction(self.actionReset) + + self.actionEnter_DFU_Mode = QtGui.QAction("Enter DFU Mode", self) + self.actionEnter_DFU_Mode.triggered.connect(self.dfu_act) + self.addAction(self.actionEnter_DFU_Mode) + + self.actionnet_settings_input_diag = QtGui.QAction("Set IPV4 Settings", self) + self.actionnet_settings_input_diag.triggered.connect(self.net_cfg_act) + self.addAction(self.actionnet_settings_input_diag) + + @pyqtSlot(bool) + def load(_): + self.load_cfg_act.emit(0) + self.load_cfg_act.emit(1) + loaded = QtWidgets.QMessageBox(self) + loaded.setWindowTitle("Config loaded") + loaded.setText("All channel configs have been loaded from flash.") + loaded.setIcon(QtWidgets.QMessageBox.Icon.Information) + loaded.show() + + self.actionLoad_all_configs = QtGui.QAction("Load Config", self) + self.actionLoad_all_configs.triggered.connect(load) + self.addAction(self.actionLoad_all_configs) + + @pyqtSlot(bool) + def save(_): + self.save_cfg_act.emit(0) + self.save_cfg_act.emit(1) + saved = QtWidgets.QMessageBox(self) + saved.setWindowTitle("Config saved") + saved.setText("All channel configs have been saved to flash.") + saved.setIcon(QtWidgets.QMessageBox.Icon.Information) + saved.show() + + self.actionSave_all_configs = QtGui.QAction("Save Config", self) + self.actionSave_all_configs.triggered.connect(save) + self.addAction(self.actionSave_all_configs) + + def about_thermostat(): + QtWidgets.QMessageBox.about( + self, + "About Thermostat", + f""" +

Sinara 8451 Thermostat v{self.hw_rev_data['rev']['major']}.{self.hw_rev_data['rev']['minor']}

+ +
+ +

Settings:

+ Default fan curve: + a = {self.hw_rev_data['settings']['fan_k_a']}, + b = {self.hw_rev_data['settings']['fan_k_b']}, + c = {self.hw_rev_data['settings']['fan_k_c']} +
+ Fan PWM range: + {self.hw_rev_data['settings']['min_fan_pwm']} \u2013 {self.hw_rev_data['settings']['max_fan_pwm']} +
+ Fan PWM frequency: {self.hw_rev_data['settings']['fan_pwm_freq_hz']} Hz +
+ Fan available: {self.hw_rev_data['settings']['fan_available']} +
+ Fan PWM recommended: {self.hw_rev_data['settings']['fan_pwm_recommended']} + """, + ) + + self.actionAbout_Thermostat = QtGui.QAction("About Thermostat", self) + self.actionAbout_Thermostat.triggered.connect(about_thermostat) + self.addAction(self.actionAbout_Thermostat) + + def set_fan_pwm_warning(self): + if self.fan_power_slider.value() != 100: + pixmapi = getattr(QtWidgets.QStyle.StandardPixmap, "SP_MessageBoxWarning") + icon = self._style.standardIcon(pixmapi) + self.fan_pwm_warning.setPixmap(icon.pixmap(16, 16)) + self.fan_pwm_warning.setToolTip( + "Throttling the fan (not recommended on this hardware rev)" + ) + else: + self.fan_pwm_warning.setPixmap(QtGui.QPixmap()) + self.fan_pwm_warning.setToolTip("") + + @pyqtSlot("QVariantMap") + def hw_rev(self, hw_rev): + self.hw_rev_data = hw_rev + self.fan_group.setEnabled(self.hw_rev_data["settings"]["fan_available"]) diff --git a/pytec/waitingspinnerwidget.py b/pytec/view/waitingspinnerwidget.py similarity index 100% rename from pytec/waitingspinnerwidget.py rename to pytec/view/waitingspinnerwidget.py diff --git a/pytec/view/zero_limits_warning.py b/pytec/view/zero_limits_warning.py new file mode 100644 index 0000000..574e04d --- /dev/null +++ b/pytec/view/zero_limits_warning.py @@ -0,0 +1,41 @@ +from PyQt6.QtCore import pyqtSlot, QObject +from PyQt6 import QtWidgets, QtGui + + +class zero_limits_warning_view(QObject): + def __init__(self, style, limit_warning): + super().__init__() + self._lbl = limit_warning + self._style = style + + @pyqtSlot("QVariantList") + def set_limits_warning(self, channels_zeroed_limits: list): + channel_disabled = [False, False] + + report_str = "The following output limit(s) are set to zero:\n" + for ch, zeroed_limits in enumerate(channels_zeroed_limits): + if {"max_i_pos", "max_i_neg"}.issubset(zeroed_limits): + report_str += "Max Cooling Current, Max Heating Current" + channel_disabled[ch] = True + + if "max_v" in zeroed_limits: + if channel_disabled[ch]: + report_str += ", " + report_str += "Max Voltage Difference" + channel_disabled[ch] = True + + if channel_disabled[ch]: + report_str += f" for Channel {ch}\n" + + report_str += ( + "\nThese limit(s) are restricting the channel(s) from producing current." + ) + + if True in channel_disabled: + pixmapi = getattr(QtWidgets.QStyle.StandardPixmap, "SP_MessageBoxWarning") + icon = self._style.standardIcon(pixmapi) + self._lbl.setPixmap(icon.pixmap(16, 16)) + self._lbl.setToolTip(report_str) + else: + self._lbl.setPixmap(QtGui.QPixmap()) + self._lbl.setToolTip(None)