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.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):

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

View File

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

View File

@ -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.

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

View 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