1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
import click
import bellows.types as t
from . import util
from .main import main
@main.command()
@click.argument("config", required=False)
@click.option("-a", "--all", "all_", is_flag=True)
@click.pass_context
@util.background
async def config(ctx, config, all_):
"""Get/set configuration on the NCP"""
click.secho("NOTE: Configuration changes do not persist across resets", fg="red")
if config and all_:
raise click.BadOptionUsage("Specify a config or --all, not both")
if not (config or all_):
raise click.BadOptionUsage("One of config or --all must be specified")
s = await util.setup(
ctx.obj["device"], ctx.obj["baudrate"], util.print_cb, configure=False
)
if all_:
for config in t.EzspConfigId:
v = await s.getConfigurationValue(config)
if v[0] == t.EzspStatus.ERROR_INVALID_ID:
continue
click.echo(f"{config.name}={v[1]}")
s.close()
return
if "=" in config:
config, value = config.split("=", 1)
if config.isdigit():
try:
config = t.EzspConfigId(int(config))
except ValueError:
raise click.BadArgumentUsage(f"Invalid config ID: {config}")
else:
try:
config = t.EzspConfigId[config]
except KeyError:
raise click.BadArgumentUsage(f"Invalid config name: {config}")
try:
value = t.uint16_t(value)
if not (0 <= value <= 65535):
raise ValueError(f"{value} out of allowed range 0..65535")
except ValueError as e:
raise click.BadArgumentUsage(f"Invalid value: {e}")
v = await s.setConfigurationValue(config, value)
click.echo(v)
s.close()
return
v = await s.getConfigurationValue(config)
click.echo(v)
@main.command()
@click.pass_context
@util.background
async def info(ctx):
"""Get NCP information"""
s = await util.setup(ctx.obj["device"], ctx.obj["baudrate"])
await util.network_init(s)
commands = [
"getEui64",
"getNodeId",
"networkState",
"getNetworkParameters",
"getCurrentSecurityState",
]
for c in commands:
v = await getattr(s, c)()
click.echo(v)
brd_manuf, brd_name, version = await s.get_board_info()
click.echo(f"Manufacturer: {brd_manuf}")
click.echo(f"Board name: {brd_name}")
click.echo(f"EmberZNet version: {version}")
s.close()
@main.command()
@click.pass_context
@util.background
async def bootloader(ctx):
"""Start bootloader"""
ezsp = await util.setup(ctx.obj["device"], ctx.obj["baudrate"], configure=False)
brd_manuf, brd_name, version = await ezsp.get_board_info()
click.echo(f"Manufacturer: {brd_manuf}")
click.echo(f"Board name: {brd_name}")
click.echo(f"Current EmberZNet version: {version}")
version, plat, micro, phy = await ezsp.getStandaloneBootloaderVersionPlatMicroPhy()
if version == 0xFFFF:
click.echo("No boot loader installed")
ezsp.close()
return
click.echo(
f"bootloader version: 0x{version:04x}, nodePlat: 0x{plat:02x}, "
f"nodeMicro: 0x{micro:02x}, nodePhy: 0x{phy:02x}"
)
res = await ezsp.launchStandaloneBootloader(0x00)
if res[0] != t.EmberStatus.SUCCESS:
click.echo(f"Couldn't launch bootloader: {res[0]}")
else:
click.echo("bootloader launched successfully")
ezsp.close()
|