diff --git a/hush.sh b/hush.sh index acf56a2..3f1ef45 100755 --- a/hush.sh +++ b/hush.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.6.0 +cd /proscan/bd/applications/hush/hla/1.7.0 # For use if script is sourced rather than executed appNameDefault="hush.sh" diff --git a/hush_g1.sh b/hush_g1.sh index ae07d64..11571b5 100755 --- a/hush_g1.sh +++ b/hush_g1.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.5.0 +cd /proscan/bd/applications/hush/hla/1.7.0 # For use if script is sourced rather than executed appNameDefault="hush_g1.sh" @@ -62,7 +62,7 @@ echo "PYTHON_VERSION $PYTHON_VERSION" #/sf/bd/applications/OnlineModel/default/scripts/VA: #C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.21.0/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0 +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.21.0/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.13.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/hush_g2.sh b/hush_g2.sh index a254c33..90ec7db 100755 --- a/hush_g2.sh +++ b/hush_g2.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.5.0 +cd /proscan/bd/applications/hush/hla/1.7.0 # For use if script is sourced rather than executed appNameDefault="hush_g2.sh" @@ -63,7 +63,7 @@ echo "PYTHON_VERSION $PYTHON_VERSION" #/sf/bd/applications/OnlineModel/default/scripts/VA: #C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.21.0/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0 +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.21.0/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.13.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/hush_g3.sh b/hush_g3.sh index cc80256..8fb2e72 100755 --- a/hush_g3.sh +++ b/hush_g3.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.5.0 +cd /proscan/bd/applications/hush/hla/1.7.0 # For use if script is sourced rather than executed appNameDefault="hush_g3.sh" @@ -63,7 +63,7 @@ echo "PYTHON_VERSION $PYTHON_VERSION" #/sf/bd/applications/OnlineModel/default/scripts/VA: #C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.21.0/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.10.0 +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.21.0/lib/${_EPICS_HOST_ARCH}:/proscan/bd/applications/deps/apps4ops/v1.13.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/hush_o2.sh b/hush_o2.sh index 205de7a..9fb43ab 100755 --- a/hush_o2.sh +++ b/hush_o2.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.5.0 +cd /proscan/bd/applications/hush/hla/1.7.0 # For use if script is sourced rather than executed appNameDefault="hush_o2.sh" @@ -68,7 +68,7 @@ export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.21.0/lib/${_EPICS_HOST_AR if [ "${EXTRA_PYTHON_PATH_FLAG}" -gt "0" ] ; then - export PYTHONPATH=$PYTHONPATH:/proscan/bd/applications/deps/apps4ops/v1.10.0/common/python${PYTHON_VERSION_DIR} + export PYTHONPATH=$PYTHONPATH:/proscan/bd/applications/deps/apps4ops/v1.13.0/common/python${PYTHON_VERSION_DIR} fi echo $PYTHONPATH diff --git a/hush_pif.sh b/hush_pif.sh index f52c414..7c96f99 100755 --- a/hush_pif.sh +++ b/hush_pif.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /proscan/bd/applications/hush/hla/1.5.0 +cd /proscan/bd/applications/hush/hla/1.7.0 # For use if script is sourced rather than executed appNameDefault="hush_pif.sh" diff --git a/src/gui.py b/src/gui.py index 7bb7e28..d26e452 100644 --- a/src/gui.py +++ b/src/gui.py @@ -52,6 +52,19 @@ class AppGui(QWidget): self.statusbar = self.parent.statusbar self.gui_frame = self.parent.gui_frame self.gui_header = self.parent.gui_header + + self.assigned_master = self.gui_header.assigned_master + self.simple_standby = None + self.simple_awake = None + self.simple_status = None + self.simple_groupbox = None + self.groupbox_awake_sss = self.settings.data['statusStyleSheet']['awake-qgroupbox'] + self.groupbox_standby_sss = self.settings.data['statusStyleSheet']['standby-qgroupbox'] + self.label_awake_sss = self.settings.data['statusStyleSheet']['awake-qlabel'] + self.label_standby_sss = self.settings.data['statusStyleSheet']['standby-qlabel'] + self.awake_text = self.settings.data['statusStyleSheet']['awake-text'] + self.standby_text = self.settings.data['statusStyleSheet']['standby-text'] + self.font_gui = self.parent.gui_frame.font_gui self.input_parameters = self.parent.input_parameters self.input_labels = self.parent.input_labels @@ -67,15 +80,16 @@ class AppGui(QWidget): self.gui_frame.measurement_tab_wgt.setFixedHeight(200) # 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.timer_blink = QTimer() + self.timer_blink.setSingleShot(True) + self.timer_blink.count = 0 + + self.sec_state_list = ["PG1-HUSH:STATE", "PSH-HUSH:STATE", "PG2-HUSH:STATE", "PO2-HUSH:STATE", "PPIF-HUSH:STATE", "PG3-HUSH:STATE"] @@ -83,12 +97,14 @@ class AppGui(QWidget): 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") - if "Controlroom" in self.assigned_master: + shift_type = CAQMenu(self, pv_name="PRO-HUSH:SHIFT-TYPE") self.gui_frame.operator_parameters_group.layout().insertWidget( 0, QLabel(" Shift Type:")) @@ -102,6 +118,7 @@ class AppGui(QWidget): self.gui_frame.results_wgt.setLayout(self.gui_frame.results_layout) self.gui_frame.results_layout.addWidget( self.reset_ioc_sm(), 0, 0, 1, 1) + sec_prefix_list = [ @@ -157,7 +174,9 @@ class AppGui(QWidget): print(self.sector_designated_magnet_values_dict, flush=True) print("====================================================================") - + print("self.assigned_master is ", self.assigned_master) + + pv_list = [] for key in self.sector_disruptor_dict: if key in self.settings.data["headerMagnetSector"]: @@ -171,28 +190,31 @@ class AppGui(QWidget): if self.pv_mastership_status in self.settings.data[sector]: self.sector_list.append(sector) - print(self.sector_list, flush=True) - + print(self.sector_list, flush=True) + #Keep SH + self.simple_sector_list = self.settings.data["headerMagnetSector"][ + 1:] if "Controlroom" in self.assigned_master else self.sector_list + - 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') + 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 + 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"} @@ -210,11 +232,35 @@ class AppGui(QWidget): self.gui_frame.measurement_layout.addWidget( self.magnet_tab_wgt, 0, 2, 3, 2, alignment=Qt.AlignTop) - - _row = self.gui_frame.measurement_layout.rowCount() - self.gui_frame.measurement_layout.addWidget( - self.group_submaster_status(), _row, 2, 2, 2, - Qt.AlignTop|Qt.AlignHCenter) + _row = self.gui_frame.measurement_layout.rowCount() + _column = self.gui_frame.measurement_layout.columnCount()-2 + + #Controlroom + if "Dummy" not in self.assigned_master: + self.groupbox_simple_mode = self.group_simple_mode() + qgridlo = QGridLayout() + qgridlo.setContentsMargins(5, 30, 5, 10) + qgridlo.addWidget(self.groupbox_simple_mode, 0, 0, 1, 1, Qt.AlignCenter) + qgridlo.addWidget(self.group_submaster_status(), 1, 0, 1, 1, Qt.AlignCenter) + qgridlo.setAlignment(Qt.AlignTop | Qt.AlignHCenter) + qgridlo.setVerticalSpacing(40) + qwgt = QWidget() + qwgt.setLayout(qgridlo) + qwgt.setFixedWidth(1400) + qwgt.setFixedHeight(800) + + + self.gui_frame.central_tab_widget.insertTab( + 0, qwgt, "Skin") + # self.gui_frame.measurement_layout.addWidget( + # self.groupbox_simple_mode, _row, _column, 1, 1, + # Qt.AlignTop|Qt.AlignHCenter) + # _column += 1 + + else: + self.gui_frame.measurement_layout.addWidget( + self.group_submaster_status(), _row, _column, 2, 2, + Qt.AlignTop|Qt.AlignHCenter) self.sh_idx = self.magnet_tab_wgt.count() - 1 for i in range(0, self.magnet_tab_wgt.count()): @@ -224,7 +270,8 @@ class AppGui(QWidget): break self.magnet_tab_wgt.setCurrentIndex(self.sh_idx) - + self.gui_frame.central_tab_widget.setCurrentIndex(0) + status_wgt = self.group_sector_status() status_wgt.setFixedHeight(340) @@ -233,7 +280,7 @@ class AppGui(QWidget): #self.gui_frame.measurement_layout.addWidget(qf, 2, 0, 1, 1) self.gui_frame.measurement_layout.addWidget( - status_wgt, 1, 0, 4, 1, alignment=Qt.AlignTop) # | Qt.AlignHCenter) + status_wgt, 1, 0, 4, 1, alignment=Qt.AlignTop) #qf = QFrame() #qf.setFixedHeight(1) @@ -256,7 +303,8 @@ class AppGui(QWidget): if "Controlroom" in self.assigned_master: self.gui_header.beam_current_wgt_dict[ - "MASTER"].trigger_monitor_str.connect(self.receive_master_update) + "MASTER"].trigger_monitor_str.connect( + self.receive_master_update) pvd = self.cafe.getPVCache( self.settings.data["MASTER"]["status"], dt="str") try: @@ -277,7 +325,7 @@ class AppGui(QWidget): break ''' - + for key in self.sector_disruptor_dict: if key in self.settings.data["headerMagnetSector"]: @@ -351,6 +399,9 @@ class AppGui(QWidget): 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): @@ -383,8 +434,14 @@ class AppGui(QWidget): return self.sector_disruptor_dict[sect] = value - - for sector in reversed(sector_line): + + print('sector_line', sector_line) + print('simple_sector_line', self.simple_sector_list) + + for sector in reversed(sector_line): + idx1 = sector_line.index(sector) + idx = self.simple_sector_list.index(sector) + print("sector and indices", sector, idx, idx1) 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) @@ -396,11 +453,16 @@ class AppGui(QWidget): sector].standby_value_button.isEnabled(): self.table_sol_dict[ sector].standby_value_button.setEnabled(False) + if self.simple_standby: + self.simple_standby[idx].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) + if self.simple_awake: + self.simple_awake[idx].setEnabled(False) else: #print("Geschlossen? sector/value/ismaster", sector, value, # self.gui_header.mastership, flush=True) @@ -409,11 +471,14 @@ class AppGui(QWidget): sector].standby_value_button.isEnabled(): self.table_sol_dict[ sector].standby_value_button.setEnabled(True) + if self.simple_standby: + self.simple_standby[idx].setEnabled(True) if not self.table_sol_dict[ sector].restore_value_button.isEnabled(): self.table_sol_dict[ sector].restore_value_button.setEnabled(True) - + if self.simple_awake: + self.simple_awake[idx].setEnabled(True) ''' # For future reference @Slot(str, int, int) @@ -609,8 +674,7 @@ class AppGui(QWidget): ##Non-embedded defs - - + def group_submaster_status(self): @Slot(str, int, int) def receive_submaster_update(value, status, alarm_severity): @@ -624,30 +688,34 @@ class AppGui(QWidget): if "G1" in sender.sector: pvd = self.cafe.getPVCache( self.settings.data["G1"]["status"], dt="str") - self.receive_g1_update(pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity) + self.receive_g1_update(pvd.value[0], pvd.alarmStatus, + pvd.alarmSeverity) elif "G2" in sender.sector: pvd = self.cafe.getPVCache( self.settings.data["G2"]["status"], dt="str") - self.receive_g2_update(pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity) + self.receive_g2_update(pvd.value[0], pvd.alarmStatus, + pvd.alarmSeverity) elif "O2" in sender.sector: pvd = self.cafe.getPVCache( self.settings.data["O2"]["status"], dt="str") - self.receive_o2_update(pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity) + self.receive_o2_update(pvd.value[0], pvd.alarmStatus, + pvd.alarmSeverity) elif "PIF" in sender.sector: pvd = self.cafe.getPVCache( self.settings.data["PIF"]["status"], dt="str") - self.receive_pif_update(pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity) + self.receive_pif_update(pvd.value[0], pvd.alarmStatus, + pvd.alarmSeverity) elif "G3" in sender.sector: pvd = self.cafe.getPVCache( self.settings.data["G3"]["status"], dt="str") - self.receive_g3_update(pvd.value[0], pvd.alarmStatus, pvd.alarmSeverity) + self.receive_g3_update(pvd.value[0], pvd.alarmStatus, + pvd.alarmSeverity) - - + qgrid = QGridLayout() qgb = QGroupBox("Mastership Status") @@ -700,7 +768,7 @@ class AppGui(QWidget): #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].setFixedWidth(126) self.submaster_wgt[i].setText("") qw_layout = QHBoxLayout() qw_layout.addWidget(self.submaster_wgt[i]) @@ -721,7 +789,7 @@ class AppGui(QWidget): qgb.setContentsMargins(9, 9, 9, 9) qgb.setObjectName("OUTER") qgb.setLayout(qgrid) - qgb.setFixedWidth((150 * no_beamlines) + 20) + qgb.setFixedWidth((150 * no_beamlines) + 30) return qgb def group_sector_status(self): @@ -755,7 +823,13 @@ class AppGui(QWidget): f.setPixelSize(13) qsa.setFont(f) qsa.setAlignment(Qt.AlignCenter) - + + qstat = QLabel("Status \n ") + f = qstat.font() + f.setPixelSize(13) + qstat.setFont(f) + qstat.setAlignment(Qt.AlignCenter) + qti = QLabel("Time in \nSaving Mode") f = qti.font() f.setPixelSize(13) @@ -770,16 +844,23 @@ class AppGui(QWidget): qgrid.addWidget(qlp, 0, 2, 1, 1) qgrid.addWidget(qsa, 0, 3, 1, 1) + qgrid.addWidget(qstat, 0, 4, 1, 1) qgrid.addWidget(qti, 0, 5, 1, 1) qgrid.addWidget(qtotsav, 0, 6, 1, 1) + self.status_dict = {} + + for i, sector in enumerate(self.settings.data["header"][idx:idx_last]): a, b, c, d, e, f = self.sector_status(sector) + + self.status_dict[sector] = QLabel('') qgrid.addWidget(a, i + 1, 0, 1, 1) qgrid.addWidget(b, i + 1, 1, 1, 1) qgrid.addWidget(c, i + 1, 2, 1, 1) qgrid.addWidget(d, i + 1, 3, 1, 1) + qgrid.addWidget(self.status_dict[sector], i + 1, 4, 1, 1) qgrid.addWidget(e, i + 1, 5, 1, 1) qgrid.addWidget(f, i + 1, 6, 1, 1) @@ -937,7 +1018,9 @@ class AppGui(QWidget): target = self.sender() sector = target.sector table = self.table_sol_dict[sector] - + idx = self.sector_list.index(sector) + self.magnet_tab_wgt.setCurrentIndex(idx) + def is_update_enabled(): '''Check if update buttons are enabled if NOT, then do not allow inital values values to be updated" @@ -963,7 +1046,7 @@ class AppGui(QWidget): 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) @@ -991,12 +1074,18 @@ class AppGui(QWidget): self.table_pwr_dict[sector].init_value_button.setEnabled(False) table.init_value_button.setEnabled(False) - + self.timer_blink.singleShot( + 250, lambda: self.blink_target_beamline(sector, standby=True)) + + def on_sector_restore(self): target = self.sender() sector = target.sector table = self.table_sol_dict[sector] + idx = self.sector_list.index(sector) + self.magnet_tab_wgt.setCurrentIndex(idx) + if not self.input_parameters["simulation"]: status, status_list, pv_list = table.restore_init_values() @@ -1004,6 +1093,12 @@ class AppGui(QWidget): self.check_status_list( _pymodule, "setScalarList", pv_list, status_list, _line()) + + self.timer_blink.singleShot( + 250, lambda: self.blink_target_beamline(sector, standby=False)) + #self.timer_blink.count = 0 + #self.timer_blink.start() + # Seqeuncer ONLY determines when to go into STANDBY mode # and NOT the HLA #pv = 'P' + target.sector + "-HUSH:STATE" @@ -1020,8 +1115,39 @@ class AppGui(QWidget): 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 + def is_sector_standby(self, sector, pv_name=None, value=None): + idx = self.simple_sector_list.index(sector) + text_color = self.settings.data[sector]["color"] + text_color_str = f'color: {text_color};' + def paint_awake(): + + sss = ('QGroupBox {background-color:#ffe87c; font-weight: bold; ' + + text_color_str + '}') + self.simple_groupbox[idx].setStyleSheet(sss) + self.simple_status[idx].setStyleSheet( + 'QLabel{color:black; font-weight: bold;}') + + self.simple_groupbox[idx].setStyleSheet(sss) #self.groupbox_awake_sss) + self.simple_status[idx].setText('Status: AWAKE') + self.status_dict[sector].setStyleSheet(self.label_awake_sss) + self.status_dict[sector].setText(self.awake_text) #self.settings.data['statusStyleSheet']['awake-text']) + def paint_asleep(): + + + sss = ('QGroupBox {background-color:#546bab; font-weight: bold; ' + + text_color_str + '}') + self.simple_groupbox[idx].setStyleSheet(sss) + + self.simple_status[idx].setStyleSheet( + 'QLabel{color:white; font-weight: bold;}') + + self.simple_groupbox[idx].setStyleSheet(sss) #self.groupbox_standby_sss) + self.simple_status[idx].setText('Status: STANDBY') + self.status_dict[sector].setStyleSheet(self.label_standby_sss) + self.status_dict[sector].setText(self.standby_text) #self.settings.data['statusStyleSheet']['standby-text']) + + if value and pv_name: + 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]: @@ -1034,17 +1160,30 @@ class AppGui(QWidget): with self.lock: if not is_standby: - if not self.table_sol_dict[sector].init_value_button.isEnabled(): - self.table_sol_dict[sector].init_value_button.setEnabled(True) + if not self.table_sol_dict[ + sector].init_value_button.isEnabled(): + self.table_sol_dict[ + sector].init_value_button.setEnabled(True) - if not self.table_pwr_dict[sector].init_value_button.isEnabled(): - self.table_pwr_dict[sector].init_value_button.setEnabled(True) + if not self.table_pwr_dict[ + sector].init_value_button.isEnabled(): + self.table_pwr_dict[ + sector].init_value_button.setEnabled(True) + if self.simple_awake: + paint_awake() else: if self.table_sol_dict[sector].init_value_button.isEnabled(): - self.table_sol_dict[sector].init_value_button.setEnabled(False) + self.table_sol_dict[sector].init_value_button.setEnabled( + False) if self.table_pwr_dict[sector].init_value_button.isEnabled(): - self.table_pwr_dict[sector].init_value_button.setEnabled(False) + self.table_pwr_dict[sector].init_value_button.setEnabled( + False) + if self.simple_standby: + paint_asleep() + + return is_standby + @Slot(float, int, int) @@ -1055,9 +1194,11 @@ class AppGui(QWidget): 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)) + self.timer.singleShot(0, lambda: self.is_sector_standby( + sector, pv_name, value)) #print("designated_magnet_cb end for sector", sector, flush=True) @@ -1135,10 +1276,12 @@ class AppGui(QWidget): if standby_column: 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.standby_value_button.clicked.connect( + self.on_sector_standby) table_sol.restore_value_button.sector = sector table_sol.restore_value_button.clicked.disconnect() - table_sol.restore_value_button.clicked.connect(self.on_sector_restore) + table_sol.restore_value_button.clicked.connect( + self.on_sector_restore) self.table_sol_dict[sector] = table_sol @@ -1600,3 +1743,151 @@ class AppGui(QWidget): return qw + + def group_simple_mode(self): + + self.simple_status = [None] * len(self.simple_sector_list) + self.simple_standby = [None] * len(self.simple_sector_list) + self.simple_awake = [None] * len(self.simple_sector_list) + self.simple_groupbox = [None] * len(self.simple_sector_list) + + qgrido = QGridLayout() + + qwo = QGroupBox('Skin View') + + hlength = 3 + irow = 0 + icolumn = 0 + + for i, sector in enumerate(self.simple_sector_list): + + self.simple_status[i] = QLabel(' Status: ') + pv = 'P' + sector + '-HUSH:TOTPWR' + print('pv=', pv, flush=True) + power = CAQLabel(self, pv, show_units=True, notify_freq_hz=1) + + self.simple_standby[i] = QPushButton(' Standby ') + self.simple_standby[i].sector = sector + self.simple_standby[i].setObjectName('Controller') + self.simple_standby[i].setProperty('actOnBeam', True) + self.simple_standby[i].setToolTip( + ('Restore devices to their standby values')) + self.simple_standby[i].clicked.connect(self.on_sector_standby) + + self.simple_awake[i] = QPushButton(' Awake ') + self.simple_awake[i].sector = sector + self.simple_awake[i].setObjectName('Controller') + self.simple_awake[i].setProperty('actOnBeam', True) + self.simple_awake[i].setToolTip( + ('Restore devices to their pre-standby values')) + self.simple_awake[i].clicked.connect(self.on_sector_restore) + + qgrid = QGridLayout() + qgrid.addWidget(self.simple_status[i], 0, 0, 1, 1, Qt.AlignCenter) + qgrid.addWidget(power, 0, 1, 1, 1, Qt.AlignLeft) + qgrid.addWidget(self.simple_standby[i], 1, 0, 1, 1, Qt.AlignCenter) + qgrid.addWidget(self.simple_awake[i], 1, 1, 1, 1, Qt.AlignCenter) + qgrid.setContentsMargins(5, 20, 5, 0) + + + self.simple_groupbox[i] = QGroupBox(sector) + self.simple_groupbox[i].setContentsMargins(5, 0, 5, 0) + self.simple_groupbox[i].setAlignment(Qt.AlignCenter) + self.simple_groupbox[i].setObjectName("OUTER") + text_color = self.settings.data[sector]["color"] + text_color_str = f'color: {text_color}; ' + sss = ("QGroupBox {" + text_color_str + "font-weight: bold;}") + self.simple_groupbox[i].setStyleSheet(sss) + + self.simple_groupbox[i].setLayout(qgrid) + self.simple_groupbox[i].setFixedWidth(270) #280 + self.simple_groupbox[i].setFixedHeight(140) #140 + + + irow = 0 if i < (hlength) else 1 + icolumn = i%hlength # if i < (hlength) else int(i - hlength) + + qgrido.addWidget(self.simple_groupbox[i], irow, icolumn, 1, 1, + Qt.AlignCenter) + message = "Request Mastership to " + message += "go to Experiment Mode" if \ + "Controlroom" not in self.assigned_master else "ramp magnets" + + ql = QLabel(message) + ql.setStyleSheet('QLabel {color:black;}') + ql.setAlignment(Qt.AlignHCenter|Qt.AlignBottom) + cspan = qgrido.columnCount() + qgrido.addWidget(ql, irow+1, 0, 2, cspan, + Qt.AlignHCenter|Qt.AlignBottom) + qgrido.setContentsMargins(5, 15, 5, 15) + qgrido.setAlignment(Qt.AlignCenter) + qgrido.setVerticalSpacing(20) + qgrido.setHorizontalSpacing(25) + qwo.setContentsMargins(5, 15, 5, 10) + qwo.setAlignment(Qt.AlignCenter) + qwo.setObjectName("OUTER") + qwo.setLayout(qgrido) + wlength = len(self.simple_sector_list) if irow == 0 else int(hlength) + qwo.setFixedWidth(310 * wlength) + qwo.setFixedHeight(240 * (irow+1) - 80*irow) + + + return qwo + + def blink_target_beamline(self, sector, standby=False): + idx = self.simple_sector_list.index(sector) + text_color = self.settings.data[sector]["color"] + text_color_str = f'color: {text_color};' + + + #Deactivate + standby_enabled = self.simple_standby[idx].isEnabled() + awake_enabled = self.simple_awake[idx].isEnabled() + self.simple_standby[idx].setEnabled(False) + self.simple_awake[idx].setEnabled(False) + + is_standby = self.is_sector_standby(sector, None, None) + + ready = False + if (standby and not is_standby) or (not standby and is_standby): + + endpt = 0 if standby else 1 + ramping = 'Ramping down \u21D3' if standby else 'Ramping up \u21D1' + self.simple_status[idx].setText(ramping) + end = 14 #must be even no + + for i in range(0, end): + if i%2 == endpt: + sss = ('QGroupBox {background-color:#ffe87c; font-weight: bold; ' + + text_color_str + '}') + + else: + sss = ('QGroupBox {background-color:#546bab;; font-weight: bold; ' + + text_color_str + '}') + + self.simple_groupbox[idx].setStyleSheet(sss) + #self.simple_status[idx].setText('Status: AWAKE') + #self.simple_status[idx].setStyleSheet( + # 'QLabel{color:black; font-weight: bold;}') + self.simple_status[idx].setText(ramping) + QApplication.processEvents() + time.sleep(0.5) + is_standby = self.is_sector_standby(sector, None, None) + if standby and is_standby: + ready = True + break; + elif not standby and not is_standby: + ready = True + break; + + #Activate + #if not ready: + self.simple_standby[idx].setEnabled(standby_enabled) + self.simple_awake[idx].setEnabled(awake_enabled) + + pv = self.settings.data[sector]['device'][0] + "-SOL:2.PROC" + stat = self.cafe.set(pv, 1) + self.check_status(_pymodule, "set", pv, stat, _line()) + + QApplication.processEvents() +