<div dir="ltr"><span class="gmail-im">&gt; +    &quot;-&gt;Tone&quot;: (&quot;R-TONE&quot;, None),<br>
<br></span>
I had a question about this in the previous patch.<span class="gmail-im"><br>
<br>
&gt; +    &quot;Tone-&gt;Tone&quot;: (&quot;TSQL&quot;, None)<br></span><div><span class="gmail-im">
&gt; +    }</span></div><div><span class="gmail-im"><br></span></div><div><span class="gmail-im">These are two mappings from the CHIRP definitions to the Yaesu definitions. Yaesu uses &quot;TSQL&quot; to mean &quot;send and receive ctcss tones,</span></div><div><span class="gmail-im">and the toned do jot need to be identical. thus we must map to &quot;Yaesu TSQL&quot; on both cases. I chose to use the name &quot;TSQL&quot; for to this</span></div><div><span class="gmail-im">Yaseu value because it&#39;s in the Yasu documentation and it&#39;s what you see on the radio&#39;s screen. I could have renamed it in the ptyhon</span></div><div><span class="gmail-im">code, but the other drivers seem to adhere to the manufacturer&#39;s documentation.</span></div><div><span class="gmail-im"><br></span></div><div><span class="gmail-im">Sinmilarly, Yaesu &quot;R-TONE&quot; is the name for &quot;don&#39;t send a tone, but do receive a tone.&quot;  The Yaseu name for reverse polarity tone squelch is &quot;REV TN&quot;.</span></div><div><span class="gmail-im"><br></span></div><div><span class="gmail-im"><br></span></div><div><span class="gmail-im">About the use of a single table: I have been thinking about that a lot. It&#39;s not really a trivial problem, but I think that may be a reasonable solution.</span></div><div><span class="gmail-im">the underlying problem is that an abstract radio can perform some or all of 15 combinations of tone handling. :</span></div><div><span class="gmail-im">    Tx (none, ctcss,dcs) x Rx (none, ctcss,dcs,ctcss-R, dcs-R)</span></div><div><span class="gmail-im">and of these two two are split (ctcss==, ctcss!=) and (dcs==, dcs!=). The CHIRP mem structure uses two fields to represent this and each</span></div><div><span class="gmail-im">radio uses its own strange multi-field encoding.</span></div><div><span class="gmail-im"><br></span></div><div><span class="gmail-im">To complicate this, I originally thought that the CHIRP unit tests require that we preserve tone fields even some cases where a given</span></div><div><span class="gmail-im">tone field is clearly a &quot;don&#39;t care&quot; as far as the radio is concerned. This is a burden on the code and on the approach we must take.<br></span></div><div><span class="gmail-im">I now think I was not quite right about this,and it turns out that could simply not put any value into the mem structure for these cases.<br></span></div><div><span class="gmail-im"><br></span></div><div><span class="gmail-im">None of the other drives I looked at even attempt to create an explicit two-way mapping. Instead, they they use one if-test chain for encode and</span></div><div><span class="gmail-im">a second if-test chain for decode.  When I originally wrote my code by example, I simply converted each of these if-chains into a separate table.<br></span></div><div><span class="gmail-im">The code has substantially different requirements for the two tables, so Idon&#39;t think that there is a single table that is both comprehensible and</span></div><div><span class="gmail-im">has simple lookups for both  directions. a simplified table will complicate the code. I&#39;ll give this another try today.<br></span></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Feb 28, 2019 at 7:12 AM Dan Smith via chirp_devel &lt;<a href="mailto:chirp_devel@intrepid.danplanet.com">chirp_devel@intrepid.danplanet.com</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">&gt; @@ -217,7 +216,7 @@<br>
&gt;     return sum(x for x in bytearray(data)) &amp; 0xFF<br>
&gt; <br>
&gt; <br>
&gt; -def variable_len_resp(pipe):<br>
&gt; +def variable_len_resp(pipe, cmd):<br>
&gt;     &quot;&quot;&quot;<br>
&gt;     when length of expected reply is not known, read byte at a time<br>
&gt;     until the ack character is found.<br>
&gt; @@ -233,8 +232,11 @@<br>
&gt;             response += b<br>
&gt;             i += 1<br>
&gt;             if i &gt; toolong:<br>
&gt; -                LOG.debug(&quot;Response too long. got&quot; + util.hexprint(response))<br>
&gt; -                raise errors.RadioError(&quot;Response too long.&quot;)<br>
&gt; +                msg = &quot;received too many bytes from radio before ACK. &quot;<br>
&gt; +                msg += &quot;Sent &quot; + util.hexprint(cmd)<br>
&gt; +                msg += &quot;. Got &quot; + util.hexprint(response)<br>
&gt; +                LOG.debug(msg)<br>
&gt; +                raise errors.RadioError(msg)<br>
<br>
Heh, okay, I see I jumped the gun here. However, hexprinted debug is way too much info to show to the user too. Somewhere in the middle please. I&#39;m sure I&#39;m seeming overly picky here, but we have some variety in the error messages that people get since they&#39;re all defined by the deep internals of the drivers, so I&#39;m trying to steer this somewhere towards the center.<br>
<br>
I can also change this up to be what I think it should be (like the examples I gave earlier) if you want.<br>
<br>
&gt; +# map a  CHIRP tone mode to a FT-4 sql and which if any code to set to 0.<br>
&gt; +# The keys are provided to RadioFeatures as a list, so these are the<br>
&gt; +# only values we expect to see in mem.tmode. This map as the identical<br>
&gt; +# structure as the one below to simplify the code. It permits stricter<br>
&gt; +# zeroing of the unused fields later if we find that it is needed,<br>
&gt; +# but the CHIRP unit tests want us to leave them alone.<br>
&gt; +MODES_TONE = {<br>
&gt; +    &quot;&quot;:       (&quot;off&quot;,  None),<br>
&gt; +    &quot;Tone&quot;:   (&quot;T-TONE&quot;, None),        # chirp means &quot;xmit, not rcv&quot;<br>
&gt; +    &quot;TSQL&quot;:   (&quot;TSQL&quot;, None),          # chirp means &quot;xmit and rcv, tx==rx&quot;<br>
&gt; +    &quot;DTCS&quot;:   (&quot;DCS&quot;,  None),          # chirp means &quot;xmt and rcv, tx==rx&quot;<br>
&gt; +    &quot;TSQL-R&quot;: (&quot;REV-TN&quot;, None),        # chirp means reverse R-Tone<br>
&gt; +    &quot;Cross&quot;:  ()                       # not used in lookup, needed in list<br>
&gt; +    }<br>
&gt; +<br>
&gt; +# Map a CHIRP Cross type if the CHIRP mem.tmode is &quot;Cross&quot;. The keys<br>
&gt; +# are provided to RadioFeatures as a list, so these are the<br>
&gt; +# only values we expect to see in mem.cross.<br>
&gt; +MODES_CROSS = {<br>
&gt; +    &quot;DTCS-&gt;&quot;: (&quot;DCS&quot;, &quot;rx_dcs&quot;),<br>
&gt; +    &quot;-&gt;DTCS&quot;: (&quot;DCS&quot;, &quot;tx_dcs&quot;),<br>
&gt; +    &quot;DTCS-&gt;DTCS&quot;: (&quot;DCS&quot;, None),<br>
&gt; +    &quot;-&gt;Tone&quot;: (&quot;R-TONE&quot;, None),<br>
<br>
I had a question about this in the previous patch.<br>
<br>
&gt; +    &quot;Tone-&gt;Tone&quot;: (&quot;TSQL&quot;, None)<br>
&gt; +    }<br>
<br>
Tone-&gt;Tone is only for when the tones are different, which is not what TSQL means...<br>
<br>
&gt;     # names for the setmode function for the programmable keys. Mode zero means<br>
&gt;     # that the key is programmed for a memory not a setmode.<br>
&gt;     SETMODES = [<br>
&gt; -        &quot;mem&quot;, &quot;apo&quot;, &quot;ar bep&quot;, &quot;ar int&quot;, &quot;beclo&quot;,              #00-04<br>
&gt; -        &quot;beep&quot;, &quot;bell&quot;, &quot;cw id&quot;, &quot;cw wrt&quot;, &quot;dc vlt&quot;,            #05-09<br>
&gt; -        &quot;dcs cod&quot;, &quot;dt dly&quot;, &quot;dt set&quot;, &quot;dtc spd&quot;, &quot;edg.bep&quot;,    #10-14<br>
&gt; -        &quot;lamp&quot;, &quot;led.bsy&quot;, &quot;led.tx&quot;, &quot;lock&quot;, &quot;m/t-cl&quot;,          #15-19<br>
&gt; -        &quot;mem.del&quot;, &quot;mem.tag&quot;, &quot;pag.abk&quot;, &quot;pag.cdr&quot;, &quot;pag.cdt&quot;,  #20-24<br>
&gt; -        &quot;pri.rvt&quot;, &quot;pswd&quot;, &quot;pswdwt&quot;, &quot;rf sql&quot;, &quot;rpt.ars&quot;,       #25-29<br>
&gt; -        &quot;rpt.frq&quot;, &quot;rpt.sft&quot;, &quot;rxsave&quot;, &quot;scn.lmp&quot;, &quot;scn.rsm&quot;,   #30-34<br>
&gt; -        &quot;skip&quot;, &quot;sql.typ&quot;, &quot;step&quot;, &quot;tn frq&quot;, &quot;tot&quot;,             #35-39<br>
&gt; -        &quot;tx pwr&quot;, &quot;tx save&quot;, &quot;vfo.spl&quot;, &quot;vox&quot;, &quot;wfm.rcv&quot;,       #40-44<br>
&gt; -        &quot;w/n.dev&quot;, &quot;wx.alert&quot;                                   #45-46<br>
&gt; +        &quot;mem&quot;, &quot;apo&quot;, &quot;ar bep&quot;, &quot;ar int&quot;, &quot;beclo&quot;,              # 00-04<br>
&gt; +        &quot;beep&quot;, &quot;bell&quot;, &quot;cw id&quot;, &quot;cw wrt&quot;, &quot;dc vlt&quot;,            # 05-09<br>
&gt; +        &quot;dcs cod&quot;, &quot;dt dly&quot;, &quot;dt set&quot;, &quot;dtc spd&quot;, &quot;edg.bep&quot;,    # 10-14<br>
&gt; +        &quot;lamp&quot;, &quot;led.bsy&quot;, &quot;led.tx&quot;, &quot;lock&quot;, &quot;m/t-cl&quot;,          # 15-19<br>
&gt; +        &quot;mem.del&quot;, &quot;mem.tag&quot;, &quot;pag.abk&quot;, &quot;pag.cdr&quot;, &quot;pag.cdt&quot;,  # 20-24<br>
&gt; +        &quot;pri.rvt&quot;, &quot;pswd&quot;, &quot;pswdwt&quot;, &quot;rf sql&quot;, &quot;rpt.ars&quot;,       # 25-29<br>
&gt; +        &quot;rpt.frq&quot;, &quot;rpt.sft&quot;, &quot;rxsave&quot;, &quot;scn.lmp&quot;, &quot;scn.rsm&quot;,   # 30-34<br>
&gt; +        &quot;skip&quot;, &quot;sql.typ&quot;, &quot;step&quot;, &quot;tn frq&quot;, &quot;tot&quot;,             # 35-39<br>
&gt; +        &quot;tx pwr&quot;, &quot;tx save&quot;, &quot;vfo.spl&quot;, &quot;vox&quot;, &quot;wfm.rcv&quot;,       # 40-44<br>
&gt; +        &quot;w/n.dev&quot;, &quot;wx.alert&quot;                                   # 45-46<br>
<br>
Did this change or did you just reformat it? What about the other copy of this you have in the file?<br>
<br>
&gt; class YaesuFT65Radio(YaesuSC35GenericRadio):<br>
&gt; @@ -1052,9 +1070,9 @@<br>
&gt;     MAX_MEM_SLOT = 200<br>
&gt;     Pkeys = 4     # number of programmable keys on the FT-65<br>
&gt;     namelen = 8   # length of the mem name display on the FT-65 front panel<br>
&gt; -    id_str=b&#39;IH-420\x00\x00\x00V100\x00\x00&#39;<br>
&gt; +    id_str = b&#39;IH-420\x00\x00\x00V100\x00\x00&#39;<br>
&gt;     legal_steps = list(STEP_CODE)<br>
&gt; -    legal_steps.remove(6.25)       #should not remove if euro version<br>
&gt; +    legal_steps.remove(6.25)       # should not remove if euro version<br>
&gt;     # names for the setmode function for the programmable keys. Mode zero means<br>
&gt;     # that the key is programmed for a memory not a setmode.<br>
&gt;     SETMODES = [<br>
&gt; @@ -1063,10 +1081,10 @@<br>
&gt;         &quot;dc volt&quot;, &quot;dcs code&quot;, &quot;dtmf set&quot;, &quot;dtmf wrt&quot;, &quot;edg bep&quot;,  # 10-14<br>
&gt;         &quot;key lock&quot;, &quot;lamp&quot;, &quot;ledbsy&quot;, &quot;mem del&quot;, &quot;mon/t-cl&quot;,       # 15-19<br>
&gt;         &quot;name tag&quot;, &quot;pager&quot;, &quot;password&quot;, &quot;pri.rvt&quot;, &quot;repeater&quot;,    # 20-24<br>
&gt; -        &quot;resume&quot;, &quot;rf.sql&quot;, &quot;scn.lamp&quot;, &quot;skip&quot;, &quot;sql type&quot;,        # 25-29 <br>
&gt; +        &quot;resume&quot;, &quot;rf.sql&quot;, &quot;scn.lamp&quot;, &quot;skip&quot;, &quot;sql type&quot;,        # 25-29<br>
&gt;         &quot;step&quot;, &quot;tot&quot;, &quot;tx pwr&quot;, &quot;tx save&quot;, &quot;vfo.spl&quot;,             # 30-34<br>
&gt;         &quot;vox&quot;, &quot;wfm.rcv&quot;, &quot;wide/nar&quot;, &quot;wx alert&quot;, &quot;scramble&quot;       # 35-39<br>
&gt;         ]<br>
&gt; +<br>
&gt;     def __init__(self):<br>
&gt;         self.add_paramdesc(&quot;misc&quot;, (&quot;compander&quot;, &quot;Compander&quot;, [&quot;ON&quot;, &quot;OFF&quot;]))<br>
&gt; -<br>
<br>
Looks like some whitespace changes jumped in here :)<br>
<br>
I&#39;ve applied the first four in this set and would like to see some discussion of the previous items I have before we proceed on this one.<br>
<br>
I snuck a change in between these to add ft4.py to the cpep8.manifest so that style checks always run on the file, and it looks like there are still a bunch of offenses in there. Maybe we can get that fixed up shortly in follow-up?<br>
<br>
Thanks!<br>
<br>
--Dan<br>
<br>
_______________________________________________<br>
chirp_devel mailing list<br>
<a href="mailto:chirp_devel@intrepid.danplanet.com" target="_blank">chirp_devel@intrepid.danplanet.com</a><br>
<a href="http://intrepid.danplanet.com/mailman/listinfo/chirp_devel" rel="noreferrer" target="_blank">http://intrepid.danplanet.com/mailman/listinfo/chirp_devel</a><br>
Developer docs: <a href="http://chirp.danplanet.com/projects/chirp/wiki/Developers" rel="noreferrer" target="_blank">http://chirp.danplanet.com/projects/chirp/wiki/Developers</a><br>
</blockquote></div>