Index: TD_HDF/interface.ui =================================================================== diff -u --- TD_HDF/interface.ui (revision 0) +++ TD_HDF/interface.ui (revision 31a04301e0719002e80528c8d1e08aa452925f78) @@ -0,0 +1,637 @@ + + + ui_interface + + + + 0 + 0 + 496 + 532 + + + + + 0 + 0 + + + + + 0 + 0 + + + + + 100000 + 100000 + + + + + 10 + + + + &3 Treatment/&C HDF + + + + + + + + Req [0xBD00] + + + + + + + Reset + + + + + + + + 40 + 0 + + + + 0 + + + Qt::AlignCenter + + + + + + + Send + + + + + + + Qt::AlignCenter + + + 100 + + + + + + + Reset + + + + + + + Qt::AlignCenter + + + 100 + + + + + + + requested rate + + + + + + + requested volume + + + + + + + Accepted + + + + + + + + 200 + 0 + + + + 480 + + + Qt::Horizontal + + + + + + + + 40 + 0 + + + + 0 + + + Qt::AlignCenter + + + + + + + Send + + + + + + + QFrame::Box + + + QFrame::Sunken + + + -- + + + Qt::AlignCenter + + + + + + + Req [0xBF00] + + + + + + + + 40 + 0 + + + + 0 + + + Qt::AlignCenter + + + + + + + + 200 + 0 + + + + 480 + + + Qt::Horizontal + + + + + + + + 40 + 0 + + + + 0 + + + Qt::AlignCenter + + + + + + + is HDF requested + + + + + + + color: rgb(238, 238, 236); +background-color: #0E4C92; + + + + 192 : [0xC000] : Auto Substitution Response + + + Qt::AlignCenter + + + + + + + Qt::AlignCenter + + + 100 + + + + + + + Send + + + + + + + Qt::AlignCenter + + + 100 + + + + + + + + 200 + 0 + + + + 480 + + + Qt::Horizontal + + + + + + + hdf state + + + + + + + + 200 + 0 + + + + 480 + + + Qt::Horizontal + + + + + + + current Rate + + + + + + + color: rgb(238, 238, 236); +background-color: #0E4C92; + + + + 188 : [0xBC00] : HDF Data + + + Qt::AlignCenter + + + + + + + Rejection Reason + + + + + + + Rejection Reason + + + + + + + color: rgb(238, 238, 236); +background-color: #0E4C92; + + + + 194 : [0xC200] : HDF Adjustment + + + Qt::AlignCenter + + + + + + + + 40 + 0 + + + + 0 + + + Qt::AlignCenter + + + + + + + auto sub state + + + + + + + target TMP + + + + + + + Reset + + + + + + + QFrame::Box + + + QFrame::Sunken + + + -- + + + Qt::AlignCenter + + + + + + + Qt::AlignCenter + + + 100 + + + + + + + total volume + + + + + + + color: rgb(238, 238, 236); +background-color: #0E4C92; + + + + 190 : [0xBE00] : HDF State Response + + + Qt::AlignCenter + + + + + + + Accepted + + + + + + + + 200 + 0 + + + + 480 + + + Qt::Horizontal + + + + + + + current TMP + + + + + + + + 200 + 0 + + + + 480 + + + Qt::Horizontal + + + + + + + Send + + + + + + + + 40 + 0 + + + + 0 + + + Qt::AlignCenter + + + + + + + Reset + + + + + + + Qt::AlignCenter + + + 100 + + + + + + + Qt::AlignCenter + + + 100 + + + + + + + Treatment Mode + + + + + + + Presc. Sub. Fluid Vol + + + + + + + Req [0xC100] + + + + + + + Accepted + + + + + + + Rejection Reason + + + + + + + Rejection Reason + + + + + + + QFrame::Box + + + QFrame::Sunken + + + -- + + + Qt::AlignCenter + + + + + + + QFrame::Box + + + QFrame::Sunken + + + -- + + + Qt::AlignCenter + + + + + + + + + + Index: TD_HDF/loader.py =================================================================== diff -u --- TD_HDF/loader.py (revision 0) +++ TD_HDF/loader.py (revision 31a04301e0719002e80528c8d1e08aa452925f78) @@ -0,0 +1,263 @@ +""" + TD Recirculate 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 Recirculate 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_PAUSE_SUB_FLOW_REQUEST.value, + self.handle_hdf_state_cmd_request) + self.can_interface.register_receiving_publication_function( + CAN.CanChannels.ui_to_td_ch_id, + MsgIds.MSG_ID_UI_AUTO_SUBSTITUTION_REQUEST.value, + self.handle_auto_sub_state_cmd_request) + self.can_interface.register_receiving_publication_function( + CAN.CanChannels.ui_to_td_ch_id, + MsgIds.MSG_ID_UI_HDF_ADJUSTMENT_REQUEST.value, + self.handle_hdf_adjustment_request) + + + def _init_loader(self): + """ + finds and creates widgets + :return: none + """ + self.hdfState = [ + "Paused", + "Resume", + ] + + self.autoSubState = [ + "ON", + "OFF", + ] + + self.tbDataSend = self.find_widget(QtWidgets.QToolButton , 'tbDataSend' ) + self.tbDataReset = self.find_widget(QtWidgets.QToolButton , 'tbDataReset' ) + self.sbHDFState = self.find_widget(QtWidgets.QSpinBox , 'sbHDFState' ) + self.sbAutoSubState = self.find_widget(QtWidgets.QSpinBox , 'sbAutoSubState' ) + self.slreqRate = self.find_widget(QtWidgets.QSlider , 'slreqRate' ) + self.lbreqRate = self.find_widget(QtWidgets.QLabel , 'lbreqRate' ) + self.sltargetTMP = self.find_widget(QtWidgets.QSlider , 'sltargetTMP' ) + self.lbtargetTMP = self.find_widget(QtWidgets.QLabel , 'lbtargetTMP' ) + self.slcurrentRate = self.find_widget(QtWidgets.QSlider , 'slcurrentRate' ) + self.lbcurrentRate = self.find_widget(QtWidgets.QLabel , 'lbcurrentRate' ) + self.slcurrentTMP = self.find_widget(QtWidgets.QSlider , 'slcurrentTMP' ) + self.lbcurrentTMP = self.find_widget(QtWidgets.QLabel , 'lbcurrentTMP' ) + self.slreqVol = self.find_widget(QtWidgets.QSlider , 'slreqVol' ) + self.lbreqVol = self.find_widget(QtWidgets.QLabel , 'lbreqVol' ) + self.sltotalVol = self.find_widget(QtWidgets.QSlider , 'sltotalVol' ) + self.lbtotalVol = self.find_widget(QtWidgets.QLabel , 'lbtotalVol' ) + self.sbIsHdfReqState = self.find_widget(QtWidgets.QSpinBox , 'sbIsHdfReqState' ) + + self.tbHDFStateRspSend = self.find_widget(QtWidgets.QToolButton , 'tbHDFStateRspSend' ) + self.tbHDFStateReset = self.find_widget(QtWidgets.QToolButton , 'tbHDFStateReset' ) + self.lbHDFState = self.find_widget(QtWidgets.QLabel , 'lbHDFState' ) + self.cbHDFStateAccepted = self.find_widget(QtWidgets.QCheckBox , 'cbHDFStateAccepted' ) + self.sbHDFStateRejectReason = self.find_widget(QtWidgets.QSpinBox , 'sbHDFStateRejectReason' ) + + self.tbAutoSubRspSend = self.find_widget(QtWidgets.QToolButton , 'tbAutoSubRspSend' ) + self.tbAutoSubReset = self.find_widget(QtWidgets.QToolButton , 'tbAutoSubReset' ) + self.lbAutoSub = self.find_widget(QtWidgets.QLabel , 'lbAutoSub' ) + self.cbAutoSubAccepted = self.find_widget(QtWidgets.QCheckBox , 'cbAutoSubAccepted' ) + self.sbAutoSubRejectReason = self.find_widget(QtWidgets.QSpinBox , 'sbAutoSubRejectReason' ) + + self.tbHDFAdjustRspSend = self.find_widget(QtWidgets.QToolButton , 'tbHDFAdjustRspSend' ) + self.tbHDFAdjustReset = self.find_widget(QtWidgets.QToolButton , 'tbHDFAdjustReset' ) + self.cbHDFAdjustAccepted = self.find_widget(QtWidgets.QCheckBox , 'cbHDFAdjustAccepted' ) + self.lbtxMode = self.find_widget(QtWidgets.QLabel , 'lbtxMode' ) + self.sbtxModeRejectReason = self.find_widget(QtWidgets.QSpinBox , 'sbtxModeRejectReason' ) + self.lbprescSubFluidVol = self.find_widget(QtWidgets.QLabel , 'lbprescSubFluidVol' ) + self.sbprescSubFluidVolRejectReason = self.find_widget(QtWidgets.QSpinBox , 'sbprescSubFluidVolRejectReason' ) + + + def _init_connections(self): + """ + initializes the widget's connections + :return: none + """ + self.tbDataSend .clicked.connect ( self.do_hdf_data ) + self.tbDataReset .clicked.connect ( self.init_progress ) + + self.sbHDFState .valueChanged.connect ( self.do_hdf_data ) + self.sbAutoSubState .valueChanged.connect ( self.do_hdf_data ) + self.slreqRate .valueChanged.connect ( self.do_hdf_data ) + self.slreqRate .valueChanged.connect ( lambda value: self.lbreqRate.setText(f"{value/1000:.2f}") ) + self.sltargetTMP .valueChanged.connect ( self.do_hdf_data ) + self.sltargetTMP .valueChanged.connect ( lambda value: self.lbtargetTMP.setText(f"{value/1000:.2f}") ) + self.slcurrentRate .valueChanged.connect ( self.do_hdf_data ) + self.slcurrentRate .valueChanged.connect ( lambda value: self.lbcurrentRate.setText(f"{value/1000:.2f}") ) + self.slcurrentTMP .valueChanged.connect ( self.do_hdf_data ) + self.slcurrentTMP .valueChanged.connect ( lambda value: self.lbcurrentTMP.setText(f"{value/1000:.2f}")) + self.slreqVol .valueChanged.connect ( self.do_hdf_data ) + self.slreqVol .valueChanged.connect ( lambda value: self.lbreqVol.setText(f"{value}") ) + self.sltotalVol .valueChanged.connect ( self.do_hdf_data ) + self.sltotalVol .valueChanged.connect ( lambda value: self.lbtotalVol.setText(f"{value}") ) + self.sbIsHdfReqState .valueChanged.connect ( self.do_hdf_data ) + + self.tbHDFStateRspSend .clicked.connect ( self.do_hdf_state_cmd_response ) + self.tbHDFStateReset .clicked.connect ( self.init_hdf_state_cmd_response ) + + self.tbAutoSubRspSend .clicked.connect ( self.do_auto_sub_state_cmd_response ) + self.tbAutoSubReset .clicked.connect ( self.init_auto_sub_state_cmd_response ) + + self.tbHDFAdjustRspSend .clicked.connect ( self.do_hdf_adjustment_cmd_response ) + self.tbHDFAdjustReset .clicked.connect ( self.init_hdf_adjust_cmd_response ) + + + @Slot() + def _init_widgets(self): + """ + initializes the widget's properties + :return: none + """ + self.init_progress() + self.init_hdf_state_cmd_response() + self.init_auto_sub_state_cmd_response() + self.init_hdf_adjust_cmd_response() + + + @Slot() + def init_progress(self): + self.sbHDFState .setValue ( 0 ) + self.sbAutoSubState .setValue ( 0 ) + self.slreqRate .setValue ( 0 ) + self.sltargetTMP .setValue ( 0 ) + self.slcurrentRate .setValue ( 0 ) + self.slcurrentTMP .setValue ( 0 ) + self.slreqVol .setValue ( 0 ) + self.sltotalVol .setValue ( 0 ) + self.sbIsHdfReqState .setValue ( 0 ) + + + @Slot() + def init_hdf_state_cmd_response(self): + self.lbHDFState .setText ("-- --") + self.cbHDFStateAccepted .setChecked ( True ) + self.sbHDFStateRejectReason .setValue (0) + + + @Slot() + def init_auto_sub_state_cmd_response(self): + self.lbAutoSub .setText ("-- --") + self.cbAutoSubAccepted .setChecked ( True ) + self.sbAutoSubRejectReason .setValue (0) + + + @Slot() + def init_hdf_adjust_cmd_response(self): + self.lbtxMode .setText ("-- --") + self.lbprescSubFluidVol .setText ("-- --") + self.cbHDFAdjustAccepted .setChecked ( True ) + self.sbtxModeRejectReason .setValue (0) + self.sbprescSubFluidVolRejectReason .setValue (0) + + + @Slot() + def do_hdf_data(self): + """ + the slot for sending hdf progress data + :return: none + """ + self.td_interface.td_hdf_data( + self.sbHDFState .value(), + self.sbAutoSubState .value(), + self.slreqRate .value() / 1000, + self.sltargetTMP .value() / 1000, + self.slcurrentRate .value() / 1000, + self.slcurrentTMP .value() / 1000, + self.slreqVol .value() , + self.sltotalVol .value() , + self.sbIsHdfReqState .value(), + ) + + + @Slot() + def handle_hdf_state_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.hdfState[value] if value >= 0 and value < len(self.hdfState) else "" + self.lbHDFState.setText(f"{cmdString} ({value})") + + + @Slot() + def handle_auto_sub_state_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.autoSubState[value] if value >= 0 and value < len(self.autoSubState) else "" + self.lbAutoSub.setText(f"{cmdString} ({value})") + + + @Slot() + def handle_hdf_adjustment_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 + txMode,index = conversions.bytearray_to_integer (message, index) + vol,index = conversions.bytearray_to_float (message, index) + self.lbtxMode .setText(f"{txMode}") + self.lbprescSubFluidVol .setText(f"{vol}") + + + @Slot() + def do_hdf_state_cmd_response(self): + self.lbHDFState .setText ("-- --") + self.td_interface.td_hdf_state_cmd_response(self.cbHDFStateAccepted.isChecked(), + self.sbHDFStateRejectReason.value()) + + + @Slot() + def do_auto_sub_state_cmd_response(self): + self.lbAutoSub .setText ("-- --") + self.td_interface.td_auto_sub_state_response(self.cbAutoSubAccepted.isChecked(), + self.sbAutoSubRejectReason.value()) + + + @Slot() + def do_hdf_adjustment_cmd_response(self): + self.lbtxMode .setText ("-- --") + self.lbprescSubFluidVol .setText ("-- --") + self.td_interface.td_hdf_adjust_response( self.cbHDFAdjustAccepted.isChecked(), + self.sbtxModeRejectReason.value(), + self.sbprescSubFluidVolRejectReason.value())