Index: TD_DryBicartDisconnect/interface.ui =================================================================== diff -u --- TD_DryBicartDisconnect/interface.ui (revision 0) +++ TD_DryBicartDisconnect/interface.ui (revision d51b02e411ec18f90a6bbb2f6ed8f7e6f8b17bb5) @@ -0,0 +1,252 @@ + + + ui_interface + + + + 0 + 0 + 521 + 193 + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 100000 + 100000 + + + + + 10 + + + + &3 Treatment/&D Dry Bicart Disconnect + + + + + + + + Req [0xC500] + + + + + + + + 40 + 0 + + + + 0 + + + Qt::AlignCenter + + + + + + + Send + + + + + + + QFrame::Box + + + QFrame::Sunken + + + -- + + + Qt::AlignCenter + + + + + + + Progress + + + + + + + Reset + + + + + + + color: rgb(238, 238, 236); +background-color: #0E4C92; + + + + 198 : [0xC600] : Dry Bicart Disconnect Command Response + + + Qt::AlignCenter + + + + + + + Total + + + + + + + + 200 + 0 + + + + 480 + + + Qt::Horizontal + + + + + + + Send + + + + + + + + 40 + 0 + + + + 0 + + + Qt::AlignCenter + + + + + + + + 200 + 0 + + + + 480 + + + Qt::Horizontal + + + + + + + Reset + + + + + + + color: rgb(238, 238, 236); +background-color: #0E4C92; + + + + 196 : [0xC400] : Dry Bicart Disconnect Data + + + Qt::AlignCenter + + + + + + + showDialog + + + + + + + drain Running + + + + + + + depressurize running + + + + + + + Accepted + + + + + + + Rejection Reason + + + + + + + Qt::AlignCenter + + + 100 + + + + + + + + + + Index: TD_DryBicartDisconnect/loader.py =================================================================== diff -u --- TD_DryBicartDisconnect/loader.py (revision 0) +++ TD_DryBicartDisconnect/loader.py (revision d51b02e411ec18f90a6bbb2f6ed8f7e6f8b17bb5) @@ -0,0 +1,146 @@ +""" + TD Dry Bicart Disconnect 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 + +# td simulator +from leahi_dialin.ui.td_messaging import TD_Messaging + +class Loader(DynamicLoader): + """ + TD Dry Bicart Disconnect 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: + self.can_interface.register_receiving_publication_function( + CAN.CanChannels.ui_to_td_ch_id, + MsgIds.MSG_ID_UI_DRY_BICARD_DISCONNECT_REQUEST.value, + self.handle_dry_bicart_disconnect_cmd_request) + + + def _init_loader(self): + """ + finds and creates widgets + :return: none + """ + self.cmdStrings = [ + "Drain", + "Depressurize", + "Cancel", + "Done", + ] + + self.tbResetData = self.find_widget(QtWidgets.QToolButton , 'tbResetData' ) + self.tbSendData = self.find_widget(QtWidgets.QToolButton , 'tbSendData' ) + self.slTotal = self.find_widget(QtWidgets.QSlider , 'slTotal' ) + self.lbTotal = self.find_widget(QtWidgets.QLabel , 'lbTotal' ) + self.slProgress = self.find_widget(QtWidgets.QSlider , 'slProgress' ) + self.lbProgress = self.find_widget(QtWidgets.QLabel , 'lbProgress' ) + self.cbShowDialog = self.find_widget(QtWidgets.QCheckBox , 'cbShowDialog' ) + self.cbDrainInProgress = self.find_widget(QtWidgets.QCheckBox , 'cbDrainInProgress' ) + self.cbDepressurizeInProgress = self.find_widget(QtWidgets.QCheckBox , 'cbDepressurizeInProgress' ) + + + self.lbReqCommand = self.find_widget(QtWidgets.QLabel , 'lbReqCommand' ) + self.tbRspReset = self.find_widget(QtWidgets.QToolButton , 'tbRspReset' ) + self.tbRspSend = self.find_widget(QtWidgets.QToolButton , 'tbRspSend' ) + self.sbRspRejectReason = self.find_widget(QtWidgets.QSpinBox , 'sbRspRejectReason' ) + self.cbAccepted = self.find_widget(QtWidgets.QCheckBox , 'cbAccepted' ) + + + def _init_connections(self): + """ + initializes the widget's connections + :return: none + """ + self.tbResetData .clicked.connect ( self.init_progress ) + self.tbSendData .clicked.connect ( self.do_dry_bicart_data ) + + self.slTotal .valueChanged.connect ( self.do_dry_bicart_data ) + self.slTotal .valueChanged.connect ( lambda value: self.lbTotal.setText(f"{value}") ) + self.slProgress .valueChanged.connect ( self.do_dry_bicart_data ) + self.slProgress .valueChanged.connect ( lambda value: self.lbProgress.setText(f"{value}") ) + self.cbShowDialog .clicked.connect ( self.do_dry_bicart_data ) + self.cbDrainInProgress .clicked.connect ( self.do_dry_bicart_data ) + self.cbDepressurizeInProgress .clicked.connect ( self.do_dry_bicart_data ) + + self.tbRspReset .clicked.connect ( self.init_cmd_response ) + self.tbRspSend .clicked.connect ( self.do_dry_bicart_cmd_response ) + + + @Slot() + def _init_widgets(self): + """ + initializes the widget's properties + :return: none + """ + self.init_progress() + self.init_cmd_response() + + + @Slot() + def init_progress(self): + self.slTotal .setValue ( 0 ) + self.slProgress .setValue ( 0 ) + self.cbShowDialog .setChecked ( False ) + self.cbDrainInProgress .setChecked ( False ) + self.cbDepressurizeInProgress .setChecked ( False ) + + + @Slot() + def init_cmd_response(self): + self.lbReqCommand .setText ("-- --") + self.cbAccepted .setChecked ( True ) + self.sbRspRejectReason .setValue (0) + + + @Slot() + def do_dry_bicart_data(self): + """ + the slot for sending rinseback progress data + :return: none + """ + self.td_interface.td_dry_bicart_disconnect_data( + self.cbShowDialog .isChecked(), + self.slTotal .value(), + self.slProgress .value(), + self.cbDrainInProgress .isChecked(), + self.cbDepressurizeInProgress .isChecked() + ) + + + @Slot() + def handle_dry_bicart_disconnect_cmd_request(self, message, timestamp = 0.0): + """ + Called when the user sends a rinseback command request to firmware from UI + @return: None + """ + message = message['message'] + index = MsgFieldPositions.START_POS_FIELD_1 + value,index = conversions.bytearray_to_integer(message, index) + cmdString = self.cmdStrings[value] if value >= 0 and value < len(self.cmdStrings) else "" + self.lbReqCommand.setText(f"{cmdString} ({value})") + + + @Slot() + def do_dry_bicart_cmd_response(self): + self.td_interface.td_dry_bicart_cmd_response(self.cbAccepted.isChecked(), self.sbRspRejectReason.value()) Index: TD_SyringePump/interface.ui =================================================================== diff -u --- TD_SyringePump/interface.ui (revision 0) +++ TD_SyringePump/interface.ui (revision d51b02e411ec18f90a6bbb2f6ed8f7e6f8b17bb5) @@ -0,0 +1,203 @@ + + + ui_interface + + + + 0 + 0 + 356 + 404 + + + + &5 TD info/&D TD Syringe Pump + + + + + + + + + + + 0 + 0 + + + + + 280 + 0 + + + + + 10 + + + + color: rgb(238, 238, 236); +background-color: rgb(100, 49, 180); + + + 177 : [0xB100] : TD Syringe Pump + + + Qt::AlignCenter + + + + + + + Send + + + + + + + + + + + 10 + + + + + + + + + + + Set Rate + + + + + + + 1.200000000000000 + + + + + + + Meas Rate + + + + + + + 3.300000000000000 + + + + + + + + + + Volume Delivered + + + + + + + 5.000000000000000 + + + + + + + Meas Home + + + + + + + 24.000000000000000 + + + + + + + Meas Force + + + + + + + 24.000000000000000 + + + + + + + Safety Volume + + + + + + + 3.000000000000000 + + + + + + + Status + + + + + + + + + + Pump State + + + + + + + Delivery State + + + + + + + Position + + + + + + + + + sbHome + sbSafetyVolume + tbSend + + + + Index: TD_SyringePump/loader.py =================================================================== diff -u --- TD_SyringePump/loader.py (revision 0) +++ TD_SyringePump/loader.py (revision d51b02e411ec18f90a6bbb2f6ed8f7e6f8b17bb5) @@ -0,0 +1,89 @@ +""" + The TD Syringe Pump ui loader +""" +# Python +import os + +# Qt +from PySide2 import QtCore, QtWidgets +from PySide2.QtCore import Slot + +# parent +from engine.dynamicloader import DynamicLoader + +# hd Simulator +from leahi_dialin.ui.td_messaging import TD_Messaging + + +class Loader(DynamicLoader): + """ + The TD Syringe Pump ui loader + """ + + def __init__(self): + self.td_interface = TD_Messaging() + super().__init__(os.path.dirname(__file__)) + + + def _init_loader(self): + """ + finds and creates widgets + :return: none + """ + self.tbSend = self.find_widget(QtWidgets.QToolButton , 'tbSend' ) + + self.sbPumpState = self.find_widget(QtWidgets.QSpinBox , 'sbPumpState' ) + self.sbDeliveryState = self.find_widget(QtWidgets.QSpinBox , 'sbDeliveryState' ) + self.sbSetRate = self.find_widget(QtWidgets.QDoubleSpinBox , 'sbSetRate' ) + self.sbMeasRate = self.find_widget(QtWidgets.QDoubleSpinBox , 'sbMeasRate' ) + self.sbPosition = self.find_widget(QtWidgets.QSpinBox , 'sbPosition' ) + self.sbVolumeDelivered = self.find_widget(QtWidgets.QDoubleSpinBox , 'sbVolumeDelivered' ) + self.sbHome = self.find_widget(QtWidgets.QDoubleSpinBox , 'sbHome' ) + self.sbForce = self.find_widget(QtWidgets.QDoubleSpinBox , 'sbForce' ) + self.sbSafetyVolume = self.find_widget(QtWidgets.QDoubleSpinBox , 'sbSafetyVolume' ) + self.sbStatus = self.find_widget(QtWidgets.QSpinBox , 'sbStatus' ) + + + def _init_connections(self): + """ + initializes the widgets connections + :return: none + """ + self.tbSend.clicked.connect(self.do_syringePump_data) + + + @Slot() + def _init_widgets(self): + """ + initializes the widgets' properties + :return: none + """ + self.sbPumpState .setValue(0) + self.sbDeliveryState .setValue(0) + self.sbSetRate .setValue(0) + self.sbMeasRate .setValue(0) + self.sbPosition .setValue(0) + self.sbVolumeDelivered .setValue(0) + self.sbHome .setValue(0) + self.sbForce .setValue(0) + self.sbSafetyVolume .setValue(0) + self.sbStatus .setValue(0) + + + @Slot() + def do_syringePump_data(self): + """ + the slot for syringePump data change + :return: none + """ + self.td_interface.td_syringePump( + self.sbPumpState .value(), + self.sbDeliveryState .value(), + self.sbSetRate .value(), + self.sbMeasRate .value(), + self.sbPosition .value(), + self.sbVolumeDelivered .value(), + self.sbHome .value(), + self.sbForce .value(), + self.sbSafetyVolume .value(), + self.sbStatus .value())