chiark / gitweb /
Increment version number
[cura.git] / Cura / serialCommunication.py
index 7447f83afd163e87389f768a6d1d7e7a1f3ce711..1b095484a5477bcc5295aec0f1970fc2f871caeb 100644 (file)
@@ -8,6 +8,7 @@ And handles all communication with the initial process.
 
 __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
 import sys
+import threading
 import time
 import os
 import json
@@ -19,11 +20,15 @@ class serialComm(object):
        The serialComm class is the interface class which handles the communication between stdin/stdout and the machineCom class.
        This interface class is used to run the (USB) serial communication in a different process then the GUI.
        """
-       def __init__(self, portName):
+       def __init__(self, portName, baudrate):
                self._comm = None
                self._gcodeList = []
 
-               self._comm = machineCom.MachineCom(portName, callbackObject=self)
+               try:
+                       baudrate = int(baudrate)
+               except ValueError:
+                       baudrate = 0
+               self._comm = machineCom.MachineCom(portName, baudrate, callbackObject=self)
 
        def mcLog(self, message):
                sys.stdout.write('log:%s\n' % (message))
@@ -43,12 +48,17 @@ class serialComm(object):
                sys.stdout.write('progress:%d\n' % (lineNr))
 
        def mcZChange(self, newZ):
-               sys.stdout.write('changeZ:%d\n' % (newZ))
+               sys.stdout.write('changeZ:%f\n' % (newZ))
 
        def monitorStdin(self):
-               while not self._comm.isClosed():
-                       line = sys.stdin.readline().strip()
-                       line = line.split(':', 1)
+               while not (self._comm.isClosed() or sys.stdin.closed):
+                       line = sys.stdin.readline()
+                        # If readline returns an empty string it means that
+                        # we've hit stdin's EOF, probably because the parent was
+                        # closed, so we need to exit as well instead of spamming stderr.
+                        if line == '':
+                                break
+                       line = line.strip().split(':', 1)
                        if line[0] == 'STOP':
                                self._comm.cancelPrint()
                                self._gcodeList = ['M110']
@@ -58,19 +68,26 @@ class serialComm(object):
                                self._comm.sendCommand(line[1])
                        elif line[0] == 'START':
                                self._comm.printGCode(self._gcodeList)
+                       elif line[0] == 'PAUSE':
+                               self._comm.setPause(True)
+                       elif line[0] == 'RESUME':
+                               self._comm.setPause(False)
                        else:
                                sys.stderr.write(str(line))
 
-def startMonitor(portName):
+def startMonitor(portName, baudrate):
        sys.stdout = os.fdopen(sys.stdout.fileno(), 'w', 0)
-       comm = serialComm(portName)
-       comm.monitorStdin()
+       comm = serialComm(portName, baudrate)
+       thread = threading.Thread(target=comm.monitorStdin)
+       thread.start()
+       while thread.is_alive():
+               time.sleep(0.1)
 
 def main():
-       if len(sys.argv) != 2:
+       if len(sys.argv) != 3:
                return
-       portName = sys.argv[1]
-       startMonitor(portName)
+       portName, baudrate = sys.argv[1], sys.argv[2]
+       startMonitor(portName, baudrate)
 
 if __name__ == '__main__':
        main()