parent
224dcfdef5
commit
200221ae4f
|
@ -13,7 +13,7 @@ class Stk500v2(ispBase.IspBase):
|
||||||
def connect(self, port = 'COM3', speed = 115200):
|
def connect(self, port = 'COM3', speed = 115200):
|
||||||
if self.serial != None:
|
if self.serial != None:
|
||||||
self.close()
|
self.close()
|
||||||
self.serial = Serial(port, speed, timeout=5)
|
self.serial = Serial(port, speed, timeout=1)
|
||||||
self.seq = 1
|
self.seq = 1
|
||||||
|
|
||||||
#Reset the controller
|
#Reset the controller
|
||||||
|
@ -49,7 +49,8 @@ class Stk500v2(ispBase.IspBase):
|
||||||
loadCount = (len(flashData) + 0xFF) / 0x100
|
loadCount = (len(flashData) + 0xFF) / 0x100
|
||||||
for i in xrange(0, loadCount):
|
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)])
|
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):
|
def verifyFlash(self, flashData):
|
||||||
#Set load addr to 0, in case we have more then 64k flash we need to enable the address extension
|
#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
|
loadCount = (len(flashData) + 0xFF) / 0x100
|
||||||
for i in xrange(0, loadCount):
|
for i in xrange(0, loadCount):
|
||||||
recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102]
|
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):
|
for j in xrange(0, 0x100):
|
||||||
if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]:
|
if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]:
|
||||||
raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j))
|
raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j))
|
||||||
|
@ -75,8 +77,11 @@ class Stk500v2(ispBase.IspBase):
|
||||||
for c in message:
|
for c in message:
|
||||||
checksum ^= ord(c)
|
checksum ^= ord(c)
|
||||||
message += struct.pack(">B", checksum)
|
message += struct.pack(">B", checksum)
|
||||||
|
try:
|
||||||
self.serial.write(message)
|
self.serial.write(message)
|
||||||
self.serial.flush()
|
self.serial.flush()
|
||||||
|
except SerialTimeoutException:
|
||||||
|
raise ispBase.IspError('Serial send timeout')
|
||||||
self.seq = (self.seq + 1) & 0xFF
|
self.seq = (self.seq + 1) & 0xFF
|
||||||
return self.recvMessage()
|
return self.recvMessage()
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
import __init__
|
import __init__
|
||||||
|
|
||||||
import wx, os, platform, types, webbrowser
|
import wx, os, platform, types, webbrowser, threading
|
||||||
import wx.wizard
|
import wx.wizard
|
||||||
|
|
||||||
from fabmetheus_utilities import settings
|
from fabmetheus_utilities import settings
|
||||||
|
@ -40,7 +40,7 @@ class InfoPage(wx.wizard.WizardPageSimple):
|
||||||
p = wx.Panel(self)
|
p = wx.Panel(self)
|
||||||
p.SetSizer(wx.BoxSizer(wx.HORIZONTAL))
|
p.SetSizer(wx.BoxSizer(wx.HORIZONTAL))
|
||||||
button1 = wx.Button(p, -1, label1)
|
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)
|
button2 = wx.Button(p, -1, label2)
|
||||||
p.GetSizer().Add(button2, 0)
|
p.GetSizer().Add(button2, 0)
|
||||||
self.GetSizer().Add(p, 0)
|
self.GetSizer().Add(p, 0)
|
||||||
|
@ -126,7 +126,7 @@ class FirmwareUpgradePage(InfoPage):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def OnUpgradeClick(self, e):
|
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()
|
self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()
|
||||||
|
|
||||||
def OnSkipClick(self, e):
|
def OnSkipClick(self, e):
|
||||||
|
@ -150,6 +150,7 @@ class UltimakerCheckupPage(InfoPage):
|
||||||
|
|
||||||
def OnSkipClick(self, e):
|
def OnSkipClick(self, e):
|
||||||
self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()
|
self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()
|
||||||
|
self.comm.serial.close()
|
||||||
|
|
||||||
def OnCheckClick(self, e):
|
def OnCheckClick(self, e):
|
||||||
if self.checkPanel != None:
|
if self.checkPanel != None:
|
||||||
|
@ -157,13 +158,39 @@ class UltimakerCheckupPage(InfoPage):
|
||||||
self.checkPanel = wx.Panel(self)
|
self.checkPanel = wx.Panel(self)
|
||||||
self.checkPanel.SetSizer(wx.BoxSizer(wx.VERTICAL))
|
self.checkPanel.SetSizer(wx.BoxSizer(wx.VERTICAL))
|
||||||
self.GetSizer().Add(self.checkPanel, 0, wx.LEFT|wx.RIGHT, 5)
|
self.GetSizer().Add(self.checkPanel, 0, wx.LEFT|wx.RIGHT, 5)
|
||||||
self.AddProgressText("Starting machine check...")
|
threading.Thread(target=self.OnRun).start()
|
||||||
self.Layout()
|
|
||||||
|
|
||||||
def AddProgressText(self, info):
|
def AddProgressText(self, info):
|
||||||
text = wx.StaticText(self.checkPanel, -1, info)
|
text = wx.StaticText(self.checkPanel, -1, info)
|
||||||
self.checkPanel.GetSizer().Add(text, 0)
|
self.checkPanel.GetSizer().Add(text, 0)
|
||||||
self.checkPanel.Layout()
|
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):
|
class configWizard(wx.wizard.Wizard):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
import __init__
|
import __init__
|
||||||
|
|
||||||
import os, glob, wx
|
import os, glob, wx, threading
|
||||||
|
|
||||||
from serial import Serial
|
from serial import Serial
|
||||||
|
|
||||||
|
@ -27,36 +27,98 @@ def serialList():
|
||||||
pass
|
pass
|
||||||
return baselist+glob.glob('/dev/ttyUSB*') + glob.glob('/dev/ttyACM*') +glob.glob("/dev/tty.*")+glob.glob("/dev/cu.*")+glob.glob("/dev/rfcomm*")
|
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'):
|
class InstallFirmware(wx.Dialog):
|
||||||
hexFile = intelHex.readHex(filename)
|
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()
|
programmer = stk500v2.Stk500v2()
|
||||||
if port == 'AUTO':
|
programmer.progressCallback = self.OnProgress
|
||||||
for port in serialList():
|
if self.port == 'AUTO':
|
||||||
|
for self.port in serialList():
|
||||||
try:
|
try:
|
||||||
programmer.connect(port)
|
programmer.connect(self.port)
|
||||||
except ispBase.IspError:
|
except ispBase.IspError:
|
||||||
pass
|
pass
|
||||||
else:
|
else:
|
||||||
programmer.connect(port)
|
try:
|
||||||
|
programmer.connect(self.port)
|
||||||
|
except ispBase.IspError:
|
||||||
|
pass
|
||||||
|
|
||||||
if programmer.isConnected():
|
if programmer.isConnected():
|
||||||
|
wx.CallAfter(self.updateLabel, "Uploading firmware...")
|
||||||
|
try:
|
||||||
programmer.programChip(hexFile)
|
programmer.programChip(hexFile)
|
||||||
programmer.close()
|
wx.CallAfter(self.updateLabel, "Done!")
|
||||||
return True
|
except ispBase.IspError as e:
|
||||||
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.updateLabel, "Failed to write firmware.\n" + str(e))
|
||||||
return False
|
|
||||||
|
|
||||||
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':
|
if port == 'AUTO':
|
||||||
programmer = stk500v2.Stk500v2()
|
programmer = stk500v2.Stk500v2()
|
||||||
for port in serialList():
|
for port in serialList():
|
||||||
try:
|
try:
|
||||||
programmer.connect(port)
|
programmer.connect(port)
|
||||||
programmer.close()
|
programmer.close()
|
||||||
return Serial(port, baudrate, timeout=5)
|
self.serial = Serial(port, baudrate, timeout=5)
|
||||||
except ispBase.IspError:
|
except ispBase.IspError:
|
||||||
pass
|
pass
|
||||||
programmer.close()
|
programmer.close()
|
||||||
else:
|
else:
|
||||||
return Serial(port, baudrate, timeout=5)
|
self.serial = Serial(port, baudrate, timeout=5)
|
||||||
return False
|
|
||||||
|
|
||||||
|
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