diff --git a/nodemcu_uploader/serialutils.py b/nodemcu_uploader/serialutils.py new file mode 100644 index 0000000..0906730 --- /dev/null +++ b/nodemcu_uploader/serialutils.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 2015-2019 Peter Magnusson + +from platform import system +from os import environ +from serial.tools import list_ports + + +def default_port(sysname=system()): + """This returns the default port used for different systems if SERIALPORT env variable is not set""" + system_default = { + 'Windows': 'COM1', + 'Darwin': '/dev/tty.SLAB_USBtoUART' + }.get(sysname, '/dev/ttyUSB0') + # if SERIALPORT is set then don't even waste time detecting ports + if 'SERIALPORT' not in environ: + try: + ports = list_ports.comports(include_links=False) + if len(ports) == 1: + return ports[0].device + else: + # clever guessing, sort of + # vid/pid + # 4292/60000 adafruit huzzah + for p in ports: + if p.vid == 4292 and p.pid == 60000: + return p.device + # use last port as fallback + return ports[-1].device + except Exception: + pass + + return environ.get('SERIALPORT', system_default) diff --git a/nodemcu_uploader/term.py b/nodemcu_uploader/term.py index d524537..87d02f5 100644 --- a/nodemcu_uploader/term.py +++ b/nodemcu_uploader/term.py @@ -4,7 +4,7 @@ from serial.tools import miniterm import sys -from .utils import default_port +from .serialutils import default_port def terminal(port=default_port(), baud='9600'): diff --git a/nodemcu_uploader/uploader.py b/nodemcu_uploader/uploader.py index d47c228..34f64e2 100644 --- a/nodemcu_uploader/uploader.py +++ b/nodemcu_uploader/uploader.py @@ -14,9 +14,10 @@ import serial from . import validate +from .serialutils import default_port from .exceptions import CommunicationTimeout, DeviceNotFoundException, \ BadResponseException, VerificationError, NoAckException -from .utils import default_port, system, hexify, from_file, ENCODING +from .utils import system, hexify, from_file, ENCODING from .luacode import RECV_LUA, SEND_LUA, LUA_FUNCTIONS, \ LIST_FILES, UART_SETUP, PRINT_FILE, INFO_GROUP, REMOVE_ALL_FILES diff --git a/nodemcu_uploader/utils.py b/nodemcu_uploader/utils.py index 6751c19..a9c63b0 100644 --- a/nodemcu_uploader/utils.py +++ b/nodemcu_uploader/utils.py @@ -3,11 +3,11 @@ """Various utility functions""" from platform import system -from os import environ + # from wrapt import ObjectProxy from sys import version_info -__all__ = ['default_port', 'system', 'hexify', 'from_file', 'PY2', 'ENCODING'] +__all__ = ['system', 'hexify', 'from_file', 'PY2', 'ENCODING'] PY2 = version_info.major == 2 @@ -17,15 +17,6 @@ ENCODING = 'latin1' -def default_port(sysname=system()): - """This returns the default port used for different systems if SERIALPORT env variable is not set""" - system_default = { - 'Windows': 'COM1', - 'Darwin': '/dev/tty.SLAB_USBtoUART' - }.get(sysname, '/dev/ttyUSB0') - return environ.get('SERIALPORT', system_default) - - def to_hex(x): if isinstance(x, int): return hex(x)