[chirp_devel] [PATCH] [ID-31] Fix for Skip/PSkip Issue with cetain Icom Radios (#2787)

Eric Dropps
Sun Oct 11 10:04:44 PDT 2015


# HG changeset patch
# User kc1ckh at arrl.net
# Date 1444583063 14400
#      Sun Oct 11 13:04:23 2015 -0400
# Node ID 50127447a0cda31521761f42ff646f1bfdceb7b3
# Parent  a4eba5650b19692607ddb3cb3561a3d8acfe69ba
[ID-31] Fix for Skip/PSkip Issue with cetain Icom Radios (#2787)

diff -r a4eba5650b19 -r 50127447a0cd chirp/drivers/id31.py
--- a/chirp/drivers/id31.py	Wed Jul 01 10:14:53 2015 -0700
+++ b/chirp/drivers/id31.py	Sun Oct 11 13:04:23 2015 -0400
@@ -254,7 +254,7 @@
 
         if _psk & bit:
             mem.skip = "P"
-        if _skp & bit:
+        elif _skp & bit:
             mem.skip = "S"
 
         return mem
@@ -297,7 +297,7 @@
             _skp |= bit
             _psk &= ~bit
         elif memory.skip == "P":
-            _skp &= ~bit
+            _skp |= bit
             _psk |= bit
         else:
             _skp &= ~bit
diff -r a4eba5650b19 -r 50127447a0cd chirp/drivers/id51plus.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/drivers/id51plus.py	Sun Oct 11 13:04:23 2015 -0400
@@ -0,0 +1,152 @@
+# Copyright 2012 Dan Smith <dsmith at danplanet.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from chirp.drivers import id31
+from chirp import directory, bitwise
+
+MEM_FORMAT = """
+struct {
+  u24 freq;
+  u16 offset;
+  u16 rtone:6,
+      ctone:6,
+      unknown2:1,
+      mode:3;
+  u8 dtcs;
+  u8 tune_step:4,
+     unknown5:4;
+  u8 unknown4;
+  u8 tmode:4,
+     duplex:2,
+     dtcs_polarity:2;
+  char name[16];
+  u8 unknown13;
+  u8 urcall[7];
+  u8 rpt1call[7];
+  u8 rpt2call[7];
+} memory[500];
+
+#seekto 0x6A40;
+u8 used_flags[70];
+
+#seekto 0x6A86;
+u8 skip_flags[69];
+
+#seekto 0x6ACB;
+u8 pskp_flags[69];
+
+#seekto 0x6B40;
+struct {
+  u8 bank;
+  u8 index;
+} banks[500];
+
+#seekto 0x6FD0;
+struct {
+  char name[16];
+} bank_names[26];
+
+
+#seekto 0xA8C0;
+struct {
+  u24 freq;
+  u16 offset; 
+  u8 unknown1[4];
+  u8 call[7];
+  char name[16];
+  char subname[8];
+  u8 unknown3[10];
+} repeaters[750];
+
+#seekto 0x1384E;
+struct {
+  u8 call[7];
+} rptcall[750];
+
+#seekto 0x14FBE;
+struct {
+ char name[16];
+} rptgroup_names[30];
+
+#seekto 0x1519E;
+struct {
+  char call[8];
+  char tag[4];
+} mycall[6];
+
+#seekto 0x151E6;
+struct {
+  char call[8];
+} urcall[200];
+
+#seekto 0x15826;
+struct {
+  char name[16];
+} urcallname[200];
+"""
+
+
+ at directory.register
+class ID51PLUSRadio(id31.ID31Radio):
+    """Icom ID-51 Plus"""
+    MODEL = "ID-51A Plus"
+
+    _memsize = 0x1FB40
+    _model = "\x33\x90\x00\x02"
+    _endframe = "Icom Inc\x2E\x44\x41"
+
+    _ranges = [(0x00000, 0x1FB40, 32)]
+
+    MODES = {0: "FM", 1: "NFM", 3: "AM", 5: "DV"}
+
+    def _get_bank(self, loc):
+        _bank = self._memobj.banks[loc]
+        if _bank.bank == 0x1F:
+            return None
+        elif _bank.bank > 0x1F:
+            # Sometime the bank is 32(dec) higher, don't know why
+            return (_bank.bank - 32)
+        else:
+            return _bank.bank
+
+    def _set_bank(self, loc, bank):
+        _bank = self._memobj.banks[loc]
+        if bank is None:
+            _bank.bank = 0x1F
+        else:
+            _bank.bank = bank
+
+    def get_features(self):
+        rf = super(ID51PLUSRadio, self).get_features()
+        rf.valid_bands = [(108000000, 174000000), (400000000, 479000000)]
+        return rf
+
+    def get_repeater_call_list(self):
+        calls = []
+        # Unlike previos DStar radios, there is not a seperate repeater callsign list.
+        # It's only the DV Memory banks.
+        #for rptcall in self._memobj.rptcall:
+        #    call = _decode_call(rptcall.call)
+        #    if call.rstrip() and not call == "CALLSIGN":
+        #        calls.append(call)
+        for repeater in self._memobj.repeaters:
+            call = id31._decode_call(repeater.call)
+            if call == "CALLSIGN":
+                call = ""
+            calls.append(call.rstrip())
+        return calls
+
+    def process_mmap(self):
+        self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)



More information about the chirp_devel mailing list