def upgrade_myro(url=None, version=None): """ Takes a url or filename and upgrades Myro. """ if url == None: url = "http://myro.roboteducation.org/upgrade/" if version != None: version = version.split(".") install_count = 0 if not url.startswith("http://"): print "Looking for Myro upgrades in file", url, "..." install_count += import_file(url) # which is a filename else: print "Looking for Myro upgrades at", url, "..." myro_ver = myro_version.split(".") # go to site, check for latest greater than our version infp = urllib.urlopen(url) contents = infp.read() lines = contents.split("\n") infp.close() for filename in lines: filename = filename.strip() if filename != "" and filename[0] != '#': print "Considering", filename, "..." if filename.startswith("myro-upgrade-"): end = filename.index(".zip") patch_ver = filename[13:end].split(".") if (version != None): # get specific version if map(int, patch_ver) == map(int, version): print " Downloading..." install_count += import_url(url + filename) elif map(int, patch_ver) > map(int, myro_ver): # download it print " Downloading..." install_count += import_url(url + filename) if install_count > 0: print "Done upgrading! Please exit and restart Python and Myro" else: print "Nothing to upgrade in Myro; it's up-to-date." return install_count
def upgrade_fluke(url=None): #define UF_SUCCESS 42 #define UF_ERROR 1 #define UF_SEGMENT_SIZE 132 if myro.globvars.robot == None: # force upgrade print "Connecting for firmware installation..." myro.globvars.robot = SerialRobot() s = myro.globvars.robot.ser # check to see if we can even upgrade info = get_info_timeout(s) print info if "fluke" not in info.keys(): print "(If you just upgraded Myro, please restart Python.)" print "Sorry, I can't upgrade the Fluke over Bluetooth." print "It must be upgraded manually over the serial port using lpc21isp." print "Please see http://wiki.roboteducation.org/IPRE_Fluke_Setup" return if url == None: url = "http://myro.roboteducation.org/upgrade/fluke/" install_count = 0 filename = None if url.startswith("http://"): fluke_ver = info["fluke"].split(".") print "Looking for Fluke upgrade at", url, "..." myro_ver = myro_version.split(".") # go to site, check for latest greater than our version #infp = urllib.urlopen(url) try: infp = urllib.urlopen(url) except: print "ERROR: There was an error connecting to the web to download updates. Please check your internet connection. For example, see if you can access", url, "using a web browser." return contents = infp.read() lines = contents.split("\n") infp.close() for file in lines: file = file.strip() if file != "" and file[0] != '#': print "Considering", file, "..." if file.startswith("/fluke-upgrade-"): end = file.index(".hex") patch_ver = file[15:end].split(".") print patch_ver, fluke_ver if map(int, patch_ver) > map(int, fluke_ver): # download it print " Downloading..." filename = url_retrieve(url + file) break else: filename = url if filename == None: print "Nothing found to upgrade!" return #info = myro.globvars.robot.getInfo() sendMagicKey = True version = map(int, info["fluke"].split(".")) print "Version of fluke", version if version <= [2, 5, 0]: sendMagicKey = False print "Older firmware version, Not sending magic key" else: print "Sending magic key" from intelhex import IntelHex import time ih = IntelHex(filename) binarray = ih.tobinarray() arlen = len(binarray) print "%d bytes of firmware." % arlen print "checksumming interrupt vectors" sum = check_sum(binarray, arlen) #declare a finite sized array to hold eeprom dump. #Dynamic appending of lists always comes with a performance hit eepromdump = [0] * 135168 s.flushOutput() s.flushInput() #print "Getting old EEPROM" #s.write(chr(SAVE_EEPROM)) #uf_saveEEPROMdump() print "Sending firmware" s.write(chr(UPDATE_FIRMWARE)) if sendMagicKey: # magic code to ensure we don't enter program by accident s.write(chr(0x01)) s.write(chr(0x23)) uf_storeinEEPROM(s, arlen, binarray) print "Waiting for reboot" time.sleep(2) s.close()
def upgrade_fluke(url=None): #define UF_SUCCESS 42 #define UF_ERROR 1 #define UF_SEGMENT_SIZE 132 if myro.globvars.robot == None: print "Connecting to Fluke for firmware installation..." myro.globvars.robot = SerialRobot() s = myro.globvars.robot.ser info = get_info_timeout(s) if "fluke" in info: info = info["fluke"] else: info = "0.0.0" elif myro.globvars.robot.dongle: info = myro.globvars.robot.dongle s = myro.globvars.robot.ser print info version = map(int, info.split(".")) print "Version of fluke", version if version <= [2, 4, 0]: print "(If you just upgraded Myro, please restart Python.)" print "Sorry, I can't upgrade the Fluke over Bluetooth." print "It must be upgraded manually over the serial port using lpc21isp." print "Please see http://wiki.roboteducation.org/IPRE_Fluke_Setup" return if url == None: #url = "http://myro.roboteducation.org/upgrade/fluke/" url = "http://www.betterbots.com/upgrade/fluke/" install_count = 0 filename = None if url.startswith("http://"): #fluke_ver = info["fluke"].split(".") print "Looking for Fluke upgrade at", url, "..." myro_ver = myro_version.split(".") # go to site, check for latest greater than our version #infp = urllib.urlopen(url) try: infp = urllib.urlopen(url) except: print "ERROR: There was an error connecting to the web to download updates. Please check your internet connection. For example, see if you can access", url, "using a web browser." return if version >= [3, 0, 0]: upgrade_prefix = "/fluke2-upgrade-" else: upgrade_prefix = "/fluke-upgrade-" contents = infp.read() lines = contents.split("\n") infp.close() for file in lines: file = file.strip() if file != "" and file[0] != '#': print "Considering", file, "..." if file.startswith(upgrade_prefix): end = file.index(".hex") #patch_ver = file[15:end].split(".") patch_ver = file[len(upgrade_prefix):end].split(".") print patch_ver, version if map(int, patch_ver) > map(int, version): # download it print " Downloading..." filename = url_retrieve(url + file) break else: filename = url if filename == None: print "Nothing found to upgrade!" return #info = myro.globvars.robot.getInfo() sendMagicKey = True if version <= [2, 5, 0]: sendMagicKey = False print "Older firmware version, Not sending magic key" else: print "Sending magic key" if version >= [3, 0, 0]: import time s.flushOutput() s.flushInput() print "Sending firmware" s.write(chr(UPDATE_FIRMWARE)) # magic code to ensure we don't enter program by accident s.write(chr(0x01)) s.write(chr(0x23)) upfp = open(filename, "rb") bytes = upfp.read() upfp.close() size = len(bytes) s.write(chr((size >> 24) & 0xFF)) s.write(chr((size >> 16) & 0xFF)) s.write(chr((size >> 8) & 0xFF)) s.write(chr((size) & 0xFF)) while True: ns = s.write(bytes) if ns == 0 or ns == None: break size -= ns if size <= 0: break bytes = bytes[ns:] sys.stdout.write('.') print "Installing update. Do not turn off the Fluke2 while the red CPU activity LED is flashing brightly." for i in range(21): time.sleep(3) sys.stdout.write('.') print "" print "Finalizing installation. Please exit and restart Python and Myro." else: from intelhex import IntelHex import time ih = IntelHex(filename) binarray = ih.tobinarray() arlen = len(binarray) print "%d bytes of firmware." % arlen print "checksumming interrupt vectors" sum = check_sum(binarray, arlen) #declare a finite sized array to hold eeprom dump. #Dynamic appending of lists always comes with a performance hit eepromdump = [0] * 135168 s.flushOutput() s.flushInput() #print "Getting old EEPROM" #s.write(chr(SAVE_EEPROM)) #uf_saveEEPROMdump() print "Sending firmware" s.write(chr(UPDATE_FIRMWARE)) if sendMagicKey: # magic code to ensure we don't enter program by accident s.write(chr(0x01)) s.write(chr(0x23)) uf_storeinEEPROM(s, arlen, binarray) print "Waiting for reboot..." time.sleep(2) print "Done upgrading! Please turn your robot off and then back on, and exit and restart Python and Myro." s.close()