chore: baseline existing CI-V suite before RepeaterBook integration

This commit is contained in:
2026-06-14 16:02:36 -04:00
commit 03000708b6
14 changed files with 3550 additions and 0 deletions
Executable
+93
View File
@@ -0,0 +1,93 @@
#!/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()