""" TD Ultrafiltration UI Loader """ # Python import os import can import struct # Qt from PySide2 import QtCore, QtWidgets from PySide2.QtCore import Slot # parent from engine.dynamicloader import DynamicLoader # plugin specific from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.protocols import CAN from leahi_dialin.utils import conversions from leahi_dialin.common.td_defs import TDOpModes from leahi_dialin.common.td_defs import TDStandbyStates # hd Simulator from leahi_dialin.ui.td_messaging import TD_Messaging class Loader(DynamicLoader): """ TD Ultrafiltration UI Loader """ def __init__(self): self.td_interface = TD_Messaging() self.can_interface = self.td_interface.can_interface super().__init__(os.path.dirname(__file__)) def _init_loader(self): """ finds and creates widgets :return: none """ self.uf_scaling = 100.00 # UF Scaling factor to be 2 decimal places self.tbReset = self.find_widget(QtWidgets.QToolButton , 'tbReset' ) self.tbSend = self.find_widget(QtWidgets.QToolButton , 'tbSend' ) self.setVolume = self.find_widget(QtWidgets.QSlider , 'UFSetVolSlider' ) self.targetRate = self.find_widget(QtWidgets.QSlider , 'UFRateSlider' ) self.volumeDelivered = self.find_widget(QtWidgets.QSlider , 'UFVolDelSlider' ) self.state = self.find_widget(QtWidgets.QSpinBox , 'UFStatespinBox' ) self.setVolumeLabel = self.find_widget(QtWidgets.QLabel , 'setVolumeLabel' ) self.targetRateLabel = self.find_widget(QtWidgets.QLabel , 'targetRateLabel' ) self.volumeDeliveredLabel = self.find_widget(QtWidgets.QLabel , 'volumeDeliveredLabel' ) self.prAccepted = self.find_widget(QtWidgets.QCheckBox , 'prAcceptedCheckBox' ) self.prRejectReason = self.find_widget(QtWidgets.QSpinBox , 'prRejectReasonSpinBox' ) self.prSend = self.find_widget(QtWidgets.QToolButton, 'prSendButton' ) self.prReset = self.find_widget(QtWidgets.QToolButton, 'prResetButton' ) self.changeAccepted = self.find_widget(QtWidgets.QCheckBox , 'changeAcceptedCheckBox' ) self.changeRejectReason = self.find_widget(QtWidgets.QSpinBox , 'changeRejectReasonSpinBox' ) self.changeVolume = self.find_widget(QtWidgets.QSlider , 'changeVolumeSlider' ) self.changeVolumeLabel = self.find_widget(QtWidgets.QLabel , 'changeVolumeLabel' ) self.changeDuration = self.find_widget(QtWidgets.QSlider , 'changeDurationSlider' ) self.changeDurationLabel = self.find_widget(QtWidgets.QLabel , 'changeDurationLabel' ) self.changeTimeDiff = self.find_widget(QtWidgets.QSlider , 'changeTimeDiffSlider' ) self.changeTimeDiffLabel = self.find_widget(QtWidgets.QLabel , 'changeTimeDiffLabel' ) self.changeRate = self.find_widget(QtWidgets.QSlider , 'changeRateSlider' ) self.changeRateLabel = self.find_widget(QtWidgets.QLabel , 'changeRateLabel' ) self.changeRateDiff = self.find_widget(QtWidgets.QSlider , 'changeRateDiffSlider' ) self.changeRateDiffLabel = self.find_widget(QtWidgets.QLabel , 'changeRateDiffLabel' ) self.changeOldRate = self.find_widget(QtWidgets.QSlider , 'changeOldRateSlider' ) self.changeOldRateLabel = self.find_widget(QtWidgets.QLabel , 'changeOldRateLabel' ) self.changeSend = self.find_widget(QtWidgets.QToolButton, 'changeSendButton' ) self.changeReset = self.find_widget(QtWidgets.QToolButton, 'changeResetButton' ) self.confirmAccepted = self.find_widget(QtWidgets.QCheckBox , 'confirmAcceptedCheckBox' ) self.confirmRejectReason = self.find_widget(QtWidgets.QSpinBox , 'confirmRejectReasonSpinBox' ) self.confirmVolume = self.find_widget(QtWidgets.QSlider , 'confirmVolumeSlider' ) self.confirmVolumeLabel = self.find_widget(QtWidgets.QLabel , 'confirmVolumeLabel' ) self.confirmDuration = self.find_widget(QtWidgets.QSlider , 'confirmDurationSlider' ) self.confirmDurationLabel = self.find_widget(QtWidgets.QLabel , 'confirmDurationLabel' ) self.confirmRate = self.find_widget(QtWidgets.QSlider , 'confirmRateSlider' ) self.confirmRateLabel = self.find_widget(QtWidgets.QLabel , 'confirmRateLabel' ) self.confirmSend = self.find_widget(QtWidgets.QToolButton, 'confirmSendButton' ) self.confirmReset = self.find_widget(QtWidgets.QToolButton, 'confirmResetButton' ) def _init_connections(self): """ initializes the widgets connections :return: none """ self.tbReset.clicked.connect(self._init_widgets) self.tbSend.clicked.connect(self.do_all_tx_data) self.setVolume .valueChanged.connect(self.do_uf_data) self.targetRate .valueChanged.connect(self.do_uf_data) self.volumeDelivered .valueChanged.connect(self.do_uf_data) self.state .valueChanged.connect(self.do_uf_data) self.prSend.clicked.connect(self.do_pause_resume) self.prReset.clicked.connect(self.init_pause_resume) self.changeVolume.valueChanged.connect(lambda value: self.changeVolumeLabel.setText(f"{value/1000:.2f}")) self.changeDuration.valueChanged.connect(lambda value: self.changeDurationLabel.setText(f"{value}")) self.changeTimeDiff.valueChanged.connect(lambda value: self.changeTimeDiffLabel.setText(f"{value}")) self.changeRate.valueChanged.connect(lambda value: self.changeRateLabel.setText(f"{value/1000:.2f}")) self.changeRateDiff.valueChanged.connect(lambda value: self.changeRateDiffLabel.setText(f"{value/1000:.2f}")) self.changeOldRate.valueChanged.connect(lambda value: self.changeOldRateLabel.setText(f"{value/1000:.2f}")) self.changeSend.clicked.connect(self.do_settings_change) self.changeReset.clicked.connect(self.init_settings_change) self.confirmVolume.valueChanged.connect(lambda value: self.confirmVolumeLabel.setText(f"{value/1000:.2f}")) self.confirmDuration.valueChanged.connect(lambda value: self.confirmDurationLabel.setText(f"{value}")) self.confirmRate.valueChanged.connect(lambda value: self.confirmRateLabel.setText(f"{value/1000:.2f}")) self.confirmSend.clicked.connect(self.do_confirm) self.confirmReset.clicked.connect(self.init_confirm) @Slot() def _init_widgets(self): """ initializes the widgets' properties :return: none """ self.setVolume .setValue(0) self.targetRate .setValue(0) self.volumeDelivered.setValue(0) self.state .setValue(0) self.init_settings_change() self.init_pause_resume() self.init_confirm() @Slot() def do_uf_data(self): """ the slot for UF Data :return: none """ set_volume = self.setVolume .value() / self.uf_scaling target_rate = self.targetRate .value() / self.uf_scaling volume_delivered = self.volumeDelivered .value() / self.uf_scaling state = self.state .value() self.setVolumeLabel .setText(f"{set_volume:.2f}" ) self.targetRateLabel .setText(f"{target_rate:.2f}" ) self.volumeDeliveredLabel .setText(f"{volume_delivered:.2f}" ) self.td_interface.td_ultrafiltration( set_volume , target_rate , volume_delivered , state ) @Slot() def init_settings_change(self): """ slot for initializing UF settings change :return: none """ self.changeAccepted .setChecked(True) self.changeRejectReason .setValue(0) self.changeVolume .setValue(0) self.changeDuration .setValue(0) self.changeTimeDiff .setValue(0) self.changeRate .setValue(0) self.changeRateDiff .setValue(0) self.changeOldRate .setValue(0) @Slot() def do_settings_change(self): """ slot for UF settings change :return: none """ payload = conversions.integer_to_bytearray(int(1 if self.changeAccepted.isChecked() else 0)) payload += conversions.integer_to_bytearray(self.changeRejectReason.value()) payload += conversions.float_to_bytearray(self.changeVolume.value()) payload += conversions.integer_to_bytearray(self.changeDuration.value()) payload += conversions.integer_to_bytearray(self.changeTimeDiff.value()) payload += conversions.float_to_bytearray(self.changeRate.value()/1000) payload += conversions.float_to_bytearray(self.changeRateDiff.value()/1000) payload += conversions.float_to_bytearray(self.changeOldRate.value()/1000) self.td_interface.cmd_send_general_response( message_id = 66, accepted = 1 if self.changeAccepted.isChecked() else 0, reason = self.changeRejectReason.value(), is_pure_data = False, has_parameters = True, parameters_payload = payload ) @Slot() def init_pause_resume(self): """ slot for initializing UF pause/resume :return: none """ self.prAccepted .setChecked(True) self.prRejectReason .setValue(0) @Slot() def do_pause_resume(self): """ slot for UF pause/resume :return: none """ self.td_interface.cmd_send_general_response( message_id = 72, accepted = 1 if self.prAccepted.isChecked() else 0, reason = self.prRejectReason.value() ) @Slot() def init_confirm(self): """ slot for initializing UF confirm :return: none """ self.confirmAccepted .setChecked(True) self.confirmRejectReason .setValue(0) self.confirmVolume .setValue(0) self.confirmDuration .setValue(0) self.confirmRate .setValue(0) @Slot() def do_confirm(self): """ slot for UF confirm :return: none """ payload = conversions.integer_to_bytearray(int(1 if self.confirmAccepted.isChecked() else 0)) payload += conversions.integer_to_bytearray(self.confirmRejectReason.value()) payload += conversions.float_to_bytearray(self.confirmVolume.value()) payload += conversions.integer_to_bytearray(self.confirmDuration.value()) payload += conversions.float_to_bytearray(self.confirmRate.value()/1000) self.td_interface.cmd_send_general_response( message_id = 103, accepted = 1 if self.confirmAccepted.isChecked() else 0, reason = self.confirmRejectReason.value(), is_pure_data = False, has_parameters = True, parameters_payload = payload ) @Slot() def do_all_tx_data(self): """ slot for treatment set point Data :return: none """ self.do_uf_data() self.do_settings_change() self.do_pause_resume() self.do_confirm()