Beispiel #1
0
    def __init__(self, parser=None):

        self.proc_parser(parser)

        if __name__ != "__main__":
            daq_control.set_daq_control(
                DaqControl(host=self.host,
                           platform=self.platform,
                           timeout=self.timeout))
            QWZMQListener.__init__(self,
                                   host=self.host,
                                   platform=self.platform,
                                   timeout=self.timeout)
        else:  # emulator mode for TEST ONLY
            QWZMQListener.__init__(self, is_normal=False)

        self.init_daq_control_parameters()  # cach parameters in cp

        self.wlogr = QWLoggerStd(log_level=self.loglevel, instrument=cp.instr,\
                                 log_prefix=self.logdir, show_buttons=False)

        logger.debug('logger started with log_level:%s instrument:%s' %
                     (self.loglevel, cp.instr))

        cp.cgwmain = self

        self.main_win_width = cp.main_win_width
        self.main_win_height = cp.main_win_height
        self.main_win_pos_x = cp.main_win_pos_x
        self.main_win_pos_y = cp.main_win_pos_y

        #icon.set_icons()

        self.wconf = CGWMainConfiguration()
        #self.wtabs = CGWMainTabs()
        self.wtabs = CGWMainTabExpert()
        self.winfo = CGWMainInfo()

        self.vspl = QSplitter(Qt.Vertical)
        self.vspl.addWidget(self.wconf)
        self.vspl.addWidget(self.wtabs)
        self.vspl.addWidget(self.winfo)
        self.vspl.addWidget(self.wlogr)

        self.mbox = QHBoxLayout()
        self.mbox.addWidget(self.vspl)
        self.setLayout(self.mbox)

        self.set_style()
        #self.set_tool_tips()
        #self.connect_signals_to_slots()
        #self.move(self.pos()) # + QPoint(self.width()+5, 0))
        self.set_buts_enabled()
Beispiel #2
0
    def __init__(self, parser=None):

        self.proc_parser(parser)

        if __name__ != "__main__":
            daq_control.set_daq_control(
                DaqControl(host=self.host,
                           platform=self.platform,
                           timeout=self.timeout))
            QWZMQListener.__init__(self,
                                   host=self.host,
                                   platform=self.platform,
                                   timeout=self.timeout)
        else:  # emulator mode for TEST ONLY
            QWZMQListener.__init__(self, is_normal=False)

        self.wlogr = QWLoggerStd(log_level=self.loglevel,
                                 show_buttons=False,
                                 log_prefix=self.logdir)

        #instrument = self.expname[:3].upper()
        instrument = daq_control().getInstrument()
        logger.debug('daq_control().getInstrument(): %s' % instrument)
        self.inst = 'TMO' if instrument in ('TST', None) else instrument

        cp.cgwmain = self

        self.main_win_width = cp.main_win_width
        self.main_win_height = cp.main_win_height
        self.main_win_pos_x = cp.main_win_pos_x
        self.main_win_pos_y = cp.main_win_pos_y

        #icon.set_icons()

        self.wconf = CGWMainConfiguration(parent_ctrl=self)
        self.wtabs = CGWMainTabs(parent_ctrl=self)

        self.vspl = QSplitter(Qt.Vertical)
        self.vspl.addWidget(self.wconf)
        self.vspl.addWidget(self.wtabs)
        self.vspl.addWidget(self.wlogr)

        self.mbox = QHBoxLayout()
        self.mbox.addWidget(self.vspl)
        self.setLayout(self.mbox)

        self.set_style()
Beispiel #3
0
class CGWMain(QWZMQListener):

    _name = 'CGWMain'

    def __init__(self, parser=None):

        self.proc_parser(parser)

        if __name__ != "__main__":
            daq_control.set_daq_control(
                DaqControl(host=self.host,
                           platform=self.platform,
                           timeout=self.timeout))
            QWZMQListener.__init__(self,
                                   host=self.host,
                                   platform=self.platform,
                                   timeout=self.timeout)
        else:  # emulator mode for TEST ONLY
            QWZMQListener.__init__(self, is_normal=False)

        self.init_daq_control_parameters()  # cach parameters in cp

        self.wlogr = QWLoggerStd(log_level=self.loglevel, instrument=cp.instr,\
                                 log_prefix=self.logdir, show_buttons=False)

        logger.debug('logger started with log_level:%s instrument:%s' %
                     (self.loglevel, cp.instr))

        cp.cgwmain = self

        self.main_win_width = cp.main_win_width
        self.main_win_height = cp.main_win_height
        self.main_win_pos_x = cp.main_win_pos_x
        self.main_win_pos_y = cp.main_win_pos_y

        #icon.set_icons()

        self.wconf = CGWMainConfiguration()
        self.wtabs = CGWMainTabs()

        self.vspl = QSplitter(Qt.Vertical)
        self.vspl.addWidget(self.wconf)
        self.vspl.addWidget(self.wtabs)
        self.vspl.addWidget(self.wlogr)

        self.mbox = QHBoxLayout()
        self.mbox.addWidget(self.vspl)
        self.setLayout(self.mbox)

        self.set_style()
        #self.set_tool_tips()
        #self.connect_signals_to_slots()
        #self.move(self.pos()) # + QPoint(self.width()+5, 0))

    def connect_signals_to_slots(self):
        pass
        #self.connect(self.wbut.but_reset, QtCore.SIGNAL('clicked()'), self.on_but_reset)
        #self.connect(self.wbut.but_save,  QtCore.SIGNAL('clicked()'), self.on_but_save)

#------------------------------

    def proc_parser(self, parser=None):
        self.parser = parser

        if parser is None:
            self.loglevel = 'DEBUG'
            self.logdir = 'logdir'
            self.expert = None
            return

        (popts, pargs) = parser.parse_args()
        self.args = pargs
        self.opts = vars(popts)
        self.defs = vars(parser.get_default_values())

        self.logdir = popts.logdir
        self.loglevel = popts.loglevel.upper()
        self.host = popts.host
        self.platform = popts.platform
        self.timeout = popts.timeout
        self.expname = popts.expname
        self.uris = popts.uris  # 'https://pswww.slac.stanford.edu/ws-auth/devconfigdb/ws/'
        self.expert = popts.expert  # bool
        self.user = popts.user
        self.password = popts.password

        #if host     != self.defs['host']      : cp.cdb_host.setValue(host)
        #if host     != self.defs['host']      : cp.cdb_host.setValue(host)
        #if port     != self.defs['port']      : cp.cdb_port.setValue(port)
        #if exp      != self.defs['experiment']: cp.exp_name.setValue(exp)
        #if det      != self.defs['detector']  : cp.data_source.setValue(det)
        #if loglevel != self.defs['loglevel']  : cp.log_level.setValue(loglevel)
        #if logdir   != self.defs['logdir']    : cp.log_prefix.setValue(logdir)

        #if is_in_command_line(None, '--host')      : cp.cdb_host.setValue(host)
        #if is_in_command_line(None, '--port')      : cp.cdb_port.setValue(port)
        #if is_in_command_line('-e', '--experiment'): cp.exp_name.setValue(exp)
        #if is_in_command_line('-d', '--detector')  : cp.data_source.setValue(det)
        #if is_in_command_line('-l', '--loglevel')  : cp.log_level.setValue(loglevel)
        #if is_in_command_line('-L', '--logdir')    : cp.log_prefix.setValue(logdir)

        #if self.loglevel == 'DEBUG':
        #    print(40*'_')
        #    print_parser(parser)
        #    print_kwargs(self.opts)
#------------------------------

    def init_daq_control_parameters(self):
        cp.s_transition, cp.s_state, cp.s_cfgtype, cp.s_recording, _platform, \
            cp.s_bypass_activedet, cp.s_experiment_name, cp.s_run_number, cp.s_last_run_number = daq_control_get_status()
        cp.instr = daq_control_get_instrument()
        logger.debug('daq_control_get_instrument(): %s' % cp.instr)
        if cp.instr is None: logger.warning('instrument is None')

#------------------------------

    def set_tool_tips(self):
        pass
        #self.setToolTip('DAQ control')

#--------------------

    def sizeHint(self):
        """Set default window size
        """
        return QSize(370, 810)

#--------------------

    def set_style(self):
        self.setWindowTitle("DAQ Control")
        self.layout().setContentsMargins(0, 0, 0, 0)
        self.setMinimumSize(300, 700)

        self.wconf.setFixedHeight(80)

        self.setGeometry(self.main_win_pos_x .value(),\
                         self.main_win_pos_y .value(),\
                         self.main_win_width .value(),\
                         self.main_win_height.value())
        #w_height = self.main_win_height.value()

        #self.layout().setContentsMargins(0,0,0,0)

        from psdaq.control_gui.QWIcons import icon, QIcon

        icon.set_icons()
        #self.setWindowIcon(icon.icon_button_ok)
        self.setWindowIcon(icon.icon_lcls)

        #pmap = icon.icon_lcls.pixmap(QSize(200,100)) # change icon.pixmap size
        #self.setWindowIcon(QIcon(pmap))

        #w = self.main_win_width.value()
        #spl_pos = cp.main_vsplitter.value()
        #self.vspl.setSizes((spl_pos,w_height-spl_pos,))

        #self.wrig.setMinimumWidth(350)
        #self.wrig.setMaximumWidth(450)

        #self.wrig.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Ignored)
        #self.hspl.moveSplitter(w*0.5,0)

        #self.setFixedSize(800,500)
        #self.setMinimumSize(500,800)

        #self.setStyleSheet("background-color:blue; border: 0px solid green")
        #self.setAttribute(QtCore.Qt.WA_TranslucentBackground)

        #self.        setStyleSheet(style.styleBkgd)
        #self.butSave.setStyleSheet(style.styleButton)
        #self.butExit.setStyleSheet(style.styleButton)
        #self.butELog.setStyleSheet(style.styleButton)
        #self.butFile.setStyleSheet(style.styleButton)

        #self.butELog    .setVisible(False)
        #self.butFBrowser.setVisible(False)

        #self.but1.raise_()

    def closeEvent(self, e):
        logger.debug('%s.closeEvent' % self._name)

        resp = confirm_or_cancel_dialog_box(parent=None,
                                            text='Close window?',\
                                            title='Confirm or cancel')
        if not resp:
            logger.warning('Closing window is cancelled')
            e.ignore()
            return

        logger.debug('Closing window is confirmed')

        # save app-configuration parameters
        #try:
        #    self.on_save()
        #except Exception as ex:
        #    print('Exception: %s' % ex)

        try:
            self.wtabs.close()
            self.wconf.close()
            self.wlogr.close()
        except Exception as ex:
            print('Exception: %s' % ex)

        QWZMQListener.closeEvent(self, e)

        #print('Exit CGWMain.closeEvent')

        cp.cgwmain = None

#--------------------

#    def __del__(self):
#        logger.debug('In CGConfigParameters d-tor')
#        #if self.save_cp_at_exit.value():
#        if True:
#            self.on_save()

#--------------------

#def resizeEvent(self, e):
#logger.debug('CGWMain.resizeEvent: %s' % str(self.size()))
#QWZMQListener.resizeEvent(self, e)

#def moveEvent(self, e):
#logger.debug('moveEvent', self._name)
#self.position = self.mapToGlobal(self.pos())
#self.position = self.pos()
#logger.debug('moveEvent - pos:' + str(self.position), __name__)
#logger.info('CGWMain.moveEvent - move window to x,y: ', str(self.mapToGlobal(QPoint(0,0))))
#self.wimg.move(self.pos() + QPoint(self.width()+5, 0))
#pass

    def on_save(self):

        point, size = self.mapToGlobal(QPoint(
            -5, -22)), self.size()  # Offset (-5,-22) for frame size.
        x, y, w, h = point.x(), point.y(), size.width(), size.height()
        msg = 'Save main window x,y,w,h: %d, %d, %d, %d' % (x, y, w, h)
        logger.info(msg)  #, self._name)
        print(msg)

        #Save main window position and size
        self.main_win_pos_x.setValue(x)
        self.main_win_pos_y.setValue(y)
        self.main_win_width.setValue(w)
        self.main_win_height.setValue(h)

        spl_pos = self.vspl.sizes()[0]
        msg = 'Save main v-splitter position %d' % spl_pos
        logger.debug(msg)

        #cp.main_vsplitter.setValue(spl_pos)

        cp.printParameters()
        cp.saveParametersInFile()

        #if cp.save_log_at_exit.value():
        #    pass
        # ?????
        #log.saveLogInFile(cp.log_file.value())
        #print('Saved log file: %s' % cp.log_file.value())
        #log.saveLogTotalInFile(fnm.log_file_total())

#------------------------------

    def on_zmq_poll(self):
        """Re-implementation of the superclass QWZMQListener method for zmq message processing.
        """
        t0_sec = time()
        self.zmq_notifier.setEnabled(False)
        flags = self.zmq_socket.getsockopt(zmq.EVENTS)
        flag = 'UNKNOWN'
        msg = ''
        if flags & zmq.POLLIN:
            while self.zmq_socket.getsockopt(zmq.EVENTS) & zmq.POLLIN:
                flag = 'POLLIN'
                msg = self.zmq_socket.recv_multipart()
                self.process_zmq_message(msg)
                #self.setWindowTitle(str(msg))
        elif flags & zmq.POLLOUT:
            flag = 'POLLOUT'
        elif flags & zmq.POLLERR:
            flag = 'POLLERR'
        else:
            pass

        self.zmq_notifier.setEnabled(True)
        _flags = self.zmq_socket.getsockopt(
            zmq.EVENTS
        )  # WITHOUT THIS LINE IT WOULD NOT CALL on_read_msg AGAIN!
        logger.debug('CGWMain.on_zmq_poll Flag zmq.%s in %d msg: %s' % (flag, flags, msg)\
                   + '\n    poll processing time = %.6f sec' % (time()-t0_sec))
        if _flags & zmq.POLLIN: self.on_zmq_poll()

    def process_zmq_message(self, msg):
        #print('==== msg: %s' % str(msg))

        wcoll = cp.cgwmaincollection
        wctrl = cp.cgwmaintabuser if cp.cgwmaintabuser is not None else\
                cp.cgwmaincontrol

        try:
            for rec in msg:
                jo = json.loads(rec)
                #  jo['header'] # {'key': 'status', 'msg_id': '0918505109-317821000', 'sender_id': None}
                #  jo['body']   # {'state': 'allocated', 'transition': 'alloc'}

                jo_header_key = jo['header']['key']

                if jo_header_key == 'status':
                    body = jo['body']
                    cp.s_transition = body['transition']
                    cp.s_state = body['state']
                    cp.s_cfgtype = body['config_alias']  # BEAM/NO BEAM
                    cp.s_recording = body['recording']  # True/False
                    cp.s_platform = body.get('platform', None)  # dict
                    cp.s_bypass_activedet = body[
                        'bypass_activedet']  # True/False
                    cp.s_experiment_name = body['experiment_name']  # string
                    cp.s_run_number = body['run_number']  # int
                    cp.s_last_run_number = body['last_run_number']  # int

                    #====
                    if wctrl is not None: wctrl.set_but_ctrls()
                    if wctrl is not None:
                        wctrl.update_progress_bar(0, is_visible=False)
                    self.wconf.set_config_type(cp.s_cfgtype)
                    if wcoll is not None: wcoll.update_table()
                    logger.info('zmq msg transition:%s state:%s config:%s recording:%s'%\
                                (cp.s_transition, cp.s_state, cp.s_cfgtype, cp.s_recording))

                elif jo_header_key == 'error':
                    body = jo['body']
                    logger.error(str(body['err_info']))
                    if wctrl is not None:
                        wctrl.update_progress_bar(0, is_visible=False)
                    if wctrl is not None: wctrl.set_but_ctrls()

                    ## grab status directly (not from error message)
                    #status = daq_control_get_status()
                    #if status is None:
                    #    logger.warning('process_zmq_message on error: STATUS IS NOT AVAILABLE')
                    #    return

                    #transition, state, cfgtype, recording = status
                    #self.wconf.set_config_type(cfgtype)
                    #if wcoll is not None: wcoll.update_table()

                elif jo_header_key == 'warning':
                    body = jo['body']
                    logger.warning(str(body['err_info']))
                    if wctrl is not None:
                        wctrl.update_progress_bar(0, is_visible=False)
                    if wctrl is not None: wctrl.set_but_ctrls()

                elif jo_header_key == 'progress':
                    body = jo['body']
                    logger.debug('progress: %s' % str(body))
                    if wctrl is not None:
                        v = 100 * body['elapsed'] / body['total']
                        wctrl.update_progress_bar(
                            v, is_visible=True, trans_name=body['transition'])

                else:
                    sj = json.dumps(jo, indent=2, sort_keys=False)
                    logger.debug('received jason:\n%s' % sj)
                    if wctrl is not None:
                        wctrl.update_progress_bar(0, is_visible=False)

        except KeyError as ex:
            logger.warning('CGWMain.process_zmq_message: %s\nError: %s' %
                           (str(msg), ex))

        except Exception as ex:
            logger.warning('CGWMain.process_zmq_message: %s\nError: %s' %
                           (str(msg), ex))

#------------------------------
#------------------------------
#------------------------------
#------------------------------

    if __name__ == "__main__":

        def key_usage(self):
            return 'Keys:'\
                   '\n  V - view/hide tabs'\
                   '\n'

        def keyPressEvent(self, e):
            #print('keyPressEvent, key=', e.key())
            if e.key() == Qt.Key_Escape:
                self.close()
            elif e.key() == Qt.Key_V:
                self.wtab.view_hide_tabs()
            else:
                logger.info(self.key_usage())