""" The ui loader class """ # Python import os import can import struct # Qt from PySide2 import QtWidgets from PySide2.QtCore import Slot # parent from engine.dynamicloader import DynamicLoader # plugin specific # dialin from leahi_dialin.ui.td_messaging import TD_Messaging from leahi_dialin.common.td_defs import TDOpModes from leahi_dialin.common.td_defs import TDStandbyStates from leahi_dialin.common.msg_defs import MsgIds, MsgFieldPositions from leahi_dialin.protocols import CAN from leahi_dialin.utils import conversions class Loader(DynamicLoader): """ The ui loader class """ def __init__(self): self.td_interface = TD_Messaging() self.can_interface = self.td_interface.can_interface super().__init__(os.path.dirname(__file__)) if self.can_interface is not None: channel_id = CAN.DenaliChannels.ui_to_td_ch_id create_tx_request_message_id = MsgIds.MSG_ID_UI_INITIATE_TREATMENT_WORKFLOW.value self.can_interface.register_receiving_publication_function(channel_id, create_tx_request_message_id, self.handle_create_tx_request) load_request_message_id = MsgIds.MSG_ID_UI_ADJUST_DISPOSABLES_CONFIRM_REQUEST.value self.can_interface.register_receiving_publication_function(channel_id, load_request_message_id, self.handle_load_request) start_tx_request_message_id = MsgIds.MSG_ID_UI_ADJUST_START_TREATMENT_REQUEST.value self.can_interface.register_receiving_publication_function(channel_id, start_tx_request_message_id, self.handle_start_tx_request) validate_request_message_id = MsgIds.MSG_ID_UI_TREATMENT_PARAMS_TO_VALIDATE.value self.can_interface.register_receiving_publication_function(channel_id, validate_request_message_id, self.handle_validate_request) def _init_loader(self): """ finds and creates widgets :return: none """ self.btnStandby = self.find_widget(QtWidgets.QPushButton, 'btnStandby' ) self.btnCreate_tx = self.find_widget(QtWidgets.QPushButton, 'btnCreate' ) self.btnCreateReset = self.find_widget(QtWidgets.QToolButton, 'btnCreateReset' ) self.btnValidate = self.find_widget(QtWidgets.QPushButton, 'btnValidate' ) self.btnValidateReset = self.find_widget(QtWidgets.QToolButton, 'btnValidateReset' ) self.btnStartTreatment = self.find_widget(QtWidgets.QPushButton, 'btnConfirm' ) self.btnAutoLoad = self.find_widget(QtWidgets.QPushButton, 'btnAutoLoadSend' ) self.spnCreateRxRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnCreateRxRejectReason' ) self.spnAutoLoadRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnLoadReasonSpinBox' ) self.spnStartTxRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnStartTreatmentRejectReason' ) self.lbAutoLoad = self.find_widget(QtWidgets.QLabel , 'lbAutoLoad' ) self.lbStartTreatment = self.find_widget(QtWidgets.QLabel , 'lbStartTreatment' ) self.lbCreateTx = self.find_widget(QtWidgets.QLabel , 'lbCreateTx' ) self.spnBloodFlowRateRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnBloodFlowRateRejectReason' ) self.spnDialysateFlowRateRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnDialysateFlowRateRejectReason' ) self.spnTreatmentDurationRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnTreatmentDurationRejectReason' ) self.spnSalineBolusVolumeRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnSalineBolusVolumeRejectReason' ) self.spnHeparinStopTimeRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnHeparinStopTimeRejectReason' ) self.spnHeparinTypeRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnHeparinTypeRejectReason' ) self.spnAcidConcentrateRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnAcidConcentrateRejectReason' ) self.spnBicarbonateConcentrateRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnBicarbonateConcentrateRejectReason' ) self.spnDialyzerTypeRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnDialyzerTypeRejectReason' ) self.spnBloodPressureMeasureIntervalRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnBloodPressureMeasureIntervalRejectReason' ) self.spnRinsebackFlowRateRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnRinsebackFlowRateRejectReason' ) self.spnRinsebackVolumeRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnRinsebackVolumeRejectReason' ) self.spnArterialPressureLimitWindowRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnArterialPressureLimitWindowRejectReason' ) self.spnVenousPressureLimitWindowRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnVenousPressureLimitWindowRejectReason' ) self.spnVenousPressureLimitAsymtrcRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnVenousPressureLimitAsymtrcRejectReason' ) self.spnTransmembranePressureLimitWindowRejectReason= self.find_widget(QtWidgets.QSpinBox , 'spnTransmembranePressureLimitWindowRejectReason' ) self.spnDialysateTempRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnDialysateTempRejectReason' ) self.spnHeparinDispensingRateRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnHeparinDispensingRateRejectReason' ) self.spnHeparinBolusVolumeRejectReason = self.find_widget(QtWidgets.QSpinBox , 'spnHeparinBolusVolumeRejectReason' ) self.lbBloodFlowRate = self.find_widget(QtWidgets.QLabel , 'lbBloodFlowRateValue' ) self.lbDialysateFlowRate = self.find_widget(QtWidgets.QLabel , 'lbDialysateFlowRateValue' ) self.lbTreatmentDuration = self.find_widget(QtWidgets.QLabel , 'lbTreatmentDurationValue' ) self.lbSalineBolusVolume = self.find_widget(QtWidgets.QLabel , 'lbSalineBolusVolumeValue' ) self.lbHeparinStopTime = self.find_widget(QtWidgets.QLabel , 'lbHeparinStopTimeValue' ) self.lbHeparinType = self.find_widget(QtWidgets.QLabel , 'lbHeparinTypeValue' ) self.lbAcidConcentrate = self.find_widget(QtWidgets.QLabel , 'lbAcidConcentrateValue' ) self.lbBicarbonateConcentrate = self.find_widget(QtWidgets.QLabel , 'lbBicarbonateConcentrateValue' ) self.lbDialyzerType = self.find_widget(QtWidgets.QLabel , 'lbDialyzerTypeValue' ) self.lbBloodPressureMeasureInterval = self.find_widget(QtWidgets.QLabel , 'lbBloodPressureMeasureIntervalValue' ) self.lbRinsebackFlowRate = self.find_widget(QtWidgets.QLabel , 'lbRinsebackFlowRateValue' ) self.lbRinsebackVolume = self.find_widget(QtWidgets.QLabel , 'lbRinsebackVolumeValue' ) self.lbArterialPressureLimitWindow = self.find_widget(QtWidgets.QLabel , 'lbArterialPressureLimitWindowValue' ) self.lbVenousPressureLimitWindow = self.find_widget(QtWidgets.QLabel , 'lbVenousPressureLimitWindowValue' ) self.lbVenousPressureLimitAsymtrc = self.find_widget(QtWidgets.QLabel , 'lbVenousPressureLimitAsymtrcValue' ) self.lbTransmembranePressureLimitWindow = self.find_widget(QtWidgets.QLabel , 'lbTransmembranePressureLimitWindowValue' ) self.lbDialysateTemp = self.find_widget(QtWidgets.QLabel , 'lbDialysateTempValue' ) self.lbHeparinDispensingRate = self.find_widget(QtWidgets.QLabel , 'lbHeparinDispensingRateValue' ) self.lbHeparinBolusVolume = self.find_widget(QtWidgets.QLabel , 'lbHeparinBolusVolumeValue' ) def _init_widgets(self): """ initializes the widgets' properties :return: none """ self.do_validateReset() self.spnCreateRxRejectReason.setValue(0) self.spnAutoLoadRejectReason.setValue(0) self.spnStartTxRejectReason .setValue(0) def _init_connections(self): """ initializes the widgets connections :return: """ self.btnStandby .clicked.connect(self.do_standby ) self.btnCreate_tx .clicked.connect(self.do_create_tx ) self.btnCreateReset .clicked.connect(self.do_createReset ) self.btnValidate .clicked.connect(self.do_validate ) self.btnValidateReset .clicked.connect(self.do_validateReset ) self.btnStartTreatment .clicked.connect(self.do_start ) self.btnAutoLoad .clicked.connect(self.do_auto_load ) @Slot() def do_standby(self): self.td_interface.td_operation_mode( TDOpModes.MODE_STAN.value, TDStandbyStates.STANDBY_WAIT_FOR_TREATMENT_STATE.value ) @Slot() def do_create_tx(self): self.lbCreateTx.setText("-") if self.spnCreateRxRejectReason.value() == 0 : self.td_interface.td_Treatment_Parameters_CreateRx (0) self.td_interface.td_operation_mode( TDOpModes.MODE_PRET.value, TDStandbyStates.STANDBY_WAIT_FOR_TREATMENT_STATE.value ) else: self.td_interface.td_Treatment_Parameters_CreateRx (self.spnCreateRxRejectReason.value()) @Slot() def do_createReset(self): self.spnCreateRxRejectReason.setValue(0) self.lbCreateTx.setText("-") @Slot() def do_start(self): self.td_interface.td_operation_mode( TDOpModes.MODE_TREA.value, TDStandbyStates.STANDBY_WAIT_FOR_TREATMENT_STATE.value ) self.lbStartTreatment.setText("-") @Slot() def do_auto_load(self): reason = self.spnAutoLoadRejectReason.value() self.td_interface.td_blood_set_auto_load_response(reason) self.lbAutoLoad.setText("-") @Slot() def do_validate(self): """ send the validation response message :return: none """ accepted = ( self.spnBloodFlowRateRejectReason .value() + self.spnDialysateFlowRateRejectReason .value() + self.spnTreatmentDurationRejectReason .value() + self.spnSalineBolusVolumeRejectReason .value() + self.spnHeparinStopTimeRejectReason .value() + self.spnHeparinTypeRejectReason .value() + self.spnAcidConcentrateRejectReason .value() + self.spnBicarbonateConcentrateRejectReason .value() + self.spnDialyzerTypeRejectReason .value() + self.spnBloodPressureMeasureIntervalRejectReason .value() + self.spnRinsebackFlowRateRejectReason .value() + self.spnRinsebackVolumeRejectReason .value() + self.spnArterialPressureLimitWindowRejectReason .value() + self.spnVenousPressureLimitWindowRejectReason .value() + self.spnVenousPressureLimitAsymtrcRejectReason .value() + self.spnTransmembranePressureLimitWindowRejectReason.value() + self.spnDialysateTempRejectReason .value() + self.spnHeparinDispensingRateRejectReason .value() + self.spnHeparinBolusVolumeRejectReason .value() ) == 0 self.td_interface.td_Treatment_Parameters_Validation( 1 if accepted else 0, self.spnBloodFlowRateRejectReason .value(), self.spnDialysateFlowRateRejectReason .value(), self.spnTreatmentDurationRejectReason .value(), self.spnSalineBolusVolumeRejectReason .value(), self.spnHeparinStopTimeRejectReason .value(), self.spnHeparinTypeRejectReason .value(), self.spnAcidConcentrateRejectReason .value(), self.spnBicarbonateConcentrateRejectReason .value(), self.spnDialyzerTypeRejectReason .value(), self.spnBloodPressureMeasureIntervalRejectReason .value(), self.spnRinsebackFlowRateRejectReason .value(), self.spnRinsebackVolumeRejectReason .value(), self.spnArterialPressureLimitWindowRejectReason .value(), self.spnVenousPressureLimitWindowRejectReason .value(), self.spnVenousPressureLimitAsymtrcRejectReason .value(), self.spnTransmembranePressureLimitWindowRejectReason.value(), self.spnDialysateTempRejectReason .value(), self.spnHeparinDispensingRateRejectReason .value(), self.spnHeparinBolusVolumeRejectReason .value() ) @Slot() def do_validateReset(self): self.spnBloodFlowRateRejectReason .setValue(0) self.spnDialysateFlowRateRejectReason .setValue(0) self.spnTreatmentDurationRejectReason .setValue(0) self.spnSalineBolusVolumeRejectReason .setValue(0) self.spnHeparinStopTimeRejectReason .setValue(0) self.spnHeparinTypeRejectReason .setValue(0) self.spnAcidConcentrateRejectReason .setValue(0) self.spnBicarbonateConcentrateRejectReason .setValue(0) self.spnDialyzerTypeRejectReason .setValue(0) self.spnBloodPressureMeasureIntervalRejectReason .setValue(0) self.spnRinsebackFlowRateRejectReason .setValue(0) self.spnRinsebackVolumeRejectReason .setValue(0) self.spnArterialPressureLimitWindowRejectReason .setValue(0) self.spnVenousPressureLimitWindowRejectReason .setValue(0) self.spnVenousPressureLimitAsymtrcRejectReason .setValue(0) self.spnTransmembranePressureLimitWindowRejectReason.setValue(0) self.spnDialysateTempRejectReason .setValue(0) self.spnHeparinDispensingRateRejectReason .setValue(0) self.spnHeparinBolusVolumeRejectReason .setValue(0) @Slot() def handle_load_request(self, message, timestamp = 0.0): """ Called when the user requests to firmware from UI @return: None """ self.lbAutoLoad.setText("Requested") @Slot() def handle_create_tx_request(self, message, timestamp = 0.0): """ Called when the user requests to firmware from UI @return: None """ self.lbCreateTx.setText("Create Tx Requested") @Slot() def handle_start_tx_request(self, message, timestamp = 0.0): """ Called when the user requests to firmware from UI @return: None """ self.lbStartTreatment.setText("Start Tx Requested") @Slot() def handle_validate_request(self, message, timestamp = 0.0): """ Called when the user requests to firmware from UI @return: None """ message = message['message'] self.index = MsgFieldPositions.START_POS_FIELD_1 self.lbBloodFlowRate .setText(str(self.getIntValue(message))) self.lbDialysateFlowRate .setText(str(self.getIntValue(message))) self.lbTreatmentDuration .setText(str(self.getIntValue(message))) self.lbSalineBolusVolume .setText(str(self.getIntValue(message))) self.lbHeparinStopTime .setText(str(self.getIntValue(message))) self.lbHeparinType .setText(str(self.getIntValue(message))) self.lbAcidConcentrate .setText(str(self.getIntValue(message))) self.lbBicarbonateConcentrate .setText(str(self.getIntValue(message))) self.lbDialyzerType .setText(str(self.getIntValue(message))) self.lbBloodPressureMeasureInterval .setText(str(self.getIntValue(message))) self.lbRinsebackFlowRate .setText(str(self.getIntValue(message))) self.lbRinsebackVolume .setText(str(self.getIntValue(message))) self.lbArterialPressureLimitWindow .setText(str(self.getIntValue(message))) self.lbVenousPressureLimitWindow .setText(str(self.getIntValue(message))) self.lbVenousPressureLimitAsymtrc .setText(str(self.getIntValue(message))) self.lbTransmembranePressureLimitWindow .setText(str(self.getIntValue(message))) self.lbDialysateTemp .setText(f"{self.getFloatValue(message):.1f}") self.lbHeparinDispensingRate .setText(f"{self.getFloatValue(message):.1f}") self.lbHeparinBolusVolume .setText(f"{self.getFloatValue(message):.1f}") def getIntValue (self, message): val,self.index = conversions.bytearray_to_integer( message, self.index) return val def getFloatValue (self, message): val,self.index = conversions.bytearray_to_float( message, self.index) return val