25
25
from __future__ import unicode_literals
26
26
27
27
import io
28
- from PySide .QtCore import QThread , QSemaphore , QWaitCondition , QMutex , QObject , Signal , Slot
28
+ from PySide .QtCore import QThread , QSemaphore , QWaitCondition , QMutex
29
+ from PySide .QtCore import QObject , Signal , Slot
29
30
from FreeCAD import Console
30
31
31
32
32
33
class Buffers ():
33
34
34
35
def __init__ (self ):
35
- self .free = QSemaphore ()
36
+ self .free = 0
36
37
self .gain = QSemaphore ()
37
38
self .claim = QSemaphore ()
38
39
39
- class UsbDriver (QObject ):
40
40
41
+ class Mutex ():
42
+
43
+ def __init__ (self ):
44
+ self .paused = QMutex ()
45
+ self .buffers = QMutex ()
46
+ self .upload = QMutex ()
47
+ self .runreader = QMutex ()
48
+ self .runuploader = QMutex ()
49
+
50
+
51
+ class UsbDriver (QObject ):
52
+
41
53
data = Signal (unicode )
54
+ gcode = Signal (unicode )
42
55
43
56
def __init__ (self , pool ):
44
57
QObject .__init__ (self )
45
58
self .pool = pool
46
59
self .eol = pool .Proxy .getCharEndOfLine (pool )
47
60
s = pool .Serials [0 ]
48
61
self .sio = io .TextIOWrapper (io .BufferedRWPair (s , s ))
49
- self .mutex = QMutex ()
62
+ self .mutex = Mutex ()
50
63
self .toggle = QWaitCondition ()
51
64
self .buffers = Buffers ()
52
65
53
66
def open (self ):
54
67
thread = QThread ()
55
- self .reader = UsbReader (self .pool , self .buffers )
68
+ self .reader = UsbReader (self .pool , self .buffers , self . mutex )
56
69
self .reader .data .connect (self .data )
57
70
self .reader .on_data .connect (self .on_data )
58
71
thread .started .connect (self .reader .process )
@@ -63,16 +76,21 @@ def open(self):
63
76
self .reader .moveToThread (thread )
64
77
thread .start ()
65
78
self .thread = [thread ]
79
+ self .mutex .runreader .lock ()
66
80
self .reader .run = True
81
+ self .mutex .runreader .unlock ()
67
82
68
83
def close (self ):
69
84
if self .pool .Pause :
85
+ self .pool .Pause = False
70
86
self .resume ()
71
- self .pool .Pause = False
72
87
if self .pool .Start :
88
+ self .pool .Start = False
73
89
self .stop ()
74
- self .pool .Start = False
75
- self .reader .run = False
90
+ else :
91
+ self .mutex .runreader .lock ()
92
+ self .reader .run = False
93
+ self .mutex .runreader .unlock ()
76
94
77
95
@Slot ()
78
96
def on_close (self ):
@@ -85,62 +103,87 @@ def on_close(self):
85
103
self .pool .Serials = None
86
104
87
105
def start (self ):
88
- if self .pool .Serials is None :
89
- Console .PrintError ("Pool is not connected!\n " )
90
- self .pool .Start = False
91
- return
106
+ if self .checkStart ():
107
+ return
92
108
if not self .pool .Serials [- 1 ].is_open :
93
109
self .pool .Serials [- 1 ].open ()
94
110
self .uploader = UsbUploader (self .pool , self .buffers , self .toggle , self .mutex )
95
111
self .uploader .on_data .connect (self .on_data )
112
+ self .uploader .gcode .connect (self .gcode )
96
113
thread = QThread ()
97
114
thread .started .connect (self .uploader .process )
98
115
self .uploader .finished .connect (thread .quit )
99
116
thread .finished .connect (thread .deleteLater )
100
117
thread .finished .connect (self .uploader .deleteLater )
101
118
thread .finished .connect (self .on_stop )
102
119
self .uploader .moveToThread (thread )
120
+ self .mutex .upload .lock ()
103
121
self .reader .upload = True
122
+ self .mutex .upload .unlock ()
104
123
thread .start ()
105
124
self .thread .append (thread )
106
125
126
+ def checkStart (self ):
127
+ if self .pool .Serials is None :
128
+ Console .PrintError ("Pool is not connected!\n " )
129
+ self .pool .Start = False
130
+ return True
131
+ return False
132
+
107
133
def stop (self ):
134
+ self .mutex .runuploader .lock ()
108
135
self .uploader .run = False
136
+ self .mutex .runuploader .unlock ()
109
137
110
138
@Slot ()
111
139
def on_stop (self ):
140
+ self .mutex .upload .lock ()
112
141
self .reader .upload = False
113
- self .buffers .gain .release ()
142
+ self .mutex .upload .unlock ()
143
+ self .buffers .gain .release (2 )
114
144
while self .buffers .gain .available ():
115
145
self .buffers .gain .acquire ()
116
- if self .pool .Serials [- 1 ].is_open :
117
- self .pool .Serials [- 1 ].close ()
118
-
146
+ if not self .pool .Open :
147
+ self .mutex .runreader .lock ()
148
+ self .reader .run = False
149
+ self .mutex .runreader .unlock ()
119
150
120
151
def pause (self ):
152
+ if self .checkPause ():
153
+ return
154
+ self .mutex .paused .lock ()
155
+ self .uploader .paused = True
156
+ self .mutex .paused .unlock ()
157
+
158
+ def checkPause (self ):
121
159
if self .pool .Serials is None :
122
160
Console .PrintError ("Pool is not connected!\n " )
123
161
self .pool .Pause = False
124
- return
125
- if not self .pool .Start and self .pool .Pause :
162
+ return True
163
+ if not self .pool .Start and not self .pool .Pause :
126
164
Console .PrintError ("File upload is not started!\n " )
127
165
self .pool .Pause = False
128
- return
129
- self .mutex .lock ()
130
- self .uploader .paused = True
131
- self .mutex .unlock ()
132
-
166
+ return True
167
+ return False
168
+
133
169
def resume (self ):
134
- if self .pool .Serials is None :
135
- Console .PrintError ("Pool is not connected!\n " )
170
+ if self .checkResume ():
136
171
return
137
- if not self .pool .Start :
138
- Console .PrintError ("File upload is not started!\n " )
139
- return
140
- self .mutex .lock ()
172
+ self .mutex .paused .lock ()
141
173
self .uploader .paused = False
142
- self .mutex .unlock ()
174
+ self .mutex .paused . unlock ()
143
175
self .toggle .wakeAll ()
176
+
177
+ def checkResume (self ):
178
+ if self .pool .Serials is None :
179
+ Console .PrintError ("Pool is not connected!\n " )
180
+ self .pool .Pause = False
181
+ return True
182
+ if not self .pool .Start and self .pool .Pause :
183
+ Console .PrintError ("File upload is not started!*****\n " )
184
+ self .pool .Pause = False
185
+ return True
186
+ return False
144
187
145
188
@Slot (unicode )
146
189
def on_data (self , data ):
@@ -155,10 +198,11 @@ def on_data(self, data):
155
198
class UsbReader (QObject ):
156
199
157
200
finished = Signal ()
201
+ ctrl = Signal (unicode )
158
202
data = Signal (unicode )
159
203
on_data = Signal (unicode )
160
204
161
- def __init__ (self , pool , buffers ):
205
+ def __init__ (self , pool , buffers , mutex ):
162
206
QObject .__init__ (self )
163
207
self .run = True
164
208
self .upload = False
@@ -167,32 +211,49 @@ def __init__(self, pool, buffers):
167
211
self .sio = io .TextIOWrapper (io .BufferedRWPair (s , s ), newline = eol )
168
212
self .pool = pool
169
213
self .buffers = buffers
214
+ self .mutex = mutex
170
215
171
216
@Slot ()
172
217
def process (self ):
173
218
""" Loop and copy PySerial -> Terminal """
174
219
port = self .pool .Serials [0 ].port
220
+ msg = "{} UsbReader thread start on port {}... done\n "
221
+ Console .PrintLog (msg .format (self .pool .Name , port ))
175
222
try :
223
+ self .mutex .runreader .lock ()
176
224
while self .run :
225
+ self .mutex .runreader .unlock ()
177
226
line = self .sio .readline ()
178
227
if len (line ):
228
+ self .mutex .upload .lock ()
179
229
if self .upload :
230
+ self .mutex .upload .unlock ()
180
231
if line .startswith ("qr:" ):
181
232
b = int (line .split (":" )[- 1 ])
182
233
buffers = b - self .pool .Buffers if b > self .pool .Buffers else 0
183
- while self .buffers .free .available () < buffers :
184
- self .buffers .free .release ()
185
- while self .buffers .free .available () > buffers :
186
- self .buffers .free .acquire ()
187
- if self .buffers .free .available ():
234
+ self .mutex .buffers .lock ()
235
+ self .buffers .free = buffers
236
+ if self .buffers .free > 0 :
237
+ self .mutex .buffers .unlock ()
188
238
self .buffers .claim .release ()
189
239
self .buffers .gain .acquire ()
190
240
else :
241
+ self .mutex .buffers .unlock ()
191
242
self .on_data .emit ("$qr" )
192
- continue
193
- elif self .buffers .free .available ():
243
+ #continue
244
+ if line .startswith ("pos" ):
245
+ self .ctrl .emit (line )
246
+ self .mutex .buffers .lock ()
247
+ if self .buffers .free > 0 :
248
+ self .mutex .buffers .unlock ()
194
249
self .buffers .gain .acquire ()
250
+ else :
251
+ self .mutex .buffers .unlock ()
252
+ else :
253
+ self .mutex .upload .unlock ()
195
254
self .data .emit (line )
255
+ self .mutex .runreader .lock ()
256
+ self .mutex .runreader .unlock ()
196
257
except Exception as e :
197
258
msg = "Error occurred in UsbReader thread process: {}\n "
198
259
Console .PrintError (msg .format (e ))
@@ -205,7 +266,8 @@ def process(self):
205
266
class UsbUploader (QObject ):
206
267
207
268
finished = Signal ()
208
- on_data = Signal (unicode )
269
+ on_data = Signal (unicode )
270
+ gcode = Signal (unicode )
209
271
210
272
def __init__ (self , pool , buffers , toggle , mutex ):
211
273
QObject .__init__ (self )
@@ -228,24 +290,40 @@ def process(self):
228
290
msg = "{} UsbUploader thread start on port {}... done\n "
229
291
Console .PrintLog (msg .format (self .pool .Name , port ))
230
292
self .buffers .claim .acquire ()
293
+ i = 0
231
294
with open (self .pool .UploadFile ) as f :
232
295
for line in f :
233
- if not self .buffers .free .tryAcquire (1 ):
296
+ i += 1
297
+ self .mutex .buffers .lock ()
298
+ self .buffers .free -= 1
299
+ if self .buffers .free == 0 :
300
+ self .mutex .buffers .unlock ()
234
301
self .on_data .emit ("$qr" )
235
302
self .buffers .gain .release ()
236
303
self .buffers .claim .acquire ()
304
+ else :
305
+ self .mutex .buffers .unlock ()
306
+ line = line .strip ()
237
307
sio .write (line + eol )
238
308
sio .flush ()
239
- self .mutex .lock ()
309
+ self .gcode .emit ("{}\t {}" .format (i , line ))
310
+ self .mutex .paused .lock ()
240
311
if self .paused :
241
- self .toggle .wait (self .mutex )
242
- self .mutex .unlock ()
312
+ self .toggle .wait (self .mutex .paused )
313
+ self .mutex .paused .unlock ()
314
+ self .mutex .runuploader .lock ()
243
315
if not self .run :
316
+ self .mutex .runuploader .unlock ()
244
317
break
318
+ self .mutex .runuploader .unlock ()
245
319
except Exception as e :
246
320
msg = "Error occurred in UsbUploader thread process: {}\n "
247
321
Console .PrintError (msg .format (e ))
248
322
else :
249
323
msg = "{} UsbUploader thread stop on port {}... done\n "
250
324
Console .PrintLog (msg .format (self .pool .Name , port ))
325
+ self .mutex .runuploader .lock ()
326
+ self .run = False
327
+ self .mutex .runuploader .unlock ()
328
+ self .pool .Start = False
251
329
self .finished .emit ()
0 commit comments