Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# -*- 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