diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..70e97cb5b22d4982fd4919129c1679cd5d13d0db --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +NAME = slu-totem-compressor-gui +MAIN = slu-totem-compressor.py + +DIRNAME = $(NAME:-gui=) +PY_FILES += $(wildcard src/*.py) + +default: bin ${PY_FILES} + @cp ${PY_FILES} bin/${DIRNAME} + @echo "#!/bin/bash\nexec /runtime/bin/${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/slu-totem-compressor.py b/src/slu-totem-compressor.py new file mode 100644 index 0000000000000000000000000000000000000000..31fd48f13d10073ebe364fe4fe61ac55f8c185f2 --- /dev/null +++ b/src/slu-totem-compressor.py @@ -0,0 +1,352 @@ +#!/usr/bin/python + +from __future__ import division +import sys +import PyTango +from PyQt4.QtCore import * +from PyQt4.QtGui import * +import numpy as np +import time + +global massimo +massimo = 27.3 +global minimo +minimo = 15.3 +global devprodic +devprodic = {} +devprodic['motor1'] = PyTango.DeviceProxy('slu/motor/trls_slu.02') +devprodic['motor2'] = PyTango.DeviceProxy('slu/motor/trls_slu.04') +devprodic['ranges'] = PyTango.DeviceProxy('slu/misc/ranges') + +class MainWindow(QDialog): + def __init__(self, parent=None): + super(MainWindow, self).__init__(parent) + self.compressor1pos = QLineEdit("") + self.compressor1pos.setReadOnly(1) + self.compressor1pos.setStyleSheet("background-color: rgb(237, 237, 237)") + self.compressor2pos = QLineEdit("") + self.compressor2pos.setReadOnly(1) + self.compressor2pos.setStyleSheet("background-color: rgb(237, 237, 237)") + self.state_motor1 = QLineEdit("") + self.state_motor1.setReadOnly(1) + self.state_motor2 = QLineEdit("") + self.state_motor2.setReadOnly(1) + self.comune_inputabs = QLineEdit("") + self.comune_inputrel = QLineEdit("") + self.comune_goto = QPushButton("Go to") + self.comune_goto.clicked.connect(self.comando_comune_goto) + self.comune_b = QPushButton("<") + self.comune_b.clicked.connect(self.comando_comune_b) + self.comune_f = QPushButton(">") + self.comune_f.clicked.connect(self.comando_comune_f) + self.comune_stop = QPushButton("STOP") + self.comune_stop.clicked.connect(self.comando_comune_stop) + #self.cb_stimaritardo = QCheckBox("Start delay record") + #self.cb_stimaritardo.clicked.connect(self.comando_delay_record) + #self.stimaritardo = QLineEdit("") + #self.stimaritardo.setReadOnly(1) + #self.stimaritardo.setStyleSheet("background-color: rgb(237, 237, 237)") + #self.stimaritardo.setDisabled(1) + self.motore1_pos = QLineEdit("") + self.motore1_pos.setReadOnly(1) + self.motore1_pos.setStyleSheet("background-color: rgb(237, 237, 237)") + self.motore1_offset_read = QLineEdit("") + self.motore1_offset_read.setReadOnly(1) + self.motore1_offset_read.setStyleSheet("background-color: rgb(237, 237, 237)") + self.motore1_offset_write = QLineEdit("") + self.motore1_offset_change = QPushButton("Change") + self.motore1_offset_change.clicked.connect(self.comando_motor1_change) + self.motore1_posabs = QLineEdit("") + self.motore1_goto = QPushButton("Go to") + self.motore1_goto.clicked.connect(self.comando_motor1_goto) + self.motore1_stop = QPushButton("STOP") + self.motore1_stop.clicked.connect(self.comando_motor1_stop) + self.motore1_stop.setMinimumHeight(150) + self.motore1_b = QPushButton("<") + self.motore1_b.clicked.connect(self.comando_motor1_b) + self.motore1_posrel = QLineEdit("") + self.motore1_f = QPushButton(">") + self.motore1_f.clicked.connect(self.comando_motor1_f) + self.motore1_status = QLineEdit("") + self.motore1_status.setReadOnly(1) + self.motore1_init = QPushButton("INIT") + self.motore1_init.clicked.connect(self.comando_motor1_init) + self.motore2_pos = QLineEdit("") + self.motore2_pos.setReadOnly(1) + self.motore2_pos.setStyleSheet("background-color: rgb(237, 237, 237)") + self.motore2_offset_read = QLineEdit("") + self.motore2_offset_read.setReadOnly(1) + self.motore2_offset_read.setStyleSheet("background-color: rgb(237, 237, 237)") + self.motore2_offset_write = QLineEdit("") + self.motore2_offset_change = QPushButton("Change") + self.motore2_offset_change.clicked.connect(self.comando_motor2_change) + self.motore2_posabs = QLineEdit("") + self.motore2_goto = QPushButton("Go to") + self.motore2_goto.clicked.connect(self.comando_motor2_goto) + self.motore2_stop = QPushButton("STOP") + self.motore2_stop.clicked.connect(self.comando_motor2_stop) + self.motore2_stop.setMinimumHeight(150) + self.motore2_b = QPushButton("<") + self.motore2_b.clicked.connect(self.comando_motor2_b) + self.motore2_posrel = QLineEdit("") + self.motore2_f = QPushButton(">") + self.motore2_f.clicked.connect(self.comando_motor2_f) + self.motore2_status = QLineEdit("") + self.motore2_status.setReadOnly(1) + self.motore2_init = QPushButton("INIT") + self.motore2_init.clicked.connect(self.comando_motor2_init) + self.contienitab = QTabWidget() + self.tab1 = QWidget() + self.tab2 = QWidget() + self.tab3 = QWidget() + #self.tab4 = QWidget() + self.contienitab.addTab(self.tab1, "Compressor") + self.contienitab.addTab(self.tab2, "trls_slu.02") + self.contienitab.addTab(self.tab3, "trls_slu.04") + #self.contienitab.addTab(self.tab4, "Info") + lot1 = QGridLayout() + lot1.addWidget(QLabel("ABSOLUTE Movement"), 0, 0, 1, 4) + lot1.addWidget(self.comune_inputabs, 0, 4, 1, 3) + lot1.addWidget(self.comune_goto, 0, 7, 1, 3) + lot1.addWidget(self.comune_stop, 0, 10, 1, 1) + lot1.addWidget(QLabel("RELATIVE Movement"), 1, 0, 1, 4) + lot1.addWidget(self.comune_b, 1, 4, 1, 2) + lot1.addWidget(self.comune_inputrel, 1, 6, 1, 3) + lot1.addWidget(self.comune_f, 1, 9, 1, 2) + #lot1.addWidget(QLabel("Delay"), 2, 0, 1, 4) + #lot1.addWidget(self.cb_stimaritardo, 2, 4, 1, 3) + #lot1.addWidget(self.stimaritardo, 2, 7, 1, 3) + self.tab1.setLayout(lot1) + self.tab1.layout().setSizeConstraint(QLayout.SetFixedSize) + lot2 = QGridLayout() + lot2.addWidget(QLabel("Position"), 0, 0, 1, 1) + lot2.addWidget(self.motore1_pos, 0, 1, 1, 1) + lot2.addWidget(self.motore1_posabs, 0, 2, 1, 1) + lot2.addWidget(self.motore1_goto, 0, 3, 1, 1) + lot2.addWidget(self.motore1_b, 1, 1, 1, 1) + lot2.addWidget(self.motore1_posrel, 1, 2, 1, 1) + lot2.addWidget(self.motore1_f, 1, 3, 1, 1) + lot2.addWidget(QLabel("Offset"), 2, 0, 1, 1) + lot2.addWidget(self.motore1_offset_read, 2, 1, 1, 1) + lot2.addWidget(self.motore1_offset_write, 2, 2, 1, 1) + lot2.addWidget(self.motore1_offset_change, 2, 3, 1, 1) + lot2.addWidget(QLabel("Status"), 3, 0, 1, 1) + lot2.addWidget(self.motore1_status, 3, 1, 1, 2) + lot2.addWidget(self.motore1_init, 3, 3, 1, 1) + lot2.addWidget(self.motore1_stop, 0, 4, 4, 1) + self.tab2.setLayout(lot2) + self.tab2.layout().setSizeConstraint(QLayout.SetFixedSize) + lot3 = QGridLayout() + lot3.addWidget(QLabel("Position"), 0, 0, 1, 1) + lot3.addWidget(self.motore2_pos, 0, 1, 1, 1) + lot3.addWidget(self.motore2_posabs, 0, 2, 1, 1) + lot3.addWidget(self.motore2_goto, 0, 3, 1, 1) + lot3.addWidget(self.motore2_b, 1, 1, 1, 1) + lot3.addWidget(self.motore2_posrel, 1, 2, 1, 1) + lot3.addWidget(self.motore2_f, 1, 3, 1, 1) + lot3.addWidget(QLabel("Offset"), 2, 0, 1, 1) + lot3.addWidget(self.motore2_offset_read, 2, 1, 1, 1) + lot3.addWidget(self.motore2_offset_write, 2, 2, 1, 1) + lot3.addWidget(self.motore2_offset_change, 2, 3, 1, 1) + lot3.addWidget(QLabel("Status"), 3, 0, 1, 1) + lot3.addWidget(self.motore2_status, 3, 1, 1, 2) + lot3.addWidget(self.motore2_init, 3, 3, 1, 1) + lot3.addWidget(self.motore2_stop, 0, 4, 4, 1) + self.tab3.setLayout(lot3) + self.tab3.layout().setSizeConstraint(QLayout.SetFixedSize) + lo = QGridLayout() + lo.addWidget(QLabel("Compressor 1 State & Position"), 0, 0, 1, 3) + lo.addWidget(self.state_motor1, 1, 1, 1, 1) + lo.addWidget(self.compressor1pos, 1, 2, 1, 1) + lo.addWidget(QLabel("Compressor 2 State & Position"), 0, 4, 1, 3) + lo.addWidget(self.state_motor2, 1, 5, 1, 1) + lo.addWidget(self.compressor2pos, 1, 6, 1, 1) + lo.addWidget(self.contienitab, 2, 0, 1, 7) + self.setLayout(lo) + self.layout().setSizeConstraint(QLayout.SetFixedSize) + self.setStyleSheet("QDialog {background-color: rgb(200, 255, 200)}" + "QGroupBox {background-color: rgb(210, 255, 210)}") + self.setWindowTitle("SLU TOTEM COMPRESSOR") + self.show() + self.timer = QBasicTimer() + self.timer.start(1000, self) + + def timerEvent(self, event): + self.update() + + def __del__(self): + self.timer.stop() + pass + + def update(self): + chiamata_motor_1 = devprodic['motor1'].read_attributes(['Position', 'State', 'Status', 'NegativeLimitSwitch', 'PositiveLimitSwitch']) + self.state_motor1.setText(str(chiamata_motor_1[1].value)) + self.motore1_pos.setText(str(round(chiamata_motor_1[0].value, 3))) + self.motore1_status.setText(str(chiamata_motor_1[2].value)) + chiamata_motor_2 = devprodic['motor2'].read_attributes(['Position', 'State', 'Status', 'NegativeLimitSwitch', 'PositiveLimitSwitch']) + self.state_motor2.setText(str(chiamata_motor_2[1].value)) + self.motore2_pos.setText(str(round(chiamata_motor_2[0].value, 3))) + self.motore2_status.setText(str(chiamata_motor_2[2].value)) + chiamata_offset = devprodic['ranges'].read_attributes(['Totem_compressor_Motor_1_offset', 'Totem_compressor_Motor_2_offset']) + self.motore1_offset_read.setText(str(chiamata_offset[0].value)) + self.motore2_offset_read.setText(str(chiamata_offset[1].value)) + self.compressor1pos.setText(str(round(chiamata_offset[0].value - chiamata_motor_1[0].value, 3))) + self.compressor2pos.setText(str(round(chiamata_offset[1].value - chiamata_motor_2[0].value, 3))) + if chiamata_motor_1[3].value or chiamata_motor_1[4].value: + self.state_motor1.setStyleSheet("background-color: #ff0000") + self.state_motor1.setText('L.S. activated!!') + else: + self.state_motor1.setStyleSheet("background-color: #ffffff") + if chiamata_motor_2[3].value or chiamata_motor_2[4].value: + self.state_motor2.setStyleSheet("background-color: #ff0000") + self.state_motor2.setText('L.S. activated!!') + else: + self.state_motor2.setStyleSheet("background-color: #ffffff") + + def comando_comune_goto(self): + gol = float(self.comune_inputabs.text()) + if gol <= massimo and gol >= minimo: + gol1 = devprodic['ranges'].Totem_compressor_Motor_1_offset - gol + gol2 = devprodic['ranges'].Totem_compressor_Motor_2_offset - gol + devprodic['motor1'].write_attribute('AxisCurrentPosition', gol1) + devprodic['motor2'].write_attribute('AxisCurrentPosition', gol2) + else: + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Question) + self.msgBox.setStandardButtons(QMessageBox.Ok) + self.msgBox.setText("Max gap is " + str(massimo) + "mm. Min gap is " + str(minimo) + "mm.") + risp = self.msgBox.exec_() + time.sleep(0.5) + semaf1 = str(devprodic['motor1'].state()) + semaf2 = str(devprodic['motor2'].state()) + liberitutti = 0 + while semaf1 == 'MOVING' or semaf2 == 'MOVING' or liberitutti == 0 and liberitutti != 10: + print('i = ' + str(liberitutti) + 'm1: ' + semaf1 + ', m2: ' + semaf2) + liberitutti = liberitutti +1 + time.sleep(0.3) + semaf1 = str(devprodic['motor1'].state()) + semaf2 = str(devprodic['motor2'].state()) + + + def comando_comune_b(self): + gol = float(self.comune_inputrel.text()) + if float(self.compressor2pos.text()) - gol >= minimo or float(self.compressor1pos.text()) - gol >= minimo: + #print(float(self.compressor2pos.text()) - gol) + devprodic['motor1'].command_inout('AxisGoToRelativePosition', gol) + devprodic['motor2'].command_inout('AxisGoToRelativePosition', gol) + else: + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Question) + self.msgBox.setStandardButtons(QMessageBox.Ok) + self.msgBox.setText("Max gap is " + str(massimo) + "mm. Min gap is " + str(minimo) + "mm.") + risp = self.msgBox.exec_() + time.sleep(0.5) + semaf1 = str(devprodic['motor1'].state()) + semaf2 = str(devprodic['motor2'].state()) + liberitutti = 0 + while semaf1 == 'MOVING' or semaf2 == 'MOVING' or liberitutti == 0 and liberitutti != 10: + print('i = ' + str(liberitutti) + 'm1: ' + semaf1 + ', m2: ' + semaf2) + liberitutti = liberitutti +1 + time.sleep(0.3) + semaf1 = str(devprodic['motor1'].state()) + semaf2 = str(devprodic['motor2'].state()) + + + def comando_comune_f(self): + gol = float(self.comune_inputrel.text()) + if float(self.compressor2pos.text()) + gol <= massimo or float(self.compressor1pos.text()) + gol <= massimo: + #print(float(self.compressor2pos.text()) + gol) + devprodic['motor1'].command_inout('AxisGoToRelativePosition', -gol) + devprodic['motor2'].command_inout('AxisGoToRelativePosition', -gol) + else: + self.msgBox = QMessageBox() + self.msgBox.setIcon(QMessageBox.Question) + self.msgBox.setStandardButtons(QMessageBox.Ok) + self.msgBox.setText("Max gap is " + str(massimo) + "mm. Min gap is " + str(minimo) + "mm.") + risp = self.msgBox.exec_() + time.sleep(0.5) + semaf1 = str(devprodic['motor1'].state()) + semaf2 = str(devprodic['motor2'].state()) + liberitutti = 0 + while semaf1 == 'MOVING' or semaf2 == 'MOVING' or liberitutti == 0 and liberitutti != 10: + print('i = ' + str(liberitutti) + 'm1: ' + semaf1 + ', m2: ' + semaf2) + liberitutti = liberitutti +1 + time.sleep(0.3) + semaf1 = str(devprodic['motor1'].state()) + semaf2 = str(devprodic['motor2'].state()) + + def comando_comune_stop(self): + devprodic['motor1'].axisstop() + devprodic['motor2'].axisstop() + + #def comando_delay_record(self): + #self.stimaritardo.setDisabled(0) + + def comando_motor1_change(self): + gol = float(self.motore1_offset_write.text()) + devprodic['ranges'].write_attribute('Totem_compressor_Motor_1_offset', gol) + + def comando_motor1_goto(self): + gol = float(self.motore1_posabs.text()) + devprodic['motor1'].write_attribute('AxisCurrentPosition', gol) + + def comando_motor1_stop(self): + devprodic['motor1'].axisstop() + + def comando_motor1_b(self): + gol = float(self.motore1_posrel.text()) + devprodic['motor1'].command_inout('AxisGoToRelativePosition', -gol) + + def comando_motor1_f(self): + gol = float(self.motore1_posrel.text()) + devprodic['motor1'].command_inout('AxisGoToRelativePosition', gol) + + def comando_motor1_init(self): + devprodic['motor1'].AxisInit() + + def comando_motor2_change(self): + gol = float(self.motore2_offset_write.text()) + devprodic['ranges'].write_attribute('Totem_compressor_Motor_2_offset', gol) + + def comando_motor2_goto(self): + gol = float(self.motore2_posabs.text()) + devprodic['motor2'].write_attribute('AxisCurrentPosition', gol) + + def comando_motor2_stop(self): + devprodic['motor2'].axisstop() + + def comando_motor2_b(self): + gol = float(self.motore2_posrel.text()) + devprodic['motor2'].command_inout('AxisGoToRelativePosition', -gol) + + def comando_motor2_f(self): + gol = float(self.motore2_posrel.text()) + devprodic['motor2'].command_inout('AxisGoToRelativePosition', gol) + + def comando_motor2_init(self): + devprodic['motor2'].AxisInit() + +##################### +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_pannello = QFont("Arial", round(dimensione/150.0), -1, False) + app.setFont(font_pannello) + window = MainWindow() + window.resize(larghezzaaltezza[0]/6, larghezzaaltezza[1]/6) + window.show() + app.exec_()