[chirp_devel] [PATCH] [AnyTone 5888UV] Add extra channel attributes
# HG changeset patch # User Brad Schuler <brad@schuler.wsmailto:brad@schuler.ws> # Date 1604820401 25200 # Sun Nov 08 00:26:41 2020 -0700 # Node ID de3e3a50889fde690f5f222375fa941b421f1d87 # Parent f13da43b1125af02a6dbc129a6e9e33760adc9a7 [AnyTone 5888UV] Add extra channel attributes
Related to issue 8407 Dependent upon earlier patch [AnyTone 5888UV] Add limited squelch mode & fix file identifier
Add the following channel attributes - Tuning steps - Duplex: off - Busy channel lockout - Optional signal selection (DTMF, 2-tone, 5-tone) - Reverse - Compander - Talkaround - PTT ID - Squelch with optional signal - Use custom CTCSS for Tx and/or Rx
diff -r f13da43b1125 -r de3e3a50889f chirp/drivers/anytone.py --- a/chirp/drivers/anytone.py Sat Nov 07 23:27:32 2020 -0700 +++ b/chirp/drivers/anytone.py Sun Nov 08 00:26:41 2020 -0700 @@ -53,12 +53,15 @@ rxinv:1, txinv:1, channel_width:2, - unknownB:2; - u8 unknown8:3, + rev:1, + txoff:1; + u8 talkaround:1, + compander:1, + unknown8:1, is_am:1, power:2, duplex:2; - u8 unknown4:4, + u8 dtmfSlotNum:4, rxtmode:2, txtmode:2; u8 unknown5:2, @@ -67,12 +70,23 @@ rxtone:6; u8 txcode; u8 rxcode; - u8 unknown7[2]; + u8 unknown10:2, + pttid:2, + unknown11:2, + bclo:2; + u8 unknown7; u8 unknown9:5, sqlMode:3; // [Carrier, CTCSS/DCS Tones, Opt Sig Only, Tones & Opt Sig, Tones or Opt Sig] - u8 unknown2[4]; + u8 unknown21:6, + optsig:2; + u8 unknown22:3, + twotone:5; + u8 unknown23:1, + fivetone:7; + u8 unknown24:4, + scramble:4; char name[7]; - u8 unknownZ[2]; + ul16 custtone; }; #seekto 0x0030; @@ -320,13 +334,22 @@ TONES = [62.5] + list(chirp_common.TONES) TMODES = ['', 'Tone', 'DTCS', ''] -DUPLEXES = ['', '-', '+', ''] +DUPLEXES = ['', '-', '+', 'off'] MODES = ["FM", "FM", "NFM"] POWER_LEVELS = [chirp_common.PowerLevel("High", watts=50), chirp_common.PowerLevel("Mid1", watts=25), chirp_common.PowerLevel("Mid2", watts=10), chirp_common.PowerLevel("Low", watts=5)] +BCLO = ['Off', 'Repeater', 'Busy'] +DTMF_SLOTS = ['M%d' % x for x in range(1, 17)] +# Chose not to expose SCRAMBLE_CODES = ['Off'] + ['%d' % x for x in range(1, 10)] + ['Define 1', 'Define 2'] +TONE2_SLOTS = ['%d' % x for x in range(0, 24)] +TONE5_SLOTS = ['%d' % x for x in range(0, 100)] SQL_MODES = ["Carrier", "CTCSS/DCS", "Opt Sig Only", "Tones AND Sig", "Tones OR Sig"] +OPT_SIG_SQL = ["Off"] + SQL_MODES[2:] +OPT_SIGS = ['Off', 'DTMF', '2Tone', '5Tone'] +PTT_IDS = ['Off', 'Begin', 'End', 'Begin & End'] +TUNING_STEPS = [2.5, 5, 6.25, 10, 12.5, 15, 20, 25, 30, 50]
@directory.register @@ -356,8 +379,8 @@ rf.has_settings = True rf.has_bank = False rf.has_cross = True - rf.valid_tuning_steps = [2.5, 5, 6.25, 10, 12.5, 15, 20, 25, 30, 50] - rf.has_tuning_step = False + rf.valid_duplexes = DUPLEXES + rf.valid_tuning_steps = TUNING_STEPS rf.has_rx_dtcs = True rf.valid_skips = ["", "S", "P"] rf.valid_modes = ["FM", "NFM", "AM"] @@ -424,6 +447,10 @@ mem.name = str(_mem.name).rstrip() mem.duplex = DUPLEXES[_mem.duplex] mem.mode = _mem.is_am and "AM" or MODES[_mem.channel_width] + mem.tuning_step = TUNING_STEPS[_mem.tune_step] + + if _mem.txoff: + mem.duplex = DUPLEXES[3] rxtone = txtone = None rxmode = TMODES[_mem.rxtmode] @@ -431,12 +458,22 @@ rxmode = TMODES.index('') txmode = TMODES[_mem.txtmode] if txmode == "Tone": - txtone = TONES[_mem.txtone] + # If custom tone is being used, show as 88.5 (and set checkbox in extras) + # Future: Improve chirp_common, so I can add "CUSTOM" into TONES + if _mem.txtone == len(TONES): + txtone = 88.5 + else: + txtone = TONES[_mem.txtone] elif txmode == "DTCS": txtone = chirp_common.ALL_DTCS_CODES[self._get_dcs_index(_mem, 'tx')] if rxmode == "Tone": - rxtone = TONES[_mem.rxtone] + # If custom tone is being used, show as 88.5 (and set checkbox in extras) + # Future: Improve chirp_common, so I can add "CUSTOM" into TONES + if _mem.rxtone == len(TONES): + rxtone = 88.5 + else: + rxtone = TONES[_mem.rxtone] elif rxmode == "DTCS": rxtone = chirp_common.ALL_DTCS_CODES[self._get_dcs_index(_mem, 'rx')] @@ -451,6 +488,53 @@ mem.skip = _flg.get_skip() and "S" or _flg.get_pskip() and "P" or "" mem.power = POWER_LEVELS[_mem.power] + mem.extra = RadioSettingGroup("Extra", "extra") + + rs = RadioSetting("rev", "Reverse", RadioSettingValueBoolean(_mem.rev)) + mem.extra.append(rs) + + rs = RadioSetting("compander", "Compander", RadioSettingValueBoolean(_mem.compander)) + mem.extra.append(rs) + + rs = RadioSetting("talkaround", "Talkaround", RadioSettingValueBoolean(_mem.talkaround)) + mem.extra.append(rs) + + rs = RadioSetting("pttid", "PTT ID", RadioSettingValueList(PTT_IDS, PTT_IDS[_mem.pttid])) + mem.extra.append(rs) + + rs = RadioSetting("bclo", "Busy Channel Lockout", RadioSettingValueList(BCLO, BCLO[_mem.bclo])) + mem.extra.append(rs) + + rs = RadioSetting("optsig", "Optional Signaling", RadioSettingValueList(OPT_SIGS, OPT_SIGS[_mem.optsig])) + mem.extra.append(rs) + + rs = RadioSetting("OPTSIGSQL", "Squelch w/Opt Signaling", RadioSettingValueList(OPT_SIG_SQL, SQL_MODES[_mem.sqlMode] if SQL_MODES[_mem.sqlMode] in OPT_SIG_SQL else "Off")) + mem.extra.append(rs) + + rs = RadioSetting("dtmfSlotNum", "DTMF", RadioSettingValueList(DTMF_SLOTS, DTMF_SLOTS[_mem.dtmfSlotNum])) + mem.extra.append(rs) + + rs = RadioSetting("twotone", "2-Tone", RadioSettingValueList(TONE2_SLOTS, TONE2_SLOTS[_mem.twotone])) + mem.extra.append(rs) + + rs = RadioSetting("fivetone", "5-Tone", RadioSettingValueList(TONE5_SLOTS, TONE5_SLOTS[_mem.fivetone])) + mem.extra.append(rs) + + # Chose not to expose scramble + # rs = RadioSetting("scramble", "Scrambler Switch", RadioSettingValueList(SCRAMBLE_CODES, SCRAMBLE_CODES[_mem.scramble])) + # mem.extra.append(rs) + + # Memory properties dialog is only capable of Boolean and List RadioSettingValue classes, so cannot configure it + # rs = RadioSetting("custtone", "Custom CTCSS", RadioSettingValueFloat(min(TONES), max(TONES), _mem.custtone and _mem.custtone / 10 or 151.1, 0.1, 1)) + # mem.extra.append(rs) + custToneStr = chirp_common.format_freq(_mem.custtone) + + rs = RadioSetting("CUSTTONETX", "Use Custom CTCSS (%s) for Tx" % custToneStr, RadioSettingValueBoolean(_mem.txtone == len(TONES))) + mem.extra.append(rs) + + rs = RadioSetting("CUSTTONERX", "Use Custom CTCSS (%s) for Rx" % custToneStr, RadioSettingValueBoolean(_mem.rxtone == len(TONES))) + mem.extra.append(rs) + return mem def set_memory(self, mem): @@ -465,7 +549,13 @@ _mem.offset = mem.offset / 100 _mem.name = mem.name.ljust(7) _mem.is_am = mem.mode == "AM" - _mem.duplex = DUPLEXES.index(mem.duplex) + _mem.tune_step = TUNING_STEPS.index(mem.tuning_step) + if mem.duplex == "off": + _mem.duplex = DUPLEXES.index("") + _mem.txoff = 1 + else: + _mem.duplex = DUPLEXES.index(mem.duplex) + _mem.txoff = 0 try: _mem.channel_width = MODES.index(mem.mode) @@ -503,6 +593,25 @@ else: _mem.power = 0 + for setting in mem.extra: + if setting.get_name() == "ignore": + LOG.debug("*** ignore: %s" % str(setting.value)) + # Future: elif setting.get_name() == "custtone": + # Future: setattr(_mem, "custtone", setting.value.get_value() * 10) + elif setting.get_name() == "OPTSIGSQL": + if str(setting.value) != "Off": + _mem.sqlMode = SQL_MODES.index(str(setting.value)) + elif setting.get_name() == "CUSTTONETX": + if setting.value: + _mem.txtone = len(TONES) + elif setting.get_name() == "CUSTTONERX": + if setting.value: + _mem.rxtone = len(TONES) + else: + setattr(_mem, setting.get_name(), setting.value) + + return mem + def get_settings(self): _settings = self._memobj.settings basic = RadioSettingGroup("basic", "Basic")
participants (1)
-
Brad & Cindy Schuler