68 lines
1.8 KiB
Python
Executable File
68 lines
1.8 KiB
Python
Executable File
#! /usr/bin/env python3
|
|
import argparse
|
|
import sys
|
|
import logging
|
|
import serial
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def main() -> int:
|
|
# Handle program arguments
|
|
ap = argparse.ArgumentParser(
|
|
prog="kxtune", description="Tune a KX2 or KX3 to a new frequency"
|
|
)
|
|
ap.add_argument("frequency", help="Frequency to tune to in KC", type=float)
|
|
ap.add_argument("--vfo", help="VFO to tune", choices=["a", "b"], default="a")
|
|
ap.add_argument(
|
|
"--mode",
|
|
help="Radio mode",
|
|
choices=["lsb", "usb", "cw", "fm", "am", "data", "cw-r", "data-r"],
|
|
)
|
|
ap.add_argument("--device", "-d", help="Serial device", default="/dev/ttyUSB0")
|
|
ap.add_argument("--baud", "-b", help="Serial baud rate", default=38400, type=int)
|
|
ap.add_argument(
|
|
"-v", "--verbose", help="Enable verbose logging", action="store_true"
|
|
)
|
|
args = ap.parse_args()
|
|
|
|
# Configure logging
|
|
logging.basicConfig(
|
|
level=logging.DEBUG if args.verbose else logging.INFO,
|
|
format="%(levelname)s: %(message)s",
|
|
)
|
|
|
|
# Convert to Hz
|
|
frequency = int(args.frequency * 1000)
|
|
|
|
# Connect to the radio
|
|
logger.debug(f"Connecting to radio: {args.device}")
|
|
serial_conn = serial.Serial(args.device, args.baud)
|
|
|
|
# Send the tune command
|
|
cmd = f"F{args.vfo.upper()}{frequency:011d};"
|
|
logger.debug(f"Sending command: {cmd}")
|
|
serial_conn.write(cmd.encode("ascii"))
|
|
|
|
# If we have a mode, set it
|
|
mode_id = {
|
|
"lsb": "1",
|
|
"usb": "2",
|
|
"cw": "3",
|
|
"fm": "4",
|
|
"am": "5",
|
|
"data": "6",
|
|
"cw-r": "7",
|
|
"data-r": "9",
|
|
}.get(args.mode)
|
|
if mode_id:
|
|
cmd = f"MD{mode_id};"
|
|
logger.debug(f"Sending command: {cmd}")
|
|
serial_conn.write(cmd.encode("ascii"))
|
|
|
|
return 0
|
|
|
|
|
|
if __name__ == "__main__":
|
|
sys.exit(main())
|