Index: TD_ParamRanges/interface.ui =================================================================== diff -u -r871361792769299b3f8f2033b058ba343cec0aa7 -ra4ce36086911dccdb53c3afadfc5c7014a1d9898 --- TD_ParamRanges/interface.ui (.../interface.ui) (revision 871361792769299b3f8f2033b058ba343cec0aa7) +++ TD_ParamRanges/interface.ui (.../interface.ui) (revision a4ce36086911dccdb53c3afadfc5c7014a1d9898) @@ -29,7 +29,7 @@ - &3 Treatment/&5 Param Ranges + &7 Param Ranges/&Param Ranges Index: TD_Ultrafiltration/interface.ui =================================================================== diff -u --- TD_Ultrafiltration/interface.ui (revision 0) +++ TD_Ultrafiltration/interface.ui (revision a4ce36086911dccdb53c3afadfc5c7014a1d9898) @@ -0,0 +1,1143 @@ + + + ui_interface + + + + 0 + 0 + 837 + 453 + + + + + 100000 + 100000 + + + + &8 Ultrafiltration/&1 Ultrafiltration + + + + + + + + + 10 + + + + color: rgb(238, 238, 236); +background-color: rgb(92, 53, 102); + + + + Ultrafiltration + + + Qt::AlignCenter + + + + + + + Send + + + + + + + Reset + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + + 0 + 0 + + + + + 10 + + + + color: rgb(238, 238, 236); +background-color: rgb(92, 53, 102); + + + 72: [0x4800]: Pause/Resume Response + + + Qt::AlignCenter + + + + + + + Send + + + + + + + Reset + + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + Accepted + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + + + + + Reject Reason + + + + + + + Qt::AlignCenter + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + 0 + 0 + + + + + 352 + 0 + + + + + 10 + + + + color: rgb(238, 238, 236); +background-color: rgb(92, 53, 102); + + + 62 : [0x3E00] : Ultrafiltration Data + + + Qt::AlignCenter + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + Set Volume (L) + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + 1000 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 40 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + Target Rage (L/Hr) + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + 1000 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 40 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + Volume Delivered (L) + + + + + + + + + + 0 + 0 + + + + + 250 + 0 + + + + 200 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 40 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + State + + + + + + + + 0 + 0 + + + + Qt::AlignCenter + + + + + + + + + Qt::Vertical + + + + 20 + 0 + + + + + + + + + + + + 0 + 0 + + + + + 0 + 0 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 2 + + + 2 + + + 2 + + + 2 + + + 2 + + + + + + + + 10 + + + + color: rgb(238, 238, 236); +background-color: rgb(92, 53, 102); + + + 66: [0x4200]: Settings Change Response + + + Qt::AlignCenter + + + + + + + Send + + + + + + + Reset + + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + Accepted + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 20 + 20 + + + + + + + + + + + + + + + + + Reject Reason + + + + + + + Qt::AlignCenter + + + + + + + Volume (mL) + + + + + + + + + 8000 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + Duration (min) + + + + + + + + + 4800 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + Time Diff + + + + + + + + + 4800 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + Rate (L/Hr) + + + + + + + + + 2000 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + Rate Diff (L/Hr) + + + + + + + + + 2000 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + Old Rate (L/Hr) + + + + + + + + + 2000 + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 50 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + + + + + 10 + + + + color: rgb(238, 238, 236); +background-color: rgb(92, 53, 102); + + + 103: [0x6700]: Confirm Response + + + Qt::AlignCenter + + + + + + + Send + + + + + + + Reset + + + + + + + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + Accepted + + + + + + + + + Qt::Horizontal + + + QSizePolicy::Fixed + + + + 10 + 20 + + + + + + + + + + + + + + + + + Reject Reason + + + + + + + Qt::AlignCenter + + + + + + + Volume (mL) + + + + + + + + + Qt::Horizontal + + + + + + + + 50 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + Duration (min) + + + + + + + + + Qt::Horizontal + + + + + + + + 50 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + Rate (L/Hr) + + + + + + + + + Qt::Horizontal + + + + + + + + 50 + 0 + + + + + 10 + + + + 0.00 + + + Qt::AlignCenter + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + tbSend + tbReset + + + + Index: TD_Ultrafiltration/loader.py =================================================================== diff -u --- TD_Ultrafiltration/loader.py (revision 0) +++ TD_Ultrafiltration/loader.py (revision a4ce36086911dccdb53c3afadfc5c7014a1d9898) @@ -0,0 +1,259 @@ +""" + 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()