diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..190d90d2c7182f67b609ff98b5270b682bc3e0a9 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +NAME = sl-monitor-gui +MAIN = sl-monitor.py + +DIRNAME = $(NAME:-gui=) +PY_FILES += $(wildcard src/*.py) + +default: bin ${PY_FILES} + @cp ${PY_FILES} bin/${DIRNAME} + @echo "#!/bin/bash\nexec ${DIRNAME}/${MAIN}" > bin/${NAME} + @chmod +x bin/${NAME} bin/${DIRNAME}/${MAIN} + +bin: + @test -d $@ || mkdir -p $@/${DIRNAME} + +clean: + @rm -fr bin/ src/*~ + +.PHONY: clean diff --git a/src/sl-monitor.py b/src/sl-monitor.py new file mode 100755 index 0000000000000000000000000000000000000000..10fff3e9aa80c234ca30fa378ea6aa6eb3557553 --- /dev/null +++ b/src/sl-monitor.py @@ -0,0 +1,1387 @@ +#!/usr/bin/python + +# carico moduli +import os +import csv +import time +import random +import PyTango +from PyQt4.QtCore import * +from PyQt4.QtGui import * +import sys + +try: + stile = sys.argv[1] +except: + stile = '' + +global nomefile +#nomefile = '/home/lfo/devel/fermi/panels/laser/slmonitor/listoneseed.csv' +nomefile = '/home/lfo/runtime/panels/etc/listoneseed.csv' +global devprodic +devprodic = {} +devprodic['sl/laser/calendar_sl.01'] = PyTango.DeviceProxy('sl/laser/calendar_sl.01') +giocaconnoi = devprodic['sl/laser/calendar_sl.01'].activityNum +giocaconnoi = 1 +if giocaconnoi == 0: + sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 1 +elif giocaconnoi == 1: + sistemi = 1#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 1 +elif giocaconnoi == 2: + sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 1 +elif giocaconnoi == 3: + sistemi = 1#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 1 +elif giocaconnoi == 4: + sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 1 +elif giocaconnoi == 5: + sistemi = 1#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 1 +elif giocaconnoi == 6: + sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 1 +elif giocaconnoi == 7: + sistemi = 2#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 2 +elif giocaconnoi == 8: + sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 2 +elif giocaconnoi == 9: + sistemi = 2#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 2 +elif giocaconnoi == 10: + sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 1 +elif giocaconnoi == 11: + sistemi = 12#1 -> elite1 only, 2 -> elite2 only, 12 -> elite1 & elite2 + fel = 2 +devprodic['sl/laser/evops_sl.01'] = PyTango.DeviceProxy('sl/laser/evops_sl.01') +devprodic['sl/laser/evops_sl.03'] = PyTango.DeviceProxy('sl/laser/evops_sl.03') +devprodic['sl/misc/ranges'] = PyTango.DeviceProxy('sl/misc/ranges') +devprodic['sl/delay/sdg_slr.01'] = PyTango.DeviceProxy('sl/delay/sdg_slr.01') +devprodic['sl/delay/sdg_slr.02'] = PyTango.DeviceProxy('sl/delay/sdg_slr.02') +devprodic['sl/timing/tmu_sl.01'] = PyTango.DeviceProxy('sl/timing/tmu_sl.01') +devprodic['f/timing/rttrigger_sl.01'] = PyTango.DeviceProxy('f/timing/rttrigger_sl.01') +devprodic['f/timing/rttrigger_sl.02'] = PyTango.DeviceProxy('f/timing/rttrigger_sl.02') +devprodic['f/timing/rttrigger_sl.03'] = PyTango.DeviceProxy('f/timing/rttrigger_sl.03') +if fel == 1: + devprodic['superclaudio'] = PyTango.DeviceProxy('fel01/master/master_fel01.01') +elif fel ==2: + devprodic['superclaudio'] = PyTango.DeviceProxy('fel02/master_s01/master_s01_fel02.01') +else: + devprodic['superclaudio'] = PyTango.DeviceProxy('fel01/master/master_fel01.01') + + +class MainWindow(QDialog): + def __init__(self, parent = None): + super(MainWindow, self).__init__(parent) + self.tempodiriferimento = 0 + print(sistemi) + # creo gli elementi e ne aggiusto le proprieta + self.Slabel_title = QLabel("SEED") + self.Slabel_title.setFont(font_grande) + self.Sbutton_distruzioni = QPushButton("?") + self.Sbutton_distruzioni.setMaximumWidth(20) + self.Sbutton_distruzioni.setStyleSheet("background-color: light gray") + self.Sprogressbar = QProgressBar() + self.Sprogressbar.setMinimum(0) + self.Sprogressbar.setMaximum(100) + self.Sprogressbar.setValue(0) + self.Sprogressbar.setFont(font_piccolo) + self.Sprogressbar.setStyleSheet("background-color: white") + self.Sstato_L = QLabel('State:') + self.Sstato_R = QLineEdit('') +# self.Sbutton_on = QPushButton("ON") +# self.Sbutton_on.setFont(font_medio) +# self.Sbutton_on.setStyleSheet("background-color: light gray") +# self.Sbutton_standby = QPushButton("STANDBY") +# self.Sbutton_standby.setFont(font_medio) +# self.Sbutton_standby.setStyleSheet("background-color: light gray") +# self.Sbutton_off = QPushButton("OFF") +# self.Sbutton_off.setFont(font_medio) +# self.Sbutton_off.setStyleSheet("background-color: light gray") + self.Sbutton_manutenzione = QPushButton("Maintenance") + self.Sbutton_manutenzione.setFont(font_medio) + self.Sbutton_manutenzione.setStyleSheet("background-color: light gray") + self.Sbutton_manutenzione.setDisabled(0) + self.Sbutton_svistalaser = QPushButton("Quick view") + self.Sbutton_svistalaser.setStyleSheet("background-color: light gray") + self.Slineedit_cont = QLineEdit("Controls") + self.Slineedit_cont.setReadOnly(1) + self.Slineedit_cont.setFont(font_piccolo) + self.Slineedit_cont.setStyleSheet("background-color: white") + self.Sbutton_cont = QPushButton("Show") + self.Sbutton_cont.setFont(font_piccolo) + self.Sbutton_cont.setStyleSheet("background-color: light gray") + self.Sbutton_cont.impronta = "Controls" + self.Slineedit_temp = QLineEdit("Temperature") + self.Slineedit_temp.setReadOnly(1) + self.Slineedit_temp.setFont(font_piccolo) + self.Slineedit_temp.setStyleSheet("background-color: white") + self.Sbutton_temp = QPushButton("Show") + self.Sbutton_temp.setFont(font_piccolo) + self.Sbutton_temp.setStyleSheet("background-color: light gray") + self.Sbutton_temp.impronta = "Temperature" + self.Slineedit_trg = QLineEdit("Trigger") + self.Slineedit_trg.setReadOnly(1) + self.Slineedit_trg.setFont(font_piccolo) + self.Slineedit_trg.setStyleSheet("background-color: white") + self.Sbutton_trg = QPushButton("Show") + self.Sbutton_trg.setFont(font_piccolo) + self.Sbutton_trg.setStyleSheet("background-color: light gray") + self.Sbutton_trg.impronta = "Trigger" + self.Slineedit_osc = QLineEdit("Oscillator") + self.Slineedit_osc.setReadOnly(1) + self.Slineedit_osc.setFont(font_piccolo) + self.Slineedit_osc.setStyleSheet("background-color: white") + self.Sbutton_osc = QPushButton("Show") + self.Sbutton_osc.setFont(font_piccolo) + self.Sbutton_osc.setStyleSheet("background-color: light gray") + self.Sbutton_osc.impronta = "Oscillator" + self.Slineedit_loc = QLineEdit("Locking") + self.Slineedit_loc.setReadOnly(1) + self.Slineedit_loc.setFont(font_piccolo) + self.Slineedit_loc.setStyleSheet("background-color: white") + self.Sbutton_loc = QPushButton("Show") + self.Sbutton_loc.setFont(font_piccolo) + self.Sbutton_loc.setStyleSheet("background-color: light gray") + self.Sbutton_loc.impronta = "Locking" + self.Slineedit_amp = QLineEdit("Amplifier") + self.Slineedit_amp.setReadOnly(1) + self.Slineedit_amp.setFont(font_piccolo) + self.Slineedit_amp.setStyleSheet("background-color: white") + self.Sbutton_amp = QPushButton("Show") + self.Sbutton_amp.setFont(font_piccolo) + self.Sbutton_amp.setStyleSheet("background-color: light gray") + self.Sbutton_amp.impronta = "Amplifier" + self.Slineedit_opa = QLineEdit("Opa") + self.Slineedit_opa.setReadOnly(1) + self.Slineedit_opa.setFont(font_piccolo) + self.Slineedit_opa.setStyleSheet("background-color: white") + self.Sbutton_opa = QPushButton("Show") + self.Sbutton_opa.setFont(font_piccolo) + self.Sbutton_opa.setStyleSheet("background-color: light gray") + self.Sbutton_opa.impronta = "Opa" + self.Slineedit_nrg = QLineEdit("Energy") + self.Slineedit_nrg.setReadOnly(1) + self.Slineedit_nrg.setFont(font_piccolo) + self.Slineedit_nrg.setStyleSheet("background-color: white") + self.Sbutton_nrg = QPushButton("Show") + self.Sbutton_nrg.setFont(font_piccolo) + self.Sbutton_nrg.setStyleSheet("background-color: light gray") + self.Sbutton_nrg.impronta = "Energy" + self.Slineedit_vun = QLineEdit("Virtual Undulator") + self.Slineedit_vun.setReadOnly(1) + self.Slineedit_vun.setFont(font_piccolo) + self.Slineedit_vun.setStyleSheet("background-color: white") + self.Sbutton_vun = QPushButton("Show") + self.Sbutton_vun.setFont(font_piccolo) + self.Sbutton_vun.setStyleSheet("background-color: light gray") + self.Sbutton_vun.impronta = "VirtualUN" + self.Slineedit_fbk = QLineEdit("Feedback") + self.Slineedit_fbk.setReadOnly(1) + self.Slineedit_fbk.setFont(font_piccolo) + self.Slineedit_fbk.setStyleSheet("background-color: white") + self.Sbutton_fbk = QPushButton("Show") + self.Sbutton_fbk.setFont(font_piccolo) + self.Sbutton_fbk.setStyleSheet("background-color: light gray") + self.Sbutton_fbk.impronta = "Feedback" + self.Sbutton_allin = QPushButton("Show all") + self.Sbutton_allin.setFont(font_piccolo) + self.Sbutton_allin.setStyleSheet("background-color: light gray") + self.Sbutton_configure = QPushButton("Configure") + self.Sbutton_configure.setFont(font_piccolo) + self.Sbutton_configure.setStyleSheet("background-color: light gray") + self.Serrorbox = QListWidget() + voce = time.ctime()[4:19] + ' ready' + self.Serrorbox.insertItem(0, voce) + self.Serrorbox.setFont(font_moltopiccolo) + # assegno gli oggetti a diversi layout e creo i layout + Slayout = QVBoxLayout() + Slayout_0 = QHBoxLayout() + Slayout_0.addWidget(self.Slabel_title) + Slayout_0.addWidget(self.Sbutton_distruzioni) + Slayout.addLayout(Slayout_0) + if stile == 'allarmi': + chepalle = QLabel("with alarms") + chepalle.setFont(font_medio) + Slayout.addWidget(chepalle) + Slayout.addWidget(self.Sprogressbar) + +# Slayout.addWidget(self.Sbutton_on) +# Slayout.addWidget(self.Sbutton_standby) + Slayout_1 = QHBoxLayout() +# Slayout_1.addWidget(self.Sbutton_off) +# Slayout_1.addWidget(self.Sbutton_manutenzione) + Slayout_1.addWidget(self.Sstato_L) + Slayout_1.addWidget(self.Sstato_R) + Slayout.addLayout(Slayout_1) + Slayout.addWidget(self.Sbutton_manutenzione) + Slayout.addWidget(self.Sbutton_svistalaser) + contSlayout = QHBoxLayout() + contSlayout.addWidget(self.Slineedit_cont) + contSlayout.addWidget(self.Sbutton_cont) + tempSlayout = QHBoxLayout() + tempSlayout.addWidget(self.Slineedit_temp) + tempSlayout.addWidget(self.Sbutton_temp) + trgSlayout = QHBoxLayout() + trgSlayout.addWidget(self.Slineedit_trg) + trgSlayout.addWidget(self.Sbutton_trg) + oscSlayout = QHBoxLayout() + oscSlayout.addWidget(self.Slineedit_osc) + oscSlayout.addWidget(self.Sbutton_osc) + locSlayout = QHBoxLayout() + locSlayout.addWidget(self.Slineedit_loc) + locSlayout.addWidget(self.Sbutton_loc) + ampSlayout = QHBoxLayout() + ampSlayout.addWidget(self.Slineedit_amp) + ampSlayout.addWidget(self.Sbutton_amp) + opaSlayout = QHBoxLayout() + opaSlayout.addWidget(self.Slineedit_opa) + opaSlayout.addWidget(self.Sbutton_opa) + nrgSlayout = QHBoxLayout() + nrgSlayout.addWidget(self.Slineedit_nrg) + nrgSlayout.addWidget(self.Sbutton_nrg) + vunSlayout = QHBoxLayout() + vunSlayout.addWidget(self.Slineedit_vun) + vunSlayout.addWidget(self.Sbutton_vun) + fbkSlayout = QHBoxLayout() + fbkSlayout.addWidget(self.Slineedit_fbk) + fbkSlayout.addWidget(self.Sbutton_fbk) + infondoSlayout = QHBoxLayout() + infondoSlayout.addWidget(self.Sbutton_configure) + infondoSlayout.addWidget(self.Sbutton_allin) + Slayout.addLayout(contSlayout) + Slayout.addLayout(tempSlayout) + Slayout.addLayout(trgSlayout) + Slayout.addLayout(oscSlayout) + Slayout.addLayout(locSlayout) + Slayout.addLayout(ampSlayout) + Slayout.addLayout(opaSlayout) + Slayout.addLayout(nrgSlayout) + Slayout.addLayout(vunSlayout) + Slayout.addLayout(fbkSlayout) + Slayout.addLayout(infondoSlayout) + Slayout.addWidget(self.Serrorbox) + self.setLayout(Slayout) + if stile == 'allarmi': + self.setWindowTitle("SEED monitor panel (alarms)") + else: + self.setWindowTitle("SEED monitor panel") + self.setStyleSheet("background-color: rgb(230, 255, 255)") + self.show() + #collego oggetti ed azioni + self.Sbutton_distruzioni.clicked.connect(self.istruzioni) +# self.Sbutton_on.clicked.connect(self.procedura_accensione) +# self.Sbutton_standby.clicked.connect(self.procedura_parcheggio) +# self.Sbutton_off.clicked.connect(self.procedura_spegnimento) + self.Sbutton_cont.clicked.connect(self.Show) + self.Sbutton_temp.clicked.connect(self.Show) + self.Sbutton_trg.clicked.connect(self.Show) + self.Sbutton_osc.clicked.connect(self.Show) + self.Sbutton_loc.clicked.connect(self.Show) + self.Sbutton_amp.clicked.connect(self.Show) + self.Sbutton_opa.clicked.connect(self.Show) + self.Sbutton_nrg.clicked.connect(self.Show) + self.Sbutton_vun.clicked.connect(self.Show) + self.Sbutton_fbk.clicked.connect(self.Show) + self.Sbutton_allin.clicked.connect(self.mostrami_tutto) + self.Sbutton_configure.clicked.connect(self.configurare) + self.Sbutton_manutenzione.clicked.connect(self.manutenzionefinta) + self.Sbutton_svistalaser.clicked.connect(lambda:os.system('python ///home/lfo/runtime/panels/bin/slassistente.py &')) + self.s = list #creo contenitore lista + #creo il timer + self.timer = QBasicTimer() + self.timer.start(10000, self) + self.update() + + def __del__(self): + devprodic['sl/misc/ranges'].write_attribute('On_Condition', 0) + self.timer.stop() + pass + + def timerEvent(self, event): + self.update() + + def update(self): + Controls_color = [] + Temperature_color = [] + Trigger_color = [] + Oscillator_color = [] + Locking_color = [] + Amplifier_color = [] + Opa_color = [] + Energy_color = [] + VirtualUN_color = [] + Feedback_color = [] + sounareononsuonare = [] + statoallarmi = 0 + # se il file e` stato aggiornato lo leggo, altrimenti passo direttamente a leggere dati dal database + if self.tempodiriferimento < os.path.getmtime(nomefile): + # aggiorno tempodiriferimento e leggo file + voce = time.ctime()[4:19] + ' carico file' + item = QListWidgetItem(str(voce)) + self.Serrorbox.insertItem(0, item) + self.tempodiriferimento = time.time() + with open(nomefile) as csvfile: + spamreader = csv.reader(csvfile, delimiter=',', quotechar='"') + self.s = [] + for row in spamreader: + # se non presente aggiungo il device proxy al dizionario + if row[1] in devprodic: + + pass + else: + devprodic[row[1]] = PyTango.DeviceProxy(row[1]) + #row[0]->Active + #1row[1]->Device + #2row[2]->Attribute + #3row[3]->Type + #4row[4]->Subsystem + #5row[5]-AlarmON + #6row[6]->AlarmCycles + #7row[7]->Autofix + #8row[8]->Description + #9row[9]->wikiReperibile + #10row[10]->wikiProcedure + #11row[11]->Script + #12row[12]->helpMessage + #devprodic[row[1]]->PyTango deviceproxy + self.s.append(elemento(str(row[0]), str(row[1]), str(row[2]), str(row[3]), str(row[4]), str(row[5]), str(row[6]), str(row[7]), str(row[8]), str(row[9]), str(row[10]), str(row[11]), str(row[12]), devprodic[row[1]])) + csvfile.close() + spamreader = None + for corridore in range(len(self.s)): + #print(self.p[corridore].Active) + if self.s[corridore].Active == '1': + try: + # lettura e confronto + self.s[corridore].lettura() + # assegnazione al sottosistema + if self.s[corridore].Subsystem == 'Controls': + Controls_color.append(self.s[corridore].ok) + elif self.s[corridore].Subsystem == 'Temperature': + Temperature_color.append(self.s[corridore].ok) + elif self.s[corridore].Subsystem == 'Trigger': + Trigger_color.append(self.s[corridore].ok) + elif self.s[corridore].Subsystem == 'Oscillator': + Oscillator_color.append(self.s[corridore].ok) + elif self.s[corridore].Subsystem == 'Locking': + Locking_color.append(self.s[corridore].ok) + elif self.s[corridore].Subsystem == 'Amplifier': + Amplifier_color.append(self.s[corridore].ok) + elif self.s[corridore].Subsystem == 'Opa': + Opa_color.append(self.s[corridore].ok) + elif self.s[corridore].Subsystem == 'Energy': + Energy_color.append(self.s[corridore].ok) + elif self.s[corridore].Subsystem == 'VirtualUN': + VirtualUN_color.append(self.s[corridore].ok) + elif self.s[corridore].Subsystem == 'Feedback': + Feedback_color.append(self.s[corridore].ok) + # allarme + if self.s[corridore].AlarmON == '1' and float(self.s[corridore].n_wrong) >= float(self.s[corridore].AlarmCycles): + statoallarmi = 1 + sounareononsuonare.append(1) + print(self.s[corridore].Device) + voce = time.ctime()[4:19] + ' ' + self.s[corridore].Device + '/' + self.s[corridore].Attribute + ' notok for ' + str(self.s[corridore].n_wrong) + ' times' + item = QListWidgetItem(str(voce)) + color = QColor(int(1),int(0),int(0)) + item.setTextColor(color) + self.Serrorbox.insertItem(0, item) + elif self.s[corridore].AlarmON == '1' and float(self.s[corridore].n_wrong) < float(self.s[corridore].AlarmCycles): + statoallarmi = 1 + sounareononsuonare.append(0) + except: +# print('errore in lettura attibuti dentro il metodo update') +# print(self.s[corridore].Attribute) +# print('') + voce = time.ctime()[4:19] + ' Error reading ' + self.s[corridore].Device + '/' + self.s[corridore].Attribute + ' in section update' + item = QListWidgetItem(str(voce)) + self.Serrorbox.insertItem(0, item) + ora = 100 * (corridore+1) / len(self.s) +# print(ora) +# print(self.s[corridore].Device + '/' + self.s[corridore].Attribute) +# print(' ' ) + self.Sprogressbar.setValue(ora) + time.sleep(0.015) + # beep allarmi + if stile == 'allarmi': + controllo = devprodic['sl/misc/ranges'].slalarm + if 1 in sounareononsuonare: + if controllo == True: + pass + else: + devprodic['sl/misc/ranges'].write_attribute('slalarm', True) + else: + if controllo == False: + pass + else: + devprodic['sl/misc/ranges'].write_attribute('slalarm', False) + # coloro pannello + if statoallarmi == 0: + self.Sbutton_manutenzione.setStyleSheet("background-color: #ff0000") + elif statoallarmi == 1: + self.Sbutton_manutenzione.setStyleSheet("background-color: light gray") + else: + self.Sbutton_manutenzione.setStyleSheet("background-color: #ffff00") + if 2 in Controls_color: + self.Slineedit_cont.setStyleSheet("background-color: #ff0000") + elif 1 in Controls_color: + self.Slineedit_cont.setStyleSheet("background-color: #ffff00") + elif 0 in Controls_color: + self.Slineedit_cont.setStyleSheet("background-color: #00ff00") + if 2 in Temperature_color: + self.Slineedit_temp.setStyleSheet("background-color: #ff0000") + elif 1 in Temperature_color: + self.Slineedit_temp.setStyleSheet("background-color: #ffff00") + elif 0 in Temperature_color: + self.Slineedit_temp.setStyleSheet("background-color: #00ff00") + if -99 in Trigger_color: + self.Slineedit_trg.setStyleSheet("background-color: #5555ff") + elif 2 in Trigger_color: + self.Slineedit_trg.setStyleSheet("background-color: #ff0000") + elif 1 in Trigger_color: + self.Slineedit_trg.setStyleSheet("background-color: #ffff00") + elif 0 in Trigger_color: + self.Slineedit_trg.setStyleSheet("background-color: #00ff00") + if 2 in Oscillator_color: + self.Slineedit_osc.setStyleSheet("background-color: #ff0000") + elif 1 in Oscillator_color: + self.Slineedit_osc.setStyleSheet("background-color: #ffff00") + elif 0 in Oscillator_color: + self.Slineedit_osc.setStyleSheet("background-color: #00ff00") + if 2 in Locking_color: + self.Slineedit_loc.setStyleSheet("background-color: #ff0000") + elif 1 in Locking_color: + self.Slineedit_loc.setStyleSheet("background-color: #ffff00") + elif 0 in Locking_color: + self.Slineedit_loc.setStyleSheet("background-color: #00ff00") + if 2 in Amplifier_color: + self.Slineedit_amp.setStyleSheet("background-color: #ff0000") + elif 1 in Amplifier_color: + self.Slineedit_amp.setStyleSheet("background-color: #ffff00") + elif 0 in Amplifier_color: + self.Slineedit_amp.setStyleSheet("background-color: #00ff00") + if 2 in Opa_color and len(Opa_color) > 0: + self.Slineedit_opa.setStyleSheet("background-color: #ff0000") + elif 1 in Opa_color and len(Opa_color) > 0: + self.Slineedit_opa.setStyleSheet("background-color: #ffff00") + elif 0 in Opa_color and len(Opa_color) > 0: + self.Slineedit_opa.setStyleSheet("background-color: #00ff00") + else: + self.Slineedit_opa.setStyleSheet("background-color: gray") + if 2 in Energy_color: + self.Slineedit_nrg.setStyleSheet("background-color: #ff0000") + elif 1 in Energy_color: + self.Slineedit_nrg.setStyleSheet("background-color: #ffff00") + elif 0 in Energy_color: + self.Slineedit_nrg.setStyleSheet("background-color: #00ff00") + if 2 in VirtualUN_color: + self.Slineedit_vun.setStyleSheet("background-color: #ff0000") + elif 1 in VirtualUN_color: + self.Slineedit_vun.setStyleSheet("background-color: #ffff00") + elif 0 in VirtualUN_color: + self.Slineedit_vun.setStyleSheet("background-color: #00ff00") + if 2 in Feedback_color: + self.Slineedit_fbk.setStyleSheet("background-color: #ff0000") + elif 1 in Feedback_color: + self.Slineedit_fbk.setStyleSheet("background-color: #ffff00") + elif 0 in Feedback_color: + self.Slineedit_fbk.setStyleSheet("background-color: #00ff00") + # analisi precondizioni accensione laser + if (2 not in Controls_color) and (2 not in Temperature_color) and (2 not in Trigger_color) and (2 not in Oscillator_color): + if devprodic['sl/misc/ranges'].On_Condition != 1: + try: + devprodic['sl/misc/ranges'].write_attribute('On_Condition',1) + except: + errore = 'sl/misc/ranges/On_Condition CommunicationFailed' + voce = time.ctime()[4:19] + ' ' + errore + item = QListWidgetItem(str(voce)) + color = QColor(int(1),int(0),int(0)) + item.setTextColor(color) + self.Serrorbox.insertItem(0, item) + else: + if devprodic['sl/misc/ranges'].On_Condition != 0: + try: + devprodic['sl/misc/ranges'].write_attribute('On_Condition',0) + except: + errore = 'sl/misc/ranges/On_Condition CommunicationFailed' + voce = time.ctime()[4:19] + ' ' + errore + item = QListWidgetItem(str(voce)) + color = QColor(int(1),int(0),int(0)) + item.setTextColor(color) + self.Serrorbox.insertItem(0, item) + # analisi condizione laser On,Standby,Off + if (2 not in Oscillator_color) and (2 not in Locking_color) and (2 not in Amplifier_color) and (2 not in Energy_color):# laser ON + self.Sstato_R.setText('ON') + self.Sstato_R.setStyleSheet("background-color: #00ff00") +# self.Sbutton_on.setStyleSheet("background-color: #00ff00") +# self.Sbutton_standby.setStyleSheet("background-color: light gray") +# self.Sbutton_off.setStyleSheet("background-color: light gray") + elif (2 not in Oscillator_color) and (2 not in Locking_color) and (2 in Amplifier_color) and (0 not in Energy_color):# laser STANDBY + self.Sstato_R.setText('STANDBY') + self.Sstato_R.setStyleSheet("background-color: #ff0000") +# self.Sbutton_on.setStyleSheet("background-color: light gray") +# self.Sbutton_standby.setStyleSheet("background-color: #00ff00") +# self.Sbutton_off.setStyleSheet("background-color: light gray") + elif (2 not in Oscillator_color) and (2 in Locking_color) and (0 not in Amplifier_color) and (0 not in Energy_color):# laser OFF + self.Sstato_R.setText('OFF') + self.Sstato_R.setStyleSheet("background-color: #ff0000") +# self.Sbutton_on.setStyleSheet("background-color: light gray") +# self.Sbutton_standby.setStyleSheet("background-color: light gray") +# self.Sbutton_off.setStyleSheet("background-color: #00ff00") + else:# unknown + self.Sstato_R.setText('UNKNOWN') + self.Sstato_R.setStyleSheet("background-color: #ff0000") +# self.Sbutton_on.setStyleSheet("background-color: light gray") +# self.Sbutton_standby.setStyleSheet("background-color: light gray") +# self.Sbutton_off.setStyleSheet("background-color: light gray") + self.Sprogressbar.setValue(0) + + def procedura_accensione(self): #fel1 elite1 + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Question) + self.msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) + self.msgBox.setText("...turning on SeedLaser. Are you sure you want to proceed?") + risp = self.msgBox.exec_() + if risp == 1024: #!!!!!!!!!!!!! + info = 'turning on SEED' + voce = time.ctime()[4:19] + ' ' + info + item = QListWidgetItem(str(voce)) + color = QColor(int(0),int(0),int(1)) + item.setTextColor(color) + self.Serrorbox.insertItem(0, item) + #leggo stato pompe + if sistemi == 1 or sistemi == 12: + C301 = devprodic['sl/laser/evops_sl.01'].Current + S301 = str(devprodic['sl/laser/evops_sl.01'].command_inout('State')) + if sistemi == 2 or sistemi == 12: + Crev = devprodic['sl/laser/evops_sl.03'].Current + Srev = str(devprodic['sl/laser/evops_sl.03'].command_inout('State')) + # accendo i laser che devono lavorare (in base a variabile sistemi) + if sistemi == 1 or sistemi == 12: + if S301 == 'ON' and C301 > 1: + devprodic['sl/laser/evops_sl.01'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_01_Current_set) + elif S301 == 'ON' and C301 < 1: + devprodic['sl/laser/evops_sl.01'].command_inout('Off') + time.sleep(1) + devprodic['sl/laser/evops_sl.01'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_01_Current_set) + time.sleep(0.2) + devprodic['sl/laser/evops_sl.01'].command_inout('Run') + time.sleep(0.2) + elif S301 != 'ON': + devprodic['sl/laser/evops_sl.01'].command_inout('Off') + time.sleep(1) + devprodic['sl/laser/evops_sl.01'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_01_Current_set) + time.sleep(0.2) + devprodic['sl/laser/evops_sl.01'].command_inout('Run') + time.sleep(0.2) + if sistemi == 2 or sistemi == 12: + if Srev == 'ON' and Crev > 1: + devprodic['sl/laser/evops_sl.03'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_03_Current_set) + elif Srev == 'ON' and Crev < 1: + devprodic['sl/laser/evops_sl.03'].command_inout('Off') + time.sleep(1) + devprodic['sl/laser/evops_sl.03'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_03_Current_set) + time.sleep(0.2) + devprodic['sl/laser/evops_sl.03'].command_inout('Run') + time.sleep(0.2) + elif Srev != 'ON': + devprodic['sl/laser/evops_sl.03'].command_inout('Off') + time.sleep(1) + devprodic['sl/laser/evops_sl.03'].write_attribute('Current', devprodic['sl/misc/ranges'].evops_sl_03_Current_set) + time.sleep(0.2) + devprodic['sl/laser/evops_sl.03'].command_inout('Run') + time.sleep(0.2) + Stmu = devprodic['sl/timing/tmu_sl.01'].LockStatus + # controllo locking + if Stmu != 'Locked on Cross Correlator Signal': + devprodic['sl/timing/tmu_sl.01'].command_inout('Lock') + time.sleep(60) + # controllo sdg + if sistemi == 1 or sistemi == 12: + devprodic['sl/delay/sdg_slr.01'].command_inout('ResetBwd') + time.sleep(1) + ssdg1 = devprodic['sl/timing/timing_sl.01'].PC1sdg1Enable + ssdg2 = devprodic['sl/timing/timing_sl.01'].PC2sdg1Enable + if ssdg1 == 0: + devprodic['sl/timing/timing_sl.01'].write_attribute('PC1sdg1Enable', 1) + if ssdg2 == 0: + devprodic['sl/timing/timing_sl.01'].write_attribute('PC2sdg1Enable', 1) + if sistemi == 2 or sistemi == 12: + devprodic['sl/delay/sdg_slr.02'].command_inout('ResetBwd') + time.sleep(1) + ssdg1 = devprodic['sl/timing/timing_sl.01'].PC1sdg2Enable + ssdg2 = devprodic['sl/timing/timing_sl.01'].PC2sdg2Enable + if ssdg1 == 0: + devprodic['sl/timing/timing_sl.01'].write_attribute('PC1sdg2Enable', 1) + if ssdg2 == 0: + devprodic['sl/timing/timing_sl.01'].write_attribute('PC2sdg2Enable', 1) + #verifiche + time.sleep(60) + check = 0 + Stmu = devprodic['sl/timing/tmu_sl.01'].LockStatus + if Stmu == 'Locked on Cross Correlator Signal': + check += 1 + if sistemi == 1 or sistemi == 12: + S301 = str(devprodic['sl/laser/evops_sl.01'].command_inout('State')) + if S301 == 'ON': + check += 1 + C301 = devprodic['sl/laser/evops_sl.01'].Current + if C301 >= devprodic['sl/misc/ranges'].evops_sl_01_Current_ok: + check += 1 + ssdg11 = devprodic['sl/timing/timing_sl.01'].PC1sdg1Enable + if ssdg11 == 1: + check += 1 + ssdg12 = devprodic['sl/timing/timing_sl.01'].PC2sdg1Enable + if ssdg12 == 1: + check += 1 + if sistemi == 2 or sistemi == 12: + Srev = str(devprodic['sl/laser/evops_sl.03'].command_inout('State')) + if Srev == 'ON': + check += 1 + Crev = devprodic['sl/laser/evops_sl.03'].Current + if Crev >= devprodic['sl/misc/ranges'].evops_sl_03_Current_ok: + check += 1 + ssdg21 = devprodic['sl/timing/timing_sl.01'].PC1sdg2Enable + if ssdg21 == 1: + check += 1 + ssdg22 = devprodic['sl/timing/timing_sl.01'].PC2sdg2Enable + if ssdg22 == 1: + check += 1 + if sistemi == 1: + goal = 5 + elif sistemi == 2: + goal = 5 + elif sistemi == 12: + goal = 9 + if check == goal: + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Information) + self.msgBox.setText("Procedure complete. Wait 30 minutes for laser warmed up.") + self.msgBox.exec_() + info = 'ON procedure complete' + voce = time.ctime()[4:19] + ' ' + info + item = QListWidgetItem(str(voce)) + color = QColor(int(0),int(0),int(1)) + item.setTextColor(color) + self.Serrorbox.insertItem(0, item) + else: + #procedura fallita, avvisa tutti + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Critical) + self.msgBox.setText("Procedure fail. You can try again or use manual procedure from WIKI.") + self.msgBox.exec_() + errore = 'ON procedure fail' + voce = time.ctime()[4:19] + ' ' + errore + item = QListWidgetItem(str(voce)) + color = QColor(int(1),int(0),int(0)) + item.setTextColor(color) + self.Serrorbox.insertItem(0, item) + self.attaccatutto() #abilito allarmi acustici + + def procedura_parcheggio(self): + # chiedi conferma + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Question) + self.msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) + self.msgBox.setText("Are you sure you want to put SEED in standby?") + risp = self.msgBox.exec_() + if risp == 1024: #!!!!!!!!!!!!!!!!!! + info = 'turning standby SEED' + voce = time.ctime()[4:19] + ' ' + info + item = QListWidgetItem(str(voce)) + self.Serrorbox.insertItem(0, item) + self.staccatutto() #disabilito allarmi acustici + voce = time.ctime()[4:19] + ' alarms OFF' + item = QListWidgetItem(str(voce)) + self.Serrorbox.insertItem(0, item) + # controllo stato laser + C301 = devprodic['sl/laser/evops_sl.01'].Current + S301 = str(devprodic['sl/laser/evops_sl.01'].command_inout('State')) + Crev = devprodic['sl/laser/evops_sl.03'].Current + Srev = str(devprodic['sl/laser/evops_sl.03'].command_inout('State')) + if S301 == 'ON' and C301 > 1: + devprodic['sl/laser/evops_sl.01'].write_attribute('Current', 10.0) + elif S301 == 'ON' and C301 < 1: + devprodic['sl/laser/evops_sl.01'].command_inout('Off') + time.sleep(1) + devprodic['sl/laser/evops_sl.01'].write_attribute('Current', 10.0) + time.sleep(0.2) + devprodic['sl/laser/evops_sl.01'].command_inout('Run') + time.sleep(0.2) + elif S301 != 'ON': + devprodic['sl/laser/evops_sl.01'].command_inout('Off') + time.sleep(1) + devprodic['sl/laser/evops_sl.01'].write_attribute('Current', 10.0) + time.sleep(0.2) + devprodic['sl/laser/evops_sl.01'].command_inout('Run') + time.sleep(0.2) + if Srev == 'ON' and Crev > 1: + devprodic['sl/laser/evops_sl.03'].write_attribute('Current', 10.0) + elif Srev == 'ON' and Crev < 1: + devprodic['sl/laser/evops_sl.03'].command_inout('Off') + time.sleep(1) + devprodic['sl/laser/evops_sl.03'].write_attribute('Current', 10.0) + time.sleep(0.2) + devprodic['sl/laser/evops_sl.03'].command_inout('Run') + time.sleep(0.2) + elif Srev != 'ON': + devprodic['sl/laser/evops_sl.03'].command_inout('Off') + time.sleep(1) + devprodic['sl/laser/evops_sl.03'].write_attribute('Current', 10.0) + time.sleep(0.2) + devprodic['sl/laser/evops_sl.03'].command_inout('Run') + time.sleep(0.2) + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Information) + self.msgBox.setText("Procedure complete. SEED is set to stanby condition.") + self.msgBox.exec_() + + def procedura_spegnimento(self): + # chiedi conferma + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Question) + self.msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) + self.msgBox.setText("Are you sure you want to turn OFF SeedLaser?") + risp = self.msgBox.exec_() + if risp == 1024: #!!!!!!!!!!!!!!!!!!!! + info = 'turning off SEED' + voce = time.ctime()[4:19] + ' ' + info + item = QListWidgetItem(str(voce)) + self.Serrorbox.insertItem(0, item) + self.staccatutto() #disabilito allarmi acustici + voce = time.ctime()[4:19] + ' alarms OFF' + item = QListWidgetItem(str(voce)) + self.Serrorbox.insertItem(0, item) + if sistemi == 1 or sistemi == 12: + devprodic['sl/laser/evops_sl.01'].command_inout('Off') + if sistemi == 2 or sistemi == 12: + devprodic['sl/laser/evops_sl.03'].command_inout('Off') + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Information) + self.msgBox.setText("Procedure complete. SEED is turned off.") + self.msgBox.exec_() + + def Show(self): + ditata = self.sender() + datinmostra = list() + for cammina in range(len(self.s)): + if self.s[cammina].Subsystem == ditata.impronta and self.s[cammina].Active == '1': + #"Help;description;VALUE;Device/Attribute;min alarm;min warning;max warning;max alarm;alarm:nwrong/alarmicycles:Subsystem" + #9 ok, 10 reperibile, 11 script, 12 procedura, 13 help + datinmostra.append([self.s[cammina].Description, str(self.s[cammina].read), self.s[cammina].Device + '/' + self.s[cammina].Attribute, str(self.s[cammina].ref[2]), str(self.s[cammina].ref[0]), str(self.s[cammina].ref[1]), str(self.s[cammina].ref[3]), str(self.s[cammina].n_wrong) + '/' + str(self.s[cammina].AlarmCycles), self.s[cammina].AlarmON, self.s[cammina].Subsystem, self.s[cammina].ok, self.s[cammina].wikiReperibile, self.s[cammina].Script, self.s[cammina].wikiProcedure, self.s[cammina].helpMessage]) + self.sipuofare = tabelliamo() + self.sipuofare.riempi(datinmostra) + self.sipuofare.setWindowTitle("Show " + ditata.impronta) + self.sipuofare.resize(screen.width()/2, 30+35*len(datinmostra)) + self.sipuofare.show() + + def mostrami_tutto(self): + datinmostra = list() + for cammina in range(len(self.s)): + if self.s[cammina].Active == '1': + #"Help;description;VALUE;Device/Attribute;min alarm;min warning;max warning;max alarm;alarm:nwrong/alarmicycles:Subsystem" + #9 ok, 10 reperibile, 11 script, 12 procedura, 13 help + datinmostra.append([self.s[cammina].Description, str(self.s[cammina].read), self.s[cammina].Device + '/' + self.s[cammina].Attribute, str(self.s[cammina].ref[2]), str(self.s[cammina].ref[0]), str(self.s[cammina].ref[1]), str(self.s[cammina].ref[3]), str(self.s[cammina].n_wrong) + '/' + str(self.s[cammina].AlarmCycles), self.s[cammina].AlarmON, self.s[cammina].Subsystem, self.s[cammina].ok, self.s[cammina].wikiReperibile, self.s[cammina].Script, self.s[cammina].wikiProcedure, self.s[cammina].helpMessage]) + self.sipuofare = tabelliamo() + self.sipuofare.riempi(datinmostra) + self.sipuofare.setWindowTitle("Show ALL") + self.sipuofare.resize(screen.width()/2,screen.width()/2) + self.sipuofare.show() + + def configurare(self): + text, ok = QInputDialog.getText(self, 'Input Dialog', 'Make a try:') + if ok: + if str(text) == "LfoUser": + self.listButton = QPushButton("Change LIST") + self.limitsButton = QPushButton("Change LIMITS") + self.wikiButton = QPushButton("Disable all alarms") + self.jiveButton = QPushButton("Enable all alarms") + self.buttonBox = QDialogButtonBox(Qt.Vertical) + self.buttonBox.addButton(self.listButton, QDialogButtonBox.ActionRole) + self.buttonBox.addButton(self.limitsButton, QDialogButtonBox.ActionRole) + self.buttonBox.addButton(self.wikiButton, QDialogButtonBox.ActionRole) + self.buttonBox.addButton(self.jiveButton, QDialogButtonBox.ActionRole) + self.listButton.pressed.connect(self.cambialista) + self.limitsButton.pressed.connect(self.cambialimiti) + self.wikiButton.pressed.connect(self.staccatutto) + self.jiveButton.pressed.connect(self.attaccatutto) + self.buttonBox.show() + else: + self.error = QErrorMessage() + self.error.showMessage('Wrong input key. Try again') + + def cambialimiti(self): + self.buttonBox.close() + datinmostra = list() + for cammina in range(len(self.s)): + if self.s[cammina].Type == '1' and self.s[cammina].Active == '1': + datinmostra.append([self.s[cammina].Subsystem, self.s[cammina].Device, self.s[cammina].Attribute, str(self.s[cammina].ref[2]), str(self.s[cammina].ref[0]), str(self.s[cammina].read), str(self.s[cammina].ref[1]), str(self.s[cammina].ref[3])]) + self.corstruttore = tabelliamo2() + self.corstruttore.riempi(datinmostra) + self.corstruttore.resize(screen.width()/2,screen.width()/2) + self.corstruttore.setWindowTitle("Change Limits") + self.corstruttore.show() + + def cambialista(self): + self.buttonBox.close() + self.datinmostra = list() + with open(nomefile) as csvfile: + spamreader = csv.reader(csvfile, delimiter=',', quotechar='"') + for row in spamreader: + #"Active;Device;Attribute;Type;Subsystem;AlarmON;AlarmCycles;Autofix;Description;wikiReperibile;wikiProcedure;Script;helpMessage" + self.datinmostra.append([str(row[0]), str(row[1]), str(row[2]), str(row[3]), str(row[4]), str(row[5]), str(row[6]), str(row[7]), str(row[8]), str(row[9]), str(row[10]), str(row[11]), str(row[12])]) + self.sipuofare = tabelliamo3() + self.sipuofare.riempi(self.datinmostra) + self.sipuofare.resize(screen.width()/2,screen.width()/2) + self.sipuofare.setWindowTitle("Change List") + self.sipuofare.show() + + def staccatutto(self): + cideveessereunmetodomigliore = [] + with open(nomefile) as csvRfile: + spamreader = csv.reader(csvRfile, delimiter=',', quotechar='"') + for row in spamreader: + if row[5] == '1': + row[5] = '2' + cideveessereunmetodomigliore.append(row) + csvRfile.close() + with open(nomefile, 'wb') as csvWfile: + spamwriter = csv.writer(csvWfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) + for ind in range(len(cideveessereunmetodomigliore)): + spamwriter.writerow(cideveessereunmetodomigliore[ind]) + csvWfile.close() + + def attaccatutto(self): + cideveessereunmetodomigliore = [] + with open(nomefile) as csvRfile: + spamreader = csv.reader(csvRfile, delimiter=',', quotechar='"') + for row in spamreader: + if row[5] == '2': + row[5] = '1' + cideveessereunmetodomigliore.append(row) + csvRfile.close() + with open(nomefile, 'wb') as csvWfile: + spamwriter = csv.writer(csvWfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) + for ind in range(len(cideveessereunmetodomigliore)): + spamwriter.writerow(cideveessereunmetodomigliore[ind]) + csvWfile.close() + + def manutenzionefinta(self): + print('ao') + if self.Sbutton_manutenzione.styleSheet() == 'background-color: light gray': + self.staccatutto() + else: + self.attaccatutto() + + def istruzioni(self): + os.system('firefox http://acswww.elettra.trieste.it/Fermi/Procedures/Lasers/sinoseed &') + pass + +class tabelliamo(QTableWidget): #tabelle SHOW + def __init__(self, parent=None): + super(tabelliamo, self).__init__(parent) + self.setColumnCount(11) + self.setHorizontalHeaderLabels(QString("Help;Description;VALUE;Attribute;min_Alarm;min_Warning;max_Warning;max_Alarm;Out_of_range;Alarm ON;Subsystem").split(";")) + + def riempi(self, input1): + self.setRowCount(len(input1)) + for ind in range(len(input1)): + bott1 = QPushButton(self) + bott1.setText('Info') + bott1.clicked.connect(self.informalo) + bott1.setToolTip(input1[ind][14])#14 help message + bott1.in1 = str(input1[ind][12]) #12 script + bott1.in2 = str(input1[ind][13]) #13 wiki + bott1.in3 = str(input1[ind][11]) #11 reperibile + self.setCellWidget(ind,0,bott1) + for ice in range(len(input1[0])-1): #colonna + elementonuovo = QTableWidgetItem(input1[ind][ice]) + if ice == 1 and input1[ind][10] == 0: + elementonuovo.setBackground(QColor(0,255,0)) + elif ice == 1 and input1[ind][10] == 1: + elementonuovo.setBackground(QColor(255,255,0)) + elif ice == 1 and input1[ind][10] >= 2: + elementonuovo.setBackground(QColor(255,0,0)) + elif ice == 1 and input1[ind][10] == -99: + elementonuovo.setBackground(QColor(0,0,255)) + if ice in [8] and input1[ind][ice] == '1': + elementonuovo = QTableWidgetItem('ON') + elif ice in [8] and input1[ind][ice] != '1': + elementonuovo = QTableWidgetItem('OFF') + #elementonuovo.setBackground(QColor(255,255,0)) + self.setItem(ind,ice+1,elementonuovo) + self.resizeColumnsToContents() + + def wikalo(self): + ditata = self.sender() + a=ditata.toolTip() + os.system('firefox ' + str(a) + ' &') + + def launchalo(self): + ditata = self.sender() + a=ditata.toolTip() + os.system('python ' + str(a) + ' &') + + def stutalo(self): + self.close() + + def informalo(self): + ditata = self.sender() + a=ditata.toolTip() + dialog = QMessageBox() + dialog.setText(a) + if ditata.in1 != 'x': + ScriptButton = QPushButton("Script") + ScriptButton.setToolTip(ditata.in1) + dialog.addButton(ScriptButton, QMessageBox.ActionRole) + ScriptButton.pressed.connect(self.launchalo) + dialog.setDefaultButton(ScriptButton) + if ditata.in2 != 'x': + WIKIButton = QPushButton("WIKI") + WIKIButton.setToolTip(ditata.in2) + dialog.addButton(WIKIButton, QMessageBox.ActionRole) + WIKIButton.pressed.connect(self.wikalo) + if ditata.in3 != 'x': + ReperibileButton = QPushButton("Reperibile") + ReperibileButton.setToolTip(ditata.in3) + dialog.addButton(ReperibileButton, QMessageBox.ActionRole) + ReperibileButton.pressed.connect(self.wikalo) + CloseButton = QPushButton("Close") + CloseButton.setToolTip(ditata.in1) + dialog.addButton(CloseButton, QMessageBox.ActionRole) + CloseButton.pressed.connect(self.stutalo) + dialog.exec_() + +class tabelliamo2(QDialog): #tabelle CHANGE LIMITS + def __init__(self, parent=None): + super(tabelliamo2, self).__init__(parent) + self.tabella = QTableWidget() + self.tabella.setColumnCount(8) + self.tabella.setHorizontalHeaderLabels(QString("Subsystem;Device;Attribute;min alarm;min warning;last VALUE;max warning;max alarm").split(";")) + self.button1 = QPushButton("CHANGE") + self.button2 = QPushButton("Cancel") + self.button1.pressed.connect(self.dajedidb) + self.button2.pressed.connect(self.chiudi) + def riempi(self, input1): + self.tabella.setRowCount(len(input1)) + for ind in range(len(input1)): + for ice in range(len(input1[0])): + elementonuovo = QTableWidgetItem(input1[ind][ice]) + if ice == 3: + elementonuovo.setBackground(QColor(255,0,0)) + elif ice == 4: + elementonuovo.setBackground(QColor(255,255,0)) + elif ice == 6: + elementonuovo.setBackground(QColor(255,255,0)) + elif ice == 7: + elementonuovo.setBackground(QColor(255,0,0)) + self.tabella.setItem(ind,ice,elementonuovo) + self.tabella.resizeColumnsToContents() + altrolay = QVBoxLayout() + altrolay.addWidget(self.tabella) + altrolay.addWidget(self.button1) + altrolay.addWidget(self.button2) + self.setLayout(altrolay) + self.resize(screen.width(),screen.width()) + + def dajedidb(self): + # 'scarica' tabella, traduci str(float()), confronta, scrivi + for ind in range(self.tabella.rowCount()): + cambiati = 0 + device = str(self.tabella.item(ind,1).text()) + attributo = str(self.tabella.item(ind,2).text()) + dev = PyTango.DeviceProxy(device) + altro = dev.get_attribute_config_ex(attributo) + #MIN ALARM + datooriginale_min_alarm = altro[0].alarms.min_alarm + if datooriginale_min_alarm != 'Not specified': + datooriginale_min_alarm = str(float(altro[0].alarms.min_alarm)) + datonuovo_min_alarm = self.tabella.item(ind,3).text() + if datonuovo_min_alarm == 'None': + datonuovo_min_alarm = 'Not specified' + if datooriginale_min_alarm != datonuovo_min_alarm: + altro[0].alarms.min_alarm = str(datonuovo_min_alarm) + cambiati = cambiati + 1 + #MIN WARNING + datooriginale_min_warning = altro[0].alarms.min_warning + if datooriginale_min_warning != 'Not specified': + datooriginale_min_warning = str(float(altro[0].alarms.min_warning)) + datonuovo_min_warning = self.tabella.item(ind,4).text() + if datonuovo_min_warning == 'None': + datonuovo_min_warning = 'Not specified' + if datooriginale_min_warning != datonuovo_min_warning: + altro[0].alarms.min_warning = str(datonuovo_min_warning) + cambiati = cambiati + 1 + #MAX WARNING + datooriginale_max_warning= altro[0].alarms.max_warning + if datooriginale_max_warning != 'Not specified': + datooriginale_max_warning = str(float(altro[0].alarms.max_warning)) + datonuovo_max_warning = self.tabella.item(ind,6).text() + if datonuovo_max_warning == 'None': + datonuovo_max_warning = 'Not specified' + if datooriginale_max_warning != datonuovo_max_warning: + altro[0].alarms.max_warning = str(datonuovo_max_warning) + cambiati = cambiati + 1 + #MAX ALARM + datooriginale_max_alarm = altro[0].alarms.max_alarm + if datooriginale_max_alarm != 'Not specified': + datooriginale_max_alarm = str(float(altro[0].alarms.max_alarm)) + datonuovo_max_alarm = self.tabella.item(ind,7).text() + if datonuovo_max_alarm == 'None': + datonuovo_max_alarm = 'Not specified' + if datooriginale_max_alarm != datonuovo_max_alarm: + altro[0].alarms.max_alarm = str(datonuovo_max_alarm) + cambiati = cambiati + 1 + if cambiati > 0: + dev.set_attribute_config(altro) + + def chiudi(self): + self.done(0) + +class tabelliamo3(QDialog): #tabelle CHANGE LIST + def __init__(self, parent=None): + super(tabelliamo3, self).__init__(parent) + self.tabella = QTableWidget() + self.tabella.setColumnCount(13) + self.tabella.setHorizontalHeaderLabels(QString("Active;Device;Attribute;Type;Subsystem;AlarmON;AlarmCycles;Autofix;Description;wikiReperibile;wikiProcedure;Script;helpMessage").split(";")) + self.button1 = QPushButton("CHANGE") + self.button2 = QPushButton("Cancel") + self.button3 = QPushButton("add row") + self.button1.pressed.connect(self.scrivistocsv) + self.button2.pressed.connect(self.chiudi) + self.button3.pressed.connect(self.lineanuova) + + def riempi(self, input1): + self.tabella.setRowCount(len(input1)) + for ind in range(len(input1)): + for ice in range(len(input1[0])): + elementonuovo = QTableWidgetItem(input1[ind][ice]) + self.tabella.setItem(ind,ice,elementonuovo) + self.tabella.resizeColumnsToContents() + altrolay = QVBoxLayout() + bottoni1 = QHBoxLayout() + bottoni2 = QHBoxLayout() + bottoni1.addWidget(self.button3) + bottoni1.addWidget(self.button1) + bottoni1.addWidget(self.button2) + altrolay.addWidget(self.tabella) + altrolay.addLayout(bottoni1) + self.setLayout(altrolay) + self.resize(screen.width(),screen.width()) + + def scrivistocsv(self): + indice = 0 + with open(nomefile, 'wb') as csvfile: + spamwriter = csv.writer(csvfile, delimiter=',', quotechar='"', quoting=csv.QUOTE_ALL) + for ind in range(self.tabella.rowCount()): + riga = list() + for ice in range(self.tabella.columnCount()): + riga.append(self.tabella.item(ind,ice).text()) + spamwriter.writerow(riga) + csvfile.close() + + def lineanuova(self): + self.tabella.setRowCount(self.tabella.rowCount()+1) + for ice in range(self.tabella.columnCount()): + self.tabella.setItem(self.tabella.rowCount()+1,ice,QTableWidgetItem(' ')) + + def chiudi(self): + self.done(0) + +class elemento: + def __init__(self, Active, Device, Attribute, Type, Subsystem, AlarmON, AlarmCycles, Autofix, Description, wikiReperibile, wikiProcedure, Script, helpMessage, devpro): + self.Active = Active #0 disattivo, 1 attivo + self.Device = Device #STRINGA indirizzo device + self.Attribute = Attribute #STRINGA nome attributo + self.Type = Type #NUMERO 0 stringa, 1numero, 2 tangostate, 3 booleano che deve essere 1 + self.Subsystem = Subsystem #STRINGA nome sottosistema + self.AlarmON = AlarmON #BOOL allarme si/no + self.AlarmCycles = AlarmCycles #NUMERO di cicli di lettura "alarm" prima di accendere l-allarme + self.Autofix = Autofix #BOOL che fa partire lo scrip in automatico !!!nacora non implementato!!! + self.Description = Description #STRINGA descrizione attributo + self.wikiReperibile = wikiReperibile #STRINGA inirizzo pagina reperibilita + self.wikiProcedure = wikiProcedure #STRINGA indirizzo pagina procedura + self.Script = Script #STRINGA indirizzo script + self.helpMessage = helpMessage #STRINGA messaggio del bottone info + self.read = -1 #NUMERO spazio per storare lettura + self.ref = [0, 0, 0, 0] #VETTORE spazio per storare warning e alarm + self.ok = 0 #NUMERO 0-> ok, 1-> warning, 2-> alarm + self.n_reading = 0 #NUMERO contatore letture eseguite + self.n_wrong = 0 ##NUMERO contatore letture out of range consecutivi + self.devpro = devpro #EH tango device proxy + + def lettura(self): + test_device = self.devpro + #caso stringa LockStatus + if self.Type == '0' and self.Attribute == 'LockStatus': + try: + self.read = eval('test_device.' + self.Attribute) #lettura attributo + except PyTango.DevFailed: + self.read = 'No link' + self.ok = 2 + self.ref[0] = 'None' + self.ref[1] = 'None' + self.ref[2] = 'None' + self.ref[3] = 'None' + self.n_reading = self.n_reading +1 + if self.read == 'Locked on Cross Correlator Signal': + self.ok = 0 + self.n_wrong = 0 + self.read = 'Locked' + elif self.read != 'Locked on Cross Correlator Signal': + self.read = 'NOT Locked' + self.ok = 2 + self.n_wrong = self.n_wrong +1 + #caso numero + elif self.Type == '1': + self.ok = 0 + sfasatoreattivo = False + if str(test_device) == 'Evr(ec-sl-slpsr-01/evr/ff100000)': # valuto silent beam parte 1 + if int(self.Attribute.split('Chan')[1].split('Delay')[0]) == 0: + if str(devprodic['f/timing/rttrigger_sl.01'].State()) != 'OFF': #leggo valore + sfasatoreattivo = True + else: #silent beam attivo + sfasatoreattivo = False + elif int(self.Attribute.split('Chan')[1].split('Delay')[0]) == 1: + if str(devprodic['f/timing/rttrigger_sl.02'].State()) != 'OFF': #leggo valore + sfasatoreattivo = True + else: #silent beam attivo + sfasatoreattivo = False + elif int(self.Attribute.split('Chan')[1].split('Delay')[0]) == 2: + if str(devprodic['f/timing/rttrigger_sl.03'].State()) != 'OFF': #leggo valore + sfasatoreattivo = True + else: #silent beam attivo + sfasatoreattivo = False + try: + self.read = eval('test_device.' + self.Attribute) #lettura attributo + except PyTango.DevFailed: + self.read = 'No link' + self.ok = 2 + tmp = test_device.get_attribute_config_ex(self.Attribute) #lettura limiti + if tmp[0].alarms.min_warning == 'Not specified': + self.ref[0] = 'None' + else: + self.ref[0] = float(tmp[0].alarms.min_warning) + if self.read >= self.ref[0]: + self.ok = self.ok + 0 + else: + self.ok = self.ok + 1 + if tmp[0].alarms.max_warning == 'Not specified': + self.ref[1] = 'None' + else: + self.ref[1] = float(tmp[0].alarms.max_warning) + if self.read <= self.ref[1]: + self.ok = self.ok + 0 + else: + self.ok = self.ok + 1 + if tmp[0].alarms.min_alarm == 'Not specified': + self.ref[2] = 'None' + else: + self.ref[2] = float(tmp[0].alarms.min_alarm) + if self.read > self.ref[2]: + self.ok = self.ok + 0 + else: + self.ok = self.ok + 2 + if tmp[0].alarms.max_alarm == 'Not specified': + self.ref[3] = 'None' + else: + self.ref[3] = float(tmp[0].alarms.max_alarm) + if self.read < self.ref[3]: + self.ok = self.ok + 0 + else: + self.ok = self.ok + 2 + self.n_reading = self.n_reading +1 + if self.ok >= 2: #caso ALARM o WARNING+ALARM + self.ok = 2 + self.n_wrong = self.n_wrong +1 + elif self.ok == 1: #caso WARNING + self.n_wrong = self.n_wrong +1 #opinabile, si potrebbe decidere di far suonare allarmi solo per ALARM + elif self.ok == 0: + self.n_wrong = 0 #resetto il contatore + tmp = None + if sfasatoreattivo: # valuto silent beam parte 2 + self.n_wrong = 0 + #caso tango state + elif self.Type == '2': + try: + self.read = str(test_device.command_inout('State')) + except PyTango.DevFailed: + self.read = 'No link' + self.ok = 2 + self.ref[0] = 'None' + self.ref[1] = 'None' + self.ref[2] = 'None' + self.ref[3] = 'None' + self.n_reading = self.n_reading +1 + if self.read == 'ON' or self.read == 'RUNNING' or self.read == 'OPEN': + self.ok = 0 + self.n_wrong = 0 + else: + self.ok = 2 + self.n_wrong = self.n_wrong +1 + #caso booleani (che devono essere true) + elif self.Type == '3': + self.read = eval('test_device.' + self.Attribute) #lettura attributo + self.ref[0] = 'None' + self.ref[1] = 'None' + self.ref[2] = 0.9 + self.ref[3] = 1.1 + self.n_reading = self.n_reading +1 + if self.read == 1: + self.ok = 0 + self.n_wrong = 0 + else: + self.ok = 2 + self.n_wrong = self.n_wrong +1 + #caso booleani (che devono essere false) + elif self.Type == '4': + try: + self.read = eval('test_device.' + self.Attribute) #lettura attributo + except PyTango.DevFailed: + self.read = 'No link' + self.ok = 2 + self.ref[0] = 'None' + self.ref[1] = 'None' + self.ref[2] = -0.1 + self.ref[3] = 0.1 + self.n_reading = self.n_reading +1 + if self.read == 0: + self.ok = 0 + self.n_wrong = 0 + else: + self.ok = 2 + self.n_wrong = self.n_wrong +1 + #caso fabio rossi + elif self.Type == '5': #caso fabio rossi + try: + self.read = eval('test_device.' + self.Attribute) #lettura attributo + except PyTango.DevFailed: + self.read = 'No link' + self.ok = 2 + self.ref[0] = 'None' + self.ref[1] = 'None' + self.ref[2] = 4.9 + self.ref[3] = 5.1 + self.n_reading = self.n_reading +1 + if self.read == 5: + self.ok = 0 + self.n_wrong = 0 + else: + self.ok = 2 + self.n_wrong = self.n_wrong +1 + #caso virtual undulator + elif self.Type == '6': + try: + self.read = eval('test_device.' + self.Attribute) #lettura attributo + except PyTango.DevFailed: + self.read = 'No link' + self.ok = 2 + self.ref[0] = 'None' + self.ref[1] = 'None' + self.ref[2] = 1.9 + self.ref[3] = 2.1 + self.n_reading = self.n_reading +1 + if self.read == 2: + self.ok = 0 + self.n_wrong = 0 + else: + self.ok = 2 + self.n_wrong = self.n_wrong +1 + #caso tango state per controlli + elif self.Type == '7': + try: + self.read = str(test_device.command_inout('State')) + except PyTango.DevFailed: + self.read = 'No link' + self.ok = 2 + self.ref[0] = 'None' + self.ref[1] = 'None' + self.ref[2] = 'None' + self.ref[3] = 'None' + self.n_reading = self.n_reading +1 + if self.read != 'UNKNOW' and self.read != 'FAULT' and self.read != 'No link': + self.ok = 0 + self.n_wrong = 0 + else: + self.ok = 2 + self.n_wrong = self.n_wrong +1 + #caso tango state deve OFF + elif self.Type == '8': + try: + self.read = str(test_device.command_inout('State')) + except PyTango.DevFailed: + self.read = 'No link' + self.ok = 2 + self.ref[0] = 'None' + self.ref[1] = 'None' + self.ref[2] = 'None' + self.ref[3] = 'None' + self.n_reading = self.n_reading +1 + if self.read == 'OFF': + self.ok = 0 + self.n_wrong = 0 + else: + self.ok = 1 + self.n_wrong = self.n_wrong +1 + #caso silent beam + elif self.Type == '9': + try: + self.read = str(test_device.command_inout('State')) + except PyTango.DevFailed: + self.read = 'No link' + self.ok = 2 + self.ref[0] = 'None' + self.ref[1] = 'None' + self.ref[2] = 'None' + self.ref[3] = 'None' + self.n_reading = self.n_reading +1 + if self.read == 'ON' or self.read == 'RUNNING': + self.ok = -99 + self.n_wrong = 0 + elif self.read == 'OFF': + self.ok = 0 + self.n_wrong = 0 + else: + self.ok = 2 + self.n_wrong = self.n_wrong +1 + tmp = None + test_device = None + #print(str(self.Device) + '/' + self.Attribute + 'value ' + str(self.read) + ' Vs ' + str(self.ref) + ' da ' + str(self.ok)) + + def statistica(self): + print(self.n_reading) + print(self.n_wrong) + +##################### +if __name__ == '__main__': + app = QApplication([]) + try: + tmpdim = sys.argv[1] + tmpdim = tmpdim.split('x') + dimensione = [float(tmpdim[0]), float(tmpdim[1])] + except: + screen = QDesktopWidget().screenGeometry() + larghezzaaltezza = [screen.width(), screen.height()] + print(larghezzaaltezza) + if max(larghezzaaltezza) > 3000: + dimensione = max(larghezzaaltezza)*0.38 + elif max(larghezzaaltezza) > 2000: + dimensione = max(larghezzaaltezza)*0.6 + elif max(larghezzaaltezza) > 1000: + dimensione = max(larghezzaaltezza)*0.7 + else: + dimensione = max(larghezzaaltezza)*2 + font_grande = QFont("Arial", round(dimensione/30.0), -1, False) + font_medio = QFont("Arial", round(dimensione/80.0), 1, False) + font_piccolo = QFont("Arial", round(dimensione/110.0), 1, False) + font_moltopiccolo = QFont("Arial", round(dimensione/130.0), -1, False) + app.setFont(font_piccolo) + window = MainWindow() + window.resize(larghezzaaltezza[0]/6, larghezzaaltezza[1]/6) + window.show() + app.exec_()