add keyboard interrupt handling to fast-stream.py
[clinton/Smoothieware.git] / fast-stream.py
CommitLineData
faffe1c2
JM
1#!/usr/bin/env python
2"""\
3Stream g-code to Smoothie USB serial connection
4
5Based on GRBL stream.py
6"""
7
8from __future__ import print_function
9import sys
10import argparse
11import serial
12import threading
13import time
92485600
JM
14import signal
15import sys
16
17errorflg= False
18intrflg= False
19
20def signal_term_handler(signal, frame):
21 global intrflg
22 print('got SIGTERM...')
23 intrflg= True
24
25signal.signal(signal.SIGTERM, signal_term_handler)
faffe1c2
JM
26
27# Define command line argument interface
28parser = argparse.ArgumentParser(description='Stream g-code file to Smoothie over telnet.')
29parser.add_argument('gcode_file', type=argparse.FileType('r'),
30 help='g-code filename to be streamed')
31parser.add_argument('device',
32 help='Smoothie Serial Device')
33parser.add_argument('-q','--quiet',action='store_true', default=False,
34 help='suppress output text')
35args = parser.parse_args()
36
37f = args.gcode_file
38verbose = not args.quiet
39
40# Stream g-code to Smoothie
41
42dev= args.device
43
44# Open port
45s = serial.Serial(dev, 115200)
46s.flushInput() # Flush startup text in serial input
47
48print("Streaming " + args.gcode_file.name + " to " + args.device)
49
50okcnt= 0
51
52def read_thread():
53 """thread worker function"""
436daacf 54 global okcnt, errorflg
faffe1c2
JM
55 flag= 1
56 while flag :
57 rep= s.readline()
58 n= rep.count("ok")
59 if n == 0 :
60 print("Incoming: " + rep)
436daacf
JM
61 if "error" in rep or "!!" in rep :
62 errorflg= True
63 break
faffe1c2
JM
64 else :
65 okcnt += n
66
67 print("Read thread exited")
68 return
69
70# start read thread
71t = threading.Thread(target=read_thread)
72t.daemon = True
73t.start()
74
75linecnt= 0
92485600
JM
76try:
77 for line in f:
78 if errorflg :
79 break
80 # strip comments
81 if line.startswith(';') :
82 continue
83 l= line.strip()
84 s.write(l + '\n')
85 linecnt+=1
86 if verbose: print("SND " + str(linecnt) + ": " + line.strip() + " - " + str(okcnt))
87except KeyboardInterrupt:
88 print("Interrupted...")
89 intrflg= True
90
91if intrflg :
92 print("Waiting for HALT...")
93 s.write('\x18')
94 while not errorflg :
95 time.sleep(1)
96
5d401ee2
JM
97if errorflg :
98 print("Target halted due to errors")
faffe1c2 99
5d401ee2
JM
100else :
101 print("Waiting for complete...")
92485600 102 while okcnt < linecnt :
5d401ee2 103 if verbose: print(str(linecnt) + " - " + str(okcnt) )
92485600
JM
104 if errorflg :
105 break
5d401ee2 106 time.sleep(1)
18ae0219
JM
107
108 # Wait here until finished to close serial port and file.
109 raw_input(" Press <Enter> to exit")
faffe1c2 110
faffe1c2
JM
111
112# Close file and serial port
113f.close()
114s.close()