mirror of
				https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
				synced 2025-10-31 11:21:06 +00:00 
			
		
		
		
	
		
			
	
	
		
			146 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			146 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|  | #!/usr/bin/env python | ||
|  | 
 | ||
|  | from __future__ import print_function | ||
|  | 
 | ||
|  | import serial | ||
|  | import os | ||
|  | import platform | ||
|  | import sys | ||
|  | import time | ||
|  | from struct import pack | ||
|  | 
 | ||
|  | def unix_get_maple_path(file_prefix, dev_is_maple=lambda dev: True): | ||
|  |     """Try to find the device file for the Maple on *nix.
 | ||
|  | 
 | ||
|  |     This function works assuming that the device file globs like | ||
|  |     '/dev/<file_prefix>*'. The caller may pass an additional | ||
|  |     dev_is_maple predicate if the platform supports additional tests | ||
|  |     to determine if a device is a Maple. | ||
|  | 
 | ||
|  |     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) and dev_is_maple(x)] | ||
|  |     return choose_path(possible_paths) | ||
|  | 
 | ||
|  | def linux_get_maple_path(file_prefix='ttyACM'): | ||
|  |     """Specialized unix_get_maple_path() for Linux.
 | ||
|  | 
 | ||
|  |     Attempts to check that a candidate device has the correct ID in | ||
|  |     the /sys tree when deciding if it's a Maple.""" | ||
|  |     return unix_get_maple_path(file_prefix, linux_tty_is_maple) | ||
|  | 
 | ||
|  | def linux_tty_is_maple(device): | ||
|  |     try: | ||
|  |         sysfile = open("/sys/class/tty/%s/device/uevent" % device, "r") | ||
|  |         text = "".join(sysfile.readlines()) | ||
|  |         return "PRODUCT=1eaf/4" in text | ||
|  |     except IOError: # no udev info available | ||
|  |         return True | ||
|  | 
 | ||
|  | 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': | ||
|  |     maple_path = linux_get_maple_path() | ||
|  |     # 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".encode("ascii")) | ||
|  |         ser.flush() | ||
|  | 
 | ||
|  |         # Delay a bit before proceeding | ||
|  |         time.sleep(0.1) | ||
|  |     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() | ||
|  | 
 |