Пример #1
0
def device_monitor(**kwargs):  # pylint: disable=too-many-branches
    click.echo("Looking for advanced Serial Monitor with UI? "
               "Check http://bit.ly/pio-advanced-monitor")
    project_options = {}
    try:
        with fs.cd(kwargs["project_dir"]):
            project_options = get_project_options(kwargs["environment"])
        kwargs = apply_project_monitor_options(kwargs, project_options)
    except NotPlatformIOProjectError:
        pass

    if not kwargs["port"]:
        ports = util.get_serial_ports(filter_hwid=True)
        if len(ports) == 1:
            kwargs["port"] = ports[0]["port"]
        elif "platform" in project_options and "board" in project_options:
            board_hwids = get_board_hwids(
                kwargs["project_dir"],
                project_options["platform"],
                project_options["board"],
            )
            for item in ports:
                for hwid in board_hwids:
                    hwid_str = ("%s:%s" % (hwid[0], hwid[1])).replace("0x", "")
                    if hwid_str in item["hwid"]:
                        kwargs["port"] = item["port"]
                        break
                if kwargs["port"]:
                    break
    elif kwargs["port"] and (set(["*", "?", "[", "]"]) & set(kwargs["port"])):
        for item in util.get_serial_ports():
            if fnmatch(item["port"], kwargs["port"]):
                kwargs["port"] = item["port"]
                break

    # override system argv with patched options
    sys.argv = ["monitor"] + options_to_argv(
        kwargs,
        project_options,
        ignore=("port", "baud", "rts", "dtr", "environment", "project_dir"),
    )

    try:
        miniterm.main(
            default_port=kwargs["port"],
            default_baudrate=kwargs["baud"] or 9600,
            default_rts=kwargs["rts"],
            default_dtr=kwargs["dtr"],
        )
    except Exception as e:
        raise exception.MinitermException(e)
Пример #2
0
def device_monitor(**kwargs):  # pylint: disable=too-many-branches
    env_options = {}
    try:
        env_options = get_project_options(kwargs['project_dir'],
                                          kwargs['environment'])
        for k in ("port", "speed", "rts", "dtr"):
            k2 = "monitor_%s" % k
            if k == "speed":
                k = "baud"
            if kwargs[k] is None and k2 in env_options:
                kwargs[k] = env_options[k2]
                if k != "port":
                    kwargs[k] = int(kwargs[k])
    except exception.NotPlatformIOProject:
        pass

    if not kwargs['port']:
        ports = util.get_serial_ports(filter_hwid=True)
        if len(ports) == 1:
            kwargs['port'] = ports[0]['port']

    sys.argv = ["monitor"] + env_options.get("monitor_flags", [])
    for k, v in kwargs.items():
        if k in ("port", "baud", "rts", "dtr", "environment", "project_dir"):
            continue
        k = "--" + k.replace("_", "-")
        if k in env_options.get("monitor_flags", []):
            continue
        if isinstance(v, bool):
            if v:
                sys.argv.append(k)
        elif isinstance(v, tuple):
            for i in v:
                sys.argv.extend([k, i])
        else:
            sys.argv.extend([k, str(v)])

    if kwargs['port'] and (set(["*", "?", "[", "]"]) & set(kwargs['port'])):
        for item in util.get_serial_ports():
            if fnmatch(item['port'], kwargs['port']):
                kwargs['port'] = item['port']
                break

    try:
        miniterm.main(default_port=kwargs['port'],
                      default_baudrate=kwargs['baud'] or 9600,
                      default_rts=kwargs['rts'],
                      default_dtr=kwargs['dtr'])
    except Exception as e:
        raise exception.MinitermException(e)
Пример #3
0
def BeforeUpload(target, source, env):  # pylint: disable=W0613,W0621
    upload_options = {}
    if "BOARD" in env:
        upload_options = env.BoardConfig().get("upload", {})

    if env.subst("$UPLOAD_SPEED"):
        env.Append(UPLOADERFLAGS=["-b", "$UPLOAD_SPEED"])

    # extra upload flags
    if "extra_flags" in upload_options:
        env.Append(UPLOADERFLAGS=upload_options.get("extra_flags"))

    # disable erasing by default
    env.Append(UPLOADERFLAGS=["-e"])

    if upload_options and not upload_options.get("require_upload_port", False):
        return

    env.AutodetectUploadPort()
    env.Append(UPLOADERFLAGS=["-P", '"$UPLOAD_PORT"'])

    before_ports = get_serial_ports()

    if upload_options.get("use_1200bps_touch", False):
        env.TouchSerialPort("$UPLOAD_PORT", 1200)

    if upload_options.get("wait_for_upload_port", False):
        env.Replace(UPLOAD_PORT=env.WaitForNewSerialPort(before_ports))
Пример #4
0
def before_upload(source, target, env):
    port = None
    for p in get_serial_ports():
        if "0483:5740" in p.get("hwid", ""):
            if port is not None:
                sys.stderr.write("\nToo many RBCX ports!\n\n")
                sys.stderr.flush()
                sys.exit(1)
            port = p

    if port is None:
        return

    print("Sending magic RBCX sequence to %s for DFU reset..." % port["port"])
    try:
        with serial.Serial(port["port"],
                           baudrate=12345,
                           timeout=0.1,
                           parity=serial.PARITY_EVEN,
                           stopbits=serial.STOPBITS_TWO):
            time.sleep(0.01)
    except Exception as e:
        print("    Got exeption, might be okay anyway: %s" % e)

    print("Waiting for USB re-enumeration...")
    for i in range(30):
        out = subprocess.check_output([UPLOADER, "-d", DEVID_DFU, "-l"])
        if b"Found DFU" in out:
            return
        time.sleep(0.5)

    sys.stderr.write("\nTimed out while waiting for DFU!\n\n")
    sys.stderr.flush()
    sys.exit(1)
Пример #5
0
def BeforeUpload(target, source, env):
    ports = get_serial_ports()
        
    if(len(ports) == 1):
        env.Replace(UPLOAD_PORT=ports[0]['port'])
    else:
        click.secho("Please select upload port (line number):", fg='yellow')
        for i, port in enumerate(ports):
            click.secho(f"{i}: {port['port']}", fg='white')
        
        selected_port = input("")      
        
        if(not selected_port.isnumeric()):
            for i, port in enumerate(ports):
                if(port['port'] == selected_port):
                    selected_port = i
        else:
            selected_port = int(selected_port)
                                           
        try:
            click.secho("SELECTED PORT: " + ports[selected_port]['port'], fg='green')
            env.Replace(UPLOAD_PORT=ports[selected_port]['port'])
        except:
            click.secho("WRONG PORT SELECTED! Please select line number or the port name", fg='red')
            raise Exception("Upload port error")
Пример #6
0
def getPorts():
    simultaneous_upload_ports = ARGUMENTS.get("SIMULTANEOUS_UPLOAD_PORTS")
    ports = map(lambda x: {"port": str.strip(x)},
                b64decode(simultaneous_upload_ports).split(','))
    if ports[0]["port"] == "AUTO":
        ports = util.get_serial_ports()
        ports = filter(lambda x: x["port"].find("SLAB") != -1, ports)
    return ports
Пример #7
0
def BeforeUpload(target, source, env):  # pylint: disable=W0613,W0621
    upload_options = {}
    if "BOARD" in env:
        upload_options = env.BoardConfig().get("upload", {})

    # Deprecated: compatibility with old projects. Use `program` instead
    if "usb" in env.subst("$UPLOAD_PROTOCOL"):
        upload_options["require_upload_port"] = False
        env.Replace(UPLOAD_SPEED=None)

    if env.subst("$UPLOAD_SPEED"):
        env.Append(UPLOADERFLAGS=["-b", "$UPLOAD_SPEED"])

    # extra upload flags
    if "extra_flags" in upload_options:
        env.Append(UPLOADERFLAGS=upload_options.get("extra_flags"))

    # disable erasing by default
    env.Append(UPLOADERFLAGS=["-D"])

    if upload_options and not upload_options.get("require_upload_port", False):
        return

    env.AutodetectUploadPort()
    env.Append(UPLOADERFLAGS=["-P", "$UPLOAD_PORT"])

    if env.subst("$BOARD") in ("raspduino", "emonpi", "sleepypi"):

        def _rpi_sysgpio(path, value):
            with open(path, "w") as f:
                f.write(str(value))

        if env.subst("$BOARD") == "raspduino":
            pin_num = 18
        elif env.subst("$BOARD") == "sleepypi":
            pin_num = 22
        else:
            pin_num = 4

        _rpi_sysgpio("/sys/class/gpio/export", pin_num)
        _rpi_sysgpio("/sys/class/gpio/gpio%d/direction" % pin_num, "out")
        _rpi_sysgpio("/sys/class/gpio/gpio%d/value" % pin_num, 1)
        sleep(0.1)
        _rpi_sysgpio("/sys/class/gpio/gpio%d/value" % pin_num, 0)
        _rpi_sysgpio("/sys/class/gpio/unexport", pin_num)
    else:
        if not upload_options.get("disable_flushing", False) and not env.get(
            "UPLOAD_PORT", ""
        ).startswith("net:"):
            env.FlushSerialBuffer("$UPLOAD_PORT")

        before_ports = get_serial_ports()

        if upload_options.get("use_1200bps_touch", False):
            env.TouchSerialPort("$UPLOAD_PORT", 1200)

        if upload_options.get("wait_for_upload_port", False):
            env.Replace(UPLOAD_PORT=env.WaitForNewSerialPort(before_ports))
Пример #8
0
Файл: main.py Проект: OS-Q/P221
def BeforeUpload(target, source, env):  # pylint: disable=W0613,W0621
    upload_options = {}
    if "BOARD" in env:
        upload_options = env.BoardConfig().get("upload", {})

    env.AutodetectUploadPort()
    before_ports = get_serial_ports()

    if upload_options.get("use_1200bps_touch", False):
        env.TouchSerialPort("$UPLOAD_PORT", 1200)

    if upload_options.get("wait_for_upload_port", False):
        env.Replace(UPLOAD_PORT=env.WaitForNewSerialPort(before_ports))
Пример #9
0
def before_upload(source, target, env):
    upload_options = env.BoardConfig().get("upload", {})
    b_request = None
    exists = False
    id_vendor = None
    id_product = None
    wait_for_serial = False
    if "ardwiino_bootloader_teensy" in upload_options and upload_options["ardwiino_bootloader_teensy"] == "true":
        b_request = BOOTLOADER
    elif "ardwiino_bootloader" in upload_options and upload_options["ardwiino_bootloader"] == "true":
        b_request = BOOTLOADER
        wait_for_serial = True
    if "/arduino_uno_mega_usb" in str(source[0]):
        id_vendor = 0x03eb
        id_product = None
        b_request = BOOTLOADER
        if (libusb_package.find(idVendor=0x1209, idProduct=0x2883)):
            env.AutodetectUploadPort()
            env.TouchSerialPort("$UPLOAD_PORT", 1200)
    if "/arduino_uno/" in str(source[0]):
        if libusb_package.find(idVendor=0x1209, idProduct=0x2882):
            b_request = BOOTLOADER_SERIAL
            id_vendor = 0x1209
            id_product = 0x2883
            exists = libusb_package.find(idProduct=id_product, idVendor=id_vendor)
    before_ports = get_serial_ports()
    if b_request:
        # find our device
        dev = libusb_package.find(idVendor=0x1209, idProduct=0x2882)
        try:
            dev.detach_kernel_driver(0)
        except:
            pass
        try:
            dev.ctrl_transfer(0x21, b_request)
            dev.ctrl_transfer(0x21, 0x09, b_request)
        except:
            pass
    if id_vendor:
        args = {"idVendor": id_vendor}
        if id_product:
            args["idProduct"] = id_product
        
        while not libusb_package.find(**args):
            pass
        if not exists and id_product == 0x2883:
            wait_for_serial = True
    if wait_for_serial:
        env.Replace(UPLOAD_PORT=env.WaitForNewSerialPort(before_ports))
Пример #10
0
 def _look_for_serial_port():
     port = None
     board_hwids = []
     upload_protocol = env.subst("$UPLOAD_PROTOCOL")
     if "BOARD" in env and "build.hwids" in env.BoardConfig():
         board_hwids = env.BoardConfig().get("build.hwids")
     for item in util.get_serial_ports(filter_hwid=True):
         if not _is_match_pattern(item['port']):
             continue
         port = item['port']
         if upload_protocol.startswith("blackmagic") \
                 and "GDB" in item['description']:
             return port
         for hwid in board_hwids:
             hwid_str = ("%s:%s" % (hwid[0], hwid[1])).replace("0x", "")
             if hwid_str in item['hwid']:
                 return port
     return port
Пример #11
0
 def _look_for_serial_port():
     port = None
     board_hwids = []
     upload_protocol = env.subst("$UPLOAD_PROTOCOL")
     if "BOARD" in env and "build.hwids" in env.BoardConfig():
         board_hwids = env.BoardConfig().get("build.hwids")
     for item in util.get_serial_ports(filter_hwid=True):
         if not _is_match_pattern(item['port']):
             continue
         port = item['port']
         if upload_protocol.startswith("blackmagic") \
                 and "GDB" in item['description']:
             return ("\\\\.\\%s" % port if "windows" in util.get_systype()
                     and port.startswith("COM") and len(port) > 4 else port)
         for hwid in board_hwids:
             hwid_str = ("%s:%s" % (hwid[0], hwid[1])).replace("0x", "")
             if hwid_str in item['hwid']:
                 return port
     return port
Пример #12
0
 def _look_for_serial_port():
     port = None
     board_hwids = []
     upload_protocol = env.subst("$UPLOAD_PROTOCOL")
     if "BOARD" in env and "build.hwids" in env.BoardConfig():
         board_hwids = env.BoardConfig().get("build.hwids")
     for item in util.get_serial_ports(filter_hwid=True):
         if not _is_match_pattern(item["port"]):
             continue
         port = item["port"]
         if upload_protocol.startswith("blackmagic"):
             if WINDOWS and port.startswith("COM") and len(port) > 4:
                 port = "\\\\.\\%s" % port
             if "GDB" in item["description"]:
                 return port
         for hwid in board_hwids:
             hwid_str = ("%s:%s" % (hwid[0], hwid[1])).replace("0x", "")
             if hwid_str in item["hwid"]:
                 return port
     return port
Пример #13
0
def device_monitor(**kwargs):  # pylint: disable=too-many-branches
    try:
        project_options = get_project_options(kwargs['project_dir'],
                                              kwargs['environment'])
        monitor_options = {k: v for k, v in project_options or []}
        if monitor_options:
            for k in ("port", "baud", "rts", "dtr"):
                k2 = "monitor_%s" % k
                if kwargs[k] is None and k2 in monitor_options:
                    kwargs[k] = monitor_options[k2]
                    if k != "port":
                        kwargs[k] = int(kwargs[k])
    except exception.NotPlatformIOProject:
        pass

    if not kwargs['port']:
        ports = util.get_serial_ports(filter_hwid=True)
        if len(ports) == 1:
            kwargs['port'] = ports[0]['port']

    sys.argv = ["monitor"]
    for k, v in kwargs.iteritems():
        if k in ("port", "baud", "rts", "dtr", "environment", "project_dir"):
            continue
        k = "--" + k.replace("_", "-")
        if isinstance(v, bool):
            if v:
                sys.argv.append(k)
        elif isinstance(v, tuple):
            for i in v:
                sys.argv.extend([k, i])
        else:
            sys.argv.extend([k, str(v)])

    try:
        miniterm.main(default_port=kwargs['port'],
                      default_baudrate=kwargs['baud'] or 9600,
                      default_rts=kwargs['rts'],
                      default_dtr=kwargs['dtr'])
    except Exception as e:
        raise exception.MinitermException(e)
Пример #14
0
Файл: main.py Проект: OS-Q/P411
def BeforeUpload(target, source, env):  # pylint: disable=W0613,W0621
    env.AutodetectUploadPort()

    upload_options = {}
    if "BOARD" in env:
        upload_options = env.BoardConfig().get("upload", {})

    if not bool(upload_options.get("disable_flushing", False)):
        env.FlushSerialBuffer("$UPLOAD_PORT")

    before_ports = get_serial_ports()

    if bool(upload_options.get("use_1200bps_touch", False)):
        env.TouchSerialPort("$UPLOAD_PORT", 1200)

    if bool(upload_options.get("wait_for_upload_port", False)):
        env.Replace(UPLOAD_PORT=env.WaitForNewSerialPort(before_ports))

    # use only port name for BOSSA
    if ("/" in env.subst("$UPLOAD_PORT")
            and env.subst("$UPLOAD_PROTOCOL") == "sam-ba"):
        env.Replace(UPLOAD_PORT=basename(env.subst("$UPLOAD_PORT")))
Пример #15
0
def WaitForNewSerialPort(env, before):
    print("Waiting for the new upload port...")
    prev_port = env.subst("$UPLOAD_PORT")
    new_port = None
    elapsed = 0
    before = [p['port'] for p in before]
    while elapsed < 5 and new_port is None:
        now = [p['port'] for p in util.get_serial_ports()]
        for p in now:
            if p not in before:
                new_port = p
                break
        before = now
        sleep(0.25)
        elapsed += 0.25

    if not new_port:
        for p in now:
            if prev_port == p:
                new_port = p
                break

    try:
        s = Serial(new_port)
        s.close()
    except SerialException:
        sleep(1)

    if not new_port:
        sys.stderr.write("Error: Couldn't find a board on the selected port. "
                         "Check that you have the correct port selected. "
                         "If it is correct, try pressing the board's reset "
                         "button after initiating the upload.\n")
        env.Exit(1)

    return new_port
Пример #16
0
def WaitForNewSerialPort(env, before):
    print("Waiting for the new upload port...")
    prev_port = env.subst("$UPLOAD_PORT")
    new_port = None
    elapsed = 0
    before = [p['port'] for p in before]
    while elapsed < 5 and new_port is None:
        now = [p['port'] for p in util.get_serial_ports()]
        for p in now:
            if p not in before:
                new_port = p
                break
        before = now
        sleep(0.25)
        elapsed += 0.25

    if not new_port:
        for p in now:
            if prev_port == p:
                new_port = p
                break

    try:
        s = Serial(new_port)
        s.close()
    except SerialException:
        sleep(1)

    if not new_port:
        sys.stderr.write("Error: Couldn't find a board on the selected port. "
                         "Check that you have the correct port selected. "
                         "If it is correct, try pressing the board's reset "
                         "button after initiating the upload.\n")
        env.Exit(1)

    return new_port
Пример #17
0
def getPorts():
    simultaneous_upload_ports = ARGUMENTS.get("SIMULTANEOUS_UPLOAD_PORTS")
    ports = map(str.strip, b64decode(simultaneous_upload_ports).split(','))
    if ports[0] == "AUTO":
        ports = util.get_serial_ports()
    return ports
Пример #18
0
def device_list(  # pylint: disable=too-many-branches
        serial, logical, mdns, json_output):
    if not logical and not mdns:
        serial = True
    data = {}
    if serial:
        data['serial'] = util.get_serial_ports()
    if logical:
        data['logical'] = util.get_logical_devices()
    if mdns:
        data['mdns'] = util.get_mdns_services()

    single_key = data.keys()[0] if len(data.keys()) == 1 else None

    if json_output:
        return click.echo(json.dumps(data[single_key] if single_key else data))

    titles = {
        "serial": "Serial Ports",
        "logical": "Logical Devices",
        "mdns": "Multicast DNS Services"
    }

    for key, value in data.iteritems():
        if not single_key:
            click.secho(titles[key], bold=True)
            click.echo("=" * len(titles[key]))

        if key == "serial":
            for item in value:
                click.secho(item['port'], fg="cyan")
                click.echo("-" * len(item['port']))
                click.echo("Hardware ID: %s" % item['hwid'])
                click.echo("Description: %s" % item['description'])
                click.echo("")

        if key == "logical":
            for item in value:
                click.secho(item['path'], fg="cyan")
                click.echo("-" * len(item['path']))
                click.echo("Name: %s" % item['name'])
                click.echo("")

        if key == "mdns":
            for item in value:
                click.secho(item['name'], fg="cyan")
                click.echo("-" * len(item['name']))
                click.echo("Type: %s" % item['type'])
                click.echo("IP: %s" % item['ip'])
                click.echo("Port: %s" % item['port'])
                if item['properties']:
                    click.echo("Properties: %s" % ("; ".join([
                        "%s=%s" % (k, v)
                        for k, v in item['properties'].iteritems()
                    ])))
                click.echo("")

        if single_key:
            click.echo("")

    return True
Пример #19
0
def device_list(  # pylint: disable=too-many-branches
    serial, logical, mdns, json_output
):
    if not logical and not mdns:
        serial = True
    data = {}
    if serial:
        data["serial"] = util.get_serial_ports()
    if logical:
        data["logical"] = util.get_logical_devices()
    if mdns:
        data["mdns"] = util.get_mdns_services()

    single_key = list(data)[0] if len(list(data)) == 1 else None

    if json_output:
        return click.echo(
            dump_json_to_unicode(data[single_key] if single_key else data)
        )

    titles = {
        "serial": "Serial Ports",
        "logical": "Logical Devices",
        "mdns": "Multicast DNS Services",
    }

    for key, value in data.items():
        if not single_key:
            click.secho(titles[key], bold=True)
            click.echo("=" * len(titles[key]))

        if key == "serial":
            for item in value:
                click.secho(item["port"], fg="cyan")
                click.echo("-" * len(item["port"]))
                click.echo("Hardware ID: %s" % item["hwid"])
                click.echo("Description: %s" % item["description"])
                click.echo("")

        if key == "logical":
            for item in value:
                click.secho(item["path"], fg="cyan")
                click.echo("-" * len(item["path"]))
                click.echo("Name: %s" % item["name"])
                click.echo("")

        if key == "mdns":
            for item in value:
                click.secho(item["name"], fg="cyan")
                click.echo("-" * len(item["name"]))
                click.echo("Type: %s" % item["type"])
                click.echo("IP: %s" % item["ip"])
                click.echo("Port: %s" % item["port"])
                if item["properties"]:
                    click.echo(
                        "Properties: %s"
                        % (
                            "; ".join(
                                [
                                    "%s=%s" % (k, v)
                                    for k, v in item["properties"].items()
                                ]
                            )
                        )
                    )
                click.echo("")

        if single_key:
            click.echo("")

    return True
Пример #20
0
def device_monitor(**kwargs):  # pylint: disable=too-many-branches
    # load default monitor filters
    filters_dir = os.path.join(fs.get_source_dir(), "commands", "device", "filters")
    for name in os.listdir(filters_dir):
        if not name.endswith(".py"):
            continue
        device_helpers.load_monitor_filter(os.path.join(filters_dir, name))

    project_options = {}
    try:
        with fs.cd(kwargs["project_dir"]):
            project_options = device_helpers.get_project_options(kwargs["environment"])
        kwargs = device_helpers.apply_project_monitor_options(kwargs, project_options)
    except NotPlatformIOProjectError:
        pass

    platform = None
    if "platform" in project_options:
        with fs.cd(kwargs["project_dir"]):
            platform = PlatformFactory.newPlatform(project_options["platform"])
            device_helpers.register_platform_filters(
                platform, kwargs["project_dir"], kwargs["environment"]
            )

    if not kwargs["port"]:
        ports = util.get_serial_ports(filter_hwid=True)
        if len(ports) == 1:
            kwargs["port"] = ports[0]["port"]
        elif "platform" in project_options and "board" in project_options:
            board_hwids = device_helpers.get_board_hwids(
                kwargs["project_dir"], platform, project_options["board"],
            )
            for item in ports:
                for hwid in board_hwids:
                    hwid_str = ("%s:%s" % (hwid[0], hwid[1])).replace("0x", "")
                    if hwid_str in item["hwid"]:
                        kwargs["port"] = item["port"]
                        break
                if kwargs["port"]:
                    break
    elif kwargs["port"] and (set(["*", "?", "[", "]"]) & set(kwargs["port"])):
        for item in util.get_serial_ports():
            if fnmatch(item["port"], kwargs["port"]):
                kwargs["port"] = item["port"]
                break

    # override system argv with patched options
    sys.argv = ["monitor"] + device_helpers.options_to_argv(
        kwargs,
        project_options,
        ignore=("port", "baud", "rts", "dtr", "environment", "project_dir"),
    )

    if not kwargs["quiet"]:
        click.echo(
            "--- Available filters and text transformations: %s"
            % ", ".join(sorted(miniterm.TRANSFORMATIONS.keys()))
        )
        click.echo("--- More details at http://bit.ly/pio-monitor-filters")
    try:
        miniterm.main(
            default_port=kwargs["port"],
            default_baudrate=kwargs["baud"] or 9600,
            default_rts=kwargs["rts"],
            default_dtr=kwargs["dtr"],
        )
    except Exception as e:
        raise exception.MinitermException(e)