Просмотр исходного кода

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
Ivan Grokhotkov 5 лет назад
Родитель
Сommit
bac77b4bf7
2 измененных файлов с 19 добавлено и 38 удалено
  1. 1 13
      tools/idf_monitor.py
  2. 18 25
      tools/idf_py_actions/serial_ext.py

+ 1 - 13
tools/idf_monitor.py

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

+ 18 - 25
tools/idf_py_actions/serial_ext.py

@@ -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():
-        """ 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.
-        """
+    def _get_default_serial_port(args):
         # 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)" %
-                  ports[0].encode("ascii", "ignore"))
-            return ports[0]
-        except IndexError:
-            raise FatalError(
-                "No serial ports found. Connect a device, or use '-p PORT' option to set a specific port.")
+            import serial.tools.list_ports
+            esptool_path = os.path.join(os.environ["IDF_PATH"], "components/esptool_py/esptool/")
+            sys.path.insert(0, esptool_path)
+            import esptool
+            ports = list(sorted(p.device for p in serial.tools.list_ports.comports()))
+            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:
-            monitor_args += ["-p", args.port]
+        esp_port = args.port or _get_default_serial_port(args)
+        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:
-            args.port = _get_default_serial_port()
-
-        run_target(action, args, {"ESPPORT": args.port,
-                                  "ESPBAUD": str(args.baud)})
+        esp_port = args.port or _get_default_serial_port(args)
+        run_target(action, args, {"ESPBAUD": str(args.baud),"ESPPORT": esp_port})
 
 
     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)