Add bed temperature control to printer interface. Only show when we get an bed temperatur reading. Fixed #124

master
daid 2012-06-26 12:05:06 +02:00
parent 560b1f8c39
commit 1b360728e7
7 changed files with 128 additions and 87 deletions

View File

@ -4,7 +4,8 @@ import __init__
import wx, os, platform, types, webbrowser, threading, time, re import wx, os, platform, types, webbrowser, threading, time, re
import wx.wizard import wx.wizard
from gui import machineCom from gui import firmwareInstall
from util import machineCom
from util import profile from util import profile
class InfoPage(wx.wizard.WizardPageSimple): class InfoPage(wx.wizard.WizardPageSimple):
@ -132,7 +133,7 @@ class FirmwareUpgradePage(InfoPage):
return False return False
def OnUpgradeClick(self, e): 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() self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()
def OnSkipClick(self, e): def OnSkipClick(self, e):

View File

@ -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()

View File

@ -11,7 +11,7 @@ from gui import alterationPanel
from gui import validators from gui import validators
from gui import preferencesDialog from gui import preferencesDialog
from gui import configWizard from gui import configWizard
from gui import machineCom from gui import firmwareInstall
from gui import printWindow from gui import printWindow
from gui import simpleMode from gui import simpleMode
from gui import projectPlanner from gui import projectPlanner
@ -278,7 +278,7 @@ class mainWindow(configBase.configWindowBase):
self.Close() self.Close()
def OnDefaultMarlinFirmware(self, e): 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): 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) 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)): if not(os.path.exists(filename)):
return return
#For some reason my Ubuntu 10.10 crashes here. #For some reason my Ubuntu 10.10 crashes here.
machineCom.InstallFirmware(filename) firmwareInstall.InstallFirmware(filename)
def OnFirstRunWizard(self, e): def OnFirstRunWizard(self, e):
configWizard.configWizard() configWizard.configWizard()

View File

@ -6,7 +6,7 @@ import ConfigParser
from gui import configBase from gui import configBase
from gui import validators from gui import validators
from gui import machineCom from util import machineCom
from util import profile from util import profile
class preferencesDialog(configBase.configWindowBase): class preferencesDialog(configBase.configWindowBase):

View File

@ -4,9 +4,9 @@ import __init__
import wx, threading, re, subprocess, sys, os import wx, threading, re, subprocess, sys, os
from wx.lib import buttons from wx.lib import buttons
from gui import machineCom
from gui import icon from gui import icon
from gui import toolbarUtil from gui import toolbarUtil
from util import machineCom
from util import profile from util import profile
from util import gcodeInterpreter from util import gcodeInterpreter
@ -82,6 +82,7 @@ class printWindow(wx.Frame):
self.sendList = [] self.sendList = []
self.printIdx = None self.printIdx = None
self.temp = None self.temp = None
self.bedTemp = None
self.bufferLineCount = 4 self.bufferLineCount = 4
self.sendCnt = 0 self.sendCnt = 0
@ -109,6 +110,11 @@ class printWindow(wx.Frame):
h = self.connectButton.GetSize().GetHeight() h = self.connectButton.GetSize().GetHeight()
self.temperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS) self.temperatureSelect = wx.SpinCtrl(self.panel, -1, '0', size=(21*3,21), style=wx.SP_ARROW_KEYS)
self.temperatureSelect.SetRange(0, 400) 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.connectButton, pos=(0,1))
#self.sizer.Add(self.loadButton, pos=(1,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(wx.StaticText(self.panel, -1, "Temp:"), pos=(0,3))
self.sizer.Add(self.temperatureSelect, pos=(0,4)) 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.directControlPanel = wx.Panel(self.panel)
self.sizer.Add(self.directControlPanel, pos=(1,3), span=(5,4)) 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.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)
self.Bind(wx.EVT_SPINCTRL, self.OnTempChange, self.temperatureSelect) self.Bind(wx.EVT_SPINCTRL, self.OnTempChange, self.temperatureSelect)
self.Bind(wx.EVT_SPINCTRL, self.OnBedTempChange, self.bedTemperatureSelect)
self.Layout() self.Layout()
self.Fit() self.Fit()
@ -195,6 +204,10 @@ class printWindow(wx.Frame):
self.progress.SetValue(self.printIdx) self.progress.SetValue(self.printIdx)
if self.temp != None: if self.temp != None:
status += 'Temp: %d\n' % (self.temp) 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.statsText.SetLabel(status.strip())
self.Layout() self.Layout()
@ -238,6 +251,9 @@ class printWindow(wx.Frame):
def OnTempChange(self, e): def OnTempChange(self, e):
self.sendCommand("M104 S%d" % (self.temperatureSelect.GetValue())) self.sendCommand("M104 S%d" % (self.temperatureSelect.GetValue()))
def OnBedTempChange(self, e):
self.sendCommand("M140 S%d" % (self.bedTemperatureSelect.GetValue()))
def LoadGCodeFile(self, filename): def LoadGCodeFile(self, filename):
if self.printIdx != None: if self.printIdx != None:
return return
@ -289,6 +305,8 @@ class printWindow(wx.Frame):
wx.CallAfter(self.UpdateButtonStates) wx.CallAfter(self.UpdateButtonStates)
if 'T:' in line: if 'T:' in line:
self.temp = float(re.search("[0-9\.]*", line.split('T:')[1]).group(0)) 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) wx.CallAfter(self.UpdateProgress)
if self.printIdx == None: if self.printIdx == None:
if line == '': #When we have a communication "timeout" and we're not sending gcode, then read the temperature. if line == '': #When we have a communication "timeout" and we're not sending gcode, then read the temperature.

View File

@ -9,7 +9,7 @@ from gui import sliceProgessPanel
from gui import validators from gui import validators
from gui import preferencesDialog from gui import preferencesDialog
from gui import configWizard from gui import configWizard
from gui import machineCom from gui import firmwareInstall
from gui import printWindow from gui import printWindow
from gui import icon from gui import icon
from util import profile from util import profile
@ -136,7 +136,7 @@ class simpleModeWindow(configBase.configWindowBase):
prefDialog.Show(True) prefDialog.Show(True)
def OnDefaultMarlinFirmware(self, e): 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): 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) 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)): if not(os.path.exists(filename)):
return return
#For some reason my Ubuntu 10.10 crashes here. #For some reason my Ubuntu 10.10 crashes here.
machineCom.InstallFirmware(filename) firmwareInstall.InstallFirmware(filename)
def OnFirstRunWizard(self, e): def OnFirstRunWizard(self, e):
configWizard.configWizard() configWizard.configWizard()

View File

@ -1,7 +1,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import __init__ import __init__
import os, glob, wx, threading, sys, time import os, glob, sys, time
from serial import Serial from serial import Serial
@ -29,97 +29,30 @@ def serialList():
pass pass
return baselist+glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') +glob.glob("/dev/tty.usb*")+glob.glob("/dev/cu.*")+glob.glob("/dev/rfcomm*") 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(): class VirtualPrinter():
def __init__(self): def __init__(self):
self.readList = ['start\n'] self.readList = ['start\n']
self.temp = 0.0 self.temp = 0.0
self.targetTemp = 0.0 self.targetTemp = 0.0
self.bedTemp = 1.0
self.bedTargetTemp = 1.0
def write(self, data): def write(self, data):
if self.readList == None: if self.readList == None:
return return
print "Send: %s" % (data.rstrip()) print "Send: %s" % (data.rstrip())
if 'M104' in data: if 'M104' in data or 'M109' in data:
try: try:
self.targetTemp = float(data[data.find('S')+1:]) self.targetTemp = float(data[data.find('S')+1:])
except: except:
pass pass
if 'M140' in data or 'M190' in data:
try:
self.bedTargetTemp = float(data[data.find('S')+1:])
except:
pass
if 'M105' in data: 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: else:
self.readList.append("ok\n") self.readList.append("ok\n")
@ -128,6 +61,7 @@ class VirtualPrinter():
return '' return ''
n = 0 n = 0
self.temp = (self.temp + self.targetTemp) / 2 self.temp = (self.temp + self.targetTemp) / 2
self.bedTemp = (self.bedTemp + self.bedTargetTemp) / 2
while len(self.readList) < 1: while len(self.readList) < 1:
time.sleep(0.1) time.sleep(0.1)
n += 1 n += 1