""" Trends UI Loader """ # Python import os import can import struct # Qt from PySide2 import QtCore, QtWidgets from PySide2.QtCore import Slot, QTime # 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 # td simulator from leahi_dialin.ui.td_messaging import TD_Messaging # dd simulator from leahi_dialin.ui.dd_messaging import DD_Messaging class Loader(DynamicLoader): """ Trends UI Loader """ def __init__(self): self.td_interface = TD_Messaging() self.dd_interface = DD_Messaging() 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_BLOOD_PRESSURE_REQUEST.value, self.handle_vitals_request) def _init_loader(self): """ finds and creates widgets :return: none """ self.vitalsRspSend = self.find_widget(QtWidgets.QToolButton , 'tbTrendsVitalsRspSend' ) self.vitalsRspReset = self.find_widget(QtWidgets.QToolButton , 'tbTrendsVitalsRspReset' ) self.vitalsReqTime = self.find_widget(QtWidgets.QLabel , 'lbTrendsVitalsReqTime' ) self.vitalsRspAccept = self.find_widget(QtWidgets.QRadioButton , 'rbTrendsVitalsRspAccept' ) self.vitalsRspReject = self.find_widget(QtWidgets.QRadioButton , 'rbTrendsVitalsRspReject' ) self.vitalsRspRejectReason = self.find_widget(QtWidgets.QSpinBox , 'sbTrendsVitalsRspRejectReason' ) self.trendsSend = self.find_widget(QtWidgets.QToolButton, 'tbTrendsDataSend' ) self.trendsBpSend = self.find_widget(QtWidgets.QToolButton, 'tbTrendsDataBpSend' ) self.trendsReset = self.find_widget(QtWidgets.QToolButton, 'tbTrendsDataReset' ) self.vitalsSend = self.find_widget(QtWidgets.QToolButton , 'tbVitalsDataSend' ) self.vitalsReset = self.find_widget(QtWidgets.QToolButton , 'tbVitalsDataReset' ) self.vitalsSystolic = self.find_widget(QtWidgets.QSpinBox , 'sbVitalsSystolic' ) self.vitalsDiastolic = self.find_widget(QtWidgets.QSpinBox , 'sbVitalsDiastolic' ) self.vitalsHeartRate = self.find_widget(QtWidgets.QSpinBox , 'sbVitalsHeartRate' ) self.ufSend = self.find_widget(QtWidgets.QToolButton, 'tbUfSend' ) self.ufReset = self.find_widget(QtWidgets.QToolButton, 'tbUfReset' ) self.ufTargetRate = self.find_widget(QtWidgets.QSlider , 'slUfTargetRate' ) self.ufVolumeDelivered = self.find_widget(QtWidgets.QSlider , 'slUfVolumeDelivered' ) self.ufTargetRateLabel = self.find_widget(QtWidgets.QLabel , 'lbUfTargetRate' ) self.ufVolumeDeliveredLabel = self.find_widget(QtWidgets.QLabel , 'lbUfVolumeDelivered' ) self.pressureSend = self.find_widget(QtWidgets.QToolButton, 'tbPressureSend' ) self.pressureReset = self.find_widget(QtWidgets.QToolButton, 'tbPressureReset' ) self.pressureArterial = self.find_widget(QtWidgets.QSlider , 'slPressureArterial' ) self.pressureArterialLabel = self.find_widget(QtWidgets.QLabel , 'lbPressureArterial' ) self.pressureVenous = self.find_widget(QtWidgets.QSlider , 'slPressureVenous' ) self.pressureVenousLabel = self.find_widget(QtWidgets.QLabel , 'lbPressureVenous' ) self.pressureTMP = self.find_widget(QtWidgets.QSlider , 'slPressureTMP' ) self.pressureTMPLabel = self.find_widget(QtWidgets.QLabel , 'lbPressureTMP' ) self.salineSend = self.find_widget(QtWidgets.QToolButton, 'tbSalineSend' ) self.salineReset = self.find_widget(QtWidgets.QToolButton, 'tbSalineReset' ) self.salineCumulative = self.find_widget(QtWidgets.QSlider , 'slSalineCumulative' ) self.salineCumulativeLabel = self.find_widget(QtWidgets.QLabel , 'lbSalineCumulative' ) self.setPointSend = self.find_widget(QtWidgets.QToolButton , 'tbSetPointSend' ) self.setPointReset = self.find_widget(QtWidgets.QToolButton , 'tbSetPointReset' ) self.setPointBloodFlow = self.find_widget(QtWidgets.QSlider , 'slSetPointBloodFlow' ) self.setPointBloodFlowLabel = self.find_widget(QtWidgets.QLabel , 'lbSetPointBloodFlow' ) self.setPointDialFlow = self.find_widget(QtWidgets.QSlider , 'slSetPointDialFlow' ) self.setPointDialFlowLabel = self.find_widget(QtWidgets.QLabel , 'lbSetPointDialFlow' ) self.setPointDialTemp = self.find_widget(QtWidgets.QSlider , 'slSetPointDialTemp' ) self.setPointDialTempLabel = self.find_widget(QtWidgets.QLabel , 'lbSetPointDialTemp' ) self.conductivitySend = self.find_widget(QtWidgets.QToolButton , 'tbConductivitySend' ) self.conductivityReset = self.find_widget(QtWidgets.QToolButton , 'tbConductivityReset' ) self.conductivityD29 = self.find_widget(QtWidgets.QSlider , 'slConductivityD29' ) self.conductivityD29Label = self.find_widget(QtWidgets.QLabel , 'lbConductivityD29' ) def _init_connections(self): """ initializes the widgets connections :return: none """ self.vitalsRspSend .clicked.connect(self.do_vitals_response) self.vitalsRspReset .clicked.connect(self.init_vitals_response) self.trendsReset .clicked.connect(self.init_trends_data) self.trendsSend .clicked.connect(self.do_trends_data) self.trendsBpSend .clicked.connect(self.do_trends_bp_data) self.vitalsReset .clicked.connect(self.init_vitals_data) self.vitalsSend .clicked.connect(self.do_vitals_data) self.ufReset .clicked.connect(self.init_uf_data) self.ufSend .clicked.connect(self.do_uf_data) self.ufTargetRate .valueChanged.connect(lambda value: self.ufTargetRateLabel.setText(f"{value/100:.2f}")) self.ufVolumeDelivered .valueChanged.connect(lambda value: self.ufVolumeDeliveredLabel.setText(f"{value/100:.2f}")) self.pressureReset .clicked.connect(self.init_pressure_data) self.pressureSend .clicked.connect(self.do_pressure_data) self.pressureArterial .valueChanged.connect(lambda value: self.pressureArterialLabel.setText(f"{value}")) self.pressureVenous .valueChanged.connect(lambda value: self.pressureVenousLabel.setText(f"{value}")) self.pressureTMP .valueChanged.connect(lambda value: self.pressureTMPLabel.setText(f"{value}")) self.salineReset .clicked.connect(self.init_saline_data) self.salineSend .clicked.connect(self.do_saline_data) self.salineCumulative .valueChanged.connect(lambda value: self.salineCumulativeLabel.setText(f"{value}")) self.setPointReset .clicked.connect(self.init_set_point_data) self.setPointSend .clicked.connect(self.do_set_point_data) self.setPointBloodFlow .valueChanged.connect(lambda value: self.setPointBloodFlowLabel.setText(f"{value}")) self.setPointDialFlow .valueChanged.connect(lambda value: self.setPointDialFlowLabel.setText(f"{value}")) self.setPointDialTemp .valueChanged.connect(lambda value: self.setPointDialTempLabel.setText(f"{value/10:.1f}")) self.conductivityReset .clicked.connect(self.init_conductivity_data) self.conductivitySend .clicked.connect(self.do_conductivity_data) self.conductivityD29 .valueChanged.connect(lambda value: self.conductivityD29Label.setText(f"{value/10:.1f}")) @Slot() def _init_widgets(self): """ initializes the widgets' properties :return: none """ self.init_vitals_response() self.init_vitals_data() self.init_trends_data() @Slot() def init_vitals_response(self): """ slot for initializing vitals response :return: none """ self.vitalsReqTime .setText("--") self.vitalsRspAccept .setChecked(True) self.vitalsRspRejectReason .setValue(0) @Slot() def handle_vitals_request(self, message, timestamp = 0.0): """ Called when the user requests pause/resume to firmware from UI @return: None """ message = message['message'] self.vitalsReqTime.setText(QTime.currentTime().toString("hh:mm:ss")) @Slot() def do_vitals_response(self): """ the slot for UF Data :return: none """ self.td_interface.cmd_send_general_response( message_id = MsgIds.MSG_ID_TD_BLOOD_PRESSURE_RESPONSE.value, accepted = 1 if self.vitalsRspAccept.isChecked() else 0, reason = self.vitalsRspRejectReason.value() ) @Slot() def init_trends_data(self): """ slot for initializing all trends data minus vitals :return: none """ self.init_uf_data() self.init_pressure_data() self.init_saline_data() self.init_set_point_data() self.init_conductivity_data() @Slot() def do_trends_bp_data(self): """ slot for initializing all trends data plus vitals :return: none """ self.do_uf_data() self.do_pressure_data() self.do_saline_data() self.do_set_point_data() self.do_conductivity_data() # send the vitals data last since this will trigger trends # to save an entry with all collected data upon receipt self.do_vitals_data() @Slot() def do_trends_data(self): """ slot for initializing all trends data :return: none """ self.do_uf_data() self.do_pressure_data() self.do_saline_data() self.do_set_point_data() self.do_conductivity_data() @Slot() def init_vitals_data(self): """ slot for initializing vitals data :return: none """ self.vitalsSystolic .setValue(120) self.vitalsDiastolic .setValue(80) self.vitalsHeartRate .setValue(70) @Slot() def do_vitals_data(self): """ the slot for vitals data :return: none """ self.td_interface.td_vitals( self.vitalsSystolic .value(), self.vitalsDiastolic.value(), self.vitalsHeartRate.value() ) @Slot() def init_uf_data(self): """ slot for initializing UF data :return: none """ self.ufTargetRate .setValue(0) self.ufVolumeDelivered .setValue(0) @Slot() def do_uf_data(self): """ the slot for UF data :return: none """ self.td_interface.td_ultrafiltration( 0, self.ufTargetRate .value() / 100, self.ufVolumeDelivered.value() / 100, 0 ) @Slot() def init_pressure_data(self): """ slot for initializing pressure data :return: none """ self.pressureArterial .setValue(0) self.pressureVenous .setValue(0) self.pressureTMP .setValue(0) @Slot() def do_pressure_data(self): """ the slot for pressure data :return: none """ self.td_interface.td_pressure( self.pressureArterial.value(), self.pressureVenous.value(), 0, 0, 0, 0, 0, 0, 0, self.pressureTMP.value(), 0, 0 ) @Slot() def init_saline_data(self): """ slot for initializing saline data :return: none """ self.salineCumulative.setValue(0) @Slot() def do_saline_data(self): """ the slot for saline data :return: none """ self.td_interface.td_saline( 0, self.salineCumulative.value(), 0, 0 ) @Slot() def init_set_point_data(self): """ slot for initializing set point data :return: none """ self.setPointBloodFlow .setValue(0) self.setPointDialFlow .setValue(0) self.setPointDialTemp .setValue(0) @Slot() def do_set_point_data(self): """ the slot for set point data :return: none """ self.td_interface.td_treatment_set_points( self.setPointBloodFlow .value(), self.setPointDialFlow .value(), self.setPointDialTemp .value() / 10 ) @Slot() def init_conductivity_data(self): """ slot for initializing conductivity data :return: none """ self.conductivityD29.setValue(0) @Slot() def do_conductivity_data(self): """ the slot for conductivity data :return: none """ self.dd_interface.dd_conductivity( 0, 0, self.conductivityD29.value() / 10, 0, 0 )