From 350f2884c30ccf77c8049ad60b8a66aa5c2d1347 Mon Sep 17 00:00:00 2001 From: chrin Date: Thu, 7 Mar 2024 15:13:43 +0100 Subject: [PATCH] open to start --- hush.py | 3 +- src/gui.py | 270 ++++++++++++++++++++++++++++------------------------- 2 files changed, 146 insertions(+), 127 deletions(-) diff --git a/hush.py b/hush.py index d024dbe..ef4b1b2 100644 --- a/hush.py +++ b/hush.py @@ -202,9 +202,10 @@ class StartMain(BaseWindow): ######################################################################### if __name__ == "__main__": + delay = 25 if "_" in _pymodule else 40 app = QApplication(sys.argv) splash = BaseWindow.initialize_application( - app, appname=_appname, delay=25, facility=Facility.PROSCAN) + app, appname=_appname, delay=delay, facility=Facility.PROSCAN) myapp = StartMain() diff --git a/src/gui.py b/src/gui.py index bfd294b..7642371 100644 --- a/src/gui.py +++ b/src/gui.py @@ -75,6 +75,8 @@ class AppGui(QWidget): "PG2-HUSH:STATE", "PO2-HUSH:STATE", "PPIF-HUSH:STATE", "PG3-HUSH:STATE"] + self.sector_list_all = self.settings.data["headerMagnetSector"] + # Overwrite default self.gui_frame.central_tab_widget.tabBar().setTabText(0, "Control") #self.gui_frame.central_tab_widget.tabBar().setTabText(1, "IOC") @@ -126,13 +128,9 @@ class AppGui(QWidget): self.table_sol_dict = {} self.table_pwr_dict = {} self.offtime_dict = {} - - self.cafe.openPrepare() - self.cafe.open(["PRO-HUSH:LASTPWR", "PRO-HUSH:TOTPWR", - "PRO:LASTSAVE", "PPO-HUSH:TOTSAVE"]) - self.cafe.open(self.sec_state_list) - self.cafe.openNowAndWait(0.1) - + + self.pv_mastership_status = "mastershipStatus" + local_sector_list = ["G1", "SH", "G2", "O2", "PIF", "G3"] # Overload from guiheader.py self.sector_disruptor_dict = {} @@ -151,13 +149,49 @@ class AppGui(QWidget): sector] = self.get_standby_dict(sector) print(self.sector_designated_magnet_values_dict, flush=True) - print("====================================================================") + print("====================================================================") + + 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.sector_list = [] + #Take out B1B2 and SH + for sector in self.sector_list_all: + if self.pv_mastership_status in self.settings.data[sector]: + self.sector_list.append(sector) + + print(self.sector_list, flush=True) + + + + self.pv_name_in_sector_list = [None] * len(self.sector_list) + for i, sector in enumerate(self.sector_list): + print(i, sector, flush=True) + self.pv_name_in_sector_list[i] = self.settings.data[sector][self.pv_mastership_status] + self.pv_name_in_sector_list[i] = self.pv_name_in_sector_list[i].encode('utf-8') + self.pv_name_in_sector_list[i] = self.pv_name_in_sector_list[i].decode('ascii') + + + hush_list = ["PRO-HUSH:LASTPWR", "PRO-HUSH:TOTPWR", + "PRO:LASTSAVE", "PPO-HUSH:TOTSAVE"] + open_list = hush_list + self.sec_state_list + pv_list + self.pv_name_in_sector_list + self.cafe.openPrepare() + self.cafe.open(open_list) + self.cafe.openNowAndWait(1.5) + + + + self.submastership_dict = { "G1": "UNDEF", "G2": "UNDEF", "O2": "UNDEF", "PIF": "UNDEF", "G3": "UNDEF"} for key in self.submastership_dict: - pvname = self.settings.data[key]["mastershipStatus"] + pvname = self.settings.data[key][self.pv_mastership_status] value = self.cafe.get(pvname) self.submastership_dict[key] = value @@ -232,14 +266,7 @@ class AppGui(QWidget): 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"]: @@ -287,32 +314,51 @@ class AppGui(QWidget): elif "G3" in key: self.receive_g3_update( pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity) - ''' - + ''' + + #Trigger group_submaster_wgt + 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]) + + for sector in self.sector_list_all: + if "B1B2" in sector: + continue + + gateway_indices = self.get_standby_index_list(sector) + + for idx in gateway_indices: + pv_name_gw = self.table_sol_dict[sector].pv_gateway[idx].pv_name + pvd = self.cafe.getPVCache(pv_name_gw, dt='float') + print("pv_name_gw", pv_name_gw, flush=True) + pvd.show() + self.table_sol_dict[sector].pv_gateway[ + idx].trigger_monitor_float.emit( + pvd.value[0], pvd.status, pvd.alarmSeverity) + + print("gw emit done") + def enable_disable_beamline(self, sect, sector_line, value): def is_submaster(local_sector, local_sector_line): - print("===========", local_sector, local_sector_line, flush=True) + #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) + #print(local_sector, + # self.submastership_dict[local_sector].upper(), + # flush=True) 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) + return bool( "MASTERSHIP" in self.submastership_dict[ "G3"].upper()) else: - 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()) @@ -321,7 +367,7 @@ class AppGui(QWidget): else: return self.gui_header.is_master() - print("sect/value/sector_line", sect, value, sector_line, flush=True) + #print("sect/value/sector_line", sect, value, sector_line, flush=True) if not sector_line: return @@ -330,10 +376,10 @@ 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, 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) + #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].standby_value_button.isEnabled(): @@ -345,8 +391,8 @@ class AppGui(QWidget): self.table_sol_dict[ sector].restore_value_button.setEnabled(False) else: - print("Geschlossen? sector/value/ismaster", sector, value, - self.gui_header.mastership, flush=True) + #print("Geschlossen? sector/value/ismaster", sector, value, + # self.gui_header.mastership, flush=True) with self.lock: if not self.table_sol_dict[ sector].standby_value_button.isEnabled(): @@ -467,7 +513,8 @@ class AppGui(QWidget): self.gui_header.color_pframe(color) #print("SIMULATION IS TRUE??", self.input_parameters["simulation"]) - + + #Not required any longer @Slot(int, str, object) def receive_sec_state(self, handle, pv, pvdata): if pvdata.status == self.cyca.ICAFE_CA_OP_CONN_DOWN: @@ -517,7 +564,7 @@ class AppGui(QWidget): pv_standby_dict[pv_magnet] = standby_value return pv_standby_dict - + #Not used any longer def already_in_standby(self, sec): devices = self.settings.data[sec]["iocDevice"] pv_list = [] @@ -562,7 +609,7 @@ class AppGui(QWidget): self.submastership_dict[sender.sector] = value #Check on value and act accordingly - print("receive_submaster", sender.sector, value, flush=True) + #print("receive_submaster", sender.sector, value, flush=True) if "G1" in sender.sector: pvd = self.cafe.getPVCache( self.settings.data["G1"]["status"], dt="str") @@ -588,35 +635,36 @@ class AppGui(QWidget): self.settings.data["G3"]["status"], dt="str") self.receive_g3_update(pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity) - print("receive_submaster->", sender.sector, flush=True) - + + - pv_id = "mastershipStatus" qgrid = QGridLayout() qgb = QGroupBox("Mastership Status") no_beamlines = 0 - sector_list_all = self.settings.data["headerMagnetSector"] - sector_list = [] + #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) + #for sector in self.sector_list_all: + # if "mastershipStatus" in self.settings.data[sector]: + # sector_list.append(sector) - print(sector_list, flush=True) + #print(sector_list, flush=True) - self.submaster_wgt = [None] * len(sector_list) + self.submaster_wgt = [None] * len(self.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] = self.settings.data[sector][self.pv_mastership_status] 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]: + for i, sector in enumerate(self.sector_list): + if self.pv_mastership_status in self.settings.data[sector]: no_beamlines += 1 qgb_inner = QGroupBox(sector) @@ -630,16 +678,12 @@ class AppGui(QWidget): #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] = CAQLabel( + self, pv_name=str(self.pv_name_in_sector_list[i])) self.submaster_wgt[i].sector = sector - self.submaster_wgt[i].sector_list = sector_list + self.submaster_wgt[i].sector_list = self.sector_list self.submaster_wgt[i].trigger_monitor_str.connect(receive_submaster_update) - - #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, @@ -654,6 +698,7 @@ class AppGui(QWidget): 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: @@ -661,6 +706,7 @@ class AppGui(QWidget): 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) @@ -676,31 +722,6 @@ class AppGui(QWidget): idx_last = self.settings.data["header"].index("MASTER") # Sector - ''' - qgrid.setContentsMargins(0, 0, 0, 0) - qgrid.setSpacing(0) - container2 = QWidget() - container3 = QWidget() - container4 = QWidget() - container5 = QWidget() - container6 = QWidget() - layout2 = QHBoxLayout(container2) - layout2.setContentsMargins(0, 0, 0, 0) - layout2.setAlignment(Qt.AlignCenter) - layout3 = QHBoxLayout(container3) - layout3.setContentsMargins(0, 0, 0, 0) - layout3.setAlignment(Qt.AlignCenter) - layout4 = QHBoxLayout(container4) - layout4.setContentsMargins(0, 0, 0, 0) - layout4.setAlignment(Qt.AlignCenter) - layout5 = QHBoxLayout(container5) - layout5.setContentsMargins(0, 0, 0, 0) - layout5.setAlignment(Qt.AlignCenter) - layout6 = QHBoxLayout(container6) - layout6.setContentsMargins(0, 0, 0, 0) - layout6.setAlignment(Qt.AlignCenter) - ''' - qlp = QLabel("Power \n(kW)") f = qlp.font() f.setPixelSize(13) @@ -852,7 +873,7 @@ class AppGui(QWidget): self.offtime_dict[pv_pwr_timeout] = qptime # Time to allow cb_outtime to fire - time.sleep(0.2) + time.sleep(0.05) qptime.setFixedWidth(104) @@ -923,20 +944,21 @@ class AppGui(QWidget): # updates of SOL also update PWR, and vice-versa # Do not click if already on standby!! - update_enabled = is_update_enabled() + with self.lock(): + update_enabled = is_update_enabled() - if update_enabled: - 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) + if update_enabled: + 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) + 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) + QApplication.processEvents(QEventLoop.AllEvents, 1) if not self.input_parameters["simulation"]: status, status_list, pv_list = table.set_standby_values() @@ -952,11 +974,11 @@ class AppGui(QWidget): ##self.check_status(_pymodule, 'set', pv, stat, _line()) # Disable because _table.set_standby_values() enables it + if not update_enabled: - self.table_pwr_dict[sector].init_value_button.setEnabled(False) - table.init_value_button.setEnabled(False) - - + with self.lock(): + self.table_pwr_dict[sector].init_value_button.setEnabled(False) + table.init_value_button.setEnabled(False) def on_sector_restore(self): @@ -986,9 +1008,10 @@ 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) + #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] @@ -996,42 +1019,35 @@ class AppGui(QWidget): if abs(val_now) > (1.2 * abs(val_standby)): is_standby = False - break; - print(sector, " is in standby:", is_standby, flush=True) + break; 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) + + if not self.table_pwr_dict[sector].init_value_button.isEnabled(): 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) + if self.table_pwr_dict[sector].init_value_button.isEnabled(): 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) + #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) + #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) + #print("designated_magnet_cb end for sector", sector, flush=True) @@ -1237,8 +1253,10 @@ class AppGui(QWidget): table_sol.pv_gateway[idx].sector = sector table_sol.pv_gateway[idx].trigger_monitor_float.connect( self.designated_magnet_cb) - time.sleep(0.55) - + #time.sleep(0.55) + + #move to init + ''' for idx in gateway_indices: pv_name_gw = table_sol.pv_gateway[idx].pv_name pvd = self.cafe.getPVCache(pv_name_gw, dt='float') @@ -1248,16 +1266,16 @@ class AppGui(QWidget): 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() - time.sleep(0.1) + time.sleep(0.05) table_sol.init_value_button.setEnabled(True) pv = "P" + table_pwr.init_value_button.sector + "-HUSH:LASTPWR" init_sum = sum(table_pwr.get_init_values().values()) - print("SUM up all the values", pv, init_sum, flush=True) + #print("SUM up all the values", pv, init_sum, flush=True) #B1B2 is not is not in state machine if "B1B2" in table_pwr.init_value_button.sector: return @@ -1268,7 +1286,7 @@ class AppGui(QWidget): def on_init_update(): table_pwr.init_value_button.setEnabled(False) table_sol.init_value_button.click() - time.sleep(0.1) + time.sleep(0.05) table_pwr.init_value_button.setEnabled(True) if init_column: