<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal"># HG changeset patch<o:p></o:p></p>
<p class="MsoNormal"># User Brad Schuler <<a href="mailto:brad@schuler.ws">brad@schuler.ws</a>><o:p></o:p></p>
<p class="MsoNormal"># Date 1604820401 25200<o:p></o:p></p>
<p class="MsoNormal"># Sun Nov 08 00:26:41 2020 -0700<o:p></o:p></p>
<p class="MsoNormal"># Node ID de3e3a50889fde690f5f222375fa941b421f1d87<o:p></o:p></p>
<p class="MsoNormal"># Parent f13da43b1125af02a6dbc129a6e9e33760adc9a7<o:p></o:p></p>
<p class="MsoNormal">[AnyTone 5888UV] Add extra channel attributes<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Related to issue 8407<o:p></o:p></p>
<p class="MsoNormal">Dependent upon earlier patch [AnyTone 5888UV] Add limited squelch mode & fix file identifier<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Add the following channel attributes<o:p></o:p></p>
<p class="MsoNormal">- Tuning steps<o:p></o:p></p>
<p class="MsoNormal">- Duplex: off<o:p></o:p></p>
<p class="MsoNormal">- Busy channel lockout<o:p></o:p></p>
<p class="MsoNormal">- Optional signal selection (DTMF, 2-tone, 5-tone)<o:p></o:p></p>
<p class="MsoNormal">- Reverse<o:p></o:p></p>
<p class="MsoNormal">- Compander<o:p></o:p></p>
<p class="MsoNormal">- Talkaround<o:p></o:p></p>
<p class="MsoNormal">- PTT ID<o:p></o:p></p>
<p class="MsoNormal">- Squelch with optional signal<o:p></o:p></p>
<p class="MsoNormal">- Use custom CTCSS for Tx and/or Rx<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">diff -r f13da43b1125 -r de3e3a50889f chirp/drivers/anytone.py<o:p></o:p></p>
<p class="MsoNormal">--- a/chirp/drivers/anytone.py Sat Nov 07 23:27:32 2020 -0700<o:p></o:p></p>
<p class="MsoNormal">+++ b/chirp/drivers/anytone.py Sun Nov 08 00:26:41 2020 -0700<o:p></o:p></p>
<p class="MsoNormal">@@ -53,12 +53,15 @@<o:p></o:p></p>
<p class="MsoNormal"> rxinv:1,<o:p></o:p></p>
<p class="MsoNormal"> txinv:1,<o:p></o:p></p>
<p class="MsoNormal"> channel_width:2,<o:p></o:p></p>
<p class="MsoNormal">- unknownB:2;<o:p></o:p></p>
<p class="MsoNormal">- u8 unknown8:3,<o:p></o:p></p>
<p class="MsoNormal">+ rev:1,<o:p></o:p></p>
<p class="MsoNormal">+ txoff:1;<o:p></o:p></p>
<p class="MsoNormal">+ u8 talkaround:1,<o:p></o:p></p>
<p class="MsoNormal">+ compander:1,<o:p></o:p></p>
<p class="MsoNormal">+ unknown8:1,<o:p></o:p></p>
<p class="MsoNormal"> is_am:1,<o:p></o:p></p>
<p class="MsoNormal"> power:2,<o:p></o:p></p>
<p class="MsoNormal"> duplex:2;<o:p></o:p></p>
<p class="MsoNormal">- u8 unknown4:4,<o:p></o:p></p>
<p class="MsoNormal">+ u8 dtmfSlotNum:4,<o:p></o:p></p>
<p class="MsoNormal"> rxtmode:2,<o:p></o:p></p>
<p class="MsoNormal"> txtmode:2;<o:p></o:p></p>
<p class="MsoNormal"> u8 unknown5:2,<o:p></o:p></p>
<p class="MsoNormal">@@ -67,12 +70,23 @@<o:p></o:p></p>
<p class="MsoNormal"> rxtone:6;<o:p></o:p></p>
<p class="MsoNormal"> u8 txcode;<o:p></o:p></p>
<p class="MsoNormal"> u8 rxcode;<o:p></o:p></p>
<p class="MsoNormal">- u8 unknown7[2];<o:p></o:p></p>
<p class="MsoNormal">+ u8 unknown10:2,<o:p></o:p></p>
<p class="MsoNormal">+ pttid:2,<o:p></o:p></p>
<p class="MsoNormal">+ unknown11:2,<o:p></o:p></p>
<p class="MsoNormal">+ bclo:2;<o:p></o:p></p>
<p class="MsoNormal">+ u8 unknown7;<o:p></o:p></p>
<p class="MsoNormal"> u8 unknown9:5,<o:p></o:p></p>
<p class="MsoNormal"> sqlMode:3; // [Carrier, CTCSS/DCS Tones, Opt Sig Only, Tones & Opt Sig, Tones or Opt Sig]<o:p></o:p></p>
<p class="MsoNormal">- u8 unknown2[4];<o:p></o:p></p>
<p class="MsoNormal">+ u8 unknown21:6,<o:p></o:p></p>
<p class="MsoNormal">+ optsig:2;<o:p></o:p></p>
<p class="MsoNormal">+ u8 unknown22:3,<o:p></o:p></p>
<p class="MsoNormal">+ twotone:5;<o:p></o:p></p>
<p class="MsoNormal">+ u8 unknown23:1,<o:p></o:p></p>
<p class="MsoNormal">+ fivetone:7;<o:p></o:p></p>
<p class="MsoNormal">+ u8 unknown24:4,<o:p></o:p></p>
<p class="MsoNormal">+ scramble:4;<o:p></o:p></p>
<p class="MsoNormal"> char name[7];<o:p></o:p></p>
<p class="MsoNormal">- u8 unknownZ[2];<o:p></o:p></p>
<p class="MsoNormal">+ ul16 custtone;<o:p></o:p></p>
<p class="MsoNormal">};<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> #seekto 0x0030;<o:p></o:p></p>
<p class="MsoNormal">@@ -320,13 +334,22 @@<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> TONES = [62.5] + list(chirp_common.TONES)<o:p></o:p></p>
<p class="MsoNormal">TMODES = ['', 'Tone', 'DTCS', '']<o:p></o:p></p>
<p class="MsoNormal">-DUPLEXES = ['', '-', '+', '']<o:p></o:p></p>
<p class="MsoNormal">+DUPLEXES = ['', '-', '+', 'off']<o:p></o:p></p>
<p class="MsoNormal">MODES = ["FM", "FM", "NFM"]<o:p></o:p></p>
<p class="MsoNormal">POWER_LEVELS = [chirp_common.PowerLevel("High", watts=50),<o:p></o:p></p>
<p class="MsoNormal"> chirp_common.PowerLevel("Mid1", watts=25),<o:p></o:p></p>
<p class="MsoNormal"> chirp_common.PowerLevel("Mid2", watts=10),<o:p></o:p></p>
<p class="MsoNormal"> chirp_common.PowerLevel("Low", watts=5)]<o:p></o:p></p>
<p class="MsoNormal">+BCLO = ['Off', 'Repeater', 'Busy']<o:p></o:p></p>
<p class="MsoNormal">+DTMF_SLOTS = ['M%d' % x for x in range(1, 17)]<o:p></o:p></p>
<p class="MsoNormal">+# Chose not to expose SCRAMBLE_CODES = ['Off'] + ['%d' % x for x in range(1, 10)] + ['Define 1', 'Define 2']<o:p></o:p></p>
<p class="MsoNormal">+TONE2_SLOTS = ['%d' % x for x in range(0, 24)]<o:p></o:p></p>
<p class="MsoNormal">+TONE5_SLOTS = ['%d' % x for x in range(0, 100)]<o:p></o:p></p>
<p class="MsoNormal">SQL_MODES = ["Carrier", "CTCSS/DCS", "Opt Sig Only", "Tones AND Sig", "Tones OR Sig"]<o:p></o:p></p>
<p class="MsoNormal">+OPT_SIG_SQL = ["Off"] + SQL_MODES[2:]<o:p></o:p></p>
<p class="MsoNormal">+OPT_SIGS = ['Off', 'DTMF', '2Tone', '5Tone']<o:p></o:p></p>
<p class="MsoNormal">+PTT_IDS = ['Off', 'Begin', 'End', 'Begin & End']<o:p></o:p></p>
<p class="MsoNormal">+TUNING_STEPS = [2.5, 5, 6.25, 10, 12.5, 15, 20, 25, 30, 50]<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> @directory.register<o:p></o:p></p>
<p class="MsoNormal">@@ -356,8 +379,8 @@<o:p></o:p></p>
<p class="MsoNormal"> rf.has_settings = True<o:p></o:p></p>
<p class="MsoNormal"> rf.has_bank = False<o:p></o:p></p>
<p class="MsoNormal"> rf.has_cross = True<o:p></o:p></p>
<p class="MsoNormal">- rf.valid_tuning_steps = [2.5, 5, 6.25, 10, 12.5, 15, 20, 25, 30, 50]<o:p></o:p></p>
<p class="MsoNormal">- rf.has_tuning_step = False<o:p></o:p></p>
<p class="MsoNormal">+ rf.valid_duplexes = DUPLEXES<o:p></o:p></p>
<p class="MsoNormal">+ rf.valid_tuning_steps = TUNING_STEPS<o:p></o:p></p>
<p class="MsoNormal"> rf.has_rx_dtcs = True<o:p></o:p></p>
<p class="MsoNormal"> rf.valid_skips = ["", "S", "P"]<o:p></o:p></p>
<p class="MsoNormal"> rf.valid_modes = ["FM", "NFM", "AM"]<o:p></o:p></p>
<p class="MsoNormal">@@ -424,6 +447,10 @@<o:p></o:p></p>
<p class="MsoNormal"> mem.name = str(_mem.name).rstrip()<o:p></o:p></p>
<p class="MsoNormal"> mem.duplex = DUPLEXES[_mem.duplex]<o:p></o:p></p>
<p class="MsoNormal"> mem.mode = _mem.is_am and "AM" or MODES[_mem.channel_width]<o:p></o:p></p>
<p class="MsoNormal">+ mem.tuning_step = TUNING_STEPS[_mem.tune_step]<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ if _mem.txoff:<o:p></o:p></p>
<p class="MsoNormal">+ mem.duplex = DUPLEXES[3]<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> rxtone = txtone = None<o:p></o:p></p>
<p class="MsoNormal"> rxmode = TMODES[_mem.rxtmode]<o:p></o:p></p>
<p class="MsoNormal">@@ -431,12 +458,22 @@<o:p></o:p></p>
<p class="MsoNormal"> rxmode = TMODES.index('')<o:p></o:p></p>
<p class="MsoNormal"> txmode = TMODES[_mem.txtmode]<o:p></o:p></p>
<p class="MsoNormal"> if txmode == "Tone":<o:p></o:p></p>
<p class="MsoNormal">- txtone = TONES[_mem.txtone]<o:p></o:p></p>
<p class="MsoNormal">+ # If custom tone is being used, show as 88.5 (and set checkbox in extras)<o:p></o:p></p>
<p class="MsoNormal">+ # Future: Improve chirp_common, so I can add "CUSTOM" into TONES<o:p></o:p></p>
<p class="MsoNormal">+ if _mem.txtone == len(TONES):<o:p></o:p></p>
<p class="MsoNormal">+ txtone = 88.5<o:p></o:p></p>
<p class="MsoNormal">+ else:<o:p></o:p></p>
<p class="MsoNormal">+ txtone = TONES[_mem.txtone]<o:p></o:p></p>
<p class="MsoNormal"> elif txmode == "DTCS":<o:p></o:p></p>
<p class="MsoNormal"> txtone = chirp_common.ALL_DTCS_CODES[self._get_dcs_index(_mem,<o:p></o:p></p>
<p class="MsoNormal"> 'tx')]<o:p></o:p></p>
<p class="MsoNormal"> if rxmode == "Tone":<o:p></o:p></p>
<p class="MsoNormal">- rxtone = TONES[_mem.rxtone]<o:p></o:p></p>
<p class="MsoNormal">+ # If custom tone is being used, show as 88.5 (and set checkbox in extras)<o:p></o:p></p>
<p class="MsoNormal">+ # Future: Improve chirp_common, so I can add "CUSTOM" into TONES<o:p></o:p></p>
<p class="MsoNormal">+ if _mem.rxtone == len(TONES):<o:p></o:p></p>
<p class="MsoNormal">+ rxtone = 88.5<o:p></o:p></p>
<p class="MsoNormal">+ else:<o:p></o:p></p>
<p class="MsoNormal">+ rxtone = TONES[_mem.rxtone]<o:p></o:p></p>
<p class="MsoNormal"> elif rxmode == "DTCS":<o:p></o:p></p>
<p class="MsoNormal"> rxtone = chirp_common.ALL_DTCS_CODES[self._get_dcs_index(_mem,<o:p></o:p></p>
<p class="MsoNormal"> 'rx')]<o:p></o:p></p>
<p class="MsoNormal">@@ -451,6 +488,53 @@<o:p></o:p></p>
<p class="MsoNormal"> mem.skip = _flg.get_skip() and "S" or _flg.get_pskip() and "P" or ""<o:p></o:p></p>
<p class="MsoNormal"> mem.power = POWER_LEVELS[_mem.power]<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+ mem.extra = RadioSettingGroup("Extra", "extra")<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("rev", "Reverse", RadioSettingValueBoolean(_mem.rev))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("compander", "Compander", RadioSettingValueBoolean(_mem.compander))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("talkaround", "Talkaround", RadioSettingValueBoolean(_mem.talkaround))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("pttid", "PTT ID", RadioSettingValueList(PTT_IDS, PTT_IDS[_mem.pttid]))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("bclo", "Busy Channel Lockout", RadioSettingValueList(BCLO, BCLO[_mem.bclo]))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("optsig", "Optional Signaling", RadioSettingValueList(OPT_SIGS, OPT_SIGS[_mem.optsig]))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ 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"))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("dtmfSlotNum", "DTMF", RadioSettingValueList(DTMF_SLOTS, DTMF_SLOTS[_mem.dtmfSlotNum]))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("twotone", "2-Tone", RadioSettingValueList(TONE2_SLOTS, TONE2_SLOTS[_mem.twotone]))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("fivetone", "5-Tone", RadioSettingValueList(TONE5_SLOTS, TONE5_SLOTS[_mem.fivetone]))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ # Chose not to expose scramble<o:p></o:p></p>
<p class="MsoNormal">+ # rs = RadioSetting("scramble", "Scrambler Switch", RadioSettingValueList(SCRAMBLE_CODES, SCRAMBLE_CODES[_mem.scramble]))<o:p></o:p></p>
<p class="MsoNormal">+ # mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ # Memory properties dialog is only capable of Boolean and List RadioSettingValue classes, so cannot configure it<o:p></o:p></p>
<p class="MsoNormal">+ # rs = RadioSetting("custtone", "Custom CTCSS", RadioSettingValueFloat(min(TONES), max(TONES), _mem.custtone and _mem.custtone / 10 or 151.1, 0.1, 1))<o:p></o:p></p>
<p class="MsoNormal">+ # mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+ custToneStr = chirp_common.format_freq(_mem.custtone)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("CUSTTONETX", "Use Custom CTCSS (%s) for Tx" % custToneStr, RadioSettingValueBoolean(_mem.txtone == len(TONES)))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ rs = RadioSetting("CUSTTONERX", "Use Custom CTCSS (%s) for Rx" % custToneStr, RadioSettingValueBoolean(_mem.rxtone == len(TONES)))<o:p></o:p></p>
<p class="MsoNormal">+ mem.extra.append(rs)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal"> return mem<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> def set_memory(self, mem):<o:p></o:p></p>
<p class="MsoNormal">@@ -465,7 +549,13 @@<o:p></o:p></p>
<p class="MsoNormal"> _mem.offset = mem.offset / 100<o:p></o:p></p>
<p class="MsoNormal"> _mem.name = mem.name.ljust(7)<o:p></o:p></p>
<p class="MsoNormal"> _mem.is_am = mem.mode == "AM"<o:p></o:p></p>
<p class="MsoNormal">- _mem.duplex = DUPLEXES.index(mem.duplex)<o:p></o:p></p>
<p class="MsoNormal">+ _mem.tune_step = TUNING_STEPS.index(mem.tuning_step)<o:p></o:p></p>
<p class="MsoNormal">+ if mem.duplex == "off":<o:p></o:p></p>
<p class="MsoNormal">+ _mem.duplex = DUPLEXES.index("")<o:p></o:p></p>
<p class="MsoNormal">+ _mem.txoff = 1<o:p></o:p></p>
<p class="MsoNormal">+ else:<o:p></o:p></p>
<p class="MsoNormal">+ _mem.duplex = DUPLEXES.index(mem.duplex)<o:p></o:p></p>
<p class="MsoNormal">+ _mem.txoff = 0<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal"> try:<o:p></o:p></p>
<p class="MsoNormal"> _mem.channel_width = MODES.index(mem.mode)<o:p></o:p></p>
<p class="MsoNormal">@@ -503,6 +593,25 @@<o:p></o:p></p>
<p class="MsoNormal"> else:<o:p></o:p></p>
<p class="MsoNormal"> _mem.power = 0<o:p></o:p></p>
<p class="MsoNormal"><o:p></o:p></p>
<p class="MsoNormal">+ for setting in mem.extra:<o:p></o:p></p>
<p class="MsoNormal">+ if setting.get_name() == "ignore":<o:p></o:p></p>
<p class="MsoNormal">+ LOG.debug("*** ignore: %s" % str(setting.value))<o:p></o:p></p>
<p class="MsoNormal">+ # Future: elif setting.get_name() == "custtone":<o:p></o:p></p>
<p class="MsoNormal">+ # Future: setattr(_mem, "custtone", setting.value.get_value() * 10)<o:p></o:p></p>
<p class="MsoNormal">+ elif setting.get_name() == "OPTSIGSQL":<o:p></o:p></p>
<p class="MsoNormal">+ if str(setting.value) != "Off":<o:p></o:p></p>
<p class="MsoNormal">+ _mem.sqlMode = SQL_MODES.index(str(setting.value))<o:p></o:p></p>
<p class="MsoNormal">+ elif setting.get_name() == "CUSTTONETX":<o:p></o:p></p>
<p class="MsoNormal">+ if setting.value:<o:p></o:p></p>
<p class="MsoNormal">+ _mem.txtone = len(TONES)<o:p></o:p></p>
<p class="MsoNormal">+ elif setting.get_name() == "CUSTTONERX":<o:p></o:p></p>
<p class="MsoNormal">+ if setting.value:<o:p></o:p></p>
<p class="MsoNormal">+ _mem.rxtone = len(TONES)<o:p></o:p></p>
<p class="MsoNormal">+ else:<o:p></o:p></p>
<p class="MsoNormal">+ setattr(_mem, setting.get_name(), setting.value)<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal">+ return mem<o:p></o:p></p>
<p class="MsoNormal">+<o:p></o:p></p>
<p class="MsoNormal"> def get_settings(self):<o:p></o:p></p>
<p class="MsoNormal"> _settings = self._memobj.settings<o:p></o:p></p>
<p class="MsoNormal"> basic = RadioSettingGroup("basic", "Basic")<o:p></o:p></p>
</div>
</body>
</html>