Skip to content
Snippets Groups Projects
anselm.py 8.99 KiB
Newer Older
wactbprot's avatar
wactbprot committed
import sys
wactbprot's avatar
wactbprot committed
import json
wactbprot's avatar
wactbprot committed
from anselm.system import System # pylint: disable=E0611
wactbprot's avatar
wactbprot committed
from anselm.db import DB # pylint: disable=E0611
wactbprot's avatar
wactbprot committed
from anselm.worker import Worker # pylint: disable=E0611
wactbprot's avatar
wactbprot committed
from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication, QPushButton, QComboBox, QGridLayout, QPlainTextEdit
from PyQt5.QtCore import QThread, pyqtSignal , Qt
wactbprot's avatar
wactbprot committed
import sys

wactbprot's avatar
wactbprot committed

class Observe(QThread, System):
    signal = pyqtSignal('PyQt_PyObject')
    def __init__(self):
        QThread.__init__(self)
        System.__init__(self)
       
    def run(self):
        # git clone done, now inform the main thread with the output
    
        self.p.subscribe("io")
        print('Listening redis...')
        for item in self.p.listen():
            self.log.debug("received item: {}".format(item))
Wact B. Prot's avatar
Wact B. Prot committed
            if item['type'] == 'message':            
                self.signal.emit(int(item['data']))
wactbprot's avatar
wactbprot committed

wactbprot's avatar
wactbprot committed
class Anselm(System):
wactbprot's avatar
wactbprot committed
    fullscale = ["SRG", "0.1mbar", "0.25mbar","1mbar", 
                "10mbar", "100mbar", "1000mbar", "0.1Torr", 
                "1Torr", "10Torr", "100Torr", "1000Torr"]
    std_select = ["SE3", "CE3", "FRS5", "DKM_PPC4"]
    year_select = ["2017", "2018", "2019"]
    dut_branches = ["dut-a", "dut-b", "dut-c"]
    run_kinds = ["single", "loop"]
wactbprot's avatar
wactbprot committed
    current_grid_line = 1
    add_device_btn_col = 1
    std_col = 2
    year_col = 3
    cal_id_col = 2
    fullscale_col = 3
    dut_branch_col = 4     
    auxobj_col = 5
    task_col = 6
    run_kind_col = 7
    run_btn_col = 8
    result_col= 1
    line_heigth = 28
    long_line = 350
        
wactbprot's avatar
wactbprot committed
    def __init__(self):
        super().__init__()
wactbprot's avatar
wactbprot committed
        self.db = DB()
wactbprot's avatar
wactbprot committed
        self.worker = Worker()
        self.observer_thread = Observe()
        self.observer_thread.signal.connect(self.end_task)
        self.observer_thread.start()
Wact B. Prot's avatar
Wact B. Prot committed
        self.init_ui()
wactbprot's avatar
wactbprot committed
    
Wact B. Prot's avatar
Wact B. Prot committed
    def init_ui(self):
wactbprot's avatar
wactbprot committed
        self.win = QWidget()
wactbprot's avatar
wactbprot committed
        self.win.closeEvent = self.closeEvent
wactbprot's avatar
wactbprot committed
        self.grid = QGridLayout(self.win)
wactbprot's avatar
wactbprot committed

wactbprot's avatar
wactbprot committed
        self.add_widget_to_grid(self.make_add_device_button(), self.current_grid_line, self.add_device_btn_col)
        self.add_widget_to_grid(self.make_std_combo(),self.current_grid_line, self.std_col)
        self.add_widget_to_grid(self.make_year_combo() ,self.current_grid_line, self.year_col)
wactbprot's avatar
wactbprot committed

        self.draw_grid()  
wactbprot's avatar
wactbprot committed
   
wactbprot's avatar
wactbprot committed
    def make_add_device_button(self):

        b = QPushButton("add device", self.win)
        b.setStyleSheet("background-color: yellow")
        b.setFixedSize(self.long_line, self.line_heigth)
        b.clicked.connect(self.add_device_line)

        return b

    def make_std_combo(self):
        c = self.make_combo(self.std_select)
        c.currentIndexChanged.connect(lambda: self.std_selected(c))
        
        return c

    def make_year_combo(self):
        c = self.make_combo(self.year_select)
        c.currentIndexChanged.connect(lambda: self.year_selected(c))
        
        return c

Wact B. Prot's avatar
Wact B. Prot committed
    def add_widget_to_grid(self, widget, line, col):

        #old_widget_item = self.grid.itemAtPosition (line, col)
        #old_widget = old_widget_item.widget()
wactbprot's avatar
wactbprot committed
        
Wact B. Prot's avatar
Wact B. Prot committed
        self.grid.addWidget(widget, line, col)

wactbprot's avatar
wactbprot committed
    def make_combo(self, item_list, first_item=True, last_item=True):
wactbprot's avatar
wactbprot committed
        c = QComboBox(self.win)
Wact B. Prot's avatar
Wact B. Prot committed
        if first_item:
wactbprot's avatar
wactbprot committed
            c.addItem(self.first_item)
        
Wact B. Prot's avatar
Wact B. Prot committed
        for item in item_list:
wactbprot's avatar
wactbprot committed
            c.addItem(item)
wactbprot's avatar
wactbprot committed
        
        if last_item:
            c.addItem(self.last_item)
wactbprot's avatar
wactbprot committed
        return c
Wact B. Prot's avatar
Wact B. Prot committed

    def run_task(self, line):
        self.log.info("try to start device at line {}".format(line))
        self.worker.work_on_line = line
        self.worker.run()
    
    def end_task(self, line):
Wact B. Prot's avatar
Wact B. Prot committed
        self.add_widget_to_grid(self.make_result_label(line = line), line, self.result_col)

        self.log.info("end task at line {}".format(line))

wactbprot's avatar
wactbprot committed
    def add_device_line(self):
        self.current_grid_line +=1
Wact B. Prot's avatar
Wact B. Prot committed
        
wactbprot's avatar
wactbprot committed
        line = self.current_grid_line
wactbprot's avatar
wactbprot committed
        self.add_widget_to_grid(self.make_cal_id_combo(line = line), line, self.cal_id_col)
Wact B. Prot's avatar
Wact B. Prot committed
        self.add_widget_to_grid(self.make_auxobj_combo(line = line), line, self.auxobj_col)
wactbprot's avatar
wactbprot committed
        self.add_widget_to_grid(self.make_fullscale_combo(line = line), line, self.fullscale_col)
        self.add_widget_to_grid(self.make_dut_branch_combo(line = line), line, self.dut_branch_col)
        self.add_widget_to_grid(self.make_result_label(line = line), line, self.result_col)
wactbprot's avatar
wactbprot committed

wactbprot's avatar
wactbprot committed
    def draw_grid(self):
        self.win.setLayout(self.grid)
wactbprot's avatar
wactbprot committed
        self.win.setWindowTitle('Anselm')
wactbprot's avatar
wactbprot committed
        self.win.show()
wactbprot's avatar
wactbprot committed

wactbprot's avatar
wactbprot committed
    def make_run_bttn(self, line):
Wact B. Prot's avatar
Wact B. Prot committed
        b = QPushButton("run", self.win)  
        b.clicked.connect(lambda: self.run_task(line))
wactbprot's avatar
wactbprot committed

Wact B. Prot's avatar
Wact B. Prot committed
        return b
wactbprot's avatar
wactbprot committed

Wact B. Prot's avatar
Wact B. Prot committed
    def make_result_label(self, line):
        widget_item = self.grid.itemAtPosition (line, self.result_col)
        if widget_item:
            l = widget_item.widget()
        else:
wactbprot's avatar
wactbprot committed
            l = QPlainTextEdit(self.win)
wactbprot's avatar
wactbprot committed
            l.setFixedSize(self.long_line, self.line_heigth*4)
wactbprot's avatar
wactbprot committed
        l.setStyleSheet("background-color: lightyellow")
Wact B. Prot's avatar
Wact B. Prot committed
        result = self.aget('result', line)
wactbprot's avatar
wactbprot committed
        if result:
wactbprot's avatar
wactbprot committed
            txt = str(result)
            txt = txt.replace(",", ",\n")
wactbprot's avatar
wactbprot committed
        else:
wactbprot's avatar
wactbprot committed
            txt = ""
wactbprot's avatar
wactbprot committed

        l.setPlainText("{}".format(txt))
       
Wact B. Prot's avatar
Wact B. Prot committed
        return l
wactbprot's avatar
wactbprot committed

wactbprot's avatar
wactbprot committed
        c = self.make_combo(self.run_kinds, first_item=False, last_item=False) 
Wact B. Prot's avatar
Wact B. Prot committed
        c.currentIndexChanged.connect(lambda: self.run_kind_selected(c, line))
wactbprot's avatar
wactbprot committed

Wact B. Prot's avatar
Wact B. Prot committed
        return c
wactbprot's avatar
wactbprot committed
   
wactbprot's avatar
wactbprot committed
    def make_dut_branch_combo(self, line):
wactbprot's avatar
wactbprot committed
       
wactbprot's avatar
wactbprot committed
        c = self.make_combo(self.dut_branches) 
wactbprot's avatar
wactbprot committed
        c.currentIndexChanged.connect(lambda: self.dut_branch_selected(c, line))
wactbprot's avatar
wactbprot committed

wactbprot's avatar
wactbprot committed
        return c

    def make_fullscale_combo(self, line):
       
wactbprot's avatar
wactbprot committed
        c = self.make_combo(self.fullscale) 
wactbprot's avatar
wactbprot committed
        c.currentIndexChanged.connect(lambda: self.fullscale_selected(c, line))

        return c

wactbprot's avatar
wactbprot committed
    def make_cal_id_combo(self, line):
wactbprot's avatar
wactbprot committed
       
wactbprot's avatar
wactbprot committed
        cal_ids = self.db.get_cal_ids()
wactbprot's avatar
wactbprot committed
        c = self.make_combo(cal_ids) 
wactbprot's avatar
wactbprot committed
        c.currentIndexChanged.connect(lambda: self.cal_id_selected(c, line))
wactbprot's avatar
wactbprot committed

Wact B. Prot's avatar
Wact B. Prot committed
        return c
wactbprot's avatar
wactbprot committed
   
wactbprot's avatar
wactbprot committed
    def make_auxobj_combo(self, line):
       
        aux_obj_ids = self.db.get_auxobj_ids()
       
        self.log.debug("found following auxobj ids {}".format(aux_obj_ids))
       
wactbprot's avatar
wactbprot committed
        c = self.make_combo(aux_obj_ids, first_item=True, last_item=False) 
Wact B. Prot's avatar
Wact B. Prot committed
        c.currentIndexChanged.connect(lambda: self.auxobj_selected(c, line))
wactbprot's avatar
wactbprot committed

Wact B. Prot's avatar
Wact B. Prot committed
        return c
wactbprot's avatar
wactbprot committed
    
    def make_task_combo(self, doc_id, line):
        task_names = self.db.get_task_names(doc_id = doc_id)
        self.log.debug("found following tasknames {}".format(task_names))
wactbprot's avatar
wactbprot committed
        c = self.make_combo(task_names, first_item=True, last_item=False) 
Wact B. Prot's avatar
Wact B. Prot committed
        c.currentIndexChanged.connect(lambda: self.task_selected(c, line))
wactbprot's avatar
wactbprot committed

Wact B. Prot's avatar
Wact B. Prot committed
        return c
wactbprot's avatar
wactbprot committed

    def run_kind_selected(self, combo, line):
        run_kind = combo.currentText()
wactbprot's avatar
wactbprot committed
        self.aset('run_kind', line, run_kind)
wactbprot's avatar
wactbprot committed
    def task_selected(self, combo, line):
        task_name = combo.currentText()
wactbprot's avatar
wactbprot committed
        doc_id = self.aget('doc_id', line)
        self.aset('task_name', line, task_name)
wactbprot's avatar
wactbprot committed
        task = self.db.get_task(doc_id, task_name)
wactbprot's avatar
wactbprot committed
        self.aset('task', line, task) 
Wact B. Prot's avatar
Wact B. Prot committed
        
        # add elements for next actions
        self.add_widget_to_grid(self.make_run_bttn(line=line), line, self.run_btn_col)
        self.add_widget_to_grid(self.make_run_kind_combo(line=line), line, self.run_kind_col)
 
wactbprot's avatar
wactbprot committed
        self.log.debug("task: {}".format(task))
wactbprot's avatar
wactbprot committed
        self.log.info("task with name {} selected at line {}".format(task_name, line))
wactbprot's avatar
wactbprot committed

wactbprot's avatar
wactbprot committed
    def auxobj_selected(self, combo, line):
Wact B. Prot's avatar
Wact B. Prot committed

wactbprot's avatar
wactbprot committed
        doc_id = combo.currentText()
wactbprot's avatar
wactbprot committed
        self.aset('doc_id', line, doc_id)
wactbprot's avatar
wactbprot committed
        self.log.debug("select {} at line {}".format(doc_id, line))
Wact B. Prot's avatar
Wact B. Prot committed
        task_combo = self.make_task_combo(doc_id = doc_id, line = line)
        self.add_widget_to_grid(widget=task_combo, line=line, col=self.task_col)
wactbprot's avatar
wactbprot committed
        #self.draw_grid()
wactbprot's avatar
wactbprot committed
    
    def cal_id_selected(self, combo, line):
        cal_id = combo.currentText()
wactbprot's avatar
wactbprot committed
        self.aset('calid', line, cal_id)
        self.log.info("select calibration id {}".format( cal_id )) 
wactbprot's avatar
wactbprot committed
    def fullscale_selected(self, combo, line):
        fs = combo.currentText()
        self.aset('fullscale', line, fs)
        self.log.info("select fullscale {}".format( fs ))

    def dut_branch_selected(self, combo, line):
        dut = combo.currentText()
        self.aset('dut_branch', line, dut)
        self.log.info("device at line {} attached to {}".format(line,  dut ))
wactbprot's avatar
wactbprot committed
    def std_selected(self, combo):
wactbprot's avatar
wactbprot committed
        standard = combo.currentText()
wactbprot's avatar
wactbprot committed
        self.aset('standard', 0,  standard )
wactbprot's avatar
wactbprot committed
        self.log.info("select standard {}".format( standard))
wactbprot's avatar
wactbprot committed
    
    def year_selected(self, combo):
        year = combo.currentText()
wactbprot's avatar
wactbprot committed
        self.aset('year', 0, year)
wactbprot's avatar
wactbprot committed
        self.log.info("select year {}".format( year ))
wactbprot's avatar
wactbprot committed

wactbprot's avatar
wactbprot committed
    def closeEvent(self, event):
        self.log.info("flush redis database")
        self.r.flushdb()
        if True:
            event.accept()
        else:
            event.ignore()
wactbprot's avatar
wactbprot committed

wactbprot's avatar
wactbprot committed
if __name__ == '__main__':
    app = QApplication(sys.argv)
wactbprot's avatar
wactbprot committed
    Anselm()
wactbprot's avatar
wactbprot committed
    sys.exit(app.exec_())