From: daid Date: Thu, 16 Oct 2014 07:33:02 +0000 (+0200) Subject: Add debug feature to watch and auto install firmware to easy firmware development. X-Git-Tag: lulzbot-14.12~71 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=69391c3bb5219a76d3874bfb972ce3866c01f63e;p=cura.git Add debug feature to watch and auto install firmware to easy firmware development. --- diff --git a/Cura/gui/firmwareInstall.py b/Cura/gui/firmwareInstall.py index aa0a8b25..f38f7b8c 100644 --- a/Cura/gui/firmwareInstall.py +++ b/Cura/gui/firmwareInstall.py @@ -10,6 +10,7 @@ from Cura.avr_isp import stk500v2 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 @@ -50,8 +51,8 @@ def getDefaultFirmware(machineIndex = None): 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: @@ -151,9 +152,109 @@ class InstallFirmware(wx.Dialog): 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() diff --git a/Cura/gui/mainWindow.py b/Cura/gui/mainWindow.py index c4bbe4cb..e7c0a371 100644 --- a/Cura/gui/mainWindow.py +++ b/Cura/gui/mainWindow.py @@ -133,6 +133,8 @@ class mainWindow(wx.Frame): 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) @@ -504,7 +506,7 @@ class mainWindow(wx.Frame): self.updateSliceMode() def OnDefaultMarlinFirmware(self, e): - firmwareInstall.InstallFirmware() + firmwareInstall.InstallFirmware(self) def OnCustomFirmware(self, e): if profile.getMachineSetting('machine_type').startswith('ultimaker'): @@ -517,7 +519,7 @@ class mainWindow(wx.Frame): 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() @@ -550,6 +552,17 @@ class mainWindow(wx.Frame): 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(): diff --git a/Cura/gui/util/taskbar.py b/Cura/gui/util/taskbar.py index 9eee5963..e78fc0f2 100644 --- a/Cura/gui/util/taskbar.py +++ b/Cura/gui/util/taskbar.py @@ -26,20 +26,20 @@ except: 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)