""" The TD Main Treatment Data 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): """ The TD Main Treatment Data ui loader """ 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 message_id = MsgIds.MSG_ID_UI_SOLUTION_INFUSION_REQUEST.value self.can_interface.register_receiving_publication_function(channel_id, message_id, self.handle_solution_infusion_request) self.saline_bolus_req.setText("Saline Bolus Req[{0}00]".format(f"0x{message_id:02X}")) 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.saline_tgt_vol = self.find_widget(QtWidgets.QSlider , 'TargetVolumeSlider' ) self.saline_cum_vol = self.find_widget(QtWidgets.QSlider , 'CumulativeVolumeSlider' ) self.saline_bol_del = self.find_widget(QtWidgets.QSlider , 'SalineCurrDeliveredVolumeSlider' ) 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.tx_duration = self.find_widget(QtWidgets.QSlider , 'DurationSlider' ) self.tx_elapsed = self.find_widget(QtWidgets.QSlider , 'ElapsedSlider' ) self.blood_flow_st_pt = self.find_widget(QtWidgets.QSpinBox , 'BloodFlowSpinBox' ) self.dial_flow_st_pt = self.find_widget(QtWidgets.QSpinBox , 'DialFlowDpinBox' ) self.dial_temp_st_pt = self.find_widget(QtWidgets.QDoubleSpinBox , 'DialTempDoubleSpinBox' ) self.saline_bolus_req = self.find_widget(QtWidgets.QLabel , 'saline_bolus_req' ) self.lbBolusStart = self.find_widget(QtWidgets.QLabel , 'lbBolusStart' ) 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.saline_tgt_vol .valueChanged.connect(self.do_saline_data) self.saline_cum_vol .valueChanged.connect(self.do_saline_data) self.saline_bol_del .valueChanged.connect(self.do_saline_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.tx_duration .valueChanged.connect(self.do_tx_time_data) self.tx_elapsed .valueChanged.connect(self.do_tx_time_data) self.blood_flow_st_pt.valueChanged.connect(self.do_tx_set_point_data) self.dial_flow_st_pt .valueChanged.connect(self.do_tx_set_point_data) self.dial_temp_st_pt .valueChanged.connect(self.do_tx_set_point_data) def handle_solution_infusion_request(self, message, timestamp = 0.0): """ Called when the user requests to firmware from UI @return: None """ message = message['message'] index = MsgFieldPositions.START_POS_FIELD_1 state,index = conversions.bytearray_to_integer( message, index) self.lbBolusStart .setText( str(state) ) @Slot() def _init_widgets(self): """ initializes the widgets' properties :return: none """ self.saline_tgt_vol .setValue(0) self.saline_cum_vol .setValue(0) self.saline_bol_del .setValue(0) self.init_uf_data() self.tx_duration .setValue(0) self.tx_elapsed .setValue(0) self.blood_flow_st_pt .setValue(0) self.dial_flow_st_pt .setValue(0) self.dial_temp_st_pt .setValue(0) @Slot() def do_saline_data(self): """ the slot for Saline Data :return: none """ target_volume = self.saline_tgt_vol.value() cumulative_volume = self.saline_cum_vol.value() bolus_volume = self.saline_bol_del.value() self.td_interface.td_saline( target_volume , cumulative_volume , bolus_volume , 0 ) @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.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.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 ) @Slot() def do_tx_time_data(self): """ the slot for treatment time Data :return: none """ tx_duration_s = self.tx_duration.value() tx_elapsed_s = self.tx_elapsed.value() tx_remaining_s = 0 if tx_duration_s-tx_elapsed_s <= 0 else tx_duration_s-tx_elapsed_s self.td_interface.td_treatment_time( tx_duration_s , tx_elapsed_s , tx_remaining_s ) @Slot() def do_tx_set_point_data(self): """ the slot for treatment set point Data :return: none """ blood_flow = self.blood_flow_st_pt.value() dialysate_flow = self.dial_flow_st_pt .value() dialysate_temp = self.dial_temp_st_pt .value() self.td_interface.td_treatment_set_points( blood_flow , dialysate_flow , dialysate_temp ) @Slot() def do_all_tx_data(self): """ the slot for treatment set point Data :return: none """ self.do_saline_data() self.do_tx_time_data() self.do_tx_set_point_data()