diff --git a/Cura/gui/machineCom.py b/Cura/gui/machineCom.py index 605d05c..ffd8165 100644 --- a/Cura/gui/machineCom.py +++ b/Cura/gui/machineCom.py @@ -1,7 +1,7 @@ from __future__ import absolute_import import __init__ -import os, glob, wx, threading, sys +import os, glob, wx, threading, sys, time from serial import Serial @@ -108,7 +108,7 @@ class MachineCom(): if port == None: port = profile.getPreference('serial_port') if baudrate == None: - baudrate = profile.getPreference('serial_baud') + baudrate = int(profile.getPreference('serial_baud')) self.serial = None if port == 'AUTO': programmer = stk500v2.Stk500v2() @@ -116,6 +116,7 @@ class MachineCom(): try: programmer.connect(port) programmer.close() + print "Connecting to: %s %i" % (port, baudrate) self.serial = Serial(port, baudrate, timeout=5) break except ispBase.IspError: @@ -131,9 +132,10 @@ class MachineCom(): def readline(self): if self.serial == None: - return '' + return None ret = self.serial.readline() - print "Recv: " + ret.rstrip() + if ret != '': + print "Recv: " + ret.rstrip() return ret def close(self): @@ -144,5 +146,6 @@ class MachineCom(): def sendCommand(self, cmd): if self.serial == None: return + print 'Send: ' + cmd self.serial.write(cmd + '\n') diff --git a/Cura/gui/printWindow.py b/Cura/gui/printWindow.py index 7b28a45..d061330 100644 --- a/Cura/gui/printWindow.py +++ b/Cura/gui/printWindow.py @@ -1,22 +1,31 @@ from __future__ import absolute_import import __init__ -import wx +import wx, threading + +from gui import machineCom printWindowHandle = None def printFile(filename): global printWindowHandle - print "Want to print: " + filename if printWindowHandle == None: printWindowHandle = printWindow() printWindowHandle.Show(True) printWindowHandle.Raise() + printWindowHandle.LoadGCodeFile(filename) class printWindow(wx.Frame): "Main user interface window" def __init__(self): super(printWindow, self).__init__(None, -1, title='Printing') + self.machineCom = None + self.thread = None + self.gcodeList = None + self.printIdx = None + self.bufferLineCount = 4 + self.sendCnt = 0 + self.SetSizer(wx.BoxSizer()) self.panel = wx.Panel(self) self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND) @@ -30,21 +39,99 @@ class printWindow(wx.Frame): self.sizer.Add(boxsizer, pos=(0,0), span=(4,1), flag=wx.EXPAND) - self.sizer.Add(wx.Button(self.panel, -1, 'Connect'), pos=(0,1)) - self.sizer.Add(wx.Button(self.panel, -1, 'Load GCode'), pos=(1,1)) - self.sizer.Add(wx.Button(self.panel, -1, 'Print GCode'), pos=(2,1)) - self.sizer.Add(wx.Button(self.panel, -1, 'Cancel print'), pos=(3,1)) + self.connectButton = wx.Button(self.panel, -1, 'Connect') + self.loadButton = wx.Button(self.panel, -1, 'Load GCode') + self.printButton = wx.Button(self.panel, -1, 'Print GCode') + self.cancelButton = wx.Button(self.panel, -1, 'Cancel print') + self.sizer.Add(self.connectButton, pos=(0,1)) + self.sizer.Add(self.loadButton, pos=(1,1)) + self.sizer.Add(self.printButton, pos=(2,1)) + self.sizer.Add(self.cancelButton, pos=(3,1)) self.sizer.Add(wx.Gauge(self.panel, -1), pos=(4,0), span=(1,2), flag=wx.EXPAND) self.sizer.AddGrowableRow(3) self.sizer.AddGrowableCol(0) self.Bind(wx.EVT_CLOSE, self.OnClose) + self.connectButton.Bind(wx.EVT_BUTTON, self.OnConnect) + self.loadButton.Bind(wx.EVT_BUTTON, self.OnLoad) + self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint) + self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel) self.Layout() self.Fit() self.Centre() + def OnConnect(self, e): + if self.machineCom != None: + self.machineCom.close() + self.thread.join() + self.machineCom = machineCom.MachineCom() + self.thread = threading.Thread(target=self.PrinterMonitor) + self.thread.start() + + def OnLoad(self, e): + pass + + def OnPrint(self, e): + if self.machineCom == None: + return + if self.gcodeList == None: + return + if self.printIdx != None: + return + self.printIdx = 1 + self.sendLine(0) + self.sendCnt = self.bufferLineCount + + def OnCancel(self, e): + pass + def OnClose(self, e): global printWindowHandle printWindowHandle = None + if self.machineCom != None: + self.machineCom.close() + self.thread.join() self.Destroy() + + def LoadGCodeFile(self, filename): + gcodeList = ["M110"] + for line in open(filename, 'r'): + if ';' in line: + line = line[0:line.find(';')] + line = line.strip() + if len(line) > 0: + gcodeList.append(line) + print "Loaded: %s (%d)" % (filename, len(gcodeList)) + self.gcodeList = gcodeList + + def sendLine(self, lineNr): + if lineNr >= len(self.gcodeList): + return + checksum = reduce(lambda x,y:x^y, map(ord, "N%d%s" % (lineNr, self.gcodeList[lineNr]))) + self.machineCom.sendCommand("N%d%s*%d" % (lineNr, self.gcodeList[lineNr], checksum)) + + def PrinterMonitor(self): + skipCount = 0 + while True: + line = self.machineCom.readline() + if line == None: + return + while self.sendCnt > 0: + self.sendLine(self.printIdx) + self.printIdx += 1 + self.sendCnt -= 1 + if self.printIdx != None: + if line.startswith("ok"): + if skipCount > 0: + skipCount -= 1 + else: + self.sendLine(self.printIdx) + self.printIdx += 1 + elif "resend" in line.lower() or "rs" in line: + try: + lineNr=int(line.replace("N:"," ").replace("N"," ").replace(":"," ").split()[-1]) + except: + if "rs" in line: + lineNr=int(line.split()[1]) + self.printIdx = lineNr