#!/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()