You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
130 lines
3.8 KiB
130 lines
3.8 KiB
#!/usr/bin/env python |
|
from __future__ import print_function |
|
|
|
import serial |
|
import os |
|
import platform |
|
import sys |
|
import time |
|
from struct import pack |
|
|
|
try: |
|
raw_input # Python 2 |
|
except NameError: |
|
raw_input = input # Python 3 |
|
|
|
|
|
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:') |
|
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 plat_sys == 'Darwin': |
|
maple_path = unix_get_maple_path('tty.usbmodem') |
|
elif plat_sys == 'Windows': |
|
maple_path = windows_get_maple_path() |
|
else: |
|
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. ' |
|
'Perhaps this is your first upload, or the board is already ' |
|
'in bootloader mode.') |
|
print() |
|
print("If your sketch doesn't upload, try putting your Maple " |
|
"into bootloader mode manually by pressing the RESET button " |
|
"then letting it go and quickly pressing button BUT " |
|
"(hold for several seconds).") |
|
sys.exit() |
|
|
|
print('Using %s as Maple serial port' % maple_path) |
|
|
|
try: |
|
ser = serial.Serial(maple_path, baudrate=115200, xonxoff=1) |
|
|
|
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' % maple_path) |
|
sys.exit()
|
|
|