""" 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_SALINE_BOLUS_REQUEST.value self.can_interface.register_receiving_publication_function(channel_id, message_id, self.handle_solution_infusion_request) def _init_loader(self): """ finds and creates widgets :return: none """ 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.UF_set_vol = self.find_widget(QtWidgets.QSlider , 'UFSetVolSlider' ) self.UF_tgt_rate = self.find_widget(QtWidgets.QSlider , 'UFRateSlider' ) self.UF_vol_del = self.find_widget(QtWidgets.QSlider , 'UFVolDelSlider' ) self.UF_State = self.find_widget(QtWidgets.QSpinBox , 'UFStatespinBox' ) self.UF_Max = self.find_widget(QtWidgets.QDoubleSpinBox , 'UFMaxDoubleSpinBox' ) # Value only to configure UF slider 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.uf_scaling = 100.00 # UF Scaling factor to be 2 decimal places self.UF_tgt_rate_label = self.find_widget(QtWidgets.QLabel , 'targetufLabel' ) self.UF_vol_del_label = self.find_widget(QtWidgets.QLabel , 'ufvolumeDeliveredlabel' ) self.UF_set_vol_label = self.find_widget(QtWidgets.QLabel , 'setufvolumeLabel' ) 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.UF_set_vol .valueChanged.connect(self.do_uf_data) self.UF_tgt_rate .valueChanged.connect(self.do_uf_data) self.UF_vol_del .valueChanged.connect(self.do_uf_data) self.UF_State .valueChanged.connect(self.do_uf_data) self.UF_Max .valueChanged.connect(self.do_uf_max) 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 """ response = conversions.bytearray_to_integer( message['message'], MsgFieldPositions.START_POS_FIELD_1) self.lbBolusStart .setText( str(response[0]) ) @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.UF_set_vol .setValue(0) self.UF_tgt_rate .setValue(0) self.UF_vol_del .setValue(0) self.UF_State .setValue(0) self.tx_duration .setValue(0) self.tx_elapsed .setValue(0) @Slot() def do_uf_max(self): """ initializes the widgets' properties :return: none """ new_max_uf = self.UF_Max.value() * self.uf_scaling if self.UF_vol_del.value() > new_max_uf: self.UF_vol_del .setValue(new_max_uf) self.UF_vol_del_label .setText(str(self.UF_vol_del.value() / self.uf_scaling)) self.UF_vol_del.setMaximum( self.UF_Max.value() * self.uf_scaling ) @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 do_uf_data(self): """ the slot for UF Data :return: none """ set_volume = self.UF_set_vol .value() / self.uf_scaling target_rate = self.UF_tgt_rate .value() / self.uf_scaling volume_delivered = self.UF_vol_del .value() / self.uf_scaling state = self.UF_State .value() self.UF_set_vol_label .setText(str(set_volume )) self.UF_tgt_rate_label.setText(str(target_rate )) self.UF_vol_del_label .setText(str(volume_delivered )) 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_uf_data() self.do_tx_time_data() self.do_tx_set_point_data()