From: Daid Date: Tue, 6 Mar 2012 22:11:40 +0000 (+0100) Subject: Added a progress dialog to the firmware upload X-Git-Tag: RC1~131 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=200221ae4fb5bb2ef5af63b10c81f0e063061080;p=cura.git Added a progress dialog to the firmware upload Started on the machine check. --- diff --git a/SkeinPyPy_NewUI/avr_isp/stk500v2.py b/SkeinPyPy_NewUI/avr_isp/stk500v2.py index 1b9e4413..b384d651 100644 --- a/SkeinPyPy_NewUI/avr_isp/stk500v2.py +++ b/SkeinPyPy_NewUI/avr_isp/stk500v2.py @@ -13,7 +13,7 @@ class Stk500v2(ispBase.IspBase): def connect(self, port = 'COM3', speed = 115200): if self.serial != None: self.close() - self.serial = Serial(port, speed, timeout=5) + self.serial = Serial(port, speed, timeout=1) self.seq = 1 #Reset the controller @@ -49,7 +49,8 @@ class Stk500v2(ispBase.IspBase): loadCount = (len(flashData) + 0xFF) / 0x100 for i in xrange(0, loadCount): recv = self.sendMessage([0x13, 0x01, 0x00, 0xc1, 0x0a, 0x40, 0x4c, 0x20, 0x00, 0x00] + flashData[(i * 0x100):(i * 0x100 + 0x100)]) - print "#%i#%i#" % (i + 1, loadCount) + if self.progressCallback != None: + self.progressCallback(i + 1, loadCount*2) def verifyFlash(self, flashData): #Set load addr to 0, in case we have more then 64k flash we need to enable the address extension @@ -62,7 +63,8 @@ class Stk500v2(ispBase.IspBase): loadCount = (len(flashData) + 0xFF) / 0x100 for i in xrange(0, loadCount): recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102] - print "#%i#%i#" % (i + 1, loadCount) + if self.progressCallback != None: + self.progressCallback(loadCount + i + 1, loadCount*2) for j in xrange(0, 0x100): if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]: raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j)) @@ -75,8 +77,11 @@ class Stk500v2(ispBase.IspBase): for c in message: checksum ^= ord(c) message += struct.pack(">B", checksum) - self.serial.write(message) - self.serial.flush() + try: + self.serial.write(message) + self.serial.flush() + except SerialTimeoutException: + raise ispBase.IspError('Serial send timeout') self.seq = (self.seq + 1) & 0xFF return self.recvMessage() diff --git a/SkeinPyPy_NewUI/newui/configWizard.py b/SkeinPyPy_NewUI/newui/configWizard.py index 35760b99..89214bad 100644 --- a/SkeinPyPy_NewUI/newui/configWizard.py +++ b/SkeinPyPy_NewUI/newui/configWizard.py @@ -1,7 +1,7 @@ from __future__ import absolute_import import __init__ -import wx, os, platform, types, webbrowser +import wx, os, platform, types, webbrowser, threading import wx.wizard from fabmetheus_utilities import settings @@ -40,7 +40,7 @@ class InfoPage(wx.wizard.WizardPageSimple): p = wx.Panel(self) p.SetSizer(wx.BoxSizer(wx.HORIZONTAL)) button1 = wx.Button(p, -1, label1) - p.GetSizer().Add(button1, 0) + p.GetSizer().Add(button1, 0, wx.RIGHT, 8) button2 = wx.Button(p, -1, label2) p.GetSizer().Add(button2, 0) self.GetSizer().Add(p, 0) @@ -126,7 +126,7 @@ class FirmwareUpgradePage(InfoPage): return False def OnUpgradeClick(self, e): - if machineCom.installFirmware("firmware/default.hex"): + if machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")): self.GetParent().FindWindowById(wx.ID_FORWARD).Enable() def OnSkipClick(self, e): @@ -150,6 +150,7 @@ class UltimakerCheckupPage(InfoPage): def OnSkipClick(self, e): self.GetParent().FindWindowById(wx.ID_FORWARD).Enable() + self.comm.serial.close() def OnCheckClick(self, e): if self.checkPanel != None: @@ -157,13 +158,39 @@ class UltimakerCheckupPage(InfoPage): self.checkPanel = wx.Panel(self) self.checkPanel.SetSizer(wx.BoxSizer(wx.VERTICAL)) self.GetSizer().Add(self.checkPanel, 0, wx.LEFT|wx.RIGHT, 5) - self.AddProgressText("Starting machine check...") - self.Layout() + threading.Thread(target=self.OnRun).start() def AddProgressText(self, info): text = wx.StaticText(self.checkPanel, -1, info) self.checkPanel.GetSizer().Add(text, 0) self.checkPanel.Layout() + self.Layout() + + def OnRun(self): + wx.CallAfter(self.AddProgressText, "Connecting to machine...") + comm = machineCom.MachineCom() + self.comm = comm + wx.CallAfter(self.AddProgressText, "Checking start message...") + t = threading.Timer(5, self.OnSerialTimeout) + t.start() + line = comm.readline() + hasStart = False + while line != '': + if line.startswith('start'): + hasStart = True + break + line = comm.readline() + t.cancel() + if not hasStart: + wx.CallAfter(self.AddProgressText, "Error: Missing start message.") + comm.close() + return + wx.CallAfter(self.AddProgressText, "Done!") + wx.CallAfter(self.GetParent().FindWindowById(wx.ID_FORWARD).Enable) + comm.close() + + def OnSerialTimeout(self): + self.comm.close() class configWizard(wx.wizard.Wizard): def __init__(self): diff --git a/SkeinPyPy_NewUI/newui/machineCom.py b/SkeinPyPy_NewUI/newui/machineCom.py index c01077a7..a1b37ba6 100644 --- a/SkeinPyPy_NewUI/newui/machineCom.py +++ b/SkeinPyPy_NewUI/newui/machineCom.py @@ -1,7 +1,7 @@ from __future__ import absolute_import import __init__ -import os, glob, wx +import os, glob, wx, threading from serial import Serial @@ -27,36 +27,98 @@ def serialList(): pass return baselist+glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') +glob.glob("/dev/tty.*")+glob.glob("/dev/cu.*")+glob.glob("/dev/rfcomm*") -def installFirmware(filename, port = 'AUTO'): - hexFile = intelHex.readHex(filename) - programmer = stk500v2.Stk500v2() - if port == 'AUTO': - for port in serialList(): - try: - programmer.connect(port) - except ispBase.IspError: - pass - else: - programmer.connect(port) - if programmer.isConnected(): - programmer.programChip(hexFile) - programmer.close() - return True - wx.MessageBox('Failed to find machine for firmware upgrade\nIs your machine connected to the PC?', 'Firmware update', wx.OK | wx.ICON_ERROR) - return False - -def serialOpen(port = 'AUTO', baudrate = 115200): - if port == 'AUTO': +class InstallFirmware(wx.Dialog): + def __init__(self, filename, port = 'AUTO'): + super(InstallFirmware, self).__init__(parent=None, title="Firmware install", size=(250, 100)) + sizer = wx.BoxSizer(wx.VERTICAL) + + self.progressLabel = wx.StaticText(self, -1, 'Reading firmware...') + sizer.Add(self.progressLabel, 0, flag=wx.ALIGN_CENTER) + self.progressGauge = wx.Gauge(self, -1) + sizer.Add(self.progressGauge, 0, flag=wx.EXPAND) + self.okButton = wx.Button(self, -1, 'Ok') + self.okButton.Disable() + self.okButton.Bind(wx.EVT_BUTTON, self.OnOk) + sizer.Add(self.okButton, 0, flag=wx.ALIGN_CENTER) + self.SetSizer(sizer) + + self.filename = filename + self.port = port + + threading.Thread(target=self.OnRun).start() + + self.ShowModal() + self.Destroy() + + return + + def OnRun(self): + hexFile = intelHex.readHex(self.filename) + wx.CallAfter(self.updateLabel, "Connecting to machine...") programmer = stk500v2.Stk500v2() - for port in serialList(): + programmer.progressCallback = self.OnProgress + if self.port == 'AUTO': + for self.port in serialList(): + try: + programmer.connect(self.port) + except ispBase.IspError: + pass + else: try: - programmer.connect(port) - programmer.close() - return Serial(port, baudrate, timeout=5) + programmer.connect(self.port) except ispBase.IspError: pass - programmer.close() - else: - return Serial(port, baudrate, timeout=5) - return False + + if programmer.isConnected(): + wx.CallAfter(self.updateLabel, "Uploading firmware...") + try: + programmer.programChip(hexFile) + wx.CallAfter(self.updateLabel, "Done!") + except ispBase.IspError as e: + wx.CallAfter(self.updateLabel, "Failed to write firmware.\n" + str(e)) + + programmer.close() + wx.CallAfter(self.okButton.Enable) + return + wx.MessageBox('Failed to find machine for firmware upgrade\nIs your machine connected to the PC?', 'Firmware update', wx.OK | wx.ICON_ERROR) + wx.CallAfter(self.Close) + + 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) + + def OnOk(self, e): + self.Close() + + def OnClose(self, e): + self.Destroy() + +class MachineCom(): + def __init__(self, port = 'AUTO', baudrate = 250000): + self.serial = None + if port == 'AUTO': + programmer = stk500v2.Stk500v2() + for port in serialList(): + try: + programmer.connect(port) + programmer.close() + self.serial = Serial(port, baudrate, timeout=5) + except ispBase.IspError: + pass + programmer.close() + else: + self.serial = Serial(port, baudrate, timeout=5) + def readline(self): + if self.serial == None: + return '' + return self.serial.readline() + + def close(self): + if self.serial != None: + self.serial.close() + self.serial = None