callbacks for designated magnets added to enable/disable update button
This commit is contained in:
2
hush.sh
2
hush.sh
@@ -58,7 +58,7 @@ _EPICS_HOST_ARCH=${RHREL}-x86_64
|
||||
|
||||
|
||||
#C_EXT version
|
||||
export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0
|
||||
export PYTHONPATH=.:/afs/psi.ch/project/cafe/gitlab/CAFE/cycafe/python3.10-sls2/lib/RHEL8-x86_64:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0
|
||||
|
||||
if [ "${EXTRA_PYTHON_PATH_FLAG}" -gt "0" ] ; then
|
||||
export PYTHONPATH=$PYTHONPATH:/proscan/bd/applications/deps/apps4ops/v1.10.0/common/python${PYTHON_VERSION_DIR}
|
||||
|
||||
472
src/gui.py
472
src/gui.py
@@ -4,6 +4,7 @@ import decimal
|
||||
import getpass
|
||||
import os
|
||||
import random
|
||||
import threading
|
||||
import time
|
||||
from datetime import timedelta
|
||||
|
||||
@@ -64,6 +65,10 @@ class AppGui(QWidget):
|
||||
# self.gui_frame.operator_wgt.setFixedHeight(240)
|
||||
# self.gui_frame.expert_wgt.setFixedHeight(240)
|
||||
|
||||
self.lock = threading.Lock()
|
||||
self.timer = QTimer()
|
||||
self.timer.setSingleShot(True)
|
||||
|
||||
self.assigned_master = self.gui_header.assigned_master
|
||||
|
||||
self.sec_state_list = ["PG1-HUSH:STATE", "PSH-HUSH:STATE",
|
||||
@@ -128,17 +133,28 @@ class AppGui(QWidget):
|
||||
self.cafe.open(self.sec_state_list)
|
||||
self.cafe.openNowAndWait(0.1)
|
||||
|
||||
local_sector_list = ["G1", "SH", "G2", "O2", "PIF", "G3"]
|
||||
# Overload from guiheader.py
|
||||
self.sector_disruptor_dict = {}
|
||||
self.sector_disruptor_dict["G1"] = "Geschlossen"
|
||||
self.sector_disruptor_dict["SH"] = "Geschlossen"
|
||||
self.sector_disruptor_dict["G2"] = "Geschlossen"
|
||||
self.sector_disruptor_dict["O2"] = "Geschlossen"
|
||||
self.sector_disruptor_dict["PIF"] = "Geschlossen"
|
||||
self.sector_disruptor_dict["G3"] = "Geschlossen"
|
||||
self.sector_designated_magnet_standby_dict = {}
|
||||
self.sector_designated_magnet_values_dict = {}
|
||||
|
||||
for sector in local_sector_list:
|
||||
self.sector_disruptor_dict[sector] = "Geschlossen"
|
||||
self.sector_designated_magnet_standby_dict[sector] = {}
|
||||
self.sector_designated_magnet_values_dict[sector] = {}
|
||||
|
||||
for sector in self.sector_designated_magnet_standby_dict:
|
||||
self.sector_designated_magnet_standby_dict[
|
||||
sector] = self.get_standby_dict(sector)
|
||||
self.sector_designated_magnet_values_dict[
|
||||
sector] = self.get_standby_dict(sector)
|
||||
|
||||
print(self.sector_designated_magnet_values_dict, flush=True)
|
||||
print("====================================================================")
|
||||
self.submastership_dict = {
|
||||
"G1": "UNDEF", "G2": "UNDEF", "O2": "UNDEF", "PIF": "UNDEF", "G3": "UNDEF"}
|
||||
"G1": "UNDEF", "G2": "UNDEF", "O2": "UNDEF", "PIF": "UNDEF",
|
||||
"G3": "UNDEF"}
|
||||
|
||||
for key in self.submastership_dict:
|
||||
pvname = self.settings.data[key]["mastershipStatus"]
|
||||
@@ -208,21 +224,31 @@ class AppGui(QWidget):
|
||||
self.gui_frame.simulation_checkbox.stateChanged.connect(
|
||||
self.simulation_update)
|
||||
|
||||
'''
|
||||
for state in self.sec_state_list:
|
||||
for sector in self.settings.data["headerMagnetSector"]:
|
||||
if sector in state:
|
||||
self.cafe.monitor(state, self.receive_sec_state)
|
||||
break
|
||||
'''
|
||||
|
||||
pv_list = []
|
||||
for key in self.sector_disruptor_dict:
|
||||
if key in self.settings.data["headerMagnetSector"]:
|
||||
pv_list.append(self.settings.data[key]["status"])
|
||||
|
||||
self.cafe.openPrepare()
|
||||
self.cafe.open(pv_list)
|
||||
self.cafe.openNowAndWait(2.0)
|
||||
|
||||
for key in self.sector_disruptor_dict:
|
||||
if key in self.settings.data["headerMagnetSector"]:
|
||||
print(key, flush=True)
|
||||
pvd = self.cafe.getPVCache(
|
||||
self.settings.data[key]["status"], dt="str")
|
||||
pvd.show()
|
||||
|
||||
|
||||
|
||||
print(flush=True)
|
||||
|
||||
if "G1" in key:
|
||||
self.gui_header.beam_current_wgt_dict[
|
||||
key].trigger_monitor_str.connect(self.receive_g1_update)
|
||||
@@ -241,9 +267,7 @@ class AppGui(QWidget):
|
||||
elif "G3" in key:
|
||||
self.gui_header.beam_current_wgt_dict[
|
||||
key].trigger_monitor_str.connect(self.receive_g3_update)
|
||||
|
||||
|
||||
|
||||
|
||||
'''
|
||||
if "G1" in key:
|
||||
self.receive_g1_update(
|
||||
@@ -265,28 +289,30 @@ class AppGui(QWidget):
|
||||
pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity)
|
||||
'''
|
||||
|
||||
|
||||
|
||||
def enable_disable_beamline(self, sect, sector_line, value):
|
||||
def is_submaster(local_sector, local_sector_line):
|
||||
print("===========", local_sector, local_sector_line)
|
||||
print("===========", local_sector, local_sector_line, flush=True)
|
||||
if local_sector in self.submastership_dict and \
|
||||
"Controlroom" not in self.assigned_master:
|
||||
print(local_sector,
|
||||
self.submastership_dict[local_sector].upper(),
|
||||
flush=True)
|
||||
if "PIF" in local_sector and ("G3" in local_sector_line or "G3" in self.assigned_master):
|
||||
if "PIF" in local_sector and (
|
||||
"G3" in local_sector_line or \
|
||||
"Gantry 3" in self.assigned_master):
|
||||
print("HERE", flush=True)
|
||||
print(self.submastership_dict, flush=True)
|
||||
print("bool", bool(
|
||||
"MASTERSHIP" in self.submastership_dict[
|
||||
"G3"].upper()), flush=True)
|
||||
"G3"].upper()), flush=True)
|
||||
return bool(
|
||||
"MASTERSHIP" in self.submastership_dict[
|
||||
"G3"].upper())
|
||||
|
||||
else:
|
||||
print("HERE//", flush=True )
|
||||
print("HERE//", flush=True)
|
||||
print(local_sector, local_sector_line, self.assigned_master, flush=True)
|
||||
print("HERE//", flush=True)
|
||||
return bool(
|
||||
"MASTERSHIP" in self.submastership_dict[
|
||||
local_sector].upper())
|
||||
@@ -304,54 +330,85 @@ class AppGui(QWidget):
|
||||
for sector in reversed(sector_line):
|
||||
if "Geschlossen" not in self.sector_disruptor_dict[
|
||||
sector] or not is_submaster(sector, sector_line): #not self.gui_header.is_master():
|
||||
print("sector/value", sector, value)
|
||||
print("isMaster", self.gui_header.is_master())
|
||||
print("master", self.gui_header.mastership)
|
||||
print("assigned master", self.assigned_master)
|
||||
if self.table_sol_dict[
|
||||
sector].standby_value_button.isEnabled():
|
||||
self.table_sol_dict[
|
||||
sector].standby_value_button.setEnabled(False)
|
||||
if not self.gui_header.is_master():
|
||||
print("sector/value", sector, value, flush=True)
|
||||
print("isMaster", self.gui_header.is_master(), flush=True)
|
||||
print("master", self.gui_header.mastership, flush=True)
|
||||
print("assigned master", self.assigned_master, flush=True)
|
||||
with self.lock:
|
||||
if self.table_sol_dict[
|
||||
sector].restore_value_button.isEnabled():
|
||||
sector].standby_value_button.isEnabled():
|
||||
self.table_sol_dict[
|
||||
sector].restore_value_button.setEnabled(False)
|
||||
sector].standby_value_button.setEnabled(False)
|
||||
if not self.gui_header.is_master():
|
||||
if self.table_sol_dict[
|
||||
sector].restore_value_button.isEnabled():
|
||||
self.table_sol_dict[
|
||||
sector].restore_value_button.setEnabled(False)
|
||||
else:
|
||||
print("Geschlossen? sector/value/ismaster", sector, value,
|
||||
self.gui_header.mastership)
|
||||
if not self.table_sol_dict[
|
||||
self.gui_header.mastership, flush=True)
|
||||
with self.lock:
|
||||
if not self.table_sol_dict[
|
||||
sector].standby_value_button.isEnabled():
|
||||
self.table_sol_dict[
|
||||
sector].standby_value_button.setEnabled(True)
|
||||
if not self.table_sol_dict[
|
||||
self.table_sol_dict[
|
||||
sector].standby_value_button.setEnabled(True)
|
||||
if not self.table_sol_dict[
|
||||
sector].restore_value_button.isEnabled():
|
||||
self.table_sol_dict[
|
||||
sector].restore_value_button.setEnabled(True)
|
||||
|
||||
|
||||
self.table_sol_dict[
|
||||
sector].restore_value_button.setEnabled(True)
|
||||
|
||||
'''
|
||||
# For future reference
|
||||
@Slot(str, int, int)
|
||||
def receive_sector_update(self, value, status, alarm_severity):
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
sector = self.sender().sector
|
||||
self.enable_disable_beamline(sector, self.gui_header.sector_line[sector], value)
|
||||
'''
|
||||
@Slot(str, int, int)
|
||||
def receive_sh_update(self, value, status, alarm_severity):
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
self.enable_disable_beamline("SH", self.gui_header.sh_line, value)
|
||||
|
||||
|
||||
@Slot(str, int, int)
|
||||
def receive_g1_update(self, value, status, alarm_severity):
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
self.enable_disable_beamline("G1", self.gui_header.g1_line, value)
|
||||
|
||||
@Slot(str, int, int)
|
||||
def receive_g3_update(self, value, status, alarm_severity):
|
||||
#print("receive_g3_update", self.sender(), flush=True)
|
||||
#print(dir(self.sender()))
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
self.enable_disable_beamline("G3", self.gui_header.g3_line[self.idx:], value)
|
||||
|
||||
@Slot(str, int, int)
|
||||
def receive_o2_update(self, value, status, alarm_severity):
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
self.enable_disable_beamline("O2", self.gui_header.o2_line[self.idx:], value)
|
||||
|
||||
@Slot(str, int, int)
|
||||
def receive_g2_update(self, value, status, alarm_severity):
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
self.enable_disable_beamline("G2", self.gui_header.g2_line[self.idx:], value)
|
||||
|
||||
@Slot(str, int, int)
|
||||
def receive_pif_update(self, value, status, alarm_severity):
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
self.enable_disable_beamline(
|
||||
"PIF", self.gui_header.pif_line[self.idx:], value)
|
||||
|
||||
|
||||
@Slot(str, int, int)
|
||||
def receive_b1b2_update(self, value, status, alarm_severity):
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
#Enable Only on shutdown and if there is no current in the machine
|
||||
comet_I = self.cafe.getCache("MMAC3:STR:2")
|
||||
if comet_I is None:
|
||||
@@ -383,6 +440,9 @@ class AppGui(QWidget):
|
||||
|
||||
@Slot(str, int, int)
|
||||
def receive_master_update(self, value, status, alarm_severity):
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
|
||||
idx = self.sh_idx
|
||||
for key, wgt_val in self.gui_header.master_to_wgt.items():
|
||||
#master = self.gui_header.beam_current_wgt_group[wgt_val]
|
||||
@@ -408,45 +468,15 @@ class AppGui(QWidget):
|
||||
#print("SIMULATION IS TRUE??", self.input_parameters["simulation"])
|
||||
|
||||
|
||||
|
||||
@Slot(int, str, object)
|
||||
def receive_sec_state(self, handle, pv, pvdata):
|
||||
if pvdata.status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
|
||||
pvsplit = pv.split("-")
|
||||
sec = pvsplit[0][1:]
|
||||
|
||||
def already_in_standby():
|
||||
devices = self.settings.data[sec]["iocDevice"]
|
||||
pv_list = []
|
||||
standby_value_list = []
|
||||
|
||||
for magnet in devices:
|
||||
pv_magnet = magnet + ":SOL:2"
|
||||
pv_list.append(pv_magnet)
|
||||
# get standby values
|
||||
idx = self.settings.data[sec]["device"].index(magnet)
|
||||
standby_value = self.settings.data[sec]["standby"][idx]
|
||||
standby_value_list.append(standby_value)
|
||||
|
||||
QApplication.processEvents()
|
||||
value_list, status, status_list = self.cafe.getScalarList(
|
||||
pv_list, cacheFlag=True)
|
||||
|
||||
if status != self.cyca.ICAFE_NORMAL:
|
||||
self.check_status_list(_pymodule, "getScalarListCache",
|
||||
pv_list, status_list, _line())
|
||||
# check standby values
|
||||
in_standby = True
|
||||
for value, standby in zip(value_list, standby_value_list):
|
||||
if abs(value) < abs(standby) * 0.8 or abs(value) > abs(
|
||||
standby) * 1.2:
|
||||
in_standby = False
|
||||
break
|
||||
|
||||
return in_standby
|
||||
|
||||
if pvdata.value[0] == "ON" and not already_in_standby():
|
||||
|
||||
if pvdata.value[0] == "ON" and not self.already_in_standby(sec):
|
||||
|
||||
self.table_sol_dict[sec].init_value_button.setEnabled(True)
|
||||
self.table_pwr_dict[sec].init_value_button.setEnabled(True)
|
||||
@@ -455,7 +485,69 @@ class AppGui(QWidget):
|
||||
self.table_sol_dict[sec].init_value_button.setEnabled(False)
|
||||
self.table_pwr_dict[sec].init_value_button.setEnabled(False)
|
||||
|
||||
|
||||
def get_standby_index_list(self, sec):
|
||||
devices = self.settings.data[sec]["iocDevice"]
|
||||
standby_index_list = []
|
||||
|
||||
for magnet in devices:
|
||||
pv_magnet = magnet + ":SOL:2"
|
||||
# get standby values
|
||||
idx = self.settings.data[sec]["device"].index(magnet)
|
||||
standby_index_list.append(idx)
|
||||
return standby_index_list
|
||||
|
||||
def get_standby_list(self, sec):
|
||||
devices = self.settings.data[sec]["iocDevice"]
|
||||
pv_standby_list = []
|
||||
for magnet in devices:
|
||||
pv_magnet = magnet + ":SOL:2"
|
||||
pv_standby_list.append(pv_magnet)
|
||||
return pv_standby_list
|
||||
|
||||
def get_standby_dict(self, sec):
|
||||
devices = self.settings.data[sec]["iocDevice"]
|
||||
pv_standby_dict = {}
|
||||
|
||||
for magnet in devices:
|
||||
pv_magnet = magnet + ":SOL:2"
|
||||
# get standby values
|
||||
idx = self.settings.data[sec]["device"].index(magnet)
|
||||
standby_value = self.settings.data[sec]["standby"][idx]
|
||||
pv_standby_dict[pv_magnet] = standby_value
|
||||
return pv_standby_dict
|
||||
|
||||
|
||||
def already_in_standby(self, sec):
|
||||
devices = self.settings.data[sec]["iocDevice"]
|
||||
pv_list = []
|
||||
standby_value_list = []
|
||||
|
||||
for magnet in devices:
|
||||
pv_magnet = magnet + ":SOL:2"
|
||||
pv_list.append(pv_magnet)
|
||||
# get standby values
|
||||
idx = self.settings.data[sec]["device"].index(magnet)
|
||||
standby_value = self.settings.data[sec]["standby"][idx]
|
||||
standby_value_list.append(standby_value)
|
||||
|
||||
QApplication.processEvents()
|
||||
value_list, status, status_list = self.cafe.getScalarList(
|
||||
pv_list, cacheFlag=True)
|
||||
|
||||
if status != self.cyca.ICAFE_NORMAL:
|
||||
self.check_status_list(_pymodule, "getScalarListCache",
|
||||
pv_list, status_list, _line())
|
||||
# check standby values
|
||||
in_standby = True
|
||||
for value, standby in zip(value_list, standby_value_list):
|
||||
#if abs(value) < abs(standby) * 0.8 or abs(value) > abs(
|
||||
# standby) * 1.2:
|
||||
if abs(value) > abs(standby) * 1.2:
|
||||
in_standby = False
|
||||
break
|
||||
|
||||
return in_standby
|
||||
|
||||
##Non-embedded defs
|
||||
|
||||
@@ -503,7 +595,26 @@ class AppGui(QWidget):
|
||||
qgrid = QGridLayout()
|
||||
qgb = QGroupBox("Mastership Status")
|
||||
no_beamlines = 0
|
||||
sector_list = self.settings.data["headerMagnetSector"]
|
||||
sector_list_all = self.settings.data["headerMagnetSector"]
|
||||
sector_list = []
|
||||
#Take out B1B2 and SH
|
||||
for sector in sector_list_all:
|
||||
if "mastershipStatus" in self.settings.data[sector]:
|
||||
sector_list.append(sector)
|
||||
|
||||
print(sector_list, flush=True)
|
||||
|
||||
self.submaster_wgt = [None] * len(sector_list)
|
||||
pv_name = [None] * len(sector_list)
|
||||
for i, sector in enumerate(sector_list):
|
||||
print(i, sector, flush=True)
|
||||
pv_name[i] = self.settings.data[sector][pv_id]
|
||||
pv_name[i] = pv_name[i].encode('utf-8')
|
||||
pv_name[i] = pv_name[i].decode('ascii')
|
||||
self.cafe.openPrepare()
|
||||
self.cafe.open(pv_name)
|
||||
self.cafe.openNowAndWait(2.0)
|
||||
|
||||
for i, sector in enumerate(sector_list):
|
||||
if "mastershipStatus" in self.settings.data[sector]:
|
||||
no_beamlines += 1
|
||||
@@ -516,33 +627,40 @@ class AppGui(QWidget):
|
||||
" font-weight: bold;}")
|
||||
qgb_inner.setStyleSheet(sss)
|
||||
|
||||
pv_name = self.settings.data[sector][pv_id]
|
||||
pv_name = pv_name.encode('utf-8')
|
||||
pv_name = pv_name.decode('ascii')
|
||||
qw = CAQLabel(self, pv_name=str(pv_name))
|
||||
qw.sector = sector
|
||||
qw.sector_list = sector_list
|
||||
qw.trigger_monitor_str.connect(receive_submaster_update)
|
||||
#pv_name = self.settings.data[sector][pv_id]
|
||||
#pv_name = pv_name.encode('utf-8')
|
||||
#pv_name = pv_name.decode('ascii')
|
||||
self.submaster_wgt[i] = CAQLabel(self, pv_name=str(pv_name[i]))
|
||||
self.submaster_wgt[i].sector = sector
|
||||
self.submaster_wgt[i].sector_list = sector_list
|
||||
self.submaster_wgt[i].trigger_monitor_str.connect(receive_submaster_update)
|
||||
|
||||
|
||||
pvd = self.cafe.getPVCache(
|
||||
self.settings.data[sector][pv_id], dt='str')
|
||||
|
||||
time.sleep(0.2)
|
||||
qw.trigger_monitor_str.emit(pvd.value[0], pvd.status,
|
||||
pvd.alarmSeverity)
|
||||
print("emit value ========================================>", sector, pvd.value[0])
|
||||
qw.setFixedWidth(120)
|
||||
qw.setText("")
|
||||
#time.sleep(0.1)
|
||||
#QApplication.processEvents()
|
||||
#time.sleep(0.1)
|
||||
#QApplication.processEvents()
|
||||
#time.sleep(0.1)
|
||||
|
||||
#pvd = self.cafe.getPVCache(pv_name, dt='str')
|
||||
#self.submaster_wgt[i].trigger_monitor_str.emit(pvd.value[0], pvd.status,
|
||||
# pvd.alarmSeverity)
|
||||
#print("emit value ========================================>", sector, pvd.value[0])
|
||||
self.submaster_wgt[i].setFixedWidth(120)
|
||||
self.submaster_wgt[i].setText("")
|
||||
qw_layout = QHBoxLayout()
|
||||
qw_layout.addWidget(qw)
|
||||
qw_layout.addWidget(self.submaster_wgt[i])
|
||||
qgb_inner.setLayout(qw_layout)
|
||||
|
||||
qgrid.addWidget(qgb_inner, 0, i, 1, 1,
|
||||
Qt.AlignmentFlag(Qt.AlignTop|Qt.AlignHCenter))
|
||||
|
||||
|
||||
|
||||
QApplication.processEvents()
|
||||
time.sleep(0.1)
|
||||
for wgt in self.submaster_wgt:
|
||||
print("wgt.pv_name", wgt.pv_name, flush=True)
|
||||
pvd = self.cafe.getPVCache(wgt.pv_name, dt='str')
|
||||
wgt.trigger_monitor_str.emit(pvd.value[0], pvd.status, pvd.alarmSeverity)
|
||||
print("emit value ========================================>", wgt.sector, pvd.value[0])
|
||||
qgb.setContentsMargins(9, 9, 9, 9)
|
||||
qgb.setObjectName("OUTER")
|
||||
qgb.setLayout(qgrid)
|
||||
@@ -618,20 +736,6 @@ class AppGui(QWidget):
|
||||
qtotsav.setFont(f)
|
||||
qtotsav.setAlignment(Qt.AlignCenter)
|
||||
|
||||
'''
|
||||
layout3.addWidget(qlp)
|
||||
layout4.addWidget(qsa)
|
||||
layout5.addWidget(qti)
|
||||
layout6.addWidget(qtotsav)
|
||||
|
||||
qgrid.addWidget(container3, 0, 2, 1, 1)
|
||||
qgrid.addWidget(container4, 0, 3, 1, 1)
|
||||
qgrid.addWidget(container5, 0, 5, 1, 1)
|
||||
qgrid.addWidget(container6, 0, 6, 1, 1)
|
||||
#q=QFrame()
|
||||
#q.setFixedWidth(12)
|
||||
#qgrid.addWidget(q, 0, 7, 1, 1)
|
||||
'''
|
||||
qgrid.addWidget(qlp, 0, 2, 1, 1)
|
||||
qgrid.addWidget(qsa, 0, 3, 1, 1)
|
||||
qgrid.addWidget(qti, 0, 5, 1, 1)
|
||||
@@ -639,56 +743,7 @@ class AppGui(QWidget):
|
||||
|
||||
for i, sector in enumerate(self.settings.data["header"][idx:idx_last]):
|
||||
a, b, c, d, e, f = self.sector_status(sector)
|
||||
'''
|
||||
container = QWidget()
|
||||
layout = QHBoxLayout(container)
|
||||
layout.setContentsMargins(2, 0, 0, 0)
|
||||
container.setStyleSheet("background-color: lightblue;")
|
||||
layout.addWidget(a)
|
||||
a.setContentsMargins(2, 0, 0, 0)
|
||||
container2 = QWidget()
|
||||
container3 = QWidget()
|
||||
container4 = QWidget()
|
||||
container5 = QWidget()
|
||||
container6 = QWidget()
|
||||
layout2 = QHBoxLayout(container2)
|
||||
layout2.setContentsMargins(0, 0, 0, 0)
|
||||
container2.setStyleSheet("background-color: lightblue;")
|
||||
layout2.addWidget(b)
|
||||
b.setContentsMargins(0, 0, 0, 0)
|
||||
layout3 = QHBoxLayout(container3)
|
||||
layout3.setContentsMargins(0, 0, 0, 0)
|
||||
container3.setStyleSheet("background-color: lightblue;")
|
||||
layout3.addWidget(c)
|
||||
c.setContentsMargins(0, 0, 0, 0)
|
||||
layout4 = QHBoxLayout(container4)
|
||||
layout4.setContentsMargins(0, 0, 0, 0)
|
||||
container4.setStyleSheet("background-color: lightblue;")
|
||||
layout4.addWidget(d)
|
||||
d.setContentsMargins(0, 0, 0, 0)
|
||||
layout5 = QHBoxLayout(container5)
|
||||
layout5.setContentsMargins(0, 0, 0, 0)
|
||||
container5.setStyleSheet("background-color: lightblue;")
|
||||
layout5.addWidget(e)
|
||||
e.setContentsMargins(0, 0, 0, 0)
|
||||
layout6 = QHBoxLayout(container6)
|
||||
layout6.setContentsMargins(0, 0, 0, 0)
|
||||
container6.setStyleSheet("background-color: lightblue;")
|
||||
layout6.addWidget(f)
|
||||
f.setContentsMargins(0, 0, 0, 0)
|
||||
layout2.setAlignment(Qt.AlignLeft)
|
||||
layout3.setAlignment(Qt.AlignLeft)
|
||||
layout4.setAlignment(Qt.AlignLeft)
|
||||
layout5.setAlignment(Qt.AlignLeft)
|
||||
layout6.setAlignment(Qt.AlignLeft)
|
||||
|
||||
qgrid.addWidget(container, i+1, 0, 1, 1)
|
||||
qgrid.addWidget(container2, i+1, 1, 1, 1)
|
||||
qgrid.addWidget(container3, i+1, 2, 1, 1)
|
||||
qgrid.addWidget(container4, i+1, 3, 1, 1)
|
||||
qgrid.addWidget(container5, i+1, 5, 1, 1)
|
||||
qgrid.addWidget(container6, i+1, 6, 1, 1)
|
||||
'''
|
||||
|
||||
qgrid.addWidget(a, i + 1, 0, 1, 1)
|
||||
qgrid.addWidget(b, i + 1, 1, 1, 1)
|
||||
qgrid.addWidget(c, i + 1, 2, 1, 1)
|
||||
@@ -901,6 +956,9 @@ class AppGui(QWidget):
|
||||
self.table_pwr_dict[sector].init_value_button.setEnabled(False)
|
||||
table.init_value_button.setEnabled(False)
|
||||
|
||||
|
||||
|
||||
|
||||
def on_sector_restore(self):
|
||||
target = self.sender()
|
||||
sector = target.sector
|
||||
@@ -928,6 +986,55 @@ class AppGui(QWidget):
|
||||
stat = self.cafe.set(pv_last_pwr, sum_pwr)
|
||||
self.check_status(_pymodule, "set", pv_last_pwr, stat, _line())
|
||||
|
||||
def is_sector_standby(self, sector, pv_name, value):
|
||||
self.sector_designated_magnet_values_dict[sector][pv_name] = value
|
||||
print(self.sector_designated_magnet_values_dict[sector], flush=True)
|
||||
is_standby = True
|
||||
for pv in self.sector_designated_magnet_values_dict[sector]:
|
||||
val_now = self.sector_designated_magnet_values_dict[sector][pv]
|
||||
val_standby = self.sector_designated_magnet_standby_dict[sector][pv]
|
||||
|
||||
if abs(val_now) > (1.2 * abs(val_standby)):
|
||||
is_standby = False
|
||||
break;
|
||||
print(sector, " is in standby:", is_standby, flush=True)
|
||||
|
||||
with self.lock:
|
||||
if not is_standby:
|
||||
print(sector, " is in standby==>:", is_standby, flush=True)
|
||||
if not self.table_sol_dict[sector].init_value_button.isEnabled():
|
||||
#print(sector, " isEnabled is False make True==>:", is_standby, flush=True)
|
||||
self.table_sol_dict[sector].init_value_button.setEnabled(True)
|
||||
print(sector, " Test pwr in standby==>:", is_standby, flush=True)
|
||||
if not self.table_pwr_dict[sector].init_value_button.isEnabled():
|
||||
#print(sector, " pwr isEnabled is False make True==>:", is_standby, flush=True)
|
||||
self.table_pwr_dict[sector].init_value_button.setEnabled(True)
|
||||
print(sector, " is in standby======>:", is_standby, flush=True)
|
||||
else:
|
||||
print(sector, " is in standby==>:", is_standby, flush=True)
|
||||
if self.table_sol_dict[sector].init_value_button.isEnabled():
|
||||
print(sector, " isEnabled is True make Flase==>:", is_standby, flush=True)
|
||||
self.table_sol_dict[sector].init_value_button.setEnabled(False)
|
||||
if self.table_pwr_dict[sector].init_value_button.isEnabled():
|
||||
print(sector, " pwr isEnabled is False make True==>:", is_standby, flush=True)
|
||||
self.table_pwr_dict[sector].init_value_button.setEnabled(False)
|
||||
print(sector, " is sector standby end:", is_standby, flush=True)
|
||||
|
||||
@Slot(float, int, int)
|
||||
def designated_magnet_cb(self, value, status, alarm_severity):
|
||||
print("designated_magnet_cb", status, flush=True)
|
||||
if status == self.cyca.ICAFE_CA_OP_CONN_DOWN:
|
||||
return
|
||||
sender = self.sender()
|
||||
sector = sender.sector
|
||||
pv_name = sender.pv_name
|
||||
print("local_cb", sender.pv_name, value, status, alarm_severity, flush=True)
|
||||
#self.sector_designated_magnet_values_dict[sector][pv_name] = value
|
||||
self.timer.singleShot(0, lambda: self.is_sector_standby(sector, pv_name, value))
|
||||
print("designated_magnet_cb end for sector", sector, flush=True)
|
||||
|
||||
|
||||
|
||||
def ca_table_sector_widget(self, sector: str = ""):
|
||||
device_list = self.settings.data[sector]["device"]
|
||||
attribute_list = self.settings.data[sector]["attribute"]
|
||||
@@ -945,12 +1052,19 @@ class AppGui(QWidget):
|
||||
for dev in device_list:
|
||||
pv_dict[att_key].append(dev + ":" + att_pv)
|
||||
|
||||
self.cafe.openPrepare()
|
||||
for key in pv_dict:
|
||||
self.cafe.open(pv_dict[key])
|
||||
self.cafe.openNowAndWait(2.0)
|
||||
time.sleep(0.05)
|
||||
|
||||
try:
|
||||
delay = self.input_parameters["delayRamp"]
|
||||
except KeyError:
|
||||
except KeyError as ex:
|
||||
print("KeyError", str(ex))
|
||||
delay = 0.09
|
||||
pass
|
||||
|
||||
|
||||
init_column = True
|
||||
standby_column = True
|
||||
if "B1B2" in sector:
|
||||
@@ -962,7 +1076,16 @@ class AppGui(QWidget):
|
||||
self, pv_list=pv_dict["SOL:2"], show_units=True, notify_freq_hz=1,
|
||||
notify_unison=True, scale_factor=1, show_timestamp=False,
|
||||
init_column=False)
|
||||
|
||||
table_sol.sector = sector
|
||||
else:
|
||||
|
||||
pvlist = self.get_standby_list(sector)
|
||||
|
||||
for pv in pvlist:
|
||||
value = self.cafe.getCache(pv)
|
||||
if value is not None:
|
||||
self.sector_designated_magnet_values_dict[sector][ pv] = value
|
||||
|
||||
table_sol = CAQTableWidget(
|
||||
self, pv_list=pv_dict["SOL:2"], show_units=True, notify_freq_hz=0,
|
||||
@@ -971,6 +1094,10 @@ class AppGui(QWidget):
|
||||
standby_column=standby_column, standby_values=standby_values,
|
||||
set_delay=delay)
|
||||
|
||||
table_sol.sector = sector
|
||||
|
||||
|
||||
|
||||
if init_column:
|
||||
table_sol.restore_value_button.setToolTip(
|
||||
("Restore devices to their pre-standby values"))
|
||||
@@ -1101,7 +1228,28 @@ class AppGui(QWidget):
|
||||
table_pwr.set_init_values(pwr_values)
|
||||
except KeyError:
|
||||
pass
|
||||
|
||||
|
||||
if "B1B2" not in sector:
|
||||
|
||||
gateway_indices = self.get_standby_index_list(sector)
|
||||
|
||||
for idx in gateway_indices:
|
||||
table_sol.pv_gateway[idx].sector = sector
|
||||
table_sol.pv_gateway[idx].trigger_monitor_float.connect(
|
||||
self.designated_magnet_cb)
|
||||
time.sleep(0.55)
|
||||
|
||||
for idx in gateway_indices:
|
||||
pv_name_gw = table_sol.pv_gateway[idx].pv_name
|
||||
pvd = self.cafe.getPVCache(pv_name_gw, dt='float')
|
||||
pvd.show()
|
||||
print("pv_name_gw", pv_name_gw, flush=True)
|
||||
|
||||
table_sol.pv_gateway[idx].trigger_monitor_float.emit(
|
||||
pvd.value[0], pvd.status, pvd.alarmSeverity)
|
||||
print("gw emit done")
|
||||
|
||||
|
||||
def on_sol_update():
|
||||
table_sol.init_value_button.setEnabled(False)
|
||||
table_pwr.init_value_button.click()
|
||||
|
||||
Reference in New Issue
Block a user