+ self.Layout()
+ self.Fit()
+ self.success = False
+ self.show_connect_dialog = False
+
+ def Run(self):
+ if self.filename is None:
+ wx.MessageBox(_("I am sorry, but Cura does not ship with a default firmware for your machine configuration."), _("Firmware update"), wx.OK | wx.ICON_ERROR)
+ return False
+ self.success = False
+ self.thread = threading.Thread(target=self.OnRun)
+ self.thread.daemon = True
+ self.thread.start()
+
+ self.ShowModal()
+ # Creating a MessageBox in a separate thread while main thread is locked inside a ShowModal
+ # will cause Python to crash with X errors. So we need to show the dialog here instead
+ if self.show_connect_dialog:
+ wx.MessageBox(_("Failed to find machine for firmware upgrade\nIs your machine connected to the PC?"),
+ _("Firmware update"), wx.OK | wx.ICON_ERROR)
+ return self.success
+
+ def OnRun(self):
+ wx.CallAfter(self.updateLabel, _("Reading firmware..."))
+ hexFile = intelHex.readHex(self.filename)
+ wx.CallAfter(self.updateLabel, _("Connecting to machine..."))
+ programmer = stk500v2.Stk500v2()
+ programmer.progressCallback = self.OnProgress
+ if self.port == 'AUTO':
+ wx.CallAfter(self.updateLabel, _("Please connect the printer to your\ncomputer with a USB cable and power it on."))
+ while not programmer.isConnected():
+ for self.port in machineCom.serialList(True):
+ try:
+ programmer.connect(self.port)
+ break
+ except ispBase.IspError:
+ programmer.close()
+ time.sleep(1)
+ if not self:
+ #Window destroyed
+ return
+ else:
+ try:
+ programmer.connect(self.port)
+ except ispBase.IspError:
+ programmer.close()
+ if not self:
+ #Window destroyed
+ return
+
+ if not programmer.isConnected():
+ self.show_connect_dialog = True
+ wx.CallAfter(self.Close)
+ return
+
+ if self._machine_type == 'ultimaker':
+ if programmer.hasChecksumFunction():
+ wx.CallAfter(self.updateLabel, _("Failed to install firmware:\nThis firmware is not compatible with this machine.\nTrying to install UMO firmware on an UM2 or UMO+?"))
+ programmer.close()
+ wx.CallAfter(self.okButton.Enable)
+ return
+ if self._machine_type == 'ultimaker_plus' or self._machine_type == 'ultimaker2':
+ if not programmer.hasChecksumFunction():
+ wx.CallAfter(self.updateLabel, _("Failed to install firmware:\nThis firmware is not compatible with this machine.\nTrying to install UM2 or UMO+ firmware on an UMO?"))
+ programmer.close()
+ wx.CallAfter(self.okButton.Enable)
+ return
+
+ wx.CallAfter(self.updateLabel, _("Uploading firmware..."))
+ try:
+ programmer.programChip(hexFile)
+ self.success = True
+ wx.CallAfter(self.updateLabel, _("Done!\nInstalled firmware: %s") % (os.path.basename(self.filename)))
+ except ispBase.IspError as e:
+ wx.CallAfter(self.updateLabel, _("Failed to write firmware.\n") + str(e))
+
+ programmer.close()
+ wx.CallAfter(self.okButton.Enable)
+
+ def updateLabel(self, text):
+ self.progressLabel.SetLabel(text)
+ self.Layout()
+
+ def OnProgress(self, value, max):
+ if self:
+ wx.CallAfter(self.progressGauge.SetRange, max)
+ wx.CallAfter(self.progressGauge.SetValue, value)
+ taskbar.setProgress(self.GetParent(), value, max)
+
+ def OnOk(self, e):
+ self.Close()
+ taskbar.setBusy(self.GetParent(), False)
+
+ def OnClose(self, e):
+ self.Destroy()
+
+
+class AutoUpdateFirmware(wx.Dialog):
+ def __init__(self, parent, filename = None, port = None, machineIndex = None):
+ super(AutoUpdateFirmware, self).__init__(parent=parent, title=_("Auto Firmware install"), size=(250, 500))
+ if port is None:
+ port = profile.getMachineSetting('serial_port')
+ self._serial = None
+
+ sizer = wx.BoxSizer(wx.VERTICAL)
+
+ self.progressLabel = wx.StaticText(self, -1, 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\nX\nX')
+ sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER|wx.ALL, border=5)
+ self.progressGauge = wx.Gauge(self, -1)
+ sizer.Add(self.progressGauge, 0, flag=wx.EXPAND)
+ self.okButton = wx.Button(self, -1, _("OK"))
+ self.okButton.Bind(wx.EVT_BUTTON, self.OnOk)
+ sizer.Add(self.okButton, 0, flag=wx.ALIGN_CENTER|wx.ALL, border=5)
+
+ f = wx.Font(8, wx.FONTFAMILY_MODERN, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False)
+ self._termLog = wx.TextCtrl(self, style=wx.TE_MULTILINE | wx.TE_DONTWRAP)
+ self._termLog.SetFont(f)
+ self._termLog.SetEditable(0)
+ self._termLog.SetMinSize((1, 400))
+ self._termInput = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
+ self._termInput.SetFont(f)
+ sizer.Add(self._termLog, 0, flag=wx.ALIGN_CENTER|wx.ALL|wx.EXPAND)
+ sizer.Add(self._termInput, 0, flag=wx.ALIGN_CENTER|wx.ALL|wx.EXPAND)
+
+ self.Bind(wx.EVT_TEXT_ENTER, self.OnTermEnterLine, self._termInput)
+
+ self.SetSizer(sizer)
+
+ self.filename = filename
+ self.port = port
+