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 import time
34 import socket
35 import threading
36 import xmlrpclib
37 import random
38 from PySide import QtCore
39 from PySide import QtGui
40
41 import rospy
42
43 import node_manager_fkie as nm
44 from detailed_msg_box import WarningMessageBox, DetailedError
45
47 '''
48 request: AuthenticationRequest
49 '''
50 - def __init__(self, request, method, args):
51 Exception.__init__(self)
52 self.method = method
53 self.request = request
54 self.args = args
55
57 return "InteractionNeededError"
58
59
61
62 - def __init__(self, progress_frame, progress_bar, progress_cancel_button):
63 self.__progress_queue = []
64 self._progress_frame = progress_frame
65 self._progress_bar = progress_bar
66 self._progress_cancel_button = progress_cancel_button
67 progress_frame.setVisible(False)
68 progress_cancel_button.clicked.connect(self._on_progress_canceled)
69
71 try:
72 val = self._progress_bar.value()
73 if val < len(self.__progress_queue):
74 print " Shutdown progress queue..."
75 thread = self.__progress_queue[val]
76 self.__progress_queue = []
77 thread.join(3)
78 print " Progress queue is off!"
79 except:
80 pass
81
82
83 - def add2queue(self, id, descr, target=None, args=()):
84 pt = ProgressThread(id, descr, target, args)
85 pt.finished_signal.connect(self._progress_thread_finished)
86 pt.error_signal.connect(self._progress_thread_error)
87 pt.request_interact_signal.connect(self._on_request_interact)
88 self.__progress_queue.append(pt)
89 self._progress_bar.setMaximum(len(self.__progress_queue))
90
92 if not self._progress_frame.isVisible() and self.__progress_queue:
93 self._progress_frame.setVisible(True)
94 self._progress_bar.setValue(0)
95 self.__progress_queue[0].start()
96
98 return len(self.__progress_queue)
99
101 try:
102
103 val = self._progress_bar.value()
104 self.__progress_queue[val+1].start()
105 self._progress_bar.setValue(val+1)
106
107 except:
108
109 for thread in self.__progress_queue:
110 thread.join(1)
111 self._progress_frame.setVisible(False)
112
113 self.__progress_queue = []
114
115
117 res = WarningMessageBox(QtGui.QMessageBox.Warning, title, msg, detailed_msg,
118 buttons=(QtGui.QMessageBox.Ignore|QtGui.QMessageBox.Abort) ).exec_()
119 if res == QtGui.QMessageBox.Abort:
120 self.__progress_queue = []
121 self._progress_frame.setVisible(False)
122 else:
123 self._progress_thread_finished(id)
124
126 try:
127
128 self.__progress_queue = []
129 self._progress_frame.setVisible(False)
130 except:
131 import traceback
132 print traceback.format_exc()
133
135 if isinstance(req.request, nm.AuthenticationRequest):
136 res, user, pw = nm.ssh()._requestPW(req.request.user, req.request.host)
137 if not res:
138 self._on_progress_canceled()
139 return
140 pt = ProgressThread(id, descr, req.method, (req.args+(user, pw)))
141 pt.finished_signal.connect(self._progress_thread_finished)
142 pt.error_signal.connect(self._progress_thread_error)
143 pt.request_interact_signal.connect(self._on_request_interact)
144 pt.start()
145 elif isinstance(req.request, nm.ScreenSelectionRequest):
146 from select_dialog import SelectDialog
147 items = SelectDialog.getValue('Show screen', req.request.choices.keys(), False)
148 if not items:
149 self._progress_thread_finished(id)
150 return
151 res = [req.request.choices[i] for i in items]
152 pt = ProgressThread(id, descr, req.method, (req.args+(res,)))
153 pt.finished_signal.connect(self._progress_thread_finished)
154 pt.error_signal.connect(self._progress_thread_error)
155 pt.request_interact_signal.connect(self._on_request_interact)
156 pt.start()
157
158
159
161 '''
162 A thread to execute a method in a thread.
163 '''
164 finished_signal = QtCore.Signal(str)
165 '''
166 @ivar: finished_signal is a signal, which is emitted, if the thread is finished.
167 '''
168
169 error_signal = QtCore.Signal(str, str, str, str)
170 '''
171 @ivar: error_signal is a signal (id, title, error message, detailed error message), which is emitted,
172 if an error while run of the thread was occurred.
173 '''
174
175 request_interact_signal = QtCore.Signal(str, str, InteractionNeededError)
176
177 - def __init__(self, id, descr='', target=None, args=()):
178 QtCore.QObject.__init__(self)
179 threading.Thread.__init__(self)
180 self._id = id
181 self._descr = descr
182 self._target = target
183 self._args = args
184 self.setDaemon(True)
185
187 '''
188 '''
189 try:
190 if not self._target is None:
191
192
193
194 self._target(*self._args)
195
196 self.finished_signal.emit(self._id)
197 else:
198 self.error_signal.emit(self._id, 'No target specified')
199 except InteractionNeededError as e:
200 self.request_interact_signal.emit(self._id, self._descr, e)
201 except DetailedError as e:
202 self.error_signal.emit(self._id, e.title, e.value, e.detailed_text)
203 except:
204 import traceback
205
206 formatted_lines = traceback.format_exc().splitlines()
207 last_line = formatted_lines[-1]
208 index = 1
209 while not last_line and len(formatted_lines) > index:
210 index += 1
211 last_line = formatted_lines[-index]
212 rospy.logwarn("%s failed:\n\t%s", str(self._descr), last_line)
213 self.error_signal.emit(self._id, 'Progress Job Error', str(self._descr)+" failed:\n"+last_line, traceback.format_exc())
214