Skip to content
Snippets Groups Projects
example_LiveViewer.py 4.94 KiB
# -*- coding: utf-8 -*-
import os
import sys
import time
import socket
#from dectris import albula
from PyQt4 import QtCore
from PyQt4.QtCore import SIGNAL, QThread, QMutex

BASE_PATH = os.path.dirname ( os.path.dirname ( os.path.dirname ( os.path.realpath ( __file__ ) ) ))
API_PATH  = BASE_PATH + os.sep + "APIs"


if not API_PATH in sys.path:
    sys.path.append ( API_PATH )
del API_PATH

from dataTransferAPI import dataTransfer


class LiveView(QThread):
    FILETYPE_CBF = 0
    FILETYPE_TIF = 1
    FILETYPE_HDF5 = 2

    alive = False
    path = ""
    filetype = 0
    interval = 0.5 #s
    stoptimer = -1.0

    viewer = None
    subframe = None
    mutex = None

    zmqQuery      = None
#    zmqSignalIp      = "haspp11eval01.desy.de"
    zmqSignalIp   = "zitpcx19282.desy.de"
    zmqDataPort   = "50022"
    basePath      = BASE_PATH + os.sep + "data" + os.sep + "target"


    def __init__(self, path=None, filetype=None, interval=None, parent=None):
        QThread.__init__(self, parent)
        if path is not None:
            self.path = path
        if filetype is not None:
            self.filetype = filetype
        if interval is not None:
            self.interval = interval

        self.zmqQuery = dataTransfer( "queryNext", self.zmqSignalIp )
        self.zmqQuery.initiate([socket.gethostname(), self.zmqDataPort, "1"])
        self.zmqQuery.start(self.zmqDataPort)

        self.mutex = QMutex()


    def start(self, path=None, filetype=None, interval=None):
        if path is not None:
            self.path = path
        if filetype is not None:
            self.filetype = filetype
        if interval is not None:
           self.interval = interval
        QThread.start(self)



    def stop(self, interval=0.0):
        if self.stoptimer < 0.0 and interval > 0.0:
            print "Live view thread: Stopping in %d seconds"%interval
            self.stoptimer = interval
            return
        print "Live view thread: Stopping thread"
        self.alive = False

        self.wait() # waits until run stops on his own



    def run(self):
        self.alive = True
        print "Live view thread: started"
        suffix = [".cbf", ".tif", ".hdf5"]

        if self.filetype in [LiveView.FILETYPE_CBF, LiveView.FILETYPE_TIF]:
            # open viewer
            while self.alive:
                # find latest image
                self.mutex.lock()

                # get latest file from reveiver
                [metadata, data] = self.zmqQuery.get()

                receivedFile = self.zmqQuery.generateTargetFilepath(self.basePath, metadata)
                print "Next file: ", receivedFile


#                if receivedFile == "None":
#                    self.mutex.unlock()
#                    continue

                time.sleep(0.2)
                # display image
#                try:
#                    self.subframe.loadFile(receivedFile)
                # viewer or subframe has been closed by the user
#                except:
#                    self.mutex.unlock()
#                    time.sleep(0.1)
#                    try:
#                        self.subframe = self.viewer.openSubFrame()
#                    except:
#                        self.viewer = albula.openMainFrame()
#                        self.subframe = self.viewer.openSubFrame()
#                    continue
                self.mutex.unlock()
                # wait interval
                interval = 0.0
                while interval < self.interval and self.alive:
                    if self.stoptimer > 0.0:
                        self.stoptimer -= 0.05
                        if self.stoptimer < 0.0:
                            self.stoptimer = -1.0
                            self.alive = False
                    time.sleep(0.05)
                    interval += 0.05
        elif self.filetype == LiveView.FILETYPE_HDF5:
            print "Live view thread: HDF5 not supported yet"

        print "Live view thread: Thread for Live view died"
        self.alive = False

    def setPath(self, path=None):
        self.mutex.lock()
        if path is not None:
            self.path = path
        self.mutex.unlock()

    def setFiletype(self, filetype=None):
        restart = False
        if self.alive:
            restart = True
            self.stop()
        if filetype is not None:
            self.filetype = filetype
        if restart:
            self.start()

    def setInterval(self, interval=None):
        if interval is not None:
            self.interval = interval


    def __exit__(self):
        self.zmqQuery.stop()


    def __del__(self):
        self.zmqQuery.stop()


if __name__ == '__main__':

    lv = LiveView()

    try:
        print "LiveViewer start"
        lv.start()

        time.sleep(2)
    finally:
        print "LiveViewer stop"
        lv.stop()

    time.sleep(1)

    try:
        print "LiveViewer start"
        lv.start()

        time.sleep(2)
    finally:
        print "LiveViewer stop"
        lv.stop()

        del LiveView