""" 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())