#! /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="kxsend", description="Send a string over CW on a KX2" ) ap.add_argument("text", help="Text to send", nargs="+") ap.add_argument("--speed", help="Transmit speed in WPM", type=int) 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() args.text = " ".join(args.text) # Configure logging logging.basicConfig( level=logging.DEBUG if args.verbose else logging.INFO, format="%(levelname)s: %(message)s", ) # Connect to the radio logger.debug(f"Connecting to radio: {args.device}") serial_conn = serial.Serial(args.device, args.baud) # If we have a specific speed, set it if args.speed: cmd = "KS{:0>3};".format(args.speed) logger.debug(f"Sending command: {cmd}") serial_conn.write(cmd.encode("ascii")) # Break the text into max 24 character chunks chunks = [args.text[i:i+24] for i in range(0, len(args.text), 24)] logger.info(f"Sending {len(chunks)} chunks") # Handle each chunk for chunk in chunks: # Send the text cmd = f"KY {chunk};" logger.debug(f"Sending command: {cmd}") serial_conn.write(cmd.encode("ascii")) return 0 if __name__ == "__main__": sys.exit(main())