chiark / gitweb /
Add some more documentation. And the zhop feature.
[cura.git] / Cura / avr_isp / stk500v2.py
index d52311b6e8fd3d079629a281f7d7da00b97ab032..975dd30b933d8d89630bdd9dbe8ac078dd39afff 100644 (file)
@@ -1,3 +1,7 @@
+"""
+STK500v2 protocol implementation for programming AVR chips.
+The STK500v2 protocol is used by the ArduinoMega2560 and a few other Arduino platforms to load firmware.
+"""
 __copyright__ = "Copyright (C) 2013 David Braam - Released under terms of the AGPLv3 License"
 import os, struct, sys, time
 
@@ -145,23 +149,39 @@ class Stk500v2(ispBase.IspBase):
                                else:
                                        return data
 
+def portList():
+       ret = []
+       import _winreg
+       key=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM")
+       i=0
+       while True:
+               try:
+                       values = _winreg.EnumValue(key, i)
+               except:
+                       return ret
+               if 'USBSER' in values[0]:
+                       ret.append(values[1])
+               i+=1
+       return ret
 
-def main():
+def runProgrammer(port, filename):
        programmer = Stk500v2()
+       programmer.connect(port = port)
+       programmer.programChip(intelHex.readHex(filename))
+       programmer.close()
+
+def main():
+       import threading
        if sys.argv[1] == 'AUTO':
-               import _winreg
-               key=_winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE,"HARDWARE\\DEVICEMAP\\SERIALCOMM")
-               i=0
-               while True:
-                       values = _winreg.EnumValue(key, i)
-                       if 'USBSER' in values[0]:
-                               programmer.connect(port = values[1])
-                               break
-                       i+=1
+               print portList()
+               for port in portList():
+                       threading.Thread(target=runProgrammer, args=(port,sys.argv[2])).start()
+                       time.sleep(5)
        else:
+               programmer = Stk500v2()
                programmer.connect(port = sys.argv[1])
-       programmer.programChip(intelHex.readHex(sys.argv[2]))
-       sys.exit(1)
+               programmer.programChip(intelHex.readHex(sys.argv[2]))
+               sys.exit(1)
 
 if __name__ == '__main__':
        main()