chiark / gitweb /
Just a comment
[cura.git] / Cura / gui / printWindow.py
1 from __future__ import absolute_import\r
2 import __init__\r
3 \r
4 import wx, threading\r
5 \r
6 from gui import machineCom\r
7 \r
8 printWindowHandle = None\r
9 \r
10 def printFile(filename):\r
11         global printWindowHandle\r
12         if printWindowHandle == None:\r
13                 printWindowHandle = printWindow()\r
14         printWindowHandle.Show(True)\r
15         printWindowHandle.Raise()\r
16         printWindowHandle.LoadGCodeFile(filename)\r
17 \r
18 class printWindow(wx.Frame):\r
19         "Main user interface window"\r
20         def __init__(self):\r
21                 super(printWindow, self).__init__(None, -1, title='Printing')\r
22                 self.machineCom = None\r
23                 self.thread = None\r
24                 self.gcodeList = None\r
25                 self.printIdx = None\r
26                 self.bufferLineCount = 4\r
27                 self.sendCnt = 0\r
28                 \r
29                 self.SetSizer(wx.BoxSizer())\r
30                 self.panel = wx.Panel(self)\r
31                 self.GetSizer().Add(self.panel, 1, flag=wx.EXPAND)\r
32                 self.sizer = wx.GridBagSizer(2, 2)\r
33                 self.panel.SetSizer(self.sizer)\r
34                 \r
35                 sb = wx.StaticBox(self.panel, label="Statistics")\r
36                 boxsizer = wx.StaticBoxSizer(sb, wx.VERTICAL)\r
37                 boxsizer.Add(wx.StaticText(self.panel, -1, "Filament: #.##m #.##g"), flag=wx.LEFT, border=5)\r
38                 boxsizer.Add(wx.StaticText(self.panel, -1, "Print time: ##:##"), flag=wx.LEFT, border=5)\r
39                 \r
40                 self.sizer.Add(boxsizer, pos=(0,0), span=(4,1), flag=wx.EXPAND)\r
41                 \r
42                 self.connectButton = wx.Button(self.panel, -1, 'Connect')\r
43                 self.loadButton = wx.Button(self.panel, -1, 'Load GCode')\r
44                 self.printButton = wx.Button(self.panel, -1, 'Print GCode')\r
45                 self.cancelButton = wx.Button(self.panel, -1, 'Cancel print')\r
46                 self.sizer.Add(self.connectButton, pos=(0,1))\r
47                 self.sizer.Add(self.loadButton, pos=(1,1))\r
48                 self.sizer.Add(self.printButton, pos=(2,1))\r
49                 self.sizer.Add(self.cancelButton, pos=(3,1))\r
50                 self.sizer.Add(wx.Gauge(self.panel, -1), pos=(4,0), span=(1,2), flag=wx.EXPAND)\r
51                 self.sizer.AddGrowableRow(3)\r
52                 self.sizer.AddGrowableCol(0)\r
53                 \r
54                 self.Bind(wx.EVT_CLOSE, self.OnClose)\r
55                 self.connectButton.Bind(wx.EVT_BUTTON, self.OnConnect)\r
56                 self.loadButton.Bind(wx.EVT_BUTTON, self.OnLoad)\r
57                 self.printButton.Bind(wx.EVT_BUTTON, self.OnPrint)\r
58                 self.cancelButton.Bind(wx.EVT_BUTTON, self.OnCancel)\r
59                 \r
60                 self.Layout()\r
61                 self.Fit()\r
62                 self.Centre()\r
63         \r
64         def OnConnect(self, e):\r
65                 if self.machineCom != None:\r
66                         self.machineCom.close()\r
67                         self.thread.join()\r
68                 self.machineCom = machineCom.MachineCom()\r
69                 self.thread = threading.Thread(target=self.PrinterMonitor)\r
70                 self.thread.start()\r
71         \r
72         def OnLoad(self, e):\r
73                 pass\r
74         \r
75         def OnPrint(self, e):\r
76                 if self.machineCom == None:\r
77                         return\r
78                 if self.gcodeList == None:\r
79                         return\r
80                 if self.printIdx != None:\r
81                         return\r
82                 self.printIdx = 1\r
83                 self.sendLine(0)\r
84                 self.sendCnt = self.bufferLineCount\r
85         \r
86         def OnCancel(self, e):\r
87                 pass\r
88         \r
89         def OnClose(self, e):\r
90                 global printWindowHandle\r
91                 printWindowHandle = None\r
92                 if self.machineCom != None:\r
93                         self.machineCom.close()\r
94                         self.thread.join()\r
95                 self.Destroy()\r
96 \r
97         def LoadGCodeFile(self, filename):\r
98                 gcodeList = ["M110"]\r
99                 for line in open(filename, 'r'):\r
100                         if ';' in line:\r
101                                 line = line[0:line.find(';')]\r
102                         line = line.strip()\r
103                         if len(line) > 0:\r
104                                 gcodeList.append(line)\r
105                 print "Loaded: %s (%d)" % (filename, len(gcodeList))\r
106                 self.gcodeList = gcodeList\r
107 \r
108         def sendLine(self, lineNr):\r
109                 if lineNr >= len(self.gcodeList):\r
110                         return\r
111                 checksum = reduce(lambda x,y:x^y, map(ord, "N%d%s" % (lineNr, self.gcodeList[lineNr])))\r
112                 self.machineCom.sendCommand("N%d%s*%d" % (lineNr, self.gcodeList[lineNr], checksum))\r
113 \r
114         def PrinterMonitor(self):\r
115                 skipCount = 0\r
116                 while True:\r
117                         line = self.machineCom.readline()\r
118                         if line == None:\r
119                                 return\r
120                         while self.sendCnt > 0:\r
121                                 self.sendLine(self.printIdx)\r
122                                 self.printIdx += 1\r
123                                 self.sendCnt -= 1\r
124                         if self.printIdx != None:\r
125                                 if line.startswith("ok"):\r
126                                         if skipCount > 0:\r
127                                                 skipCount -= 1\r
128                                         else:\r
129                                                 self.sendLine(self.printIdx)\r
130                                                 self.printIdx += 1\r
131                                 elif "resend" in line.lower() or "rs" in line:\r
132                                         try:\r
133                                                 lineNr=int(line.replace("N:"," ").replace("N"," ").replace(":"," ").split()[-1])\r
134                                         except:\r
135                                                 if "rs" in line:\r
136                                                         lineNr=int(line.split()[1])\r
137                                         self.printIdx = lineNr\r
138                                         #we should actually resend the line here, but we also get an "ok" for each error from Marlin. And thus we'll resend on the OK.\r