Add temperature control to print window

master
daid 2012-04-04 17:02:22 +02:00
parent 55c50df972
commit 374b2d1b5e
2 changed files with 54 additions and 8 deletions

View File

@ -106,18 +106,33 @@ class InstallFirmware(wx.Dialog):
class VirtualPrinter(): class VirtualPrinter():
def __init__(self): def __init__(self):
self.readList = ['start\n'] self.readList = ['start\n']
self.temp = 0.0
self.targetTemp = 0.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())
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): def readline(self):
if self.readList == None: if self.readList == None:
return '' return ''
n = 0
self.temp = (self.temp + self.targetTemp) / 2
while len(self.readList) < 1: while len(self.readList) < 1:
time.sleep(0.1) time.sleep(0.1)
n += 1
if n == 20:
return ''
if self.readList == None: if self.readList == None:
return '' return ''
time.sleep(0.001) time.sleep(0.001)
@ -141,7 +156,7 @@ class MachineCom():
programmer.connect(port) programmer.connect(port)
programmer.close() programmer.close()
print "Connecting to: %s %i" % (port, baudrate) print "Connecting to: %s %i" % (port, baudrate)
self.serial = Serial(port, baudrate, timeout=5) self.serial = Serial(port, baudrate, timeout=2)
break break
except ispBase.IspError: except ispBase.IspError:
pass pass
@ -152,7 +167,7 @@ class MachineCom():
self.serial = VirtualPrinter() self.serial = VirtualPrinter()
else: else:
try: try:
self.serial = Serial(port, baudrate, timeout=5) self.serial = Serial(port, baudrate, timeout=2)
except: except:
print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0] print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0]

View File

@ -1,7 +1,7 @@
from __future__ import absolute_import from __future__ import absolute_import
import __init__ import __init__
import wx, threading import wx, threading, re
from gui import machineCom from gui import machineCom
from gui import icon from gui import icon
@ -27,7 +27,9 @@ class printWindow(wx.Frame):
self.thread = None self.thread = None
self.gcode = None self.gcode = None
self.gcodeList = None self.gcodeList = None
self.sendList = []
self.printIdx = None self.printIdx = None
self.temp = None
self.bufferLineCount = 4 self.bufferLineCount = 4
self.sendCnt = 0 self.sendCnt = 0
@ -51,11 +53,20 @@ class printWindow(wx.Frame):
self.printButton = wx.Button(self.panel, -1, 'Print GCode') self.printButton = wx.Button(self.panel, -1, 'Print GCode')
self.cancelButton = wx.Button(self.panel, -1, 'Cancel print') self.cancelButton = wx.Button(self.panel, -1, 'Cancel print')
self.progress = wx.Gauge(self.panel, -1) self.progress = wx.Gauge(self.panel, -1)
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.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))
self.sizer.Add(self.printButton, pos=(2,1)) self.sizer.Add(self.printButton, pos=(2,1))
self.sizer.Add(self.cancelButton, pos=(3,1)) self.sizer.Add(self.cancelButton, pos=(3,1))
self.sizer.Add(self.progress, pos=(4,0), span=(1,2), flag=wx.EXPAND) self.sizer.Add(self.progress, pos=(4,0), span=(1,2), flag=wx.EXPAND)
self.sizer.Add(wx.StaticText(self.panel, -1, "Temp:"), pos=(0,3))
self.sizer.Add(self.temperatureSelect, pos=(0,4))
self.sizer.AddGrowableRow(3) self.sizer.AddGrowableRow(3)
self.sizer.AddGrowableCol(0) self.sizer.AddGrowableCol(0)
@ -65,6 +76,8 @@ class printWindow(wx.Frame):
self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint) self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint)
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.Layout() self.Layout()
self.Fit() self.Fit()
self.Centre() self.Centre()
@ -90,6 +103,8 @@ class printWindow(wx.Frame):
else: else:
self.progress.SetValue(self.printIdx) self.progress.SetValue(self.printIdx)
status += 'Line: %d/%d\n' % (self.printIdx, len(self.gcodeList)) status += 'Line: %d/%d\n' % (self.printIdx, len(self.gcodeList))
if self.temp != None:
status += 'Temp: %d\n' % (self.temp)
self.statsText.SetLabel(status) self.statsText.SetLabel(status)
def OnConnect(self, e): def OnConnect(self, e):
@ -128,9 +143,13 @@ class printWindow(wx.Frame):
self.thread.join() self.thread.join()
self.Destroy() self.Destroy()
def OnTempChange(self, e):
self.sendCommand("M104 S%d" % (self.temperatureSelect.GetValue()))
def LoadGCodeFile(self, filename): def LoadGCodeFile(self, filename):
if self.printIdx != None: if self.printIdx != None:
return return
#Send an initial M110 to reset the line counter to zero.
gcodeList = ["M110"] gcodeList = ["M110"]
for line in open(filename, 'r'): for line in open(filename, 'r'):
if ';' in line: if ';' in line:
@ -146,6 +165,13 @@ class printWindow(wx.Frame):
self.gcodeList = gcodeList self.gcodeList = gcodeList
self.UpdateButtonStates() self.UpdateButtonStates()
self.UpdateProgress() self.UpdateProgress()
def sendCommand(self, cmd):
if self.machineConnected:
if self.printIdx == None:
self.machineCom.sendCommand(cmd)
else:
self.sendList.append(cmd)
def sendLine(self, lineNr): def sendLine(self, lineNr):
if lineNr >= len(self.gcodeList): if lineNr >= len(self.gcodeList):
@ -155,7 +181,6 @@ class printWindow(wx.Frame):
return True return True
def PrinterMonitor(self): def PrinterMonitor(self):
skipCount = 0
while True: while True:
line = self.machineCom.readline() line = self.machineCom.readline()
if line == None: if line == None:
@ -170,10 +195,16 @@ class printWindow(wx.Frame):
elif line.startswith("start"): elif line.startswith("start"):
self.machineConnected = True self.machineConnected = True
wx.CallAfter(self.UpdateButtonStates) wx.CallAfter(self.UpdateButtonStates)
if self.printIdx != None: if 'T:' in line:
self.temp = float(re.search("[0-9\.]*", line.split('T:')[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 read the temperature.
self.machineCom.sendCommand("M105")
else:
if line.startswith("ok"): if line.startswith("ok"):
if skipCount > 0: if len(self.sendList) > 0:
skipCount -= 1 self.machineCom.sendCommand(self.sendList.pop(0))
else: else:
if self.sendLine(self.printIdx): if self.sendLine(self.printIdx):
self.printIdx += 1 self.printIdx += 1