""" The Alarms ui loader class container file """ import os from simulator.dynamicloader import DynamicLoader from PySide2 import QtWidgets from PySide2.QtCore import Slot, QObject, Qt from dialin.squish import denaliMessages from datetime import datetime from dialin.common.prs_defs import AlarmPriority class Loader(DynamicLoader): """ The Alarms ui loader class """ canMaximize = True btnTrigger: QtWidgets.QPushButton btnClear: QtWidgets.QPushButton spnAlarmID: QtWidgets.QSpinBox tblStatusIDs: QtWidgets.QTableWidget btnSend: QtWidgets.QPushButton btnMute: QtWidgets.QPushButton spnTopID: QtWidgets.QSpinBox rdoPriorityNone: QtWidgets.QToolBox rdoPriorityLow: QtWidgets.QToolBox rdoPriorityMed: QtWidgets.QToolBox rdoPriorityHigh: QtWidgets.QToolBox spnEscalatesIn: QtWidgets.QSpinBox spnMuteTimeout: QtWidgets.QSpinBox lstFlags: QtWidgets.QListWidget tblTriggeredIDs: QtWidgets.QTableWidget priority = AlarmPriority.ALARM_HIGH flags = 0 eColTime = 0 eColID = 1 eColMute = 2 eColEscalate = 3 eColFlags = 4 eColMessage = 5 eColCount = 6 # column: (width, text) fixedLabels = { eColTime: (70, 'Time'), eColID: (45, 'Top ID'), eColMute: (100, 'Mute'), eColEscalate: (45, 'Escl'), eColFlags: (150, 'Flags'), eColMessage: (100, 'Message'), } colors = { AlarmPriority.ALARM_NONE: Qt.green, AlarmPriority.ALARM_LOW: Qt.yellow, AlarmPriority.ALARM_MED: Qt.yellow, AlarmPriority.ALARM_HIGH: Qt.red } styles = { AlarmPriority.ALARM_NONE: 'rgb(78, 154, 6)', AlarmPriority.ALARM_LOW: 'rgb(237, 212, 0)', AlarmPriority.ALARM_MED: 'rgb(237, 212, 0)', AlarmPriority.ALARM_HIGH: 'rgb(239, 41, 41)' } def __init__(self): super().__init__(os.path.dirname(__file__)) def _init_loader(self): """ finds and creates widgets :return: none """ self.btnSend = self.find_button('btnSend') self.btnMute = self.find_button('btnMute') self.spnTopID = self.find_spinbox('spnTopID') self.rdoPriorityNone = self.find_tool_button('rdoPriorityNone') self.rdoPriorityLow = self.find_tool_button('rdoPriorityLow') self.rdoPriorityMed = self.find_tool_button('rdoPriorityMed') self.rdoPriorityHigh = self.find_tool_button('rdoPriorityHigh') self.spnEscalatesIn = self.find_spinbox('spnEscalatesIn') self.spnMuteTimeout = self.find_spinbox('spnMuteTimeout') self.lstFlags = self.find_list_widget('lstFlags') self.tblStatusIDs = self.find_table_widget('tblStatusIDs') self.btnTrigger = self.find_button('btnTrigger') self.btnClear = self.find_button('btnClear') self.spnAlarmID = self.find_spinbox('spnAlarmID') self.tblTriggeredIDs = self.find_table_widget('tblTriggeredIDs') def _init_widgets(self): """ initializes the widgets' properties :return: none """ self.__populate_status_ids_columns() self.rdoPriorityNone.setStyleSheet('background-color: {};'.format(self.styles[AlarmPriority.ALARM_NONE])) self.rdoPriorityLow.setStyleSheet('background-color: {};'.format(self.styles[AlarmPriority.ALARM_LOW])) self.rdoPriorityMed.setStyleSheet('background-color: {};'.format(self.styles[AlarmPriority.ALARM_MED])) self.rdoPriorityHigh.setStyleSheet('background-color: {};'.format(self.styles[AlarmPriority.ALARM_HIGH])) self.tblTriggeredIDs.setColumnWidth(0, 75) self.tblTriggeredIDs.setColumnWidth(1, 45) def _init_connections(self): """ initializes the widgets connections :return: """ self.btnTrigger.clicked.connect(self.do_trigger) self.btnClear.clicked.connect(self.do_clear) self.tblTriggeredIDs.itemClicked.connect(self.on_trigger_ids_item_clicked) self.btnSend.clicked.connect(self.do_send) self.btnMute.clicked.connect(self.do_mute) # item clicked might be enough self.tblStatusIDs.itemClicked.connect(self.on_status_ids_item_clicked) self.rdoPriorityNone.toggled.connect(self.do_set_priority_none) self.rdoPriorityLow.toggled.connect(self.do_set_priority_low) self.rdoPriorityMed.toggled.connect(self.do_set_priority_med) self.rdoPriorityHigh.toggled.connect(self.do_set_priority_high) def set_flags(self): """ the slot for flags :return: none """ highest = False lst = self.lstFlags for i in range(lst.count()): if highest: bit = pow(2, 15 - i) else: bit = pow(2, i) if lst.item(i).checkState() == Qt.Checked: self.flags |= bit else: self.flags &= ~bit @Slot() def do_set_priority_none(self): """ the slot for priority buttons :return: none """ self.priority = AlarmPriority.ALARM_NONE @Slot() def do_set_priority_low(self): """ the slot for priority buttons :return: none """ self.priority = AlarmPriority.ALARM_LOW @Slot() def do_set_priority_med(self): """ the slot for priority buttons :return: none """ self.priority = AlarmPriority.ALARM_MED @Slot() def do_set_priority_high(self): """ the slot for priority buttons :return: none """ self.priority = AlarmPriority.ALARM_HIGH @Slot() def do_send(self): """ the slot for send button :return: none """ alarm_id = self.spnTopID.value() escalate = self.spnEscalatesIn.value() mute_out = self.spnMuteTimeout.value() if alarm_id >= 0: self.set_flags() denaliMessages.setAlarmStatus(self.priority, alarm_id, escalate, mute_out, self.flags) self.__append_status_ids_row(alarm_id) @Slot() def do_trigger(self): """ the slot for trigger button :return: none """ alarm_id = self.spnAlarmID.value() if alarm_id: denaliMessages.setAlarmTriggered(alarm_id) self.__append_triggered_row(alarm_id) @Slot() def do_clear(self): """ the slot for clear button :return: none """ items = self.tblTriggeredIDs.selectedItems() if len(items): item: QtWidgets.QTableWidgetItem = items[0] row = item.row() model = self.tblTriggeredIDs.model() alarm_id = model.data(model.index(row, self.eColID)) denaliMessages.setAlarmCleared(alarm_id) self.tblTriggeredIDs.removeRow(row) @Slot() def do_mute(self, value): """ the slot for mute button :return: none """ print(" --- ", QObject.sender(self).objectName()) @Slot() def on_status_ids_item_clicked(self, item: QtWidgets.QTableWidgetItem): """ slot to handle on item clicked :param item: the clicked item :return: None """ selected = item.isSelected() self.btnMute.setEnabled(selected) @Slot() def on_trigger_ids_item_clicked(self, item: QtWidgets.QTableWidgetItem): """ slot to handle on item clicked :param item: the clicked item :return: None """ selected = item.isSelected() self.btnClear.setEnabled(selected) def __populate_status_ids_columns(self): """ adds alarm flags as columns in the Status alarms table :return: None """ items = sorted(self.fixedLabels.items()) self.tblStatusIDs.setColumnCount(self.eColCount) self.tblStatusIDs.setHorizontalHeaderLabels([v[1] for k, v in items]) for col, item in items: self.tblStatusIDs.setColumnWidth(col, item[0]) def __append_status_ids_row(self, alarm_id): """ appends the Status alarm id into the Status list :return: None """ inset_at_top = True now = datetime.now().strftime("%H:%M:%S") items = self.tblStatusIDs.findItems(str(alarm_id), Qt.MatchExactly) if len(items): item: QtWidgets.QTableWidgetItem = items[0] row = item.row() else: row = 0 if inset_at_top else self.tblStatusIDs.rowCount() self.tblStatusIDs.insertRow(row) model = self.tblStatusIDs.model() model.setData(model.index(row, self.eColTime), now) model.setData(model.index(row, self.eColID), alarm_id) model.setData(model.index(row, self.eColMute), self.spnMuteTimeout.value()) model.setData(model.index(row, self.eColEscalate), self.spnEscalatesIn.value()) self.tblStatusIDs.item(row, self.eColMute).setCheckState(Qt.Unchecked) model.setData(model.index(row, self.eColMessage), "N/A") model.setData(model.index(row, self.eColFlags), '{:016b}'.format(self.flags, 'b')) self.tblStatusIDs.item(row, self.eColID).setBackground(self.colors[self.priority]) def __append_triggered_row(self, alarm_id): """ appends the triggered alarm id into the triggered list :return: None """ inset_at_top = True now = datetime.now().strftime("%H:%M:%S") items = self.tblTriggeredIDs.findItems(str(alarm_id), Qt.MatchExactly) if len(items): item: QtWidgets.QTableWidgetItem = items[0] row = item.row() else: row = 0 if inset_at_top else self.tblTriggeredIDs.rowCount() self.tblTriggeredIDs.insertRow(row) model = self.tblTriggeredIDs.model() model.setData(model.index(row, self.eColTime), now) model.setData(model.index(row, self.eColID), alarm_id)