Developers
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
February 2016
- 13 participants
- 29 discussions
[chirp_devel] [PATCH] [RFC] Abstract Bank and BankModel to MemoryMapping and MappingModel
by Dan Smith 24 Aug '16
by Dan Smith 24 Aug '16
24 Aug '16
# HG changeset patch
# User Dan Smith <dsmith(a)danplanet.com>
# Date 1364678018 25200
# Node ID bf1c92a33bfd4c730dcc49095ff9a737b30c33c0
# Parent ede5a4ccfd6efbaed4883c86d93be92509fde8da
[RFC] Abstract Bank and BankModel to MemoryMapping and MappingModel
This is mostly just a search-and-replace for the above names, but makes
way for supporting things like scan lists that behave exactly the same
way.
diff -r ede5a4ccfd6e -r bf1c92a33bfd chirp/chirp_common.py
--- a/chirp/chirp_common.py Sat Mar 30 13:51:51 2013 -0700
+++ b/chirp/chirp_common.py Sat Mar 30 14:13:38 2013 -0700
@@ -543,8 +543,8 @@
except Exception:
self.dv_code = 0
-class Bank:
- """Base class for a radio's Bank"""
+class MemoryMapping(object):
+ """Base class for a memory mapping"""
def __init__(self, model, index, name):
self._model = model
self._index = index
@@ -554,76 +554,84 @@
return self.get_name()
def __repr__(self):
- return "Bank-%s" % self._index
+ return "%s-%s" % (self.__class__.__name__, self._index)
def get_name(self):
- """Returns the static or user-adjustable bank name"""
+ """Returns the mapping name"""
return self._name
def get_index(self):
- """Returns the immutable bank index (string or int)"""
+ """Returns the immutable index (string or int)"""
return self._index
def __eq__(self, other):
return self.get_index() == other.get_index()
+class MappingModel(object):
+ """Base class for a memory mapping model"""
+
+ def __init__(self, radio):
+ self._radio = radio
+
+ def get_num_mappings(self):
+ """Returns the number of mappings in the model (should be
+ callable without consulting the radio"""
+ raise NotImplementedError()
+
+ def get_mappings(self):
+ """Return a list of mappings"""
+ raise NotImplementedError()
+
+ def add_memory_to_mapping(self, memory, mapping):
+ """Add @memory to @mapping."""
+ raise NotImplementedError()
+
+ def remove_memory_from_mapping(self, memory, mapping):
+ """Remove @memory from @mapping.
+ Shall raise exception if @memory is not in @bank"""
+ raise NotImplementedError()
+
+ def get_mapping_memories(self, mapping):
+ """Return a list of memories in @mapping"""
+ raise NotImplementedError()
+
+ def get_memory_mappings(self, memory):
+ """Return a list of mappings that @memory is in"""
+ raise NotImplementedError()
+
+class Bank(MemoryMapping):
+ """Base class for a radio's Bank"""
+ pass
+
class NamedBank(Bank):
"""A bank that can have a name"""
def set_name(self, name):
"""Changes the user-adjustable bank name"""
self._name = name
-class BankModel:
+class BankModel(MappingModel):
"""A bank model where one memory is in zero or one banks at any point"""
- def __init__(self, radio):
- self._radio = radio
+ pass
- def get_num_banks(self):
- """Returns the number of banks (should be callable without
- consulting the radio"""
+class MappingModelIndexInterface:
+ """Interface for mappings with index capabilities"""
+ def get_index_bounds(self):
+ """Returns a tuple (lo,hi) of the min and max mapping indices"""
raise Exception("Not implemented")
- def get_banks(self):
- """Return a list of banks"""
+ def get_memory_index(self, memory, mapping):
+ """Returns the index of @memory in @mapping"""
raise Exception("Not implemented")
- def add_memory_to_bank(self, memory, bank):
- """Add @memory to @bank."""
+ def set_memory_index(self, memory, mapping, index):
+ """Sets the index of @memory in @mapping to @index"""
raise Exception("Not implemented")
- def remove_memory_from_bank(self, memory, bank):
- """Remove @memory from @bank.
- Shall raise exception if @memory is not in @bank."""
- raise Exception("Not implemented")
-
- def get_bank_memories(self, bank):
- """Return a list of memories in @bank"""
- raise Exception("Not implemented")
-
- def get_memory_banks(self, memory):
- """Returns a list of the banks that @memory is in"""
- raise Exception("Not implemented")
-
-class BankIndexInterface:
- """Interface for banks with index capabilities"""
- def get_index_bounds(self):
- """Returns a tuple (lo,hi) of the minimum and maximum bank indices"""
- raise Exception("Not implemented")
-
- def get_memory_index(self, memory, bank):
- """Returns the index of @memory in @bank"""
- raise Exception("Not implemented")
-
- def set_memory_index(self, memory, bank, index):
- """Sets the index of @memory in @bank to @index"""
- raise Exception("Not implemented")
-
- def get_next_bank_index(self, bank):
- """Returns the next available bank index in @bank, or raises
+ def get_next_mapping_index(self, mapping):
+ """Returns the next available mapping index in @mapping, or raises
Exception if full"""
raise Exception("Not implemented")
-
class MTOBankModel(BankModel):
"""A bank model where one memory can be in multiple banks at once """
pass
diff -r ede5a4ccfd6e -r bf1c92a33bfd chirp/ft7800.py
--- a/chirp/ft7800.py Sat Mar 30 13:51:51 2013 -0700
+++ b/chirp/ft7800.py Sat Mar 30 14:13:38 2013 -0700
@@ -336,7 +336,7 @@
class FT7800BankModel(chirp_common.BankModel):
"""Yaesu FT-7800/7900 bank model"""
def __init__(self, radio):
- chirp_common.BankModel.__init__(self, radio)
+ super(FT7800BankModel, self).__init__(radio)
self.__b2m_cache = defaultdict(list)
self.__m2b_cache = defaultdict(list)
@@ -344,24 +344,24 @@
if self.__b2m_cache:
return
- for bank in self.get_banks():
+ for bank in self.get_mappings():
self.__b2m_cache[bank.index] = self._get_bank_memories(bank)
for memnum in self.__b2m_cache[bank.index]:
self.__m2b_cache[memnum].append(bank.index)
- def get_num_banks(self):
+ def get_num_mappings(self):
return 20
- def get_banks(self):
+ def get_mappings(self):
banks = []
- for i in range(0, self.get_num_banks()):
+ for i in range(0, self.get_num_mappings()):
bank = chirp_common.Bank(self, "%i" % i, "BANK-%i" % (i + 1))
bank.index = i
banks.append(bank)
return banks
- def add_memory_to_bank(self, memory, bank):
+ def add_memory_to_mapping(self, memory, bank):
self.__precache()
index = memory.number - 1
@@ -371,7 +371,7 @@
self.__m2b_cache[memory.number].append(bank.index)
self.__b2m_cache[bank.index].append(memory.number)
- def remove_memory_from_bank(self, memory, bank):
+ def remove_memory_from_mapping(self, memory, bank):
self.__precache()
index = memory.number - 1
@@ -395,16 +395,16 @@
memories.append(i + 1)
return memories
- def get_bank_memories(self, bank):
+ def get_mapping_memories(self, bank):
self.__precache()
return [self._radio.get_memory(n)
for n in self.__b2m_cache[bank.index]]
- def get_memory_banks(self, memory):
+ def get_memory_mappings(self, memory):
self.__precache()
- _banks = self.get_banks()
+ _banks = self.get_mappings()
return [_banks[b] for b in self.__m2b_cache[memory.number]]
@directory.register
@@ -473,7 +473,7 @@
"""
class FT8800BankModel(FT7800BankModel):
- def get_num_banks(self):
+ def get_num_mappings(self):
return 10
@directory.register
diff -r ede5a4ccfd6e -r bf1c92a33bfd chirp/icf.py
--- a/chirp/icf.py Sat Mar 30 13:51:51 2013 -0700
+++ b/chirp/icf.py Sat Mar 30 14:13:38 2013 -0700
@@ -485,10 +485,10 @@
central implementation can, with a few icom-specific radio interfaces
serve most/all of them"""
- def get_num_banks(self):
+ def get_num_mappings(self):
return self._radio._num_banks
- def get_banks(self):
+ def get_mappings(self):
banks = []
for i in range(0, self._radio._num_banks):
@@ -498,31 +498,32 @@
banks.append(bank)
return banks
- def add_memory_to_bank(self, memory, bank):
+ def add_memory_to_mapping(self, memory, bank):
self._radio._set_bank(memory.number, bank.index)
- def remove_memory_from_bank(self, memory, bank):
+ def remove_memory_from_mapping(self, memory, bank):
if self._radio._get_bank(memory.number) != bank.index:
raise Exception("Memory %i not in bank %s. Cannot remove." % \
(memory.number, bank))
self._radio._set_bank(memory.number, None)
- def get_bank_memories(self, bank):
+ def get_bank_mappings(self, bank):
memories = []
for i in range(*self._radio.get_features().memory_bounds):
if self._radio._get_bank(i) == bank.index:
memories.append(self._radio.get_memory(i))
return memories
- def get_memory_banks(self, memory):
+ def get_memory_mappings(self, memory):
index = self._radio._get_bank(memory.number)
if index is None:
return []
else:
- return [self.get_banks()[index]]
+ return [self.get_mappings()[index]]
-class IcomIndexedBankModel(IcomBankModel, chirp_common.BankIndexInterface):
+class IcomIndexedBankModel(IcomBankModel,
+ chirp_common.MappingModelIndexInterface):
"""Generic bank model for Icom radios with indexed banks"""
def get_index_bounds(self):
return self._radio._bank_index_bounds
@@ -531,7 +532,7 @@
return self._radio._get_bank_index(memory.number)
def set_memory_index(self, memory, bank, index):
- if bank not in self.get_memory_banks(memory):
+ if bank not in self.get_memory_mappings(memory):
raise Exception("Memory %i is not in bank %s" % (memory.number,
bank))
@@ -539,7 +540,7 @@
raise Exception("Invalid index")
self._radio._set_bank_index(memory.number, index)
- def get_next_bank_index(self, bank):
+ def get_next_mapping_index(self, bank):
indexes = []
for i in range(*self._radio.get_features().memory_bounds):
if self._radio._get_bank(i) == bank.index:
diff -r ede5a4ccfd6e -r bf1c92a33bfd chirp/vx3.py
--- a/chirp/vx3.py Sat Mar 30 13:51:51 2013 -0700
+++ b/chirp/vx3.py Sat Mar 30 14:13:38 2013 -0700
@@ -110,10 +110,10 @@
class VX3BankModel(chirp_common.BankModel):
"""A VX-3 bank model"""
- def get_num_banks(self):
+ def get_num_mappings(self):
return 24
- def get_banks(self):
+ def get_mappings(self):
_banks = self._radio._memobj.bank_names
banks = []
diff -r ede5a4ccfd6e -r bf1c92a33bfd chirp/vx5.py
--- a/chirp/vx5.py Sat Mar 30 13:51:51 2013 -0700
+++ b/chirp/vx5.py Sat Mar 30 14:13:38 2013 -0700
@@ -82,18 +82,18 @@
chirp_common.PowerLevel("L1", watts=0.05)]
class VX5BankModel(chirp_common.BankModel):
- def get_num_banks(self):
+ def get_num_mappings(self):
return 5
- def get_banks(self):
+ def get_mappings(self):
banks = []
- for i in range(0, self.get_num_banks()):
+ for i in range(0, self.get_num_mappings()):
bank = chirp_common.Bank(self, "%i" % (i+1), "MG%i" % (i+1))
bank.index = i
banks.append(bank)
return banks
- def add_memory_to_bank(self, memory, bank):
+ def add_memory_to_mapping(self, memory, bank):
_members = self._radio._memobj.bank_groups[bank.index].members
_bank_used = self._radio._memobj.bank_used[bank.index]
for i in range(0, len(_members)):
@@ -107,7 +107,7 @@
return True
raise Exception(_("{bank} is full").format(bank=bank))
- def remove_memory_from_bank(self, memory, bank):
+ def remove_memory_from_mapping(self, memory, bank):
_members = self._radio._memobj.bank_groups[bank.index].members
_bank_used = self._radio._memobj.bank_used[bank.index]
@@ -128,7 +128,7 @@
if not remaining_members:
_bank_used.current_member = 0xFF
- def get_bank_memories(self, bank):
+ def get_mapping_memories(self, bank):
memories = []
_members = self._radio._memobj.bank_groups[bank.index].members
@@ -143,10 +143,11 @@
memories.append(self._radio.get_memory(member.channel+1))
return memories
- def get_memory_banks(self, memory):
+ def get_memory_mappings(self, memory):
banks = []
- for bank in self.get_banks():
- if memory.number in [x.number for x in self.get_bank_memories(bank)]:
+ for bank in self.get_mappings():
+ if memory.number in [x.number for x in
+ self.get_mapping_memories(bank)]:
banks.append(bank)
return banks
diff -r ede5a4ccfd6e -r bf1c92a33bfd chirp/vx7.py
--- a/chirp/vx7.py Sat Mar 30 13:51:51 2013 -0700
+++ b/chirp/vx7.py Sat Mar 30 14:13:38 2013 -0700
@@ -103,18 +103,18 @@
class VX7BankModel(chirp_common.BankModel):
"""A VX-7 Bank model"""
- def get_num_banks(self):
+ def get_num_mappings(self):
return 9
- def get_banks(self):
+ def get_mappings(self):
banks = []
- for i in range(0, self.get_num_banks()):
+ for i in range(0, self.get_num_mappings()):
bank = chirp_common.Bank(self, "%i" % (i+1), "MG%i" % (i+1))
bank.index = i
banks.append(bank)
return banks
- def add_memory_to_bank(self, memory, bank):
+ def add_memory_to_mapping(self, memory, bank):
_members = self._radio._memobj.bank_members[bank.index]
_bank_used = self._radio._memobj.bank_used[bank.index]
for i in range(0, 48):
@@ -123,7 +123,7 @@
_bank_used.in_use = 0x0000
break
- def remove_memory_from_bank(self, memory, bank):
+ def remove_memory_from_mapping(self, memory, bank):
_members = self._radio._memobj.bank_members[bank.index].members
_bank_used = self._radio._memobj.bank_used[bank.index]
@@ -143,7 +143,7 @@
if not remaining_members:
_bank_used.in_use = 0xFFFF
- def get_bank_memories(self, bank):
+ def get_mapping_memories(self, bank):
memories = []
_members = self._radio._memobj.bank_members[bank.index].members
@@ -158,11 +158,11 @@
memories.append(self._radio.get_memory(number+1))
return memories
- def get_memory_banks(self, memory):
+ def get_memory_mappings(self, memory):
banks = []
- for bank in self.get_banks():
+ for bank in self.get_mappings():
if memory.number in [x.number for x in
- self.get_bank_memories(bank)]:
+ self.get_mapping_memories(bank)]:
banks.append(bank)
return banks
diff -r ede5a4ccfd6e -r bf1c92a33bfd chirp/vx8.py
--- a/chirp/vx8.py Sat Mar 30 13:51:51 2013 -0700
+++ b/chirp/vx8.py Sat Mar 30 14:13:38 2013 -0700
@@ -151,10 +151,10 @@
class VX8BankModel(chirp_common.BankModel):
"""A VX-8 bank model"""
- def get_num_banks(self):
+ def get_num_mappings(self):
return 24
- def get_banks(self):
+ def get_mappings(self):
banks = []
_banks = self._radio._memobj.bank_info
@@ -174,7 +174,7 @@
flags = self._radio._memobj.flag
# Find a suitable bank and MR for VFO A and B.
- for bank in self.get_banks():
+ for bank in self.get_mappings():
bank_used = self._radio._memobj.bank_used[bank.index]
if bank_used != 0xFFFF:
members = self._radio._memobj.bank_members[bank.index]
@@ -213,7 +213,7 @@
vfo_bak.mr_index = vfo.mr_index
vfo_bak.bank_enable = vfo.bank_enable
- def add_memory_to_bank(self, memory, bank):
+ def add_memory_to_mapping(self, memory, bank):
_members = self._radio._memobj.bank_members[bank.index]
_bank_used = self._radio._memobj.bank_used[bank.index]
for i in range(0, 100):
@@ -224,7 +224,7 @@
self.update_vfo()
- def remove_memory_from_bank(self, memory, bank):
+ def remove_memory_from_mapping(self, memory, bank):
_members = self._radio._memobj.bank_members[bank.index]
_bank_used = self._radio._memobj.bank_used[bank.index]
@@ -246,7 +246,7 @@
self.update_vfo()
- def get_bank_memories(self, bank):
+ def get_mapping_memories(self, bank):
memories = []
_members = self._radio._memobj.bank_members[bank.index]
_bank_used = self._radio._memobj.bank_used[bank.index]
@@ -260,11 +260,11 @@
return memories
- def get_memory_banks(self, memory):
+ def get_memory_mappings(self, memory):
banks = []
- for bank in self.get_banks():
+ for bank in self.get_mappings():
if memory.number in \
- [x.number for x in self.get_bank_memories(bank)]:
+ [x.number for x in self.get_mapping_memories(bank)]:
banks.append(bank)
return banks
diff -r ede5a4ccfd6e -r bf1c92a33bfd chirpui/bankedit.py
--- a/chirpui/bankedit.py Sat Mar 30 13:51:51 2013 -0700
+++ b/chirpui/bankedit.py Sat Mar 30 14:13:38 2013 -0700
@@ -22,68 +22,70 @@
from chirp import chirp_common
from chirpui import common, miscwidgets
-class BankNamesJob(common.RadioJob):
- def __init__(self, bm, editor, cb):
+class MappingNamesJob(common.RadioJob):
+ def __init__(self, model, editor, cb):
common.RadioJob.__init__(self, cb, None)
- self.__bm = bm
+ self.__model = model
self.__editor = editor
def execute(self, radio):
- self.__editor.banks = []
+ self.__editor.mappings = []
- banks = self.__bm.get_banks()
- for bank in banks:
- self.__editor.banks.append((bank, bank.get_name()))
+ mappings = self.__model.get_mappings()
+ for mapping in mappings:
+ self.__editor.mappings.append((mapping, mapping.get_name()))
gobject.idle_add(self.cb, *self.cb_args)
-class BankNameEditor(common.Editor):
+class MappingNameEditor(common.Editor):
+ TYPE = _("Mapping")
+
def refresh(self):
- def got_banks():
+ def got_mappings():
self._keys = []
- for bank, name in self.banks:
- self._keys.append(bank.get_index())
- self.listw.set_item(bank.get_index(),
- bank.get_index(),
+ for mapping, name in self.mappings:
+ self._keys.append(mapping.get_index())
+ self.listw.set_item(mapping.get_index(),
+ mapping.get_index(),
name)
- self.listw.connect("item-set", self.bank_changed)
+ self.listw.connect("item-set", self.mapping_changed)
- job = BankNamesJob(self._bm, self, got_banks)
- job.set_desc(_("Retrieving bank information"))
+ job = MappingNamesJob(self._model, self, got_mappings)
+ job.set_desc(_("Retrieving %s information") % self.TYPE)
self.rthread.submit(job)
- def get_bank_list(self):
- banks = []
+ def get_mapping_list(self):
+ mappings = []
keys = self.listw.get_keys()
for key in keys:
- banks.append(self.listw.get_item(key)[2])
+ mappings.append(self.listw.get_item(key)[2])
- return banks
-
- def bank_changed(self, listw, key):
+ return mappings
+
+ def mapping_changed(self, listw, key):
def cb(*args):
self.emit("changed")
name = self.listw.get_item(key)[2]
- bank, oldname = self.banks[self._keys.index(key)]
+ mapping, oldname = self.mappings[self._keys.index(key)]
def trigger_changed(*args):
self.emit("changed")
job = common.RadioJob(trigger_changed, "set_name", name)
- job.set_target(bank)
- job.set_desc(_("Setting name on bank"))
+ job.set_target(mapping)
+ job.set_desc(_("Setting name on %s") % self.TYPE.lower())
self.rthread.submit(job)
return True
- def __init__(self, rthread):
- super(BankNameEditor, self).__init__(rthread)
- self._bm = rthread.radio.get_bank_model()
+ def __init__(self, rthread, model):
+ super(MappingNameEditor, self).__init__(rthread)
+ self._model = model
types = [(gobject.TYPE_STRING, "key"),
- (gobject.TYPE_STRING, _("Bank")),
+ (gobject.TYPE_STRING, self.TYPE),
(gobject.TYPE_STRING, _("Name"))]
self.listw = miscwidgets.KeyedListWidget(types)
@@ -92,7 +94,7 @@
self.listw.set_sort_column(1, -1)
self.listw.show()
- self.banks = []
+ self.mappings = []
sw = gtk.ScrolledWindow()
sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
@@ -108,51 +110,61 @@
self.refresh()
self._loaded = True
-class MemoryBanksJob(common.RadioJob):
- def __init__(self, bm, cb, number):
+class BankNameEditor(MappingNameEditor):
+ TYPE = _("Bank")
+
+ def __init__(self, rthread):
+ model = rthread.radio.get_bank_model()
+ super(BankNameEditor, self).__init__(rthread, model)
+
+class MemoryMappingsJob(common.RadioJob):
+ def __init__(self, model, cb, number):
common.RadioJob.__init__(self, cb, None)
- self.__bm = bm
+ self.__model = model
self.__number = number
def execute(self, radio):
mem = radio.get_memory(self.__number)
if mem.empty:
- banks = []
+ mappings = []
indexes = []
else:
- banks = self.__bm.get_memory_banks(mem)
+ mappings = self.__model.get_memory_mappings(mem)
indexes = []
- if isinstance(self.__bm, chirp_common.BankIndexInterface):
- for bank in banks:
- indexes.append(self.__bm.get_memory_index(mem, bank))
- self.cb(mem, banks, indexes, *self.cb_args)
+ if isinstance(self.__model,
+ chirp_common.MappingModelIndexInterface):
+ for mapping in mappings:
+ indexes.append(self.__model.get_memory_index(mem, mapping))
+ self.cb(mem, mappings, indexes, *self.cb_args)
-class BankMembershipEditor(common.Editor):
+class MappingMembershipEditor(common.Editor):
+ TYPE = _("Mapping")
+
def _number_to_path(self, number):
return (number - self._rf.memory_bounds[0],)
- def _get_next_bank_index(self, bank):
- # NB: Only works for one-to-one bank models right now!
+ def _get_next_mapping_index(self, mapping):
+ # NB: Only works for one-to-one models right now!
iter = self._store.get_iter_first()
indexes = []
- ncols = len(self._cols) + len(self.banks)
+ ncols = len(self._cols) + len(self.mappings)
while iter:
vals = self._store.get(iter, *tuple([n for n in range(0, ncols)]))
loc = vals[self.C_LOC]
index = vals[self.C_INDEX]
- banks = vals[self.C_BANKS:]
- if True in banks and banks.index(True) == bank:
+ mappings = vals[self.C_MAPPINGS:]
+ if True in mappings and mappings.index(True) == mapping:
indexes.append(index)
iter = self._store.iter_next(iter)
- index_bounds = self._bm.get_index_bounds()
+ index_bounds = self._model.get_index_bounds()
num_indexes = index_bounds[1] - index_bounds[0]
indexes.sort()
for i in range(0, num_indexes):
if i not in indexes:
return i + index_bounds[0] # In case not zero-origin index
- return 0 # If the bank is full, just wrap around!
+ return 0 # If the mapping is full, just wrap around!
def _toggled_cb(self, rend, path, colnum):
try:
@@ -164,56 +176,60 @@
if not self._store.get(iter, self.C_FILLED)[0]:
return
- # The bank index is the column number, minus the 3 label columns
- bank, name = self.banks[colnum - len(self._cols)]
+ # The mapping index is the column number, minus the 3 label columns
+ mapping, name = self.mappings[colnum - len(self._cols)]
loc, = self._store.get(self._store.get_iter(path), self.C_LOC)
+ is_indexed = isinstance(self._model,
+ chirp_common.MappingModelIndexInterface)
+
if rend.get_active():
# Changing from True to False
- fn = "remove_memory_from_bank"
+ fn = "remove_memory_from_mapping"
index = None
else:
# Changing from False to True
- fn = "add_memory_to_bank"
- if self._rf.has_bank_index:
- index = self._get_next_bank_index(colnum - len(self._cols))
+ fn = "add_memory_to_mapping"
+ if is_indexed:
+ index = self._get_next_mapping_index(colnum - len(self._cols))
else:
index = None
def do_refresh_memory(*args):
- # Step 2: Update our notion of the memory's bank information
+ # Step 2: Update our notion of the memory's mapping information
self.refresh_memory(loc)
- def do_bank_index(result, memory):
+ def do_mapping_index(result, memory):
if isinstance(result, Exception):
- common.show_error("Failed to add {mem} to bank: {err}"
+ common.show_error("Failed to add {mem} to mapping: {err}"
.format(mem=memory.number,
err=str(result)),
parent=self.editorset.parent_window)
return
self.emit("changed")
- # Step 3: Set the memory's bank index (maybe)
- if not self._rf.has_bank_index or index is None:
+ # Step 3: Set the memory's mapping index (maybe)
+ if not is_indexed or index is None:
return do_refresh_memory()
job = common.RadioJob(do_refresh_memory,
- "set_memory_index", memory, bank, index)
- job.set_target(self._bm)
- job.set_desc(_("Updating bank index "
- "for memory {num}").format(num=memory.number))
+ "set_memory_index", memory, mapping, index)
+ job.set_target(self._model)
+ job.set_desc(_("Updating {type} index "
+ "for memory {num}").format(type=self.TYPE,
+ num=memory.number))
self.rthread.submit(job)
- def do_bank_adjustment(memory):
- # Step 1: Do the bank add/remove
- job = common.RadioJob(do_bank_index, fn, memory, bank)
- job.set_target(self._bm)
+ def do_mapping_adjustment(memory):
+ # Step 1: Do the mapping add/remove
+ job = common.RadioJob(do_mapping_index, fn, memory, mapping)
+ job.set_target(self._model)
job.set_cb_args(memory)
- job.set_desc(_("Updating bank information "
+ job.set_desc(_("Updating mapping information "
"for memory {num}").format(num=memory.number))
self.rthread.submit(job)
# Step 0: Fetch the memory
- job = common.RadioJob(do_bank_adjustment, "get_memory", loc)
+ job = common.RadioJob(do_mapping_adjustment, "get_memory", loc)
job.set_desc(_("Getting memory {num}").format(num=loc))
self.rthread.submit(job)
@@ -223,36 +239,37 @@
def refresh_memory(*args):
self.refresh_memory(loc)
- def set_index(banks, memory):
+ def set_index(mappings, memory):
self.emit("changed")
# Step 2: Set the index
job = common.RadioJob(refresh_memory, "set_memory_index",
- memory, banks[0], int(new))
- job.set_target(self._bm)
+ memory, mappings[0], int(new))
+ job.set_target(self._model)
job.set_desc(_("Setting index "
"for memory {num}").format(num=memory.number))
self.rthread.submit(job)
- def get_bank(memory):
- # Step 1: Get the first/only bank
- job = common.RadioJob(set_index, "get_memory_banks", memory)
+ def get_mapping(memory):
+ # Step 1: Get the first/only mapping
+ job = common.RadioJob(set_index, "get_memory_mappings", memory)
job.set_cb_args(memory)
- job.set_target(self._bm)
- job.set_desc(_("Getting bank for "
- "memory {num}").format(num=memory.number))
+ job.set_target(self._model)
+ job.set_desc(_("Getting {type} for "
+ "memory {num}").format(type=self.TYPE,
+ num=memory.number))
self.rthread.submit(job)
# Step 0: Get the memory
- job = common.RadioJob(get_bank, "get_memory", loc)
+ job = common.RadioJob(get_mapping, "get_memory", loc)
job.set_desc(_("Getting memory {num}").format(num=loc))
self.rthread.submit(job)
- def __init__(self, rthread, editorset):
- super(BankMembershipEditor, self).__init__(rthread)
+ def __init__(self, rthread, editorset, model):
+ super(MappingMembershipEditor, self).__init__(rthread)
self.editorset = editorset
self._rf = rthread.radio.get_features()
- self._bm = rthread.radio.get_bank_model()
+ self._model = model
self._view_cols = [
(_("Loc"), TYPE_INT, gtk.CellRendererText, ),
@@ -270,19 +287,22 @@
self.C_FREQ = 2
self.C_NAME = 3
self.C_INDEX = 4
- self.C_BANKS = 5 # and beyond
+ self.C_MAPPINGS = 5 # and beyond
cols = list(self._cols)
self._index_cache = []
- for i in range(0, self._bm.get_num_banks()):
- label = "Bank %i" % (i+1)
+ for i in range(0, self._model.get_num_mappings()):
+ label = "%s %i" % (self.TYPE, (i+1))
cols.append((label, TYPE_BOOLEAN, gtk.CellRendererToggle))
self._store = gtk.ListStore(*tuple([y for x,y,z in cols]))
self._view = gtk.TreeView(self._store)
+ is_indexed = isinstance(self._model,
+ chirp_common.MappingModelIndexInterface)
+
colnum = 0
for label, dtype, rtype in cols:
if not rtype:
@@ -305,7 +325,7 @@
elif colnum == self.C_INDEX:
rend.set_property("editable", True)
rend.connect("edited", self._index_edited_cb)
- col.set_visible(self._rf.has_bank_index)
+ col.set_visible(is_indexed)
colnum += 1
# A non-rendered column to absorb extra space in the row
@@ -329,7 +349,7 @@
self._loaded = False
def refresh_memory(self, number):
- def got_mem(memory, banks, indexes):
+ def got_mem(memory, mappings, indexes):
iter = self._store.get_iter(self._number_to_path(memory.number))
row = [self.C_FILLED, not memory.empty,
self.C_LOC, memory.number,
@@ -338,29 +358,30 @@
# Hack for only one index right now
self.C_INDEX, indexes and indexes[0] or 0,
]
- for i in range(0, len(self.banks)):
+ for i in range(0, len(self.mappings)):
row.append(i + len(self._cols))
- row.append(self.banks[i][0] in banks)
+ row.append(self.mappings[i][0] in mappings)
self._store.set(iter, *tuple(row))
if memory.number == self._rf.memory_bounds[1] - 1:
- print "Got all bank info in %s" % (time.time() - self._start)
+ print "Got all %s info in %s" % (self.TYPE,
+ (time.time() - self._start))
- job = MemoryBanksJob(self._bm, got_mem, number)
- job.set_desc(_("Getting bank information "
- "for memory {num}").format(num=number))
+ job = MemoryMappingsJob(self._model, got_mem, number)
+ job.set_desc(_("Getting {type} information "
+ "for memory {num}").format(type=self.TYPE, num=number))
self.rthread.submit(job)
def refresh_all_memories(self):
for i in range(*self._rf.memory_bounds):
self.refresh_memory(i)
- def refresh_banks(self, and_memories=False):
- def got_banks():
+ def refresh_mappings(self, and_memories=False):
+ def got_mappings():
for i in range(len(self._cols) - len(self._view_cols) - 1,
- len(self.banks)):
+ len(self.mappings)):
col = self._view.get_column(i + len(self._view_cols))
- bank, name = self.banks[i]
+ mapping, name = self.mappings[i]
if name:
col.set_title(name)
else:
@@ -368,8 +389,8 @@
if and_memories:
self.refresh_all_memories()
- job = BankNamesJob(self._bm, self, got_banks)
- job.set_desc(_("Getting bank information"))
+ job = MappingNamesJob(self._model, self, got_mappings)
+ job.set_desc(_("Getting %s information") % self.TYPE)
self.rthread.submit(job)
def focus(self):
@@ -378,7 +399,7 @@
return
self._start = time.time()
- self.refresh_banks(True)
+ self.refresh_mappings(True)
self._loaded = True
@@ -387,5 +408,15 @@
if self.is_focused():
self.refresh_all_memories()
+ def mappings_changed(self):
+ self.refresh_mappings()
+
+class BankMembershipEditor(MappingMembershipEditor):
+ TYPE = _("Bank")
+
+ def __init__(self, rthread, editorset):
+ model = rthread.radio.get_bank_model()
+ super(BankMembershipEditor, self).__init__(rthread, editorset, model)
+
def banks_changed(self):
- self.refresh_banks()
+ self.mappings_changed()
2
3
13 Apr '16
Repeaterbook has been providing repeater listings for countries outside of
North America for more than a year now. Are you interested in adding support
for Canada, Mexico, and other countries?
There are a variety of queries that can be run. For example, all of a
country or a search for repeaters within a certain radius, even if it goes
over political lines. I can also handle searching on multiple bands at one
time.
73,
Garrett, KD6KPC
<http://www.repeaterbook.com/> RepeaterBook.com Site Admin/Owner
Get the RepeaterBook app in the
<https://itunes.apple.com/us/app/repeaterbook/id606820166?mt=8> App Store
and on <http://play.google.com/store/apps/details?id=com.zbm2.repeaterbook>
Google Play.
Twitter: <https://twitter.com/repeaterbook>
https://twitter.com/repeaterbook
Facebook: <https://www.facebook.com/repeaterbook>
https://www.facebook.com/repeaterbook
Google+: <https://plus.google.com/+Repeaterbook>
https://plus.google.com/+Repeaterbook
Instagram: <http://instagram.com/repeater_book>
http://instagram.com/repeater_book
Pinterest: <http://www.pinterest.com/repeaterbook/>
http://www.pinterest.com/repeaterbook/
2
4
02 Apr '16
# HG changeset patch
# User Richard Cochran <ag6qr(a)sonic.net>
# Date 1456721059 28800
# Sun Feb 28 20:44:19 2016 -0800
# Node ID 432300d60fae4c517c8f98f3d52aef115c9a96e8
# Parent 1c398653986fb3e0a50bfbbc58f1a2f5c9ab2b95
[FT2900] Add support for settings. Fix #2867
This submission adds support for settings to the ft-2900/ft-1900 driver.
Special thanks to Chris Fosnight for getting a start at the settings code.
He gave his code to me (Rich Cochran), and I finished implementing more
settings, and tested both reading and writing of all the settings.
Settings are grouped into categories according to the manual, pp 72-73.
Issue #2867
diff -r 1c398653986f -r 432300d60fae chirp/drivers/ft2900.py
--- a/chirp/drivers/ft2900.py Sat Feb 27 17:33:04 2016 -0800
+++ b/chirp/drivers/ft2900.py Sun Feb 28 20:44:19 2016 -0800
@@ -1,6 +1,7 @@
# Copyright 2011 Dan Smith <dsmith(a)danplanet.com>
#
# FT-2900-specific modifications by Richard Cochran, <ag6qr(a)sonic.net>
+# Initial work on settings by Chris Fosnight, <chris.fosnight(a)gmail.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
@@ -21,6 +22,8 @@
from chirp import util, memmap, chirp_common, bitwise, directory, errors
from chirp.drivers.yaesu_clone import YaesuCloneModeRadio
+from chirp.settings import RadioSetting, RadioSettingGroup, \
+ RadioSettingValueList, RadioSettingValueString, RadioSettings
from textwrap import dedent
@@ -164,6 +167,87 @@
_send(radio.pipe, chr(cs & 0xFF))
MEM_FORMAT = """
+#seekto 0x0080;
+struct {
+ u8 apo;
+ u8 arts_beep;
+ u8 bell;
+ u8 dimmer;
+ u8 cw_id_string[16];
+ u8 cw_trng;
+ u8 x95;
+ u8 x96;
+ u8 x97;
+ u8 int_cd;
+ u8 int_set;
+ u8 x9A;
+ u8 x9B;
+ u8 lock;
+ u8 x9D;
+ u8 mic_gain;
+ u8 open_msg;
+ u8 openMsg_Text[6];
+ u8 rf_sql;
+ u8 unk:6,
+ pag_abk:1,
+ unk:1;
+ u8 pag_cdr_1;
+ u8 pag_cdr_2;
+ u8 pag_cdt_1;
+ u8 pag_cdt_2;
+ u8 prog_p1;
+ u8 xAD;
+ u8 prog_p2;
+ u8 xAF;
+ u8 prog_p3;
+ u8 xB1;
+ u8 prog_p4;
+ u8 xB3;
+ u8 resume;
+ u8 tot;
+ u8 unk:1,
+ cw_id:1,
+ unk:1,
+ ts_speed:1,
+ ars:1,
+ unk:2,
+ dtmf_mode:1;
+ u8 unk:1,
+ ts_mut:1
+ wires_auto:1,
+ busy_lockout:1,
+ edge_beep:1,
+ unk:3;
+ u8 unk:2,
+ s_search:1,
+ unk:2,
+ cw_trng_units:1,
+ unk:2;
+ u8 dtmf_speed:1,
+ unk:2,
+ arts_interval:1,
+ unk:1,
+ inverted_dcs:1,
+ unk:1,
+ mw_mode:1;
+ u8 unk:2,
+ wires_mode:1,
+ wx_alert:1,
+ unk:1,
+ wx_vol_max:1,
+ revert:1,
+ unk:1;
+ u8 vfo_scan;
+ u8 scan_mode;
+ u8 dtmf_delay;
+ u8 beep;
+ u8 xBF;
+} settings;
+
+#seekto 0x00d0;
+ u8 passwd[4];
+ u8 mbs;
+
#seekto 0x00c0;
struct {
u16 in_use;
@@ -175,6 +259,11 @@
#seekto 0x00f0;
u8 curChannelMem[20];
+#seekto 0x1e0;
+struct {
+ u8 dtmf_string[16];
+} dtmf_strings[10];
+
#seekto 0x0127;
u8 curChannelNum;
@@ -424,6 +513,7 @@
rf.has_dtcs_polarity = False
rf.has_bank = True
rf.has_bank_names = True
+ rf.has_settings = True
rf.valid_tuning_steps = STEPS
rf.valid_modes = MODES
@@ -620,6 +710,496 @@
LOG.debug("encoded mem\n%s\n" % (util.hexprint(_mem.get_raw()[0:20])))
+ def get_settings(self):
+ _settings = self._memobj.settings
+ _dtmf_strings = self._memobj.dtmf_strings
+ _passwd = self._memobj.passwd
+
+ repeater = RadioSettingGroup("repeater", "Repeater Settings")
+ ctcss = RadioSettingGroup("ctcss", "CTCSS/DCS/EPCS Settings")
+ arts = RadioSettingGroup("arts", "ARTS Settings")
+ mbls = RadioSettingGroup("banks", "Memory Settings")
+ scan = RadioSettingGroup("scan", "Scan Settings")
+ dtmf = RadioSettingGroup("dtmf", "DTMF Settings")
+ wires = RadioSettingGroup("wires", "WiRES(tm) Settings")
+ switch = RadioSettingGroup("switch", "Switch/Knob Settings")
+ disp = RadioSettingGroup("disp", "Display Settings")
+ misc = RadioSettingGroup("misc", "Miscellaneous Settings")
+
+ setmode = RadioSettings(repeater, ctcss, arts, mbls, scan,
+ dtmf, wires, switch, disp, misc)
+
+ # numbers and names of settings refer to the way they're
+ # presented in the set menu, as well as the list starting on
+ # page 74 of the manual
+
+ # 1 APO
+ opts = ["Off", "30 Min", "1 Hour", "3 Hour", "5 Hour", "8 Hour"]
+ misc.append(
+ RadioSetting(
+ "apo", "Automatic Power Off",
+ RadioSettingValueList(opts, opts[_settings.apo])))
+
+ # 2 AR.BEP
+ opts = ["Off", "In Range", "Always"]
+ arts.append(
+ RadioSetting(
+ "arts_beep", "ARTS Beep",
+ RadioSettingValueList(opts, opts[_settings.arts_beep])))
+
+ # 3 AR.INT
+ opts = ["15 Sec", "25 Sec"]
+ arts.append(
+ RadioSetting(
+ "arts_interval", "ARTS Polling Interval",
+ RadioSettingValueList(opts, opts[_settings.arts_interval])))
+
+ # 4 ARS
+ opts = ["Off", "On"]
+ repeater.append(
+ RadioSetting(
+ "ars", "Automatic Repeater Shift",
+ RadioSettingValueList(opts, opts[_settings.ars])))
+
+ # 5 BCLO
+ opts = ["Off", "On"]
+ misc.append(RadioSetting(
+ "busy_lockout", "Busy Channel Lock-Out",
+ RadioSettingValueList(opts, opts[_settings.busy_lockout])))
+
+ # 6 BEEP
+ opts = ["Off", "Key+Scan", "Key"]
+ switch.append(RadioSetting(
+ "beep", "Enable the Beeper",
+ RadioSettingValueList(opts, opts[_settings.beep])))
+
+ # 7 BELL
+ opts = ["Off", "1", "3", "5", "8", "Continuous"]
+ ctcss.append(RadioSetting("bell", "Bell Repetitions",
+ RadioSettingValueList(opts, opts[_settings.bell])))
+
+ # 8 BNK.LNK
+ for i in range(0, 8):
+ opts = ["Off", "On"]
+ mbs = (self._memobj.mbs >> i) & 1
+ rs = RadioSetting("mbs%i" % i, "Bank %s Scan" % (i + 1),
+ RadioSettingValueList(opts, opts[mbs]))
+
+ def apply_mbs(s, index):
+ if int(s.value):
+ self._memobj.mbs |= (1 << index)
+ else:
+ self._memobj.mbs &= ~(1 << index)
+ rs.set_apply_callback(apply_mbs, i)
+ mbls.append(rs)
+
+ # 9 BNK.NM - A per-bank attribute, nothing to do here.
+
+ # 10 CLK.SFT - A per-channel attribute, nothing to do here.
+
+ # 11 CW.ID
+ opts = ["Off", "On"]
+ arts.append(RadioSetting("cw_id", "CW ID Enable",
+ RadioSettingValueList(opts, opts[_settings.cw_id])))
+
+ cw_id_text = ""
+ for i in _settings.cw_id_string:
+ try:
+ cw_id_text += CHARSET[i & 0x7F]
+ except IndexError:
+ if i != 0xff:
+ LOG.debug("unknown char index in cw id: %x " % (i))
+
+ val = RadioSettingValueString(0, 16, cw_id_text, True)
+ val.set_charset(CHARSET + "abcdefghijklmnopqrstuvwxyz")
+ rs = RadioSetting("cw_id_string", "CW Identifier Text", val)
+
+ def apply_cw_id(s):
+ str = s.value.get_value().upper().rstrip()
+ mval = ""
+ mval = [chr(CHARSET.index(x)) for x in str]
+ for x in range(len(mval), 16):
+ mval.append(chr(0xff))
+ for x in range(0, 16):
+ _settings.cw_id_string[x] = ord(mval[x])
+ rs.set_apply_callback(apply_cw_id)
+ arts.append(rs)
+
+ # 12 CWTRNG
+ opts = ["Off", "4WPM", "5WPM", "6WPM", "7WPM", "8WPM", "9WPM",
+ "10WPM", "11WPM", "12WPM", "13WPM", "15WPM", "17WPM",
+ "20WPM", "24WPM", "30WPM", "40WPM"]
+ misc.append(RadioSetting("cw_trng", "CW Training",
+ RadioSettingValueList(opts, opts[_settings.cw_trng])))
+
+ # todo: make the setting of the units here affect the display
+ # of the speed. Not critical, but would be slick.
+ opts = ["CPM", "WPM"]
+ misc.append(RadioSetting("cw_trng_units", "CW Training Units",
+ RadioSettingValueList(opts,
+ opts[_settings.cw_trng_units])))
+
+ # 13 DC VLT - a read-only status, so nothing to do here
+
+ # 14 DCS CD - A per-channel attribute, nothing to do here
+
+ # 15 DCS.RV
+ opts = ["Disabled", "Enabled"]
+ ctcss.append(RadioSetting(
+ "inverted_dcs",
+ "\"Inverted\" DCS Code Decoding",
+ RadioSettingValueList(opts,
+ opts[_settings.inverted_dcs])))
+
+ # 16 DIMMER
+ opts = ["Off"] + ["Level %d" % (x) for x in range(1, 11)]
+ disp.append(RadioSetting("dimmer", "Dimmer",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .dimmer])))
+
+ # 17 DT.A/M
+ opts = ["Manual", "Auto"]
+ dtmf.append(RadioSetting("dtmf_mode", "DTMF Autodialer",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .dtmf_mode])))
+
+ # 18 DT.DLY
+ opts = ["50 ms", "250 ms", "450 ms", "750 ms", "1000 ms"]
+ dtmf.append(RadioSetting("dtmf_delay", "DTMF Autodialer Delay Time",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .dtmf_delay])))
+
+ # 19 DT.SET
+ for memslot in range(0, 10):
+ dtmf_memory = ""
+ for i in _dtmf_strings[memslot].dtmf_string:
+ if i != 0xFF:
+ try:
+ dtmf_memory += CHARSET[i]
+ except IndexError:
+ LOG.debug("unknown char index in dtmf: %x " % (i))
+
+ val = RadioSettingValueString(0, 16, dtmf_memory, True)
+ val.set_charset(CHARSET + "abcdef")
+ rs = RadioSetting("dtmf_string_%d" % memslot,
+ "DTMF Memory %d" % memslot, val)
+
+ def apply_dtmf(s, i):
+ LOG.debug("applying dtmf for %x\n" % i)
+ str = s.value.get_value().upper().rstrip()
+ LOG.debug("str is %s\n" % str)
+ mval = ""
+ mval = [chr(CHARSET.index(x)) for x in str]
+ for x in range(len(mval), 16):
+ mval.append(chr(0xff))
+ for x in range(0, 16):
+ _dtmf_strings[i].dtmf_string[x] = ord(mval[x])
+ rs.set_apply_callback(apply_dtmf, memslot)
+ dtmf.append(rs)
+
+ # 20 DT.SPD
+ opts = ["50 ms", "100 ms"]
+ dtmf.append(RadioSetting("dtmf_speed",
+ "DTMF Autodialer Sending Speed",
+ RadioSettingValueList(opts,
+ opts[_settings.
+ dtmf_speed])))
+
+ # 21 EDG.BEP
+ opts = ["Off", "On"]
+ mbls.append(RadioSetting("edge_beep", "Band Edge Beeper",
+ RadioSettingValueList(opts,
+ opts[_settings.
+ edge_beep])))
+
+ # 22 INT.CD
+ opts = ["DTMF %X" % (x) for x in range(0, 16)]
+ wires.append(RadioSetting("int_cd", "Access Number for WiRES(TM)",
+ RadioSettingValueList(opts, opts[_settings.int_cd])))
+
+ # 23 ING MD
+ opts = ["Sister Radio Group", "Friends Radio Group"]
+ wires.append(RadioSetting("wires_mode",
+ "Internet Link Connection Mode",
+ RadioSettingValueList(opts,
+ opts[_settings.
+ wires_mode])))
+
+ # 24 INT.A/M
+ opts = ["Manual", "Auto"]
+ wires.append(RadioSetting("wires_auto", "Internet Link Autodialer",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .wires_auto])))
+ # 25 INT.SET
+ opts = ["F%d" % (x) for x in range(0, 10)]
+
+ wires.append(RadioSetting("int_set", "Memory Register for "
+ "non-WiRES Internet",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .int_set])))
+
+ # 26 LOCK
+ opts = ["Key", "Dial", "Key + Dial", "PTT",
+ "Key + PTT", "Dial + PTT", "All"]
+ switch.append(RadioSetting("lock", "Control Locking",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .lock])))
+
+ # 27 MCGAIN
+ opts = ["Level %d" % (x) for x in range(1, 10)]
+ misc.append(RadioSetting("mic_gain", "Microphone Gain",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .mic_gain])))
+
+ # 28 MEM.SCN
+ opts = ["Tag 1", "Tag 2", "All Channels"]
+ rs = RadioSetting("scan_mode", "Memory Scan Mode",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .scan_mode - 1]))
+ # this setting is unusual in that it starts at 1 instead of 0.
+ # that is, index 1 corresponds to "Tag 1", and index 0 is invalid.
+ # so we create a custom callback to handle this.
+
+ def apply_scan_mode(s):
+ myopts = ["Tag 1", "Tag 2", "All Channels"]
+ _settings.scan_mode = myopts.index(s.value.get_value()) + 1
+ rs.set_apply_callback(apply_scan_mode)
+ mbls.append(rs)
+
+ # 29 MW MD
+ opts = ["Lower", "Next"]
+ mbls.append(RadioSetting("mw_mode", "Memory Write Mode",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .mw_mode])))
+
+ # 30 NM SET - This is per channel, so nothing to do here
+
+ # 31 OPN.MSG
+ opts = ["Off", "DC Supply Voltage", "Text Message"]
+ disp.append(RadioSetting("open_msg", "Opening Message Type",
+ RadioSettingValueList(opts,
+ opts[_settings.
+ open_msg])))
+
+ openmsg = ""
+ for i in _settings.openMsg_Text:
+ try:
+ openmsg += CHARSET[i & 0x7F]
+ except IndexError:
+ if i != 0xff:
+ LOG.debug("unknown char index in openmsg: %x " % (i))
+
+ val = RadioSettingValueString(0, 6, openmsg, True)
+ val.set_charset(CHARSET + "abcdefghijklmnopqrstuvwxyz")
+ rs = RadioSetting("openMsg_Text", "Opening Message Text", val)
+
+ def apply_openmsg(s):
+ str = s.value.get_value().upper().rstrip()
+ mval = ""
+ mval = [chr(CHARSET.index(x)) for x in str]
+ for x in range(len(mval), 6):
+ mval.append(chr(0xff))
+ for x in range(0, 6):
+ _settings.openMsg_Text[x] = ord(mval[x])
+ rs.set_apply_callback(apply_openmsg)
+ disp.append(rs)
+
+ # 32 PAGER - a per-channel attribute
+
+ # 33 PAG.ABK
+ opts = ["Off", "On"]
+ ctcss.append(RadioSetting("pag_abk", "Paging Answer Back",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .pag_abk])))
+
+ # 34 PAG.CDR
+ opts = ["%2.2d" % (x) for x in range(1, 50)]
+ ctcss.append(RadioSetting("pag_cdr_1", "Receive Page Code 1",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .pag_cdr_1])))
+
+ ctcss.append(RadioSetting("pag_cdr_2", "Receive Page Code 2",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .pag_cdr_2])))
+
+ # 35 PAG.CDT
+ opts = ["%2.2d" % (x) for x in range(1, 50)]
+ ctcss.append(RadioSetting("pag_cdt_1", "Transmit Page Code 1",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .pag_cdt_1])))
+
+ ctcss.append(RadioSetting("pag_cdt_2", "Transmit Page Code 2",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .pag_cdt_2])))
+
+ # Common Button Options
+ button_opts = ["Squelch Off", "Weather", "Smart Search",
+ "Tone Scan", "Scan", "T Call", "ARTS"]
+
+ # 36 PRG P1
+ opts = button_opts + ["DC Volts"]
+ switch.append(RadioSetting(
+ "prog_p1", "P1 Button",
+ RadioSettingValueList(opts, opts[_settings.prog_p1])))
+
+ # 37 PRG P2
+ opts = button_opts + ["Dimmer"]
+ switch.append(RadioSetting(
+ "prog_p2", "P2 Button",
+ RadioSettingValueList(opts, opts[_settings.prog_p2])))
+
+ # 38 PRG P3
+ opts = button_opts + ["Mic Gain"]
+ switch.append(RadioSetting(
+ "prog_p3", "P3 Button",
+ RadioSettingValueList(opts, opts[_settings.prog_p3])))
+
+ # 39 PRG P4
+ opts = button_opts + ["Skip"]
+ switch.append(RadioSetting(
+ "prog_p4", "P4 Button",
+ RadioSettingValueList(opts, opts[_settings.prog_p4])))
+
+ # 40 PSWD
+ password = ""
+ for i in _passwd:
+ if i != 0xFF:
+ try:
+ password += CHARSET[i]
+ except IndexError:
+ LOG.debug("unknown char index in password: %x " % (i))
+
+ val = RadioSettingValueString(0, 4, password, True)
+ val.set_charset(CHARSET[0:15] + "abcdef ")
+ rs = RadioSetting("passwd", "Password", val)
+
+ def apply_password(s):
+ str = s.value.get_value().upper().rstrip()
+ mval = ""
+ mval = [chr(CHARSET.index(x)) for x in str]
+ for x in range(len(mval), 4):
+ mval.append(chr(0xff))
+ for x in range(0, 4):
+ _passwd[x] = ord(mval[x])
+ rs.set_apply_callback(apply_password)
+ misc.append(rs)
+
+ # 41 RESUME
+ opts = ["3 Sec", "5 Sec", "10 Sec", "Busy", "Hold"]
+ scan.append(RadioSetting("resume", "Scan Resume Mode",
+ RadioSettingValueList(opts, opts[_settings.resume])))
+
+ # 42 RF.SQL
+ opts = ["Off"] + ["S-%d" % (x) for x in range(1, 10)]
+ misc.append(RadioSetting("rf_sql", "RF Squelch Threshold",
+ RadioSettingValueList(opts, opts[_settings.rf_sql])))
+
+ # 43 RPT - per channel attribute, nothing to do here
+
+ # 44 RVRT
+ opts = ["Off", "On"]
+ misc.append(RadioSetting("revert", "Priority Revert",
+ RadioSettingValueList(opts, opts[_settings.revert])))
+
+ # 45 S.SRCH
+ opts = ["Single", "Continuous"]
+ misc.append(RadioSetting("s_search", "Smart Search Sweep Mode",
+ RadioSettingValueList(opts, opts[_settings.s_search])))
+
+ # 46 SHIFT - per channel setting, nothing to do here
+
+ # 47 SKIP = per channel setting, nothing to do here
+
+ # 48 SPLIT - per channel attribute, nothing to do here
+
+ # 49 SQL.TYP - per channel attribute, nothing to do here
+
+ # 50 STEP - per channel attribute, nothing to do here
+
+ # 51 TEMP - read-only status, nothing to do here
+
+ # 52 TN FRQ - per channel attribute, nothing to do here
+
+ # 53 TOT
+ opts = ["Off", "1 Min", "3 Min", "5 Min", "10 Min"]
+ misc.append(RadioSetting("tot", "Timeout Timer",
+ RadioSettingValueList(opts,
+ opts[_settings.tot])))
+
+ # 54 TS MUT
+ opts = ["Off", "On"]
+ ctcss.append(RadioSetting("ts_mut", "Tone Search Mute",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .ts_mut])))
+
+ # 55 TS SPEED
+ opts = ["Fast", "Slow"]
+ ctcss.append(RadioSetting("ts_speed", "Tone Search Scanner Speed",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .ts_speed])))
+
+ # 56 VFO.SCN
+ opts = ["+/- 1MHz", "+/- 2MHz", "+/-5MHz", "All"]
+ scan.append(RadioSetting("vfo_scan", "VFO Scanner Width",
+ RadioSettingValueList(opts,
+ opts[_settings
+ .vfo_scan])))
+
+ # 57 WX.ALT
+ opts = ["Off", "On"]
+ misc.append(RadioSetting("wx_alert", "Weather Alert Scan",
+ RadioSettingValueList(opts, opts[_settings.wx_alert])))
+
+ # 58 WX.VOL
+ opts = ["Normal", "Maximum"]
+ misc.append(RadioSetting("wx_vol_max", "Weather Alert Volume",
+ RadioSettingValueList(opts, opts[_settings.wx_vol_max])))
+
+ # 59 W/N DV - this is a per-channel attribute, nothing to do here
+
+ return setmode
+
+ def set_settings(self, uisettings):
+ _settings = self._memobj.settings
+ for element in uisettings:
+ if not isinstance(element, RadioSetting):
+ self.set_settings(element)
+ continue
+ if not element.changed():
+ continue
+
+ try:
+ name = element.get_name()
+ value = element.value
+
+ if element.has_apply_callback():
+ LOG.debug("Using apply callback")
+ element.run_apply_callback()
+ else:
+ obj = getattr(_settings, name)
+ setattr(_settings, name, value)
+
+ LOG.debug("Setting %s: %s" % (name, value))
+ except Exception, e:
+ LOG.debug(element.get_name())
+ raise
+
def get_bank_model(self):
return FT2900BankModel(self)
3
4
Tested changes:
[Richard Cochran <ag6qr(a)sonic.net>] [FT2900] Allow support of modded variant of FT-2900. Fix #3387
This adds a new registered radio class with appropriate IDBLOCK to
support a modified variant of FT-2900/FT-1900 for upload/download.
Bug #3387
[Pavel Milanes (CO7WT) <co7wt(a)frcuba.co.cu>] [PATCH][FD-268] Fix a annonying print on the debug space, Fix #2169
This erase a "print" left accidentaly, it's harmless but
it bugs me a lot in the developer process.
Full log:
Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/chirp-test/workspace
[workspace] $ hg showconfig paths.default
[workspace] $ hg pull --rev default
[workspace] $ hg update --clean --rev default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
[workspace] $ hg log --rev . --template {node}
[workspace] $ hg log --rev . --template {rev}
[workspace] $ hg log --rev 1fe0e6277668345d1098500dc60b825871abaa59
[workspace] $ hg log --template "<changeset node='{node}' author='{author|xmlescape}' rev='{rev}' date='{date}'><msg>{desc|xmlescape}</msg><added>{file_adds|stringify|xmlescape}</added><deleted>{file_dels|stringify|xmlescape}</deleted><files>{files|stringify|xmlescape}</files><parents>{parents}</parents></changeset>\n" --rev default:0 --follow --prune 1fe0e6277668345d1098500dc60b825871abaa59
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson684608379780704677.sh
[workspace] $ /bin/sh -xe /tmp/hudson4721620270276171285.sh
+ PATH=/usr/bin:/bin:/usr/local/bin ./run_all_tests.sh
test_bit_array (tests.unit.test_bitwise.TestBitType) ... ok
test_bit_array_fail (tests.unit.test_bitwise.TestBitType) ... ok
test_bitfield_u16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u8 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_bbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_int_array (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u8 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_char (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_invalid_chars (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_wrong_length (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_comment_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_comment_inline_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_missing_semicolon (tests.unit.test_bitwise.TestBitwiseErrors) ... ok
test_seek (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_seekto (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_struct_one_element (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_two_elements (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_writes (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
split_tone_encode_test_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_fix_rounded_step_250 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_500 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_750 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_12_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_2_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_5_0 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_6_25 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_fractional_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step_fail (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_format_freq (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_bad (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_decimal (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whitespace (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whole (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_ensure_has_calls_almost_full (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_empty (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_partial (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full1 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full2 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_urcall_full (tests.unit.test_import_logic.DstarTests) ... ok
test_import_bank (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffA_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffB_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_negative (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_too_big_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_uhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_errors (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_warnings (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_invalid (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_am (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_fm (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_name (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_closest (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_dst (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_src (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_same (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffA_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffB_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModelIndexInterface) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_icom_bank (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_index_bounds (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_next_mapping_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_auto_tone_mode_cross (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_pol (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_rx (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tone (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tsql (tests.unit.test_memedit_edits.TestEdits) ... ok
test_init (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_bad_portnames (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_sorted (tests.unit.test_platform.Win32PlatformTest) ... ok
test_apply_callback (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_group (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_multi (tests.unit.test_settings.TestSettingContainers) ... ok
test_changed (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_boolean (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_float (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_integer (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_list (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_string (tests.unit.test_settings.TestSettingValues) ... ok
test_validate_callback (tests.unit.test_settings.TestSettingValues) ... ok
test_delete_hole_with_all (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_all_full (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_without_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_with_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_without_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
----------------------------------------------------------------------
Ran 151 tests in 0.050s
OK
Patch 'tip' is OK
Checking for PEP8 regressions...
./chirp/drivers/ft60.py:521:45: W291 trailing whitespace
./chirp/drivers/ft60.py:522:25: E128 continuation line under-indented for visual indent
./chirp/drivers/ft60.py:523:13: E301 expected 1 blank line, found 0
./chirp/drivers/ft817.py:587:41: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:681:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:685:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:688:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:689:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:692:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:693:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:696:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:699:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:702:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:705:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:708:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:711:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:714:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:717:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:718:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:721:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:722:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:725:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:728:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:729:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:732:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:733:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:736:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:737:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:740:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:741:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:744:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:747:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:750:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:751:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:754:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:755:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:758:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:761:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:764:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:765:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:768:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:769:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:772:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:773:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:776:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:779:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:780:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:783:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:786:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:787:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:790:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:791:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:807:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:808:31: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:811:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:814:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:818:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:824:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:829:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:833:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:837:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:841:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:845:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:890:25: E128 continuation line under-indented for visual indent
./chirp/drivers/thd72.py:188:1: E302 expected 2 blank lines, found 1
./chirp/drivers/thd72.py:203:23: E201 whitespace after '['
./chirp/drivers/thd72.py:203:80: E501 line too long (171 > 79 characters)
./chirp/drivers/thd72.py:203:170: E202 whitespace before ']'
./chirp/drivers/thd72.py:204:13: E201 whitespace after '['
./chirp/drivers/thd72.py:204:61: E202 whitespace before ']'
./chirp/drivers/thd72.py:205:23: E201 whitespace after '['
./chirp/drivers/thd72.py:205:74: E202 whitespace before ']'
./chirp/drivers/thd72.py:206:18: E201 whitespace after '['
./chirp/drivers/thd72.py:206:65: E202 whitespace before ']'
./chirp/drivers/thd72.py:591:1: W293 blank line contains whitespace
./chirp/drivers/thd72.py:599:1: W293 blank line contains whitespace
real 0m7.382s
user 0m7.293s
sys 0m0.022s
================================================
Tests OK
+ cat /var/lib/jenkins/.chirp/debug.log
[2016-02-28 18:12:20,802] chirp.logger - DEBUG: CHIRP 0.3.0dev on Linux - Ubuntu 14.04.3 LTS (Python 2.7.6)
[2016-02-28 18:12:20,813] chirp.directory - INFO: Registered Kenwood_TH-D7 = THD7Radio
[2016-02-28 18:12:20,813] chirp.directory - INFO: Registered Kenwood_TH-D7G = THD7GRadio
[2016-02-28 18:12:20,813] chirp.directory - INFO: Registered Kenwood_TM-D700 = TMD700Radio
[2016-02-28 18:12:20,813] chirp.directory - INFO: Registered Kenwood_TM-V7 = TMV7Radio
[2016-02-28 18:12:20,813] chirp.directory - INFO: Registered Kenwood_TM-G707 = TMG707Radio
[2016-02-28 18:12:20,813] chirp.directory - INFO: Registered Kenwood_TH-G71 = THG71Radio
[2016-02-28 18:12:20,813] chirp.directory - INFO: Registered Kenwood_TH-F6 = THF6ARadio
[2016-02-28 18:12:20,813] chirp.directory - INFO: Registered Kenwood_TH-F7 = THF7ERadio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Kenwood_TM-D710 = TMD710Radio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Kenwood_TH-D72_live_mode = THD72Radio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Kenwood_TM-V71 = TMV71Radio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Kenwood_TM-D710G = TMD710GRadio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Kenwood_TH-K2 = THK2Radio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Kenwood_TM-271 = TM271Radio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Kenwood_TM-281 = TM281Radio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Kenwood_TM-471 = TM471Radio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Icom_7200 = Icom7200Radio
[2016-02-28 18:12:20,814] chirp.directory - INFO: Registered Icom_IC-7000 = Icom7000Radio
[2016-02-28 18:12:20,815] chirp.directory - INFO: Registered Icom_746 = Icom746Radio
[2016-02-28 18:12:20,815] chirp.directory - INFO: Registered Alinco_DR03T = DR03Radio
[2016-02-28 18:12:20,815] chirp.directory - INFO: Registered Alinco_DR06T = DR06Radio
[2016-02-28 18:12:20,815] chirp.directory - INFO: Registered Alinco_DR135T = DR135Radio
[2016-02-28 18:12:20,815] chirp.directory - INFO: Registered Alinco_DR235T = DR235Radio
[2016-02-28 18:12:20,815] chirp.directory - INFO: Registered Alinco_DR435T = DR435Radio
[2016-02-28 18:12:20,816] chirp.directory - INFO: Registered Alinco_DJ596 = DJ596Radio
[2016-02-28 18:12:20,816] chirp.directory - INFO: Registered Jetstream_JT220M = JT220MRadio
[2016-02-28 18:12:20,816] chirp.directory - INFO: Registered Alinco_DJ175 = DJ175Radio
[2016-02-28 18:12:20,816] chirp.directory - INFO: Registered AnyTone_5888UV = AnyTone5888UVRadio
[2016-02-28 18:12:20,816] chirp.directory - INFO: Registered Intek_HR-2040 = IntekHR2040Radio
[2016-02-28 18:12:20,816] chirp.directory - INFO: Registered Polmar_DB-50M = PolmarDB50MRadio
[2016-02-28 18:12:20,816] chirp.directory - INFO: Registered Powerwerx_DB-750X = PowerwerxDB750XRadio
[2016-02-28 18:12:20,817] chirp.directory - INFO: Registered AnyTone_TERMN-8R = AnyToneTERMN8RRadio
[2016-02-28 18:12:20,817] chirp.directory - INFO: Registered AnyTone_OBLTR-8R = AnyToneOBLTR8RRadio
[2016-02-28 18:12:20,817] chirp.directory - INFO: Registered Sainsonic_AP510 = AP510Radio
[2016-02-28 18:12:20,817] chirp.directory - INFO: Registered Baofeng_UV-3R = UV3RRadio
[2016-02-28 18:12:20,818] chirp.directory - INFO: Registered Baojie_BJ-9900 = BJ9900Radio
[2016-02-28 18:12:20,818] chirp.directory - INFO: Registered Baofeng_UV-5R = BaofengUV5R
[2016-02-28 18:12:20,818] chirp.directory - INFO: Registered Baofeng_F-11 = BaofengF11Radio
[2016-02-28 18:12:20,818] chirp.directory - INFO: Registered Baofeng_UV-82 = BaofengUV82Radio
[2016-02-28 18:12:20,819] chirp.directory - INFO: Registered Baofeng_UV-6 = BaofengUV6Radio
[2016-02-28 18:12:20,819] chirp.directory - INFO: Registered Intek_KT-980HP = IntekKT980Radio
[2016-02-28 18:12:20,819] chirp.directory - INFO: Registered Baofeng_BF-F8HP = BaofengBFF8HPRadio
[2016-02-28 18:12:20,819] chirp.directory - INFO: Registered Baofeng_UV-82HP = BaofengUV82HPRadio
[2016-02-28 18:12:20,819] chirp.directory - INFO: Registered Baojie_BJ-UV55 = BaojieBJUV55Radio
[2016-02-28 18:12:20,819] chirp.directory - INFO: Registered Feidaxin_FD-268A = FD268ARadio
[2016-02-28 18:12:20,819] chirp.directory - INFO: Registered Feidaxin_FD-268B = FD268BRadio
[2016-02-28 18:12:20,819] chirp.directory - INFO: Registered Feidaxin_FD-288A = FD288ARadio
[2016-02-28 18:12:20,819] chirp.directory - INFO: Registered Feidaxin_FD-288B = FD288BRadio
[2016-02-28 18:12:20,820] chirp.directory - INFO: Registered Feidaxin_FD-150A = FD150ARadio
[2016-02-28 18:12:20,820] chirp.directory - INFO: Registered Feidaxin_FD-160A = FD160ARadio
[2016-02-28 18:12:20,820] chirp.directory - INFO: Registered Feidaxin_FD-450A = FD450ARadio
[2016-02-28 18:12:20,820] chirp.directory - INFO: Registered Feidaxin_FD-460A = FD460ARadio
[2016-02-28 18:12:20,820] chirp.directory - INFO: Registered Yaesu_FT-1802M = FT1802Radio
[2016-02-28 18:12:20,821] chirp.directory - INFO: Registered Yaesu_FT-1D_R = FT1Radio
[2016-02-28 18:12:20,821] chirp.directory - INFO: Registered Yaesu_FT-2800M = FT2800Radio
[2016-02-28 18:12:20,821] chirp.directory - INFO: Registered Yaesu_FT-2900R_1900R = FT2900Radio
[2016-02-28 18:12:20,822] chirp.directory - INFO: Registered Yaesu_FT-2900E_1900E_E = FT2900ERadio
[2016-02-28 18:12:20,822] chirp.directory - INFO: Registered Yaesu_FT-2900_1900_Modded_Opened_Xmit = FT2900ModRadio
[2016-02-28 18:12:20,822] chirp.directory - INFO: Registered Yaesu_FT-50 = FT50Radio
[2016-02-28 18:12:20,822] chirp.directory - INFO: Registered Yaesu_FT-60 = FT60Radio
[2016-02-28 18:12:20,823] chirp.directory - INFO: Registered Yaesu_FT-7800_7900 = FT7800Radio
[2016-02-28 18:12:20,823] chirp.directory - INFO: Registered Yaesu_FT-8800 = FT8800Radio
[2016-02-28 18:12:20,823] chirp.directory - INFO: Registered Yaesu_FT-8900 = FT8900Radio
[2016-02-28 18:12:20,823] chirp.directory - INFO: Registered Yaesu_FT-8100 = FT8100Radio
[2016-02-28 18:12:20,824] chirp.directory - INFO: Registered Yaesu_FT-817 = FT817Radio
[2016-02-28 18:12:20,824] chirp.directory - INFO: Registered Yaesu_FT-817ND = FT817NDRadio
[2016-02-28 18:12:20,824] chirp.directory - INFO: Registered Yaesu_FT-817ND_US = FT817NDUSRadio
[2016-02-28 18:12:20,824] chirp.directory - INFO: Registered Yaesu_FT-857_897 = FT857Radio
[2016-02-28 18:12:20,824] chirp.directory - INFO: Registered Yaesu_FT-857_897_US = FT857USRadio
[2016-02-28 18:12:20,825] chirp.directory - INFO: Registered Yaesu_FT-90 = FT90Radio
[2016-02-28 18:12:20,825] chirp.directory - INFO: Registered Yaesu_FTM-350 = FTM350Radio
[2016-02-28 18:12:20,826] chirp.directory - INFO: Registered Generic_CSV = CSVRadio
[2016-02-28 18:12:20,826] chirp.directory - INFO: Registered Commander_KG-UV = CommanderCSVRadio
[2016-02-28 18:12:20,826] chirp.directory - INFO: Registered RT_Systems_CSV = RTCSVRadio
[2016-02-28 18:12:20,826] chirp.directory - INFO: Registered ARRL_Travel_Plus = TpeRadio
[2016-02-28 18:12:20,831] chirp.directory - INFO: Registered Generic_XML = XMLRadio
[2016-02-28 18:12:20,835] chirp.directory - INFO: Registered Baofeng_BF-888 = H777Radio
[2016-02-28 18:12:20,835] chirp.directory - INFO: Registered Icom_IC-208H = IC208Radio
[2016-02-28 18:12:20,835] chirp.directory - INFO: Registered Icom_IC-2100H = IC2100Radio
[2016-02-28 18:12:20,835] chirp.directory - INFO: Registered Icom_IC-2200H = IC2200Radio
[2016-02-28 18:12:20,836] chirp.directory - INFO: Registered Icom_IC-2720H = IC2720Radio
[2016-02-28 18:12:20,836] chirp.directory - INFO: Registered Icom_IC-2820H = IC2820Radio
[2016-02-28 18:12:20,836] chirp.directory - INFO: Registered Icom_IC-91_92AD = IC9xRadio
[2016-02-28 18:12:20,837] chirp.directory - INFO: Registered Icom_IC-Q7A = ICQ7Radio
[2016-02-28 18:12:20,837] chirp.directory - INFO: Registered Icom_IC-T70 = ICT70Radio
[2016-02-28 18:12:20,837] chirp.directory - INFO: Registered Icom_IC-T7H = ICT7HRadio
[2016-02-28 18:12:20,837] chirp.directory - INFO: Registered Icom_IC-T8A = ICT8ARadio
[2016-02-28 18:12:20,837] chirp.directory - INFO: Registered Icom_IC-W32A = ICW32ARadio
[2016-02-28 18:12:20,837] chirp.directory - INFO: Registered Icom_IC-W32E = ICW32ERadio
[2016-02-28 18:12:20,838] chirp.directory - INFO: Registered Icom_IC-V82_U82 = ICx8xRadio
[2016-02-28 18:12:20,838] chirp.directory - INFO: Registered Icom_ID-31A = ID31Radio
[2016-02-28 18:12:20,838] chirp.directory - INFO: Registered Icom_ID-51 = ID51Radio
[2016-02-28 18:12:20,838] chirp.directory - INFO: Registered Icom_ID-51_Plus = ID51PLUSRadio
[2016-02-28 18:12:20,839] chirp.directory - INFO: Registered Icom_ID-800H_v2 = ID800v2Radio
[2016-02-28 18:12:20,839] chirp.directory - INFO: Registered Icom_ID-880H = ID880Radio
[2016-02-28 18:12:20,839] chirp.directory - INFO: Registered Icom_ID-80H = ID80Radio
[2016-02-28 18:12:20,839] chirp.directory - INFO: Registered Kenwood_HMK = HMKRadio
[2016-02-28 18:12:20,839] chirp.directory - INFO: Registered Kenwood_ITM = ITMRadio
[2016-02-28 18:12:20,840] chirp.directory - INFO: Registered Wouxun_KG-UV8D = KGUV8DRadio
[2016-02-28 18:12:20,840] chirp.directory - INFO: Registered KYD_NC-630A = NC630aRadio
[2016-02-28 18:12:20,840] chirp.directory - INFO: Registered KYD_IP-620 = IP620Radio
[2016-02-28 18:12:20,841] chirp.directory - INFO: Registered Leixen_VV-898 = LeixenVV898Radio
[2016-02-28 18:12:20,841] chirp.directory - INFO: Registered Jetstream_JT270M = JetstreamJT270MRadio
[2016-02-28 18:12:20,841] chirp.directory - INFO: Registered Wouxun_KG-UVD1P = KGUVD1PRadio
[2016-02-28 18:12:20,841] chirp.directory - INFO: Registered Wouxun_KG-UV6 = KGUV6DRadio
[2016-02-28 18:12:20,841] chirp.directory - INFO: Registered Wouxun_KG-816 = KG816Radio
[2016-02-28 18:12:20,842] chirp.directory - INFO: Registered Wouxun_KG-818 = KG818Radio
[2016-02-28 18:12:20,842] chirp.directory - INFO: Registered Puxing_PX-777 = Puxing777Radio
[2016-02-28 18:12:20,842] chirp.directory - INFO: Registered Puxing_PX-2R = Puxing2RRadio
[2016-02-28 18:12:20,842] chirp.directory - INFO: Registered TYT_TH9000_220 = Th9000220Radio
[2016-02-28 18:12:20,842] chirp.directory - INFO: Registered TYT_TH9000_144 = Th9000144Radio
[2016-02-28 18:12:20,842] chirp.directory - INFO: Registered TYT_TH9000_440 = Th9000440Radio
[2016-02-28 18:12:20,843] chirp.directory - INFO: Registered TYT_TH-9800_File = TYTTH9800File
[2016-02-28 18:12:20,843] chirp.directory - INFO: Registered TYT_TH-9800 = TYTTH9800Radio
[2016-02-28 18:12:20,843] chirp.directory - INFO: Registered TYT_TH-UV3R = TYTUV3RRadio
[2016-02-28 18:12:20,843] chirp.directory - INFO: Registered TYT_TH-UV3R-25 = TYTUV3R25Radio
[2016-02-28 18:12:20,844] chirp.directory - INFO: Registered TYT_TH-UVF8D = TYTUVF8DRadio
[2016-02-28 18:12:20,844] chirp.directory - INFO: Registered Kenwood_TH-D72_clone_mode = THD72Radio
[2016-02-28 18:12:20,844] chirp.directory - INFO: Registered TYT_TH-UVF1 = TYTTHUVF1Radio
[2016-02-28 18:12:20,845] chirp.directory - INFO: Registered Kenwood_TK-260 = TK260_Radio
[2016-02-28 18:12:20,845] chirp.directory - INFO: Registered Kenwood_TK-270 = TK270_Radio
[2016-02-28 18:12:20,845] chirp.directory - INFO: Registered Kenwood_TK-272 = TK272_Radio
[2016-02-28 18:12:20,845] chirp.directory - INFO: Registered Kenwood_TK-278 = TK278_Radio
[2016-02-28 18:12:20,845] chirp.directory - INFO: Registered Kenwood_TK-360 = TK360_Radio
[2016-02-28 18:12:20,845] chirp.directory - INFO: Registered Kenwood_TK-370 = TK370_Radio
[2016-02-28 18:12:20,845] chirp.directory - INFO: Registered Kenwood_TK-372 = TK372_Radio
[2016-02-28 18:12:20,845] chirp.directory - INFO: Registered Kenwood_TK-378 = TK378_Radio
[2016-02-28 18:12:20,846] chirp.directory - INFO: Registered Kenwood_TK-760 = TK760_Radio
[2016-02-28 18:12:20,846] chirp.directory - INFO: Registered Kenwood_TK-762 = TK762_Radio
[2016-02-28 18:12:20,846] chirp.directory - INFO: Registered Kenwood_TK-768 = TK768_Radio
[2016-02-28 18:12:20,846] chirp.directory - INFO: Registered Kenwood_TK-860 = TK860_Radio
[2016-02-28 18:12:20,846] chirp.directory - INFO: Registered Kenwood_TK-862 = TK862_Radio
[2016-02-28 18:12:20,846] chirp.directory - INFO: Registered Kenwood_TK-868 = TK868_Radio
[2016-02-28 18:12:20,846] chirp.directory - INFO: Registered Kenwood_TK-868G = TK868G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-862G = TK862G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-860G = TK860G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-768G = TK768G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-762G = TK762G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-760G = TK760G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-278G = TK278G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-272G = TK272G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-270G = TK270G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-260G = TK260G_Radios
[2016-02-28 18:12:20,847] chirp.directory - INFO: Registered Kenwood_TK-7102 = KenwoodTK7102Radio
[2016-02-28 18:12:20,848] chirp.directory - INFO: Registered Kenwood_TK-8102 = KenwoodTK8102Radio
[2016-02-28 18:12:20,848] chirp.directory - INFO: Registered Kenwood_TK-7108 = KenwoodTK7108Radio
[2016-02-28 18:12:20,848] chirp.directory - INFO: Registered Kenwood_TK-8108 = KenwoodTK8108Radio
[2016-02-28 18:12:20,848] chirp.directory - INFO: Registered Kenwood_TS-2000 = TS2000Radio
[2016-02-28 18:12:20,848] chirp.directory - INFO: Registered Baofeng_UV-B5 = BaofengUVB5
[2016-02-28 18:12:20,849] chirp.directory - INFO: Registered Yaesu_VX-170 = VX170Radio
[2016-02-28 18:12:20,850] chirp.directory - INFO: Registered Yaesu_VX-2 = VX2Radio
[2016-02-28 18:12:20,850] chirp.directory - INFO: Registered Yaesu_VX-3 = VX3Radio
[2016-02-28 18:12:20,850] chirp.directory - INFO: Registered Yaesu_VX-5 = VX5Radio
[2016-02-28 18:12:20,850] chirp.directory - INFO: Registered Yaesu_VX-6 = VX6Radio
[2016-02-28 18:12:20,851] chirp.directory - INFO: Registered Yaesu_VX-7 = VX7Radio
[2016-02-28 18:12:20,851] chirp.directory - INFO: Registered Yaesu_VX-8_R = VX8Radio
[2016-02-28 18:12:20,851] chirp.directory - INFO: Registered Yaesu_VX-8_DR = VX8DRadio
[2016-02-28 18:12:20,852] chirp.directory - INFO: Registered Yaesu_VX-8_GE = VX8GERadio
[2016-02-28 18:12:20,852] chirp.directory - INFO: Registered Vertex_Standard_VXA-700 = VXA700Radio
Email was triggered for: Success
Sending email for trigger: Success
1
0
[chirp_devel] How to best handle slight radio variations (issue #3387)
by Richard Cochran 27 Feb '16
by Richard Cochran 27 Feb '16
27 Feb '16
I’m the guy who developed most of the Yaesu FT-2900 driver. An issue has recently been reported where the driver doesn’t work with one variant of the radio. Apparently the radio has had some solder bridges changed, to alter the configuration.
The way the cloning process for this radio works is that, on download, the radio sends a short IDBLOCK to the computer, which the computer looks at, compares with what it expects, and then discards (or reports an error). The radio then sends a series of regular-sized data blocks, and finally, it sends a checksum, which is checked and discarded. Only the standard data blocks are saved in the .img file. This is the strategy used in the FT-2800 driver, which I used as inspiration for the FT-2900 upload/download.
I can easily make the download routine more lenient, so that a mismatch in the IDBLOCK doesn’t prevent a download. But on upload, the radio insists on getting the correct IDBLOCK, and will abort the upload if the IDBLOCK isn’t exactly what it is expecting. And the only way I have of knowing which IDBLOCK to send is by having the user choose the correct model radio.
There was a similar issue reported long ago with the European versus US version of that radio (the Euro/USA modification can also be done by altering the solder bridges). It was addressed by registering a separate version of the radio, with an overridden variable containing the appropriate IDBLOCK.
I have developed a fix for this issue by registering yet another variant of the FT-2900 radio, similar to what was done with the Euro version. I got out my soldering iron, altered my own radio to duplicate the issue reported in issue #3387, and tested the altered driver, verified that it works, and then put my radio back to its original configuration. So this strategy works, but I wonder if there’s a better way to avoid cluttering up the list of supported radios too much.
For anyone interested in the gory details, this is the diff that seems to fix the problem.
--- a/chirp/drivers/ft2900.py Mon Feb 22 09:52:12 2016 -0800
+++ b/chirp/drivers/ft2900.py Fri Feb 26 09:40:08 2016 -0800
@@ -658,3 +658,15 @@
MODEL = "FT-2900E/1900E"
VARIANT = "E"
IDBLOCK = "\x56\x43\x32\x33\x00\x02\x41\x02\x01\x01"
+
+# the FT2900Mod is a version of the radio that has been modified to
+# allow transmit on a greater range of frequencies. It is almost
+# identical to the standard version, except for the model number and
+# ID Block. We create and register a class for it, with only the
+# needed overrides
+(a)directory.register
+class FT2900ModRadio(FT2900Radio):
+ """Yaesu FT-2900Mod"""
+ MODEL = "FT-2900Mod/1900Mod"
+ VARIANT = "Opened Xmit"
+ IDBLOCK = "\x56\x43\x32\x33\x00\x02\xc7\x01\x01\x01"
My purpose in sending this query to the list is to find out if anyone else has run across a similar problem and figured out a more technically elegant solution.
Richard Cochran
ag6qr(a)sonic.net
3
3
[chirp_devel] [PATCH] [FT2900] Allow support of modded variant of FT-2900. Fix #3387
by Richard Cochran 27 Feb '16
by Richard Cochran 27 Feb '16
27 Feb '16
# HG changeset patch
# User Richard Cochran <ag6qr(a)sonic.net>
# Date 1456623184 28800
# Sat Feb 27 17:33:04 2016 -0800
# Node ID 8392e269c64dcd2449486391fad9519e2cb63b13
# Parent 1fe0e6277668345d1098500dc60b825871abaa59
[FT2900] Allow support of modded variant of FT-2900. Fix #3387
This adds a new registered radio class with appropriate IDBLOCK to
support a modified variant of FT-2900/FT-1900 for upload/download.
Bug #3387
diff -r 1fe0e6277668 -r 8392e269c64d chirp/drivers/ft2900.py
--- a/chirp/drivers/ft2900.py Mon Feb 22 09:52:12 2016 -0800
+++ b/chirp/drivers/ft2900.py Sat Feb 27 17:33:04 2016 -0800
@@ -658,3 +658,16 @@
MODEL = "FT-2900E/1900E"
VARIANT = "E"
IDBLOCK = "\x56\x43\x32\x33\x00\x02\x41\x02\x01\x01"
+
+
+# the FT2900Mod is a version of the radio that has been modified to
+# allow transmit on a greater range of frequencies. It is almost
+# identical to the standard version, except for the model number and
+# ID Block. We create and register a class for it, with only the
+# needed overrides
+(a)directory.register
+class FT2900ModRadio(FT2900Radio):
+ """Yaesu FT-2900Mod"""
+ MODEL = "FT-2900/1900 (Modded)"
+ VARIANT = "Opened Xmit"
+ IDBLOCK = "\x56\x43\x32\x33\x00\x02\xc7\x01\x01\x01"
1
0
[chirp_devel] [PATCH] [PATCH][FD-268] Fix a annonying print on the debug space, Fix #2169
by Pavel Milanes (CO7WT) 25 Feb '16
by Pavel Milanes (CO7WT) 25 Feb '16
25 Feb '16
# HG changeset patch
# User Pavel Milanes (CO7WT) <co7wt(a)frcuba.co.cu>
# Date 1456441239 18000
# Thu Feb 25 18:00:39 2016 -0500
# Node ID 105eb20a4d2278abe4516b79a5463090ca06f77c
# Parent 1fe0e6277668345d1098500dc60b825871abaa59
[PATCH][FD-268] Fix a annonying print on the debug space, Fix #2169
This erase a "print" left accidentaly, it's harmless but
it bugs me a lot in the developer process.
diff -r 1fe0e6277668 -r 105eb20a4d22 chirp/drivers/fd268.py
--- a/chirp/drivers/fd268.py Mon Feb 22 09:52:12 2016 -0800
+++ b/chirp/drivers/fd268.py Thu Feb 25 18:00:39 2016 -0500
@@ -285,8 +285,6 @@
else:
LOG.debug("Unknowd Feidaxing radio, ID:")
LOG.debug(util.hexprint(fp))
- print("Unknowd Feidaxing radio, ID:")
- print util.hexprint(fp)
return False
1
0
Tested changes:
[Richard Cochran <ag6qr(a)sonic.net>] [FT2900] Add msg for attempt to upload to locked radio. Fixes #3055
A user may "lock" an FT-2900/FT-1900, preventing configuration changes.
An upload will fail if this is the case. This patch adds some text to
the upload dialog box to help the user avoid attempting to upload to
a locked radio. It also adds some text to the error message that
appears on upload failure, to suggest the user check to make sure
his radio is not locked.
[Jim Unroe <rock.unroe(a)gmail.com>] [UV-5R] Remove "Special Block" Check
This patch removes the "special block" check. It is no longer needed
now that an upload will not be permitted unless the firmware version of
the image and the firmware version of the radio exactly match.
Bug #3371
[Jim Unroe <rock.unroe(a)gmail.com>] [UV-5R] "Wipe" Channel Name
Add code to also wipe memory name when memory channel is deleted.
Bug #3369
[K. Arvanitis <kosta(a)alumni.uvic.ca>] [FT-60] Added support for DTMF autodial memories.
Issue #3343
Full log:
Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/chirp-test/workspace
[workspace] $ hg showconfig paths.default
[workspace] $ hg pull --rev default
[workspace] $ hg update --clean --rev default
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
[workspace] $ hg log --rev . --template {node}
[workspace] $ hg log --rev . --template {rev}
[workspace] $ hg log --rev 480369e272a2ea6b6d0ff7650c4abebcd47cdab8
[workspace] $ hg log --template "<changeset node='{node}' author='{author|xmlescape}' rev='{rev}' date='{date}'><msg>{desc|xmlescape}</msg><added>{file_adds|stringify|xmlescape}</added><deleted>{file_dels|stringify|xmlescape}</deleted><files>{files|stringify|xmlescape}</files><parents>{parents}</parents></changeset>\n" --rev default:0 --follow --prune 480369e272a2ea6b6d0ff7650c4abebcd47cdab8
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson5030204151895255163.sh
[workspace] $ /bin/sh -xe /tmp/hudson6289259191678483074.sh
+ PATH=/usr/bin:/bin:/usr/local/bin ./run_all_tests.sh
test_bit_array (tests.unit.test_bitwise.TestBitType) ... ok
test_bit_array_fail (tests.unit.test_bitwise.TestBitType) ... ok
test_bitfield_u16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u8 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_bbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_int_array (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u8 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_char (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_invalid_chars (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_wrong_length (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_comment_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_comment_inline_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_missing_semicolon (tests.unit.test_bitwise.TestBitwiseErrors) ... ok
test_seek (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_seekto (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_struct_one_element (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_two_elements (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_writes (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
split_tone_encode_test_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_fix_rounded_step_250 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_500 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_750 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_12_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_2_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_5_0 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_6_25 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_fractional_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step_fail (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_format_freq (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_bad (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_decimal (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whitespace (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whole (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_ensure_has_calls_almost_full (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_empty (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_partial (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full1 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full2 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_urcall_full (tests.unit.test_import_logic.DstarTests) ... ok
test_import_bank (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffA_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffB_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_negative (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_too_big_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_uhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_errors (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_warnings (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_invalid (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_am (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_fm (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_name (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_closest (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_dst (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_src (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_same (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffA_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffB_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModelIndexInterface) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_icom_bank (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_index_bounds (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_next_mapping_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_auto_tone_mode_cross (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_pol (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_rx (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tone (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tsql (tests.unit.test_memedit_edits.TestEdits) ... ok
test_init (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_bad_portnames (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_sorted (tests.unit.test_platform.Win32PlatformTest) ... ok
test_apply_callback (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_group (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_multi (tests.unit.test_settings.TestSettingContainers) ... ok
test_changed (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_boolean (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_float (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_integer (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_list (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_string (tests.unit.test_settings.TestSettingValues) ... ok
test_validate_callback (tests.unit.test_settings.TestSettingValues) ... ok
test_delete_hole_with_all (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_all_full (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_without_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_with_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_without_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
----------------------------------------------------------------------
Ran 151 tests in 0.055s
OK
Patch 'tip' is OK
Checking for PEP8 regressions...
./chirp/drivers/ft60.py:521:45: W291 trailing whitespace
./chirp/drivers/ft60.py:522:25: E128 continuation line under-indented for visual indent
./chirp/drivers/ft60.py:523:13: E301 expected 1 blank line, found 0
./chirp/drivers/ft817.py:587:41: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:681:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:685:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:688:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:689:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:692:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:693:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:696:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:699:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:702:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:705:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:708:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:711:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:714:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:717:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:718:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:721:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:722:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:725:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:728:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:729:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:732:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:733:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:736:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:737:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:740:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:741:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:744:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:747:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:750:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:751:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:754:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:755:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:758:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:761:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:764:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:765:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:768:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:769:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:772:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:773:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:776:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:779:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:780:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:783:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:786:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:787:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:790:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:791:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:807:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:808:31: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:811:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:814:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:818:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:824:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:829:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:833:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:837:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:841:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:845:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:890:25: E128 continuation line under-indented for visual indent
./chirp/drivers/thd72.py:188:1: E302 expected 2 blank lines, found 1
./chirp/drivers/thd72.py:203:23: E201 whitespace after '['
./chirp/drivers/thd72.py:203:80: E501 line too long (171 > 79 characters)
./chirp/drivers/thd72.py:203:170: E202 whitespace before ']'
./chirp/drivers/thd72.py:204:13: E201 whitespace after '['
./chirp/drivers/thd72.py:204:61: E202 whitespace before ']'
./chirp/drivers/thd72.py:205:23: E201 whitespace after '['
./chirp/drivers/thd72.py:205:74: E202 whitespace before ']'
./chirp/drivers/thd72.py:206:18: E201 whitespace after '['
./chirp/drivers/thd72.py:206:65: E202 whitespace before ']'
./chirp/drivers/thd72.py:591:1: W293 blank line contains whitespace
./chirp/drivers/thd72.py:599:1: W293 blank line contains whitespace
real 0m7.731s
user 0m7.588s
sys 0m0.070s
================================================
Tests OK
+ cat /var/lib/jenkins/.chirp/debug.log
[2016-02-23 16:32:22,053] chirp.logger - DEBUG: CHIRP 0.3.0dev on Linux - Ubuntu 14.04.3 LTS (Python 2.7.6)
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TH-D7 = THD7Radio
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TH-D7G = THD7GRadio
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TM-D700 = TMD700Radio
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TM-V7 = TMV7Radio
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TM-G707 = TMG707Radio
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TH-G71 = THG71Radio
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TH-F6 = THF6ARadio
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TH-F7 = THF7ERadio
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TM-D710 = TMD710Radio
[2016-02-23 16:32:22,063] chirp.directory - INFO: Registered Kenwood_TH-D72_live_mode = THD72Radio
[2016-02-23 16:32:22,064] chirp.directory - INFO: Registered Kenwood_TM-V71 = TMV71Radio
[2016-02-23 16:32:22,064] chirp.directory - INFO: Registered Kenwood_TM-D710G = TMD710GRadio
[2016-02-23 16:32:22,064] chirp.directory - INFO: Registered Kenwood_TH-K2 = THK2Radio
[2016-02-23 16:32:22,064] chirp.directory - INFO: Registered Kenwood_TM-271 = TM271Radio
[2016-02-23 16:32:22,064] chirp.directory - INFO: Registered Kenwood_TM-281 = TM281Radio
[2016-02-23 16:32:22,064] chirp.directory - INFO: Registered Kenwood_TM-471 = TM471Radio
[2016-02-23 16:32:22,064] chirp.directory - INFO: Registered Icom_7200 = Icom7200Radio
[2016-02-23 16:32:22,064] chirp.directory - INFO: Registered Icom_IC-7000 = Icom7000Radio
[2016-02-23 16:32:22,064] chirp.directory - INFO: Registered Icom_746 = Icom746Radio
[2016-02-23 16:32:22,065] chirp.directory - INFO: Registered Alinco_DR03T = DR03Radio
[2016-02-23 16:32:22,065] chirp.directory - INFO: Registered Alinco_DR06T = DR06Radio
[2016-02-23 16:32:22,065] chirp.directory - INFO: Registered Alinco_DR135T = DR135Radio
[2016-02-23 16:32:22,065] chirp.directory - INFO: Registered Alinco_DR235T = DR235Radio
[2016-02-23 16:32:22,065] chirp.directory - INFO: Registered Alinco_DR435T = DR435Radio
[2016-02-23 16:32:22,065] chirp.directory - INFO: Registered Alinco_DJ596 = DJ596Radio
[2016-02-23 16:32:22,065] chirp.directory - INFO: Registered Jetstream_JT220M = JT220MRadio
[2016-02-23 16:32:22,066] chirp.directory - INFO: Registered Alinco_DJ175 = DJ175Radio
[2016-02-23 16:32:22,066] chirp.directory - INFO: Registered AnyTone_5888UV = AnyTone5888UVRadio
[2016-02-23 16:32:22,066] chirp.directory - INFO: Registered Intek_HR-2040 = IntekHR2040Radio
[2016-02-23 16:32:22,066] chirp.directory - INFO: Registered Polmar_DB-50M = PolmarDB50MRadio
[2016-02-23 16:32:22,066] chirp.directory - INFO: Registered Powerwerx_DB-750X = PowerwerxDB750XRadio
[2016-02-23 16:32:22,067] chirp.directory - INFO: Registered AnyTone_TERMN-8R = AnyToneTERMN8RRadio
[2016-02-23 16:32:22,067] chirp.directory - INFO: Registered AnyTone_OBLTR-8R = AnyToneOBLTR8RRadio
[2016-02-23 16:32:22,067] chirp.directory - INFO: Registered Sainsonic_AP510 = AP510Radio
[2016-02-23 16:32:22,067] chirp.directory - INFO: Registered Baofeng_UV-3R = UV3RRadio
[2016-02-23 16:32:22,068] chirp.directory - INFO: Registered Baojie_BJ-9900 = BJ9900Radio
[2016-02-23 16:32:22,068] chirp.directory - INFO: Registered Baofeng_UV-5R = BaofengUV5R
[2016-02-23 16:32:22,068] chirp.directory - INFO: Registered Baofeng_F-11 = BaofengF11Radio
[2016-02-23 16:32:22,068] chirp.directory - INFO: Registered Baofeng_UV-82 = BaofengUV82Radio
[2016-02-23 16:32:22,068] chirp.directory - INFO: Registered Baofeng_UV-6 = BaofengUV6Radio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Intek_KT-980HP = IntekKT980Radio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Baofeng_BF-F8HP = BaofengBFF8HPRadio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Baofeng_UV-82HP = BaofengUV82HPRadio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Baojie_BJ-UV55 = BaojieBJUV55Radio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Feidaxin_FD-268A = FD268ARadio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Feidaxin_FD-268B = FD268BRadio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Feidaxin_FD-288A = FD288ARadio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Feidaxin_FD-288B = FD288BRadio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Feidaxin_FD-150A = FD150ARadio
[2016-02-23 16:32:22,069] chirp.directory - INFO: Registered Feidaxin_FD-160A = FD160ARadio
[2016-02-23 16:32:22,070] chirp.directory - INFO: Registered Feidaxin_FD-450A = FD450ARadio
[2016-02-23 16:32:22,070] chirp.directory - INFO: Registered Feidaxin_FD-460A = FD460ARadio
[2016-02-23 16:32:22,070] chirp.directory - INFO: Registered Yaesu_FT-1802M = FT1802Radio
[2016-02-23 16:32:22,071] chirp.directory - INFO: Registered Yaesu_FT-1D_R = FT1Radio
[2016-02-23 16:32:22,071] chirp.directory - INFO: Registered Yaesu_FT-2800M = FT2800Radio
[2016-02-23 16:32:22,071] chirp.directory - INFO: Registered Yaesu_FT-2900R_1900R = FT2900Radio
[2016-02-23 16:32:22,071] chirp.directory - INFO: Registered Yaesu_FT-2900E_1900E_E = FT2900ERadio
[2016-02-23 16:32:22,072] chirp.directory - INFO: Registered Yaesu_FT-50 = FT50Radio
[2016-02-23 16:32:22,072] chirp.directory - INFO: Registered Yaesu_FT-60 = FT60Radio
[2016-02-23 16:32:22,073] chirp.directory - INFO: Registered Yaesu_FT-7800_7900 = FT7800Radio
[2016-02-23 16:32:22,073] chirp.directory - INFO: Registered Yaesu_FT-8800 = FT8800Radio
[2016-02-23 16:32:22,073] chirp.directory - INFO: Registered Yaesu_FT-8900 = FT8900Radio
[2016-02-23 16:32:22,073] chirp.directory - INFO: Registered Yaesu_FT-8100 = FT8100Radio
[2016-02-23 16:32:22,073] chirp.directory - INFO: Registered Yaesu_FT-817 = FT817Radio
[2016-02-23 16:32:22,073] chirp.directory - INFO: Registered Yaesu_FT-817ND = FT817NDRadio
[2016-02-23 16:32:22,073] chirp.directory - INFO: Registered Yaesu_FT-817ND_US = FT817NDUSRadio
[2016-02-23 16:32:22,074] chirp.directory - INFO: Registered Yaesu_FT-857_897 = FT857Radio
[2016-02-23 16:32:22,074] chirp.directory - INFO: Registered Yaesu_FT-857_897_US = FT857USRadio
[2016-02-23 16:32:22,074] chirp.directory - INFO: Registered Yaesu_FT-90 = FT90Radio
[2016-02-23 16:32:22,075] chirp.directory - INFO: Registered Yaesu_FTM-350 = FTM350Radio
[2016-02-23 16:32:22,075] chirp.directory - INFO: Registered Generic_CSV = CSVRadio
[2016-02-23 16:32:22,075] chirp.directory - INFO: Registered Commander_KG-UV = CommanderCSVRadio
[2016-02-23 16:32:22,076] chirp.directory - INFO: Registered RT_Systems_CSV = RTCSVRadio
[2016-02-23 16:32:22,076] chirp.directory - INFO: Registered ARRL_Travel_Plus = TpeRadio
[2016-02-23 16:32:22,081] chirp.directory - INFO: Registered Generic_XML = XMLRadio
[2016-02-23 16:32:22,085] chirp.directory - INFO: Registered Baofeng_BF-888 = H777Radio
[2016-02-23 16:32:22,085] chirp.directory - INFO: Registered Icom_IC-208H = IC208Radio
[2016-02-23 16:32:22,085] chirp.directory - INFO: Registered Icom_IC-2100H = IC2100Radio
[2016-02-23 16:32:22,085] chirp.directory - INFO: Registered Icom_IC-2200H = IC2200Radio
[2016-02-23 16:32:22,085] chirp.directory - INFO: Registered Icom_IC-2720H = IC2720Radio
[2016-02-23 16:32:22,086] chirp.directory - INFO: Registered Icom_IC-2820H = IC2820Radio
[2016-02-23 16:32:22,086] chirp.directory - INFO: Registered Icom_IC-91_92AD = IC9xRadio
[2016-02-23 16:32:22,086] chirp.directory - INFO: Registered Icom_IC-Q7A = ICQ7Radio
[2016-02-23 16:32:22,087] chirp.directory - INFO: Registered Icom_IC-T70 = ICT70Radio
[2016-02-23 16:32:22,087] chirp.directory - INFO: Registered Icom_IC-T7H = ICT7HRadio
[2016-02-23 16:32:22,087] chirp.directory - INFO: Registered Icom_IC-T8A = ICT8ARadio
[2016-02-23 16:32:22,087] chirp.directory - INFO: Registered Icom_IC-W32A = ICW32ARadio
[2016-02-23 16:32:22,087] chirp.directory - INFO: Registered Icom_IC-W32E = ICW32ERadio
[2016-02-23 16:32:22,088] chirp.directory - INFO: Registered Icom_IC-V82_U82 = ICx8xRadio
[2016-02-23 16:32:22,088] chirp.directory - INFO: Registered Icom_ID-31A = ID31Radio
[2016-02-23 16:32:22,088] chirp.directory - INFO: Registered Icom_ID-51 = ID51Radio
[2016-02-23 16:32:22,088] chirp.directory - INFO: Registered Icom_ID-51_Plus = ID51PLUSRadio
[2016-02-23 16:32:22,088] chirp.directory - INFO: Registered Icom_ID-800H_v2 = ID800v2Radio
[2016-02-23 16:32:22,089] chirp.directory - INFO: Registered Icom_ID-880H = ID880Radio
[2016-02-23 16:32:22,089] chirp.directory - INFO: Registered Icom_ID-80H = ID80Radio
[2016-02-23 16:32:22,089] chirp.directory - INFO: Registered Kenwood_HMK = HMKRadio
[2016-02-23 16:32:22,089] chirp.directory - INFO: Registered Kenwood_ITM = ITMRadio
[2016-02-23 16:32:22,090] chirp.directory - INFO: Registered Wouxun_KG-UV8D = KGUV8DRadio
[2016-02-23 16:32:22,090] chirp.directory - INFO: Registered KYD_NC-630A = NC630aRadio
[2016-02-23 16:32:22,090] chirp.directory - INFO: Registered KYD_IP-620 = IP620Radio
[2016-02-23 16:32:22,091] chirp.directory - INFO: Registered Leixen_VV-898 = LeixenVV898Radio
[2016-02-23 16:32:22,091] chirp.directory - INFO: Registered Jetstream_JT270M = JetstreamJT270MRadio
[2016-02-23 16:32:22,091] chirp.directory - INFO: Registered Wouxun_KG-UVD1P = KGUVD1PRadio
[2016-02-23 16:32:22,091] chirp.directory - INFO: Registered Wouxun_KG-UV6 = KGUV6DRadio
[2016-02-23 16:32:22,091] chirp.directory - INFO: Registered Wouxun_KG-816 = KG816Radio
[2016-02-23 16:32:22,091] chirp.directory - INFO: Registered Wouxun_KG-818 = KG818Radio
[2016-02-23 16:32:22,091] chirp.directory - INFO: Registered Puxing_PX-777 = Puxing777Radio
[2016-02-23 16:32:22,092] chirp.directory - INFO: Registered Puxing_PX-2R = Puxing2RRadio
[2016-02-23 16:32:22,092] chirp.directory - INFO: Registered TYT_TH9000_220 = Th9000220Radio
[2016-02-23 16:32:22,092] chirp.directory - INFO: Registered TYT_TH9000_144 = Th9000144Radio
[2016-02-23 16:32:22,092] chirp.directory - INFO: Registered TYT_TH9000_440 = Th9000440Radio
[2016-02-23 16:32:22,093] chirp.directory - INFO: Registered TYT_TH-9800_File = TYTTH9800File
[2016-02-23 16:32:22,093] chirp.directory - INFO: Registered TYT_TH-9800 = TYTTH9800Radio
[2016-02-23 16:32:22,093] chirp.directory - INFO: Registered TYT_TH-UV3R = TYTUV3RRadio
[2016-02-23 16:32:22,093] chirp.directory - INFO: Registered TYT_TH-UV3R-25 = TYTUV3R25Radio
[2016-02-23 16:32:22,094] chirp.directory - INFO: Registered TYT_TH-UVF8D = TYTUVF8DRadio
[2016-02-23 16:32:22,094] chirp.directory - INFO: Registered Kenwood_TH-D72_clone_mode = THD72Radio
[2016-02-23 16:32:22,094] chirp.directory - INFO: Registered TYT_TH-UVF1 = TYTTHUVF1Radio
[2016-02-23 16:32:22,094] chirp.directory - INFO: Registered Kenwood_TK-260 = TK260_Radio
[2016-02-23 16:32:22,095] chirp.directory - INFO: Registered Kenwood_TK-270 = TK270_Radio
[2016-02-23 16:32:22,095] chirp.directory - INFO: Registered Kenwood_TK-272 = TK272_Radio
[2016-02-23 16:32:22,095] chirp.directory - INFO: Registered Kenwood_TK-278 = TK278_Radio
[2016-02-23 16:32:22,095] chirp.directory - INFO: Registered Kenwood_TK-360 = TK360_Radio
[2016-02-23 16:32:22,095] chirp.directory - INFO: Registered Kenwood_TK-370 = TK370_Radio
[2016-02-23 16:32:22,095] chirp.directory - INFO: Registered Kenwood_TK-372 = TK372_Radio
[2016-02-23 16:32:22,095] chirp.directory - INFO: Registered Kenwood_TK-378 = TK378_Radio
[2016-02-23 16:32:22,095] chirp.directory - INFO: Registered Kenwood_TK-760 = TK760_Radio
[2016-02-23 16:32:22,095] chirp.directory - INFO: Registered Kenwood_TK-762 = TK762_Radio
[2016-02-23 16:32:22,096] chirp.directory - INFO: Registered Kenwood_TK-768 = TK768_Radio
[2016-02-23 16:32:22,096] chirp.directory - INFO: Registered Kenwood_TK-860 = TK860_Radio
[2016-02-23 16:32:22,096] chirp.directory - INFO: Registered Kenwood_TK-862 = TK862_Radio
[2016-02-23 16:32:22,096] chirp.directory - INFO: Registered Kenwood_TK-868 = TK868_Radio
[2016-02-23 16:32:22,096] chirp.directory - INFO: Registered Kenwood_TK-868G = TK868G_Radios
[2016-02-23 16:32:22,096] chirp.directory - INFO: Registered Kenwood_TK-862G = TK862G_Radios
[2016-02-23 16:32:22,096] chirp.directory - INFO: Registered Kenwood_TK-860G = TK860G_Radios
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-768G = TK768G_Radios
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-762G = TK762G_Radios
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-760G = TK760G_Radios
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-278G = TK278G_Radios
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-272G = TK272G_Radios
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-270G = TK270G_Radios
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-260G = TK260G_Radios
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-7102 = KenwoodTK7102Radio
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-8102 = KenwoodTK8102Radio
[2016-02-23 16:32:22,097] chirp.directory - INFO: Registered Kenwood_TK-7108 = KenwoodTK7108Radio
[2016-02-23 16:32:22,098] chirp.directory - INFO: Registered Kenwood_TK-8108 = KenwoodTK8108Radio
[2016-02-23 16:32:22,098] chirp.directory - INFO: Registered Kenwood_TS-2000 = TS2000Radio
[2016-02-23 16:32:22,098] chirp.directory - INFO: Registered Baofeng_UV-B5 = BaofengUVB5
[2016-02-23 16:32:22,098] chirp.directory - INFO: Registered Yaesu_VX-170 = VX170Radio
[2016-02-23 16:32:22,099] chirp.directory - INFO: Registered Yaesu_VX-2 = VX2Radio
[2016-02-23 16:32:22,100] chirp.directory - INFO: Registered Yaesu_VX-3 = VX3Radio
[2016-02-23 16:32:22,100] chirp.directory - INFO: Registered Yaesu_VX-5 = VX5Radio
[2016-02-23 16:32:22,100] chirp.directory - INFO: Registered Yaesu_VX-6 = VX6Radio
[2016-02-23 16:32:22,101] chirp.directory - INFO: Registered Yaesu_VX-7 = VX7Radio
[2016-02-23 16:32:22,101] chirp.directory - INFO: Registered Yaesu_VX-8_R = VX8Radio
[2016-02-23 16:32:22,101] chirp.directory - INFO: Registered Yaesu_VX-8_DR = VX8DRadio
[2016-02-23 16:32:22,101] chirp.directory - INFO: Registered Yaesu_VX-8_GE = VX8GERadio
[2016-02-23 16:32:22,102] chirp.directory - INFO: Registered Vertex_Standard_VXA-700 = VXA700Radio
Email was triggered for: Success
Sending email for trigger: Success
1
0
[chirp_devel] [PATCH] [FT2900] Add msg for attempt to upload to locked radio. Fixes #3055
by Richard Cochran 22 Feb '16
by Richard Cochran 22 Feb '16
22 Feb '16
# HG changeset patch
# User Richard Cochran <ag6qr(a)sonic.net>
# Date 1456163532 28800
# Mon Feb 22 09:52:12 2016 -0800
# Node ID c1b004870809561b8ee6d34dba1043b750373bf6
# Parent 480369e272a2ea6b6d0ff7650c4abebcd47cdab8
[FT2900] Add msg for attempt to upload to locked radio. Fixes #3055
A user may "lock" an FT-2900/FT-1900, preventing configuration changes.
An upload will fail if this is the case. This patch adds some text to
the upload dialog box to help the user avoid attempting to upload to
a locked radio. It also adds some text to the error message that
appears on upload failure, to suggest the user check to make sure
his radio is not locked.
diff -r 480369e272a2 -r c1b004870809 chirp/drivers/ft2900.py
--- a/chirp/drivers/ft2900.py Tue Feb 09 22:45:58 2016 -0500
+++ b/chirp/drivers/ft2900.py Mon Feb 22 09:52:12 2016 -0800
@@ -132,7 +132,10 @@
ack = radio.pipe.read(300)
LOG.debug("Ack was (%i):\n%s" % (len(ack), util.hexprint(ack)))
if ack != ACK:
- raise Exception("Radio did not ack ID")
+ raise Exception("Radio did not ack ID. Check cable, verify"
+ " radio is not locked.\n"
+ " (press & Hold red \"*L\" button to unlock"
+ " radio if needed)")
block = 0
cs = INITIAL_CHECKSUM
@@ -637,7 +640,12 @@
2. Connect data cable.
3. While holding "A/N LOW" button, turn radio on.
4. Press "MW D/MR" to receive image.
- 5. Click OK to dismiss this dialog and start transfer."""))
+ 5. Make sure display says "-WAIT-" (see note below if not)
+ 6. Click OK to dismiss this dialog and start transfer.
+
+ Note: if you don't see "-WAIT-" at step 5, try cycling
+ power and pressing and holding red "*L" button to unlock
+ radio, then start back at step 1."""))
return rp
1
0
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1456094351 18000
# Node ID fa7d02b134986ae2368cf428d9c018cc25a1ec3a
# Parent 56edd24fb2b2f3e30cfba61cb43cc75c35f9570f
[UV-5R] Remove "Special Block" Check
This patch removes the "special block" check. It is no longer needed
now that an upload will not be permitted unless the firmware version of
the image and the firmware version of the radio exactly match.
Bug #3371
diff -r 56edd24fb2b2 -r fa7d02b13498 chirp/drivers/uv5r.py
--- a/chirp/drivers/uv5r.py Sun Feb 21 16:56:54 2016 -0500
+++ b/chirp/drivers/uv5r.py Sun Feb 21 17:39:11 2016 -0500
@@ -395,17 +395,6 @@
return version
-def _special_block_from_data(data, special_block_start, special_block_stop):
- special_block_tag = data[special_block_start:special_block_stop]
- return special_block_tag
-
-
-def _special_block_from_image(radio):
- special_block = _special_block_from_data(radio.get_mmap(), 0x0CFA, 0x0D01)
- LOG.debug("_special_block_from_image: " + util.hexprint(special_block))
- return special_block
-
-
def _do_ident(radio, magic):
serial = radio.pipe
serial.timeout = 1
@@ -479,12 +468,6 @@
return version
-def _get_radio_special_block(radio):
- block = _read_block(radio, 0xCF0, 0x40, False)
- special_block = block[2:9]
- return special_block
-
-
def _ident_radio(radio):
for magic in radio._idents:
error = None
@@ -554,15 +537,6 @@
"of the radio (%s).")
raise errors.RadioError(msg % (image_version, radio_version))
- image_special_block = _special_block_from_image(radio)
- radio_special_block = _get_radio_special_block(radio)
- LOG.debug("Image Special Block is " + util.hexprint(image_special_block))
- LOG.debug("Radio Special Block is " + util.hexprint(radio_special_block))
-
- if image_special_block != radio_special_block:
- raise errors.RadioError("Image not supported by radio: `%s'" %
- radio_special_block)
-
# Main block
for i in range(0x08, 0x1808, 0x10):
_send_block(radio, i - 0x08, radio.get_mmap()[i:i + 0x10])
1
0