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()