Skip to content
Snippets Groups Projects
Commit 4fb83dab authored by Manuela Kuhn's avatar Manuela Kuhn
Browse files

Added example for LiveViewer + fixed API

parent fc4ce599
No related branches found
No related tags found
No related merge requests found
......@@ -224,15 +224,13 @@ class dataTransfer():
def start (self, dataSocket = False, requestHost = None):
# if not self.connectionType:
# raise Exception("No connection specified. Please initiate a connection first.")
alreadyConnected = self.streamStarted or self.queryNextStarted
#TODO Do I need to raise an exception here?
if alreadyConnected:
raise Exception("Connection already started.")
# raise Exception("Connection already started.")
self.log.info("Connection already started.")
return
ip = "0.0.0.0" #TODO use IP of hostname?
......@@ -245,7 +243,6 @@ class dataTransfer():
host = dataSocket[0]
port = dataSocket[1]
else:
self.log.debug("dataSocket=" + str(dataSocket))
port = str(dataSocket)
host = socket.gethostname()
......@@ -292,8 +289,6 @@ class dataTransfer():
self.streamStarted = socketId
##
#
# Receives or queries for new files depending on the connection initialized
......@@ -337,7 +332,12 @@ class dataTransfer():
def __getMultipartMessage (self):
#save all chunks to file
multipartMessage = self.dataSocket.recv_multipart()
try:
multipartMessage = self.dataSocket.recv_multipart()
except:
self.log.error("Receiving files..failed.")
return [None, None]
if len(multipartMessage) < 2:
self.log.error("Received mutipart-message is too short. Either config or file content is missing.")
......@@ -453,6 +453,9 @@ class dataTransfer():
generates full path where target file will saved to.
"""
if not configDict:
return None
filename = configDict["filename"]
#TODO This is due to Windows path names, check if there has do be done anything additionally to work
# e.g. check sourcePath if it's a windows path
......@@ -501,8 +504,6 @@ class dataTransfer():
signal = "STOP_QUERY_NEXT"
self.log.debug("signal=" + str(signal))
message = self.__sendSignal(signal)
#TODO need to check correctness of signal?
......@@ -515,6 +516,10 @@ class dataTransfer():
self.log.info("closing dataSocket...")
self.dataSocket.close(linger=0)
self.dataSocket = None
if self.requestSocket:
self.log.info("closing requestSocket...")
self.requestSocket.close(linger=0)
self.requestSocket = None
except:
self.log.error("closing ZMQ Sockets...failed.", exc_info=True)
......
# -*- 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
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment