""" 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 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 btnCondition: 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.btnCondition = self.find_button('btnCondition') 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.btnCondition.clicked.connect(self.do_clear_condition) 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() self.hd_simulator.alarms_simulator.cmd_activate_alarm_id(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: self.hd_simulator.alarms_simulator.cmd_set_alarm_triggered(alarm_id) self.__append_triggered_row(alarm_id) @Slot() def do_clear(self): """ the slot for clear button :return: none """ [alarm_id, row] = self.alarm_id() self.hd_simulator.alarms_simulator.cmd_set_alarm_cleared(alarm_id) self.tblTriggeredIDs.removeRow(row) @Slot() def do_clear_condition(self): """ the slot for condition button :return: none """ [alarm_id, row] = self.alarm_id() self.hd_simulator.alarms_simulator.cmd_set_alarm_cleared_condition(alarm_id) self.tblTriggeredIDs.item(row, self.eColID).setBackground(self.colors[AlarmPriority.ALARM_NONE]) self.tblTriggeredIDs.item(row, self.eColID).setSelected(False) @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) self.btnCondition.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) self.tblTriggeredIDs.item(row, self.eColID).setBackground(self.colors[AlarmPriority.ALARM_HIGH]) def alarm_id(self): """ gets the alarm id from the list of the triggered id list :return: """ row = 0 alarm_id = 0 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)) return [alarm_id, row]