Merge branch 'feature/idf-list-ports' into 'master'

idf.py: Use function for port detection from esptool.py in idf.py and idf_monitor.py

Closes IDFGH-3104

See merge request espressif/esp-idf!11359
pull/6416/head
Ivan Grokhotkov 2021-01-08 21:36:08 +08:00
commit bac77b4bf7
2 zmienionych plików z 19 dodań i 38 usunięć

Wyświetl plik

@ -991,24 +991,12 @@ class Monitor(object):
def main(): def main():
def _get_default_serial_port():
"""
Same logic for detecting serial port as esptool.py and idf.py: reverse sort by name and choose the first port.
"""
try:
ports = list(reversed(sorted(p.device for p in serial.tools.list_ports.comports())))
return ports[0]
except Exception:
return '/dev/ttyUSB0'
parser = argparse.ArgumentParser("idf_monitor - a serial output monitor for esp-idf") parser = argparse.ArgumentParser("idf_monitor - a serial output monitor for esp-idf")
parser.add_argument( parser.add_argument(
'--port', '-p', '--port', '-p',
help='Serial port device', help='Serial port device',
default=os.environ.get('ESPTOOL_PORT', _get_default_serial_port()) default=os.environ.get('ESPTOOL_PORT', '/dev/ttyUSB0')
) )
parser.add_argument( parser.add_argument(

Wyświetl plik

@ -12,28 +12,25 @@ PYTHON = sys.executable
def action_extensions(base_actions, project_path): def action_extensions(base_actions, project_path):
def _get_default_serial_port(): def _get_default_serial_port(args):
""" Return a default serial port. esptool can do this (smarter), but it can create
inconsistencies where esptool.py uses one port and idf_monitor uses another.
Same logic as esptool.py search order, reverse sort by name and choose the first port.
"""
# Import is done here in order to move it after the check_environment() ensured that pyserial has been installed # Import is done here in order to move it after the check_environment() ensured that pyserial has been installed
import serial.tools.list_ports
ports = list(reversed(sorted(p.device for p in serial.tools.list_ports.comports())))
try: try:
print("Choosing default port %s (use '-p PORT' option to set a specific serial port)" % import serial.tools.list_ports
ports[0].encode("ascii", "ignore")) esptool_path = os.path.join(os.environ["IDF_PATH"], "components/esptool_py/esptool/")
return ports[0] sys.path.insert(0, esptool_path)
except IndexError: import esptool
raise FatalError( ports = list(sorted(p.device for p in serial.tools.list_ports.comports()))
"No serial ports found. Connect a device, or use '-p PORT' option to set a specific port.") esp = esptool.get_default_connected_device(serial_list=ports, port=None, connect_attempts=3,
initial_baud=args.baud)
return esp.serial_port
except Exception:
raise FatalError("No serial ports found. Connect a device, or use '-p PORT' option to set a specific port.")
def _get_esptool_args(args): def _get_esptool_args(args):
esptool_path = os.path.join(os.environ["IDF_PATH"], "components/esptool_py/esptool/esptool.py") esptool_path = os.path.join(os.environ["IDF_PATH"], "components/esptool_py/esptool/esptool.py")
if args.port is None: if args.port is None:
args.port = _get_default_serial_port() args.port = _get_default_serial_port(args)
result = [PYTHON, esptool_path] result = [PYTHON, esptool_path]
result += ["-p", args.port] result += ["-p", args.port]
result += ["-b", str(args.baud)] result += ["-b", str(args.baud)]
@ -66,8 +63,7 @@ def action_extensions(base_actions, project_path):
""" """
Run idf_monitor.py to watch build output Run idf_monitor.py to watch build output
""" """
if args.port is None:
args.port = _get_default_serial_port()
desc_path = os.path.join(args.build_dir, "project_description.json") desc_path = os.path.join(args.build_dir, "project_description.json")
if not os.path.exists(desc_path): if not os.path.exists(desc_path):
ensure_build_directory(args, ctx.info_name) ensure_build_directory(args, ctx.info_name)
@ -81,8 +77,8 @@ def action_extensions(base_actions, project_path):
"Try '%s flash monitor'." % (elf_file, ctx.info_name), ctx) "Try '%s flash monitor'." % (elf_file, ctx.info_name), ctx)
idf_monitor = os.path.join(os.environ["IDF_PATH"], "tools/idf_monitor.py") idf_monitor = os.path.join(os.environ["IDF_PATH"], "tools/idf_monitor.py")
monitor_args = [PYTHON, idf_monitor] monitor_args = [PYTHON, idf_monitor]
if args.port is not None: esp_port = args.port or _get_default_serial_port(args)
monitor_args += ["-p", args.port] monitor_args += ["-p", esp_port]
if not monitor_baud: if not monitor_baud:
monitor_baud = os.getenv("IDF_MONITOR_BAUD") or os.getenv("MONITORBAUD") or project_desc["monitor_baud"] monitor_baud = os.getenv("IDF_MONITOR_BAUD") or os.getenv("MONITORBAUD") or project_desc["monitor_baud"]
@ -117,11 +113,8 @@ def action_extensions(base_actions, project_path):
Run esptool to flash the entire project, from an argfile generated by the build system Run esptool to flash the entire project, from an argfile generated by the build system
""" """
ensure_build_directory(args, ctx.info_name) ensure_build_directory(args, ctx.info_name)
if args.port is None: esp_port = args.port or _get_default_serial_port(args)
args.port = _get_default_serial_port() run_target(action, args, {"ESPBAUD": str(args.baud),"ESPPORT": esp_port})
run_target(action, args, {"ESPPORT": args.port,
"ESPBAUD": str(args.baud)})
def erase_flash(action, ctx, args): def erase_flash(action, ctx, args):
ensure_build_directory(args, ctx.info_name) ensure_build_directory(args, ctx.info_name)