chiark / gitweb /
Add temperature control to print window
authordaid <daid303@gmail.com>
Wed, 4 Apr 2012 15:02:22 +0000 (17:02 +0200)
committerdaid <daid303@gmail.com>
Wed, 4 Apr 2012 15:02:22 +0000 (17:02 +0200)
Cura/gui/machineCom.py
Cura/gui/printWindow.py

index 7c1de22f02e37ff3f3758ed90fb47227348e87de..5157fbe87d8e76975b215ee5dcfb939a9825476c 100644 (file)
@@ -106,18 +106,33 @@ class InstallFirmware(wx.Dialog):
 class VirtualPrinter():
        def __init__(self):
                self.readList = ['start\n']
+               self.temp = 0.0
+               self.targetTemp = 0.0
        
        def write(self, data):
                if self.readList == None:
                        return
                print "Send: %s" % (data.rstrip())
-               self.readList.append("ok\n")
+               if 'M104' in data:
+                       try:
+                               self.targetTemp = float(data[data.find('S')+1:])
+                       except:
+                               pass
+               if 'M105' in data:
+                       self.readList.append("ok T:%f/%f\n" % (self.temp, self.targetTemp))
+               else:
+                       self.readList.append("ok\n")
 
        def readline(self):
                if self.readList == None:
                        return ''
+               n = 0
+               self.temp = (self.temp + self.targetTemp) / 2
                while len(self.readList) < 1:
                        time.sleep(0.1)
+                       n += 1
+                       if n == 20:
+                               return ''
                        if self.readList == None:
                                return ''
                time.sleep(0.001)
@@ -141,7 +156,7 @@ class MachineCom():
                                        programmer.connect(port)
                                        programmer.close()
                                        print "Connecting to: %s %i" % (port, baudrate)
-                                       self.serial = Serial(port, baudrate, timeout=5)
+                                       self.serial = Serial(port, baudrate, timeout=2)
                                        break
                                except ispBase.IspError:
                                        pass
@@ -152,7 +167,7 @@ class MachineCom():
                        self.serial = VirtualPrinter()
                else:
                        try:
-                               self.serial = Serial(port, baudrate, timeout=5)
+                               self.serial = Serial(port, baudrate, timeout=2)
                        except:
                                print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0]
 
index ac424290158dcc35c8a088e3af34c3c9f65fc73a..b48650aded03a07400094876e53248d97af0b148 100644 (file)
@@ -1,7 +1,7 @@
 from __future__ import absolute_import\r
 import __init__\r
 \r
-import wx, threading\r
+import wx, threading, re\r
 \r
 from gui import machineCom\r
 from gui import icon\r
@@ -27,7 +27,9 @@ class printWindow(wx.Frame):
                self.thread = None\r
                self.gcode = None\r
                self.gcodeList = None\r
+               self.sendList = []\r
                self.printIdx = None\r
+               self.temp = None\r
                self.bufferLineCount = 4\r
                self.sendCnt = 0\r
 \r
@@ -51,11 +53,20 @@ class printWindow(wx.Frame):
                self.printButton = wx.Button(self.panel, -1, 'Print GCode')\r
                self.cancelButton = wx.Button(self.panel, -1, 'Cancel print')\r
                self.progress = wx.Gauge(self.panel, -1)\r
+               \r
+               h = self.connectButton.GetSize().GetHeight()\r
+               self.temperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
+               self.temperatureSelect.SetRange(0, 400)\r
+               \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(self.progress, pos=(4,0), span=(1,2), flag=wx.EXPAND)\r
+\r
+               self.sizer.Add(wx.StaticText(self.panel, -1, "Temp:"), pos=(0,3))\r
+               self.sizer.Add(self.temperatureSelect, pos=(0,4))\r
+\r
                self.sizer.AddGrowableRow(3)\r
                self.sizer.AddGrowableCol(0)\r
                \r
@@ -65,6 +76,8 @@ class printWindow(wx.Frame):
                self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint)\r
                self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)\r
                \r
+               self.Bind(wx.EVT_SPINCTRL, self.OnTempChange, self.temperatureSelect)\r
+               \r
                self.Layout()\r
                self.Fit()\r
                self.Centre()\r
@@ -90,6 +103,8 @@ class printWindow(wx.Frame):
                else:\r
                        self.progress.SetValue(self.printIdx)\r
                        status += 'Line: %d/%d\n' % (self.printIdx, len(self.gcodeList))\r
+               if self.temp != None:\r
+                       status += 'Temp: %d\n' % (self.temp)\r
                self.statsText.SetLabel(status)\r
        \r
        def OnConnect(self, e):\r
@@ -128,9 +143,13 @@ class printWindow(wx.Frame):
                        self.thread.join()\r
                self.Destroy()\r
 \r
+       def OnTempChange(self, e):\r
+               self.sendCommand("M104 S%d" % (self.temperatureSelect.GetValue()))\r
+\r
        def LoadGCodeFile(self, filename):\r
                if self.printIdx != None:\r
                        return\r
+               #Send an initial M110 to reset the line counter to zero.\r
                gcodeList = ["M110"]\r
                for line in open(filename, 'r'):\r
                        if ';' in line:\r
@@ -146,6 +165,13 @@ class printWindow(wx.Frame):
                self.gcodeList = gcodeList\r
                self.UpdateButtonStates()\r
                self.UpdateProgress()\r
+               \r
+       def sendCommand(self, cmd):\r
+               if self.machineConnected:\r
+                       if self.printIdx == None:\r
+                               self.machineCom.sendCommand(cmd)\r
+                       else:\r
+                               self.sendList.append(cmd)\r
 \r
        def sendLine(self, lineNr):\r
                if lineNr >= len(self.gcodeList):\r
@@ -155,7 +181,6 @@ class printWindow(wx.Frame):
                return True\r
 \r
        def PrinterMonitor(self):\r
-               skipCount = 0\r
                while True:\r
                        line = self.machineCom.readline()\r
                        if line == None:\r
@@ -170,10 +195,16 @@ class printWindow(wx.Frame):
                        elif line.startswith("start"):\r
                                self.machineConnected = True\r
                                wx.CallAfter(self.UpdateButtonStates)\r
-                       if self.printIdx != None:\r
+                       if 'T:' in line:\r
+                               self.temp = float(re.search("[0-9\.]*", line.split('T:')[1]).group(0))\r
+                               wx.CallAfter(self.UpdateProgress)\r
+                       if self.printIdx == None:\r
+                               if line == '':  #When we have a communication "timeout" and we're not sending gcode read the temperature.\r
+                                       self.machineCom.sendCommand("M105")\r
+                       else:\r
                                if line.startswith("ok"):\r
-                                       if skipCount > 0:\r
-                                               skipCount -= 1\r
+                                       if len(self.sendList) > 0:\r
+                                               self.machineCom.sendCommand(self.sendList.pop(0))\r
                                        else:\r
                                                if self.sendLine(self.printIdx):\r
                                                        self.printIdx += 1\r