<html>
<head>
<meta name="generator" content="Windows Mail 17.5.9600.20689">
<style type="text/css"><!--html { font-family: "Color Emoji", "Calibri", "Segoe UI", "Meiryo", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif"; }--></style><style data-externalstyle="true"><!--
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph {
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
}
p.MsoNormal, li.MsoNormal, div.MsoNormal {
margin:0in;
margin-bottom:.0001pt;
}
p.MsoListParagraphCxSpFirst, li.MsoListParagraphCxSpFirst, div.MsoListParagraphCxSpFirst, 
p.MsoListParagraphCxSpMiddle, li.MsoListParagraphCxSpMiddle, div.MsoListParagraphCxSpMiddle, 
p.MsoListParagraphCxSpLast, li.MsoListParagraphCxSpLast, div.MsoListParagraphCxSpLast {
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
margin-bottom:.0001pt;
line-height:115%;
}
--></style></head>
<body dir="ltr">
<div data-externalstyle="false" dir="ltr" style="font-family: 'Calibri', 'Segoe UI', 'Meiryo', 'Microsoft YaHei UI', 'Microsoft JhengHei UI', 'Malgun Gothic', 'sans-serif';font-size:12pt;"><div>I'll give this a try tomorrow, but 2 questions:</div><div>From the radio standpoint, is the memory laid out as 000-999, or 1-999, then 000?</div><div>Or to put it another way - will CHIRP display the radio's 000 as 1000 or 0?<br></div><div data-signatureblock="true"><div><br></div><div>(this one is for Dan) - it looks like this replaces invalid characters with ' 'rather than truncating them.&nbsp; Is this the desired behavior?&nbsp; When I fixed a similar bug for the TH-D7, I preserved the&nbsp;existing truncation behavior&nbsp;rather than replacing with '&nbsp;‘</div><div><br></div><div>Sent from Windows Mail</div><div><br></div></div><div style="padding-top: 5px; border-top-color: rgb(229, 229, 229); border-top-width: 1px; border-top-style: solid;"><div><font face=" 'Calibri', 'Segoe UI', 'Meiryo', 'Microsoft YaHei UI', 'Microsoft JhengHei UI', 'Malgun Gothic', 'sans-serif'" style='line-height: 15pt; letter-spacing: 0.02em; font-family: "Calibri", "Segoe UI", "Meiryo", "Microsoft YaHei UI", "Microsoft JhengHei UI", "Malgun Gothic", "sans-serif"; font-size: 12pt;'><b>From:</b>&nbsp;<a href="mailto:kosta@alumni.uvic.ca" target="_parent">Kosta Arvanitis</a><br><b>Sent:</b>&nbsp;‎Saturday‎, ‎January‎ ‎10‎, ‎2015 ‎7‎:‎40‎ ‎PM<br><b>To:</b>&nbsp;<a href="mailto:chirp_devel@intrepid.danplanet.com" target="_parent">chirp_devel@intrepid.danplanet.com</a></font></div></div><div><br></div><div dir=""><div id="readingPaneBodyContent"># HG changeset patch<br># User K. Arvanitis &lt;kosta@alumni.uvic.ca&gt;<br># Date 1420442263 28800<br>#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Sun Jan 04 23:17:43 2015 -0800<br># Node ID 15c8e53a218702d708f5a018c115965dd2fdbb0c<br># Parent&nbsp; 9e67e7ba60e0fd2accd89d899735b5040da8032b<br>[FT-60] Fix Memory Bounds and Seek Offsets<br><br>This adjusts the memory bounds of the Yaesu FT-60 to include all 1000 memory channels, in addition the seek offsets were adjusted to align correctly to their appropriate memory locations.<br><br>diff -r 9e67e7ba60e0 -r 15c8e53a2187 chirp/ft60.py<br>--- a/chirp/ft60.py Sun Jan 04 23:15:45 2015 -0800<br>+++ b/chirp/ft60.py Sun Jan 04 23:17:43 2015 -0800<br>@@ -104,9 +104,31 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; flags += 0x40<br>&nbsp;&nbsp;&nbsp;&nbsp; return freqraw, flags<br>&nbsp;<br>+def _decode_name(mem):<br>+&nbsp;&nbsp;&nbsp; name = ""<br>+&nbsp;&nbsp;&nbsp; for i in mem:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if i == 0xFF:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name += CHARSET[i]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except IndexError:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Unknown char index: %i " % (i)<br>+&nbsp;&nbsp;&nbsp; return name<br>+<br>+<br>+def _encode_name(mem):<br>+&nbsp;&nbsp;&nbsp; name = [None]*6<br>+&nbsp;&nbsp;&nbsp; for i in range(0, 6):<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name[i] = CHARSET.index(mem[i]) <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except IndexError:<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; name[i] = CHARSET.index(" ")<br>+<br>+&nbsp;&nbsp;&nbsp; return name<br>+<br>&nbsp;<br>&nbsp;MEM_FORMAT = """<br>-#seekto 0x0238;<br>+#seekto 0x0248;<br>&nbsp;struct {<br>&nbsp;&nbsp; u8 used:1,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; unknown1:1,<br>@@ -129,7 +151,7 @@<br>&nbsp;} memory[1000];<br>&nbsp;<br>&nbsp;#seekto 0x6EC8;<br>-// skips:2 for Memory M in [1, 1000] is in skipflags[(M-1)/4].skip((M-1)%4).<br>+// skips:2 for Memory M in [1, 1000] is in flags[(M-1)/4].skip((M-1)%4).<br>&nbsp;// Interpret with SKIPS[].<br>&nbsp;// PMS memories L0 - U50 aka memory 1001 - 1100 don't have skip flags.<br>&nbsp;struct {<br>@@ -137,9 +159,9 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip2:2,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip1:2,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip0:2;<br>-} skipflags[250];<br>+} flags[250];<br>&nbsp;<br>-#seekto 0x4700;<br>+#seekto 0x4708;<br>&nbsp;struct {<br>&nbsp;&nbsp; u8 name[6];<br>&nbsp;&nbsp; u8 use_name:1,<br>@@ -239,7 +261,7 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp; def get_features(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rf = chirp_common.RadioFeatures()<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rf.memory_bounds = (1, 999)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rf.memory_bounds = (1, 1000)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rf.valid_duplexes = DUPLEX<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rf.valid_tmodes = TMODES<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rf.valid_power_levels = POWER_LEVELS<br>@@ -285,18 +307,16 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_raw_memory(self, number):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _array_index = number - 1<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return repr(self._memobj.memory[number]) + \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repr(self._memobj.skipflags[_array_index/4]) + \<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repr(self._memobj.names[number])<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return repr(self._memobj.memory[number - 1]) + \<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repr(self._memobj.flags[(number - 1) / 4]) + \<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; repr(self._memobj.names[number - 1])<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def get_memory(self, number):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _array_index = number - 1<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _mem = self._memobj.memory[number]<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _skp = self._memobj.skipflags[_array_index/4]<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _nam = self._memobj.names[number]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _mem = self._memobj.memory[number - 1]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _skp = self._memobj.flags[(number - 1) / 4]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _nam = self._memobj.names[number - 1]<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip = _skp["skip%i" % (_array_index%4)]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; skip = _skp["skip%i" % ((number - 1) % 4)]<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mem = chirp_common.Memory()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mem.number = number<br>@@ -320,22 +340,14 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mem.skip = SKIPS[skip]<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if _nam.use_name and _nam.valid:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in _nam.name:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if i == 0xFF:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; break<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mem.name += CHARSET[i]<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except IndexError:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "Memory %i: Unknown char index: %i " % (number, i)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mem.name = mem.name.rstrip()<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mem.name = _decode_name(_nam.name).rstrip()<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return mem<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; def set_memory(self, mem):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _array_index = mem.number - 1<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _mem = self._memobj.memory[mem.number]<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _skp = self._memobj.skipflags[_array_index/4]<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _nam = self._memobj.names[mem.number]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _mem = self._memobj.memory[mem.number - 1]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _skp = self._memobj.flags[(mem.number - 1) / 4]<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _nam = self._memobj.names[mem.number - 1]<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if mem.empty:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _mem.used = False<br>@@ -364,13 +376,8 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _mem.isam = mem.mode == "AM"<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _mem.step = STEPS.index(mem.tuning_step)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _skp["skip%i" % (_array_index%4)] = SKIPS.index(mem.skip)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _skp["skip%i" % ((mem.number - 1) % 4)] = SKIPS.index(mem.skip)<br>&nbsp;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for i in range(0, 6):<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _nam.name[i] = CHARSET.index(mem.name[i])<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; except IndexError:<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _nam.name[i] = CHARSET.index(" ")<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _nam.name = _encode_name(mem.name)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _nam.use_name = mem.name.strip() and True or False<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; _nam.valid = _nam.use_name &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br>_______________________________________________<br>chirp_devel mailing list<br>chirp_devel@intrepid.danplanet.com<br>http://intrepid.danplanet.com/mailman/listinfo/chirp_devel<br>Developer docs: http://chirp.danplanet.com/projects/chirp/wiki/Developers<br></div></div></div>
</body>
</html>