# HG changeset patch # User kc1ckh@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@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]; +""" + + +@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)