chiark / gitweb /
Added a progress dialog to the firmware upload
authorDaid <daid303@gmail.com>
Tue, 6 Mar 2012 22:11:40 +0000 (23:11 +0100)
committerDaid <daid303@gmail.com>
Tue, 6 Mar 2012 22:11:40 +0000 (23:11 +0100)
Started on the machine check.

SkeinPyPy_NewUI/avr_isp/stk500v2.py
SkeinPyPy_NewUI/newui/configWizard.py
SkeinPyPy_NewUI/newui/machineCom.py

index 1b9e4413f7e96d14994aa80de2c6d36c88b63876..b384d6516534d42135f3d5163236061274a9a320 100644 (file)
@@ -13,7 +13,7 @@ class Stk500v2(ispBase.IspBase):
        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
@@ -49,7 +49,8 @@ class Stk500v2(ispBase.IspBase):
                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
@@ -62,7 +63,8 @@ class Stk500v2(ispBase.IspBase):
                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
@@ -75,8 +77,11 @@ class Stk500v2(ispBase.IspBase):
                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
index 35760b993806361894e071b1da22e7d742449350..89214badcca634c6ec4973dca48d2077cfac3b8f 100644 (file)
@@ -1,7 +1,7 @@
 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
@@ -40,7 +40,7 @@ class InfoPage(wx.wizard.WizardPageSimple):
                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
@@ -126,7 +126,7 @@ class FirmwareUpgradePage(InfoPage):
                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
@@ -150,6 +150,7 @@ class UltimakerCheckupPage(InfoPage):
        \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
@@ -157,13 +158,39 @@ class UltimakerCheckupPage(InfoPage):
                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
index c01077a73716d54b3a94e646ac83ed925060f46e..a1b37ba68cd6043b716e0797e3a3c54cb647e38c 100644 (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
-
-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