Index: MainTreatmentData/loader.py =================================================================== diff -u -r76ebec60ce80e9a637fadc3d93dd9c21bad5d61f -rc2a68654fcf052f130d3e5de8457aaa375b72506 --- MainTreatmentData/loader.py (.../loader.py) (revision 76ebec60ce80e9a637fadc3d93dd9c21bad5d61f) +++ MainTreatmentData/loader.py (.../loader.py) (revision c2a68654fcf052f130d3e5de8457aaa375b72506) @@ -1,8 +1,10 @@ """ - The TD Air Trap Mode ui loader + The TD Main Treatment Data ui loader """ # Python import os +import can +import struct # Qt from PySide2 import QtCore, QtWidgets @@ -12,54 +14,69 @@ from engine.dynamicloader import DynamicLoader # plugin specific -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 # hd Simulator from leahi_dialin.ui.td_messaging import TD_Messaging - class Loader(DynamicLoader): """ - The TD Air Trap ui loader + 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.CanChannels.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.saline_state = self.find_widget(QtWidgets.QSpinBox , 'SalineStatespinBox' ) + self.cbBolusPermitted = self.find_widget(QtWidgets.QCheckBox , 'cbBolusPermitted' ) - 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.tbBolusDataSend = self.find_widget(QtWidgets.QToolButton , 'tbBolusDataSend' ) + 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.uf_scaling = 100.00 # UF Scaling factor to be 2 decimal places + self.saline_bolus_req = self.find_widget(QtWidgets.QLabel , 'saline_bolus_req' ) - 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): """ @@ -73,96 +90,108 @@ 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.saline_state .valueChanged.connect(self.do_saline_data) + self.cbBolusPermitted.clicked.connect(self.do_saline_data) + self.tbBolusDataSend .clicked.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.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.saline_state .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.init_uf_data() 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.blood_flow_st_pt .setValue(0) + self.dial_flow_st_pt .setValue(0) + self.dial_temp_st_pt .setValue(0) - 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() - state = self.saline_state .value() + target_volume = self.saline_tgt_vol .value() + bolus_volume = self.saline_bol_del .value() + cumulative_volume = self.saline_cum_vol .value() + bolusPermitted = int(self.cbBolusPermitted .isChecked()) self.td_interface.td_saline( target_volume , - cumulative_volume , bolus_volume , - state + cumulative_volume , + bolusPermitted ) + @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.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() + 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.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.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() def do_tx_time_data(self): """ @@ -202,6 +231,5 @@ :return: none """ self.do_saline_data() - self.do_uf_data() self.do_tx_time_data() - self.do_tx_set_point_data() \ No newline at end of file + self.do_tx_set_point_data()