aboutsummaryrefslogtreecommitdiffstats
path: root/support/scripts/reset.py
blob: 2122d36ca4804d32fd523645f88151f7dba1f9ec (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#!/usr/bin/env python

import serial
import os
import platform
import sys
import time
from struct import pack

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: %s' % (maple_path,
                                                           e.message)
    sys.exit()