chiark / gitweb /
Add debug feature to watch and auto install firmware to easy firmware development.
authordaid <daid303@gmail.com>
Thu, 16 Oct 2014 07:33:02 +0000 (09:33 +0200)
committerYouness Alaoui <kakaroto@kakaroto.homelinux.net>
Wed, 14 Jan 2015 17:05:45 +0000 (12:05 -0500)
Cura/gui/firmwareInstall.py
Cura/gui/mainWindow.py
Cura/gui/util/taskbar.py

index aa0a8b250dc30d5638f54d77534cf095dbaa636d..f38f7b8c8c3e91cda6b30105e352942da81aa9e7 100644 (file)
@@ -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()
index c4bbe4cbae599c5536c0fcbda6be8e9f7179da7a..e7c0a371e407ad8bfd809150702d2f074d5e6a42 100644 (file)
@@ -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():
index 9eee5963d9fab348eb632060d86026397299a705..e78fc0f22911e96790a0da7e137594d80e2951cc 100644 (file)
@@ -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)