diff --git a/.gitignore b/.gitignore index 2cfe147..b63ea8b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ hush_devl.sh +reset_lis *.*~ *.*-* *.*+* diff --git a/end_of_year_reset b/end_of_year_reset new file mode 100644 index 0000000..5ef4704 --- /dev/null +++ b/end_of_year_reset @@ -0,0 +1,19 @@ +caput "ZIP2-HUSH:SEQ-ONOFF" 0 +caput "ZIP2-HUSH:SEQ-ONOFF" 1 +caput "ZIP2-HUSH:TOTSAVE" 0 +caput "ZIW2-HUSH:SEQ-ONOFF" 0 +caput "ZIW2-HUSH:SEQ-ONOFF" 1 +caput "ZIW2-HUSH:TOTSAVE" 0 +caput "ZPK1-HUSH:SEQ-ONOFF" 0 +caput "ZPK1-HUSH:SEQ-ONOFF" 1 +caput "ZPK1-HUSH:TOTSAVE" 0 +caput "ZPK2-HUSH:SEQ-ONOFF" 0 +caput "ZPK2-HUSH:SEQ-ONOFF" 1 +caput "ZPK2-HUSH:TOTSAVE" 0 +caput "ZSINQ-HUSH:SEQ-ONOFF" 0 +caput "ZSINQ-HUSH:SEQ-ONOFF" 1 +caput "ZSINQ-HUSH:TOTSAVE" 0 +caput "ZUCN-HUSH:SEQ-ONOFF" 0 +caput "ZUCN-HUSH:SEQ-ONOFF" 1 +caput "ZUCN-HUSH:TOTSAVE" 0 +caput "ZHIPA-HUSH:TOTSAVE" 0 \ No newline at end of file diff --git a/hush.json b/hush.json index c4f0244..137f5cc 100755 --- a/hush.json +++ b/hush.json @@ -9,6 +9,8 @@ "hdf": { "destination" : "./" }, + + "IP2":{ "standby": [-10.0025, 10.0025, 10.0025, 0.05, 0.05, 40.000, 0.05, 0.005, 10.0025, -10.0025, 10.0025, 0.1392, -25.006, 0.05, 0.05, 2.175, @@ -22,7 +24,7 @@ 1.487, 0.885, 0.028, 0.000, 8.026, 0.001, 0.000, 0.776, 0.006, 0.496, 0.237, 0.006, 0.013, 0.002, 0.003, 0.233, 0.187], - "iocDevice" : ["AYB", "AYD","QYA7"] + "iocDevice" : ["AYB", "AYD", "QYA7"] }, "IW2":{ "standby": [-5.001, 5.001, 0.05, -5.001, 5.001, 5.001, -5.001, 0.05, @@ -40,7 +42,7 @@ 0.000, 0.457, 1.264, 40.576, 2.030, 37.721, 0.000, 0.622, 0.642, 0.117, 0.883, 0.015, 57.955, 0.002, 0.042, 0.000, 82.413, 119.657], - "iocDevice" : ["AXD", "AXE","ANC"] + "iocDevice" : ["AXD", "AXE", "ANC"] }, "PK1":{ "standby": [56.791, 0.05, -2.0005, 2.0005, 0.05, 0.05, 44.9525, -2.0005, @@ -49,7 +51,7 @@ -13.558, -70.330, 89.133, -85.226, 7.834, -20.279, 1096.418], "pwrref" : [181.888, 0.001, 0.081, 0.003, 0.079, 0.104, 125.121, 0.003, 0.037, 0.148, 1.743, 1.531, 0.013, 0.088, 26.241], - "iocDevice" : ["AHB", "AHC","ABS"] + "iocDevice" : ["AHC", "QHTC5", "ABS"] }, "PK2":{ @@ -65,7 +67,7 @@ 75.620, 5.467, 5.567, 0.042, 1.187, 14.101, 40.852, 12.158, 0.001, 0.021, 0.002, 0.675, 6.471, 33.538, 15.411, 42.646, 0.000, 42.081, 62.808, 0.000], - "iocDevice" : ["AHD1", "AHD2","AHL"] + "iocDevice" : ["AHD1", "AHD2", "AHL"] }, "SINQ":{ @@ -87,8 +89,12 @@ -220.024, 404.640, 83.663, -65.592, -11.409, 406.150, 317.827], "pwrref" : [7.037, 2.681, 2.353, 0.074, 0.106, 0.002, 0.006, 4.301, 4.091, 45.333, 1.385, 0.857, 0.064, 44.196, 8.692], - "iocDevice" : ["ABT", "ABK1","ABK2"] + "iocDevice" : ["ABT", "ABK1", "ABK2"] }, + "RestoreUCN":{ + "PV" : ["ZHIPA-HUSH:RESTORE-UCN-ABK1", "ZHIPA-HUSH:RESTORE-UCN-ABK2"], + "value" : [404.418, 405.291] + }, "Parameters":{ diff --git a/hush.py b/hush.py index 53e0324..27f56ca 100644 --- a/hush.py +++ b/hush.py @@ -112,9 +112,9 @@ class StartMain(BaseWindow): sector = ["
IP2: ","
IW2: ","
PK1: ", "
PK2: ","
SNQ: ", "
UCN: ","
------------------
Tot: "] - pvlist = ['SEC-IP2:TOTSAVE', 'SEC-IW2:TOTSAVE', 'SEC-PK1:TOTSAVE', - 'SEC-PK2:TOTSAVE', 'SEC-SINQ:TOTSAVE', 'SEC-UCN:TOTSAVE', - 'HUSH:TOTSAVE'] + pvlist = ['ZIP2-HUSH:TOTSAVE', 'ZIW2-HUSH:TOTSAVE', 'ZPK1-HUSH:TOTSAVE', + 'ZPK2-HUSH:TOTSAVE', 'ZSINQ-HUSH:TOTSAVE', 'ZUCN-HUSH:TOTSAVE', + 'ZHIPA-HUSH:TOTSAVE'] value, stat, stat_list =self.cafe.getScalarList(pvlist, cacheFlag=True) diff --git a/hush.sh b/hush.sh index bc1e404..e0fd73f 100755 --- a/hush.sh +++ b/hush.sh @@ -1,5 +1,5 @@ #!/bin/bash -cd /hipa/bd/applications/hush/hla/1.0.0 +cd /hipa/bd/applications/hush/hla/1.2.0 # For use if script is sourced rather than executed appNameDefault="hush.sh" @@ -35,15 +35,17 @@ fi echo "PYTHON_VERSION $PYTHON_VERSION" - -_EPICS_HOST_ARCH=${EPICS_HOST_ARCH} +_EPICS_HOST_ARCH=${RHREL}-x86_64 +#_EPICS_HOST_ARCH=${EPICS_HOST_ARCH} . /opt/gfa/python $PYTHON_VERSION #/sf/bd/applications/OnlineModel/current/PythonModule:/sf/bd/applications/OnlineModel/current #/sf/bd/applications/OnlineModel/default/scripts/VA: #C_EXT version for Py 3.7: -export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.18.0/lib/${_EPICS_HOST_ARCH}:/hipa/bd/applications/deps/apps4ops/v1.6.0 + +export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/${_EPICS_HOST_ARCH}:/hipa/bd/applications/deps/apps4ops/v1.6.0 +#export PYTHONPATH=.:/opt/gfa/cafe/python/pycafe/cafe-1.19.3/lib/RHEL8-x86_64:/hipa/bd/applications/deps/apps4ops/v1.6.0 #:/afs/psi.ch/intranet/SLS/Controls/BD/pyqtacc/v1.5.2 diff --git a/pyrcc5/__pycache__/hush_resources.cpython-37.pyc b/pyrcc5/__pycache__/hush_resources.cpython-37.pyc index 170f592..bd9bde5 100644 Binary files a/pyrcc5/__pycache__/hush_resources.cpython-37.pyc and b/pyrcc5/__pycache__/hush_resources.cpython-37.pyc differ diff --git a/src/gui.py b/src/gui.py index e284cb2..69bf9d3 100644 --- a/src/gui.py +++ b/src/gui.py @@ -43,6 +43,8 @@ class AppGui(QWidget): self.parent = parent self.cafe = self.parent.cafe self.cyca = self.parent.cyca + + self.send_to_log_window = self.parent.send_to_log_window self.gui_frame = self.parent.gui_frame self.gui_header = self.parent.gui_header self.font_gui = self.parent.gui_frame.font_gui @@ -70,15 +72,23 @@ class AppGui(QWidget): self.offtime_dict = {} self.I_min = 1.0 + self.with_rf = False - sec_state_list = ['SEC-IP2:STATE','SEC-IW2:STATE','SEC-PK1:STATE','SEC-PK2:STATE', - 'SEC-SINQ:STATE','SEC-UCN:STATE'] + #sec_state_list = ['SEC-IP2:STATE','SEC-IW2:STATE','SEC-PK1:STATE', + # 'SEC-PK2:STATE','SEC-SINQ:STATE','SEC-UCN:STATE'] + + sec_state_list = ['ZIP2-HUSH:STATE', 'ZIW2-HUSH:STATE', + 'ZPK1-HUSH:STATE', 'ZPK2-HUSH:STATE', + 'ZSINQ-HUSH:STATE', 'ZUCN-HUSH:STATE'] self.cafe.openPrepare() - self.cafe.open(['HUSH:LASTPWR','HUSH:TOTPWR','HUSH:LASTSAVE','HUSH:TOTSAVE']) + self.cafe.open(['ZHIPA-HUSH:LASTPWR','ZHIPA-HUSH:TOTPWR', + 'ZHIPA-HUSH:LASTSAVE', 'ZHIPA-HUSH:TOTSAVE']) self.cafe.open(sec_state_list) + self.cafe.open("UCN:BEAMREQ:STATUS") self.cafe.openNowAndWait(0.1) + self.cafe.monitor("UCNQ:BEAMREQ:STATUS") wgt = self.group_sector_qtabwidget() self.gui_frame.measurement_layout.addWidget( @@ -107,11 +117,44 @@ class AppGui(QWidget): pk1_line = ["IW2"] pk2_line = ["IW2"] - def enable_disable_end(sector, sector_line, value): - self.sectorI_dict[sector] = value + def enable_disable_ucn(sect, sector_line, value): + self.sectorI_dict[sect] = value + + beam_req_running = True + beam_req_status = self.cafe.getCache("UCNQ:BEAMREQ:STATUS") + #print(" beam_req_status", beam_req_status, flush=True) + + if beam_req_status is not None: + if beam_req_status == "stopped": + beam_req_running = False + + for sector in sector_line: - if self.sectorI_dict['UCN'] > self.I_min or self.sectorI_dict[ - 'SINQ'] > self.I_min: + beam_req_flag = True + if sector == 'UCN': + beam_req_flag = beam_req_running + + #if self.sectorI_dict['UCN'] > self.I_min or self.sectorI_dict[ + # 'SINQ'] > self.I_min: + if self.sectorI_dict[sector] > self.I_min or beam_req_flag: + if self.table_sol_dict[ + sector].standby_value_button.isEnabled(): + self.table_sol_dict[ + sector].standby_value_button.setEnabled(False) + + else: + if not self.table_sol_dict[ + sector].standby_value_button.isEnabled(): + self.table_sol_dict[ + sector].standby_value_button.setEnabled(True) + + + def enable_disable_end(sect, sector_line, value): + self.sectorI_dict[sect] = value + for sector in sector_line: + #if self.sectorI_dict['UCN'] > self.I_min or self.sectorI_dict[ + # 'SINQ'] > self.I_min: + if self.sectorI_dict[sector] > self.I_min: if self.table_sol_dict[ sector].standby_value_button.isEnabled(): self.table_sol_dict[ @@ -121,9 +164,10 @@ class AppGui(QWidget): sector].standby_value_button.isEnabled(): self.table_sol_dict[ sector].standby_value_button.setEnabled(True) + - def enable_disable_pk(sector, sector_line, value): - self.sectorI_dict[sector] = value + def enable_disable_pk(sect, sector_line, value): + self.sectorI_dict[sect] = value for sector in sector_line: if self.sectorI_dict['PK1'] > self.I_min or self.sectorI_dict[ 'PK2'] > self.I_min: @@ -136,10 +180,11 @@ class AppGui(QWidget): sector].standby_value_button.isEnabled(): self.table_sol_dict[ sector].standby_value_button.setEnabled(True) + def receive_ucn_update(value, status, alarm_severity): - enable_disable_end('UCN', ucn_line, value) + enable_disable_ucn('UCN', ucn_line, value) def receive_sinq_update(value, status, alarm_severity): enable_disable_end('SINQ', sinq_line, value) def receive_pk1_update(value, status, alarm_severity): @@ -158,12 +203,43 @@ class AppGui(QWidget): def receive_sec_state(handle, pv, pvdata): - #print(pv) - #pvdata.show() - pvsplit = pv.split(":") - secsplit = pvsplit[0].split("SEC-") + + pvsplit = pv.split("-") + secsplit = pvsplit[0].split("Z") sec = secsplit[1] - if pvdata.value[0] == 'ON': + + #But is SHIFTTYPE CORRECT? + #is_shift_type_ok = True + ##shift_type = self.cafe.getCache("ZORG:SHIFT-TYPE", 'str') + ##if shift_type is not None: + ## if shift_type not in ['Produktion', 'Strahlentwicklung']: + ## is_shift_type_ok = False + def already_in_standby(): + devices = self.settings.data[sec]["iocDevice"] + pv_list = [] + for magnet in devices: + pv_list.append(magnet + ":SOL:2") + value_list, status, status_list = self.cafe.getScalarList( + pv_list, cacheFlag=True) + print("valuelist", pv_list, value_list) + if status != self.cyca.ICAFE_NORMAL: + self.check_status_list(pv_list, status_list, _line()) + #get standby values: + standby_value_list = [] + for magnet in devices: + idx = self.settings.data[sec]["device"].index(magnet) + standby_value = self.settings.data[sec]["standby"][idx] + standby_value_list.append(standby_value) + + 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 + print("is_standby", in_standby, flush=True) + return in_standby + + if pvdata.value[0] == 'ON' and not already_in_standby(): #print("sec-ON", secsplit[1], flush=True) self.table_sol_dict[sec].init_value_button.setEnabled(True) self.table_pwr_dict[sec].init_value_button.setEnabled(True) @@ -175,7 +251,8 @@ class AppGui(QWidget): #print("sec", secsplit[1], flush=True) for state in sec_state_list: - self.cafe.monitor(state, receive_sec_state) + self.cafe.monitor(state, receive_sec_state) + @@ -245,16 +322,16 @@ class AppGui(QWidget): qtot.setFont(fnt) qgrid.addWidget(qtot, _row+1, 0, 1, 1) qgrid.addWidget( - CAQLineEdit(self, pv_name="HUSH:LASTPWR", show_units=True), + CAQLineEdit(self, pv_name="ZHIPA-HUSH:LASTPWR", show_units=True), _row+1, 1, 1, 1) qgrid.addWidget( - CAQLineEdit(self, pv_name="HUSH:TOTPWR", show_units=True), + CAQLineEdit(self, pv_name="ZHIPA-HUSH:TOTPWR", show_units=True), _row+1, 2, 1, 1) qgrid.addWidget( - CAQLineEdit(self, pv_name="HUSH:LASTSAVE", show_units=False), + CAQLineEdit(self, pv_name="ZHIPA-HUSH:LASTSAVE", show_units=False), _row+1, 3, 1, 1) qgrid.addWidget( - CAQLineEdit(self, pv_name="HUSH:TOTSAVE", show_units=False), + CAQLineEdit(self, pv_name="ZHIPA-HUSH:TOTSAVE", show_units=False), _row+1, 5, 1, 1) qgrid.setContentsMargins(9, 20, 9, 9) @@ -277,7 +354,8 @@ class AppGui(QWidget): def sector_status(self, sector): '''Create each sector line for inclusion into group ''' - device = "SEC-" + sector + #device = "SEC-" + sector + device = "Z" + sector + "-HUSH" #Qlabel qsector = QLabel(sector+":") f = qsector.font() @@ -307,6 +385,8 @@ class AppGui(QWidget): #print("device", device, flush=True) def cb_outtime(handle, pv, pvdata): + #print(handle, pv, flush=True) + #pvdata.show() try: _delta = "{}".format(str(timedelta(seconds=(pvdata.value[0])))) if ", " in _delta: @@ -316,8 +396,10 @@ class AppGui(QWidget): if 'days,' in _delta: _delta = _delta.replace("days,", "d") elif 'day,' in _delta: - _delta = _delta.replace("day,", "d") - self.offtime_dict[pv].setText(_delta) + _delta = _delta.replace("day,", "d") + #print(_delta, flush=True) + self.offtime_dict[pv].setText(_delta) + #print("after setText:", _delta, flush=True) except KeyError: pass @@ -329,14 +411,10 @@ class AppGui(QWidget): qpnow = CAQLineEdit(self, pv_name=pv_pwr_tot, show_units=False) qpsave = CAQLineEdit(self, pv_name=pv_pwr_saved, show_units=False) qptotsave = CAQLineEdit(self, pv_name=pv_pwr_totsave, show_units=False) - qptime = CAQLineEdit(self, pv_name=pv_pwr_timeout, monitor_callback=cb_outtime, show_units=True) self.offtime_dict[pv_pwr_timeout] = qptime - - - qptime.setFixedWidth(104) #qtdis = QBasicTimer() @@ -401,18 +479,19 @@ class AppGui(QWidget): except ValueError: CR1IN_idx = 3 - table_pwr = [None] * 2 + table_pwr = [None] * 1 ##2 table_pwr[0] = CAQTableWidget( self, pv_list=pv_dict['IST:2'][0:CR1IN_idx], show_units=False, notify_freq_hz=0, suffix = "MW", notify_unison=False, scale_factor=0.001, show_timestamp=False, init_column=True, pv_list_show=device_list[0:CR1IN_idx]) - - table_pwr[1] = CAQTableWidget( - self, pv_list=pv_dict['IST:2'][CR1IN_idx:], show_units=False, - notify_freq_hz=0, suffix = "MW", - notify_unison=False, scale_factor=0.001, show_timestamp=False, - init_column=True, pv_list_show=device_list[CR1IN_idx:]) + + + #table_pwr[1] = CAQTableWidget( + # self, pv_list=pv_dict['IST:2'][CR1IN_idx:], show_units=False, + # notify_freq_hz=0, suffix = "MW", + # notify_unison=False, scale_factor=0.001, show_timestamp=False, + # init_column=True, pv_list_show=device_list[CR1IN_idx:]) for tab in table_pwr: header_item = QTableWidgetItem() @@ -448,7 +527,7 @@ class AppGui(QWidget): box = QVBoxLayout() box.addWidget(table_pwr[0]) - box.addWidget(table_pwr[1]) + ##box.addWidget(table_pwr[1]) box.setAlignment(Qt.AlignTop | Qt.AlignCenter) box.setSpacing(10) qw = QWidget() @@ -510,33 +589,98 @@ class AppGui(QWidget): sector = target.sector _table = self.table_sol_dict[sector] + def is_update_enabled(): + '''Check if update buttons are enabled + if NOT, then do not allow inital values values to be updated" + ''' + + if self.table_pwr_dict[sector].init_value_button.isEnabled() \ + and _table.init_value_button.isEnabled(): + return True + else: + return False + + def write_to_restore_ucn(): + if sector != 'UCN': + return + restore_pvs = self.settings.data['RestoreUCN']['PV'] + default_values = self.settings.data['RestoreUCN']['value'] + #print(restore_pvs, default_values, flush=True) + values_dict = self.table_sol_dict['UCN'].get_init_values() + #print(values_dict, flush=True) + values = [] + pvs = [] + for pv, val in zip(restore_pvs, default_values): + pv_indict = pv[-4:] + ":SOL:2" + try: + _val = values_dict[pv_indict] + if _val > 0.8 * val: + pvs.append(pv) + values.append(_val) + except KeyError as ex: + print("ex", ex) + + + if pvs: + status, status_list = self.cafe.setScalarList(pvs, values) + if status != self.cyca.ICAFE_NORMAL: + self.send_to_log_window(pv_list=pvs, status=status, + status_list=status_list, + operation='set', pymodule=_pymodule, + line=_line()) + + + if sector == 'UCN': + write_to_restore_ucn() + + QApplication.processEvents(QEventLoop.AllEvents, 1.0) + #Do NOT do updates if in standby mode! + #Update button is disabled when in standby + + #disenable widgets to avoid circular behaviour since #updates of SOL also update PWR, and vice-versa - self.table_pwr_dict[sector].init_value_button.setEnabled(False) - _table.init_value_button.click() - time.sleep(0.05) - self.table_pwr_dict[sector].init_value_button.setEnabled(True) - - _table.init_value_button.setEnabled(False) - self.table_pwr_dict[sector].init_value_button.click() - time.sleep(0.05) - self.table_sol_dict[sector].init_value_button.setEnabled(True) - - QApplication.processEvents(QEventLoop.AllEvents, 1.0) + #Do not click if already on standby!! + 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) + + _table.init_value_button.setEnabled(False) + self.table_pwr_dict[sector].init_value_button.click() + time.sleep(0.05) + self.table_sol_dict[sector].init_value_button.setEnabled(True) + + QApplication.processEvents(QEventLoop.AllEvents, 1.0) + + + if not self.input_parameters['simulation']: + if sector == 'UCN': + write_to_restore_ucn() status, status_list, pv_list = _table.set_standby_values() if status != self.cyca.ICAFE_NORMAL: self.check_status_list(pv_list, status_list, _line()) - pv = 'SEC-' + target.sector + ":STATE" - stat = self.cafe.set(pv, 0) - self.check_status(pv, stat, _line()) - + #Seqeuncer ONLY determines when to go into STANDBY mode + #and NOT the HLA + ##pv = 'Z' + target.sector + "-HUSH:STATE" + ##stat = self.cafe.set(pv, 0) + ##self.check_status(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) + + def on_sector_restore(self): target = self.sender() sector = target.sector @@ -548,15 +692,19 @@ class AppGui(QWidget): if status != self.cyca.ICAFE_NORMAL: self.check_status_list(pv_list, status_list, _line()) - pv = 'SEC-' + target.sector + ":STATE" - stat = self.cafe.set(pv, 1) - self.check_status(pv, stat, _line()) + + #Seqeuncer ONLY determines when to go into STANDBY mode + #and NOT the HLA + #pv = 'Z' + target.sector + "-HUSH:STATE" + #stat = self.cafe.set(pv, 1) + #self.check_status(pv, stat, _line()) _table_pwr = self.table_pwr_dict[sector] row_pwr_dict = _table_pwr.get_init_values() sum_pwr = sum(list(row_pwr_dict.values())) - pv_last_pwr = 'SEC-' + target.sector + ":LASTPWR" - + #pv_last_pwr = 'SEC-' + target.sector + ":LASTPWR" + pv_last_pwr = 'Z' + target.sector + "-HUSH:LASTPWR" + stat = self.cafe.set(pv_last_pwr, sum_pwr) self.check_status(pv_last_pwr, stat, _line()) @@ -706,7 +854,8 @@ class AppGui(QWidget): table_pwr.init_value_button.click() time.sleep(0.1) table_sol.init_value_button.setEnabled(True) - pv = "SEC-" + table_pwr.init_value_button.sector + ":LASTPWR" + #pv = "SEC-" + table_pwr.init_value_button.sector + ":LASTPWR" + pv = "Z" + table_pwr.init_value_button.sector + "-HUSH:LASTPWR" _sum = sum(table_pwr.get_init_values().values()) #print("SUM up all the values", pv, _sum, flush=True) stat = self.cafe.set(pv, _sum)