diff --git a/hush.sh b/hush.sh index cfcfac4..aa06b58 100755 --- a/hush.sh +++ b/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} diff --git a/src/gui.py b/src/gui.py index bf80344..bfd294b 100644 --- a/src/gui.py +++ b/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()