From: daid Date: Tue, 26 Jun 2012 10:05:06 +0000 (+0200) Subject: Add bed temperature control to printer interface. Only show when we get an bed temper... X-Git-Tag: 12.07~30 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=1b360728e7d87b0ebb801c6f802eb5e58baaf755;p=cura.git Add bed temperature control to printer interface. Only show when we get an bed temperatur reading. Fixed #124 --- diff --git a/Cura/gui/configWizard.py b/Cura/gui/configWizard.py index 5efd6339..01d72626 100644 --- a/Cura/gui/configWizard.py +++ b/Cura/gui/configWizard.py @@ -4,7 +4,8 @@ import __init__ import wx, os, platform, types, webbrowser, threading, time, re import wx.wizard -from gui import machineCom +from gui import firmwareInstall +from util import machineCom from util import profile class InfoPage(wx.wizard.WizardPageSimple): @@ -132,7 +133,7 @@ class FirmwareUpgradePage(InfoPage): return False def OnUpgradeClick(self, e): - if machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")): + if firmwareInstall.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")): self.GetParent().FindWindowById(wx.ID_FORWARD).Enable() def OnSkipClick(self, e): diff --git a/Cura/gui/firmwareInstall.py b/Cura/gui/firmwareInstall.py new file mode 100644 index 00000000..7d60a50a --- /dev/null +++ b/Cura/gui/firmwareInstall.py @@ -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() + diff --git a/Cura/gui/mainWindow.py b/Cura/gui/mainWindow.py index fc2b92ee..036d5746 100644 --- a/Cura/gui/mainWindow.py +++ b/Cura/gui/mainWindow.py @@ -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() diff --git a/Cura/gui/preferencesDialog.py b/Cura/gui/preferencesDialog.py index 9ff3bd6e..b1183a61 100644 --- a/Cura/gui/preferencesDialog.py +++ b/Cura/gui/preferencesDialog.py @@ -6,7 +6,7 @@ import ConfigParser from gui import configBase from gui import validators -from gui import machineCom +from util import machineCom from util import profile class preferencesDialog(configBase.configWindowBase): diff --git a/Cura/gui/printWindow.py b/Cura/gui/printWindow.py index 39686ba4..5ecfcddd 100644 --- a/Cura/gui/printWindow.py +++ b/Cura/gui/printWindow.py @@ -4,9 +4,9 @@ import __init__ import wx, threading, re, subprocess, sys, os from wx.lib import buttons -from gui import machineCom from gui import icon from gui import toolbarUtil +from util import machineCom from util import profile from util import gcodeInterpreter @@ -82,6 +82,7 @@ class printWindow(wx.Frame): self.sendList = [] self.printIdx = None self.temp = None + self.bedTemp = None self.bufferLineCount = 4 self.sendCnt = 0 @@ -109,6 +110,11 @@ class printWindow(wx.Frame): h = self.connectButton.GetSize().GetHeight() self.temperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS) self.temperatureSelect.SetRange(0, 400) + self.bedTemperatureLabel = wx.StaticText(self.panel, -1, "BedTemp:") + self.bedTemperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS) + self.bedTemperatureSelect.SetRange(0, 400) + self.bedTemperatureLabel.Show(False) + self.bedTemperatureSelect.Show(False) self.sizer.Add(self.connectButton, pos=(0,1)) #self.sizer.Add(self.loadButton, pos=(1,1)) @@ -118,6 +124,8 @@ class printWindow(wx.Frame): self.sizer.Add(wx.StaticText(self.panel, -1, "Temp:"), pos=(0,3)) self.sizer.Add(self.temperatureSelect, pos=(0,4)) + self.sizer.Add(self.bedTemperatureLabel, pos=(0,5)) + self.sizer.Add(self.bedTemperatureSelect, pos=(0,6)) self.directControlPanel = wx.Panel(self.panel) self.sizer.Add(self.directControlPanel, pos=(1,3), span=(5,4)) @@ -162,6 +170,7 @@ class printWindow(wx.Frame): self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel) self.Bind(wx.EVT_SPINCTRL, self.OnTempChange, self.temperatureSelect) + self.Bind(wx.EVT_SPINCTRL, self.OnBedTempChange, self.bedTemperatureSelect) self.Layout() self.Fit() @@ -195,6 +204,10 @@ class printWindow(wx.Frame): self.progress.SetValue(self.printIdx) if self.temp != None: status += 'Temp: %d\n' % (self.temp) + if self.bedTemp != None and self.bedTemp > 0: + status += 'Bed Temp: %d\n' % (self.bedTemp) + self.bedTemperatureLabel.Show(True) + self.bedTemperatureSelect.Show(True) self.statsText.SetLabel(status.strip()) self.Layout() @@ -238,6 +251,9 @@ class printWindow(wx.Frame): def OnTempChange(self, e): self.sendCommand("M104 S%d" % (self.temperatureSelect.GetValue())) + def OnBedTempChange(self, e): + self.sendCommand("M140 S%d" % (self.bedTemperatureSelect.GetValue())) + def LoadGCodeFile(self, filename): if self.printIdx != None: return @@ -289,6 +305,8 @@ class printWindow(wx.Frame): wx.CallAfter(self.UpdateButtonStates) if 'T:' in line: self.temp = float(re.search("[0-9\.]*", line.split('T:')[1]).group(0)) + if 'B:' in line: + self.bedTemp = float(re.search("[0-9\.]*", line.split('B:')[1]).group(0)) wx.CallAfter(self.UpdateProgress) if self.printIdx == None: if line == '': #When we have a communication "timeout" and we're not sending gcode, then read the temperature. diff --git a/Cura/gui/simpleMode.py b/Cura/gui/simpleMode.py index 8fee9790..e4c81221 100644 --- a/Cura/gui/simpleMode.py +++ b/Cura/gui/simpleMode.py @@ -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() diff --git a/Cura/gui/machineCom.py b/Cura/util/machineCom.py similarity index 56% rename from Cura/gui/machineCom.py rename to Cura/util/machineCom.py index 6e6e7e43..66e10d18 100644 --- a/Cura/gui/machineCom.py +++ b/Cura/util/machineCom.py @@ -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