chiark / gitweb /
Merge remote-tracking branch 'upstream/master'
[cura.git] / Cura / gui / firmwareInstall.py
1 from __future__ import absolute_import
2
3 import os, wx, threading, sys
4
5 from Cura.avr_isp import stk500v2
6 from Cura.avr_isp import ispBase
7 from Cura.avr_isp import intelHex
8
9 from Cura.util import machineCom
10 from Cura.util import profile
11 from Cura.util import resources
12
13 def getDefaultFirmware():
14         if profile.getPreference('machine_type') == 'ultimaker':
15                 if sys.platform.startswith('linux'):
16                         return resources.getPathForFirmware("ultimaker_115200.hex")
17                 else:
18                         return resources.getPathForFirmware("ultimaker_250000.hex")
19         return None
20
21 class InstallFirmware(wx.Dialog):
22         def __init__(self, filename = None, port = None):
23                 super(InstallFirmware, self).__init__(parent=None, title="Firmware install", size=(250, 100))
24                 if port == None:
25                         port = profile.getPreference('serial_port')
26                 if filename == None:
27                         filename = getDefaultFirmware()
28                 if filename == None:
29                         wx.MessageBox('Cura does not ship with a default firmware for your machine.', 'Firmware update', wx.OK | wx.ICON_ERROR)
30                         self.Destroy()
31                         return
32
33                 sizer = wx.BoxSizer(wx.VERTICAL)
34                 
35                 self.progressLabel = wx.StaticText(self, -1, 'Reading firmware...')
36                 sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER)
37                 self.progressGauge = wx.Gauge(self, -1)
38                 sizer.Add(self.progressGauge, 0, flag=wx.EXPAND)
39                 self.okButton = wx.Button(self, -1, 'Ok')
40                 self.okButton.Disable()
41                 self.okButton.Bind(wx.EVT_BUTTON, self.OnOk)
42                 sizer.Add(self.okButton, 0, flag=wx.ALIGN_CENTER)
43                 self.SetSizer(sizer)
44                 
45                 self.filename = filename
46                 self.port = port
47                 
48                 threading.Thread(target=self.OnRun).start()
49                 
50                 self.ShowModal()
51                 self.Destroy()
52                 return
53
54         def OnRun(self):
55                 hexFile = intelHex.readHex(self.filename)
56                 wx.CallAfter(self.updateLabel, "Connecting to machine...")
57                 programmer = stk500v2.Stk500v2()
58                 programmer.progressCallback = self.OnProgress
59                 if self.port == 'AUTO':
60                         for self.port in machineCom.serialList():
61                                 try:
62                                         programmer.connect(self.port)
63                                         break
64                                 except ispBase.IspError:
65                                         pass
66                 else:
67                         try:
68                                 programmer.connect(self.port)
69                         except ispBase.IspError:
70                                 pass
71                                 
72                 if programmer.isConnected():
73                         wx.CallAfter(self.updateLabel, "Uploading firmware...")
74                         try:
75                                 programmer.programChip(hexFile)
76                                 wx.CallAfter(self.updateLabel, "Done!\nInstalled firmware: %s" % (os.path.basename(self.filename)))
77                         except ispBase.IspError as e:
78                                 wx.CallAfter(self.updateLabel, "Failed to write firmware.\n" + str(e))
79                                 
80                         programmer.close()
81                         wx.CallAfter(self.okButton.Enable)
82                         return
83                 wx.MessageBox('Failed to find machine for firmware upgrade\nIs your machine connected to the PC?', 'Firmware update', wx.OK | wx.ICON_ERROR)
84                 wx.CallAfter(self.Close)
85         
86         def updateLabel(self, text):
87                 self.progressLabel.SetLabel(text)
88                 self.Layout()
89         
90         def OnProgress(self, value, max):
91                 wx.CallAfter(self.progressGauge.SetRange, max)
92                 wx.CallAfter(self.progressGauge.SetValue, value)
93
94         def OnOk(self, e):
95                 self.Close()
96
97         def OnClose(self, e):
98                 self.Destroy()
99