@@ -127,6 +127,12 @@ def _copy_defaults_to_settings(self):
127
127
if key not in self .saved_settings [n ]:
128
128
self .saved_settings [n ][key ] = val
129
129
130
+ def _set_step_per_mm_from_config (self ):
131
+ for axis in 'xyz' :
132
+ value = self .saved_settings ['config' ].get (
133
+ self .CONFIG_STEPS_PER_MM [axis ])
134
+ self .set_steps_per_mm (axis , value )
135
+
130
136
def _apply_settings (self ):
131
137
self .serial_timeout = float (
132
138
self .saved_settings ['serial' ].get ('timeout' , 0.1 ))
@@ -205,27 +211,24 @@ def disconnect(self):
205
211
206
212
def connect (self , device ):
207
213
self .connection = device
208
- self .reset_port ()
214
+ self .toggle_port ()
209
215
log .debug ("Connected to {}" .format (device ))
216
+
217
+ self .turn_off_feedback ()
210
218
self .versions_compatible ()
211
- # set the previously saved steps_per_mm values for X and Y
212
219
if self .ignore_smoothie_sd :
213
- for axis in 'xyz' :
214
- self .set_steps_per_mm (
215
- axis , self .saved_settings ['config' ].get (
216
- self .CONFIG_STEPS_PER_MM [axis ]))
220
+ self ._set_step_per_mm_from_config ()
221
+
217
222
return self .calm_down ()
218
223
219
224
def is_connected (self ):
220
225
return self .connection and self .connection .isOpen ()
221
226
222
- def reset_port (self ):
227
+ def toggle_port (self ):
223
228
self .connection .close ()
224
229
self .connection .open ()
225
230
self .flush_port ()
226
231
227
- self .turn_off_feedback ()
228
-
229
232
def pause (self ):
230
233
self .halted .clear ()
231
234
self .stopped .clear ()
@@ -273,6 +276,13 @@ def send_command(self, command, **kwargs):
273
276
return response
274
277
275
278
def write_to_serial (self , data , max_tries = 10 , try_interval = 0.2 ):
279
+ """
280
+ Sends data string to serial ports
281
+
282
+ Returns data immediately read from port after write
283
+
284
+ Raises RuntimeError write fails or connection times out
285
+ """
276
286
log .debug ("Write: {}" .format (str (data ).encode ()))
277
287
if self .is_connected ():
278
288
try :
@@ -286,7 +296,7 @@ def write_to_serial(self, data, max_tries=10, try_interval=0.2):
286
296
log .warn (msg )
287
297
raise RuntimeError (msg )
288
298
elif max_tries > 0 :
289
- self .reset_port ()
299
+ self .toggle_port ()
290
300
return self .write_to_serial (
291
301
data , max_tries = max_tries - 1 , try_interval = try_interval
292
302
)
@@ -297,6 +307,12 @@ def write_to_serial(self, data, max_tries=10, try_interval=0.2):
297
307
raise RuntimeError (msg )
298
308
299
309
def wait_for_response (self , timeout = 20.0 ):
310
+ """
311
+ Repeatedly reads from serial port until data is received,
312
+ or timeout is exceeded
313
+
314
+ Raises RuntimeWarning() if no response was recieved before timeout
315
+ """
300
316
count = 0
301
317
max_retries = int (timeout / self .serial_timeout )
302
318
while self .is_connected () and count < max_retries :
@@ -313,13 +329,19 @@ def wait_for_response(self, timeout=20.0):
313
329
log .debug (
314
330
"Waiting {} lines for response." .format (count )
315
331
)
316
- raise RuntimeWarning ('no response from serial port' )
332
+ raise RuntimeWarning (
333
+ 'No response from serial port after {} seconds' .format (timeout ))
317
334
318
335
def flush_port (self ):
319
336
while self .readline_from_serial ():
320
337
time .sleep (self .serial_timeout )
321
338
322
339
def readline_from_serial (self ):
340
+ """
341
+ Attempt to read a line of data from serial port
342
+
343
+ Raises RuntimeWarning if read fails on serial port
344
+ """
323
345
msg = b''
324
346
try :
325
347
msg = self .connection .readline ()
@@ -329,10 +351,17 @@ def readline_from_serial(self):
329
351
raise RuntimeWarning ('Lost connection with serial port' ) from e
330
352
if msg :
331
353
log .debug ("Read: {}" .format (msg ))
354
+ self .detect_limit_hit (msg ) # raises RuntimeWarning if switch hit
355
+
356
+ return msg
357
+
358
+ def detect_limit_hit (self , msg ):
359
+ """
360
+ Detect if it hit a home switch
332
361
333
- # detect if it hit a home switch
362
+ Raises RuntimeWarning if Smoothie reports a limit hit
363
+ """
334
364
if b'!!' in msg or b'limit' in msg :
335
- # TODO (andy): allow this to bubble up so UI is notified
336
365
log .debug ('home switch hit' )
337
366
self .flush_port ()
338
367
self .calm_down ()
@@ -343,8 +372,6 @@ def readline_from_serial(self):
343
372
axis = ax
344
373
raise RuntimeWarning ('{} limit switch hit' .format (axis .upper ()))
345
374
346
- return msg
347
-
348
375
def set_coordinate_system (self , mode ):
349
376
if mode == 'absolute' :
350
377
self .send_command (self .ABSOLUTE_POSITIONING )
0 commit comments