94 lines
2.8 KiB
Python
Executable File
94 lines
2.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""
|
|
id5100 — command-line control for the ICOM ID-5100 over CI-V.
|
|
|
|
./cli.py status show everything at a glance
|
|
./cli.py freq read VFO frequency
|
|
./cli.py freq 146.52 set VFO to 146.520 MHz
|
|
./cli.py mode read mode
|
|
./cli.py mode fm set mode (lsb/usb/am/cw/fm/dv)
|
|
./cli.py vol [0-255] get/set AF (volume)
|
|
./cli.py sql [0-255] get/set squelch level
|
|
./cli.py smeter read S-meter (0-255)
|
|
|
|
Global: --port (default /dev/ttyUSB0) --baud (default 9600)
|
|
"""
|
|
import argparse
|
|
import sys
|
|
|
|
from radio import Radio, CIVError
|
|
|
|
|
|
def cmd_status(r, _):
|
|
freq = r.get_frequency()
|
|
mode, _code = r.get_mode()
|
|
print(f"freq : {freq/1e6:.5f} MHz")
|
|
print(f"mode : {mode}")
|
|
print(f"volume : {r.get_volume()}/255")
|
|
print(f"squelch: level {r.get_squelch_level()}/255, "
|
|
f"{'OPEN' if r.squelch_open() else 'closed'}")
|
|
print(f"s-meter: {r.get_smeter()}/255")
|
|
|
|
|
|
def cmd_freq(r, a):
|
|
if a.value is None:
|
|
print(f"{r.get_frequency()/1e6:.5f} MHz")
|
|
else:
|
|
hz = int(round(float(a.value) * 1e6)) # CLI takes MHz
|
|
r.set_frequency(hz)
|
|
print(f"set -> {r.get_frequency()/1e6:.5f} MHz")
|
|
|
|
|
|
def cmd_mode(r, a):
|
|
if a.value is None:
|
|
print(r.get_mode()[0])
|
|
else:
|
|
r.set_mode(a.value)
|
|
print(f"set -> {r.get_mode()[0]}")
|
|
|
|
|
|
def _level_cmd(getter, setter):
|
|
def run(r, a):
|
|
if a.value is None:
|
|
print(f"{getter(r)}/255")
|
|
else:
|
|
setter(r, int(a.value))
|
|
print(f"set -> {getter(r)}/255")
|
|
return run
|
|
|
|
|
|
def cmd_smeter(r, _):
|
|
print(f"{r.get_smeter()}/255")
|
|
|
|
|
|
def build_parser():
|
|
p = argparse.ArgumentParser(prog="id5100", description=__doc__,
|
|
formatter_class=argparse.RawDescriptionHelpFormatter)
|
|
p.add_argument("--port", default="/dev/ttyUSB0")
|
|
p.add_argument("--baud", type=int, default=9600)
|
|
sub = p.add_subparsers(dest="cmd", required=True)
|
|
|
|
sub.add_parser("status").set_defaults(func=cmd_status)
|
|
sub.add_parser("smeter").set_defaults(func=cmd_smeter)
|
|
for name, func in (("freq", cmd_freq), ("mode", cmd_mode),
|
|
("vol", _level_cmd(Radio.get_volume, Radio.set_volume)),
|
|
("sql", _level_cmd(Radio.get_squelch_level, Radio.set_squelch_level))):
|
|
sp = sub.add_parser(name)
|
|
sp.add_argument("value", nargs="?", default=None)
|
|
sp.set_defaults(func=func)
|
|
return p
|
|
|
|
|
|
def main():
|
|
args = build_parser().parse_args()
|
|
try:
|
|
with Radio(args.port, args.baud) as r:
|
|
args.func(r, args)
|
|
except (CIVError, ValueError, OSError) as e:
|
|
print(f"error: {e}", file=sys.stderr)
|
|
sys.exit(1)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|