Index: TD_Ultrafiltration/interface.ui =================================================================== diff -u -r27b9cdb997c7673ebb2977108b8bff0f8b8cf17c -r29894bf3ecffcde8ce797d373fa8fc28f09a7d95 --- TD_Ultrafiltration/interface.ui (.../interface.ui) (revision 27b9cdb997c7673ebb2977108b8bff0f8b8cf17c) +++ TD_Ultrafiltration/interface.ui (.../interface.ui) (revision 29894bf3ecffcde8ce797d373fa8fc28f09a7d95) @@ -6,8 +6,8 @@ 0 0 - 827 - 410 + 920 + 467 @@ -43,14 +43,14 @@ - + Send - + Reset @@ -85,35 +85,53 @@ 2 - - - - 0 - 0 - - - - - 352 - 0 - - - - - 10 - - - - color: rgb(238, 238, 236); + + + + + + 0 + 0 + + + + + 352 + 0 + + + + + 10 + + + + color: rgb(238, 238, 236); background-color: rgb(92, 53, 102); - - - 62 : [0x3E00] : Ultrafiltration Data - - - Qt::AlignCenter - - + + + 62 : [0x3E00] : Ultrafiltration Data + + + Qt::AlignCenter + + + + + + + Send + + + + + + + Reset + + + + @@ -130,7 +148,7 @@ - + 0 @@ -152,7 +170,7 @@ - + 0 @@ -183,14 +201,14 @@ - Target Rage (L/Hr) + Target Rate (L/Hr) - + 0 @@ -212,7 +230,7 @@ - + 0 @@ -250,7 +268,7 @@ - + 0 @@ -264,15 +282,15 @@ - 200 + 800 Qt::Horizontal - + 0 @@ -308,7 +326,7 @@ - + 0 @@ -417,64 +435,142 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + - Accepted + Req [0x4100] +Volume (mL) + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 20 - 20 - - - - - - - - - - - - + + + + 10 + + + + QFrame::Box + + + QFrame::Raised + + + -- + + + Qt::AlignCenter + + + + + Response + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 10 + + + 5 + + + 2 + + + 5 + + + 2 + + + + + + 10 + + + + Accept + + + true + + + + + + + + 10 + + + + Reject + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Reject Reason - + Qt::AlignCenter - + Volume (mL) - + + + + 250 + 0 + + 8000 @@ -512,17 +608,23 @@ - + Duration (min) - + + + + 250 + 0 + + 4800 @@ -560,17 +662,23 @@ - + Time Diff - + + + + 250 + 0 + + 4800 @@ -608,14 +716,14 @@ - + Rate (L/Hr) - + @@ -656,14 +764,14 @@ - + Rate Diff (L/Hr) - + @@ -704,14 +812,14 @@ - + Old Rate (L/Hr) - + @@ -843,43 +951,129 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + - Accepted + Req [0x4700] + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - + + + + 10 + + + + QFrame::Box + + + QFrame::Raised + + + -- + + + Qt::AlignCenter + + + + + Response + + + + + + + + 0 + 0 + + + + + 10 + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 10 + + + 5 + + + 2 + + + 5 + + + 2 + + + + + + 10 + + + + Accept + + + true + + + + + + + + 10 + + + + Reject + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Reject Reason - + Qt::AlignCenter @@ -971,64 +1165,142 @@ Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - + - Accepted + Req [0x6600] +Volume (mL) + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + - - - - - Qt::Horizontal - - - QSizePolicy::Fixed - - - - 10 - 20 - - - - - - - - - - - - + + + + 10 + + + + QFrame::Box + + + QFrame::Raised + + + -- + + + Qt::AlignCenter + + + + + Response + + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + 10 + + + 5 + + + 2 + + + 5 + + + 2 + + + + + + 10 + + + + Accept + + + true + + + + + + + + 10 + + + + Reject + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Reject Reason - + Qt::AlignCenter - + Volume (mL) - + + + + 250 + 0 + + Qt::Horizontal @@ -1057,17 +1329,23 @@ - + Duration (min) - + + + + 250 + 0 + + Qt::Horizontal @@ -1096,17 +1374,23 @@ - + Rate (L/Hr) - + + + + 250 + 0 + + Qt::Horizontal @@ -1158,8 +1442,8 @@ - tbSend - tbReset + allSendButton + allResetButton Index: TD_Ultrafiltration/loader.py =================================================================== diff -u -ra4ce36086911dccdb53c3afadfc5c7014a1d9898 -r29894bf3ecffcde8ce797d373fa8fc28f09a7d95 --- TD_Ultrafiltration/loader.py (.../loader.py) (revision a4ce36086911dccdb53c3afadfc5c7014a1d9898) +++ TD_Ultrafiltration/loader.py (.../loader.py) (revision 29894bf3ecffcde8ce797d373fa8fc28f09a7d95) @@ -34,124 +34,151 @@ self.can_interface = self.td_interface.can_interface super().__init__(os.path.dirname(__file__)) + if self.can_interface is not None: + self.can_interface.register_receiving_publication_function( + CAN.DenaliChannels.ui_to_td_ch_id, + MsgIds.MSG_ID_UI_UF_PAUSE_RESUME_REQUEST.value, + self.handle_pause_resume_request) + self.can_interface.register_receiving_publication_function( + CAN.DenaliChannels.ui_to_td_ch_id, + MsgIds.MSG_ID_UI_ULTRAFILTRATION_VOLUME_TO_VALIDATE.value, + self.handle_settings_change_request) + self.can_interface.register_receiving_publication_function( + CAN.DenaliChannels.ui_to_td_ch_id, + MsgIds.MSG_ID_USER_CONFIRM_UF_SETTINGS_CHANGE_REQUEST.value, + self.handle_confirm_request) + 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.allSend = self.find_widget(QtWidgets.QToolButton , 'allSendButton' ) + self.allReset = self.find_widget(QtWidgets.QToolButton , 'allResetButton' ) - 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.ufDataSend = self.find_widget(QtWidgets.QToolButton, 'ufDataSendButton' ) + self.ufDataReset = self.find_widget(QtWidgets.QToolButton, 'ufDataResetButton' ) + self.ufSetVolume = self.find_widget(QtWidgets.QSlider , 'ufSetVolumeSlider' ) + self.ufTargetRate = self.find_widget(QtWidgets.QSlider , 'ufTargetRateSlider' ) + self.ufVolumeDelivered = self.find_widget(QtWidgets.QSlider , 'ufVolumeDeliveredSlider' ) + self.ufState = self.find_widget(QtWidgets.QSpinBox , 'ufStateSpinBox' ) + self.ufSetVolumeLabel = self.find_widget(QtWidgets.QLabel , 'ufSetVolumeLabel' ) + self.ufTargetRateLabel = self.find_widget(QtWidgets.QLabel , 'ufTargetRateLabel' ) + self.ufVolumeDeliveredLabel = self.find_widget(QtWidgets.QLabel , 'ufVolumeDeliveredLabel' ) - 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.prSend = self.find_widget(QtWidgets.QToolButton , 'prSendButton' ) + self.prReset = self.find_widget(QtWidgets.QToolButton , 'prResetButton' ) + self.prRequestLabel = self.find_widget(QtWidgets.QLabel , 'prRequestLabel' ) + self.prAccepted = self.find_widget(QtWidgets.QRadioButton , 'prAcceptRadioButton' ) + self.prRejectReason = self.find_widget(QtWidgets.QSpinBox , 'prRejectReasonSpinBox' ) - 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.changeSend = self.find_widget(QtWidgets.QToolButton , 'changeSendButton' ) + self.changeReset = self.find_widget(QtWidgets.QToolButton , 'changeResetButton' ) + self.changeRequestLabel = self.find_widget(QtWidgets.QLabel , 'changeRequestLabel' ) + self.changeAccepted = self.find_widget(QtWidgets.QRadioButton , 'changeAcceptRadioButton' ) + 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.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' ) + self.confirmSend = self.find_widget(QtWidgets.QToolButton , 'confirmSendButton' ) + self.confirmReset = self.find_widget(QtWidgets.QToolButton , 'confirmResetButton' ) + self.confirmRequestLabel = self.find_widget(QtWidgets.QLabel , 'confirmRequestLabel' ) + self.confirmAccepted = self.find_widget(QtWidgets.QRadioButton , 'confirmAcceptRadioButton' ) + 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' ) 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.allReset .clicked.connect(self._init_widgets) + self.allSend .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.ufDataSend .clicked.connect(self.do_uf_data) + self.ufDataReset .clicked.connect(self.init_uf_data) + self.ufSetVolume .valueChanged.connect(self.do_uf_data) + self.ufTargetRate .valueChanged.connect(self.do_uf_data) + self.ufVolumeDelivered .valueChanged.connect(self.do_uf_data) + self.ufState .valueChanged.connect(self.do_uf_data) self.prSend.clicked.connect(self.do_pause_resume) self.prReset.clicked.connect(self.init_pause_resume) + self.changeSend.clicked.connect(self.do_settings_change) + self.changeReset.clicked.connect(self.init_settings_change) 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.confirmSend.clicked.connect(self.do_confirm) + self.confirmReset.clicked.connect(self.init_confirm) 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_uf_data() self.init_settings_change() self.init_pause_resume() self.init_confirm() @Slot() + def init_uf_data(self): + """ + slot for initializing UF settings change + :return: none + """ + self.ufSetVolume .setValue(0) + self.ufTargetRate .setValue(0) + self.ufVolumeDelivered .setValue(0) + self.ufState .setValue(0) + + @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() + set_volume = self.ufSetVolume .value() / self.uf_scaling + target_rate = self.ufTargetRate .value() / self.uf_scaling + volume_delivered = self.ufVolumeDelivered.value() / self.uf_scaling + state = self.ufState .value() - self.setVolumeLabel .setText(f"{set_volume:.2f}" ) - self.targetRateLabel .setText(f"{target_rate:.2f}" ) - self.volumeDeliveredLabel .setText(f"{volume_delivered:.2f}" ) - + self.ufSetVolumeLabel .setText(f"{set_volume:.2f}" ) + self.ufTargetRateLabel .setText(f"{target_rate:.2f}" ) + self.ufVolumeDeliveredLabel .setText(f"{volume_delivered:.2f}" ) + self.td_interface.td_ultrafiltration( set_volume , target_rate , volume_delivered , - state + state ) @Slot() @@ -160,6 +187,7 @@ slot for initializing UF settings change :return: none """ + self.changeRequestLabel .setText("--") self.changeAccepted .setChecked(True) self.changeRejectReason .setValue(0) self.changeVolume .setValue(0) @@ -170,6 +198,17 @@ self.changeOldRate .setValue(0) @Slot() + def handle_settings_change_request(self, message, timestamp = 0.0): + """ + Called when the user requests UF settings change to firmware from UI + @return: None + """ + message = message['message'] + index = MsgFieldPositions.START_POS_FIELD_1 + value,index = conversions.bytearray_to_float(message, index) + self.changeRequestLabel.setText(f"{value:.0f}") + + @Slot() def do_settings_change(self): """ slot for UF settings change @@ -185,7 +224,7 @@ payload += conversions.float_to_bytearray(self.changeOldRate.value()/1000) self.td_interface.cmd_send_general_response( - message_id = 66, + message_id = MsgIds.MSG_ID_TD_RESP_ULTRAFILTRATION_VOLUME_TO_VALIDATE.value, accepted = 1 if self.changeAccepted.isChecked() else 0, reason = self.changeRejectReason.value(), is_pure_data = False, @@ -199,17 +238,29 @@ slot for initializing UF pause/resume :return: none """ + self.prRequestLabel .setText("--") self.prAccepted .setChecked(True) self.prRejectReason .setValue(0) @Slot() + def handle_pause_resume_request(self, message, timestamp = 0.0): + """ + Called when the user requests pause/resume to firmware from UI + @return: None + """ + message = message['message'] + index = MsgFieldPositions.START_POS_FIELD_1 + state,index = conversions.bytearray_to_integer(message, index) + self.prRequestLabel.setText(f"Resume({state})" if state else f"Pause({state})") + + @Slot() def do_pause_resume(self): """ slot for UF pause/resume :return: none """ self.td_interface.cmd_send_general_response( - message_id = 72, + message_id = MsgIds.MSG_ID_TD_UF_PAUSE_RESUME_RESPONSE.value, accepted = 1 if self.prAccepted.isChecked() else 0, reason = self.prRejectReason.value() ) @@ -227,6 +278,17 @@ self.confirmRate .setValue(0) @Slot() + def handle_confirm_request(self, message, timestamp = 0.0): + """ + Called when the user requests confirm to firmware from UI + @return: None + """ + message = message['message'] + index = MsgFieldPositions.START_POS_FIELD_1 + value,index = conversions.bytearray_to_float(message, index) + self.confirmRequestLabel.setText(f"{value:.0f}") + + @Slot() def do_confirm(self): """ slot for UF confirm @@ -239,7 +301,7 @@ payload += conversions.float_to_bytearray(self.confirmRate.value()/1000) self.td_interface.cmd_send_general_response( - message_id = 103, + message_id = MsgIds.MSG_ID_USER_UF_SETTINGS_CHANGE_CONFIRMATION_RESPONSE.value, accepted = 1 if self.confirmAccepted.isChecked() else 0, reason = self.confirmRejectReason.value(), is_pure_data = False,