264 lines
10 KiB
Python
264 lines
10 KiB
Python
'''Main panel gui interface
|
|
'''
|
|
import os
|
|
import subprocess
|
|
|
|
|
|
from qtpy.QtGui import QColor
|
|
from qtpy.QtCore import __version__ as QT_VERSION_STR
|
|
from qtpy.QtCore import Qt
|
|
from qtpy.QtWidgets import (
|
|
QGridLayout, QGroupBox, QLabel, QPushButton, QStackedWidget, QTabBar,
|
|
QTabWidget, QWidget)
|
|
|
|
from caqtwidgets.pvwidgets import CAQLabel
|
|
|
|
_pymodule = os.path.basename(__file__)
|
|
|
|
|
|
class AppGui(QWidget):
|
|
''' Main GUI class
|
|
'''
|
|
|
|
def __init__(self, parent):
|
|
super().__init__()
|
|
self.parent = parent
|
|
self.cafe = self.parent.cafe
|
|
self.cyca = self.parent.cyca
|
|
self.settings = self.parent.settings
|
|
self.check_status = self.parent.check_status
|
|
self.check_status_list = self.parent.check_status_list
|
|
self.elog_enum = self.parent.elog_enum
|
|
self.accelerator_list = self.parent.accelerator_list
|
|
self.send_to_log_window = self.parent.send_to_log_window
|
|
self.show_log_message = self.parent.show_log_message
|
|
self.statusbar = self.parent.statusbar
|
|
self.gui_frame = self.parent.gui_frame
|
|
self.gui_header = self.parent.gui_header
|
|
self.font_gui = self.parent.gui_frame.font_gui
|
|
self.input_parameters = self.parent.input_parameters
|
|
self.input_labels = self.parent.input_labels
|
|
self.expert_parameters = self.parent.expert_parameters
|
|
self.gui_frame.expert_parameters_group.setFixedWidth(280)
|
|
self.gui_frame.expert_parameters_group.setFixedHeight(430)
|
|
self.gui_frame.operator_parameters_group.setFixedWidth(260)
|
|
self.gui_frame.operator_parameters_group.setFixedHeight(400)
|
|
self.gui_frame.measurement_tab_wgt.setFixedWidth(516)
|
|
self.gui_frame.measurement_tab_wgt.setFixedHeight(580)
|
|
self.gui_frame.operator_wgt.setFixedHeight(640)
|
|
# self.gui_frame.expert_wgt.setFixedHeight(240)
|
|
self.gui_frame.expert_wgt.layout().addWidget(
|
|
self.low_level_display(), 2, 0, 1, 1)
|
|
self.gui_frame.expert_wgt.layout().setVerticalSpacing(30)
|
|
self.gui_frame.measurement_tab_wgt.setCurrentIndex(1)
|
|
self.gui_frame.measurement_tab_wgt.setTabText(0, 'Accelerator')
|
|
|
|
# DAQ
|
|
self.daq_wgt = self.daq_group_qtabwidget(widget_type='QStackedWidget')
|
|
self.gui_frame.measurement_layout.addWidget(
|
|
self.daq_wgt, 0, 1, 1, 1, alignment=Qt.AlignTop)
|
|
|
|
self.daq_wgt.setCurrentIndex(self.parent.default_idx)
|
|
self.daq_wgt.currentChanged.emit(self.parent.default_idx)
|
|
|
|
|
|
# Accelerator Current
|
|
self.current_wgt = self.accelerator_current_group_qtabwidget(
|
|
widget_type='QStackedWidget')
|
|
self.gui_frame.measurement_layout.addWidget(
|
|
self.current_wgt, 1, 1, 1, 1, alignment=Qt.AlignTop)
|
|
|
|
self.current_wgt.setCurrentIndex(self.parent.default_idx)
|
|
self.current_wgt.currentChanged.emit(self.parent.default_idx)
|
|
|
|
choice_wgt = self.gui_frame.line_sender_dict['signalPeakSearch']
|
|
choice_wgt.name = 'Expert'
|
|
self.gui_frame.line_sender_dict['signalSearch'] = choice_wgt
|
|
choice_wgt = self.gui_frame.line_sender_dict['accelerator']
|
|
choice_wgt.name = 'Operator'
|
|
self.gui_frame.line_sender_dict['accelerator'] = choice_wgt
|
|
|
|
# On change Injector/Cyclotron
|
|
self.gui_frame.line_sender_dict[
|
|
'accelerator'].currentChanged.connect(self.cb_accelerator)
|
|
# self.gui_frame.line_sender_dict[
|
|
# 'signalPeakSearch'].currentChanged.connect(self.cb_accelerator)
|
|
|
|
def cb_accelerator(self, idx):
|
|
self.daq_wgt.setCurrentIndex(idx)
|
|
self.current_wgt.setCurrentIndex(idx)
|
|
#is_sender = self.sender().name
|
|
#print(_sender, flush=True)
|
|
self.gui_frame.line_sender_dict[
|
|
'signalPeakSearch'].setCurrentIndex(idx)
|
|
|
|
'''
|
|
if "Expert" in is_sender:
|
|
self.gui_frame.line_sender_dict[
|
|
'signalPeakSearch'].blockSignals(True)
|
|
self.gui_frame.line_sender_dict['accelerator'].setCurrentIndex(idx)
|
|
self.gui_frame.line_sender_dict[
|
|
'signalPeakSearch'].blockSignals(False)
|
|
else:
|
|
self.gui_frame.line_sender_dict[
|
|
'accelerator'].blockSignals(True)
|
|
self.gui_frame.line_sender_dict[
|
|
'signalPeakSearch'].setCurrentIndex(idx)
|
|
self.gui_frame.line_sender_dict[
|
|
'accelerator'].blockSignals(False)
|
|
'''
|
|
|
|
def daq_group_qtabwidget(self, widget_type='QStackedWidget'):
|
|
accel_wgt_dict = {}
|
|
|
|
if 'QTabWidget' in widget_type:
|
|
accel_tab_widget = QTabWidget()
|
|
accel_tab_widget.setFont(self.font_gui)
|
|
accel_tab_widget.setStyleSheet('QTabBar {font-size: 10pt;}')
|
|
accel_tab_widget.tabBar().setShape(QTabBar.TriangularNorth)
|
|
|
|
for i, accel in enumerate(self.accelerator_list):
|
|
accel_wgt_dict[accel] = self.daq_group(accel)
|
|
|
|
accel_tab_widget.addTab(accel_wgt_dict[accel], accel)
|
|
color = self.settings.data['Parameters']['accelerator']['data'][
|
|
'color'][i]
|
|
accel_tab_widget.tabBar().setTabTextColor(i, QColor(color))
|
|
|
|
else:
|
|
accel_tab_widget = QStackedWidget()
|
|
|
|
for i, accel in enumerate(self.accelerator_list):
|
|
accel_wgt_dict[accel] = self.daq_group(accel)
|
|
accel_tab_widget.addWidget(accel_wgt_dict[accel])
|
|
|
|
accel_tab_widget.setFixedWidth(320)
|
|
accel_tab_widget.setFixedHeight(160)
|
|
return accel_tab_widget
|
|
|
|
def daq_group(self, accel):
|
|
group_box = QGroupBox(f'{accel} DAQ')
|
|
obj_name = 'CYCLOTRON' if self.parent.ring_cyclotron in accel else \
|
|
'INJECTOR'
|
|
group_box.setObjectName(obj_name)
|
|
vbox = QGridLayout()
|
|
pv_daq = []
|
|
pv_daq.append(self.settings.data['PV'][accel]['daqTrigger'])
|
|
pv_daq.append(self.settings.data['PV'][accel]['daqReady'])
|
|
pv_daq.append(self.settings.data['PV'][accel]['daqErrorCount'])
|
|
self.cafe.openPrepare()
|
|
self.cafe.open(pv_daq)
|
|
self.cafe.openNowAndWait(1.0)
|
|
|
|
vbox.addWidget(QLabel('DAQ Trigger:'), 0, 0)
|
|
vbox.addWidget(QLabel('DAQ Count:'), 1, 0)
|
|
vbox.addWidget(QLabel('Error Count:'), 2, 0)
|
|
|
|
pv_widget = [None] * len(pv_daq)
|
|
for i, pv in enumerate(pv_daq):
|
|
pv_widget[i] = CAQLabel(self, pv_name=pv)
|
|
vbox.addWidget(pv_widget[i], i, 1)
|
|
fwidth = 40 if 'ERR-CNT' not in pv else 60
|
|
pv_widget[i].setFixedWidth(fwidth)
|
|
|
|
vbox.setContentsMargins(9, 19, 9, 9)
|
|
vbox.setSpacing(5)
|
|
vbox.setAlignment(Qt.AlignTop | Qt.AlignHCenter)
|
|
group_box.setFixedWidth(220)
|
|
group_box.setFixedHeight(140)
|
|
group_box.setFont(self.font_gui)
|
|
group_box.setAlignment(int(Qt.AlignTop | Qt.AlignHCenter))
|
|
group_box.setLayout(vbox)
|
|
|
|
qw = QWidget()
|
|
grid = QGridLayout()
|
|
grid.addWidget(group_box, 0, 0)
|
|
qw.setLayout(grid)
|
|
|
|
return qw
|
|
|
|
def accelerator_current_group_qtabwidget(
|
|
self, widget_type='QStackedWidget'):
|
|
accel_wgt_dict = {}
|
|
|
|
if 'QTabWidget' in widget_type:
|
|
accel_tab_widget = QTabWidget()
|
|
accel_tab_widget.setFont(self.font_gui)
|
|
accel_tab_widget.setStyleSheet('QTabBar {font-size: 10pt;}')
|
|
accel_tab_widget.tabBar().setShape(QTabBar.TriangularNorth)
|
|
|
|
for i, accel in enumerate(self.accelerator_list):
|
|
accel_wgt_dict[accel] = self.accelerator_current_group(accel)
|
|
|
|
accel_tab_widget.addTab(accel_wgt_dict[accel], accel)
|
|
color = self.settings.data['Parameters']['accelerator']['data'][
|
|
'color'][i]
|
|
accel_tab_widget.tabBar().setTabTextColor(i, QColor(color))
|
|
|
|
else:
|
|
accel_tab_widget = QStackedWidget()
|
|
|
|
for i, accel in enumerate(self.accelerator_list):
|
|
accel_wgt_dict[accel] = self.accelerator_current_group(accel)
|
|
accel_tab_widget.addWidget(accel_wgt_dict[accel])
|
|
|
|
accel_tab_widget.setFixedWidth(320)
|
|
accel_tab_widget.setFixedHeight(180)
|
|
return accel_tab_widget
|
|
|
|
def accelerator_current_group(self, accel):
|
|
group_box = QGroupBox(f'{accel} Current')
|
|
obj_name = 'CYCLOTRON' if self.parent.ring_cyclotron in accel else \
|
|
'INJECTOR'
|
|
group_box.setObjectName(obj_name)
|
|
vbox = QGridLayout()
|
|
pv_name = []
|
|
pv_name.append(self.settings.data['PV'][accel]['IEntry'])
|
|
pv_name.append(self.settings.data['PV'][accel]['IExit'])
|
|
self.cafe.openPrepare()
|
|
self.cafe.open(pv_name)
|
|
self.cafe.openNowAndWait(1.0)
|
|
|
|
vbox.addWidget(QLabel('I at Entry:'), 0, 0)
|
|
vbox.addWidget(QLabel('I at Exit:'), 1, 0)
|
|
|
|
pv_widget = [None] * len(pv_name)
|
|
for i, pv in enumerate(pv_name):
|
|
pv_widget[i] = CAQLabel(self, pv_name=pv, show_units=True)
|
|
vbox.addWidget(pv_widget[i], i, 1)
|
|
fwidth = 120
|
|
pv_widget[i].setFixedWidth(fwidth)
|
|
|
|
vbox.setContentsMargins(9, 19, 9, 9)
|
|
vbox.setSpacing(5)
|
|
vbox.setAlignment(Qt.AlignTop | Qt.AlignHCenter)
|
|
group_box.setFixedWidth(220)
|
|
group_box.setFixedHeight(100)
|
|
group_box.setFont(self.font_gui)
|
|
group_box.setAlignment(int(Qt.AlignTop | Qt.AlignHCenter))
|
|
group_box.setLayout(vbox)
|
|
|
|
qw = QWidget()
|
|
grid = QGridLayout()
|
|
grid.addWidget(group_box, 0, 0)
|
|
qw.setLayout(grid)
|
|
|
|
return qw
|
|
|
|
def low_level_display(self):
|
|
|
|
#command = "caqtdm -macro 'DEVICE=ZWSGA-CECL-TCRING' Z_DI_TURN_COUNT.ui"
|
|
|
|
def low_level_macro():
|
|
subprocess.run(["caqtdm", "-macro", "DEVICE=ZWSGA-CECL-TCRING",
|
|
"Z_DI_TURN_COUNT.ui"])
|
|
|
|
qpb = QPushButton(" Low-level Display ")
|
|
#qpb.setStyleSheet("background-color: #B79D5C;") # QColor(183, 157, 92);")
|
|
qpb.setObjectName("related")
|
|
qpb.setToolTip("Execute caqtdm Turn Counter Display")
|
|
qpb.clicked.connect(lambda: low_level_macro())
|
|
qpb.setFixedHeight(40)
|
|
qpb.setFixedWidth(180)
|
|
return qpb
|