# Copyright (C) Ivan Kravets # See LICENSE for details. import sys import click from serial.tools import miniterm from platformio.util import get_serialports @click.group(short_help="List or Monitor Serial ports") def cli(): pass @cli.command("list", short_help="List Serial ports") def serialports_list(): for item in get_serialports(): click.secho(item['port'], fg="cyan") click.echo("----------") click.echo("Hardware ID: %s" % item['hwid']) click.echo("Description: %s" % item['description']) click.echo("") @cli.command("monitor", short_help="Monitor Serial port") @click.option("--port", "-p", help="Port, a number or a device name") @click.option("--baud", "-b", type=int, default=9600, help="Set baud rate, default=9600") @click.option("--parity", default="N", type=click.Choice(["N", "E", "O", "S", "M"]), help="Set parity, default=N") @click.option("--rtscts", is_flag=True, help="Enable RTS/CTS flow control, default=Off") @click.option("--xonxoff", is_flag=True, help="Enable software flow control, default=Off") @click.option("--rts", default="0", type=click.Choice(["0", "1"]), help="Set initial RTS line state, default=0") @click.option("--dtr", default="0", type=click.Choice(["0", "1"]), help="Set initial DTR line state, default=0") @click.option("--echo", is_flag=True, help="Enable local echo, default=Off") @click.option("--cr", is_flag=True, help="Do not send CR+LF, send CR only, default=Off") @click.option("--lf", is_flag=True, help="Do not send CR+LF, send LF only, default=Off") @click.option("--debug", "-d", count=True, help="""Debug received data (escape non-printable chars) # --debug can be given multiple times: # 0: just print what is received # 1: escape non-printable characters, do newlines as unusual # 2: escape non-printable characters, newlines too # 3: hex dump everything""") @click.option("--exit-char", type=int, default=0x1d, help="ASCII code of special character that is used to exit the " "application, default=0x1d") @click.option("--menu-char", type=int, default=0x14, help="ASCII code of special character that is used to control " "miniterm (menu), default=0x14") @click.option("--quiet", is_flag=True, help="Diagnostics: suppress non-error messages, default=Off") def serialports_monitor(**kwargs): sys.argv = sys.argv[3:] if not kwargs['port']: for item in get_serialports(): if "VID:PID" in item['hwid']: sys.argv += ["--port", item['port']] break try: miniterm.main() except: # pylint: disable=W0702 pass