chiark / gitweb /
Added terminal tab to printer interface.
authordaid <daid303@gmail.com>
Fri, 6 Jul 2012 11:27:06 +0000 (13:27 +0200)
committerdaid <daid303@gmail.com>
Fri, 6 Jul 2012 11:27:06 +0000 (13:27 +0200)
Cura/gui/printWindow.py
Cura/util/machineCom.py

index d238e90eda7953e6c79864d7dccaa5727817dc3c..ad6b9c2e56bda10e11a3300ac7ed954c3957c8ad 100644 (file)
@@ -27,7 +27,9 @@ def startPrintInterface(filename):
        printWindowHandle.Show(True)\r
        printWindowHandle.Raise()\r
        printWindowHandle.OnConnect(None)\r
-       printWindowHandle.LoadGCodeFile(filename)\r
+       t = threading.Thread(target=printWindowHandle.LoadGCodeFile,args=(filename,))\r
+       t.daemon = True\r
+       t.start()\r
        app.MainLoop()\r
 \r
 class printProcessMonitor():\r
@@ -91,6 +93,8 @@ class printWindow(wx.Frame):
                self.feedrateRatioFill = 1.0\r
                self.feedrateRatioSupport = 1.0\r
                self.pause = False\r
+               self.termHistory = []\r
+               self.termHistoryIdx = 0\r
 \r
                #self.SetIcon(icon.getMainIcon())\r
                \r
@@ -204,6 +208,24 @@ class printWindow(wx.Frame):
                sizer.Add(wx.StaticText(self.speedPanel, -1, "%"), pos=(3,2))\r
 \r
                nb.AddPage(self.speedPanel, 'Speed')\r
+               \r
+               self.termPanel = wx.Panel(nb)\r
+               sizer = wx.GridBagSizer(2, 2)\r
+               self.termPanel.SetSizer(sizer)\r
+               \r
+               f = wx.Font(8, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False)\r
+               self.termLog = wx.TextCtrl(self.termPanel, style=wx.TE_MULTILINE|wx.TE_DONTWRAP)\r
+               self.termLog.SetFont(f)\r
+               self.termLog.SetEditable(0)\r
+               self.termInput = wx.TextCtrl(self.termPanel, style=wx.TE_PROCESS_ENTER)\r
+               self.termInput.SetFont(f)\r
+\r
+               sizer.Add(self.termLog, pos=(0,0),flag=wx.EXPAND)\r
+               sizer.Add(self.termInput, pos=(1,0),flag=wx.EXPAND)\r
+               sizer.AddGrowableCol(0)\r
+               sizer.AddGrowableRow(0)\r
+\r
+               nb.AddPage(self.termPanel, 'Term')\r
 \r
                self.sizer.AddGrowableRow(3)\r
                self.sizer.AddGrowableCol(0)\r
@@ -222,6 +244,8 @@ class printWindow(wx.Frame):
                self.Bind(wx.EVT_SPINCTRL, self.OnSpeedChange, self.innerWallSpeedSelect)\r
                self.Bind(wx.EVT_SPINCTRL, self.OnSpeedChange, self.fillSpeedSelect)\r
                self.Bind(wx.EVT_SPINCTRL, self.OnSpeedChange, self.supportSpeedSelect)\r
+               self.Bind(wx.EVT_TEXT_ENTER, self.OnTermEnterLine, self.termInput)\r
+               self.termInput.Bind(wx.EVT_CHAR, self.OnTermKey)\r
                \r
                self.Layout()\r
                self.Fit()\r
@@ -242,7 +266,9 @@ class printWindow(wx.Frame):
        \r
        def UpdateProgress(self):\r
                status = ""\r
-               if self.gcode != None:\r
+               if self.gcode == None:\r
+                       status += "Loading gcode...\n"\r
+               else:\r
                        status += "Filament: %.2fm %.2fg\n" % (self.gcode.extrusionAmount / 1000, self.gcode.calculateWeight() * 1000)\r
                        cost = self.gcode.calculateCost()\r
                        if cost != False:\r
@@ -325,6 +351,33 @@ class printWindow(wx.Frame):
                self.feedrateRatioInnerWall = self.innerWallSpeedSelect.GetValue() / 100.0\r
                self.feedrateRatioFill = self.fillSpeedSelect.GetValue() / 100.0\r
                self.feedrateRatioSupport = self.supportSpeedSelect.GetValue() / 100.0\r
+       \r
+       def AddTermLog(self, line):\r
+               self.termLog.AppendText(line)\r
+       \r
+       def OnTermEnterLine(self, e):\r
+               line = self.termInput.GetValue()\r
+               if line == '':\r
+                       return\r
+               self.termLog.AppendText('>%s\n' % (line))\r
+               self.sendCommand(line)\r
+               self.termHistory.append(line)\r
+               self.termHistoryIdx = len(self.termHistory)\r
+               self.termInput.SetValue('')\r
+\r
+       def OnTermKey(self, e):\r
+               if len(self.termHistory) > 0:\r
+                       if e.GetKeyCode() == wx.WXK_UP:\r
+                               self.termHistoryIdx = self.termHistoryIdx - 1\r
+                               if self.termHistoryIdx < 0:\r
+                                       self.termHistoryIdx = len(self.termHistory) - 1\r
+                               self.termInput.SetValue(self.termHistory[self.termHistoryIdx])\r
+                       if e.GetKeyCode() == wx.WXK_DOWN:\r
+                               self.termHistoryIdx = self.termHistoryIdx - 1\r
+                               if self.termHistoryIdx >= len(self.termHistory):\r
+                                       self.termHistoryIdx = 0\r
+                               self.termInput.SetValue(self.termHistory[self.termHistoryIdx])\r
+               e.Skip()\r
 \r
        def LoadGCodeFile(self, filename):\r
                if self.printIdx != None:\r
@@ -345,12 +398,13 @@ class printWindow(wx.Frame):
                gcode = gcodeInterpreter.gcode()\r
                gcode.loadList(gcodeList)\r
                print "Loaded: %s (%d)" % (filename, len(gcodeList))\r
-               self.progress.SetRange(len(gcodeList))\r
                self.gcode = gcode\r
                self.gcodeList = gcodeList\r
                self.typeList = typeList\r
-               self.UpdateButtonStates()\r
-               self.UpdateProgress()\r
+               \r
+               wx.CallAfter(self.progress.SetRange, len(gcodeList))\r
+               wx.CallAfter(self.UpdateButtonStates)\r
+               wx.CallAfter(self.UpdateProgress)\r
                \r
        def sendCommand(self, cmd):\r
                if self.machineConnected:\r
@@ -385,22 +439,24 @@ class printWindow(wx.Frame):
                                self.machineConnected = False\r
                                wx.CallAfter(self.UpdateButtonStates)\r
                                return\r
+                       if line == '':  #When we have a communication "timeout" and we're not sending gcode, then read the temperature.\r
+                               if self.printIdx == None or self.pause:\r
+                                       self.machineCom.sendCommand("M105")\r
                        if self.machineConnected:\r
                                while self.sendCnt > 0 and not self.pause:\r
                                        self.sendLine(self.printIdx)\r
                                        self.printIdx += 1\r
                                        self.sendCnt -= 1\r
-                       elif line.startswith("start"):\r
+                       if line.startswith("start"):\r
                                self.machineConnected = True\r
                                wx.CallAfter(self.UpdateButtonStates)\r
-                       if 'T:' in line:\r
+                       elif 'T:' in line:\r
                                self.temp = float(re.search("[0-9\.]*", line.split('T:')[1]).group(0))\r
                                if 'B:' in line:\r
                                        self.bedTemp = float(re.search("[0-9\.]*", line.split('B:')[1]).group(0))\r
                                wx.CallAfter(self.UpdateProgress)\r
-                       if line == '':  #When we have a communication "timeout" and we're not sending gcode, then read the temperature.\r
-                               if self.printIdx == None or self.pause:\r
-                                       self.machineCom.sendCommand("M105")\r
+                       elif line.strip() != 'ok':\r
+                               wx.CallAfter(self.AddTermLog, line)\r
                        if self.printIdx != None:\r
                                if line.startswith("ok"):\r
                                        if len(self.sendList) > 0:\r
index 9a582877fda818737599daebc9cf525fe3d8ebad..9ac31f737444bda55550c334fd9b5bf42e83af6c 100644 (file)
@@ -34,7 +34,7 @@ def baudrateList():
 
 class VirtualPrinter():
        def __init__(self):
-               self.readList = ['start\n']
+               self.readList = ['start\n', 'Marlin: Virtual Marlin!\n']
                self.temp = 0.0
                self.targetTemp = 0.0
                self.bedTemp = 1.0
@@ -55,7 +55,7 @@ class VirtualPrinter():
                        except:
                                pass
                if 'M105' in data:
-                       self.readList.append("ok T:%f /%f B:%f /%f @:64\n" % (self.temp, self.targetTemp, self.bedTemp, self.bedTargetTemp))
+                       self.readList.append("ok T:%.2f /%.2f B:%.2f /%.2f @:64\n" % (self.temp, self.targetTemp, self.bedTemp, self.bedTargetTemp))
                else:
                        self.readList.append("ok\n")