From f0b343ce8832d04bae71553fe3f3d879f0299f22 Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 1 Dec 2023 09:50:35 -0300 Subject: [PATCH 1/5] BPMEQ.MNT: Adapt to new logging mechanism. --- .../sirius-hla-si-di-equalize_bpms_switching.py | 3 +++ pyqt-apps/siriushla/si_di_equalize_bpms/main.py | 11 +---------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/pyqt-apps/scripts/sirius-hla-si-di-equalize_bpms_switching.py b/pyqt-apps/scripts/sirius-hla-si-di-equalize_bpms_switching.py index 2c67a7c4d..2393d253a 100644 --- a/pyqt-apps/scripts/sirius-hla-si-di-equalize_bpms_switching.py +++ b/pyqt-apps/scripts/sirius-hla-si-di-equalize_bpms_switching.py @@ -5,6 +5,7 @@ import sys import argparse as _argparse +from siriuspy.logging import configure_logging from siriushla.sirius_application import SiriusApplication from siriushla.si_di_equalize_bpms import BPMsEqualizeSwitching @@ -13,6 +14,8 @@ description="Run BPMs Equalization Interface.") args = parser.parse_args() +configure_logging() + app = SiriusApplication() app.open_window(BPMsEqualizeSwitching, parent=None) sys.exit(app.exec_()) diff --git a/pyqt-apps/siriushla/si_di_equalize_bpms/main.py b/pyqt-apps/siriushla/si_di_equalize_bpms/main.py index 825b74476..1ffc84709 100644 --- a/pyqt-apps/siriushla/si_di_equalize_bpms/main.py +++ b/pyqt-apps/siriushla/si_di_equalize_bpms/main.py @@ -1,6 +1,5 @@ """Main module of the Application Interface.""" import os as _os -import sys as _sys import logging as _log from threading import Thread import pathlib as _pathlib @@ -35,15 +34,7 @@ def __init__(self, parent=None): """.""" super().__init__(parent=parent) - root = _log.getLogger() - handler = _log.StreamHandler(_sys.stdout) - root.setLevel(_log.INFO) - handler.setLevel(_log.INFO) - formatter = _log.Formatter('%(levelname)7s ::: %(message)s') - handler.setFormatter(formatter) - root.addHandler(handler) - - self.bpms_eq = EqualizeBPMs(logger=root) + self.bpms_eq = EqualizeBPMs() self._last_dir = self.DEFAULT_DIR self._thread = Thread() self._orbits = None From ed04c4a427f527e281443e20a412af9bd1491005 Mon Sep 17 00:00:00 2001 From: Fernando Date: Fri, 1 Dec 2023 09:51:39 -0300 Subject: [PATCH 2/5] CYCLE.MNT: Adapt to new logging mechanism. --- pyqt-apps/scripts/sirius-hla-as-ps-cycle.py | 3 + .../siriushla/as_ps_cycle/cycle_window.py | 133 +++++++++--------- pyqt-apps/siriushla/as_ps_cycle/tasks.py | 9 +- 3 files changed, 72 insertions(+), 73 deletions(-) diff --git a/pyqt-apps/scripts/sirius-hla-as-ps-cycle.py b/pyqt-apps/scripts/sirius-hla-as-ps-cycle.py index 9154a3abf..ff211c812 100755 --- a/pyqt-apps/scripts/sirius-hla-as-ps-cycle.py +++ b/pyqt-apps/scripts/sirius-hla-as-ps-cycle.py @@ -4,6 +4,7 @@ import sys import argparse as _argparse +from siriuspy.logging import configure_logging from siriushla.sirius_application import SiriusApplication from siriushla.as_ps_cycle.cycle_window import CycleWindow @@ -14,6 +15,8 @@ args = parser.parse_args() isadv = args.isadv +configure_logging() + app = SiriusApplication(None, sys.argv) app.open_window(CycleWindow, adv_mode=isadv) sys.exit(app.exec_()) diff --git a/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py b/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py index 262e6e542..7c2008ca0 100644 --- a/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py +++ b/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py @@ -12,6 +12,7 @@ QAbstractItemView import qtawesome as qta +import siriuspy.logging as _log from siriuspy.envars import VACA_PREFIX as VACA_PREFIX from siriuspy.namesys import Filter, SiriusPVName as PVName from siriuspy.cycle import get_psnames, Timing, get_sections @@ -28,8 +29,24 @@ PreparePSParams, PreparePSOpModeCycle, Cycle, CycleTrims -errorcolor = QColor(255, 0, 0) -warncolor = QColor(200, 200, 0) +ERRORCOLOR = QColor(255, 0, 0) +WARNCOLOR = QColor(200, 200, 0) + + +class ProgressListHandler(_log.logging.Handler): + """Class intented to run callback to update 'Log-Mon' PVs.""" + + def __init__(self, callback, level=_log.logging.INFO): + """Object that calls 'callback' to update 'Log-Mon'PVs.""" + self.callback = callback + super().__init__(level) + + def emit(self, record): + """.""" + msg = self.format(msg) + error = record.levelno >= _log.logging.ERROR + warning = not error and record.levelno >= _log.logging.WARNING + self.callback(msg, warning=warning, error=error) class CycleWindow(SiriusMainWindow): @@ -82,6 +99,8 @@ def __init__(self, parent=None, checked_accs=(), adv_mode=False): # Setup UI self._needs_update_setup = False self._setup_ui() + _log.get_logger().addHandler(ProgressListHandler( + self._update_progress)) self._update_setup_timer = QTimer(self) self._update_setup_timer.timeout.connect(self._update_setup) self._update_setup_timer.setInterval(250) @@ -188,8 +207,8 @@ def _setup_ui(self): self.prepare_ps_opmode_lb = QLabel(self) self.prepare_ps_opmode_lb.setPixmap(self._pixmap_not) - lb_cycle = QLabel('

Cycle

', self, - alignment=Qt.AlignCenter) + lb_cycle = QLabel( + '

Cycle

', self, alignment=Qt.AlignCenter) self.cycle_trims_bt = QPushButton('8. Cycle Trims', self) self.cycle_trims_bt.setToolTip( @@ -308,8 +327,8 @@ def _setup_ui(self): layout = QGridLayout() layout.setVerticalSpacing(10) layout.setHorizontalSpacing(10) - layout.addWidget(QLabel('

PS Cycle

', self, - alignment=Qt.AlignCenter), 0, 0, 1, 3) + layout.addWidget(QLabel( + '

PS Cycle

', self, alignment=Qt.AlignCenter), 0, 0, 1, 3) layout.addWidget(gb_tree, 1, 0) layout.addWidget(gb_commsts, 1, 1) layout.addLayout(lay_log, 1, 2) @@ -345,7 +364,6 @@ def _run_task(self, control=''): task = task_class( parent=self, psnames=pwrsupplies, timing=self._timing, isadv=self._is_adv_mode) - task.updated.connect(self._update_progress) duration = task.duration() self.progress_bar.setMinimum(0) @@ -361,73 +379,58 @@ def _run_task(self, control=''): task.start() self.update_bar.start() - def _update_progress(self, text, done, warning=False, error=False): + def _update_progress(self, text: str, warning=False, error=False): """Update automated cycle progress list and bar.""" - if done: + if text.strip().lower() == 'done': last_item = self.progress_list.item(self.progress_list.count()-1) curr_text = last_item.text() last_item.setText(curr_text+' done.') - elif 'Remaining time' in text: - last_item = self.progress_list.item(self.progress_list.count()-1) - if 'Remaining time' in last_item.text(): - last_item.setText(text) - else: - self.progress_list.addItem(text) - self.progress_list.scrollToBottom() - elif 'Sent ' in text: - last_item = self.progress_list.item(self.progress_list.count()-1) - if 'Sent ' in last_item.text(): - last_item.setText(text) - else: - self.progress_list.addItem(text) - self.progress_list.scrollToBottom() - elif 'Successfully checked ' in text: - last_item = self.progress_list.item(self.progress_list.count()-1) - if 'Successfully checked ' in last_item.text(): - last_item.setText(text) - else: - self.progress_list.addItem(text) - self.progress_list.scrollToBottom() - elif 'Created connections ' in text: + return + + especial_txt = [ + 'Remaining time', 'Sent ', 'Successfully checked ', + 'Created connections '] + res = _re.findall('.*({}).*'.format('|'.join(especial_txt)), text) + if res: last_item = self.progress_list.item(self.progress_list.count()-1) - if 'Created connections ' in last_item.text(): + if res[0] in last_item.text(): last_item.setText(text) + return + self.progress_list.addItem(text) + self.progress_list.scrollToBottom() + return + + item = QListWidgetItem(text) + if warning: + item.setForeground(WARNCOLOR) + elif error: + item.setForeground(ERRORCOLOR) + self.update_bar.exit_task() + pal = self.progress_bar.palette() + pal.setColor( + QPalette.Highlight, self.progress_bar.warning_color) + self.progress_bar.setPalette(pal) + if self._is_preparing in self._prepared.keys(): + self._prepared[self._is_preparing] = False + cycle = all(self._prepared.values()) + self._handle_buttons_enabled(True, cycle=cycle) + elif 'finished' in text: + self.update_bar.exit_task() + self.progress_bar.setValue(self.progress_bar.maximum()) + if self._is_preparing == 'cycle': + self._prepared = {k: False for k in self._prepared.keys()} + if not self.cycle_trims_bt.isVisible(): + self._prepared['trims'] = True + cycle = False else: - self.progress_list.addItem(text) - self.progress_list.scrollToBottom() - else: - item = QListWidgetItem(text) - if error: - item.setForeground(errorcolor) - self.update_bar.exit_task() - pal = self.progress_bar.palette() - pal.setColor(QPalette.Highlight, - self.progress_bar.warning_color) - self.progress_bar.setPalette(pal) if self._is_preparing in self._prepared.keys(): - self._prepared[self._is_preparing] = False + self._prepared[self._is_preparing] = True cycle = all(self._prepared.values()) - self._handle_buttons_enabled(True, cycle=cycle) - elif warning: - item.setForeground(warncolor) - elif 'finished' in text: - self.update_bar.exit_task() - self.progress_bar.setValue(self.progress_bar.maximum()) - if self._is_preparing == 'cycle': - self._prepared = {k: False for k in self._prepared.keys()} - if not self.cycle_trims_bt.isVisible(): - self._prepared['trims'] = True - cycle = False - else: - if self._is_preparing in self._prepared.keys(): - self._prepared[self._is_preparing] = True - cycle = all(self._prepared.values()) - self._handle_buttons_enabled(True, cycle=cycle) - - self._handle_stslabels_content() - - self.progress_list.addItem(item) - self.progress_list.scrollToBottom() + self._handle_buttons_enabled(True, cycle=cycle) + + self._handle_stslabels_content() + self.progress_list.addItem(item) + self.progress_list.scrollToBottom() def _handle_buttons_enabled(self, enable, cycle=False): self.save_timing_bt.setEnabled(enable) diff --git a/pyqt-apps/siriushla/as_ps_cycle/tasks.py b/pyqt-apps/siriushla/as_ps_cycle/tasks.py index 9564c0a62..1b8a0625c 100644 --- a/pyqt-apps/siriushla/as_ps_cycle/tasks.py +++ b/pyqt-apps/siriushla/as_ps_cycle/tasks.py @@ -22,7 +22,6 @@ class BaseTask(QThread): currentItem = Signal(str) itemDone = Signal(str, bool) completed = Signal() - updated = Signal(str, bool, bool, bool) def __init__(self, parent=None, psnames=list(), timing=None, need_controller=False, isadv=False): @@ -35,12 +34,10 @@ def __init__(self, parent=None, psnames=list(), timing=None, cyclers[ps] = BaseTask._cyclers[ps] if not BaseTask._controller: BaseTask._controller = CycleController( - cyclers=cyclers, timing=timing, logger=self, - isadv=isadv) + cyclers=cyclers, timing=timing, isadv=isadv) else: BaseTask._controller.cyclers = cyclers BaseTask._controller.timing = timing - BaseTask._controller.logger = self self._quit_task = False def size(self): @@ -63,10 +60,6 @@ def run(self): if not self._interrupted: self.completed.emit() - def update(self, message, done, warning, error): - now = _datetime.now().strftime('%Y/%m/%d-%H:%M:%S') - self.updated.emit(now+' '+message, done, warning, error) - def function(self): """Must be reimplemented in each class.""" raise NotImplementedError From 682cb8e9dd7d93f3bbf41bc867b50c8724c04e66 Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 21 Dec 2023 10:22:51 -0300 Subject: [PATCH 3/5] CYCLE.BUG: fix bug in ProgressListHandler.emit method. --- pyqt-apps/siriushla/as_ps_cycle/cycle_window.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py b/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py index 7c2008ca0..6c1d718f7 100644 --- a/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py +++ b/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py @@ -43,7 +43,7 @@ def __init__(self, callback, level=_log.logging.INFO): def emit(self, record): """.""" - msg = self.format(msg) + msg = self.format(record) error = record.levelno >= _log.logging.ERROR warning = not error and record.levelno >= _log.logging.WARNING self.callback(msg, warning=warning, error=error) From a23edf961e5ad5c58ee4b3f6950200bc92bac538 Mon Sep 17 00:00:00 2001 From: Fernando Date: Thu, 21 Dec 2023 10:30:00 -0300 Subject: [PATCH 4/5] CYCLE.STY: Adapt code to ruff formatter style. --- .../siriushla/as_ps_cycle/cycle_window.py | 414 ++++++++++-------- 1 file changed, 237 insertions(+), 177 deletions(-) diff --git a/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py b/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py index 6c1d718f7..ad9efc6a1 100644 --- a/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py +++ b/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py @@ -4,30 +4,27 @@ import time as _time from functools import partial as _part -from qtpy.QtGui import QColor, QPalette, QKeySequence -from qtpy.QtCore import Signal, QThread, Qt, QTimer, QSize -from qtpy.QtWidgets import QWidget, QGridLayout, QVBoxLayout, QHBoxLayout, \ - QPushButton, QLabel, QMessageBox, QGroupBox, QListWidget, QSpacerItem, \ - QListWidgetItem, QProgressBar, QSizePolicy as QSzPlcy, QApplication, \ - QAbstractItemView import qtawesome as qta - import siriuspy.logging as _log +from qtpy.QtCore import QSize, Qt, QThread, QTimer, Signal +from qtpy.QtGui import QColor, QKeySequence, QPalette +from qtpy.QtWidgets import QAbstractItemView, QApplication, QGridLayout, \ + QGroupBox, QHBoxLayout, QLabel, QListWidget, QListWidgetItem, \ + QMessageBox, QProgressBar, QPushButton, QSizePolicy as QSzPlcy, \ + QSpacerItem, QVBoxLayout, QWidget +from siriuspy.cycle import get_psnames, get_sections, Timing from siriuspy.envars import VACA_PREFIX as VACA_PREFIX from siriuspy.namesys import Filter, SiriusPVName as PVName -from siriuspy.cycle import get_psnames, Timing, get_sections from siriuspy.search import PSSearch from ..util import get_appropriate_color, run_newprocess -from ..widgets import SiriusMainWindow, \ - PyDMLedMultiConnection as PyDMLedMultiConn -from ..widgets.pvnames_tree import PVNameTree +from ..widgets import PyDMLedMultiConnection as PyDMLedMultiConn, \ + SiriusMainWindow from ..widgets.dialog import ProgressDialog, PSStatusDialog -from .tasks import CreateCyclers, VerifyPS, \ - SaveTiming, PrepareTiming, RestoreTiming, \ - PreparePSSOFBMode, PreparePSOpModeSlowRef, PreparePSCurrentZero, \ - PreparePSParams, PreparePSOpModeCycle, Cycle, CycleTrims - +from ..widgets.pvnames_tree import PVNameTree +from .tasks import CreateCyclers, Cycle, CycleTrims, PreparePSCurrentZero, \ + PreparePSOpModeCycle, PreparePSOpModeSlowRef, PreparePSParams, \ + PreparePSSOFBMode, PrepareTiming, RestoreTiming, SaveTiming, VerifyPS ERRORCOLOR = QColor(255, 0, 0) WARNCOLOR = QColor(200, 200, 0) @@ -55,9 +52,9 @@ class CycleWindow(SiriusMainWindow): def __init__(self, parent=None, checked_accs=(), adv_mode=False): """Constructor.""" super().__init__(parent) - self.setObjectName('ASApp') - cor = get_appropriate_color(section='AS') - self.setWindowIcon(qta.icon('mdi.recycle', color=cor)) + self.setObjectName("ASApp") + cor = get_appropriate_color(section="AS") + self.setWindowIcon(qta.icon("mdi.recycle", color=cor)) self._is_adv_mode = adv_mode # Data structs self._psnames = get_psnames(isadv=self._is_adv_mode) @@ -67,45 +64,49 @@ def __init__(self, parent=None, checked_accs=(), adv_mode=False): self._ps_failed = list() self._checked_accs = checked_accs # Flags - self._is_preparing = '' + self._is_preparing = "" self._prepared_init_vals = { - 'timing': False, - 'ps_sofbmode': False, - 'ps_om_slowref': False, - 'ps_current': False, - 'ps_params': False, - 'ps_om_cycle': False, - 'trims': True} + "timing": False, + "ps_sofbmode": False, + "ps_om_slowref": False, + "ps_current": False, + "ps_params": False, + "ps_om_cycle": False, + "trims": True, + } self._prepared = self._prepared_init_vals.copy() - self._icon_check = qta.icon('fa5s.check') + self._icon_check = qta.icon("fa5s.check") self._pixmap_check = self._icon_check.pixmap( - self._icon_check.actualSize(QSize(16, 16))) - self._icon_not = qta.icon('fa5s.times') + self._icon_check.actualSize(QSize(16, 16)) + ) + self._icon_not = qta.icon("fa5s.times") self._pixmap_not = self._icon_not.pixmap( - self._icon_not.actualSize(QSize(16, 16))) + self._icon_not.actualSize(QSize(16, 16)) + ) # Tasks self._step_2_task = { - 'save_timing': SaveTiming, - 'timing': PrepareTiming, - 'ps_sofbmode': PreparePSSOFBMode, - 'ps_om_slowref': PreparePSOpModeSlowRef, - 'ps_current': PreparePSCurrentZero, - 'ps_params': PreparePSParams, - 'ps_om_cycle': PreparePSOpModeCycle, - 'trims': CycleTrims, - 'cycle': Cycle, - 'restore_timing': RestoreTiming, + "save_timing": SaveTiming, + "timing": PrepareTiming, + "ps_sofbmode": PreparePSSOFBMode, + "ps_om_slowref": PreparePSOpModeSlowRef, + "ps_current": PreparePSCurrentZero, + "ps_params": PreparePSParams, + "ps_om_cycle": PreparePSOpModeCycle, + "trims": CycleTrims, + "cycle": Cycle, + "restore_timing": RestoreTiming, } # Setup UI self._needs_update_setup = False self._setup_ui() - _log.get_logger().addHandler(ProgressListHandler( - self._update_progress)) + _log.get_logger().addHandler( + ProgressListHandler(self._update_progress) + ) self._update_setup_timer = QTimer(self) self._update_setup_timer.timeout.connect(self._update_setup) self._update_setup_timer.setInterval(250) self._update_setup_timer.start() - self.setWindowTitle('PS Cycle') + self.setWindowTitle("PS Cycle") def _setup_ui(self): # central widget @@ -113,108 +114,123 @@ def _setup_ui(self): self.setCentralWidget(self.central_widget) # tree - gb_tree = QGroupBox('Select power supplies:') + gb_tree = QGroupBox("Select power supplies:") self.pwrsupplies_tree = PVNameTree( - self._psnames, ('sec', 'mag_group'), tuple(), self) + self._psnames, ("sec", "mag_group"), tuple(), self + ) self.pwrsupplies_tree.tree.setHeaderHidden(True) self.pwrsupplies_tree.tree.setColumnCount(1) glay_tree = QVBoxLayout(gb_tree) glay_tree.addWidget(self.pwrsupplies_tree) # commands - lb_prep_ti = QLabel('

Prepare Timing

', self, - alignment=Qt.AlignCenter) - ti_ch = [PVName(name).substitute(prefix=VACA_PREFIX) - for name in self._timing.get_pvnames_by_psnames()] + lb_prep_ti = QLabel( + "

Prepare Timing

", self, alignment=Qt.AlignCenter + ) + ti_ch = [ + PVName(name).substitute(prefix=VACA_PREFIX) + for name in self._timing.get_pvnames_by_psnames() + ] self.ticonn_led = PyDMLedMultiConn(self, channels=ti_ch) - self.save_timing_bt = QPushButton( - '1. Save Timing Initial State', self) + self.save_timing_bt = QPushButton("1. Save Timing Initial State", self) self.save_timing_bt.setToolTip( - 'Save timing current state as initial state.') + "Save timing current state as initial state." + ) self.save_timing_bt.clicked.connect( - _part(self._run_task, 'save_timing')) + _part(self._run_task, "save_timing") + ) self.save_timing_bt.clicked.connect(self._set_lastcomm) - self.prepare_timing_bt = QPushButton( - '2. Prepare Timing', self) - self.prepare_timing_bt.setToolTip( - 'Prepare EVG, triggers and events') - self.prepare_timing_bt.clicked.connect( - _part(self._run_task, 'timing')) + self.prepare_timing_bt = QPushButton("2. Prepare Timing", self) + self.prepare_timing_bt.setToolTip("Prepare EVG, triggers and events") + self.prepare_timing_bt.clicked.connect(_part(self._run_task, "timing")) self.prepare_timing_bt.clicked.connect(self._set_lastcomm) self.prepare_timing_lb = QLabel(self) self.prepare_timing_lb.setPixmap(self._pixmap_not) - lb_prep_ps = QLabel('

Prepare PS

', self, - alignment=Qt.AlignCenter) + lb_prep_ps = QLabel( + "

Prepare PS

", self, alignment=Qt.AlignCenter + ) self.psconn_led = PyDMLedMultiConn(self) self.set_ps_sofbmode_off_bt = QPushButton( - '3. Turn off PS SOFBMode', self) + "3. Turn off PS SOFBMode", self + ) self.set_ps_sofbmode_off_bt.setToolTip( - 'Turn off power supplies SOFBMode.') + "Turn off power supplies SOFBMode." + ) self.set_ps_sofbmode_off_bt.clicked.connect( - _part(self._run_task, 'ps_sofbmode')) + _part(self._run_task, "ps_sofbmode") + ) self.set_ps_sofbmode_off_bt.clicked.connect(self._set_lastcomm) self.set_ps_sofbmode_off_lb = QLabel(self) self.set_ps_sofbmode_off_lb.setPixmap(self._pixmap_not) self.set_ps_opmode_slowref_bt = QPushButton( - '4. Set PS OpMode to SlowRef', self) + "4. Set PS OpMode to SlowRef", self + ) self.set_ps_opmode_slowref_bt.setToolTip( - 'Set power supplies OpMode to SlowRef.') + "Set power supplies OpMode to SlowRef." + ) self.set_ps_opmode_slowref_bt.clicked.connect( - _part(self._run_task, 'ps_om_slowref')) + _part(self._run_task, "ps_om_slowref") + ) self.set_ps_opmode_slowref_bt.clicked.connect(self._set_lastcomm) self.set_ps_opmode_slowref_lb = QLabel(self) self.set_ps_opmode_slowref_lb.setPixmap(self._pixmap_not) self.set_ps_current_zero_bt = QPushButton( - '5. Set PS current to zero', self) + "5. Set PS current to zero", self + ) self.set_ps_current_zero_bt.setToolTip( - 'Set power supplies current to zero.') + "Set power supplies current to zero." + ) self.set_ps_current_zero_bt.clicked.connect( - _part(self._run_task, 'ps_current')) + _part(self._run_task, "ps_current") + ) self.set_ps_current_zero_bt.clicked.connect(self._set_lastcomm) self.set_ps_current_zero_lb = QLabel(self) self.set_ps_current_zero_lb.setPixmap(self._pixmap_not) self.prepare_ps_params_bt = QPushButton( - '6. Prepare PS Parameters', self) + "6. Prepare PS Parameters", self + ) self.prepare_ps_params_bt.setToolTip( - 'Check power supplies OpMode in SlowRef, check\n' - 'current is zero and configure cycle parameters.') + "Check power supplies OpMode in SlowRef, check\n" + "current is zero and configure cycle parameters." + ) self.prepare_ps_params_bt.clicked.connect( - _part(self._run_task, 'ps_params')) + _part(self._run_task, "ps_params") + ) self.prepare_ps_params_bt.clicked.connect(self._set_lastcomm) self.prepare_ps_params_lb = QLabel(self) self.prepare_ps_params_lb.setPixmap(self._pixmap_not) - self.prepare_ps_opmode_bt = QPushButton( - '7. Prepare PS OpMode', self) + self.prepare_ps_opmode_bt = QPushButton("7. Prepare PS OpMode", self) self.prepare_ps_opmode_bt.setToolTip( - 'Set power supplies OpMode to Cycle.') + "Set power supplies OpMode to Cycle." + ) self.prepare_ps_opmode_bt.clicked.connect( - _part(self._run_task, 'ps_om_cycle')) + _part(self._run_task, "ps_om_cycle") + ) self.prepare_ps_opmode_bt.clicked.connect(self._set_lastcomm) self.prepare_ps_opmode_lb = QLabel(self) self.prepare_ps_opmode_lb.setPixmap(self._pixmap_not) - lb_cycle = QLabel( - '

Cycle

', self, alignment=Qt.AlignCenter) + lb_cycle = QLabel("

Cycle

", self, alignment=Qt.AlignCenter) - self.cycle_trims_bt = QPushButton('8. Cycle Trims', self) + self.cycle_trims_bt = QPushButton("8. Cycle Trims", self) self.cycle_trims_bt.setToolTip( - 'Cycle trims:\nStep 1) CH, QS and QTrims\nStep 2) CV') - self.cycle_trims_bt.clicked.connect( - _part(self._run_task, 'trims')) + "Cycle trims:\nStep 1) CH, QS and QTrims\nStep 2) CV" + ) + self.cycle_trims_bt.clicked.connect(_part(self._run_task, "trims")) self.cycle_trims_bt.clicked.connect(self._set_lastcomm) self.cycle_trims_bt.setVisible(False) @@ -222,47 +238,54 @@ def _setup_ui(self): self.cycle_trims_lb.setPixmap(self._pixmap_check) self.cycle_trims_lb.setVisible(False) - self.cycle_bt = QPushButton('8. Cycle', self) + self.cycle_bt = QPushButton("8. Cycle", self) self.cycle_bt.setToolTip( - 'Check all configurations,\nenable triggers and run cycle.') - self.cycle_bt.clicked.connect( - _part(self._run_task, 'cycle')) + "Check all configurations,\nenable triggers and run cycle." + ) + self.cycle_bt.clicked.connect(_part(self._run_task, "cycle")) self.cycle_bt.clicked.connect(self._set_lastcomm) self.cycle_bt.setEnabled(False) - lb_rest_ti = QLabel('

Restore Timing

', self, - alignment=Qt.AlignCenter) + lb_rest_ti = QLabel( + "

Restore Timing

", self, alignment=Qt.AlignCenter + ) self.restore_timing_bt = QPushButton( - '9. Restore Timing Initial State', self) - self.restore_timing_bt.setToolTip( - 'Restore timing initial state.') + "9. Restore Timing Initial State", self + ) + self.restore_timing_bt.setToolTip("Restore timing initial state.") self.restore_timing_bt.clicked.connect( - _part(self._run_task, 'restore_timing')) + _part(self._run_task, "restore_timing") + ) self.restore_timing_bt.clicked.connect(self._set_lastcomm) self._prepared_labels = { - 'timing': self.prepare_timing_lb, - 'ps_sofbmode': self.set_ps_sofbmode_off_lb, - 'ps_om_slowref': self.set_ps_opmode_slowref_lb, - 'ps_current': self.set_ps_current_zero_lb, - 'ps_params': self.prepare_ps_params_lb, - 'ps_om_cycle': self.prepare_ps_opmode_lb, - 'trims': self.cycle_trims_lb} + "timing": self.prepare_timing_lb, + "ps_sofbmode": self.set_ps_sofbmode_off_lb, + "ps_om_slowref": self.set_ps_opmode_slowref_lb, + "ps_current": self.set_ps_current_zero_lb, + "ps_params": self.prepare_ps_params_lb, + "ps_om_cycle": self.prepare_ps_opmode_lb, + "trims": self.cycle_trims_lb, + } gb_commsts = QGroupBox() - gb_commsts.setStyleSheet(""" + gb_commsts.setStyleSheet( + """ QPushButton{min-height:1.5em;} - QLabel{qproperty-alignment: AlignCenter;}""") + QLabel{qproperty-alignment: AlignCenter;}""" + ) lay_commsts = QGridLayout(gb_commsts) lay_commsts.addItem( - QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 0, 0, 1, 2) + QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 0, 0, 1, 2 + ) lay_commsts.addWidget(lb_prep_ti, 1, 0) lay_commsts.addWidget(self.ticonn_led, 1, 1) lay_commsts.addWidget(self.save_timing_bt, 2, 0) lay_commsts.addWidget(self.prepare_timing_bt, 3, 0) lay_commsts.addWidget(self.prepare_timing_lb, 3, 1) lay_commsts.addItem( - QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 4, 0) + QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 4, 0 + ) lay_commsts.addWidget(lb_prep_ps, 5, 0) lay_commsts.addWidget(self.psconn_led, 5, 1) lay_commsts.addWidget(self.set_ps_sofbmode_off_bt, 6, 0) @@ -276,24 +299,27 @@ def _setup_ui(self): lay_commsts.addWidget(self.prepare_ps_opmode_bt, 10, 0) lay_commsts.addWidget(self.prepare_ps_opmode_lb, 10, 1) lay_commsts.addItem( - QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 11, 0) + QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 11, 0 + ) lay_commsts.addWidget(lb_cycle, 12, 0) lay_commsts.addWidget(self.cycle_trims_bt, 13, 0) lay_commsts.addWidget(self.cycle_trims_lb, 13, 1) lay_commsts.addWidget(self.cycle_bt, 14, 0) lay_commsts.addItem( - QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 15, 0) + QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 15, 0 + ) lay_commsts.addWidget(lb_rest_ti, 16, 0) lay_commsts.addWidget(self.restore_timing_bt, 17, 0) lay_commsts.addItem( - QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 18, 0) + QSpacerItem(1, 1, QSzPlcy.Ignored, QSzPlcy.Expanding), 18, 0 + ) lay_commsts.setColumnStretch(0, 10) lay_commsts.setColumnStretch(1, 1) lay_commsts.setVerticalSpacing(12) lay_commsts.setHorizontalSpacing(6) - self.label_lastcomm = QLabel('Last Command: ', self) - self.clearhist_bt = QPushButton('Clear', self) + self.label_lastcomm = QLabel("Last Command: ", self) + self.clearhist_bt = QPushButton("Clear", self) self.clearhist_bt.clicked.connect(self._clear_lastcomm) lay_lc = QHBoxLayout() lay_lc.setContentsMargins(0, 0, 0, 0) @@ -303,12 +329,13 @@ def _setup_ui(self): lay_lc.setStretch(1, 1) self.progress_list = QListWidget(self) - self.progress_list.setObjectName('progresslist') - self.progress_list.setStyleSheet('#progresslist{min-width:20em;}') + self.progress_list.setObjectName("progresslist") + self.progress_list.setStyleSheet("#progresslist{min-width:20em;}") self.progress_list.itemDoubleClicked.connect(self._open_ps_detail) self.progress_list.setSelectionMode(QAbstractItemView.MultiSelection) self.progress_list.setToolTip( - 'Select rows and press Ctrl+C to copy and Esc to deselect.') + "Select rows and press Ctrl+C to copy and Esc to deselect." + ) self.progress_bar = MyProgressBar(self) @@ -320,15 +347,21 @@ def _setup_ui(self): # connect tree signals self.pwrsupplies_tree.tree.doubleClicked.connect(self._open_ps_detail) self.pwrsupplies_tree.tree.itemChanged.connect( - self._handle_checked_items_changed) + self._handle_checked_items_changed + ) self.pwrsupplies_tree.check_requested_levels(self._checked_accs) # layout layout = QGridLayout() layout.setVerticalSpacing(10) layout.setHorizontalSpacing(10) - layout.addWidget(QLabel( - '

PS Cycle

', self, alignment=Qt.AlignCenter), 0, 0, 1, 3) + layout.addWidget( + QLabel("

PS Cycle

", self, alignment=Qt.AlignCenter), + 0, + 0, + 1, + 3, + ) layout.addWidget(gb_tree, 1, 0) layout.addWidget(gb_commsts, 1, 1) layout.addLayout(lay_log, 1, 2) @@ -341,29 +374,33 @@ def _setup_ui(self): # --- handle tasks --- - def _run_task(self, control=''): + def _run_task(self, control=""): if not self._check_connected(control): return pwrsupplies = self._get_ps_list() if not pwrsupplies: return - if 'ps' in control and not self._verify_ps(pwrsupplies): + if "ps" in control and not self._verify_ps(pwrsupplies): return if control in self._step_2_task: task_class = self._step_2_task[control] else: raise NotImplementedError( - "Task not defined for control '{}'".format(control)) + "Task not defined for control '{}'".format(control) + ) self._is_preparing = control self._handle_buttons_enabled(False) self.progress_list.clear() task = task_class( - parent=self, psnames=pwrsupplies, timing=self._timing, - isadv=self._is_adv_mode) + parent=self, + psnames=pwrsupplies, + timing=self._timing, + isadv=self._is_adv_mode, + ) duration = task.duration() self.progress_bar.setMinimum(0) @@ -381,18 +418,21 @@ def _run_task(self, control=''): def _update_progress(self, text: str, warning=False, error=False): """Update automated cycle progress list and bar.""" - if text.strip().lower() == 'done': - last_item = self.progress_list.item(self.progress_list.count()-1) + if text.strip().lower() == "done": + last_item = self.progress_list.item(self.progress_list.count() - 1) curr_text = last_item.text() - last_item.setText(curr_text+' done.') + last_item.setText(curr_text + " done.") return especial_txt = [ - 'Remaining time', 'Sent ', 'Successfully checked ', - 'Created connections '] - res = _re.findall('.*({}).*'.format('|'.join(especial_txt)), text) + "Remaining time", + "Sent ", + "Successfully checked ", + "Created connections ", + ] + res = _re.findall(".*({}).*".format("|".join(especial_txt)), text) if res: - last_item = self.progress_list.item(self.progress_list.count()-1) + last_item = self.progress_list.item(self.progress_list.count() - 1) if res[0] in last_item.text(): last_item.setText(text) return @@ -407,20 +447,19 @@ def _update_progress(self, text: str, warning=False, error=False): item.setForeground(ERRORCOLOR) self.update_bar.exit_task() pal = self.progress_bar.palette() - pal.setColor( - QPalette.Highlight, self.progress_bar.warning_color) + pal.setColor(QPalette.Highlight, self.progress_bar.warning_color) self.progress_bar.setPalette(pal) if self._is_preparing in self._prepared.keys(): self._prepared[self._is_preparing] = False cycle = all(self._prepared.values()) self._handle_buttons_enabled(True, cycle=cycle) - elif 'finished' in text: + elif "finished" in text: self.update_bar.exit_task() self.progress_bar.setValue(self.progress_bar.maximum()) - if self._is_preparing == 'cycle': + if self._is_preparing == "cycle": self._prepared = {k: False for k in self._prepared.keys()} if not self.cycle_trims_bt.isVisible(): - self._prepared['trims'] = True + self._prepared["trims"] = True cycle = False else: if self._is_preparing in self._prepared.keys(): @@ -453,12 +492,12 @@ def _handle_stslabels_content(self): def _set_lastcomm(self): sender_text = self.sender().text() - self.label_lastcomm.setText('Last Command: '+sender_text) + self.label_lastcomm.setText("Last Command: " + sender_text) def _clear_lastcomm(self): self.progress_bar.setValue(0) self.progress_list.clear() - self.label_lastcomm.setText('Last Command: ') + self.label_lastcomm.setText("Last Command: ") # --- handle ps selection --- @@ -467,17 +506,18 @@ def _get_ps_list(self): # Get power supplies list pwrsupplies = self.pwrsupplies_tree.checked_items() if not pwrsupplies: - QMessageBox.critical(self, 'Message', 'No power supply selected!') + QMessageBox.critical(self, "Message", "No power supply selected!") return False sections = get_sections(pwrsupplies) - if 'BO' in sections and len(sections) > 1: + if "BO" in sections and len(sections) > 1: QMessageBox.critical( - self, 'Error', 'Can not cycle Booster with other sectors!') + self, "Error", "Can not cycle Booster with other sectors!" + ) return False create_task = CreateCyclers(parent=self, psnames=pwrsupplies) - dlg = ProgressDialog('Creating cycles...', create_task, self) + dlg = ProgressDialog("Creating cycles...", create_task, self) ret = dlg.exec_() if ret == dlg.Rejected: return False @@ -486,13 +526,17 @@ def _get_ps_list(self): def _handle_checked_items_changed(self, item): psname = PVName(item.data(0, Qt.DisplayRole)) - if not _re.match('.*-.*:.*-.*', psname): + if not _re.match(".*-.*:.*-.*", psname): return - if not self._is_adv_mode and psname.sec == 'SI' and \ - not psname.dev.startswith('FC'): + if ( + not self._is_adv_mode + and psname.sec == "SI" + and not psname.dev.startswith("FC") + ): psname2check = Filter.process_filters( - self._psnames, filters={'sec': 'SI', 'dev': '(?!FC)'}) + self._psnames, filters={"sec": "SI", "dev": "(?!FC)"} + ) psname2check.remove(psname) state2set = item.checkState(0) self.pwrsupplies_tree.tree.blockSignals(True) @@ -502,9 +546,10 @@ def _handle_checked_items_changed(self, item): item2check.setData(0, Qt.CheckStateRole, state2set) self.pwrsupplies_tree.tree.blockSignals(False) else: - if (psname.sec in ['BO', 'SI'] and psname.dev in ['B', 'B1B2']): + if psname.sec in ["BO", "SI"] and psname.dev in ["B", "B1B2"]: psname2check = PSSearch.get_psnames( - {'sec': psname.sec, 'dev': 'B.*'}) + {"sec": psname.sec, "dev": "B.*"} + ) psname2check.remove(psname) item2check = self.pwrsupplies_tree._item_map[psname2check[0]] @@ -525,20 +570,25 @@ def _update_setup(self): # update leds psnames = self.pwrsupplies_tree.checked_items() - ti_ch = [PVName(name).substitute(prefix=VACA_PREFIX) - for name in self._timing.get_pvnames_by_psnames(psnames)] + ti_ch = [ + PVName(name).substitute(prefix=VACA_PREFIX) + for name in self._timing.get_pvnames_by_psnames(psnames) + ] self.ticonn_led.set_channels(ti_ch) ps_ch = list() for name in psnames: - ps_ch.append(PVName(name).substitute( - prefix=VACA_PREFIX, propty='PwrState-Sts')) + ps_ch.append( + PVName(name).substitute( + prefix=VACA_PREFIX, propty="PwrState-Sts" + ) + ) self.psconn_led.set_channels(ps_ch) # update buttons and self._prepared dict if not in advanced mode if not self._is_adv_mode: has_sifam = False - sifamfilt = {'sec': 'SI', 'sub': 'Fam', 'dis': 'PS'} + sifamfilt = {"sec": "SI", "sub": "Fam", "dis": "PS"} for psn in PSSearch.get_psnames(sifamfilt): if psn not in self.pwrsupplies_tree._item_map: continue @@ -546,19 +596,21 @@ def _update_setup(self): has_sifam |= item.checkState(0) != 0 if not has_sifam: - self.cycle_bt.setText('8. Cycle') + self.cycle_bt.setText("8. Cycle") self.restore_timing_bt.setText( - '9. Restore Timing Initial State') + "9. Restore Timing Initial State" + ) self.cycle_trims_bt.setVisible(False) self.cycle_trims_lb.setVisible(False) - self._prepared['trims'] = True + self._prepared["trims"] = True else: - self.cycle_bt.setText('9. Cycle') + self.cycle_bt.setText("9. Cycle") self.restore_timing_bt.setText( - '10. Restore Timing Initial State') + "10. Restore Timing Initial State" + ) self.cycle_trims_bt.setVisible(True) self.cycle_trims_lb.setVisible(True) - self._prepared['trims'] = False + self._prepared["trims"] = False self._handle_stslabels_content() self._handle_buttons_enabled(True) @@ -566,12 +618,16 @@ def _update_setup(self): # --- auxiliary checks --- def _check_connected(self, control): - if control in ['trims', 'cycle']: + if control in ["trims", "cycle"]: leds = [self.ticonn_led, self.psconn_led] - elif 'timing' in control: - leds = [self.ticonn_led, ] + elif "timing" in control: + leds = [ + self.ticonn_led, + ] else: - leds = [self.psconn_led, ] + leds = [ + self.psconn_led, + ] for led in leds: pvs_disconnected = set() @@ -579,12 +635,14 @@ def _check_connected(self, control): if not v: pvs_disconnected.add(ch) if pvs_disconnected: - sttr = '' + sttr = "" for item in pvs_disconnected: - sttr += item + '\n' + sttr += item + "\n" QMessageBox.information( - self, 'Message', - 'The following PVs are not connected:\n'+sttr) + self, + "Message", + "The following PVs are not connected:\n" + sttr, + ) return False return True @@ -595,15 +653,18 @@ def _verify_ps(self, pwrsupplies): task.itemDone.connect(self._get_ps_not_ready_2_cycle) dlg = ProgressDialog( - 'Verifying power supplies initial state...', task, self) + "Verifying power supplies initial state...", task, self + ) ret = dlg.exec_() if ret == dlg.Rejected: self._handle_buttons_enabled(True) return False if self._ps_failed: - text = 'Verify power state and interlocks' \ - ' of the following power supplies' + text = ( + "Verify power state and interlocks" + " of the following power supplies" + ) dlg = PSStatusDialog(self._ps_failed, text, self) dlg.exec_() self._handle_buttons_enabled(True) @@ -617,21 +678,21 @@ def _get_ps_not_ready_2_cycle(self, psname, status): def _open_ps_detail(self, item): if self.sender() == self.progress_list: - text_split = item.data(Qt.DisplayRole).split(' ') - psname = '' + text_split = item.data(Qt.DisplayRole).split(" ") + psname = "" for text in text_split: - if _re.match('.*-.*:.*-.*', text): + if _re.match(".*-.*:.*-.*", text): psname = text if not psname: return else: psname = item.data() - if not _re.match('.*-.*:.*-.*', psname): + if not _re.match(".*-.*:.*-.*", psname): if item.model().rowCount(item) == 1: psname = item.child(0, 0).data() else: return - run_newprocess(['sirius-hla-as-ps-detail.py', psname]) + run_newprocess(["sirius-hla-as-ps-detail.py", psname]) # --- events --- @@ -639,7 +700,7 @@ def keyPressEvent(self, evt): """Implement keyPressEvent.""" if evt.matches(QKeySequence.Copy) and self.progress_list.underMouse(): items = self.progress_list.selectedItems() - items = '\n'.join([i.text() for i in items]) + items = "\n".join([i.text() for i in items]) QApplication.clipboard().setText(items) if evt.key() == Qt.Key_Escape and self.progress_list.underMouse(): items = self.progress_list.clearSelection() @@ -652,8 +713,8 @@ def closeEvent(self, ev): # Auxiliar progress monitoring classes -class MyProgressBar(QProgressBar): +class MyProgressBar(QProgressBar): def __init__(self, parent=None): super().__init__(parent) pal = self.palette() @@ -664,11 +725,10 @@ def increment(self): current_val = self.value() max_val = self.maximum() if max_val > current_val: - self.setValue(current_val+1) + self.setValue(current_val + 1) class UpdateProgressBar(QThread): - increment = Signal() def __init__(self, duration, parent=None): From dda2f55cef756fd813cee041d53c87140136920d Mon Sep 17 00:00:00 2001 From: Fernando Date: Wed, 29 May 2024 14:53:43 -0300 Subject: [PATCH 5/5] CYCLE.STY: fix some linter errors. --- pyqt-apps/siriushla/as_ps_cycle/cycle_window.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py b/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py index ad9efc6a1..215f63c1b 100644 --- a/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py +++ b/pyqt-apps/siriushla/as_ps_cycle/cycle_window.py @@ -707,6 +707,7 @@ def keyPressEvent(self, evt): super().keyPressEvent(evt) def closeEvent(self, ev): + """.""" self._update_setup_timer.stop() super().closeEvent(ev) @@ -715,13 +716,17 @@ def closeEvent(self, ev): class MyProgressBar(QProgressBar): + """.""" + def __init__(self, parent=None): + """.""" super().__init__(parent) pal = self.palette() self.default_color = pal.color(QPalette.Highlight) self.warning_color = Qt.red def increment(self): + """.""" current_val = self.value() max_val = self.maximum() if max_val > current_val: @@ -729,9 +734,11 @@ def increment(self): class UpdateProgressBar(QThread): + """.""" increment = Signal() def __init__(self, duration, parent=None): + """.""" super().__init__(parent) self._duration = duration self._quit_task = False @@ -741,6 +748,7 @@ def exit_task(self): self._quit_task = True def run(self): + """.""" t0 = _time.time() while _time.time() - t0 < self._duration: if self._quit_task: