diff options
Diffstat (limited to 'support/scripts')
-rwxr-xr-x | support/scripts/reset.py | 137 |
1 files changed, 84 insertions, 53 deletions
diff --git a/support/scripts/reset.py b/support/scripts/reset.py index ad26d10..2122d36 100755 --- a/support/scripts/reset.py +++ b/support/scripts/reset.py @@ -1,54 +1,81 @@ -#!/usr/bin/python +#!/usr/bin/env python import serial import os +import platform import sys import time from struct import pack -def get_maple_device_path(file_prefix): - """Try to find the device file for the Maple on OS X; assuming +def unix_get_maple_path(file_prefix): + """Try to find the device file for the Maple on *nix; assuming that it looks like /dev/<file_prefix>*. If there are multiple possibilities, ask the user what to do. If the user chooses not to say, returns None.""" possible_paths = [os.path.join('/dev', x) for x in os.listdir('/dev') \ if x.startswith(file_prefix)] + return choose_path(possible_paths) + +def windows_get_maple_path(): + """Similar to unix_get_maple_path(), but on Windows.""" + import _winreg as reg + p = 'HARDWARE\\DEVICEMAP\\SERIALCOMM' + k = reg.OpenKey(reg.HKEY_LOCAL_MACHINE, p) + possible_paths = [] + i = 0 + while True: + try: + possible_paths.append(reg.EnumValue(k, i)[1]) + i += 1 + except WindowsError: + break + return choose_path(possible_paths) + +def choose_path(possible_paths): if len(possible_paths) == 0: return None elif len(possible_paths) == 1: return possible_paths[0] else: print 'Found multiple candidates for the Maple device:' - for (i,p) in enumerate(possible_paths): - print '\t%d. %s' % (i+1, p) - - prompt = 'Enter a number to select one, or q to quit: ' - while True: - resp = raw_input(prompt).strip().lower() - if resp == 'q': return None - - try: - i = int(resp, 10) - except ValueError: - pass - else: - if 0 <= i-1 < len(possible_paths): - return possible_paths[i-1] - - prompt = 'Please enter a number from the list, or q to quit: ' - -os_sysname = os.uname()[0] -if os_sysname == 'Linux': - maple_path = get_maple_device_path('ttyACM') + return choose_among_options(possible_paths) + +def choose_among_options(options): + for (i,p) in enumerate(options): + print '\t%d. %s' % (i+1, p) + + prompt = 'Enter a number to select one, or q to quit: ' + while True: + resp = raw_input(prompt).strip().lower() + if resp == 'q': sys.exit() + + try: + i = int(resp, 10) + except ValueError: + pass + else: + if 0 <= i-1 < len(options): + return options[i-1] + + prompt = 'Please enter a number from the list, or q to quit: ' + +plat_sys = platform.system() +plat_bits = platform.architecture()[0] +if plat_sys == 'Linux': + if plat_bits == '64bit': + print 'You appear to be using 64-bit Linux. Let us know if this works.' + maple_path = unix_get_maple_path('ttyACM') # fall back on /dev/maple if that doesn't work if maple_path is None: maple_path = '/dev/maple' print 'Could not find Maple serial port; defaulting to /dev/maple.' -elif os_sysname == 'Darwin': - maple_path = get_maple_device_path('tty.usbmodem') +elif plat_sys == 'Darwin': + maple_path = unix_get_maple_path('tty.usbmodem') +elif plat_sys == 'Windows': + maple_path = windows_get_maple_path() else: - # TODO [mbolivar] what to do for windows, BSD, whatever? - maple_path = '/dev/maple' + maple_path = raw_input('Unrecognized platform. Please enter ' + "the path to the Maple's serial port device file:") if maple_path is None: print 'Could not find the Maple serial port for reset.', \ @@ -65,30 +92,34 @@ print 'Using %s as Maple serial port' % maple_path try: ser = serial.Serial(maple_path, baudrate=115200, xonxoff=1) - ser.open() - - # try to toggle DTR/RTS (old scheme) - ser.setRTS(0) - time.sleep(0.01) - ser.setDTR(0) - time.sleep(0.01) - ser.setDTR(1) - time.sleep(0.01) - ser.setDTR(0) - - # try magic number - ser.setRTS(1) - time.sleep(0.01) - ser.setDTR(1) - time.sleep(0.01) - ser.setDTR(0) - time.sleep(0.01) - ser.write("1EAF") - - # ok we're done here - ser.close() - -except: - print 'Failed to open serial port %s for reset.' % maple_path + + try: + # try to toggle DTR/RTS (old scheme) + ser.setRTS(0) + time.sleep(0.01) + ser.setDTR(0) + time.sleep(0.01) + ser.setDTR(1) + time.sleep(0.01) + ser.setDTR(0) + + # try magic number + ser.setRTS(1) + time.sleep(0.01) + ser.setDTR(1) + time.sleep(0.01) + ser.setDTR(0) + time.sleep(0.01) + ser.write("1EAF") + + # Windows quirk: delay a bit before proceeding + if plat_sys == 'Windows': time.sleep(0.5) + finally: + # ok we're done here + ser.close() + +except Exception as e: + print 'Failed to open serial port %s for reset: %s' % (maple_path, + e.message) sys.exit() |