Index: simulator/run.py =================================================================== diff -u -rbefca1db0402e031a5b692aa93dc74bfb314eb9e -refb0dcc34f39f35d41f43cca9667db17fd97c844 --- simulator/run.py (.../run.py) (revision befca1db0402e031a5b692aa93dc74bfb314eb9e) +++ simulator/run.py (.../run.py) (revision efb0dcc34f39f35d41f43cca9667db17fd97c844) @@ -1,4 +1,3 @@ - # import system modules import sys @@ -12,6 +11,7 @@ from PySide2.QtCore import QFile, Slot from PySide2.QtGui import qApp from PySide2.QtCore import QTimer +from dialin.common import Ranges class RunTimeWidget: @@ -81,11 +81,20 @@ """ convenient method of find_child for QComboBox :param name: (str) name of the QComboBox Object - :return: (QPushButton) reference to the QComboBox + :return: (QComboBox) reference to the QComboBox """ child = self.__find_child(QtWidgets.QComboBox, name) return child + def find_checkox(self, name: str) -> QtWidgets.QCheckBox: + """ + convenient method of find_child for QCheckBox + :param name: (str) name of the QCheckBox Object + :return: (QCheckBox) reference to the QComboBox + """ + child = self.__find_child(QtWidgets.QCheckBox, name) + return child + def find_spinbox(self, name: str) -> QtWidgets.QSpinBox: """ convenient method of find_child for QSpinBox @@ -118,11 +127,13 @@ """ The simulator class which loads the ui file dynamically and initializes the objects and can be eventually shown. + Note: this class is growing fast and seems like needs to be multiple classes """ # global variables declarations ui_file_name = "Simulator.ui" timer: QTimer - + # checkbox + chkRangesBroadcast: QtWidgets.QCheckBox # pushbutton btnSalineAccept: QtWidgets.QPushButton btnSalineReject: QtWidgets.QPushButton @@ -132,29 +143,45 @@ btnUfResumeReject: QtWidgets.QPushButton btnUfEditAccept: QtWidgets.QPushButton btnUfEditReject: QtWidgets.QPushButton + btnAVPressuresAccept: QtWidgets.QPushButton + btnAVPressuresReject: QtWidgets.QPushButton # label lblSalineAction: QtWidgets.QLabel lblUfPauseAction: QtWidgets.QLabel lblUfResumeAction: QtWidgets.QLabel lblUfEditAction: QtWidgets.QLabel + lblArterialTitle: QtWidgets.QLabel + lblVenousTitle: QtWidgets.QLabel + lblAVPressuresAction: QtWidgets.QLabel + lblArterialLimitLow: QtWidgets.QLabel + lblArterialLimitHigh: QtWidgets.QLabel + lblVenousLimitLow: QtWidgets.QLabel + lblVenousLimitHigh: QtWidgets.QLabel # spinbox spnSalineRejectReason: QtWidgets.QSpinBox spnUfPauseRejectReason: QtWidgets.QSpinBox spnUfResumeRejectReason: QtWidgets.QSpinBox spnUfEditRejectReason: QtWidgets.QSpinBox + spnAVPressuresRejectReason: QtWidgets.QSpinBox spnDurationMin: QtWidgets.QSpinBox spnDurationMax: QtWidgets.QSpinBox spnUFVolumeMin: QtWidgets.QSpinBox spnUFVolumeMax: QtWidgets.QSpinBox spnDialysateMin: QtWidgets.QSpinBox spnDialysateMax: QtWidgets.QSpinBox + spnArterialLimitLow: QtWidgets.QSpinBox + spnArterialLimitHigh: QtWidgets.QSpinBox + spnVenousLimitLow: QtWidgets.QSpinBox + spnVenousLimitHigh: QtWidgets.QSpinBox # combobox cmbSalineAcceptTarget: QtWidgets.QComboBox # sliders sldSalineTarget: QtWidgets.QSlider sldSalineCumulative: QtWidgets.QSlider sldSalineVolume: QtWidgets.QSlider sldUfVolume: QtWidgets.QSlider + sldArterialValue: QtWidgets.QSlider + sldVenousValue: QtWidgets.QSlider # tables tblSalineSubMode: QtWidgets.QTableWidget tblSalineUFStates: QtWidgets.QTableWidget @@ -179,6 +206,7 @@ self.spnUFVolumeMax = self.find_spinbox('spnUFVolumeMax') self.spnDialysateMin = self.find_spinbox('spnDialysateMin') self.spnDialysateMax = self.find_spinbox('spnDialysateMax') + self.chkRangesBroadcast = self.find_checkox('chkRangesBroadcast') self.timer = QTimer() self.timer.start(1000) self.timer.timeout.connect(self.do_ranges_data) @@ -249,6 +277,74 @@ self.tblSalineUFStates.cellClicked.connect(self.do_saline_saline_state) self.tblSalineSalineStates.cellClicked.connect(self.do_saline_saline_state) + def setup_pressures_limits(self): + """ + sets up the treatment pressures + :return: none + """ + self.lblArterialTitle = self.find_label('lblArterialTitle') + self.lblVenousTitle = self.find_label('lblVenousTitle') + self.lblArterialLimitLow = self.find_label('lblArterialLimitLow') + self.lblArterialLimitHigh = self.find_label('lblArterialLimitHigh') + self.lblVenousLimitLow = self.find_label('lblVenousLimitLow') + self.lblVenousLimitHigh = self.find_label('lblVenousLimitHigh') + self.lblAVPressuresAction = self.find_label('lblAVPressuresAction') + + self.btnAVPressuresAccept = self.find_button('btnAVPressuresAccept') + self.btnAVPressuresReject = self.find_button('btnAVPressuresReject') + + self.spnArterialLimitLow = self.find_spinbox('spnArterialLimitLow') + self.spnArterialLimitHigh = self.find_spinbox('spnArterialLimitHigh') + self.spnVenousLimitLow = self.find_spinbox('spnVenousLimitLow') + self.spnVenousLimitHigh = self.find_spinbox('spnVenousLimitHigh') + self.spnAVPressuresRejectReason = self.find_spinbox('spnAVPressuresRejectReason') + + self.sldArterialValue = self.find_slider('sldArterialValue') + self.sldVenousValue = self.find_slider('sldVenousValue') + + self.lblArterialTitle.setText( + f"{self.lblArterialTitle.text()} [{Ranges.ARTERIAL_PRESSURE_MINIMUM},{Ranges.ARTERIAL_PRESSURE_MAXIMUM}]" + ) + self.lblVenousTitle.setText( + f"{self.lblVenousTitle.text()} [{Ranges.VENOUS_PRESSURE_MINIMUM},{Ranges.VENOUS_PRESSURE_MAXIMUM}]" + ) + + self.lblArterialLimitLow.setText(f"{Ranges.ARTERIAL_PRESSURE_LOW_MIN}\n{Ranges.ARTERIAL_PRESSURE_LOW_MAX}") + self.lblArterialLimitHigh.setText(f"{Ranges.ARTERIAL_PRESSURE_HIGH_MIN}\n{Ranges.ARTERIAL_PRESSURE_HIGH_MAX}") + self.lblVenousLimitLow.setText(f"{Ranges.VENOUS_PRESSURE_LOW_MIN}\n{Ranges.VENOUS_PRESSURE_LOW_MAX}") + self.lblVenousLimitHigh.setText(f"{Ranges.VENOUS_PRESSURE_HIGH_MIN}\n{Ranges.VENOUS_PRESSURE_HIGH_MAX}") + + # sending the CANBus message when slider value changed + self.sldArterialValue.valueChanged.connect(self.do_pressures_data) + self.sldVenousValue.valueChanged.connect(self.do_pressures_data) + + # sending the CANBus message when accepted or rejected + self.btnAVPressuresAccept.clicked.connect(self.do_pressures_limits_accept) + self.btnAVPressuresReject.clicked.connect(self.do_pressures_limits_reject) + + self.sldArterialValue.setMinimum(Ranges.ARTERIAL_PRESSURE_MINIMUM) + self.sldArterialValue.setMaximum(Ranges.ARTERIAL_PRESSURE_MAXIMUM) + self.sldArterialValue.setValue(0) + self.sldVenousValue.setMinimum(Ranges.VENOUS_PRESSURE_MINIMUM) + self.sldVenousValue.setMaximum(Ranges.VENOUS_PRESSURE_MAXIMUM) + self.sldVenousValue.setValue(0) + + self.spnArterialLimitLow.setMinimum(Ranges.ARTERIAL_PRESSURE_LOW_MIN) + self.spnArterialLimitLow.setMaximum(Ranges.ARTERIAL_PRESSURE_LOW_MAX) + self.spnArterialLimitLow.setValue(Ranges.ARTERIAL_PRESSURE_LOW_DEF) + + self.spnArterialLimitHigh.setMinimum(Ranges.ARTERIAL_PRESSURE_HIGH_MIN) + self.spnArterialLimitHigh.setMaximum(Ranges.ARTERIAL_PRESSURE_HIGH_MAX) + self.spnArterialLimitHigh.setValue(Ranges.ARTERIAL_PRESSURE_HIGH_DEF) + + self.spnVenousLimitLow.setMinimum(Ranges.VENOUS_PRESSURE_LOW_MIN) + self.spnVenousLimitLow.setMaximum(Ranges.VENOUS_PRESSURE_LOW_MAX) + self.spnVenousLimitLow.setValue(Ranges.VENOUS_PRESSURE_LOW_DEF) + + self.spnVenousLimitHigh.setMinimum(Ranges.VENOUS_PRESSURE_HIGH_MIN) + self.spnVenousLimitHigh.setMaximum(Ranges.VENOUS_PRESSURE_HIGH_MAX) + self.spnVenousLimitHigh.setValue(Ranges.VENOUS_PRESSURE_HIGH_DEF) + @Slot() def do_sb_accept(self): """ @@ -374,15 +470,60 @@ sends the treatment ranges message with given value on the screen :return: none """ - denaliMessages.setTreatmentParamRanges( - self.spnDurationMin.value(), - self.spnDurationMax.value(), - self.spnUFVolumeMin.value(), - self.spnUFVolumeMax.value(), - self.spnDialysateMin.value(), - self.spnDialysateMax.value() + if self.chkRangesBroadcast.isChecked(): + denaliMessages.setTreatmentParamRanges( + self.spnDurationMin.value(), + self.spnDurationMax.value(), + self.spnUFVolumeMin.value(), + self.spnUFVolumeMax.value(), + self.spnDialysateMin.value(), + self.spnDialysateMax.value() + ) + + @Slot() + def do_pressures_data(self): + """ + sends the pressures values message with given value on the screen + :return: none + """ + denaliMessages.setPressureOcclusionData( + self.sldArterialValue.value(), + self.sldVenousValue.value(), + 0, 0, 0 ) + @Slot() + def do_pressures_limits_accept(self): + """ + sends the pressures values message with given value on the screen + :return: none + """ + # vAccepted, vReason, vArterialLow, vArterialHigh, vVenousLow, vVenousHigh + denaliMessages.sendTreatmentAdjustPressuresLimitsResponse( + EResponse.Accepted, 0, + self.spnArterialLimitLow.value(), + self.spnArterialLimitHigh.value(), + self.spnVenousLimitLow.value(), + self.spnVenousLimitHigh.value() + ) + self.lblAVPressuresAction.setText('Accepted ') + + @Slot() + def do_pressures_limits_reject(self): + """ + sends the pressures values message with given value on the screen + :return: none + """ + reason = self.spnAVPressuresRejectReason.value() + denaliMessages.sendTreatmentAdjustPressuresLimitsResponse( + EResponse.Rejected, reason, + self.spnArterialLimitLow.value(), + self.spnArterialLimitHigh.value(), + self.spnVenousLimitLow.value(), + self.spnVenousLimitHigh.value() + ) + self.lblAVPressuresAction.setText('Rejected ' + "{}".format(reason)) + def initialize(self): """ initializes the class by calling it's initializer methods to make objects ready @@ -393,6 +534,7 @@ self.setup_saline_data() self.setup_uf_adjustment() self.setup_treatment_states() + self.setup_pressures_limits() def main():