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)
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)
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))
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)
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")
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
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))
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))
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))
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
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
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
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)
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")))
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
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
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
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
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)