from Cura.avr_isp import ispBase
from Cura.avr_isp import intelHex
+from Cura.gui.util import taskbar
from Cura.util import machineCom
from Cura.util import profile
from Cura.util import resources
return None
class InstallFirmware(wx.Dialog):
- def __init__(self, filename = None, port = None, machineIndex = None):
- super(InstallFirmware, self).__init__(parent=None, title="Firmware install for %s" % (profile.getMachineSetting('machine_name', machineIndex).title()), size=(250, 100))
+ def __init__(self, parent = None, filename = None, port = None, machineIndex = None):
+ super(InstallFirmware, self).__init__(parent=parent, title="Firmware install for %s" % (profile.getMachineSetting('machine_name', machineIndex).title()), size=(250, 100))
if port is None:
port = profile.getMachineSetting('serial_port')
if filename is None:
def OnProgress(self, value, max):
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, 100))
+ if port is None:
+ port = profile.getMachineSetting('serial_port')
+
+ 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)
+ self.SetSizer(sizer)
+
+ self.filename = filename
+ self.port = port
+
+ self.Layout()
+ self.Fit()
+
+ self.thread = threading.Thread(target=self.OnRun)
+ self.thread.daemon = True
+ self.thread.start()
+
+ self.ShowModal()
+ self.Destroy()
+ return
+
+ def OnRun(self):
+ mtime = 0
+ while bool(self):
+ new_mtime = os.stat(self.filename).st_mtime
+ if mtime != new_mtime:
+ mtime = new_mtime
+ time.sleep(0.5)
+ self.OnInstall()
+ time.sleep(0.5)
+
+ def OnInstall(self):
+ wx.CallAfter(self.okButton.Disable)
+ 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\nyour computer with the USB cable."))
+ while not programmer.isConnected():
+ for self.port in machineCom.serialList(True):
+ try:
+ programmer.connect(self.port)
+ break
+ except ispBase.IspError:
+ pass
+ time.sleep(1)
+ if not self:
+ #Window destroyed
+ return
+ else:
+ try:
+ programmer.connect(self.port)
+ except ispBase.IspError:
+ pass
+
+ if not programmer.isConnected():
+ wx.CallAfter(self.updateLabel, _("Failed to connect to programmer.\n"))
+ return
+
+ wx.CallAfter(self.updateLabel, _("Uploading firmware..."))
+ try:
+ programmer.programChip(hexFile)
+ 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):
+ 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()
if version.isDevVersion():
i = toolsMenu.Append(-1, _("PID Debugger..."))
self.Bind(wx.EVT_MENU, self.OnPIDDebugger, i)
+ i = toolsMenu.Append(-1, _("Auto Firmware Update..."))
+ self.Bind(wx.EVT_MENU, self.OnAutoFirmwareUpdate, i)
i = toolsMenu.Append(-1, _("Copy profile to clipboard"))
self.Bind(wx.EVT_MENU, self.onCopyProfileClipboard,i)
self.updateSliceMode()
def OnDefaultMarlinFirmware(self, e):
- firmwareInstall.InstallFirmware()
+ firmwareInstall.InstallFirmware(self)
def OnCustomFirmware(self, e):
if profile.getMachineSetting('machine_type').startswith('ultimaker'):
if not(os.path.exists(filename)):
return
#For some reason my Ubuntu 10.10 crashes here.
- firmwareInstall.InstallFirmware(filename)
+ firmwareInstall.InstallFirmware(self, filename)
def OnFirstRunWizard(self, e):
self.Hide()
debugger.Centre()
debugger.Show(True)
+ def OnAutoFirmwareUpdate(self, e):
+ dlg=wx.FileDialog(self, _("Open firmware to upload"), os.path.split(profile.getPreference('lastFile'))[0], style=wx.FD_OPEN|wx.FD_FILE_MUST_EXIST)
+ dlg.SetWildcard("HEX file (*.hex)|*.hex;*.HEX")
+ if dlg.ShowModal() == wx.ID_OK:
+ filename = dlg.GetPath()
+ dlg.Destroy()
+ if not(os.path.exists(filename)):
+ return
+ #For some reason my Ubuntu 10.10 crashes here.
+ installer = firmwareInstall.AutoUpdateFirmware(self, filename)
+
def onCopyProfileClipboard(self, e):
try:
if not wx.TheClipboard.IsOpened():
ITaskbarList3 = None
def setBusy(frame, busy):
- if ITaskbarList3 is not None:
+ if ITaskbarList3 is not None and frame is not None:
if busy:
ITaskbarList3.SetProgressState(frame.GetHandle(), TBPF_INDETERMINATE)
else:
ITaskbarList3.SetProgressState(frame.GetHandle(), TBPF_NOPROGRESS)
def setPause(frame, pause):
- if ITaskbarList3 is not None:
+ if ITaskbarList3 is not None and frame is not None:
if pause:
ITaskbarList3.SetProgressState(frame.GetHandle(), TBPF_PAUSED)
else:
ITaskbarList3.SetProgressState(frame.GetHandle(), TBPF_NORMAL)
def setProgress(frame, done, total):
- if ITaskbarList3 is not None:
+ if ITaskbarList3 is not None and frame is not None:
ITaskbarList3.SetProgressState(frame.GetHandle(), TBPF_NORMAL)
ITaskbarList3.SetProgressValue(frame.GetHandle(), done, total)