Added a progress dialog to the firmware upload

Started on the machine check.
master
Daid 2012-03-06 23:11:40 +01:00
parent 224dcfdef5
commit 200221ae4f
3 changed files with 132 additions and 38 deletions

View File

@ -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()

View File

@ -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):

View File

@ -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
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 serialOpen(port = 'AUTO', baudrate = 115200):
if port == 'AUTO':
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