Started on the machine check.
def connect(self, port = 'COM3', speed = 115200):\r
if self.serial != None:\r
self.close()\r
- self.serial = Serial(port, speed, timeout=5)\r
+ self.serial = Serial(port, speed, timeout=1)\r
self.seq = 1\r
\r
#Reset the controller\r
loadCount = (len(flashData) + 0xFF) / 0x100\r
for i in xrange(0, loadCount):\r
recv = self.sendMessage([0x13, 0x01, 0x00, 0xc1, 0x0a, 0x40, 0x4c, 0x20, 0x00, 0x00] + flashData[(i * 0x100):(i * 0x100 + 0x100)])\r
- print "#%i#%i#" % (i + 1, loadCount)\r
+ if self.progressCallback != None:\r
+ self.progressCallback(i + 1, loadCount*2)\r
\r
def verifyFlash(self, flashData):\r
#Set load addr to 0, in case we have more then 64k flash we need to enable the address extension\r
loadCount = (len(flashData) + 0xFF) / 0x100\r
for i in xrange(0, loadCount):\r
recv = self.sendMessage([0x14, 0x01, 0x00, 0x20])[2:0x102]\r
- print "#%i#%i#" % (i + 1, loadCount)\r
+ if self.progressCallback != None:\r
+ self.progressCallback(loadCount + i + 1, loadCount*2)\r
for j in xrange(0, 0x100):\r
if i * 0x100 + j < len(flashData) and flashData[i * 0x100 + j] != recv[j]:\r
raise ispBase.IspError('Verify error at: 0x%x' % (i * 0x100 + j))\r
for c in message:\r
checksum ^= ord(c)\r
message += struct.pack(">B", checksum)\r
- self.serial.write(message)\r
- self.serial.flush()\r
+ try:\r
+ self.serial.write(message)\r
+ self.serial.flush()\r
+ except SerialTimeoutException:\r
+ raise ispBase.IspError('Serial send timeout')\r
self.seq = (self.seq + 1) & 0xFF\r
return self.recvMessage()\r
\r
from __future__ import absolute_import\r
import __init__\r
\r
-import wx, os, platform, types, webbrowser\r
+import wx, os, platform, types, webbrowser, threading\r
import wx.wizard\r
\r
from fabmetheus_utilities import settings\r
p = wx.Panel(self)\r
p.SetSizer(wx.BoxSizer(wx.HORIZONTAL))\r
button1 = wx.Button(p, -1, label1)\r
- p.GetSizer().Add(button1, 0)\r
+ p.GetSizer().Add(button1, 0, wx.RIGHT, 8)\r
button2 = wx.Button(p, -1, label2)\r
p.GetSizer().Add(button2, 0)\r
self.GetSizer().Add(p, 0)\r
return False\r
\r
def OnUpgradeClick(self, e):\r
- if machineCom.installFirmware("firmware/default.hex"):\r
+ if machineCom.InstallFirmware(os.path.join(os.path.dirname(os.path.abspath(__file__)), "../firmware/default.hex")):\r
self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()\r
\r
def OnSkipClick(self, e):\r
\r
def OnSkipClick(self, e):\r
self.GetParent().FindWindowById(wx.ID_FORWARD).Enable()\r
+ self.comm.serial.close()\r
\r
def OnCheckClick(self, e):\r
if self.checkPanel != None:\r
self.checkPanel = wx.Panel(self)\r
self.checkPanel.SetSizer(wx.BoxSizer(wx.VERTICAL))\r
self.GetSizer().Add(self.checkPanel, 0, wx.LEFT|wx.RIGHT, 5)\r
- self.AddProgressText("Starting machine check...")\r
- self.Layout()\r
+ threading.Thread(target=self.OnRun).start()\r
\r
def AddProgressText(self, info):\r
text = wx.StaticText(self.checkPanel, -1, info)\r
self.checkPanel.GetSizer().Add(text, 0)\r
self.checkPanel.Layout()\r
+ self.Layout()\r
+ \r
+ def OnRun(self):\r
+ wx.CallAfter(self.AddProgressText, "Connecting to machine...")\r
+ comm = machineCom.MachineCom()\r
+ self.comm = comm\r
+ wx.CallAfter(self.AddProgressText, "Checking start message...")\r
+ t = threading.Timer(5, self.OnSerialTimeout)\r
+ t.start()\r
+ line = comm.readline()\r
+ hasStart = False\r
+ while line != '':\r
+ if line.startswith('start'):\r
+ hasStart = True\r
+ break\r
+ line = comm.readline()\r
+ t.cancel()\r
+ if not hasStart:\r
+ wx.CallAfter(self.AddProgressText, "Error: Missing start message.")\r
+ comm.close()\r
+ return\r
+ wx.CallAfter(self.AddProgressText, "Done!")\r
+ wx.CallAfter(self.GetParent().FindWindowById(wx.ID_FORWARD).Enable)\r
+ comm.close()\r
+ \r
+ def OnSerialTimeout(self):\r
+ self.comm.close()\r
\r
class configWizard(wx.wizard.Wizard):\r
def __init__(self):\r
from __future__ import absolute_import
import __init__
-import os, glob, wx
+import os, glob, wx, threading
from serial import Serial
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