Initial commit

This commit is contained in:
2023-05-01 10:43:34 +02:00
parent 0ff63ddb4a
commit 8d1c4e6b93
7 changed files with 11 additions and 1576 deletions
+11 -8
View File
@@ -1,9 +1,12 @@
rm *.*~
rm *.*-*
rm *.*+*
rm pyrcc5
rm pyrcc5/*.*
rm src/*.*~
rm src/*.*-*
rm src/*.*+*
*.*~
*.*-*
*.*+*
pyrcc5
pyrcc5/*.*
src/*.*~
src/*.*-*
src/*.*+*
src/__pycache/
src/__pycache__/*
-52
View File
@@ -1,52 +0,0 @@
{
"menuFlags":{
"hasFile": 0,
"loadInitFile": 0,
"hasDaq": 0,
"hasH5": 0,
"hasEpics": 0
},
"hdf": {
"destination" : "./"
},
"SLS" : ["Injector", "Booster", "Ring"],
"SLS2" : {"test": ["Injector", "Booster", "Ring"]},
"QTabViking":{
"Vikings": {
"radiobutton" : {"data":{ "widget": "QRadioButton", "text" : "Radio Gaga", "value": ["This", "That", "The Other"], "startIdx": 1}},
"readonly" : {"data":{ "widget": "QLineRead", "text" :"ReadOnly:", "value" : "input"}},
"npts" : {"data":{ "widget": "QLineEdit", "text" :"No Events:", "value" : 22, "min": 0.01, "max": 0.99}},
"nspins" : {"data":{ "widget": "QSpinBox", "text" : "No. Points:", "min": 1, "max": 10, "step": 1,"value": 1 }},
"ndspins" : {"data":{ "widget": "QDoubleSpinBox", "text" : "No. Points:", "min": 1, "max": 10.0, "step": 0.1,"value": 1.5 }},
"facility": {"data" : {"widget": "QComboBox", "text" : "Facility:", "link": ["SLS2", "test"],"layout" : "Horizontal"}},
"checkbox" : {"data":{ "widget": "QCheckBox", "orientation" : "Qt.LeftToRight", "text" : "Checkbox", "value" : 1}}
},
"Saxons": {
"nevents" : {"data":{ "widget": "QLineEdit", "text" :"No. Iterations:", "value" : 33}},
"niter" : {"data":{ "widget": "QSpinBox", "text" : "Step size:", "min": 1, "max": 10, "step": 1,"value": 1 }}
}
},
"Parameters":{
"maxmin" : {"flag" : 1, "data":{ "widget": "QRadioButton", "text" : "", "value": ["Maximize", "Minimize" ]}},
"facility": {"flag": 0, "data" : {"widget": "QComboBox", "text" : "Facility:",
"link": ["SLS"],"layout" : "Horizontal"}},
"N_events" : {"flag" : 1, "data":{ "widget": "QLineEdit", "text" : "No. events: ", "value": 2 }},
"N_points" : {"flag" : 1, "data":{ "widget": "QSpinBox", "text" : "No. points:", "min": 1, "max": 10, "step": 1,"value": 1 }},
"drawLine" : {"flag" : 0, "data":{ "widget": "QHLine", "text" : "None", "value" : "None"}},
"checkbox" : {"flag" : 1, "data":{ "widget": "QCheckBox", "orientation" : "Qt.LeftToRight",
"text" : " Checkbox", "value" : 1}},
"drawLine2" : {"flag" : 0, "data":{ "widget": "QHLine", "text" : "None", "value" : "None"}},
"qtabdata" : {"flag" : 1, "data":{ "widget": "QTabWidget", "text" : "Measurement: ", "value" : 0, "link" : "QTabViking", "color" : ["#0080aa", "#0000ff"]}}
},
"Expert":{
"debug": {"flag" : 1, "data":{ "widget": "None", "text" : "Debug", "value" : 0}},
"simulation": {"flag" : 1, "data":{ "widget": "None", "text" : "Simulation", "value" : 1}}
},
"GUI": {
"resultsTabTitle" : "Results",
"subResultsTabTitle" : ["Plots", "Plot-2"],
"resultsSeq" : [10, 1]
}
}
-67
View File
@@ -1,67 +0,0 @@
{
"menuFlags":{
"hasFile": 0,
"loadInitFile": 0,
"hasDaq": 0,
"hasH5": 0,
"hasEpics": 0
},
"hdf": {
"destination" : "./"
},
"IP2":{
"standby": [-10.0025, 10.0025, 10.0025, 0.05, 0.05, 40.000, 0.05, 0.005,
10.0025, -10.0025, 10.0025, 0.1392, -25.006, 0.05, 0.05, 2.175,
0.05, 10.0025, -10.0025, 0.05, 0.05, 0.05, 0.05, -10.0025,
-10.0025]
},
"IW2":{
"standby": [-5.001, 5.001, 0.05, -5.001, 5.001, 5.001, -5.001, 0.05,
0.05, 0.05, 5.001, -5.001, -5.001, 5.001, 0.05, 0.05,
0.05, -5.001, 10.0025, 27.605, -10.0025, 21.899, 0.05, -6,
6, 6, 0.05, 0.05, 34.152, 0.5, -0.5, 0.05,
40.591, 62.5],
"ref" : [-79.00, 87.58, 496, -89.3, 80.5, 82.9, -83.77, -1.81,
0.40, 1.39, 77.80, -41.43, -62.33, 63.97, -0.33, -0.25,
0.25, -52.27, 83.98, 520.41, -105.96, 433.61, 0.23, -54.25,
50.51, 23.46, -40.14, -4.66, 622.91, 2.00, -7.17, -0.73,
806.99, 1147.69]
},
"PK1":{
"standby": [56.791, 0.05, -2.0005, 2.0005, 0.05, 0.05, 44.9525, -2.0005,
-2.0005, 0.05, 25.006, -25.006, 0.05, 0.05, 64.066]
},
"PK2":{
"standby": [0.05, -25.006, 25.006, 17.4, 10.0025, -2.0005, 0.05, 0.05,
25.85, -10.0025, 10.0025, 0.05, 0.05, -25.006, 25.006, -25.006,
0.05, 0.05, 0.05, 0.05, 25.006, -25.006, 25.006, -25.006,
0.05, 25.006, 25.1877, 0.05]
},
"SINQ":{
"standby": [-25.006, 0.05, 25.006, 10.0025, -12.608, 0.05, 10.98,
15.6045, -18.3075, 0.05, 20.462, 0.05, 21.9925, -19.005,
46.5345, 18.01, -21.3675]
},
"UCN":{
"standby": [9.404, 25.006, -25.006, 0.05, 0.05, 0.05, 0.05, 25.006,
-25.006, 20.625, 10.0025, -10.0025, 0.05, 20.625, 25.006
]
},
"Parameters":{
"drawLine" : {"flag" : 0, "data":{ "widget": "QHLine", "text" : "None", "value" : "None"}}
},
"Expert":{
"debug": {"flag" : 1, "data":{ "widget": "None", "text" : "Debug", "value" : 0}},
"simulation": {"flag" : 1, "data":{ "widget": "None", "text" : "Dry run", "value" : 1}}
},
"GUI": {
"resultsTabTitle" : "Results",
"subResultsTabTitle" : [],
"resultsSeq" : []
}
}
-213
View File
@@ -1,213 +0,0 @@
import inspect
import logging
import os
import platform
import random
import sys
import time
from qtpy import QtCore, QtGui
from qtpy.QtGui import QColor, QFont, QIcon
from qtpy.QtCore import __version__ as QT_VERSION_STR
from qtpy.QtCore import (
PYQT_VERSION_STR, QFile, QIODevice, Qt, QThread, Signal, Slot)
from qtpy.QtWidgets import (
QApplication, QDockWidget, QGridLayout, QGroupBox, QHBoxLayout, QLabel,
QMainWindow, QMessageBox, QProgressBar, QPushButton, QSizePolicy,
QSpacerItem, QTabWidget, QTableWidget, QTableWidgetItem, QVBoxLayout,
QWidget)
from apps4ops.bdbase.base import BaseWindow
from apps4ops.bdbase.enumkind import MsgSeverity, UserMode, Facility
from apps4ops.bdbase.helpbrowser import HelpBrowser
from apps4ops.hipa.sendeloghipa import QSendToELOG
from apps4ops.hipa.enumkind import ElogHIPA
from src.gui import AppGui
from pyrcc5 import hush_resources
_pymodule = os.path.basename(__file__)
_appname, _appext = _pymodule.split(".")
_appversion = "1.0.0"
_title = """HIPA Power Usage and Saving Hierarchy, HUSH!"""
def _line():
"""Macro to return the current line number.
The current line number within the file is used when
reporting messages to the message logging window.
Returns:
int: Current line number.
"""
return inspect.currentframe().f_back.f_lineno
class StartMain(BaseWindow):
trigger_log_message = Signal(str, str, int, str, dict)
def __init__(self, parent=None):
super(StartMain, self).__init__(
parent=parent, pymodule=_pymodule, appversion=_appversion,
title=_title, user_mode=UserMode.OPERATION, facility=Facility.HIPA,
has_optics=False, has_procedure=False)
self.appname = _appname
self.gui = AppGui(self)
@Slot()
def send_to_elog(self):
@Slot()
def save_fig_thread_finished():
time.sleep(0.2)
if self.all_data:
QSendToELOG(self, logbook=self.logbook,
projektIdx=self.projekt_idx,
eintragIdx=self.eintrag_idx,
systemIdx=self.system_idx,
statusIdx=self.status_idx,
autoIdx=self.auto_idx,
title=self.title,
message=self.message,
attachFile=self.attach_files)
time.sleep(1.0)
return
if not self.verify_send_to_elog():
return
elog = ElogHIPA()
self.projekt_idx = elog.projekt.OPTICS
self.system_idx = elog.system.BEAMDYNAMICS
self.eintrag_idx = elog.eintrag.INFO
self.auto_idx = elog.auto.NO
self.status_idx = elog.status.NONE
self.attach_files = []
_simulation = self.input_parameters['simulation']
if self.all_data:
if self.all_data['Input data'] is not None:
try:
_simulation = self.all_data['Input data']['simulation']
except KeyError:
_simulation = self.input_parameters['simulation']
pass
self.logbook = "Sandkasten" if _simulation else None
self.title = _title
if not self.all_data:
QSendToELOG(self, logbook=self.logbook,
projektIdx=self.projekt_idx,
eintragIdx=self.eintrag_idx,
systemIdx=self.system_idx,
statusIdx=self.status_idx,
autoIdx=self.auto_idx,
title=self.title,
attachFile=self.attach_files)
return
message = ""
_folder_name = self.elog_dest
if not os.path.exists(_folder_name):
os.makedirs(_folder_name)
time_in_seconds = self.all_data['Ambient data']['Time in seconds']
if self.all_data['Processed data']['Reanalysis time']:
reanalysis_time = self.all_data['Processed data'][
'Reanalysis time in seconds']
else:
reanalysis_time = None
self.message = message
print(message, flush=True)
self.folder_name = _folder_name
save_fig_thread = self.SaveFigureThread(
self, self.folder_name, time_in_seconds, reanalysis_time)
save_fig_thread.finished.connect(save_fig_thread_finished)
save_fig_thread.start()
time.sleep(0.05)
@Slot()
def closeEvent(self, event):
if not self.verify_close_event():
event.ignore()
return
BaseWindow.closeEvent(self, event)
@Slot()
def show_about(self):
""" To overide by application
"""
QApplication.processEvents()
QMessageBox.about(
self, "About",
"""<b>{0}</b> v {1}
<p>Copyright &copy; Paul Scherrer Institut (PSI).
All rights reserved.</p>
<p>Author: J. Chrin, Spring 2023 </p>
<p>(EPICS db adapted from A. Kovach, 2016) <p>
<p>IOC Administrator: H. Lutz </p>
<p>1st Responsible: A. Barchetti, Tel. 4779
or 3301 (Control Room) </p>
<p>Initiates energy saving procedures and records power saved</p>
<p>Python {2} - Qt {3} - PyQt {4} <br>
cafe {5} - epics {6} on {7}""".format(
_pymodule, _appversion, platform.python_version(),
QT_VERSION_STR, PYQT_VERSION_STR,
self.cafe.CAFE_version(), self.cafe.EPICS_version(),
platform.system()))
QApplication.processEvents()
@Slot()
def show_help(self):
""" Invoke help pages from hush_resources
"""
index_html ="index.html" #self.appname + "/index.html"
help_base = ":" # + self.appname
help_page = HelpBrowser(help_base, index_html, self)
help_page.show()
#########################################################################
if __name__ == "__main__":
app = QApplication(sys.argv)
splash = BaseWindow.initialize_application(
app, appname=_appname, delay=20, facility=Facility.HIPA)
myapp = StartMain()
myapp.show()
if splash is not None:
splash.finish(myapp)
app.exec_()
-98
View File
@@ -1,98 +0,0 @@
#!/bin/bash
cd /afs/psi.ch/project/pyqtacc/apps4ops/examples/hush/1.0.0
# For use if script is sourced rather than executed
appNameDefault="hush.sh"
module unload gcc
module load gcc/7.3.0
if [ -z "$PS1" ] # no prompt?
### if [ -v PS1 ] # On Bash 4.2+ ...
then
# non-interactive
echo "Non-interactive script"
else
# interactive
echo "Interactive/sourced script"
fi
# Select Python Version here. Currently one of 3.5, 3.7
PYTHON_VERSION=3.7
if [ "$1" ]; then
if [ "$1" == "3.5" -o "$1" == "35" ]; then
echo "Using default version $PYTHON_VERSION"
elif [ "$1" == "3.7" -o "$1" == "37" ]; then
PYTHON_VERSION=3.7
else
echo "Requested Python version is not supported"
echo "Using default version $PYTHON_VERSION"
fi
fi
echo "PYTHON_VERSION $PYTHON_VERSION"
_EPICS_HOST_ARCH=${EPICS_HOST_ARCH}
. /opt/gfa/python $PYTHON_VERSION
#/sf/bd/applications/OnlineModel/current/PythonModule:/sf/bd/applications/OnlineModel/current
#/sf/bd/applications/OnlineModel/default/scripts/VA:
#C_EXT version for Py 3.7:
export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.18.0/lib/${_EPICS_HOST_ARCH}:/afs/psi.ch/project/pyqtacc:/afs/psi.ch/intranet/SLS/Controls/BD/pyqtacc/v1.5.2
echo $PYTHONPATH
STDOUT_DIR="/tmp"
#Set to 0 if you do not wish std::out to write to logger
STDOUT_FLAG=1
if [ "$#" -gt "0" ]; then
appName=$0
if [ "$appName" == "-bash" ]; then
appName=$appNameDefault
fi
else
appName=$appNameDefault
fi
#echo "$appName $@ $#"
baseName="${appName##*/}"
name=$(echo "$baseName" | cut -f 1 -d '.')
nameLog=${name}-$USER
echo "Application: $name"
echo "nameLog: $nameLog"
#Configuration files can be overwritten
#python ${name}.py -s="/sf/bd/deps/pyqtacc/common/config/style.json" -f="/sf/bd/deps/pyqtacc/v1.0.0/pyqtacc/qrc_resources/facility/sf/config/base.json" -q="/sf/bd/deps/pyqtacc/common/config/acc.qss" &
if [ "${STDOUT_FLAG}" -gt "0" ] ; then
#if changing the std::out destination, remember to also change it in your json config file (for reading)
if test -f "$STDOUT_DIR/${nameLog}.log---"; then
rm -f $STDOUT_DIR/${nameLog}.log---
fi
if test -f "$STDOUT_DIR/${nameLog}.log--"; then
cp $STDOUT_DIR/${nameLog}.log-- $STDOUT_DIR/${nameLog}.log---
rm -f $STDOUT_DIR/${nameLog}.log--
fi
if test -f "$STDOUT_DIR/${nameLog}.log-"; then
cp $STDOUT_DIR/${nameLog}.log- $STDOUT_DIR/${nameLog}.log--
rm -f $STDOUT_DIR/${nameLog}.log-
fi
if test -f "$STDOUT_DIR/${nameLog}.log"; then
cp $STDOUT_DIR/${nameLog}.log $STDOUT_DIR/${nameLog}.log-
rm -f $STDOUT_DIR/${nameLog}.log
fi
python ${name}.py -u ${name}.json >> $STDOUT_DIR/${nameLog}.log 2>&1 &
chmod 777 $STDOUT_DIR/${nameLog}.log
else
#Run instead without std::out
python ${name}.py -u ${name}.json &
fi
-542
View File
@@ -1,542 +0,0 @@
import inspect
import os
import platform
import random
import sys
import time
from qtpy import QtCore, QtGui
from qtpy.QtGui import QColor, QFont, QIcon
from qtpy.QtCore import __version__ as QT_VERSION_STR
from qtpy.QtCore import (
PYQT_VERSION_STR, QFile, QIODevice, Qt, QThread, Signal, Slot)
from qtpy.QtWidgets import (
QApplication, QDockWidget, QFrame, QGridLayout, QGroupBox, QHBoxLayout,
QLabel, QMainWindow, QMessageBox, QProgressBar, QPushButton, QSizePolicy,
QSpacerItem, QStackedWidget, QTabBar, QTabWidget, QTableWidget,
QTableWidgetItem, QVBoxLayout, QWidget)
from apps4ops.bdbase.base import BaseWindow
from apps4ops.bdbase.enumkind import MsgSeverity, UserMode, Facility
from caqtwidgets.pvwidgets import CAQTableWidget
_pymodule = os.path.basename(__file__)
def _line():
"""Macro to return the current line number.688
The current line number within the file is used when
reporting messages to the message logging window.
Returns:
int: Current line number.
"""
return inspect.currentframe().f_back.f_lineno
class AppGui(QWidget):
def __init__(self, parent):
super(AppGui, self).__init__()
self.parent = parent
self.cafe = self.parent.cafe
self.cyca = self.parent.cyca
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(260)
self.gui_frame.operator_parameters_group.setFixedWidth(260)
#self.gui_frame.operator_parameters_group.setFixedHeight(260)
self.gui_frame.measurement_tab_wgt.setMinimumWidth(280)
self.gui_frame.operator_wgt.setFixedHeight(240)
self.gui_frame.expert_wgt.setFixedHeight(240)
self.gui_frame.central_tab_widget.tabBar().setTabText(0, "Control")
self.gui_frame.central_tab_widget.tabBar().setTabText(1, "Savings")
self.expert_labels = self.parent.expert_labels
self.settings = self.parent.settings
self.obj_to_upper = True if random.randint(1, 10) > 3 else False
self.table_sol_dict = {}
#wgt = self.ca_table_sector_widget(sector="IP2")
wgt = self.group_sector_qtabwidget()
self.gui_frame.measurement_layout.addWidget(
wgt, 0, 1, 3, 3, alignment=Qt.AlignTop)
qf = QFrame()
qf.setFixedHeight(600)
self.gui_frame.measurement_layout.addWidget(
qf, 1, 0, 1, 1, alignment=Qt.AlignTop)
self.sectorI_dict = {}
self.sectorI_dict['IP2'] = 0
self.sectorI_dict['IW2'] = 0
self.sectorI_dict['PK1'] = 0
self.sectorI_dict['PK2'] = 0
self.sectorI_dict['SINQ'] = 0
self.sectorI_dict['UCN'] = 0
self.I_min = 10.10
ucn_line = ["PK1", "PK2"]
sinq_line = ["PK1", "PK2"]
pk1_line = ["IW2"]
pk2_line = ["IW2"]
def enable_disable_end(sector, sector_line, value):
self.sectorI_dict[sector] = value
for sector in sector_line:
if self.sectorI_dict['UCN'] > self.I_min or self.sectorI_dict[
'SINQ'] > self.I_min:
if self.table_sol_dict[
sector].standby_value_button.isEnabled():
self.table_sol_dict[
sector].standby_value_button.setEnabled(False)
else:
if not self.table_sol_dict[
sector].standby_value_button.isEnabled():
self.table_sol_dict[
sector].standby_value_button.setEnabled(True)
def enable_disable_pk(sector, sector_line, value):
self.sectorI_dict[sector] = value
for sector in sector_line:
if self.sectorI_dict['PK1'] > self.I_min or self.sectorI_dict[
'PK2'] > self.I_min:
if self.table_sol_dict[
sector].standby_value_button.isEnabled():
self.table_sol_dict[
sector].standby_value_button.setEnabled(False)
else:
if not self.table_sol_dict[
sector].standby_value_button.isEnabled():
self.table_sol_dict[
sector].standby_value_button.setEnabled(True)
def receive_ucn_update(value, status, alarm_severity):
enable_disable_end('UCN', ucn_line, value)
def receive_sinq_update(value, status, alarm_severity):
enable_disable_end('SINQ', sinq_line, value)
def receive_pk1_update(value, status, alarm_severity):
enable_disable_pk('PK1', pk1_line, value)
def receive_pk2_update(value, status, alarm_severity):
enable_disable_pk('PK2', pk2_line, value)
self.gui_header.beam_current_wgt_dict[
"INJ2"].trigger_monitor_float.connect(receive_ucn_update)
self.gui_header.beam_current_wgt_dict[
"INJ2"].trigger_monitor_float.connect(receive_sinq_update)
self.gui_header.beam_current_wgt_dict[
"INJ2"].trigger_monitor_float.connect(receive_pk1_update)
self.gui_header.beam_current_wgt_dict[
"INJ2"].trigger_monitor_float.connect(receive_pk2_update)
#self.cafe.monitor("MWC2:IST:2", cb)
#print(dir(self.gui_header.header_wgt.layout().widget()), flush=True)
def group_sector_qtabwidget(self):
idx_inj = self.settings.data["header"].index("INJ2")
idx = self.settings.data["header"].index("IP2")
#open all PVS
pv = []
for sector in self.settings.data["header"][idx_inj:]:
device_list = self.settings.data[sector]["device"]
attribute_list = self.settings.data[sector]["attribute"]
for att in attribute_list:
for dev in device_list:
pv.append(dev + ":" + att)
self.cafe.openPrepare()
self.cafe.open(pv)
self.cafe.openNowAndWait(0.5)
sector_wgt_dict = {}
sector_wgt_dict["INJ2"] = self.ca_table_rf_widget(sector="INJ2")
for sector in self.settings.data["header"][idx:]:
sector_wgt_dict[sector] = self.ca_table_sector_widget(sector=sector)
sector_tab_widget = QTabWidget()
sector_tab_widget.setFont(self.font_gui)
sector_tab_widget.setStyleSheet("QTabBar {font-size: 12pt;}")
sector_tab_widget.tabBar().setShape(QTabBar.TriangularNorth)
for i, sector in enumerate(self.settings.data["header"][idx:]):
#if sector == "INJ2":
# _title = "RF"
#else:
# _title = sector
sector_tab_widget.addTab(sector_wgt_dict[sector], sector)
color = self.settings.data[sector]["color"]
sector_tab_widget.tabBar().setTabTextColor(i, QColor(color))
sector_tab_widget.addTab(sector_wgt_dict["INJ2"], "RF")
color = self.settings.data["INJ2"]["color"]
sector_tab_widget.tabBar().setTabTextColor(
len(self.settings.data["header"][idx:]), QColor(color))
return sector_tab_widget
def ca_table_rf_widget(self, sector: str="", color: str="MACHINE"):
device_list = self.settings.data[sector]["device"]
attribute_list = self.settings.data[sector]["attribute"]
pv_dict = {}
for att in attribute_list:
pv_dict[att] = [] #[None] * len(device_list)
for dev in device_list:
pv_dict[att].append(dev + ":" + att)
table_pwr = [None] * 2
table_pwr[0] = CAQTableWidget(
self, pv_list=pv_dict['IST:2'][0:4], show_units=False, notify_freq_hz=0,
suffix = "kW",
notify_unison=False, scale_factor=0.001, show_timestamp=False,
init_column=True, pv_list_show=device_list[0:4])
table_pwr[1] = CAQTableWidget(
self, pv_list=pv_dict['IST:2'][4:], show_units=False, notify_freq_hz=0,
suffix = "kW",
notify_unison=False, scale_factor=0.001, show_timestamp=False,
init_column=True, pv_list_show=device_list[4:])
for tab in table_pwr:
header_item = QTableWidgetItem()
header_init = QTableWidgetItem()
header_standby = QTableWidgetItem()
header_value = QTableWidgetItem()
f = header_value.font()
f.setPixelSize(13)
header_item.setFont(f)
header_item.setText('Device')
header_init.setFont(f)
header_init.setText('Init. Value')
header_value.setFont(f)
header_value.setText('IST:2')
tab.setContentsMargins(15, 0, 15, 10)
tab.setHorizontalHeaderItem(0, header_item)
tab.setHorizontalHeaderItem(1, header_init)
tab.setHorizontalHeaderItem(2, header_value)
tab.setColumnWidth(0, 80)
tab.setColumnWidth(1, 88)
tab.setColumnWidth(2, 88)
tab.setFixedWidth(304)
# _table_height = 700
#tab.setFixedHeight(_table_height)
tab.restore_layout.removeWidget(tab.restore_value_button)
tab.restore_value_button.deleteLater()
tab.restore_value_button= None
tab.init_value_button.setToolTip(
("Shows initial, pre-standby values. Update is also " +
"executed automatically before the standby procedure."))
box = QVBoxLayout()
box.addWidget(table_pwr[0])
box.addWidget(table_pwr[1])
box.setAlignment(Qt.AlignTop | Qt.AlignRight)
box.setSpacing(10)
qw = QWidget()
qw.setLayout(box)
obj_name = self.settings.data[sector]["colorObj"]
if self.obj_to_upper:
obj_name = obj_name.upper()
qw.setObjectName(obj_name)
return qw
'''
def check_status_list(self, pv_list, status_list, line):
_mess = ("The following device(s) reported an error " +
"in 'set' operation: ")
_options = {}
stat_previous = self.cyca.ICAFE_NORMAL
for pv, stat in zip(pv_list, status_list):
if stat != self.cyca.ICAFE_NORMAL:
_mess += pv + " " #("Error in 'set' for " + pv + ".")
if stat != stat_previous:
_options['statusCode'] = (
str(stat) + " " +
self.cafe.getStatusCodeAsString(stat))
_options['statusInfo'] = self.cafe.getStatusInfo(stat)
if stat_previous != self.cyca.ICAFE_NORMAL:
self.parent.trigger_log_message.emit(
MsgSeverity.WARN.name, _pymodule, line, _mess,
_options)
_mess = ""
stat_previous = stat
if _mess:
self.parent.trigger_log_message.emit(
MsgSeverity.WARN.name, _pymodule, line, _mess, _options)
'''
def check_status_list(self, pv_list, status_list, line):
_brk = ("------------------------------------------------------" +
"------------------------------------------------------")
self.parent.trigger_log_message.emit(
MsgSeverity.INFO.name, _pymodule, line, _brk, {})
_options = {}
for pv, stat in zip(pv_list, status_list):
if stat != self.cyca.ICAFE_NORMAL:
_mess = ("Error in 'set' for " + pv + " ")
_options['statusCode'] = (
str(stat) + " " +
self.cafe.getStatusCodeAsString(stat))
_options['statusInfo'] = self.cafe.getStatusInfo(stat)
self.parent.trigger_log_message.emit(
MsgSeverity.WARN.name, _pymodule, line, _mess, _options)
self.parent.trigger_log_message.emit(
MsgSeverity.INFO.name, _pymodule, line, _brk, {})
_mess = ("The following devices reported an error " +
"in 'set' operation:")
self.parent.trigger_log_message.emit(
MsgSeverity.INFO.name, _pymodule, line, _mess, {})
def check_status(self, pv, stat, line):
if stat != self.cyca.ICAFE_NORMAL:
_mess = ("Error in 'set' for " + pv + ".")
_options = {}
_options['statusCode'] = (
str(stat) + " " +
self.cafe.getStatusCodeAsString(stat))
_options['statusInfo'] = self.cafe.getStatusInfo(
stat)
self.parent.trigger_log_message.emit(
MsgSeverity.WARN.name, _pymodule, line,
_mess, _options)
class StandByThread(QThread):
def __init__(self, parent, table):
QThread.__init__(self)
self.parent = parent
self.table = table
self.cafe = self.parent.cafe
self.cyca = self.parent.cyca
print("INIT", flush=True)
def __del__(self):
print("WAITING", flush=True)
##self.wait()
def run(self):
print("RUNNING", flush=True)
_handles = self.cafe.getHandles()[0]
_status = self.cafe.attachContext(_handles[0])
status, status_list, pv_list = self.table.set_standby_values()
time.sleep(3)
print("END RUNNING", flush=True)
#return status, status_list, pv_list
def on_sector_standby(self):
target = self.sender()
_table = self.table_sol_dict[target.sector]
_text = _table.standby_value_button.text()
_table.standby_value_button.setEnabled(False)
_table.standby_value_button.setText("Downing..")
QApplication.processEvents()
status, status_list, pv_list = _table.set_standby_values()
if status != self.cyca.ICAFE_NORMAL:
self.check_status_list(pv_list, status_list, _line())
_table.standby_value_button.setText(_text)
_table.standby_value_button.setEnabled(True)
QApplication.processEvents()
pv = target.sector + ":SAVESTATE"
stat = self.cafe.set(pv, 1)
self.check_status(pv, stat, _line())
'''
@Slot()
def standby_thread_finished():
print("FIN", flush=True)
_table.standby_value_button.setText(_text)
_table.standby_value_button.setEnabled(True)
QApplication.processEvents()
standby_thread = self.StandByThread(self, _table)
print("HERE", flush=True)
standby_thread.finished.connect(standby_thread_finished)
print("HERE2", flush=True)
standby_thread.start()
print("HERE3", flush=True)
time.sleep(0.05)
print("HERE4", flush=True)
'''
def on_sector_restore(self):
target = self.sender()
pv = target.sector + ":SAVESTATE"
stat = self.cafe.set(pv, 0)
self.check_status(pv, stat, _line())
def ca_table_sector_widget(self, sector: str="", color: str="MACHINE"):
device_list = self.settings.data[sector]["device"]
attribute_list = self.settings.data[sector]["attribute"]
try:
_standby_values = self.settings.data[sector]["standby"]
except KeyError as ex:
print("On Standby values not given")
pv_dict = {}
for att in attribute_list:
pv_dict[att] = [] #[None] * len(device_list)
for dev in device_list:
pv_dict[att].append(dev + ":" + att)
'''
self.cafe.openPrepare()
self.cafe.open(pv_dict['SOL:2'])
self.cafe.open(pv_dict['IST:2'])
self.cafe.open(pv_dict['PWR:2'])
self.cafe.openNowAndWait(0.5)
'''
_table_height = 700
table_sol = CAQTableWidget(
self, pv_list=pv_dict['SOL:2'], show_units=True, notify_freq_hz=0,
notify_unison=False, scale_factor=1, show_timestamp=False,
init_column=True, pv_list_show=device_list, standby_column=True,
standby_values=_standby_values, standby_delay = 0.09)
table_sol.restore_value_button.setToolTip(
("Restore devices to their pre-standby values"))
table_sol.init_value_button.setToolTip(
("Shows initial, pre-standby values. Update is also " +
"executed automatically before the standby procedure."))
table_sol.standby_value_button.sector = sector
table_sol.standby_value_button.clicked.disconnect()
table_sol.standby_value_button.clicked.connect(self.on_sector_standby)
table_sol.restore_value_button.sector = sector
table_sol.restore_value_button.clicked.connect(self.on_sector_restore)
self.table_sol_dict[sector] = table_sol
table_ist = CAQTableWidget(
self, pv_list=pv_dict['IST:2'], show_units=True, notify_freq_hz=2,
notify_unison=True, scale_factor=1, show_timestamp=False,
init_column=False, pv_list_show=[False])
table_pwr = CAQTableWidget(
self, pv_list=pv_dict['PWR:2'], show_units=False, notify_freq_hz=0,
suffix = "kW",
notify_unison=False, scale_factor=0.001, show_timestamp=False,
init_column=True, init_list=pv_dict['PWR:2'], pv_list_show=[False])
header_item = QTableWidgetItem()
header_init = QTableWidgetItem()
header_standby = QTableWidgetItem()
header_value = QTableWidgetItem()
f = header_value.font()
f.setPixelSize(13)
header_item.setFont(f)
header_item.setText('Device')
header_init.setFont(f)
header_init.setText('Init. Value')
header_standby.setFont(f)
header_standby.setText('Standby')
header_value.setFont(f)
header_value.setText('SOL:2')
table_sol.setContentsMargins(15, 0, 15, 10)
table_sol.setHorizontalHeaderItem(0, header_item)
table_sol.setHorizontalHeaderItem(1, header_init)
table_sol.setHorizontalHeaderItem(2, header_standby)
table_sol.setHorizontalHeaderItem(3, header_value)
table_sol.setColumnWidth(0, 80)
table_sol.setColumnWidth(1, 88)
table_sol.setColumnWidth(2, 80)
table_sol.setColumnWidth(3, 88)
table_sol.setFixedWidth(386)
#table_sol.setFixedHeight(_table_height)
header_value = QTableWidgetItem()
f = header_value.font()
f.setPixelSize(13)
header_value.setFont(f)
header_value.setText('IST:2')
table_ist.setContentsMargins(15, 0, 15, 10)
table_ist.setHorizontalHeaderItem(0, header_value)
table_ist.setColumnWidth(0, 90)
table_ist.setFixedWidth(140)
#table_ist .setFixedHeight(_table_height)
header_init = QTableWidgetItem()
f = header_init.font()
header_init.setFont(f)
header_init.setText('Init. Value')
header_value = QTableWidgetItem()
f = header_value.font()
f.setPixelSize(13)
header_value.setFont(f)
header_value.setText('PWR:2')
table_pwr.setContentsMargins(15, 0, 15, 10)
table_pwr.setHorizontalHeaderItem(0, header_init)
table_pwr.setHorizontalHeaderItem(1, header_value)
table_pwr.setColumnWidth(0, 88)
table_pwr.setColumnWidth(1, 88)
table_pwr.setFixedWidth(226)
#table_pwr.setFixedHeight(_table_height)
table_pwr.restore_layout.removeWidget(table_pwr.restore_value_button)
table_pwr.restore_value_button.deleteLater()
table_pwr.restore_value_button= None
hbox = QHBoxLayout()
hbox.addWidget(table_sol)
hbox.addWidget(table_ist)
hbox.addWidget(table_pwr)
#hbox.setContentsMargins(40, 40, 40, 40)
hbox.setSpacing(10)
hbox.setAlignment(Qt.AlignTop)
qw = QWidget()
qw.setLayout(hbox)
#qw.setStyleSheet("background-color: {0};".format(
# self.settings.data[sector]["qlingrad"]))
obj_name = self.settings.data[sector]["colorObj"]
if self.obj_to_upper:
obj_name = obj_name.upper()
qw.setObjectName(obj_name)
return qw
-596
View File
@@ -1,596 +0,0 @@
import inspect
import os
import platform
import random
import sys
import time
from datetime import timedelta
from qtpy import QtCore, QtGui
from qtpy.QtGui import QColor, QFont, QIcon
from qtpy.QtCore import __version__ as QT_VERSION_STR
from qtpy.QtCore import (
PYQT_VERSION_STR, QDate, QDateTime, QEventLoop, Qt, Signal, Slot)
from qtpy.QtWidgets import (
QApplication, QDockWidget, QFrame, QGridLayout, QGroupBox, QHBoxLayout,
QLabel, QMainWindow, QMessageBox, QProgressBar, QPushButton, QSizePolicy,
QSpacerItem, QStackedWidget, QTabBar, QTabWidget, QTableWidget,
QTableWidgetItem, QVBoxLayout, QWidget)
from apps4ops.bdbase.base import BaseWindow
from apps4ops.bdbase.enumkind import MsgSeverity, UserMode, Facility
from caqtwidgets.pvwidgets import CAQLabel, CAQLineEdit, CAQTableWidget
_pymodule = os.path.basename(__file__)
def _line():
"""Macro to return the current line number.688
The current line number within the file is used when
reporting messages to the message logging window.
Returns:
int: Current line number.
"""
return inspect.currentframe().f_back.f_lineno
class AppGui(QWidget):
def __init__(self, parent):
super(AppGui, self).__init__()
self.parent = parent
self.cafe = self.parent.cafe
self.cyca = self.parent.cyca
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(260)
self.gui_frame.operator_parameters_group.setFixedWidth(260)
#self.gui_frame.operator_parameters_group.setFixedHeight(260)
self.gui_frame.measurement_tab_wgt.setMinimumWidth(280)
self.gui_frame.operator_wgt.setFixedHeight(240)
self.gui_frame.expert_wgt.setFixedHeight(240)
self.gui_frame.central_tab_widget.tabBar().setTabText(0, "Control")
self.gui_frame.central_tab_widget.tabBar().setTabText(1, "Savings")
self.expert_labels = self.parent.expert_labels
self.settings = self.parent.settings
self.obj_to_upper = True if random.randint(1, 10) > 3 else False
self.table_sol_dict = {}
self.table_pwr_dict = {}
#wgt = self.ca_table_sector_widget(sector="IP2")
wgt = self.group_sector_qtabwidget()
self.gui_frame.measurement_layout.addWidget(
wgt, 0, 1, 3, 3, alignment=Qt.AlignTop)
status_wgt = self.group_sector_status()
self.gui_frame.measurement_layout.addWidget(
status_wgt, 1, 0, 2, 1, alignment=Qt.AlignTop)
qf = QFrame()
qf.setFixedHeight(600)
self.gui_frame.measurement_layout.addWidget(
qf, 2, 0, 1, 1, alignment=Qt.AlignTop)
self.sectorI_dict = {}
self.sectorI_dict['IP2'] = 0
self.sectorI_dict['IW2'] = 0
self.sectorI_dict['PK1'] = 0
self.sectorI_dict['PK2'] = 0
self.sectorI_dict['SINQ'] = 0
self.sectorI_dict['UCN'] = 0
self.I_min = 0.017
ucn_line = ["PK1", "PK2"]
sinq_line = ["PK1", "PK2"]
pk1_line = ["IW2"]
pk2_line = ["IW2"]
def enable_disable_end(sector, sector_line, value):
self.sectorI_dict[sector] = value
for sector in sector_line:
if self.sectorI_dict['UCN'] > self.I_min or self.sectorI_dict[
'SINQ'] > self.I_min:
if self.table_sol_dict[
sector].standby_value_button.isEnabled():
self.table_sol_dict[
sector].standby_value_button.setEnabled(False)
else:
if not self.table_sol_dict[
sector].standby_value_button.isEnabled():
self.table_sol_dict[
sector].standby_value_button.setEnabled(True)
def enable_disable_pk(sector, sector_line, value):
self.sectorI_dict[sector] = value
for sector in sector_line:
if self.sectorI_dict['PK1'] > self.I_min or self.sectorI_dict[
'PK2'] > self.I_min:
if self.table_sol_dict[
sector].standby_value_button.isEnabled():
self.table_sol_dict[
sector].standby_value_button.setEnabled(False)
else:
if not self.table_sol_dict[
sector].standby_value_button.isEnabled():
self.table_sol_dict[
sector].standby_value_button.setEnabled(True)
def receive_ucn_update(value, status, alarm_severity):
enable_disable_end('UCN', ucn_line, value)
def receive_sinq_update(value, status, alarm_severity):
enable_disable_end('SINQ', sinq_line, value)
def receive_pk1_update(value, status, alarm_severity):
enable_disable_pk('PK1', pk1_line, value)
def receive_pk2_update(value, status, alarm_severity):
enable_disable_pk('PK2', pk2_line, value)
self.gui_header.beam_current_wgt_dict[
"INJ2"].trigger_monitor_float.connect(receive_ucn_update)
self.gui_header.beam_current_wgt_dict[
"INJ2"].trigger_monitor_float.connect(receive_sinq_update)
self.gui_header.beam_current_wgt_dict[
"INJ2"].trigger_monitor_float.connect(receive_pk1_update)
self.gui_header.beam_current_wgt_dict[
"INJ2"].trigger_monitor_float.connect(receive_pk2_update)
#self.cafe.monitor("MWC2:IST:2", cb)
#print(dir(self.gui_header.header_wgt.layout().widget()), flush=True)
def group_sector_status(self):
vbox = QVBoxLayout()
#Connect all channels
#Heading
idx = self.settings.data["header"].index("IP2")
#Sector
hbox =QHBoxLayout()
hbox.addWidget(QLabel(" "))
hbox.addWidget(QLabel("Power"))
hbox.addWidget(QLabel("Initial"))
qhead = QWidget()
qhead.setLayout(hbox)
vbox.addWidget(qhead)
for i, sector in enumerate(self.settings.data["header"][idx:]):
vbox.addWidget(self.sector_status(sector))
qw = QWidget()
qw.setLayout(vbox)
return qw
def sector_status(self, sector):
'''Create each sector line for inclusion into group
'''
device = "SEC-" + sector
#Qlabel
qsector = QLabel(sector+":")
#Savings
pv_pwr_tot = device + ":TOTPWR"
pv_pwr_last = device + ":LASTPWR"
pv_pwr_saved = device + ":SAVEPWR"
#print("device", device, flush=True)
now = QDateTime.currentDateTime()
xdate = QDate(now.date().year(), 1, 15)
xstart = QDateTime(xdate)
print("delta t ", xstart.secsTo(now))
print("{}".format(str(timedelta(seconds=xstart.secsTo(now)))))
qpnow = CAQLabel(self, pv_name=pv_pwr_tot, show_units=True)
qpinit = CAQLabel(self, pv_name=pv_pwr_last, show_units=True)
#qpsave = QCALabel(pv=pv_pwr_tot, show_units=True)
#qpsum = QCALabel(pv=pv_pwr_tot, show_units=True)
#qtdis = QBasicTimer()
hbox =QHBoxLayout()
hbox.addWidget(qsector)
hbox.addWidget(qpnow)
hbox.addWidget(qpinit)
qw = QWidget()
qw.setLayout(hbox)
return qw
def group_sector_qtabwidget(self):
idx_inj = self.settings.data["header"].index("INJ2")
idx = self.settings.data["header"].index("IP2")
#open all PVS
pv = []
for sector in self.settings.data["header"][idx_inj:]:
device_list = self.settings.data[sector]["device"]
attribute_list = self.settings.data[sector]["attribute"]
for att in attribute_list:
for dev in device_list:
pv.append(dev + ":" + att)
self.cafe.openPrepare()
self.cafe.open(pv)
self.cafe.openNowAndWait(0.5)
self.cafe.supplementHandles()
sector_wgt_dict = {}
sector_wgt_dict["INJ2"] = self.ca_table_rf_widget(sector="INJ2")
for sector in self.settings.data["header"][idx:]:
sector_wgt_dict[sector] = self.ca_table_sector_widget(sector=sector)
sector_tab_widget = QTabWidget()
sector_tab_widget.setFont(self.font_gui)
sector_tab_widget.setStyleSheet("QTabBar {font-size: 12pt;}")
sector_tab_widget.tabBar().setShape(QTabBar.TriangularNorth)
for i, sector in enumerate(self.settings.data["header"][idx:]):
#if sector == "INJ2":
# _title = "RF"
#else:
# _title = sector
sector_tab_widget.addTab(sector_wgt_dict[sector], sector)
color = self.settings.data[sector]["color"]
sector_tab_widget.tabBar().setTabTextColor(i, QColor(color))
sector_tab_widget.addTab(sector_wgt_dict["INJ2"], "RF")
color = self.settings.data["INJ2"]["color"]
sector_tab_widget.tabBar().setTabTextColor(
len(self.settings.data["header"][idx:]), QColor(color))
return sector_tab_widget
def ca_table_rf_widget(self, sector: str="", color: str="MACHINE"):
device_list = self.settings.data[sector]["device"]
attribute_list = self.settings.data[sector]["attribute"]
pv_dict = {}
for att in attribute_list:
pv_dict[att] = [] #[None] * len(device_list)
for dev in device_list:
pv_dict[att].append(dev + ":" + att)
table_pwr = [None] * 2
table_pwr[0] = CAQTableWidget(
self, pv_list=pv_dict['IST:2'][0:4], show_units=False, notify_freq_hz=0,
suffix = "kW",
notify_unison=False, scale_factor=0.001, show_timestamp=False,
init_column=True, pv_list_show=device_list[0:4])
table_pwr[1] = CAQTableWidget(
self, pv_list=pv_dict['IST:2'][4:], show_units=False, notify_freq_hz=0,
suffix = "kW",
notify_unison=False, scale_factor=0.001, show_timestamp=False,
init_column=True, pv_list_show=device_list[4:])
for tab in table_pwr:
header_item = QTableWidgetItem()
header_init = QTableWidgetItem()
header_standby = QTableWidgetItem()
header_value = QTableWidgetItem()
f = header_value.font()
f.setPixelSize(13)
header_item.setFont(f)
header_item.setText('Device')
header_init.setFont(f)
header_init.setText('Init. Value')
header_value.setFont(f)
header_value.setText('IST:2')
tab.setContentsMargins(15, 0, 15, 10)
tab.setHorizontalHeaderItem(0, header_item)
tab.setHorizontalHeaderItem(1, header_init)
tab.setHorizontalHeaderItem(2, header_value)
tab.setColumnWidth(0, 80)
tab.setColumnWidth(1, 88)
tab.setColumnWidth(2, 88)
tab.setFixedWidth(304)
# _table_height = 700
#tab.setFixedHeight(_table_height)
tab.restore_layout.removeWidget(tab.restore_value_button)
tab.restore_value_button.deleteLater()
tab.restore_value_button= None
tab.init_value_button.setToolTip(
("Shows initial, pre-standby values. Update is also " +
"executed automatically before the standby procedure."))
box = QVBoxLayout()
box.addWidget(table_pwr[0])
box.addWidget(table_pwr[1])
box.setAlignment(Qt.AlignTop | Qt.AlignRight)
box.setSpacing(10)
qw = QWidget()
qw.setLayout(box)
obj_name = self.settings.data[sector]["colorObj"]
if self.obj_to_upper:
obj_name = obj_name.upper()
qw.setObjectName(obj_name)
return qw
def check_status_list(self, pv_list, status_list, line):
_brk = ("------------------------------------------------------" +
"------------------------------------------------------")
self.parent.trigger_log_message.emit(
MsgSeverity.INFO.name, _pymodule, line, _brk, {})
_options = {}
for pv, stat in zip(pv_list, status_list):
if stat != self.cyca.ICAFE_NORMAL:
_mess = ("Error in 'set' for " + pv + " ")
_options['statusCode'] = (
str(stat) + " " +
self.cafe.getStatusCodeAsString(stat))
_options['statusInfo'] = self.cafe.getStatusInfo(stat)
self.parent.trigger_log_message.emit(
MsgSeverity.WARN.name, _pymodule, line, _mess, _options)
self.parent.trigger_log_message.emit(
MsgSeverity.INFO.name, _pymodule, line, _brk, {})
_mess = ("The following devices reported an error " +
"in 'set' operation:")
self.parent.trigger_log_message.emit(
MsgSeverity.INFO.name, _pymodule, line, _mess, {})
def check_status(self, pv, stat, line):
if stat != self.cyca.ICAFE_NORMAL:
_mess = ("Error in 'set' for " + pv + ".")
_options = {}
_options['statusCode'] = (
str(stat) + " " +
self.cafe.getStatusCodeAsString(stat))
_options['statusInfo'] = self.cafe.getStatusInfo(
stat)
self.parent.trigger_log_message.emit(
MsgSeverity.WARN.name, _pymodule, line,
_mess, _options)
def on_sector_standby(self):
target = self.sender()
sector = target.sector
_table = self.table_sol_dict[sector]
_text = _table.standby_value_button.text()
#_table.standby_value_button
target.setText("Downing..")
target.setEnabled(False)
QApplication.processEvents(QEventLoop.AllEvents, 1.0)
#QApplication.processEvents()
#disenable widgets to avoid circular behaviour since
#updates of SOL also update PWR, and vice-versa
self.table_pwr_dict[sector].init_value_button.setEnabled(False)
_table.init_value_button.click()
time.sleep(0.05)
self.table_pwr_dict[sector].init_value_button.setEnabled(True)
_table.init_value_button.setEnabled(False)
self.table_pwr_dict[sector].init_value_button.click()
time.sleep(0.05)
self.table_sol_dict[sector].init_value_button.setEnabled(True)
QApplication.processEvents(QEventLoop.AllEvents, 1.0)
#Now read LAST POWER:
_pv = "SEC-" + target.sector + ":TOTPWR"
tot_power = self.cafe.get(_pv, dt='float')
print("TOTAL PWER===>", tot_power, _pv, flush=True)
status = self.cafe.getStatus(_pv)
print(self.cafe.getStatusCodeAsString(status))
_pv_target = "SEC-" + target.sector + ":LASTPWR"
status = self.cafe.set(_pv_target, tot_power)
print("TOTAL PWER STATUS SET", _pv_target, status, flush=True)
print(self.cafe.getStatusCodeAsString(status))
status, status_list, pv_list = _table.set_standby_values()
if status != self.cyca.ICAFE_NORMAL:
self.check_status_list(pv_list, status_list, _line())
#time.sleep(1.5)
#QApplication.processEvents()
target.setText(_text)
target.setEnabled(False)
QApplication.processEvents(QEventLoop.AllEvents, 1.0)
#QApplication.flush()
#QApplication.processEvents()
target.setEnabled(True)
###_table.standby_value_button.style().polish(_table.standby_value_button)
##pv = target.sector + ":SAVESTATE"
##stat = self.cafe.set(pv, 1)
##self.check_status(pv, stat, _line())
def on_sector_restore(self):
target = self.sender()
pv = target.sector + ":SAVESTATE"
#stat = self.cafe.set(pv, 0)
#self.check_status(pv, stat, _line())
def ca_table_sector_widget(self, sector: str="", color: str="MACHINE"):
device_list = self.settings.data[sector]["device"]
attribute_list = self.settings.data[sector]["attribute"]
try:
_standby_values = self.settings.data[sector]["standby"]
except KeyError as ex:
print("On Standby values not given")
pv_dict = {}
for att in attribute_list:
pv_dict[att] = [] #[None] * len(device_list)
for dev in device_list:
pv_dict[att].append(dev + ":" + att)
_table_height = 700
table_sol = CAQTableWidget(
self, pv_list=pv_dict['SOL:2'], show_units=True, notify_freq_hz=0,
notify_unison=False, scale_factor=1, show_timestamp=False,
init_column=True, pv_list_show=device_list, standby_column=True,
standby_values=_standby_values, standby_delay = 0.09)
table_sol.restore_value_button.setToolTip(
("Restore devices to their pre-standby values"))
table_sol.init_value_button.setToolTip(
("Shows initial, pre-standby values. Update is also " +
"executed automatically before the standby procedure."))
table_sol.standby_value_button.sector = sector
table_sol.standby_value_button.clicked.disconnect()
table_sol.standby_value_button.clicked.connect(self.on_sector_standby)
table_sol.restore_value_button.sector = sector
table_sol.restore_value_button.clicked.connect(self.on_sector_restore)
self.table_sol_dict[sector] = table_sol
table_ist = CAQTableWidget(
self, pv_list=pv_dict['IST:2'], show_units=True, notify_freq_hz=2,
notify_unison=True, scale_factor=1, show_timestamp=False,
init_column=False, pv_list_show=[False])
table_pwr = CAQTableWidget(
self, pv_list=pv_dict['PWR:2'], show_units=False, notify_freq_hz=0,
suffix = "kW",
notify_unison=False, scale_factor=0.001, show_timestamp=False,
init_column=True, init_list=pv_dict['PWR:2'], pv_list_show=[False])
table_pwr.init_value_button.setToolTip(
("Shows initial, pre-standby values. Update is also " +
"executed automatically before the standby procedure."))
self.table_pwr_dict[sector] = table_pwr
header_item = QTableWidgetItem()
header_init = QTableWidgetItem()
header_standby = QTableWidgetItem()
header_value = QTableWidgetItem()
f = header_value.font()
f.setPixelSize(13)
header_item.setFont(f)
header_item.setText('Device')
header_init.setFont(f)
header_init.setText('Init. Value')
header_standby.setFont(f)
header_standby.setText('Standby')
header_value.setFont(f)
header_value.setText('SOL:2')
table_sol.setContentsMargins(15, 0, 15, 10)
table_sol.setHorizontalHeaderItem(0, header_item)
table_sol.setHorizontalHeaderItem(1, header_init)
table_sol.setHorizontalHeaderItem(2, header_standby)
table_sol.setHorizontalHeaderItem(3, header_value)
table_sol.setColumnWidth(0, 80)
table_sol.setColumnWidth(1, 88)
table_sol.setColumnWidth(2, 80)
table_sol.setColumnWidth(3, 88)
table_sol.setFixedWidth(386)
#table_sol.setFixedHeight(_table_height)
header_value = QTableWidgetItem()
f = header_value.font()
f.setPixelSize(13)
header_value.setFont(f)
header_value.setText('IST:2')
table_ist.setContentsMargins(15, 0, 15, 10)
table_ist.setHorizontalHeaderItem(0, header_value)
table_ist.setColumnWidth(0, 90)
table_ist.setFixedWidth(140)
#table_ist .setFixedHeight(_table_height)
header_init = QTableWidgetItem()
f = header_init.font()
header_init.setFont(f)
header_init.setText('Init. Value')
header_value = QTableWidgetItem()
f = header_value.font()
f.setPixelSize(13)
header_value.setFont(f)
header_value.setText('PWR:2')
table_pwr.setContentsMargins(15, 0, 15, 10)
table_pwr.setHorizontalHeaderItem(0, header_init)
table_pwr.setHorizontalHeaderItem(1, header_value)
table_pwr.setColumnWidth(0, 88)
table_pwr.setColumnWidth(1, 88)
table_pwr.setFixedWidth(226)
#table_pwr.setFixedHeight(_table_height)
#table_pwr.restore_layout.removeWidget(table_pwr.restore_value_button)
#table_pwr.restore_value_button.deleteLater()
#table_pwr.restore_value_button= None
#update_wgt_item = QTableWidgetItem()
#update_wgt = table_pwr.init_value_button
#table_pwr.init_layout.removeWidget(table_pwr.init_value_button)
#table_pwr.setCellWidget(table_pwr.rowCount()-1, 0, update_wgt)
def on_sol_update():
table_sol.init_value_button.setEnabled(False)
table_pwr.init_value_button.click()
time.sleep(0.1)
table_sol.init_value_button.setEnabled(True)
def on_init_update():
table_pwr.init_value_button.setEnabled(False)
table_sol.init_value_button.click()
time.sleep(0.1)
table_pwr.init_value_button.setEnabled(True)
table_sol.init_value_button.sector = sector
table_sol.init_value_button.clicked.connect(on_sol_update)
table_pwr.init_value_button.sector = sector
table_pwr.init_value_button.clicked.connect(on_init_update)
hbox = QHBoxLayout()
hbox.addWidget(table_sol)
hbox.addWidget(table_ist)
hbox.addWidget(table_pwr)
#hbox.setContentsMargins(40, 40, 40, 40)
hbox.setSpacing(10)
hbox.setAlignment(Qt.AlignTop)
qw = QWidget()
qw.setLayout(hbox)
#qw.setStyleSheet("background-color: {0};".format(
# self.settings.data[sector]["qlingrad"]))
obj_name = self.settings.data[sector]["colorObj"]
if self.obj_to_upper:
obj_name = obj_name.upper()
qw.setObjectName(obj_name)
return qw