parent
224dcfdef5
commit
200221ae4f
|
@ -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)
|
||||
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()
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
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()
|
||||
if port == 'AUTO':
|
||||
for port in serialList():
|
||||
programmer.progressCallback = self.OnProgress
|
||||
if self.port == 'AUTO':
|
||||
for self.port in serialList():
|
||||
try:
|
||||
programmer.connect(port)
|
||||
programmer.connect(self.port)
|
||||
except ispBase.IspError:
|
||||
pass
|
||||
else:
|
||||
programmer.connect(port)
|
||||
try:
|
||||
programmer.connect(self.port)
|
||||
except ispBase.IspError:
|
||||
pass
|
||||
|
||||
if programmer.isConnected():
|
||||
wx.CallAfter(self.updateLabel, "Uploading firmware...")
|
||||
try:
|
||||
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
|
||||
wx.CallAfter(self.updateLabel, "Done!")
|
||||
except ispBase.IspError as e:
|
||||
wx.CallAfter(self.updateLabel, "Failed to write firmware.\n" + str(e))
|
||||
|
||||
def serialOpen(port = 'AUTO', baudrate = 115200):
|
||||
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()
|
||||
return Serial(port, baudrate, timeout=5)
|
||||
self.serial = Serial(port, baudrate, timeout=5)
|
||||
except ispBase.IspError:
|
||||
pass
|
||||
programmer.close()
|
||||
else:
|
||||
return Serial(port, baudrate, timeout=5)
|
||||
return False
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue