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()
|