From 374b2d1b5eae6bb9b5380b2cab7834e8fefbc0f6 Mon Sep 17 00:00:00 2001 From: daid Date: Wed, 4 Apr 2012 17:02:22 +0200 Subject: [PATCH] Add temperature control to print window --- Cura/gui/machineCom.py | 21 ++++++++++++++++++--- Cura/gui/printWindow.py | 41 ++++++++++++++++++++++++++++++++++++----- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/Cura/gui/machineCom.py b/Cura/gui/machineCom.py index 7c1de22..5157fbe 100644 --- a/Cura/gui/machineCom.py +++ b/Cura/gui/machineCom.py @@ -106,18 +106,33 @@ class InstallFirmware(wx.Dialog): class VirtualPrinter(): def __init__(self): self.readList = ['start\n'] + self.temp = 0.0 + self.targetTemp = 0.0 def write(self, data): if self.readList == None: return 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): if self.readList == None: return '' + n = 0 + self.temp = (self.temp + self.targetTemp) / 2 while len(self.readList) < 1: time.sleep(0.1) + n += 1 + if n == 20: + return '' if self.readList == None: return '' time.sleep(0.001) @@ -141,7 +156,7 @@ class MachineCom(): programmer.connect(port) programmer.close() print "Connecting to: %s %i" % (port, baudrate) - self.serial = Serial(port, baudrate, timeout=5) + self.serial = Serial(port, baudrate, timeout=2) break except ispBase.IspError: pass @@ -152,7 +167,7 @@ class MachineCom(): self.serial = VirtualPrinter() else: try: - self.serial = Serial(port, baudrate, timeout=5) + self.serial = Serial(port, baudrate, timeout=2) except: print "Unexpected error while connecting to serial port:" + port, sys.exc_info()[0] diff --git a/Cura/gui/printWindow.py b/Cura/gui/printWindow.py index ac42429..b48650a 100644 --- a/Cura/gui/printWindow.py +++ b/Cura/gui/printWindow.py @@ -1,7 +1,7 @@ from __future__ import absolute_import import __init__ -import wx, threading +import wx, threading, re from gui import machineCom from gui import icon @@ -27,7 +27,9 @@ class printWindow(wx.Frame): self.thread = None self.gcode = None self.gcodeList = None + self.sendList = [] self.printIdx = None + self.temp = None self.bufferLineCount = 4 self.sendCnt = 0 @@ -51,11 +53,20 @@ class printWindow(wx.Frame): self.printButton = wx.Button(self.panel, -1, 'Print GCode') self.cancelButton = wx.Button(self.panel, -1, 'Cancel print') 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.loadButton, pos=(1,1)) self.sizer.Add(self.printButton, pos=(2,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(wx.StaticText(self.panel, -1, "Temp:"), pos=(0,3)) + self.sizer.Add(self.temperatureSelect, pos=(0,4)) + self.sizer.AddGrowableRow(3) self.sizer.AddGrowableCol(0) @@ -65,6 +76,8 @@ class printWindow(wx.Frame): self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint) self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel) + self.Bind(wx.EVT_SPINCTRL, self.OnTempChange, self.temperatureSelect) + self.Layout() self.Fit() self.Centre() @@ -90,6 +103,8 @@ class printWindow(wx.Frame): else: self.progress.SetValue(self.printIdx) status += 'Line: %d/%d\n' % (self.printIdx, len(self.gcodeList)) + if self.temp != None: + status += 'Temp: %d\n' % (self.temp) self.statsText.SetLabel(status) def OnConnect(self, e): @@ -128,9 +143,13 @@ class printWindow(wx.Frame): self.thread.join() self.Destroy() + def OnTempChange(self, e): + self.sendCommand("M104 S%d" % (self.temperatureSelect.GetValue())) + def LoadGCodeFile(self, filename): if self.printIdx != None: return + #Send an initial M110 to reset the line counter to zero. gcodeList = ["M110"] for line in open(filename, 'r'): if ';' in line: @@ -146,6 +165,13 @@ class printWindow(wx.Frame): self.gcodeList = gcodeList self.UpdateButtonStates() 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): if lineNr >= len(self.gcodeList): @@ -155,7 +181,6 @@ class printWindow(wx.Frame): return True def PrinterMonitor(self): - skipCount = 0 while True: line = self.machineCom.readline() if line == None: @@ -170,10 +195,16 @@ class printWindow(wx.Frame): elif line.startswith("start"): self.machineConnected = True 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 skipCount > 0: - skipCount -= 1 + if len(self.sendList) > 0: + self.machineCom.sendCommand(self.sendList.pop(0)) else: if self.sendLine(self.printIdx): self.printIdx += 1