chiark / gitweb /
Add bed temperature control to printer interface. Only show when we get an bed temper...
authordaid <daid303@gmail.com>
Tue, 26 Jun 2012 10:05:06 +0000 (12:05 +0200)
committerdaid <daid303@gmail.com>
Tue, 26 Jun 2012 10:05:06 +0000 (12:05 +0200)
Cura/gui/configWizard.py
Cura/gui/firmwareInstall.py [new file with mode: 0644]
Cura/gui/mainWindow.py
Cura/gui/preferencesDialog.py
Cura/gui/printWindow.py
Cura/gui/simpleMode.py
Cura/util/machineCom.py [moved from Cura/gui/machineCom.py with 56% similarity]

index 5efd6339375d510725c5dd43bb288ed6586d1f8a..01d7262609c3a63183059effaf8e5f27b39da214 100644 (file)
@@ -4,7 +4,8 @@ import __init__
 import wx, os, platform, types, webbrowser, threading, time, re\r
 import wx.wizard\r
 \r
-from gui import machineCom\r
+from gui import firmwareInstall\r
+from util import machineCom\r
 from util import profile\r
 \r
 class InfoPage(wx.wizard.WizardPageSimple):\r
@@ -132,7 +133,7 @@ class FirmwareUpgradePage(InfoPage):
                return False\r
        \r
        def OnUpgradeClick(self, e):\r
-               if machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")):\r
+               if firmwareInstall.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")):\r
                        self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()\r
                \r
        def OnSkipClick(self, e):\r
diff --git a/Cura/gui/firmwareInstall.py b/Cura/gui/firmwareInstall.py
new file mode 100644 (file)
index 0000000..7d60a50
--- /dev/null
@@ -0,0 +1,88 @@
+from __future__ import absolute_import
+import __init__
+
+import os, glob, wx, threading, sys, time
+
+from serial import Serial
+
+from avr_isp import stk500v2
+from avr_isp import ispBase
+from avr_isp import intelHex
+
+from util import machineCom
+from util import profile
+
+class InstallFirmware(wx.Dialog):
+       def __init__(self, filename, port = None):
+               super(InstallFirmware, self).__init__(parent=None, title="Firmware install", size=(250, 100))
+               if port == None:
+                       port = profile.getPreference('serial_port')
+
+               sizer = wx.BoxSizer(wx.VERTICAL)
+               
+               self.progressLabel = wx.StaticText(self, -1, 'Reading firmware...')
+               sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER)
+               self.progressGauge = wx.Gauge(self, -1)
+               sizer.Add(self.progressGauge, 0, flag=wx.EXPAND)
+               self.okButton = wx.Button(self, -1, 'Ok')
+               self.okButton.Disable()
+               self.okButton.Bind(wx.EVT_BUTTON, self.OnOk)
+               sizer.Add(self.okButton, 0, flag=wx.ALIGN_CENTER)
+               self.SetSizer(sizer)
+               
+               self.filename = filename
+               self.port = port
+               
+               threading.Thread(target=self.OnRun).start()
+               
+               self.ShowModal()
+               self.Destroy()
+               
+               return
+
+       def OnRun(self):
+               hexFile = intelHex.readHex(self.filename)
+               wx.CallAfter(self.updateLabel, "Connecting to machine...")
+               programmer = stk500v2.Stk500v2()
+               programmer.progressCallback = self.OnProgress
+               if self.port == 'AUTO':
+                       for self.port in machineCom.serialList():
+                               try:
+                                       programmer.connect(self.port)
+                                       break
+                               except ispBase.IspError:
+                                       pass
+               else:
+                       try:
+                               programmer.connect(self.port)
+                       except ispBase.IspError:
+                               pass
+                               
+               if programmer.isConnected():
+                       wx.CallAfter(self.updateLabel, "Uploading firmware...")
+                       try:
+                               programmer.programChip(hexFile)
+                               wx.CallAfter(self.updateLabel, "Done!")
+                       except ispBase.IspError as e:
+                               wx.CallAfter(self.updateLabel, "Failed to write firmware.\n" + str(e))
+                               
+                       programmer.close()
+                       wx.CallAfter(self.okButton.Enable)
+                       return
+               wx.MessageBox('Failed to find machine for firmware upgrade\nIs your machine connected to the PC?', 'Firmware update', wx.OK | wx.ICON_ERROR)
+               wx.CallAfter(self.Close)
+       
+       def updateLabel(self, text):
+               self.progressLabel.SetLabel(text)
+               self.Layout()
+       
+       def OnProgress(self, value, max):
+               wx.CallAfter(self.progressGauge.SetRange, max)
+               wx.CallAfter(self.progressGauge.SetValue, value)
+
+       def OnOk(self, e):
+               self.Close()
+
+       def OnClose(self, e):
+               self.Destroy()
+
index fc2b92ee9ed98a1c7b0ae2a947856d9eea89126b..036d5746610feae034ade4465fdc0853345651ec 100644 (file)
@@ -11,7 +11,7 @@ from gui import alterationPanel
 from gui import validators
 from gui import preferencesDialog
 from gui import configWizard
-from gui import machineCom
+from gui import firmwareInstall
 from gui import printWindow
 from gui import simpleMode
 from gui import projectPlanner
@@ -278,7 +278,7 @@ class mainWindow(configBase.configWindowBase):
                self.Close()
        
        def OnDefaultMarlinFirmware(self, e):
-               machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"))
+               firmwareInstall.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"))
 
        def OnCustomFirmware(self, e):
                dlg=wx.FileDialog(self, "Open firmware to upload", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
@@ -288,7 +288,7 @@ class mainWindow(configBase.configWindowBase):
                        if not(os.path.exists(filename)):
                                return
                        #For some reason my Ubuntu 10.10 crashes here.
-                       machineCom.InstallFirmware(filename)
+                       firmwareInstall.InstallFirmware(filename)
 
        def OnFirstRunWizard(self, e):
                configWizard.configWizard()
index 9ff3bd6eb3535efde635d9f0047a402aea902875..b1183a6173dc9ab00ca06c0d56df3a3ac5f2d63d 100644 (file)
@@ -6,7 +6,7 @@ import ConfigParser
 \r
 from gui import configBase\r
 from gui import validators\r
-from gui import machineCom\r
+from util import machineCom\r
 from util import profile\r
 \r
 class preferencesDialog(configBase.configWindowBase):\r
index 39686ba473ccb2b189ee35a4793fc0796d1141dd..5ecfcddd260fb0d531035fc5fb0460c2fb9508b5 100644 (file)
@@ -4,9 +4,9 @@ import __init__
 import wx, threading, re, subprocess, sys, os\r
 from wx.lib import buttons\r
 \r
-from gui import machineCom\r
 from gui import icon\r
 from gui import toolbarUtil\r
+from util import machineCom\r
 from util import profile\r
 from util import gcodeInterpreter\r
 \r
@@ -82,6 +82,7 @@ class printWindow(wx.Frame):
                self.sendList = []\r
                self.printIdx = None\r
                self.temp = None\r
+               self.bedTemp = None\r
                self.bufferLineCount = 4\r
                self.sendCnt = 0\r
 \r
@@ -109,6 +110,11 @@ class printWindow(wx.Frame):
                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
+               self.bedTemperatureLabel = wx.StaticText(self.panel, -1, "BedTemp:")\r
+               self.bedTemperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)\r
+               self.bedTemperatureSelect.SetRange(0, 400)\r
+               self.bedTemperatureLabel.Show(False)\r
+               self.bedTemperatureSelect.Show(False)\r
                \r
                self.sizer.Add(self.connectButton, pos=(0,1))\r
                #self.sizer.Add(self.loadButton, pos=(1,1))\r
@@ -118,6 +124,8 @@ class printWindow(wx.Frame):
                \r
                self.sizer.Add(wx.StaticText(self.panel, -1, "Temp:"), pos=(0,3))\r
                self.sizer.Add(self.temperatureSelect, pos=(0,4))\r
+               self.sizer.Add(self.bedTemperatureLabel, pos=(0,5))\r
+               self.sizer.Add(self.bedTemperatureSelect, pos=(0,6))\r
                \r
                self.directControlPanel = wx.Panel(self.panel)\r
                self.sizer.Add(self.directControlPanel, pos=(1,3), span=(5,4))\r
@@ -162,6 +170,7 @@ class printWindow(wx.Frame):
                self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)\r
                \r
                self.Bind(wx.EVT_SPINCTRL, self.OnTempChange, self.temperatureSelect)\r
+               self.Bind(wx.EVT_SPINCTRL, self.OnBedTempChange, self.bedTemperatureSelect)\r
                \r
                self.Layout()\r
                self.Fit()\r
@@ -195,6 +204,10 @@ class printWindow(wx.Frame):
                        self.progress.SetValue(self.printIdx)\r
                if self.temp != None:\r
                        status += 'Temp: %d\n' % (self.temp)\r
+               if self.bedTemp != None and self.bedTemp > 0:\r
+                       status += 'Bed Temp: %d\n' % (self.bedTemp)\r
+                       self.bedTemperatureLabel.Show(True)\r
+                       self.bedTemperatureSelect.Show(True)\r
                self.statsText.SetLabel(status.strip())\r
                self.Layout()\r
        \r
@@ -238,6 +251,9 @@ class printWindow(wx.Frame):
        def OnTempChange(self, e):\r
                self.sendCommand("M104 S%d" % (self.temperatureSelect.GetValue()))\r
 \r
+       def OnBedTempChange(self, e):\r
+               self.sendCommand("M140 S%d" % (self.bedTemperatureSelect.GetValue()))\r
+\r
        def LoadGCodeFile(self, filename):\r
                if self.printIdx != None:\r
                        return\r
@@ -289,6 +305,8 @@ class printWindow(wx.Frame):
                                wx.CallAfter(self.UpdateButtonStates)\r
                        if 'T:' in line:\r
                                self.temp = float(re.search("[0-9\.]*", line.split('T:')[1]).group(0))\r
+                               if 'B:' in line:\r
+                                       self.bedTemp = float(re.search("[0-9\.]*", line.split('B:')[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, then read the temperature.\r
index 8fee9790db6b6ada1c9411277d8d14b9cbcb2c8e..e4c81221e92d6c3abe2ac1505f3df94e4e17c5cf 100644 (file)
@@ -9,7 +9,7 @@ from gui import sliceProgessPanel
 from gui import validators
 from gui import preferencesDialog
 from gui import configWizard
-from gui import machineCom
+from gui import firmwareInstall
 from gui import printWindow
 from gui import icon
 from util import profile
@@ -136,7 +136,7 @@ class simpleModeWindow(configBase.configWindowBase):
                prefDialog.Show(True)
        
        def OnDefaultMarlinFirmware(self, e):
-               machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"))
+               firmwareInstall.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex"))
 
        def OnCustomFirmware(self, e):
                dlg=wx.FileDialog(self, "Open firmware to upload", os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
@@ -146,7 +146,7 @@ class simpleModeWindow(configBase.configWindowBase):
                        if not(os.path.exists(filename)):
                                return
                        #For some reason my Ubuntu 10.10 crashes here.
-                       machineCom.InstallFirmware(filename)
+                       firmwareInstall.InstallFirmware(filename)
 
        def OnFirstRunWizard(self, e):
                configWizard.configWizard()
similarity index 56%
rename from Cura/gui/machineCom.py
rename to Cura/util/machineCom.py
index 6e6e7e431526660a2f75d9f9eed27bbab634c66c..66e10d186ef2645f227ad0423ecd7bcd5e1b8136 100644 (file)
@@ -1,7 +1,7 @@
 from __future__ import absolute_import
 import __init__
 
-import os, glob, wx, threading, sys, time
+import os, glob, sys, time
 
 from serial import Serial
 
@@ -29,97 +29,30 @@ def serialList():
             pass
     return baselist+glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') +glob.glob("/dev/tty.usb*")+glob.glob("/dev/cu.*")+glob.glob("/dev/rfcomm*")
 
-class InstallFirmware(wx.Dialog):
-       def __init__(self, filename, port = None):
-               super(InstallFirmware, self).__init__(parent=None, title="Firmware install", size=(250, 100))
-               if port == None:
-                       port = profile.getPreference('serial_port')
-
-               sizer = wx.BoxSizer(wx.VERTICAL)
-               
-               self.progressLabel = wx.StaticText(self, -1, 'Reading firmware...')
-               sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER)
-               self.progressGauge = wx.Gauge(self, -1)
-               sizer.Add(self.progressGauge, 0, flag=wx.EXPAND)
-               self.okButton = wx.Button(self, -1, 'Ok')
-               self.okButton.Disable()
-               self.okButton.Bind(wx.EVT_BUTTON, self.OnOk)
-               sizer.Add(self.okButton, 0, flag=wx.ALIGN_CENTER)
-               self.SetSizer(sizer)
-               
-               self.filename = filename
-               self.port = port
-               
-               threading.Thread(target=self.OnRun).start()
-               
-               self.ShowModal()
-               self.Destroy()
-               
-               return
-
-       def OnRun(self):
-               hexFile = intelHex.readHex(self.filename)
-               wx.CallAfter(self.updateLabel, "Connecting to machine...")
-               programmer = stk500v2.Stk500v2()
-               programmer.progressCallback = self.OnProgress
-               if self.port == 'AUTO':
-                       for self.port in serialList():
-                               try:
-                                       programmer.connect(self.port)
-                                       break
-                               except ispBase.IspError:
-                                       pass
-               else:
-                       try:
-                               programmer.connect(self.port)
-                       except ispBase.IspError:
-                               pass
-                               
-               if programmer.isConnected():
-                       wx.CallAfter(self.updateLabel, "Uploading firmware...")
-                       try:
-                               programmer.programChip(hexFile)
-                               wx.CallAfter(self.updateLabel, "Done!")
-                       except ispBase.IspError as e:
-                               wx.CallAfter(self.updateLabel, "Failed to write firmware.\n" + str(e))
-                               
-                       programmer.close()
-                       wx.CallAfter(self.okButton.Enable)
-                       return
-               wx.MessageBox('Failed to find machine for firmware upgrade\nIs your machine connected to the PC?', 'Firmware update', wx.OK | wx.ICON_ERROR)
-               wx.CallAfter(self.Close)
-       
-       def updateLabel(self, text):
-               self.progressLabel.SetLabel(text)
-               self.Layout()
-       
-       def OnProgress(self, value, max):
-               wx.CallAfter(self.progressGauge.SetRange, max)
-               wx.CallAfter(self.progressGauge.SetValue, value)
-
-       def OnOk(self, e):
-               self.Close()
-
-       def OnClose(self, e):
-               self.Destroy()
-
 class VirtualPrinter():
        def __init__(self):
                self.readList = ['start\n']
                self.temp = 0.0
                self.targetTemp = 0.0
+               self.bedTemp = 1.0
+               self.bedTargetTemp = 1.0
        
        def write(self, data):
                if self.readList == None:
                        return
                print "Send: %s" % (data.rstrip())
-               if 'M104' in data:
+               if 'M104' in data or 'M109' in data:
                        try:
                                self.targetTemp = float(data[data.find('S')+1:])
                        except:
                                pass
+               if 'M140' in data or 'M190' in data:
+                       try:
+                               self.bedTargetTemp = float(data[data.find('S')+1:])
+                       except:
+                               pass
                if 'M105' in data:
-                       self.readList.append("ok T:%f/%f\n" % (self.temp, self.targetTemp))
+                       self.readList.append("ok T:%f /%f B:%f /%f @:64\n" % (self.temp, self.targetTemp, self.bedTemp, self.bedTargetTemp))
                else:
                        self.readList.append("ok\n")
 
@@ -128,6 +61,7 @@ class VirtualPrinter():
                        return ''
                n = 0
                self.temp = (self.temp + self.targetTemp) / 2
+               self.bedTemp = (self.bedTemp + self.bedTargetTemp) / 2
                while len(self.readList) < 1:
                        time.sleep(0.1)
                        n += 1