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
March 2016
- 9 participants
- 34 discussions
[chirp_devel] [PATCH] [New Model] Support for the BTECH Mobile Radios, update 1 for #3015
by Jim Unroe 28 Mar '16
by Jim Unroe 28 Mar '16
28 Mar '16
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1459126256 14400
# Node ID c7ad0f850fc95ac27e98ff47b127127bcd60acfe
# Parent 1dea27fb59f7adefe00398d8e5648120cddc8e12
[New Model] Support for the BTECH Mobile Radios, update 1 for #3015
This patch includes the following changes:
Bug fixes
- Fixed the bug found by minuteman1120 about the duplex not working in some
cases
- New "split" algorithm for the duplex bug above
diff -r 1dea27fb59f7 -r c7ad0f850fc9 chirp/drivers/btech.py
--- a/chirp/drivers/btech.py Tue Mar 22 18:50:50 2016 -0700
+++ b/chirp/drivers/btech.py Sun Mar 27 20:50:56 2016 -0400
@@ -580,6 +580,21 @@
return (ilow, ihigh)
+def _split(rf, f1, f2):
+ """Returns False if the two freqs are in the same band (no split)
+ or True otherwise"""
+
+ # determine if the two freqs are in the same band
+ for low, high in rf.valid_bands:
+ if f1 >= low and f1 <= high and \
+ f2 >= low and f2 <= high:
+ # if the two freqs are on the same Band this is not a split
+ return False
+
+ # if you get here is because the freq pairs are split
+ return False
+
+
class btech(chirp_common.CloneModeRadio, chirp_common.ExperimentalRadio):
"""BTECH's UV-5001 and alike radios"""
VENDOR = "BTECH"
@@ -805,7 +820,7 @@
# TX freq set
offset = (int(_mem.txfreq) * 10) - mem.freq
if offset != 0:
- if offset > 70000000: # 70 Mhz
+ if _split(self.get_features(), mem.freq, int(_mem.txfreq) * 10):
mem.duplex = "split"
mem.offset = int(_mem.txfreq) * 10
elif offset < 0:
1
0
Update on the driver for the Jetstream JT2705M . It looks like Jim's
observation is correct - the JT2705 looks like a variant of the 8900.
I successfully did an image download from the radio by adding a class to
the existing Btech file and updating the magic and fileid. I was able to
get an image, and also it displayed the channels correctly (need to do more
testing to make sure this assertion is correct.).
I posted the image on the ticket: http://chirp.danplanet.com/issues/3481
I'll do some more work to test this out, and I'll post a patch for the
btech.py file when I'm ready (most likely later this week). Since this
model is under active development, let me know if there are any issues or
updates that I should be aware of.
thanks
Dave
3
5
[chirp_devel] [PATCH] [New Model] Support for the BTECH Mobile Radios, fixes issue #3015
by Jim Unroe 25 Mar '16
by Jim Unroe 25 Mar '16
25 Mar '16
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1458694045 14400
# Node ID e6f8013627457dba4eaa5dac4a026d2a455a6e3d
# Parent 86fcbefbcf670ca1ace59c34262550c5cae4a792
[New Model] Support for the BTECH Mobile Radios, fixes issue #3015
This patch adds "basic support" for the the following radios:
BTECH UV-5001, UV-2501 and UV-2501+220
WACCOM MINI-8900 Plus
"Basic support" is a complete implementaton of the per-channel
settings, including:
Speaker mute
Scramble
Busy channel lockout
PTT ID
PTT ID signal code
Optional signaling
also related to #2673
diff -r 86fcbefbcf67 -r e6f801362745 chirp/drivers/btech.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/drivers/btech.py Tue Mar 22 20:47:25 2016 -0400
@@ -0,0 +1,1009 @@
+# Copyright 2016:
+# * Pavel Milanes CO7WT, <co7wt(a)frcuba.co.cu> <pavelmc(a)gmail.com>
+# * Jim Unroe KC9HI, <rock.unroe(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
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import time
+import struct
+import logging
+
+LOG = logging.getLogger(__name__)
+
+from chirp import chirp_common, directory, memmap
+from chirp import bitwise, errors, util
+from chirp.settings import RadioSettingGroup, RadioSetting, \
+ RadioSettingValueBoolean, RadioSettingValueList, \
+ RadioSettingValueString, RadioSettingValueInteger, \
+ RadioSettings
+from textwrap import dedent
+
+MEM_FORMAT = """
+#seekto 0x0000;
+struct {
+ lbcd rxfreq[4];
+ lbcd txfreq[4];
+ ul16 rxtone;
+ ul16 txtone;
+ u8 unknown0:4,
+ scode:4;
+ u8 unknown1:2,
+ spmute:1,
+ unknown2:3,
+ optsig:2;
+ u8 unknown3:3,
+ scramble:1,
+ unknown4:3,
+ power:1;
+ u8 unknown5:1,
+ wide:1,
+ unknown6:2,
+ bcl:1,
+ add:1,
+ pttid:2;
+} memory[200];
+
+#seekto 0x1000;
+struct {
+ char name[6];
+ u8 unknown1[10];
+} names[200];
+
+#seekto 0x3C90;
+struct {
+ u8 vhf_low[3];
+ u8 vhf_high[3];
+ u8 uhf_low[3];
+ u8 uhf_high[3];
+} ranges;
+
+// the 2501+220 has a different zone for storing ranges
+
+#seekto 0x3CD0;
+struct {
+ u8 vhf_low[3];
+ u8 vhf_high[3];
+ u8 unknown1[4];
+ u8 unknown2[6];
+ u8 vhf2_low[3];
+ u8 vhf2_high[3];
+ u8 unknown3[4];
+ u8 unknown4[6];
+ u8 uhf_low[3];
+ u8 uhf_high[3];
+} ranges220;
+
+"""
+
+# A note about the memmory in these radios
+#
+# The real memory of these radios extends to 0x4000
+# On read the factory software only uses up to 0x3200
+# On write it just uploads the contents up to 0x3100
+#
+# The mem beyond 0x3200 holds the ID data
+
+MEM_SIZE = 0x4000
+BLOCK_SIZE = 0x40
+TX_BLOCK_SIZE = 0x10
+ACK_CMD = "\x06"
+MODES = ["FM", "NFM"]
+SKIP_VALUES = ["S", ""]
+TONES = chirp_common.TONES
+DTCS = sorted(chirp_common.DTCS_CODES + [645])
+NAME_LENGTH = 6
+PTTID_LIST = ["OFF", "BOT", "EOT", "BOTH"]
+PTTIDCODE_LIST = ["%s" % x for x in range(1, 16)]
+OPTSIG_LIST = ["OFF", "DTMF", "2TONE", "5TONE"]
+
+# this var controls the verbosity in the debug and by default it's low (False)
+# make it True and you will to get a very verbose debug.log
+debug = False
+
+# Power Levels
+NORMAL_POWER_LEVELS = [chirp_common.PowerLevel("High", watts=25),
+ chirp_common.PowerLevel("Low", watts=10)]
+UV5001_POWER_LEVELS = [chirp_common.PowerLevel("High", watts=50),
+ chirp_common.PowerLevel("Low", watts=10)]
+
+# this must be defined globaly
+POWER_LEVELS = None
+
+# valid chars on the LCD, Note that " " (space) is stored as "\xFF"
+VALID_CHARS = chirp_common.CHARSET_ALPHANUMERIC + \
+ "`{|}!\"#$%&'()*+,-./:;<=>?@[]^_"
+
+
+##### ID strings #####################################################
+
+# BTECH UV2501 pre-production units
+UV2501pp_fp = "M2C294"
+# BTECH UV2501 pre-production units 2 + and 1st Gen radios
+UV2501pp2_fp = "M29204"
+# B-TECH UV-2501 second generation (2G) radios
+UV2501G2_fp = "BTG214"
+
+
+# B-TECH UV-2501+220 pre-production units
+UV2501_220pp_fp = "M3C281"
+# extra block read for the 2501+220 pre-production units
+UV2501_220pp_id = " 280528"
+# B-TECH UV-2501+220
+UV2501_220_fp = "M3G201"
+# extra block read for the 2501+220
+# the extra block is the same as the pp unit
+
+
+# B-TECH UV-5001 pre-production units + 1st Gen radios
+UV5001pp_fp = "V19204"
+# B-TECH UV-5001 alpha units
+UV5001alpha_fp = "V28204"
+# B-TECH UV-5001 second generation (2G) radios
+# !!!! This is the same as the UV-2501 (2G) Radios !!!!
+UV5001G2_fp = "BTG214"
+# B-TECH UV-5001 second generation (2G2)
+UV5001G22_fp = "V2G204"
+
+
+# WACCOM Mini-8900
+MINI8900_fp = "M28854"
+
+
+#### MAGICS
+# for the Waccom Mini-8900
+MSTRING_MINI8900 = "\x55\xA5\xB5\x45\x55\x45\x4d\x02"
+# for the B-TECH UV-2501+220 (including pre production ones)
+MSTRING_220 = "\x55\x20\x15\x12\x12\x01\x4d\x02"
+# magic string for all other models
+MSTRING = "\x55\x20\x15\x09\x20\x45\x4d\x02"
+
+
+def _rawrecv(radio, amount):
+ """Raw read from the radio device, new approach, this time a byte at
+ a time as the original driver, the receive data has to be atomic"""
+ data = ""
+
+ try:
+ tdiff = 0
+ start = time.time()
+ maxtime = amount * 0.020
+
+ while len(data) < amount and tdiff < maxtime:
+ d = radio.pipe.read(1)
+ if len(d) == 1:
+ data += d
+
+ # Delta time
+ tdiff = time.time() - start
+
+ # DEBUG
+ if debug is True:
+ LOG.debug("time diff %.04f maxtime %.04f, data: %d" %
+ (tdiff, maxtime, len(data)))
+
+ # DEBUG
+ if debug is True:
+ LOG.debug("<== (%d) bytes:\n\n%s" %
+ (len(data), util.hexprint(data)))
+
+ if len(data) < amount:
+ LOG.error("Short reading %d bytes from the %d requested." %
+ (len(data), amount))
+
+ except:
+ raise errors.RadioError("Error reading data from radio")
+
+ return data
+
+
+def _rawsend(radio, data):
+ """Raw send to the radio device"""
+ try:
+ for byte in data:
+ radio.pipe.write(byte)
+ time.sleep(0.003)
+
+ # DEBUG
+ if debug is True:
+ LOG.debug("==> (%d) bytes:\n\n%s" %
+ (len(data), util.hexprint(data)))
+ except:
+ raise errors.RadioError("Error sending data to radio")
+
+
+def _make_frame(cmd, addr, length, data=""):
+ """Pack the info in the headder format"""
+ frame = "\x06" + struct.pack(">BHB", ord(cmd), addr, length)
+ # add the data if set
+ if len(data) != 0:
+ frame += data
+
+ return frame
+
+
+def _send(radio, frame, pause=0):
+ """Generic send data to the radio"""
+ _rawsend(radio, frame)
+
+ # make a *optional* pause, to allow to build for an answer
+ if pause != 0:
+ time.sleep(pause)
+
+
+def _recv(radio, addr):
+ """Get data from the radio """
+ # 1 byte ACK +
+ # 4 bytes header +
+ # data of length of data (as I see always 0x40 = 64 bytes)
+
+ # catching ack
+ ack = _rawrecv(radio, 1)
+
+ # checking for a response
+ if len(ack) != 1:
+ msg = "No response in the read of the block #0x%04x" % addr
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # valid data
+ if ack != ACK_CMD:
+ msg = "Bad ack received from radio in block 0x%04x" % addr
+ LOG.error(msg)
+ LOG.debug("Bad ACK was 0x%02x" % ord(ack))
+ raise errors.RadioError(msg)
+
+ # Get the header + basic sanitize
+ hdr = _rawrecv(radio, 4)
+ if len(hdr) != 4:
+ msg = "Short header for block: 0x%04x" % addr
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # receive and validate the header
+ c, a, l = struct.unpack(">BHB", hdr)
+ if a != addr or l != BLOCK_SIZE or c != ord("X"):
+ msg = "Invalid answer for block 0x%04x:" % addr
+ LOG.error(msg)
+ LOG.debug("CMD: %s ADDR: %04x SIZE: %02x" % (c, a, l))
+ raise errors.RadioError(msg)
+
+ # Get the data
+ data = _rawrecv(radio, l)
+
+ # basic validation
+ if len(data) != l:
+ msg = "Short block of data in block #0x%04x" % addr
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ return data
+
+
+def _do_magic(radio, status):
+ """Try to put the radio in program mode and get the ident string
+ it will make multiple tries"""
+
+ # how many tries
+ tries = 5
+
+ # prep the data to show in the UI
+ status.cur = 0
+ status.msg = "Identifying the radio..."
+ status.max = len(radio._magic) * tries
+ radio.status_fn(status)
+ mc = 0
+
+ try:
+ # do the magic
+ for magic in radio._magic:
+ # we try a few times
+ for a in range(0, tries):
+ # Update the UI
+ status.cur = (mc * tries) + a
+ radio.status_fn(status)
+
+ # cleaning the serial buffer, try wrapped
+ try:
+ radio.pipe.flushInput()
+ except:
+ msg = "Error with a serial rx buffer flush at _do_magic"
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # send the magic a byte at a time
+ for byte in magic:
+ ack = _rawrecv(radio, 1)
+ _send(radio, byte)
+
+ # A explicit time delay, with a longer one for the UV-5001
+ if "5001" in radio.MODEL:
+ time.sleep(0.5)
+ else:
+ time.sleep(0.1)
+
+ # Now you get a x06 of ACK if all goes well
+ ack = _rawrecv(radio, 1)
+
+ if ack == "\x06":
+ # DEBUG
+ LOG.info("Magic ACK received")
+ status.msg = "Positive Ident!"
+ status.cur = status.max
+ radio.status_fn(status)
+
+ return True
+
+ # increment the count of magics to send, this is for the UI status
+ mc += 1
+
+ # wait between tries for different MAGICs to allow the radio to
+ # timeout, this is an experimental fature for the 5001 alpha that
+ # has the same ident as the MINI8900, raise it if it don't work
+ time.sleep(5)
+
+ except errors.RadioError:
+ raise
+ except Exception, e:
+ msg = "Unknown error sending Magic to radio:\n%s" % e
+ raise errors.RadioError(msg)
+
+ return False
+
+
+def _do_ident(radio, status):
+ """Put the radio in PROGRAM mode & identify it"""
+ # set the serial discipline
+ radio.pipe.setBaudrate(9600)
+ radio.pipe.setParity("N")
+ radio.pipe.setTimeout(0.005)
+ # cleaning the serial buffer, try wrapped
+ try:
+ radio.pipe.flushInput()
+ except:
+ msg = "Error with a serial rx buffer flush at _do_ident"
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # do the magic trick
+ if _do_magic(radio, status) is False:
+ msg = "Radio did not respond to magic string, check your cable."
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # Ok, get the ident string
+ ident = _rawrecv(radio, 49)
+
+ # basic check for the ident
+ if len(ident) != 49:
+ msg = "Radio send a sort ident block, you need to increase maxtime."
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # check if ident is OK
+ itis = False
+ for fp in radio._fileid:
+ if fp in ident:
+ itis = True
+ break
+
+ if itis is False:
+ # bad ident
+ msg = "Incorrect model ID, got this:\n\n"
+ msg += util.hexprint(ident)
+ LOG.debug(msg)
+ raise errors.RadioError("Radio identification failed.")
+
+ # DEBUG
+ LOG.info("Positive ident, this is a %s" % radio.MODEL)
+
+ # Ok, we have a radio in the other end, we need a pause here
+ time.sleep(0.01)
+
+ # the 2501+220 has one more check:
+ # reading the block 0x3DF0 to see if it's a code inside
+ if "+220" in radio.MODEL:
+ # DEBUG
+ LOG.debug("This is a BTECH UV-2501+220, requesting the extra ID")
+ # send the read request
+ _send(radio, _make_frame("S", 0x3DF0, 16), 0.04)
+ id2 = _rawrecv(radio, 20)
+ # WARNING !!!!!!
+ # Different versions send as response with a different amount of data
+ # it seems that it's padded with \xff, \x20 and some times with \x00
+ # we just care about the first 16, our magic string is in there
+ if len(id2) < 16:
+ msg = "The extra UV-2501+220 ID is short, aborting."
+ # DEBUG
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # ok, check for it, any of the correct ID must be in the received data
+ itis = False
+ for eid in radio._id2:
+ if eid in id2:
+ # DEBUG
+ LOG.info("Confirmed, this is a BTECH UV-2501+220")
+ # set the flag and exit
+ itis = True
+ break
+
+ # It is a UV-2501+220?
+ if itis is False:
+ msg = "The extra UV-2501+220 ID is wrong, aborting."
+ # DEBUG
+ LOG.error(msg)
+ LOG.debug("Full extra ID on the 2501+220 is: \n%s" %
+ util.hexprint(id2))
+ raise errors.RadioError(msg)
+
+ return True
+
+
+def _download(radio):
+ """Get the memory map"""
+
+ # UI progress
+ status = chirp_common.Status()
+
+ # put radio in program mode and identify it
+ _do_ident(radio, status)
+
+ # the first dummy packet for all model but the 2501+220
+ if not "+220" in radio.MODEL:
+ # In the logs we have found that the first block is discarded
+ # this is the \x05 in ack one, so we will simulate it here
+ _send(radio, _make_frame("S", 0, BLOCK_SIZE), 0.1)
+ discard = _rawrecv(radio, BLOCK_SIZE)
+
+ if debug is True:
+ LOG.info("Dummy first block read done, got this:\n\n")
+ LOG.debug(util.hexprint(discard))
+
+ # reset the progress bar in the UI
+ status.max = MEM_SIZE / BLOCK_SIZE
+ status.msg = "Cloning from radio..."
+ status.cur = 0
+ radio.status_fn(status)
+
+ data = ""
+ for addr in range(0, MEM_SIZE, BLOCK_SIZE):
+ # flush input, as per the original driver behavior, try wrapped
+ try:
+ radio.pipe.flushInput()
+ except:
+ msg = "Error with a serial rx buffer flush at _download"
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # sending the read request
+ _send(radio, _make_frame("S", addr, BLOCK_SIZE), 0.1)
+
+ # read
+ d = _recv(radio, addr)
+
+ # aggregate the data
+ data += d
+
+ # UI Update
+ status.cur = addr / BLOCK_SIZE
+ status.msg = "Cloning from radio..."
+ radio.status_fn(status)
+
+ return data
+
+
+def _upload(radio):
+ """Upload procedure"""
+
+ # The UPLOAD mem is restricted to lower than 0x3100,
+ # so we will overide that here localy
+ MEM_SIZE = 0x3100
+
+ # UI progress
+ status = chirp_common.Status()
+
+ # put radio in program mode and identify it
+ _do_ident(radio, status)
+
+ # get the data to upload to radio
+ data = radio.get_mmap()
+
+ # Reset the UI progress
+ status.max = MEM_SIZE / TX_BLOCK_SIZE
+ status.cur = 0
+ status.msg = "Cloning to radio..."
+ radio.status_fn(status)
+
+ # the fun start here
+ for addr in range(0, MEM_SIZE, TX_BLOCK_SIZE):
+ # flush input, as per the original driver behavior, try wrapped
+ try:
+ radio.pipe.flushInput()
+ except:
+ msg = "Error with a serial rx buffer flush at _upload"
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # sending the data
+ d = data[addr:addr + TX_BLOCK_SIZE]
+ _send(radio, _make_frame("X", addr, TX_BLOCK_SIZE, d), 0.015)
+
+ # receiving the response
+ ack = _rawrecv(radio, 1)
+
+ # basic check
+ if len(ack) != 1:
+ msg = "No response in the write of block #0x%04x" % addr
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ if not ack in "\x06\x05":
+ msg = "Bad ack writing block 0x%04x:" % addr
+ LOG.info(msg)
+ raise errors.RadioError(msg)
+
+ # UI Update
+ status.cur = addr / TX_BLOCK_SIZE
+ status.msg = "Cloning to radio..."
+ radio.status_fn(status)
+
+
+def model_match(cls, data):
+ """Match the opened/downloaded image to the correct version"""
+ rid = data[0x3f70:0x3f76]
+
+ if rid in cls._fileid:
+ return True
+
+ return False
+
+
+def _decode_ranges(low, high):
+ """Unpack the data in the ranges zones in the memmap and return
+ a tuple with the integer corresponding to the Mhz it means"""
+ ilow = int(low[0]) * 100 + int(low[1]) * 10 + int(low[2])
+ ihigh = int(high[0]) * 100 + int(high[1]) * 10 + int(high[2])
+ ilow *= 1000000
+ ihigh *= 1000000
+
+ return (ilow, ihigh)
+
+
+class btech(chirp_common.CloneModeRadio, chirp_common.ExperimentalRadio):
+ """BTECH's UV-5001 and alike radios"""
+ VENDOR = "BTECH"
+ MODEL = ""
+ IDENT = ""
+ _vhf_range = (130000000, 180000000)
+ _220_range = (210000000, 231000000)
+ _uhf_range = (400000000, 521000000)
+ _upper = 199
+ _magic = None
+ _fileid = None
+
+ @classmethod
+ def get_prompts(cls):
+ rp = chirp_common.RadioPrompts()
+ rp.experimental = \
+ ('This driver is experimental and for personal use only.\n'
+ '\n'
+ 'Please keep a copy of your memories with the original software '
+ 'if you treasure them, this is the first release and may contain'
+ ' bugs.\n'
+ '\n'
+ 'You will miss the setting tab, we are working on it. Your '
+ 'success/failure story is appreciated, visit the Chirp\'s '
+ 'website and drop us a comment or just say THANKS if it works '
+ 'for you.\n'
+ )
+ rp.pre_download = _(dedent("""\
+ Follow these instructions to download your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the download of your radio data
+
+ """))
+ rp.pre_upload = _(dedent("""\
+ Follow these instructions to upload your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the upload of your radio data
+
+ """))
+ return rp
+
+ def get_features(self):
+ """Get the radio's features"""
+
+ # we will use the following var as global
+ global POWER_LEVELS
+
+ rf = chirp_common.RadioFeatures()
+ rf.has_settings = False
+ rf.has_bank = False
+ rf.has_tuning_step = False
+ rf.can_odd_split = True
+ rf.has_name = True
+ rf.has_offset = True
+ rf.has_mode = True
+ rf.has_dtcs = True
+ rf.has_rx_dtcs = True
+ rf.has_dtcs_polarity = True
+ rf.has_ctone = True
+ rf.has_cross = True
+ rf.valid_modes = MODES
+ rf.valid_characters = VALID_CHARS
+ rf.valid_name_length = NAME_LENGTH
+ rf.valid_duplexes = ["", "-", "+", "split", "off"]
+ rf.valid_tmodes = ['', 'Tone', 'TSQL', 'DTCS', 'Cross']
+ rf.valid_cross_modes = [
+ "Tone->Tone",
+ "DTCS->",
+ "->DTCS",
+ "Tone->DTCS",
+ "DTCS->Tone",
+ "->Tone",
+ "DTCS->DTCS"]
+ rf.valid_skips = SKIP_VALUES
+ rf.valid_dtcs_codes = DTCS
+ rf.memory_bounds = (0, self._upper)
+
+ # power levels
+ if self.MODEL == "UV-5001":
+ POWER_LEVELS = UV5001_POWER_LEVELS # Higher power (50W)
+ else:
+ POWER_LEVELS = NORMAL_POWER_LEVELS # Lower power (25W)
+
+ rf.valid_power_levels = POWER_LEVELS
+
+ # bands
+ rf.valid_bands = [self._vhf_range, self._uhf_range]
+
+ # 2501+220
+ if self.MODEL == "UV-2501+220":
+ rf.valid_bands.append(self._220_range)
+
+ return rf
+
+ def sync_in(self):
+ """Download from radio"""
+ data = _download(self)
+ self._mmap = memmap.MemoryMap(data)
+ self.process_mmap()
+
+ def sync_out(self):
+ """Upload to radio"""
+ try:
+ _upload(self)
+ except errors.RadioError:
+ raise
+ except Exception, e:
+ raise errors.RadioError("Error: %s" % e)
+
+ def set_options(self):
+ """This is to read the options from the image and set it in the
+ environment, for now just the limits of the freqs in the VHF/UHF
+ ranges"""
+
+ # setting the correct ranges for each radio type
+ if self.MODEL == "UV-2501+220":
+ # the model 2501+220 has a segment in 220
+ # and a different position in the memmap
+ ranges = self._memobj.ranges220
+ else:
+ ranges = self._memobj.ranges
+
+ # the normal dual bands
+ vhf = _decode_ranges(ranges.vhf_low, ranges.vhf_high)
+ uhf = _decode_ranges(ranges.uhf_low, ranges.uhf_high)
+
+ # DEBUG
+ LOG.info("Radio ranges: VHF %d to %d" % vhf)
+ LOG.info("Radio ranges: UHF %d to %d" % uhf)
+
+ # 220Mhz case
+ if self.MODEL == "UV-2501+220":
+ vhf2 = _decode_ranges(ranges.vhf2_low, ranges.vhf2_high)
+ LOG.info("Radio ranges: VHF(220) %d to %d" % vhf2)
+ self._220_range = vhf2
+
+ # set the class with the real data
+ self._vhf_range = vhf
+ self._uhf_range = uhf
+
+ def process_mmap(self):
+ """Process the mem map into the mem object"""
+
+ # Get it
+ self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)
+
+ # load specific parameters from the radio image
+ self.set_options()
+
+ def get_raw_memory(self, number):
+ return repr(self._memobj.memory[number])
+
+ def _decode_tone(self, val):
+ """Parse the tone data to decode from mem, it returns:
+ Mode (''|DTCS|Tone), Value (None|###), Polarity (None,N,R)"""
+ pol = None
+
+ if val in [0, 65535]:
+ return '', None, None
+ elif val > 0x0258:
+ a = val / 10.0
+ return 'Tone', a, pol
+ else:
+ if val > 0x69:
+ index = val - 0x6A
+ pol = "R"
+ else:
+ index = val - 1
+ pol = "N"
+
+ tone = DTCS[index]
+ return 'DTCS', tone, pol
+
+ def _encode_tone(self, memval, mode, val, pol):
+ """Parse the tone data to encode from UI to mem"""
+ if mode == '' or mode is None:
+ memval.set_raw("\x00\x00")
+ elif mode == 'Tone':
+ memval.set_value(val * 10)
+ elif mode == 'DTCS':
+ # detect the index in the DTCS list
+ try:
+ index = DTCS.index(val)
+ if pol == "N":
+ index += 1
+ else:
+ index += 0x6A
+ memval.set_value(index)
+ except:
+ msg = "Digital Tone '%d' is not supported" % value
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+ else:
+ msg = "Internal error: invalid mode '%s'" % mode
+ LOG.error(msg)
+ raise errors.InvalidDataError(msg)
+
+ def get_memory(self, number):
+ """Get the mem representation from the radio image"""
+ _mem = self._memobj.memory[number]
+ _names = self._memobj.names[number]
+
+ # Create a high-level memory object to return to the UI
+ mem = chirp_common.Memory()
+
+ # Memory number
+ mem.number = number
+
+ if _mem.get_raw()[0] == "\xFF":
+ mem.empty = True
+ return mem
+
+ # Freq and offset
+ mem.freq = int(_mem.rxfreq) * 10
+ # tx freq can be blank
+ if _mem.get_raw()[4] == "\xFF":
+ # TX freq not set
+ mem.offset = 0
+ mem.duplex = "off"
+ else:
+ # TX freq set
+ offset = (int(_mem.txfreq) * 10) - mem.freq
+ if offset != 0:
+ if offset > 70000000: # 70 Mhz
+ mem.duplex = "split"
+ mem.offset = int(_mem.txfreq) * 10
+ elif offset < 0:
+ mem.offset = abs(offset)
+ mem.duplex = "-"
+ elif offset > 0:
+ mem.offset = offset
+ mem.duplex = "+"
+ else:
+ mem.offset = 0
+
+ # name TAG of the channel
+ mem.name = str(_names.name).rstrip("\xFF").replace("\xFF", " ")
+
+ # power
+ mem.power = POWER_LEVELS[int(_mem.power)]
+
+ # wide/narrow
+ mem.mode = MODES[int(_mem.wide)]
+
+ # skip
+ mem.skip = SKIP_VALUES[_mem.add]
+
+ # tone data
+ rxtone = txtone = None
+ txtone = self._decode_tone(_mem.txtone)
+ rxtone = self._decode_tone(_mem.rxtone)
+ chirp_common.split_tone_decode(mem, txtone, rxtone)
+
+ # Extra
+ mem.extra = RadioSettingGroup("extra", "Extra")
+
+ spmute = RadioSetting("spmute", "Speaker mute",
+ RadioSettingValueBoolean(bool(_mem.spmute)))
+ mem.extra.append(spmute)
+
+ scramble = RadioSetting("scramble", "Scramble",
+ RadioSettingValueBoolean(bool(_mem.scramble)))
+ mem.extra.append(scramble)
+
+ bcl = RadioSetting("bcl", "Busy channel lockout",
+ RadioSettingValueBoolean(bool(_mem.bcl)))
+ mem.extra.append(bcl)
+
+ pttid = RadioSetting("pttid", "PTT ID",
+ RadioSettingValueList(PTTID_LIST,
+ PTTID_LIST[_mem.pttid]))
+ mem.extra.append(pttid)
+
+ pttidcode = RadioSetting("scode", "PTT ID signal code",
+ RadioSettingValueList(
+ PTTIDCODE_LIST,
+ PTTIDCODE_LIST[_mem.scode]))
+ mem.extra.append(pttidcode)
+
+ optsig = RadioSetting("optsig", "Optional signaling",
+ RadioSettingValueList(
+ OPTSIG_LIST,
+ OPTSIG_LIST[_mem.optsig]))
+ mem.extra.append(optsig)
+
+ return mem
+
+ def set_memory(self, mem):
+ """Set the memory data in the eeprom img from the UI"""
+ # get the eprom representation of this channel
+ _mem = self._memobj.memory[mem.number]
+ _names = self._memobj.names[mem.number]
+
+ # if empty memmory
+ if mem.empty:
+ # the channel itself
+ _mem.set_raw("\xFF" * 16)
+ # the name tag
+ _names.set_raw("\xFF" * 16)
+ return
+
+ # frequency
+ _mem.rxfreq = mem.freq / 10
+
+ # duplex
+ if mem.duplex == "+":
+ _mem.txfreq = (mem.freq + mem.offset) / 10
+ elif mem.duplex == "-":
+ _mem.txfreq = (mem.freq - mem.offset) / 10
+ elif mem.duplex == "off":
+ for i in _mem.txfreq:
+ i.set_raw("\xFF")
+ elif mem.duplex == "split":
+ _mem.txfreq = mem.offset / 10
+ else:
+ _mem.txfreq = mem.freq / 10
+
+ # tone data
+ ((txmode, txtone, txpol), (rxmode, rxtone, rxpol)) = \
+ chirp_common.split_tone_encode(mem)
+ self._encode_tone(_mem.txtone, txmode, txtone, txpol)
+ self._encode_tone(_mem.rxtone, rxmode, rxtone, rxpol)
+
+ # name TAG of the channel
+ if len(mem.name) < NAME_LENGTH:
+ # we must pad to NAME_LENGTH chars, " " = "\xFF"
+ mem.name = str(mem.name).ljust(NAME_LENGTH, " ")
+ _names.name = str(mem.name).replace(" ", "\xFF")
+
+ # power, # default power level is high
+ _mem.power = 0 if mem.power is None else POWER_LEVELS.index(mem.power)
+
+ # wide/narrow
+ _mem.wide = MODES.index(mem.mode)
+
+ # scan add property
+ _mem.add = SKIP_VALUES.index(mem.skip)
+
+ # reseting unknowns, this have to be set by hand
+ _mem.unknown0 = 0
+ _mem.unknown1 = 0
+ _mem.unknown2 = 0
+ _mem.unknown3 = 0
+ _mem.unknown4 = 0
+ _mem.unknown5 = 0
+ _mem.unknown6 = 0
+
+ # extra settings
+ if len(mem.extra) > 0:
+ # there are setting, parse
+ for setting in mem.extra:
+ setattr(_mem, setting.get_name(), setting.value)
+ else:
+ # there is no extra settings, load defaults
+ _mem.spmute = 0
+ _mem.optsig = 0
+ _mem.scramble = 0
+ _mem.bcl = 0
+ _mem.pttid = 0
+ _mem.scode = 0
+
+ return mem
+
+ @classmethod
+ def match_model(cls, filedata, filename):
+ match_size = False
+ match_model = False
+
+ # testing the file data size
+ if len(filedata) == MEM_SIZE:
+ match_size = True
+
+ # testing the firmware model fingerprint
+ match_model = model_match(cls, filedata)
+
+ if match_size and match_model:
+ return True
+ else:
+ return False
+
+
+# Note:
+# the order in the lists in the _magic, IDENT and _fileid is important
+# we put the most common units first, the policy is as follows:
+
+# - First latest (newer) units, as they will be the most common
+# - Second the former latest version, and recursively...
+# - At the end the pre-production units (pp) as this will be unique
+
+(a)directory.register
+class UV2501(btech):
+ """Baofeng Tech UV2501"""
+ MODEL = "UV-2501"
+ _magic = [MSTRING, ]
+ _fileid = [UV2501G2_fp, UV2501pp2_fp, UV2501pp_fp]
+
+
+(a)directory.register
+class UV2501_220(btech):
+ """Baofeng Tech UV2501+220"""
+ MODEL = "UV-2501+220"
+ _magic = [MSTRING_220, ]
+ _fileid = [UV2501_220_fp, UV2501_220pp_fp]
+ _id2 = [UV2501_220pp_id, ]
+
+
+(a)directory.register
+class UV5001(btech):
+ """Baofeng Tech UV5001"""
+ MODEL = "UV-5001"
+ _magic = [MSTRING, MSTRING_MINI8900]
+ _fileid = [UV5001G22_fp, UV5001G2_fp, UV5001alpha_fp, UV5001pp_fp]
+
+
+(a)directory.register
+class MINI8900(btech):
+ """WACCOM MINI-8900"""
+ VENDOR = "WACCOM"
+ MODEL = "MINI-8900"
+ _magic = [MSTRING_MINI8900, ]
+ _fileid = [MINI8900_fp, ]
diff -r 86fcbefbcf67 -r e6f801362745 tests/images/BTECH_UV-2501+220.img
Binary file tests/images/BTECH_UV-2501+220.img has changed
diff -r 86fcbefbcf67 -r e6f801362745 tests/images/BTECH_UV-5001.img
Binary file tests/images/BTECH_UV-5001.img has changed
diff -r 86fcbefbcf67 -r e6f801362745 tests/images/WACCOM_MINI-8900.img
Binary file tests/images/WACCOM_MINI-8900.img has changed
3
16
Hi all,
I think I've been a little lazy about making sure we update the model
support list on the wiki recently.
Just as a reminder, if you add support for a new model, please update
the list here:
http://chirp.danplanet.com/projects/chirp/wiki/Supported_Radios
We don't need to mention every possible variant there, but if you add
support for a whole new model (or a new radio that is a clone of
another), please edit that list accordingly.
If you've added one or more recently, please have a look and see if it
is there and add it if not.
Thanks!
--Dan
2
3
Tested changes:
[Dan Smith <dsmith(a)danplanet.com>] Add test images for #3015
>From Jim Unroe
[Jim Unroe <rock.unroe(a)gmail.com>] [New Model] Support for the BTECH Mobile Radios, fixes issue #3015
This patch adds "basic support" for the the following radios:
BTECH UV-5001, UV-2501 and UV-2501+220
WACCOM MINI-8900 Plus
"Basic support" is a complete implementaton of the per-channel
settings, including:
Speaker mute
Scramble
Busy channel lockout
PTT ID
PTT ID signal code
Optional signaling
also related to #2673
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
4 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 86fcbefbcf670ca1ace59c34262550c5cae4a792
[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 86fcbefbcf670ca1ace59c34262550c5cae4a792
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson2676806215449273542.sh
[workspace] $ /bin/sh -xe /tmp/hudson7304769136041885128.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.051s
OK
FAIL: Please keep commit message lines to <80 columns
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
./chirp/ui/mainapp.py:637:13: E128 continuation line under-indented for visual indent
./chirp/ui/mainapp.py:651:5: E303 too many blank lines (2)
./chirp/ui/mainapp.py:1355:80: E501 line too long (81 > 79 characters)
./chirp/ui/mainapp.py:1637:80: E501 line too long (85 > 79 characters)
real 0m7.520s
user 0m7.366s
sys 0m0.078s
================================================
Tests FAILED: style tests
Build step 'Execute shell' marked build as failure
Email was triggered for: Failure
Sending email for trigger: Failure
1
1
[chirp_devel] Loan offer to make the Kenwoods TK-880/TK-981 into Chirp, any developer available?
by M.Sc. Pavel Milanes Costa 21 Mar '16
by M.Sc. Pavel Milanes Costa 21 Mar '16
21 Mar '16
Issue #3475 has been updated by Yaron Oren-Pines.
Hi Pavel,
I would be happy to loan a Kenwood Radio in this family (Can loan TK-880
and/or TK-981) to a local developer.
I live in the San Francisco Bay Area (San Jose, California) and can be
reached at k6yop(a)arrl.net
If you know of anyone local here, please put us in touch,
Yaron - K6YOP
New Model #3475: Support for Kenwood: other Kenwood Radios that work in
the HAM Bands
============================
From my experience all Commercial Kenwoods are essentially the same
inside, there are two drivers already in Chirp (tk760.py & tk760g.py)
that can be used as templates.
A there is a third one under development here for the TK-790, I lack
time right now an sending the radio to me is (yet) a hard task (I live
in Cuba, customs, etc.)
Commercial Kenwoods are a *X because they use the same layout for
different radios in the same family, the only thing you need is to
acquire the IDs and band edges for the other members of the family and
boom! you will have a driver that can handle a bunch of radios.
I can help but not lead the development, without the radio is a hard task.
73 CO7WT.
1
0
Hi,
Does anyone have a North American Kenwood TH-D72 that they could do a
factory reset on and send me the pristine image.
There is an image ( provied by KD7LXL ) in the images directory but it
is a partially modified version.
Thanks
Angus
2
5
Tested changes:
[K. Arvanitis <kosta(a)alumni.uvic.ca>] Provides an option for the user to toggle cloning instructions from the help
menu. This allows for the ability to re-enable the instructions once they have
been disabled.
Bug #3437
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
1 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 30fd4d736864b0dd5becc6264236193bd85b6d0a
[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 30fd4d736864b0dd5becc6264236193bd85b6d0a
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson2474929893833293008.sh
[workspace] $ /bin/sh -xe /tmp/hudson3522582379983906905.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.053s
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
./chirp/ui/mainapp.py:637:13: E128 continuation line under-indented for visual indent
./chirp/ui/mainapp.py:651:5: E303 too many blank lines (2)
./chirp/ui/mainapp.py:1355:80: E501 line too long (81 > 79 characters)
./chirp/ui/mainapp.py:1637:80: E501 line too long (85 > 79 characters)
real 0m7.565s
user 0m7.447s
sys 0m0.047s
================================================
Tests OK
+ cat /var/lib/jenkins/.chirp/debug.log
[2016-03-15 08:17:24,736] chirp.logger - DEBUG: CHIRP 0.3.0dev on Linux - Ubuntu 14.04.3 LTS (Python 2.7.6)
[2016-03-15 08:17:24,746] chirp.directory - INFO: Registered Kenwood_TH-D7 = THD7Radio
[2016-03-15 08:17:24,746] chirp.directory - INFO: Registered Kenwood_TH-D7G = THD7GRadio
[2016-03-15 08:17:24,746] chirp.directory - INFO: Registered Kenwood_TM-D700 = TMD700Radio
[2016-03-15 08:17:24,746] chirp.directory - INFO: Registered Kenwood_TM-V7 = TMV7Radio
[2016-03-15 08:17:24,746] chirp.directory - INFO: Registered Kenwood_TM-G707 = TMG707Radio
[2016-03-15 08:17:24,746] chirp.directory - INFO: Registered Kenwood_TH-G71 = THG71Radio
[2016-03-15 08:17:24,746] chirp.directory - INFO: Registered Kenwood_TH-F6 = THF6ARadio
[2016-03-15 08:17:24,747] chirp.directory - INFO: Registered Kenwood_TH-F7 = THF7ERadio
[2016-03-15 08:17:24,747] chirp.directory - INFO: Registered Kenwood_TM-D710 = TMD710Radio
[2016-03-15 08:17:24,747] chirp.directory - INFO: Registered Kenwood_TH-D72_live_mode = THD72Radio
[2016-03-15 08:17:24,747] chirp.directory - INFO: Registered Kenwood_TM-V71 = TMV71Radio
[2016-03-15 08:17:24,747] chirp.directory - INFO: Registered Kenwood_TM-D710G = TMD710GRadio
[2016-03-15 08:17:24,747] chirp.directory - INFO: Registered Kenwood_TH-K2 = THK2Radio
[2016-03-15 08:17:24,747] chirp.directory - INFO: Registered Kenwood_TM-271 = TM271Radio
[2016-03-15 08:17:24,747] chirp.directory - INFO: Registered Kenwood_TM-281 = TM281Radio
[2016-03-15 08:17:24,747] chirp.directory - INFO: Registered Kenwood_TM-471 = TM471Radio
[2016-03-15 08:17:24,748] chirp.directory - INFO: Registered Icom_7200 = Icom7200Radio
[2016-03-15 08:17:24,748] chirp.directory - INFO: Registered Icom_IC-7000 = Icom7000Radio
[2016-03-15 08:17:24,748] chirp.directory - INFO: Registered Icom_746 = Icom746Radio
[2016-03-15 08:17:24,748] chirp.directory - INFO: Registered Alinco_DR03T = DR03Radio
[2016-03-15 08:17:24,748] chirp.directory - INFO: Registered Alinco_DR06T = DR06Radio
[2016-03-15 08:17:24,748] chirp.directory - INFO: Registered Alinco_DR135T = DR135Radio
[2016-03-15 08:17:24,748] chirp.directory - INFO: Registered Alinco_DR235T = DR235Radio
[2016-03-15 08:17:24,749] chirp.directory - INFO: Registered Alinco_DR435T = DR435Radio
[2016-03-15 08:17:24,749] chirp.directory - INFO: Registered Alinco_DJ596 = DJ596Radio
[2016-03-15 08:17:24,749] chirp.directory - INFO: Registered Jetstream_JT220M = JT220MRadio
[2016-03-15 08:17:24,749] chirp.directory - INFO: Registered Alinco_DJ175 = DJ175Radio
[2016-03-15 08:17:24,749] chirp.directory - INFO: Registered AnyTone_5888UV = AnyTone5888UVRadio
[2016-03-15 08:17:24,749] chirp.directory - INFO: Registered Intek_HR-2040 = IntekHR2040Radio
[2016-03-15 08:17:24,749] chirp.directory - INFO: Registered Polmar_DB-50M = PolmarDB50MRadio
[2016-03-15 08:17:24,749] chirp.directory - INFO: Registered Powerwerx_DB-750X = PowerwerxDB750XRadio
[2016-03-15 08:17:24,750] chirp.directory - INFO: Registered AnyTone_TERMN-8R = AnyToneTERMN8RRadio
[2016-03-15 08:17:24,750] chirp.directory - INFO: Registered AnyTone_OBLTR-8R = AnyToneOBLTR8RRadio
[2016-03-15 08:17:24,750] chirp.directory - INFO: Registered Sainsonic_AP510 = AP510Radio
[2016-03-15 08:17:24,751] chirp.directory - INFO: Registered Baofeng_UV-3R = UV3RRadio
[2016-03-15 08:17:24,751] chirp.directory - INFO: Registered Baojie_BJ-9900 = BJ9900Radio
[2016-03-15 08:17:24,751] chirp.directory - INFO: Registered Baofeng_UV-5R = BaofengUV5R
[2016-03-15 08:17:24,752] chirp.directory - INFO: Registered Baofeng_F-11 = BaofengF11Radio
[2016-03-15 08:17:24,752] chirp.directory - INFO: Registered Baofeng_UV-82 = BaofengUV82Radio
[2016-03-15 08:17:24,752] chirp.directory - INFO: Registered Baofeng_UV-6 = BaofengUV6Radio
[2016-03-15 08:17:24,752] chirp.directory - INFO: Registered Intek_KT-980HP = IntekKT980Radio
[2016-03-15 08:17:24,752] chirp.directory - INFO: Registered Baofeng_BF-F8HP = BaofengBFF8HPRadio
[2016-03-15 08:17:24,752] chirp.directory - INFO: Registered Baofeng_UV-82HP = BaofengUV82HPRadio
[2016-03-15 08:17:24,752] chirp.directory - INFO: Registered Baojie_BJ-UV55 = BaojieBJUV55Radio
[2016-03-15 08:17:24,752] chirp.directory - INFO: Registered Feidaxin_FD-268A = FD268ARadio
[2016-03-15 08:17:24,752] chirp.directory - INFO: Registered Feidaxin_FD-268B = FD268BRadio
[2016-03-15 08:17:24,753] chirp.directory - INFO: Registered Feidaxin_FD-288A = FD288ARadio
[2016-03-15 08:17:24,753] chirp.directory - INFO: Registered Feidaxin_FD-288B = FD288BRadio
[2016-03-15 08:17:24,753] chirp.directory - INFO: Registered Feidaxin_FD-150A = FD150ARadio
[2016-03-15 08:17:24,753] chirp.directory - INFO: Registered Feidaxin_FD-160A = FD160ARadio
[2016-03-15 08:17:24,753] chirp.directory - INFO: Registered Feidaxin_FD-450A = FD450ARadio
[2016-03-15 08:17:24,753] chirp.directory - INFO: Registered Feidaxin_FD-460A = FD460ARadio
[2016-03-15 08:17:24,753] chirp.directory - INFO: Registered Yaesu_FT-1802M = FT1802Radio
[2016-03-15 08:17:24,754] chirp.directory - INFO: Registered Yaesu_FT-1D_R = FT1Radio
[2016-03-15 08:17:24,754] chirp.directory - INFO: Registered Yaesu_FT-2800M = FT2800Radio
[2016-03-15 08:17:24,755] chirp.directory - INFO: Registered Yaesu_FT-2900R_1900R = FT2900Radio
[2016-03-15 08:17:24,755] chirp.directory - INFO: Registered Yaesu_FT-2900E_1900E_E = FT2900ERadio
[2016-03-15 08:17:24,755] chirp.directory - INFO: Registered Yaesu_FT-2900_1900_Modded_Opened_Xmit = FT2900ModRadio
[2016-03-15 08:17:24,755] chirp.directory - INFO: Registered Yaesu_FT-50 = FT50Radio
[2016-03-15 08:17:24,756] chirp.directory - INFO: Registered Yaesu_FT-60 = FT60Radio
[2016-03-15 08:17:24,756] chirp.directory - INFO: Registered Yaesu_FT-7800_7900 = FT7800Radio
[2016-03-15 08:17:24,756] chirp.directory - INFO: Registered Yaesu_FT-8800 = FT8800Radio
[2016-03-15 08:17:24,756] chirp.directory - INFO: Registered Yaesu_FT-8900 = FT8900Radio
[2016-03-15 08:17:24,756] chirp.directory - INFO: Registered Yaesu_FT-8100 = FT8100Radio
[2016-03-15 08:17:24,757] chirp.directory - INFO: Registered Yaesu_FT-817 = FT817Radio
[2016-03-15 08:17:24,757] chirp.directory - INFO: Registered Yaesu_FT-817ND = FT817NDRadio
[2016-03-15 08:17:24,757] chirp.directory - INFO: Registered Yaesu_FT-817ND_US = FT817NDUSRadio
[2016-03-15 08:17:24,757] chirp.directory - INFO: Registered Yaesu_FT-857_897 = FT857Radio
[2016-03-15 08:17:24,757] chirp.directory - INFO: Registered Yaesu_FT-857_897_US = FT857USRadio
[2016-03-15 08:17:24,758] chirp.directory - INFO: Registered Yaesu_FT-90 = FT90Radio
[2016-03-15 08:17:24,758] chirp.directory - INFO: Registered Yaesu_FTM-350 = FTM350Radio
[2016-03-15 08:17:24,759] chirp.directory - INFO: Registered Generic_CSV = CSVRadio
[2016-03-15 08:17:24,759] chirp.directory - INFO: Registered Commander_KG-UV = CommanderCSVRadio
[2016-03-15 08:17:24,759] chirp.directory - INFO: Registered RT_Systems_CSV = RTCSVRadio
[2016-03-15 08:17:24,759] chirp.directory - INFO: Registered ARRL_Travel_Plus = TpeRadio
[2016-03-15 08:17:24,765] chirp.directory - INFO: Registered Generic_XML = XMLRadio
[2016-03-15 08:17:24,768] chirp.directory - INFO: Registered Baofeng_BF-888 = H777Radio
[2016-03-15 08:17:24,768] chirp.directory - INFO: Registered Icom_IC-208H = IC208Radio
[2016-03-15 08:17:24,768] chirp.directory - INFO: Registered Icom_IC-2100H = IC2100Radio
[2016-03-15 08:17:24,769] chirp.directory - INFO: Registered Icom_IC-2200H = IC2200Radio
[2016-03-15 08:17:24,769] chirp.directory - INFO: Registered Icom_IC-2720H = IC2720Radio
[2016-03-15 08:17:24,769] chirp.directory - INFO: Registered Icom_IC-2820H = IC2820Radio
[2016-03-15 08:17:24,769] chirp.directory - INFO: Registered Icom_IC-91_92AD = IC9xRadio
[2016-03-15 08:17:24,770] chirp.directory - INFO: Registered Icom_IC-Q7A = ICQ7Radio
[2016-03-15 08:17:24,770] chirp.directory - INFO: Registered Icom_IC-T70 = ICT70Radio
[2016-03-15 08:17:24,770] chirp.directory - INFO: Registered Icom_IC-T7H = ICT7HRadio
[2016-03-15 08:17:24,770] chirp.directory - INFO: Registered Icom_IC-T8A = ICT8ARadio
[2016-03-15 08:17:24,770] chirp.directory - INFO: Registered Icom_IC-W32A = ICW32ARadio
[2016-03-15 08:17:24,771] chirp.directory - INFO: Registered Icom_IC-W32E = ICW32ERadio
[2016-03-15 08:17:24,771] chirp.directory - INFO: Registered Icom_IC-V82_U82 = ICx8xRadio
[2016-03-15 08:17:24,771] chirp.directory - INFO: Registered Icom_ID-31A = ID31Radio
[2016-03-15 08:17:24,771] chirp.directory - INFO: Registered Icom_ID-51 = ID51Radio
[2016-03-15 08:17:24,771] chirp.directory - INFO: Registered Icom_ID-51_Plus = ID51PLUSRadio
[2016-03-15 08:17:24,772] chirp.directory - INFO: Registered Icom_ID-800H_v2 = ID800v2Radio
[2016-03-15 08:17:24,772] chirp.directory - INFO: Registered Icom_ID-880H = ID880Radio
[2016-03-15 08:17:24,772] chirp.directory - INFO: Registered Icom_ID-80H = ID80Radio
[2016-03-15 08:17:24,772] chirp.directory - INFO: Registered Kenwood_HMK = HMKRadio
[2016-03-15 08:17:24,773] chirp.directory - INFO: Registered Kenwood_ITM = ITMRadio
[2016-03-15 08:17:24,773] chirp.directory - INFO: Registered Wouxun_KG-UV8D = KGUV8DRadio
[2016-03-15 08:17:24,773] chirp.directory - INFO: Registered KYD_NC-630A = NC630aRadio
[2016-03-15 08:17:24,773] chirp.directory - INFO: Registered KYD_IP-620 = IP620Radio
[2016-03-15 08:17:24,774] chirp.directory - INFO: Registered Leixen_VV-898 = LeixenVV898Radio
[2016-03-15 08:17:24,774] chirp.directory - INFO: Registered Jetstream_JT270M = JetstreamJT270MRadio
[2016-03-15 08:17:24,774] chirp.directory - INFO: Registered Wouxun_KG-UVD1P = KGUVD1PRadio
[2016-03-15 08:17:24,774] chirp.directory - INFO: Registered Wouxun_KG-UV6 = KGUV6DRadio
[2016-03-15 08:17:24,775] chirp.directory - INFO: Registered Wouxun_KG-816 = KG816Radio
[2016-03-15 08:17:24,775] chirp.directory - INFO: Registered Wouxun_KG-818 = KG818Radio
[2016-03-15 08:17:24,775] chirp.directory - INFO: Registered Puxing_PX-777 = Puxing777Radio
[2016-03-15 08:17:24,775] chirp.directory - INFO: Registered Puxing_PX-2R = Puxing2RRadio
[2016-03-15 08:17:24,775] chirp.directory - INFO: Registered TYT_TH9000_220 = Th9000220Radio
[2016-03-15 08:17:24,775] chirp.directory - INFO: Registered TYT_TH9000_144 = Th9000144Radio
[2016-03-15 08:17:24,775] chirp.directory - INFO: Registered TYT_TH9000_440 = Th9000440Radio
[2016-03-15 08:17:24,776] chirp.directory - INFO: Registered TYT_TH-9800_File = TYTTH9800File
[2016-03-15 08:17:24,776] chirp.directory - INFO: Registered TYT_TH-9800 = TYTTH9800Radio
[2016-03-15 08:17:24,776] chirp.directory - INFO: Registered TYT_TH-UV3R = TYTUV3RRadio
[2016-03-15 08:17:24,777] chirp.directory - INFO: Registered TYT_TH-UV3R-25 = TYTUV3R25Radio
[2016-03-15 08:17:24,777] chirp.directory - INFO: Registered TYT_TH-UVF8D = TYTUVF8DRadio
[2016-03-15 08:17:24,777] chirp.directory - INFO: Registered Kenwood_TH-D72_clone_mode = THD72Radio
[2016-03-15 08:17:24,777] chirp.directory - INFO: Registered TYT_TH-UVF1 = TYTTHUVF1Radio
[2016-03-15 08:17:24,778] chirp.directory - INFO: Registered Kenwood_TK-260 = TK260_Radio
[2016-03-15 08:17:24,778] chirp.directory - INFO: Registered Kenwood_TK-270 = TK270_Radio
[2016-03-15 08:17:24,778] chirp.directory - INFO: Registered Kenwood_TK-272 = TK272_Radio
[2016-03-15 08:17:24,778] chirp.directory - INFO: Registered Kenwood_TK-278 = TK278_Radio
[2016-03-15 08:17:24,778] chirp.directory - INFO: Registered Kenwood_TK-360 = TK360_Radio
[2016-03-15 08:17:24,778] chirp.directory - INFO: Registered Kenwood_TK-370 = TK370_Radio
[2016-03-15 08:17:24,778] chirp.directory - INFO: Registered Kenwood_TK-372 = TK372_Radio
[2016-03-15 08:17:24,778] chirp.directory - INFO: Registered Kenwood_TK-378 = TK378_Radio
[2016-03-15 08:17:24,779] chirp.directory - INFO: Registered Kenwood_TK-760 = TK760_Radio
[2016-03-15 08:17:24,779] chirp.directory - INFO: Registered Kenwood_TK-762 = TK762_Radio
[2016-03-15 08:17:24,779] chirp.directory - INFO: Registered Kenwood_TK-768 = TK768_Radio
[2016-03-15 08:17:24,779] chirp.directory - INFO: Registered Kenwood_TK-860 = TK860_Radio
[2016-03-15 08:17:24,779] chirp.directory - INFO: Registered Kenwood_TK-862 = TK862_Radio
[2016-03-15 08:17:24,779] chirp.directory - INFO: Registered Kenwood_TK-868 = TK868_Radio
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-868G = TK868G_Radios
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-862G = TK862G_Radios
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-860G = TK860G_Radios
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-768G = TK768G_Radios
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-762G = TK762G_Radios
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-760G = TK760G_Radios
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-278G = TK278G_Radios
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-272G = TK272G_Radios
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-270G = TK270G_Radios
[2016-03-15 08:17:24,780] chirp.directory - INFO: Registered Kenwood_TK-260G = TK260G_Radios
[2016-03-15 08:17:24,781] chirp.directory - INFO: Registered Kenwood_TK-7102 = KenwoodTK7102Radio
[2016-03-15 08:17:24,781] chirp.directory - INFO: Registered Kenwood_TK-8102 = KenwoodTK8102Radio
[2016-03-15 08:17:24,781] chirp.directory - INFO: Registered Kenwood_TK-7108 = KenwoodTK7108Radio
[2016-03-15 08:17:24,781] chirp.directory - INFO: Registered Kenwood_TK-8108 = KenwoodTK8108Radio
[2016-03-15 08:17:24,781] chirp.directory - INFO: Registered Kenwood_TS-2000 = TS2000Radio
[2016-03-15 08:17:24,782] chirp.directory - INFO: Registered Baofeng_UV-B5 = BaofengUVB5
[2016-03-15 08:17:24,782] chirp.directory - INFO: Registered Yaesu_VX-170 = VX170Radio
[2016-03-15 08:17:24,783] chirp.directory - INFO: Registered Yaesu_VX-2 = VX2Radio
[2016-03-15 08:17:24,783] chirp.directory - INFO: Registered Yaesu_VX-3 = VX3Radio
[2016-03-15 08:17:24,783] chirp.directory - INFO: Registered Yaesu_VX-5 = VX5Radio
[2016-03-15 08:17:24,784] chirp.directory - INFO: Registered Yaesu_VX-6 = VX6Radio
[2016-03-15 08:17:24,784] chirp.directory - INFO: Registered Yaesu_VX-7 = VX7Radio
[2016-03-15 08:17:24,784] chirp.directory - INFO: Registered Yaesu_VX-8_R = VX8Radio
[2016-03-15 08:17:24,785] chirp.directory - INFO: Registered Yaesu_VX-8_DR = VX8DRadio
[2016-03-15 08:17:24,785] chirp.directory - INFO: Registered Yaesu_VX-8_GE = VX8GERadio
[2016-03-15 08:17:24,785] chirp.directory - INFO: Registered Vertex_Standard_VXA-700 = VXA700Radio
Email was triggered for: Success
Sending email for trigger: Success
1
0
[chirp_devel] [PATCH] Provides an option for the user to toggle cloning instructions from the help
by K. Arvanitis 12 Mar '16
by K. Arvanitis 12 Mar '16
12 Mar '16
# HG changeset patch
# User K. Arvanitis <kosta(a)alumni.uvic.ca>
# Date 1457775747 28800
# Sat Mar 12 01:42:27 2016 -0800
# Node ID 86fcbefbcf670ca1ace59c34262550c5cae4a792
# Parent 30fd4d736864b0dd5becc6264236193bd85b6d0a
Provides an option for the user to toggle cloning instructions from the help
menu. This allows for the ability to re-enable the instructions once they have
been disabled.
Bug #3437
diff -r 30fd4d736864 -r 86fcbefbcf67 chirp/ui/mainapp.py
--- a/chirp/ui/mainapp.py Sat Mar 05 12:05:39 2016 -0500
+++ b/chirp/ui/mainapp.py Sat Mar 12 01:42:27 2016 -0800
@@ -633,6 +633,8 @@
again = gtk.CheckButton(
_("Don't show instructions for any radio again"))
again.show()
+ again.connect("toggled", lambda action:
+ self.clonemenu.set_active(not action.get_active()))
d.vbox.pack_start(again, 0, 0, 0)
h_button_box = d.vbox.get_children()[2]
try:
@@ -644,7 +646,7 @@
pass
d.run()
d.destroy()
- CONF.set_bool("clone_instructions", again.get_active(), "noconfirm")
+
def do_download(self, port=None, rtype=None):
d = clone.CloneSettingsDialog(parent=self)
@@ -1349,6 +1351,9 @@
devaction = self.menu_ag.get_action(name)
devaction.set_visible(action.get_active())
+ def do_toggle_clone_instructions(self, action):
+ CONF.set_bool("clone_instructions", not action.get_active(), "noconfirm")
+
def do_change_language(self):
langs = ["Auto", "English", "Polish", "Italian", "Dutch", "German",
"Hungarian", "Russian", "Portuguese (BR)", "French"]
@@ -1440,6 +1445,8 @@
self.do_toggle_no_smart_tmode(_action)
elif action == "developer":
self.do_toggle_developer(_action)
+ elif action == "clone_instructions":
+ self.do_toggle_clone_instructions(_action)
elif action in ["cut", "copy", "paste", "delete",
"move_up", "move_dn", "exchange", "all",
"devshowraw", "devdiffraw", "properties"]:
@@ -1524,6 +1531,7 @@
<menuitem action="gethelp"/>
<separator/>
<menuitem action="report"/>
+ <menuitem action="clone_instructions"/>
<menuitem action="developer"/>
<separator/>
<menuitem action="about"/>
@@ -1601,14 +1609,17 @@
re = not conf.get_bool("no_report")
hu = conf.get_bool("hide_unused", "memedit", default=True)
dv = conf.get_bool("developer", "state")
+ ci = not conf.get_bool("clone_instructions", "noconfirm")
st = not conf.get_bool("no_smart_tmode", "memedit")
- toggles = [('report', None, _("Report statistics"),
+ toggles = [('report', None, _("Report Statistics"),
None, None, self.mh, re),
('hide_unused', None, _("Hide Unused Fields"),
None, None, self.mh, hu),
('no_smart_tmode', None, _("Smart Tone Modes"),
None, None, self.mh, st),
+ ('clone_instructions', None, _("Show Instructions"),
+ None, None, self.mh, ci),
('developer', None, _("Enable Developer Functions"),
None, None, self.mh, dv),
]
@@ -1623,7 +1634,7 @@
self.add_accel_group(self.menu_uim.get_accel_group())
- self.recentmenu = self.menu_uim.get_widget("/MenuBar/file/recent")
+ self.clonemenu = self.menu_uim.get_widget("/MenuBar/help/clone_instructions")
# Initialize
self.do_toggle_developer(self.menu_ag.get_action("developer"))
1
0
Hi CHIRP developers,
Several vendors in the past have expressed an interest in helping get
one or more of their radios supported in CHIRP by offering a hardware
loan or donation to get it going. Jetstream has done this before and is
looking for someone to work on their latest model.
The radio in question is a JT2705M dual-band mobile:
http://www.jetstream-usa.biz/product_info.php?products_id=72614
Jetstream is offering to donate a sample radio to a CHIRP developer who
can work on a driver for it. For these sorts of arrangements, the
expectation is usually at least basic memory programming functionality,
but with an eye towards complete replacement of the factory software at
some point.
If you are interested (and feel capable), Jetstream is willing to cover
shipping of the radio and a programming cable to you (non-US people
included!) Please speak up here or contact me privately if you would
like to volunteer.
Thanks to all of you for the work you do to help CHIRP, and thanks very
much to Jetstream for supporting the project as well!
--Dan
3
6