chiark / gitweb /
Printing works! If you press the right buttons in the right order that is.
authorDaid <daid303@gmail.com>
Sun, 1 Apr 2012 17:16:31 +0000 (19:16 +0200)
committerDaid <daid303@gmail.com>
Sun, 1 Apr 2012 17:16:31 +0000 (19:16 +0200)
Cura/gui/machineCom.py
Cura/gui/printWindow.py

index 605d05cefabaedae590abc9f529e3ae6a62f7223..ffd816535a90473d1684b62ec73cd777fc61f9af 100644 (file)
@@ -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')
 
index 7b28a45dba88fbf72611e5fac7052f5947b55269..d0613302af61885cda7465cbbeaf628beb7f018b 100644 (file)
@@ -1,22 +1,31 @@
 from __future__ import absolute_import\r
 import __init__\r
 \r
-import wx\r
+import wx, threading\r
+\r
+from gui import machineCom\r
 \r
 printWindowHandle = None\r
 \r
 def printFile(filename):\r
        global printWindowHandle\r
-       print "Want to print: " + filename\r
        if printWindowHandle == None:\r
                printWindowHandle = printWindow()\r
        printWindowHandle.Show(True)\r
        printWindowHandle.Raise()\r
+       printWindowHandle.LoadGCodeFile(filename)\r
 \r
 class printWindow(wx.Frame):\r
        "Main user interface window"\r
        def __init__(self):\r
                super(printWindow, self).__init__(None, -1, title='Printing')\r
+               self.machineCom = None\r
+               self.thread = None\r
+               self.gcodeList = None\r
+               self.printIdx = None\r
+               self.bufferLineCount = 4\r
+               self.sendCnt = 0\r
+               \r
                self.SetSizer(wx.BoxSizer())\r
                self.panel = wx.Panel(self)\r
                self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND)\r
@@ -30,21 +39,99 @@ class printWindow(wx.Frame):
                \r
                self.sizer.Add(boxsizer, pos=(0,0), span=(4,1), flag=wx.EXPAND)\r
                \r
-               self.sizer.Add(wx.Button(self.panel, -1, 'Connect'), pos=(0,1))\r
-               self.sizer.Add(wx.Button(self.panel, -1, 'Load GCode'), pos=(1,1))\r
-               self.sizer.Add(wx.Button(self.panel, -1, 'Print GCode'), pos=(2,1))\r
-               self.sizer.Add(wx.Button(self.panel, -1, 'Cancel print'), pos=(3,1))\r
+               self.connectButton = wx.Button(self.panel, -1, 'Connect')\r
+               self.loadButton = wx.Button(self.panel, -1, 'Load GCode')\r
+               self.printButton = wx.Button(self.panel, -1, 'Print GCode')\r
+               self.cancelButton = wx.Button(self.panel, -1, 'Cancel print')\r
+               self.sizer.Add(self.connectButton, pos=(0,1))\r
+               self.sizer.Add(self.loadButton, pos=(1,1))\r
+               self.sizer.Add(self.printButton, pos=(2,1))\r
+               self.sizer.Add(self.cancelButton, pos=(3,1))\r
                self.sizer.Add(wx.Gauge(self.panel, -1), pos=(4,0), span=(1,2), flag=wx.EXPAND)\r
                self.sizer.AddGrowableRow(3)\r
                self.sizer.AddGrowableCol(0)\r
                \r
                self.Bind(wx.EVT_CLOSE, self.OnClose)\r
+               self.connectButton.Bind(wx.EVT_BUTTON, self.OnConnect)\r
+               self.loadButton.Bind(wx.EVT_BUTTON, self.OnLoad)\r
+               self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint)\r
+               self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)\r
                \r
                self.Layout()\r
                self.Fit()\r
                self.Centre()\r
        \r
+       def OnConnect(self, e):\r
+               if self.machineCom != None:\r
+                       self.machineCom.close()\r
+                       self.thread.join()\r
+               self.machineCom = machineCom.MachineCom()\r
+               self.thread = threading.Thread(target=self.PrinterMonitor)\r
+               self.thread.start()\r
+       \r
+       def OnLoad(self, e):\r
+               pass\r
+       \r
+       def OnPrint(self, e):\r
+               if self.machineCom == None:\r
+                       return\r
+               if self.gcodeList == None:\r
+                       return\r
+               if self.printIdx != None:\r
+                       return\r
+               self.printIdx = 1\r
+               self.sendLine(0)\r
+               self.sendCnt = self.bufferLineCount\r
+       \r
+       def OnCancel(self, e):\r
+               pass\r
+       \r
        def OnClose(self, e):\r
                global printWindowHandle\r
                printWindowHandle = None\r
+               if self.machineCom != None:\r
+                       self.machineCom.close()\r
+                       self.thread.join()\r
                self.Destroy()\r
+\r
+       def LoadGCodeFile(self, filename):\r
+               gcodeList = ["M110"]\r
+               for line in open(filename, 'r'):\r
+                       if ';' in line:\r
+                               line = line[0:line.find(';')]\r
+                       line = line.strip()\r
+                       if len(line) > 0:\r
+                               gcodeList.append(line)\r
+               print "Loaded: %s (%d)" % (filename, len(gcodeList))\r
+               self.gcodeList = gcodeList\r
+\r
+       def sendLine(self, lineNr):\r
+               if lineNr >= len(self.gcodeList):\r
+                       return\r
+               checksum = reduce(lambda x,y:x^y, map(ord, "N%d%s" % (lineNr, self.gcodeList[lineNr])))\r
+               self.machineCom.sendCommand("N%d%s*%d" % (lineNr, self.gcodeList[lineNr], checksum))\r
+\r
+       def PrinterMonitor(self):\r
+               skipCount = 0\r
+               while True:\r
+                       line = self.machineCom.readline()\r
+                       if line == None:\r
+                               return\r
+                       while self.sendCnt > 0:\r
+                               self.sendLine(self.printIdx)\r
+                               self.printIdx += 1\r
+                               self.sendCnt -= 1\r
+                       if self.printIdx != None:\r
+                               if line.startswith("ok"):\r
+                                       if skipCount > 0:\r
+                                               skipCount -= 1\r
+                                       else:\r
+                                               self.sendLine(self.printIdx)\r
+                                               self.printIdx += 1\r
+                               elif "resend" in line.lower() or "rs" in line:\r
+                                       try:\r
+                                               lineNr=int(line.replace("N:"," ").replace("N"," ").replace(":"," ").split()[-1])\r
+                                       except:\r
+                                               if "rs" in line:\r
+                                                       lineNr=int(line.split()[1])\r
+                                       self.printIdx = lineNr\r