From 8d25c9363cae90ff2a446bfdfe1ea391c3194b6c Mon Sep 17 00:00:00 2001 From: Armel FAUVEAU Date: Wed, 20 Nov 2024 03:07:49 +0100 Subject: [PATCH] Add support for CTCSS or DCS on transmit or receive ONLY (#26) * Add None support for RX or TX CTCSS or DCS * Improve DCS * Update README --- README.md | 3 +++ sa818.py | 55 ++++++++++++++++++++++++++++++++----------------------- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 0f14a2a..bf0df2a 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,9 @@ SA818: INFO: +DMOSETVOLUME:0 Volume level: 5 It is possible to specify a different CTCSS or DCS code for transmit and receive by separating the two codes by a comma (no spaces). For example, `--ctcss 100,88.5` will set the CTCSS 100Hz for transmit and 88.5Hz for receive. +> [!NOTE] +> It is also possible to specify CTCSS or DCS on transmit or receive only. For example, `--ctcss 100,None` will set the CTCSS 100Hz for transmit only (nothing for receive). + ## Usage This program has for sections: diff --git a/sa818.py b/sa818.py index 90cb1c9..0d4cc36 100755 --- a/sa818.py +++ b/sa818.py @@ -32,6 +32,7 @@ ) DCS_CODES = [ + "None", "023", "025", "026", "031", "032", "036", "043", "047", "051", "053", "054", "065", "071", "072", "073", "074", "114", "115", "116", "125", "131", "132", "134", "143", "152", "155", "156", "162", "165", "172", "174", "205", "223", @@ -157,9 +158,11 @@ def set_radio(self, frequency, offset, bw, squelch, ctcss, dcs, tail): logger.info(msg, response, bw_label, rx_freq, tx_freq, CTCSS[int(tx_tone)], CTCSS[int(rx_tone)], squelch) elif dcs: - msg = "%s, BW: %s Frequency (RX: %s / TX: %s), DCD (TX: %s / RX: %s), squelch: %s, OK" + tx_tone_display = None if tx_tone == '0000' else tx_tone + rx_tone_display = None if rx_tone == '0000' else rx_tone + msg = "%s, BW: %s Frequency (RX: %s / TX: %s), DCS (TX: %s / RX: %s), squelch: %s, OK" logger.info(msg, response, bw_label, rx_freq, tx_freq, - tx_tone, rx_tone, squelch) + tx_tone_display, rx_tone_display, squelch) else: msg = "%s, BW: %s, RX frequency: %s, TX frequency: %s, squelch: %s, OK" logger.info(msg, response, bw_label, rx_freq, tx_freq, squelch) @@ -227,15 +230,18 @@ def type_ctcss(parg): raise argparse.ArgumentError from None for code in codes: - try: - ctcss = str(float(code)) - if ctcss not in CTCSS: - raise ValueError - ctcss = CTCSS.index(ctcss) - tone_codes.append(f"{ctcss:04d}") - except ValueError: - logger.error(err_msg) - raise argparse.ArgumentTypeError from None + if code.lower() == "none": + tone_codes.append("0000") # No CTCSS + else: + try: + ctcss = str(float(code)) + if ctcss not in CTCSS: + raise ValueError + ctcss = CTCSS.index(ctcss) + tone_codes.append(f"{ctcss:04d}") + except ValueError: + logger.error(err_msg) + raise argparse.ArgumentTypeError from None return tone_codes @@ -251,19 +257,22 @@ def type_dcs(parg): raise argparse.ArgumentError from None for code in codes: - if code[-1] not in ('N', 'I'): - logger.error(err_msg) - raise argparse.ArgumentError from None - - code, direction = code[:-1], code[-1] - try: - dcs = f"{int(code):03d}" - if dcs not in DCS_CODES: + if code.lower() == "none": + dcs_codes.append("0000") # No DCS + else: + if code[-1] not in ('N', 'I'): logger.error(err_msg) - raise argparse.ArgumentError - except ValueError: - raise argparse.ArgumentTypeError from None - dcs_codes.append(dcs + direction) + raise argparse.ArgumentError from None + + code, direction = code[:-1], code[-1] + try: + dcs = f"{int(code):03d}" + if dcs not in DCS_CODES: + logger.error(err_msg) + raise argparse.ArgumentError + except ValueError: + raise argparse.ArgumentTypeError from None + dcs_codes.append(dcs + direction) return dcs_codes