diff --git a/LiveViewer.py b/LiveViewer.py index 006ec82309102c1a6099ee0e50555778ccb2748b..59e5f6abed754c46b7057bc2b337f5ff1ebd2adf 100644 --- a/LiveViewer.py +++ b/LiveViewer.py @@ -1,118 +1,166 @@ -# -*- coding: utf-8 -*- -import os -import time -from dectris import albula -from PyQt4 import QtCore -from PyQt4.QtCore import SIGNAL, QThread, QMutex - -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 - - 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.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() - files = [(os.path.getmtime(self.path + "/" + fn), fn) - for fn in os.listdir(self.path) if fn.lower().endswith(suffix[self.filetype])] - files.sort() - files.reverse() - if len(files) > 0: - # display image - # wait to make sure the image is copied completely before displaying it - time.sleep(0.1) - try: - self.subframe.loadFile(self.path + "/" + files[0][1]) - # 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 - +# -*- coding: utf-8 -*- +import os +import time +#from dectris import albula +from PyQt4 import QtCore +from PyQt4.QtCore import SIGNAL, QThread, QMutex +import zmq + +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 + + zmqIp = "127.0.0.1" + zmqPort = "6071" + zmqContext = None + zmqSocket = None + + 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.zmqContext, self.zmqSocket = createZmqSocket(self.zmqIp, self.zmqPort) + 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 + + # close ZeroMQ socket and destroy ZeroMQ context + stopZmq(self.zmqSocket, self.zmqContext) + + 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: + print "self.alive", self.alive + # find latest image + self.mutex.lock() + + # get latest file from reveiver + try: + received_file = communicateWithReceiver(self.zmqSocket) + except zmq.error.ZMQError: + print "ZMQError" + break + + # display image +# try: +# self.subframe.loadFile(receiived_file) + # 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 createZmqSocket(zmqIp, zmqPort): + context = zmq.Context() + assert isinstance(context, zmq.sugar.context.Context) + + socket = context.socket(zmq.REQ) + connectionStrSocket = "tcp://{ip}:{port}".format(ip=zmqIp, port=zmqPort) + socket.connect(connectionStrSocket) + + return context, socket + +def communicateWithReceiver(socket): + print "Asking for next file" + socket.send ("NextFile") + # Get the reply. + message = socket.recv() + print "Next file: ", message + +def stopZmq(zmqSocket, zmqContext): + try: + print "closing zmqSocket..." + zmqSocket.close(linger=0) + print "closing zmqSocket...done." + except Exception as e: + print "closing zmqSocket...failed." + print e + + try: + print"closing zmqContext..." + zmqContext.destroy() + "closing zmqContext...done." + except Exception as e: + print "closing zmqContext...failed." + print e +