From 9acbe7a7a5bc1092ec3aacb33f9b3aadac69e744 Mon Sep 17 00:00:00 2001
From: Lorenzo Pivetta <lorenzo.pivetta@elettra.eu>
Date: Wed, 3 Jun 2020 15:34:15 +0200
Subject: [PATCH] Initial import

---
 Makefile           |  18 ++
 src/pil-trigger.py | 729 +++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 747 insertions(+)
 create mode 100644 Makefile
 create mode 100644 src/pil-trigger.py

diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..1e7eb7b
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,18 @@
+NAME = pil-trigger-gui
+MAIN = pil-trigger.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/pil-trigger.py b/src/pil-trigger.py
new file mode 100644
index 0000000..94fbf19
--- /dev/null
+++ b/src/pil-trigger.py
@@ -0,0 +1,729 @@
+#!/usr/bin/python
+
+# restore PIL trigger values and reset Legend BWD interlock
+import PyTango
+import os
+import csv
+import time
+from PyQt4.QtCore import *
+from PyQt4.QtGui import *
+import sys
+
+devicetrgEVR = PyTango.DeviceProxy('ec-pil-plpsr-01/evr/ff100000')
+devicetrgDGQ = PyTango.DeviceProxy('pil/delay/dgq_pil.01')
+devicetrgSDG = PyTango.DeviceProxy('pil/delay/sdg_pil.01')
+
+nomecartella = '/home/lfo/data/salvatutto/PIL_trigger/'
+os.chdir(nomecartella)
+defaultreffile = 'auto'
+
+
+class MainWindow(QDialog):
+    def __init__(self, parent = None):
+        super(MainWindow, self).__init__(parent)
+        #canali
+        self.scialuppa = []
+        self.riga0 = canaleEVR('PIL MASTER', devicetrgEVR, 0, 'Shift all the signals')
+        self.riga0.sorgente = 'EVR 0'
+        self.scialuppa.append(self.riga0)
+        self.riga1 = canaleEVR('TRG PLR01', devicetrgEVR, 1, 'spctm100, hera, trls_pil.02, ccd legend, gentec, spctm500')
+        self.riga1.sorgente = 'EVR 1'
+        self.scialuppa.append(self.riga1)
+        self.riga2 = canaleEVR('CCD INJ & LHL', devicetrgEVR, 2, 'ccd_pil.05, ccd_pil.06, ccd_lhl.01, ccd_lhl.02, ccd_lhl.03')
+        self.riga2.sorgente = 'EVR 2'
+        self.scialuppa.append(self.riga2)
+        self.riga3 = canaleEVR('TRG INJ', devicetrgEVR, 3, 'eml_pil.01')
+        self.riga3.sorgente = 'EVR 3'
+        self.scialuppa.append(self.riga3)
+        self.riga4 = canaleEVR('TRG LHL', devicetrgEVR, 8, 'eml_lhl.01, trls_lhl.02')
+        self.riga4.sorgente = 'EVR 8'
+        self.scialuppa.append(self.riga4)
+        self.riga5 = canaleEVR('CCD PLR01', devicetrgEVR, 9, 'ccd_pil.01, ccd_pil.02, ccd_pil.03, ccd_pil.04')
+        self.riga5.sorgente = 'EVR 9'
+        self.scialuppa.append(self.riga5)
+        self.riga6 = canaleEVR('TRG CTF', devicetrgEVR, 10, 'eml_ctf.01, ccd_ctf.01')
+        self.riga6.sorgente = 'EVR 10'
+        self.scialuppa.append(self.riga6)
+        self.riga7 = canaleEVR('CCD CTF', devicetrgEVR, 11, 'ccd_ctf.02')
+        self.riga7.sorgente = 'EVR 11'
+        self.scialuppa.append(self.riga7)
+        self.riga8 = canaleEVR('CCD LH Trasport', devicetrgEVR, 12, 'ccd_lhl.04')
+        self.riga8.sorgente = 'EVR 12'
+        self.scialuppa.append(self.riga8)
+        self.riga9 = canaleEVR('SCOPE', devicetrgEVR, 13, 'scope-laser-01')
+        self.riga9.sorgente = 'EVR 13'
+        self.scialuppa.append(self.riga9)
+        self.riga10 = canaleDGQ('Laser Master', devicetrgDGQ, 1, 'Shift pump lasers and sdg')
+        self.riga10.sorgente = 'DGQ 1'
+        self.scialuppa.append(self.riga10)
+        self.riga11 = canaleDGQ('EVO 15', devicetrgDGQ, 2, 'evo 15')
+        self.riga11.sorgente = 'DGQ 2'
+        self.scialuppa.append(self.riga11)
+        self.riga12 = canaleDGQ('EVO HE1', devicetrgDGQ, 3, 'evo HE1')
+        self.riga12.sorgente = 'DGQ 3'
+        self.scialuppa.append(self.riga12)
+        self.riga13 = canaleDGQ('EVO HE2', devicetrgDGQ, 4, 'evo HE2')
+        self.riga13.sorgente = 'DGQ 4'
+        self.scialuppa.append(self.riga13)
+        self.riga14 = canaleDGQ('SDG', devicetrgDGQ, 5, 'SDG')
+        self.riga14.sorgente = 'DGQ 5'
+        self.scialuppa.append(self.riga14)
+        self.riga15 = canaleDGQ('PAM', devicetrgDGQ, 6, 'pam_pil.01')
+        self.riga15.sorgente = 'DGQ 6'
+        self.scialuppa.append(self.riga15)
+        self.riga16 = canaleDGQ('Mercury', devicetrgDGQ, 7, 'trls_pil.01')
+        self.riga16.sorgente = 'DGQ 7'
+        self.scialuppa.append(self.riga16)
+        self.riga17 = canaleDGQ('CH H', devicetrgDGQ, 8, 'not connected')
+        self.riga17.sorgente = 'DGQ 8'
+        self.scialuppa.append(self.riga17)
+        self.riga18 = canaleSDG('PC1', devicetrgSDG, 1, 'PC1')
+        self.riga18.sorgente = 'SDG 1'
+        self.scialuppa.append(self.riga18)
+        self.riga19 = canaleSDG('PC2', devicetrgSDG, 2, 'PC2')
+        self.riga19.sorgente = 'SDG 2'
+        self.scialuppa.append(self.riga19)
+        self.titoli = titolicanali(self.riga0.name.geometry(), self.riga0.devicelist.geometry(), self.riga0.delay_read.geometry(), self.riga0.delay_reference.geometry(), self.riga0.delay_write.geometry(), self.riga0.delay_alarm_low.geometry(), self.riga0.delay_alarm_hi.geometry(), self.riga0.width_read.geometry(), self.riga0.width_write.geometry(), self.riga0.enable_read.geometry(), self.riga0.enable_write.geometry(), self.riga0.applica.geometry())
+        self.titoli.sorgente = 'titoli 0'
+        self.scialuppa.append(self.titoli)
+        self.scrollArea = QScrollArea(self)
+        self.scrollArea.setWidgetResizable(True)
+        self.scrollAreaWidgetContents = QWidget(self.scrollArea)
+        self.scrollArea.setWidget(self.scrollAreaWidgetContents)
+        #lo_canali = QVBoxLayout()
+        lo_canali = QVBoxLayout(self.scrollAreaWidgetContents)
+        lo_canali.addWidget(self.titoli)
+        lo_canali.addWidget(self.riga0)
+        lo_canali.addWidget(self.riga1)
+        lo_canali.addWidget(self.riga2)
+        lo_canali.addWidget(self.riga3)
+        lo_canali.addWidget(self.riga4)
+        lo_canali.addWidget(self.riga5)
+        lo_canali.addWidget(self.riga6)
+        lo_canali.addWidget(self.riga7)
+        lo_canali.addWidget(self.riga8)
+        lo_canali.addWidget(self.riga9)
+        lo_canali.addWidget(self.riga10)
+        lo_canali.addWidget(self.riga11)
+        lo_canali.addWidget(self.riga12)
+        lo_canali.addWidget(self.riga13)
+        lo_canali.addWidget(self.riga14)
+        lo_canali.addWidget(self.riga15)
+        lo_canali.addWidget(self.riga16)
+        lo_canali.addWidget(self.riga17)
+        lo_canali.addWidget(self.riga18)
+        lo_canali.addWidget(self.riga19)
+        lo_canali.setSpacing(0)
+        for i in range(len(self.scialuppa)):
+            self.scialuppa[i].delay_alarm_low.hide()
+            self.scialuppa[i].delay_alarm_hi.hide()
+            self.scialuppa[i].width_read.hide()
+            self.scialuppa[i].width_write.hide()
+            self.scialuppa[i].enable_write.hide()
+        #altro
+        self.tempodiriferimento = 0
+        self.ladatadelfile = QLineEdit('')
+        self.ladatadelfile.setReadOnly(1)
+        self.ladatadelfile.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.ladatadelfile.setMinimumWidth(200)
+        self.EVR_State = QLineEdit('EVR ')
+        self.EVR_State.setReadOnly(1)
+        self.DGQ_State = QLineEdit('DGQ ')
+        self.DGQ_State.setReadOnly(1)
+        self.SDG_State = QLineEdit('SDG ')
+        self.SDG_State.setReadOnly(1)
+        self.DGQ_init = QPushButton('DGQ init')
+        self.DGQ_init.clicked.connect(self.funzioneapplicatutti)
+        self.SDG_bwd = QPushButton('reset BWD')
+        self.SDG_bwd.clicked.connect(self.funzioneapplicatutti)
+        self.dataflielabel = QLabel('Ref.file:')
+        self.dataflielabel.setAlignment(Qt.AlignRight | Qt.AlignVCenter)
+        self.cambiareferencefile = QPushButton('Change ref file')
+        self.cambiareferencefile.clicked.connect(self.cambiaref)
+        self.savereferencefile = QPushButton('save read to reference file')
+        self.savereferencefile.clicked.connect(self.funzionesavereferencefile)
+        self.copyreadtowrite = QPushButton('copy READ to WRITE')
+        self.copyreadtowrite.clicked.connect(self.funzionecopyreadtowrite)
+        self.copyreferencetowrite = QPushButton('copy Ref. value to WRITE')
+        self.copyreferencetowrite.clicked.connect(self.funzionecopyreferencetowrite)
+        self.applicatutti = QPushButton('Apply all')
+        self.applicatutti.clicked.connect(self.funzioneapplicatutti)
+        self.fixalarmthreshold = QPushButton('fix alarms thresholds')
+        self.fixalarmthreshold.clicked.connect(self.manosanta)
+        self.showmore = QCheckBox('show more')
+        self.showmore.clicked.connect(self.funzioneshowmore)
+        lo = QGridLayout()
+        lo.addWidget(self.EVR_State, 1, 0, 1, 1)
+        lo.addWidget(self.DGQ_State, 1, 1, 1, 1)
+        lo.addWidget(self.DGQ_init, 1, 2, 1, 1)
+        lo.addWidget(self.SDG_State, 1, 3, 1, 1)
+        lo.addWidget(self.SDG_bwd, 1, 4, 1, 1)
+        lo.addWidget(self.dataflielabel, 1, 5, 1, 1)
+        lo.addWidget(self.ladatadelfile, 1, 6, 1, 3)
+        lo.addWidget(self.cambiareferencefile, 1, 9, 1, 1)
+        lo.addWidget(self.scrollArea, 10, 0, 10, 10)
+        lo.addWidget(self.savereferencefile, 20, 0, 1, 2)
+        lo.addWidget(self.copyreadtowrite, 20, 2, 1, 2)
+        lo.addWidget(self.copyreferencetowrite, 20, 4, 1, 2)
+        lo.addWidget(self.applicatutti, 20, 6, 1, 2)
+        lo.addWidget(self.fixalarmthreshold, 20, 8, 1, 2)
+#        lo.addWidget(self.showmore, 21, 4, 1, 2)
+        self.setLayout(lo)
+        self.setWindowTitle("PIL trigger")
+        self.show()
+        self.setStyleSheet("QDialog {background-color: rgb(255, 255, 200)}")
+        #creo il timer
+        self.timer = QBasicTimer()
+        self.timer.start(5000, self)
+        self.update()
+
+    def __del__(self):
+        self.timer.stop()
+        pass
+
+    def timerEvent(self, event):
+        self.update()
+
+    def update(self):
+        tempista1 = time.time()
+        # cerco e confronto file reference
+        files = os.listdir(nomecartella)
+        ultimo = max(files, key = os.path.getctime)
+        if defaultreffile == 'auto':
+            if self.tempodiriferimento != time.localtime(int(os.path.getmtime(ultimo))):
+                self.tempodiriferimento = time.localtime(int(os.path.getmtime(ultimo)))
+                if self.tempodiriferimento.tm_min < 10:
+                    self.ladatadelfile.setText(ultimo + ', date ' + str(self.tempodiriferimento.tm_year) + '/' + str(self.tempodiriferimento.tm_mon) + '/' + str(self.tempodiriferimento.tm_mday) + ' ' + str(self.tempodiriferimento.tm_hour) + ':0' + str(self.tempodiriferimento.tm_min))
+                else:
+                    self.ladatadelfile.setText(ultimo + ', date ' + str(self.tempodiriferimento.tm_year) + '/' + str(self.tempodiriferimento.tm_mon) + '/' + str(self.tempodiriferimento.tm_mday) + ' ' + str(self.tempodiriferimento.tm_hour) + ':' + str(self.tempodiriferimento.tm_min))
+                with open(ultimo) as csvfile:
+                    dizionarioriferimenti = {}
+                    spamreader = csv.reader(csvfile, delimiter=',')
+                    for row in spamreader:
+                        dizionarioriferimenti[row[0]] = row[1]
+                csvfile.close()
+                for i in range(len(self.scialuppa)):
+                    if self.scialuppa[i].sorgente == 'titoli 0':
+                        print('')
+                    elif 'DGQ' in self.scialuppa[i].sorgente:
+                        self.scialuppa[i].delay_reference.setText(str(dizionarioriferimenti[self.scialuppa[i].sorgente]))
+                    else:
+                        self.scialuppa[i].delay_reference.setText(dizionarioriferimenti[self.scialuppa[i].sorgente])
+            print('Ref.file letto ' + str(time.time()-tempista1))
+        else:
+            ultimo = defaultreffile
+            self.tempodiriferimento = time.localtime(int(os.path.getmtime(ultimo)))
+            if self.tempodiriferimento.tm_min < 10:
+                self.ladatadelfile.setText(ultimo + ', date ' + str(self.tempodiriferimento.tm_year) + '/' + str(self.tempodiriferimento.tm_mon) + '/' + str(self.tempodiriferimento.tm_mday) + ' ' + str(self.tempodiriferimento.tm_hour) + ':0' + str(self.tempodiriferimento.tm_min))
+            else:
+                self.ladatadelfile.setText(ultimo + ', date ' + str(self.tempodiriferimento.tm_year) + '/' + str(self.tempodiriferimento.tm_mon) + '/' + str(self.tempodiriferimento.tm_mday) + ' ' + str(self.tempodiriferimento.tm_hour) + ':' + str(self.tempodiriferimento.tm_min))
+            with open(ultimo) as csvfile:
+                dizionarioriferimenti = {}
+                spamreader = csv.reader(csvfile, delimiter=',')
+                for row in spamreader:
+                    dizionarioriferimenti[row[0]] = row[1]
+            csvfile.close()
+            for i in range(len(self.scialuppa)):
+                if self.scialuppa[i].sorgente == 'titoli 0':
+                    print('')
+                elif 'DGQ' in self.scialuppa[i].sorgente:
+                    self.scialuppa[i].delay_reference.setText(str(dizionarioriferimenti[self.scialuppa[i].sorgente]))
+                else:
+                    self.scialuppa[i].delay_reference.setText(dizionarioriferimenti[self.scialuppa[i].sorgente])
+            print('Ref.file letto ' + str(time.time()-tempista1))
+        #lettura stati device
+        tempista2 = time.time()
+        lettura_stato_evr = str(devicetrgEVR.State())
+        lettura_stato_dgq = str(devicetrgDGQ.State())
+        lettura_stato_sdg = str(devicetrgSDG.State())
+        if lettura_stato_evr == 'ON':
+            self.EVR_State.setText('EVR ' + str(lettura_stato_evr))
+            self.EVR_State.setStyleSheet("background-color: rgb(0, 255, 0)")
+        else:
+            self.EVR_State.setText('EVR ' + str(lettura_stato_evr))
+            self.EVR_State.setStyleSheet("background-color: rgb(255, 0, 0)")
+        if lettura_stato_dgq == 'ON':
+            self.DGQ_State.setText('DGQ ' + str(lettura_stato_dgq))
+            self.DGQ_State.setStyleSheet("background-color: rgb(0, 255, 0)")
+        else:
+            self.DGQ_State.setText('DGQ ' + str(lettura_stato_dgq))
+            self.DGQ_State.setStyleSheet("background-color: rgb(255, 0, 0)")
+        if lettura_stato_sdg == 'ON':
+            self.SDG_State.setText('SDG ' + str(lettura_stato_sdg))
+            self.SDG_State.setStyleSheet("background-color: rgb(0, 255, 0)")
+        else:
+            self.SDG_State.setText('SDG ' + str(lettura_stato_sdg))
+            self.SDG_State.setStyleSheet("background-color: rgb(255, 0, 0)")
+        print('stati letti ' + str(time.time()-tempista2))
+        #leggo tutto EVR
+        tempista3 = time.time()
+        EVR_ritardi = devicetrgEVR.ChanDelay
+        time.sleep(0.05)
+        #EVR_durate = devicetrgEVR.ChanWidth
+        #time.sleep(0.05)
+        EVR_abilitazioni = devicetrgEVR.ChanEnable
+        for i in range(len(self.scialuppa)):
+            [strumento, canale] = self.scialuppa[i].sorgente.split(' ')
+            if strumento == 'EVR':
+                self.scialuppa[i].delay_read.setText(str(EVR_ritardi[int(canale)]))
+                #self.scialuppa[i].width_read.setText(str(EVR_durate[int(canale)]))
+                self.scialuppa[i].enable_write.setChecked(EVR_abilitazioni[int(canale)])
+                if EVR_abilitazioni[int(canale)]:
+                    self.scialuppa[i].enable_read.setStyleSheet("background-color: rgb(0, 255, 0)")
+                else:
+                    self.scialuppa[i].enable_read.setStyleSheet("background-color: rgb(255, 0, 0)")
+        print('EVR letto ' + str(time.time()-tempista3))
+        #leggo canali DGQ
+        tempista4 = time.time()
+        leggipropriotutto = self.showmore.isChecked()
+        self.riga10.funzioneaggiornavalori(leggipropriotutto)
+        time.sleep(0.05)
+        self.riga11.funzioneaggiornavalori(leggipropriotutto)
+        time.sleep(0.05)
+        self.riga12.funzioneaggiornavalori(leggipropriotutto)
+        time.sleep(0.05)
+        self.riga13.funzioneaggiornavalori(leggipropriotutto)
+        time.sleep(0.05)
+        self.riga14.funzioneaggiornavalori(leggipropriotutto)
+        time.sleep(0.05)
+        self.riga15.funzioneaggiornavalori(leggipropriotutto)
+        time.sleep(0.05)
+        self.riga16.funzioneaggiornavalori(leggipropriotutto)
+        time.sleep(0.05)
+        self.riga17.funzioneaggiornavalori(leggipropriotutto)
+        time.sleep(0.05)
+        print('DGQ letto ' + str(time.time()-tempista4))
+        #leggo canali SDG
+        tempista5 = time.time()
+        self.riga18.funzioneaggiornavalori()
+        time.sleep(0.05)
+        self.riga19.funzioneaggiornavalori()
+        print('SDG letto ' + str(time.time()-tempista5))
+        # comparazione read-reference
+        tempista6 = time.time()
+        for i in range(len(self.scialuppa)):
+            if self.scialuppa[i].sorgente != 'titoli 0':
+                if float(self.scialuppa[i].delay_read.text()) != float(self.scialuppa[i].delay_reference.text()):
+                    self.scialuppa[i].delay_read.setStyleSheet("background-color: rgb(255, 150, 150)")
+                else:
+                    self.scialuppa[i].delay_read.setStyleSheet("background-color: rgb(220, 220, 220)")
+        print('confronto fatto ' + str(time.time()-tempista6))
+        tempista7 = time.time()
+        print('Done ' + str(tempista7-tempista1))
+
+    def funzionecopyreadtowrite(self):
+        for i in range(len(self.scialuppa)):
+            [strumento, canale] = self.scialuppa[i].sorgente.split(' ')
+            if strumento != 'titoli':
+                self.scialuppa[i].delay_write.setValue(float(self.scialuppa[i].delay_read.text()))
+
+    def funzionecopyreferencetowrite(self):
+        for i in range(len(self.scialuppa)):
+            [strumento, canale] = self.scialuppa[i].sorgente.split(' ')
+            if strumento != 'titoli':
+                self.scialuppa[i].delay_write.setValue(float(self.scialuppa[i].delay_reference.text()))
+
+    def funzioneshowmore(self):
+        if self.showmore.isChecked():
+            for i in range(len(self.scialuppa)):
+                self.scialuppa[i].width_read.show()
+                self.scialuppa[i].width_write.show()
+                self.scialuppa[i].enable_write.show()
+            window.resize(larghezzaaltezza[0]/3, larghezzaaltezza[1]/2)
+        else:
+            for i in range(len(self.scialuppa)):
+                self.scialuppa[i].width_read.hide()
+                self.scialuppa[i].width_write.hide()
+                self.scialuppa[i].enable_write.hide()
+            window.resize(larghezzaaltezza[0]/4, larghezzaaltezza[1]/2)
+
+    def funzionesavereferencefile(self):
+        self.msgBox = QMessageBox()
+        self.msgBox.setIcon(QMessageBox.Question)
+        self.msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel)
+        self.msgBox.setText("Are you sure?")
+        risp = self.msgBox.exec_()
+        if risp == 1024:
+            files = os.listdir(nomecartella)
+            ultimo = max(files, key = os.path.getctime)
+            tmp0 = ultimo.split('.')
+            tmp = tmp0[0].split('_')
+            tmp[0] = str(int(tmp[0])+1)
+            commento, ok = QInputDialog.getText(self, 'Add comment', 'Add comment')
+            nuovofile = tmp[0] + '_' + commento + '.' + tmp0[1]
+            with open(nuovofile, 'wb') as csvfile:
+                spamwriter = csv.writer(csvfile)
+                for i in range(len(self.scialuppa)):
+                    if self.scialuppa[i].sorgente == 'titoli 0':
+                        print(' ')
+#                    elif 'DGQ' in self.scialuppa[i].sorgente:
+#                        dato = float(self.scialuppa[i].delay_read.text())
+#                        riga = [str(self.scialuppa[i].sorgente), str(dato)]
+#                        spamwriter.writerow(riga)
+                    else:
+                        riga = [str(self.scialuppa[i].sorgente), str(self.scialuppa[i].delay_read.text())]
+                        print(riga)
+                        spamwriter.writerow(riga)
+            csvfile.close()
+            testo = 'file saved as ' + nuovofile
+            chiarifica = QMessageBox()
+            chiarifica.setIcon(QMessageBox.Information)
+            chiarifica.setWindowTitle('Save PIL trigger')
+            chiarifica.setText(testo)
+            chiarifica.setStyleSheet("background-color: rgb(255, 255, 200)")
+            chiarifica.exec_()
+        pass
+
+    def funzioneapplicatutti(self):
+        for i in range(len(self.scialuppa)):
+            if self.scialuppa[i].sorgente != 'titoli 0':
+                self.scialuppa[i].funzioneapplica()
+
+    def cambiaref(self):
+        # change reference file
+        filename = QFileDialog.getOpenFileName()
+        nuovoreference = filename.split('/')[-1]
+        global defaultreffile
+        defaultreffile = nuovoreference
+
+    def inizializzaquantum(self):
+        devicetrgDGQ.command_inout('Init')
+
+    def resetSDGbwd(self):
+        devicetrgSDG.command_inout('ResetBwd')
+
+    def manosanta(self):
+        # fix alarms thresholds
+        canali = [0, 1, 2, 3, 8, 9, 10, 11, 12, 13]
+        for corridore in range(len(canali)):
+            lettura = eval('devicetrgEVR.Chan' + str(canali[corridore]) + 'Delay')
+            altro = eval('devicetrgEVR.get_attribute_config_ex("Chan' + str(canali[corridore]) + 'Delay")')
+            print(type(lettura))
+            altro[0].alarms.min_alarm = str(float(lettura) - 1.0)
+            altro[0].alarms.max_alarm = str(float(lettura) + 1.0)
+            altro[0].alarms.min_warning = 'Not specified'
+            altro[0].alarms.max_warning = 'Not specified'
+            devicetrgEVR.set_attribute_config(altro)
+            time.sleep(0.3)
+        # DGQ
+        canali = [1, 2, 3, 4, 5, 6, 7, 8]
+        for corridore in range(len(canali)):
+            lettura = eval('devicetrgDGQ.Chan' + str(canali[corridore]) + 'Delay')
+            altro = eval('devicetrgDGQ.get_attribute_config_ex("Chan' + str(canali[corridore]) + 'Delay")')
+            print(type(lettura))
+            altro[0].alarms.min_alarm = str(float(lettura) - 1.0)
+            altro[0].alarms.max_alarm = str(float(lettura) + 1.0)
+            altro[0].alarms.min_warning = 'Not specified'
+            altro[0].alarms.max_warning = 'Not specified'
+            devicetrgDGQ.set_attribute_config(altro)
+            time.sleep(0.3)
+        # SDG
+        lettura = devicetrgSDG.Channel1Delay
+        altro = devicetrgSDG.get_attribute_config_ex('Channel1Delay')
+        altro[0].alarms.min_alarm = str(float(lettura) - 0.1)
+        altro[0].alarms.max_alarm = str(float(lettura) + 0.1)
+        altro[0].alarms.min_warning = 'Not specified'
+        altro[0].alarms.max_warning = 'Not specified'
+        devicetrgSDG.set_attribute_config(altro)
+        time.sleep(0.5)
+        lettura = devicetrgSDG.Channel2Delay
+        altro = devicetrgSDG.get_attribute_config_ex('Channel2Delay')
+        altro[0].alarms.min_alarm = str(float(lettura) - 0.1)
+        altro[0].alarms.max_alarm = str(float(lettura) + 0.1)
+        altro[0].alarms.min_warning = 'Not specified'
+        altro[0].alarms.max_warning = 'Not specified'
+        devicetrgSDG.set_attribute_config(altro)
+
+class canaleEVR(QWidget):
+    def __init__(self, nome, dev, ch, info, parent = None):
+        super(canaleEVR, self).__init__(parent)
+        self.name = QLabel('EVR - ' + nome)
+        self.name.setMinimumWidth(180)
+        self.devicelist = QPushButton('i')
+        self.devicelist.clicked.connect(lambda: self.funzionemostradevice(info))
+        self.devicelist.setMaximumWidth(20)
+        self.delay_read = QLineEdit('')
+        self.delay_read.setReadOnly(1)
+        self.delay_read.setFont(font_importante)
+        self.delay_read.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.delay_reference = QLineEdit('')
+        self.delay_reference.setReadOnly(1)
+        self.delay_reference.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.delay_write = QDoubleSpinBox()
+        self.delay_write.setDecimals(3)
+        self.delay_write.setMaximum(10000000.000)
+        self.delay_write.setSingleStep(12.675)
+        self.delay_alarm_low = QLineEdit('')
+        self.delay_alarm_low.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.delay_alarm_hi = QLineEdit('')
+        self.delay_alarm_hi.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.width_read = QLineEdit('')
+        self.width_read.setReadOnly(1)
+        self.width_read.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.width_write = QLineEdit('')
+        self.enable_read = QLineEdit('')
+        self.enable_read.setMaximumWidth(20)
+        self.enable_write = QCheckBox()
+        self.applica = QPushButton('Apply')
+        self.applica.clicked.connect(lambda: self.funzioneapplica())
+        self.dev = dev
+        self.ch = ch
+        layoutriga = QHBoxLayout()
+        layoutriga.addWidget(self.name)
+        layoutriga.addWidget(self.devicelist)
+        layoutriga.addWidget(self.delay_reference)
+        layoutriga.addWidget(self.delay_read)
+        layoutriga.addWidget(self.delay_write)
+        layoutriga.addWidget(self.delay_alarm_low)
+        layoutriga.addWidget(self.delay_alarm_hi)
+        layoutriga.addWidget(self.width_read)
+        layoutriga.addWidget(self.width_write)
+        layoutriga.addWidget(self.enable_read)
+        layoutriga.addWidget(self.enable_write)
+        layoutriga.addWidget(self.applica)
+        self.setLayout(layoutriga)
+    def funzionemostradevice(self, info):
+        msg = QMessageBox()
+        msg.setIcon(QMessageBox.Information)
+        msg.setInformativeText(info)
+        titolone = self.sorgente.split(' ')
+        msg.setText('Event receiver channel ' + str(titolone[1]))
+        msg.setWindowTitle('Info')
+        msg.exec_()
+    def funzioneapplica(self):
+        print(self.delay_write.value())
+        eval('self.dev.write_attribute("Chan' + str(self.ch) + 'Delay", float(self.delay_write.value()))')
+
+class canaleDGQ(QWidget):
+    def __init__(self, nome, dev, ch, info, parent = None):
+        super(canaleDGQ, self).__init__(parent)
+        self.name = QLabel('DGQ - ' + nome)
+        self.name.setMinimumWidth(180)
+        self.devicelist = QPushButton('i')
+        self.devicelist.clicked.connect(lambda: self.funzionemostradevice(info))
+        self.devicelist.setMaximumWidth(20)
+        self.delay_read = QLineEdit('')
+        self.delay_read.setReadOnly(1)
+        self.delay_read.setFont(font_importante)
+        self.delay_read.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.delay_reference = QLineEdit('')
+        self.delay_reference.setReadOnly(1)
+        self.delay_reference.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.delay_write = QDoubleSpinBox()
+        self.delay_write.setDecimals(3)
+        self.delay_write.setMaximum(20000000.000)
+        self.delay_write.setSingleStep(0.25)
+        self.delay_alarm_low = QLineEdit('')
+        self.delay_alarm_low.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.delay_alarm_hi = QLineEdit('')
+        self.delay_alarm_hi.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.width_read = QLineEdit('')
+        self.width_read.setReadOnly(1)
+        self.width_read.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.width_write = QLineEdit('')
+        self.enable_read = QLineEdit('')
+        self.enable_read.setMaximumWidth(20)
+        self.enable_write = QCheckBox()
+        self.applica = QPushButton('Apply')
+        self.applica.clicked.connect(lambda: self.funzioneapplica())
+        self.dev = dev
+        self.ch = ch
+        layoutriga = QHBoxLayout()
+        layoutriga.addWidget(self.name)
+        layoutriga.addWidget(self.devicelist)
+        layoutriga.addWidget(self.delay_reference)
+        layoutriga.addWidget(self.delay_read)
+        layoutriga.addWidget(self.delay_write)
+        layoutriga.addWidget(self.delay_alarm_low)
+        layoutriga.addWidget(self.delay_alarm_hi)
+        layoutriga.addWidget(self.width_read)
+        layoutriga.addWidget(self.width_write)
+        layoutriga.addWidget(self.enable_read)
+        layoutriga.addWidget(self.enable_write)
+        layoutriga.addWidget(self.applica)
+        self.setLayout(layoutriga)
+    def funzionemostradevice(self, info):
+        msg = QMessageBox()
+        msg.setIcon(QMessageBox.Information)
+        msg.setInformativeText(info)
+        titolone = self.sorgente.split(' ')
+        msg.setText('Quantum channel ' + str(titolone[1]))
+        msg.setWindowTitle('Info')
+        msg.exec_()
+    def funzioneapplica(self):
+        valore = self.delay_write.value()
+        print(valore)
+        eval('self.dev.write_attribute("chan' + str(self.ch) + 'delay, valore)')
+    def funzioneaggiornavalori(self, tutto):
+        try:
+            ritardo = eval('self.dev.chan' + str(self.ch) + 'delay')
+            abilitazione = eval('self.dev.chan' + str(self.ch) + 'enable')
+            if tutto:
+                durata = eval('self.dev.chan' + str(self.ch) + 'width')
+        except:
+            ritardo = -99999
+            abilitazione = False
+            if tutto:
+                durata = -99999
+        if abilitazione:
+            self.enable_read.setStyleSheet("background-color: rgb(0, 255, 0)")
+            self.enable_write.setChecked(abilitazione)
+        else:
+            self.enable_read.setStyleSheet("background-color: rgb(255, 0, 0)")
+            self.enable_write.setChecked(abilitazione)
+        self.delay_read.setText(str(ritardo))
+        if tutto:
+            self.width_read.setText(str(durata))
+
+class canaleSDG(QWidget):
+    def __init__(self, nome, dev, ch, info, parent = None):
+        super(canaleSDG, self).__init__(parent)
+        self.name = QLabel('SDG - ' + nome)
+        self.name.setMinimumWidth(180)
+        self.devicelist = QPushButton('i')
+        self.devicelist.clicked.connect(lambda: self.funzionemostradevice(info))
+        self.devicelist.setMaximumWidth(20)
+        self.delay_read = QLineEdit('')
+        self.delay_read.setReadOnly(1)
+        self.delay_read.setFont(font_importante)
+        self.delay_read.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.delay_reference = QLineEdit('')
+        self.delay_reference.setReadOnly(1)
+        self.delay_reference.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.delay_write = QDoubleSpinBox()
+        self.delay_write.setDecimals(3)
+        self.delay_write.setMaximum(20000000.000)
+        self.delay_write.setSingleStep(0.25)
+        self.delay_alarm_low = QLineEdit('')
+        self.delay_alarm_low.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.delay_alarm_hi = QLineEdit('')
+        self.delay_alarm_hi.setStyleSheet("background-color: rgb(220, 220, 220)")
+        self.width_read = QLineEdit('')
+        self.width_write = QLineEdit('')
+        self.enable_read = QLineEdit('')
+        self.enable_read.setMaximumWidth(20)
+        self.enable_write = QCheckBox()
+        self.applica = QPushButton('Apply')
+        self.applica.clicked.connect(lambda: self.funzioneapplica())
+        self.dev = dev
+        self.ch = ch
+        layoutriga = QHBoxLayout()
+        layoutriga.addWidget(self.name)
+        layoutriga.addWidget(self.devicelist)
+        layoutriga.addWidget(self.delay_reference)
+        layoutriga.addWidget(self.delay_read)
+        layoutriga.addWidget(self.delay_write)
+        layoutriga.addWidget(self.delay_alarm_low)
+        layoutriga.addWidget(self.delay_alarm_hi)
+        layoutriga.addWidget(self.width_read)
+        layoutriga.addWidget(self.width_write)
+        layoutriga.addWidget(self.enable_read)
+        layoutriga.addWidget(self.enable_write)
+        layoutriga.addWidget(self.applica)
+        self.setLayout(layoutriga)
+    def funzionemostradevice(self, info):
+        msg = QMessageBox()
+        msg.setIcon(QMessageBox.Information)
+        msg.setInformativeText(info)
+        titolone = self.sorgente.split(' ')
+        msg.setText('SDG channel ' + str(titolone[1]))
+        msg.setWindowTitle('Info')
+        msg.exec_()
+    def funzioneapplica(self):
+        valore = self.delay_write.value()
+        eval('self.dev.command_inout("SetDelay", [' + str(self.ch) + ', valore])')
+    def funzioneaggiornavalori(self):
+        try:
+            ritardo = eval('self.dev.Channel' + str(self.ch) + 'Delay')
+            abilitazione = eval('self.dev.Channel' + str(self.ch) + 'State')
+            self.delay_read.setText(str(ritardo))
+        except:
+            self.delay_read.setText(str(-99999))
+            abilitazione = False
+        if abilitazione:
+            self.enable_read.setStyleSheet("background-color: rgb(0, 255, 0)")
+            self.enable_write.setChecked(abilitazione)
+        else:
+            self.enable_read.setStyleSheet("background-color: rgb(255, 0, 0)")
+            self.enable_write.setChecked(abilitazione)
+
+
+class titolicanali(QWidget):
+    def __init__(self, in1, in2, in3, in4, in5, in6, in7, in8, in9, in10, in11, in12, parent = None):
+        super(titolicanali, self).__init__(parent)
+        self.name = QLabel('NAME')
+        self.name.setGeometry(in1)
+        self.name.setAlignment(Qt.AlignRight)
+        self.devicelist = QLabel(' ')
+        self.devicelist.setGeometry(in2)
+        self.delay_read = QLabel('READ')
+        self.delay_read.setFont(font_importante)
+        self.delay_read.setAlignment(Qt.AlignRight)
+        self.delay_read.setGeometry(in3)
+        self.delay_reference = QLabel('Ref. value')
+        self.delay_reference.setAlignment(Qt.AlignRight)
+        self.delay_reference.setGeometry(in4)
+        self.delay_write = QLabel('')
+        self.delay_write.setAlignment(Qt.AlignRight)
+        self.delay_write.setGeometry(in5)
+        self.delay_alarm_low = QLabel('Alarm lo')
+        self.delay_alarm_low.setAlignment(Qt.AlignRight)
+        self.delay_alarm_low.setGeometry(in6)
+        self.delay_alarm_hi = QLabel('Alarm hi')
+        self.delay_alarm_hi.setAlignment(Qt.AlignRight)
+        self.delay_alarm_hi.setGeometry(in7)
+        self.width_read = QLabel('Width R')
+        self.width_read.setAlignment(Qt.AlignRight)
+        self.width_read.setGeometry(in8)
+        self.width_write = QLabel('Width W')
+        self.width_write.setAlignment(Qt.AlignRight)
+        self.width_write.setGeometry(in9)
+        self.enable_read = QLabel(' ')
+        self.enable_read.setGeometry(in10)
+        self.enable_write = QLabel('ACTIVE')
+        self.enable_write.setAlignment(Qt.AlignRight)
+        self.enable_write.setGeometry(in11)
+        self.applica = QLabel(' ')
+        self.applica.setGeometry(in12)
+        layoutriga = QHBoxLayout()
+        layoutriga.addWidget(self.name)
+        layoutriga.addWidget(self.devicelist)
+        layoutriga.addWidget(self.delay_reference)
+        layoutriga.addWidget(self.delay_read)
+        layoutriga.addWidget(self.delay_write)
+        layoutriga.addWidget(self.delay_alarm_low)
+        layoutriga.addWidget(self.delay_alarm_hi)
+        layoutriga.addWidget(self.width_read)
+        layoutriga.addWidget(self.width_write)
+        layoutriga.addWidget(self.enable_read)
+        layoutriga.addWidget(self.enable_write)
+        layoutriga.addWidget(self.applica)
+        self.setLayout(layoutriga)
+
+
+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/100.0), -1, False)
+    font_importante = QFont("Arial", round(dimensione/130.0), 1, True)
+    font_pannello = QFont("Arial", round(dimensione/140.0), -1, False)
+    app.setFont(font_pannello)
+    window = MainWindow()
+    window.resize(larghezzaaltezza[0]/4, larghezzaaltezza[1]/2)
+    window.show()
+    app.exec_()
-- 
GitLab