Developers
Threads by month
- ----- 2024 -----
- 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
July 2017
- 5 participants
- 12 discussions
[chirp_devel] [PATCH] Support pySerial 3+. Fixes #3167 #3209 #3521 #3671 #3703
by Tom Hayward 03 Feb '18
by Tom Hayward 03 Feb '18
03 Feb '18
# HG changeset patch
# User Tom Hayward <tom(a)tomh.us>
# Date 1465361362 25200
# Tue Jun 07 21:49:22 2016 -0700
# Node ID d1bc2c9177858ff87c86e08447513f53794c2868
# Parent 333a280ca0c4e856258ebf9dfdb7c547fa9ec90c
Support pySerial 3+. Fixes #3167 #3209 #3521 #3671 #3703
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/detect.py
--- a/chirp/detect.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/detect.py Tue Jun 07 21:49:22 2016 -0700
@@ -39,7 +39,7 @@
# ICOM VHF/UHF Clone-type radios @ 9600 baud
try:
- ser.setBaudrate(9600)
+ ser.baudrate = 9600
md = icf.get_model_data(ser)
return _icom_model_data_to_rclass(md)
except errors.RadioError, e:
@@ -47,7 +47,7 @@
# ICOM IC-91/92 Live-mode radios @ 4800/38400 baud
- ser.setBaudrate(4800)
+ ser.baudrate = 4800
try:
ic9x_ll.send_magic(ser)
return _icom_model_data_to_rclass("ic9x")
@@ -58,7 +58,7 @@
for rate in [9600, 4800, 19200]:
try:
- ser.setBaudrate(rate)
+ ser.baudrate = rate
return icomciv.probe_model(ser)
except errors.RadioError:
pass
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/btech.py
--- a/chirp/drivers/btech.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/btech.py Tue Jun 07 21:49:22 2016 -0700
@@ -332,7 +332,7 @@
# touching the serial timeout to optimize the flushing
# restored at the end to the default value
- radio.pipe.setTimeout(0.1)
+ radio.pipe.timeout = 0.1
dump = "1"
datacount = 0
@@ -347,7 +347,7 @@
raise errors.RadioError(seriale)
# restore the default serial timeout
- radio.pipe.setTimeout(STIMEOUT)
+ radio.pipe.timeout = STIMEOUT
except Exception:
raise errors.RadioError("Unknown error cleaning the serial buffer")
@@ -477,8 +477,8 @@
def _do_ident(radio, status, upload=False):
"""Put the radio in PROGRAM mode & identify it"""
# set the serial discipline
- radio.pipe.setBaudrate(9600)
- radio.pipe.setParity("N")
+ radio.pipe.baudrate = 9600
+ radio.pipe.parity = "N"
# open the radio into program mode
if _start_clone_mode(radio, status) is False:
@@ -516,7 +516,7 @@
# has the check value in the _id2 var, others simply False
if radio._id2 is not False:
# lower the timeout here as this radios are reseting due to timeout
- radio.pipe.setTimeout(0.05)
+ radio.pipe.timeout = 0.05
# query & receive the extra ID
_send(radio, _make_frame("S", 0x3DF0, 16))
@@ -561,7 +561,7 @@
raise errors.RadioError("Radio didn't ACK the upload")
# restore the default serial timeout
- radio.pipe.setTimeout(STIMEOUT)
+ radio.pipe.timeout = STIMEOUT
# DEBUG
LOG.info("Positive ident, this is a %s %s" % (radio.VENDOR, radio.MODEL))
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/ft2800.py
--- a/chirp/drivers/ft2800.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/ft2800.py Tue Jun 07 21:49:22 2016 -0700
@@ -195,7 +195,7 @@
return rf
def sync_in(self):
- self.pipe.setParity("E")
+ self.pipe.parity = "E"
start = time.time()
try:
self._mmap = _download(self)
@@ -208,7 +208,7 @@
def sync_out(self):
self.pipe.timeout = 1
- self.pipe.setParity("E")
+ self.pipe.parity = "E"
start = time.time()
try:
_upload(self)
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/ic9x_ll.py
--- a/chirp/drivers/ic9x_ll.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/ic9x_ll.py Tue Jun 07 21:49:22 2016 -0700
@@ -439,31 +439,31 @@
def send_magic(pipe):
"""Send the magic incantation to wake up an ic9x radio"""
- if pipe.getBaudrate() == 38400:
+ if pipe.baudrate == 38400:
resp = _send_magic_38400(pipe)
if resp:
return
LOG.info("Switching from 38400 to 4800")
- pipe.setBaudrate(4800)
+ pipe.baudrate = 4800
resp = _send_magic_4800(pipe)
- pipe.setBaudrate(38400)
+ pipe.baudrate = 38400
if resp:
return
raise errors.RadioError("Radio not responding")
- elif pipe.getBaudrate() == 4800:
+ elif pipe.baudrate == 4800:
resp = _send_magic_4800(pipe)
if resp:
return
LOG.info("Switching from 4800 to 38400")
- pipe.setBaudrate(38400)
+ pipe.baudrate = 38400
resp = _send_magic_38400(pipe)
if resp:
return
- pipe.setBaudrate(4800)
+ pipe.baudrate = 4800
raise errors.RadioError("Radio not responding")
else:
raise errors.InvalidDataError("Radio in unknown state (%i)" %
- pipe.getBaudrate())
+ pipe.baudrate)
def get_memory_frame(pipe, vfo, number):
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/icf.py
--- a/chirp/drivers/icf.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/icf.py Tue Jun 07 21:49:22 2016 -0700
@@ -251,7 +251,7 @@
LOG.debug("Response:\n%s" % util.hexprint(resp))
LOG.info("Switching to 38400 baud")
- radio.pipe.setBaudrate(38400)
+ radio.pipe.baudrate = 38400
buf = ("\xFE" * 14) + \
"\xEE\xEF" + \
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/kenwood_live.py
--- a/chirp/drivers/kenwood_live.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/kenwood_live.py Tue Jun 07 21:49:22 2016 -0700
@@ -103,7 +103,7 @@
LAST_DELIMITER = delimiter
LOG.info("Trying ID at baud %i with delimiter \"%s\"" %
(i, repr(delimiter)))
- ser.setBaudrate(i)
+ ser.baudrate = i
ser.write(LAST_DELIMITER[0])
ser.read(25)
resp = command(ser, "ID")
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/thd72.py
--- a/chirp/drivers/thd72.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/thd72.py Tue Jun 07 21:49:22 2016 -0700
@@ -231,7 +231,7 @@
def _detect_baud(self):
for baud in [9600, 19200, 38400, 57600]:
- self.pipe.setBaudrate(baud)
+ self.pipe.baudrate = baud
try:
self.pipe.write("\r\r")
except:
@@ -422,9 +422,11 @@
raise errors.RadioError("No response from self")
allblocks = range(self._memsize/256)
- self.pipe.setBaudrate(57600)
- self.pipe.getCTS()
- self.pipe.setRTS()
+ self.pipe.baudrate = 57600
+ try:
+ self.pipe.setRTS()
+ except AttributeError:
+ self.pipe.rts = True
self.pipe.read(1)
data = ""
LOG.debug("reading blocks %d..%d" % (blocks[0], blocks[-1]))
@@ -458,9 +460,11 @@
if self.command("0M PROGRAM") != "0M":
raise errors.RadioError("No response from self")
- self.pipe.setBaudrate(57600)
- self.pipe.getCTS()
- self.pipe.setRTS()
+ self.pipe.baudrate = 57600
+ try:
+ self.pipe.setRTS()
+ except AttributeError:
+ self.pipe.rts = True
self.pipe.read(1)
LOG.debug("writing blocks %d..%d" % (blocks[0], blocks[-1]))
total = len(blocks)
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/tk270.py
--- a/chirp/drivers/tk270.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/tk270.py Tue Jun 07 21:49:22 2016 -0700
@@ -194,10 +194,9 @@
"""Open the radio into program mode and check if it's the correct model"""
# Set serial discipline
try:
- radio.pipe.setParity("N")
- radio.pipe.setTimeout(TIMEOUT)
- radio.pipe.flushOutput()
- radio.pipe.flushInput()
+ radio.pipe.parity = "N"
+ radio.pipe.timeout = TIMEOUT
+ radio.pipe.flush()
except:
msg = "Serial error: Can't set serial line discipline"
raise errors.RadioError(msg)
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/tk760.py
--- a/chirp/drivers/tk760.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/tk760.py Tue Jun 07 21:49:22 2016 -0700
@@ -188,10 +188,9 @@
"""Open the radio into program mode and check if it's the correct model"""
# Set serial discipline
try:
- radio.pipe.setParity("N")
- radio.pipe.setTimeout(TIMEOUT)
- radio.pipe.flushOutput()
- radio.pipe.flushInput()
+ radio.pipe.parity = "N"
+ radio.pipe.timeout = TIMEOUT
+ radio.pipe.flush()
LOG.debug("Serial port open successful")
except:
msg = "Serial error: Can't set serial line discipline"
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/tk760g.py
--- a/chirp/drivers/tk760g.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/tk760g.py Tue Jun 07 21:49:22 2016 -0700
@@ -441,8 +441,8 @@
def _open_radio(radio, status):
"""Open the radio into program mode and check if it's the correct model"""
# linux min is 0.13, win min is 0.25; set to bigger to be safe
- radio.pipe.setTimeout(0.25)
- radio.pipe.setParity("E")
+ radio.pipe.timeout = 0.25
+ radio.pipe.parity = "E"
# DEBUG
LOG.debug("Entering program mode.")
@@ -525,17 +525,17 @@
# set the timeout and if windows keep it bigger
if sys.platform in ["win32", "cygwin"]:
# bigger timeout
- radio.pipe.setTimeout(0.55)
+ radio.pipe.timeout = 0.55
else:
# Linux can keep up, MAC?
- radio.pipe.setTimeout(0.05)
+ radio.pipe.timeout = 0.05
# DEBUG
LOG.debug("Starting the download from radio")
for addr in MEM_BLOCKS:
# send request, but before flush the rx buffer
- radio.pipe.flushInput()
+ radio.pipe.flush()
_send(radio, _make_frame("R", addr))
# now we get the data
@@ -574,7 +574,7 @@
radio.status_fn(status)
# the default for the original soft as measured
- radio.pipe.setTimeout(0.5)
+ radio.pipe.timeout = 0.5
# DEBUG
LOG.debug("Starting the upload to the radio")
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/tk8102.py
--- a/chirp/drivers/tk8102.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/tk8102.py Tue Jun 07 21:49:22 2016 -0700
@@ -99,7 +99,7 @@
def do_download(radio):
- radio.pipe.setParity("E")
+ radio.pipe.parity = "E"
radio.pipe.timeout = 1
do_ident(radio)
@@ -129,7 +129,7 @@
def do_upload(radio):
- radio.pipe.setParity("E")
+ radio.pipe.parity = "E"
radio.pipe.timeout = 1
do_ident(radio)
diff -r 333a280ca0c4 -r d1bc2c917785 chirp/drivers/tmv71.py
--- a/chirp/drivers/tmv71.py Wed Jun 01 17:30:31 2016 -0700
+++ b/chirp/drivers/tmv71.py Tue Jun 07 21:49:22 2016 -0700
@@ -36,7 +36,7 @@
def _detect_baud(self):
for baud in [9600, 19200, 38400, 57600]:
- self.pipe.setBaudrate(baud)
+ self.pipe.baudrate = baud
self.pipe.write("\r\r")
self.pipe.read(32)
try:
2
4
Is anybody working the Yaesu FT2D? It looks to be in the list of devices wanted and to have hardware, but I see no mention when I looked through the developer archives. And I’ve heard nothing back on the chirp users mailing list.
I’ve not found anybody (but maybe RTsystems and G4FHQ) who can do it reliably [or at all with a Macintosh] using the USB cable, but having a chirp version that can read and write the microSD card file (“BACKUP.dat”) would be a boon. The Yaesu-supplied software is painful to run, and even worse when I tried it under WINE on my macintosh. And I’d really, REALLY like a system that runs on Mac.
I’ve looked at the “Add a Radio” page (http://chirp.danplanet.com/projects/chirp/wiki/DevelopersAdd_a_Radio) and think I might be able to help with the memory dump and data structure identification. But I’d rather not start from scratch if others have already done it!
_________
Don’t be fooled by my email account name. It is NOT an amateur callsign.
4
8
On Sun, Jul 23, 2017 at 4:15 AM, Jim Unroe <rock.unroe(a)gmail.com> wrote:
> CHIRP supports the USA version of the FT-2900 (FT-2900R). It does not
> currently support the FT-2900E (European version) or an FT-2900 that
> has the MARS modification.
This seems wrong to me. Is there anything different about the versions
other than the region code? Looking at the driver, I think not...
http://chirp.danplanet.com/projects/chirp/repository/entry/chirp/drivers/ft…
Both IDBLOCKs start with \x56\x43\x32\x33\x00\x02. This appears to be
the model code. Then the region code follows.
Also, Chirp's generic Yaesu driver puts this model code at the start
of the img, but the FT-2900 driver opts to leave it out. This means
the driver has to send that pre-defined IDBLOCK at the beginning of
every upload, instead of just sending what was in the radio before.
This is probably why the MARS modification isn't supported.
If someone with an FT-2900 wants to refactor this, I think a lot of
code could be removed by switching to the yaesu_clone.py routines and
support more regions/mods in the process.
Tom KD7LXL
1
0
Tested changes:
[Dan Smith <dsmith(a)danplanet.com>] Images for BTECH color display mobile radios
#4825
[Jim Unroe <rock.unroe(a)gmail.com>] [New Model] Add Radtel Model T18
This patch adds support for programming the channels and global settings
of the Radtel model T18 hand held radio.
#4969
[Tom Hayward <tom(a)tomh.us>] [id880] Fix typo in charset definition. #281
[Tom Hayward <tom(a)tomh.us>] [thf6a] Support full charset (ASCII). Fixes #141
[Tom Hayward <tom(a)tomh.us>] [id880] Support full charset. Fixes #281
[Tom Hayward <tom(a)tomh.us>] [vx5] Support full charset (ASCII). Fixes #292
[Tom Hayward <tom(a)tomh.us>] [id31a] set used bit when creating new memory, clear when deleting. Fixes #269
[Tom Hayward <tom(a)tomh.us>] Support PyGTK < 2.22 in bank edit. Fixes #231
[Tom Hayward <tom(a)tomh.us>] [d710] [v71] [d72] Fix tone list (not all tones are supported). Fixes #212
[Dan Smith <dsmith(a)danplanet.com>] [vx7] Fix setting memory power levels on 220MHz band
Fixes #214
[Dan Smith <dsmith(a)danplanet.com>] fips: Pennsylvania FIPS code was wrong. #117
[Marco Filippi <iz3gme.marco(a)gmail.com>] Consider lower bound frequency of each valid_band as valid
Fix bug #181
[Tom Hayward <tom(a)tomh.us>] tmd700: allow 8-char names. Fixes #176
[Dan Smith <dsmith(a)danplanet.com>] Fix the "blind deletion" problem, as well as properly direct copy/paste
Fixes #172
[David Griffith <dave(a)661.org>] Bug #155 fix: VX-7 1.25m power levels
[David Griffith <dave(a)661.org>] New INSTALL and README files
Fixes #122
[Tom Hayward <tom(a)tomh.us>] thd72: only use hardware flow on OS X. Fixes #166
[Marco Filippi <iz3gme.marco(a)gmail.com>] [FT817] Tone freq not set correctly
Same as #88 for FT857, to avoid code duplication fix code have been moved from
ft857 to its ancestor class
Fix bug #163
[Tom Hayward <tom(a)tomh.us>] Fix Mac .app so paths with spaces work. Fixes Bug #145
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
5 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 7c8d6ee09af7ef48b795edd0407e8adc0d40fe6e
[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 7c8d6ee09af7ef48b795edd0407e8adc0d40fe6e
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson2051467096119029729.sh
[workspace] $ /bin/sh -xe /tmp/hudson950464064522779866.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.059s
OK
FAIL: Please keep commit message lines to <80 columns
Checking for PEP8 regressions...
./chirp/platform.py:255:80: E501 line too long (82 > 79 characters)
./chirp/ui/mainapp.py:1909:80: E501 line too long (82 > 79 characters)
./chirp/ui/mainapp.py:1965:80: E501 line too long (82 > 79 characters)
real 0m9.084s
user 0m8.888s
sys 0m0.056s
================================================
Tests FAILED: style tests
Build step 'Execute shell' marked build as failure
Email was triggered for: Failure
Sending email for trigger: Failure
1
1
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1499723150 14400
# Node ID c56244c58fe85688ef0da20a3f7bfebc0f447e6c
# Parent 691286c59ddb191492c2598a34e02d9ee050b0c3
[KT8900] Extra ID Doesn't Match
When a QYT KT8900 radio has had a passcode stored in it by the factory
software, the 'extra ID' will not match the string that CHIRP expects to see.
This patch relaxes the check by removing what are apparently the passcode
bytes from the string that CHIRP expects to see in the 'extra ID'.
Bug #4993
diff -r 691286c59ddb -r c56244c58fe8 chirp/drivers/btech.py
--- a/chirp/drivers/btech.py Mon Jul 10 07:00:23 2017 -0700
+++ b/chirp/drivers/btech.py Mon Jul 10 17:45:50 2017 -0400
@@ -196,7 +196,7 @@
KT8900_fp4 = "M2G304"
KT8900_fp5 = "M2G314"
# this radio has an extra ID
-KT8900_id = " 303688"
+KT8900_id = "303688"
# KT8900R
KT8900R_fp = "M3G1F4"
1
0
[chirp_devel] [PATCH] [UV-25X2] Add Support for new BTech Color Display Mobile Radios
by Jim Unroe 05 Jul '17
by Jim Unroe 05 Jul '17
05 Jul '17
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1489785081 14400
# Node ID 6a37192481c837ea49a60d121dde3de3ec8fc521
# Parent e1113c7da2f3eb00a5b1585ea92a8d164df0d60b
[UV-25X2] Add Support for new BTech Color Display Mobile Radios
This patch modifies the btech.py driver to support additional
mobile radios that have an OLED color display.
Additional radio models supported:
BTech UV-25X4 (quad band)
BTech UV-25X2 (dual band)
BTech UV-50X2 (dual band)
New Model #4269
diff -r e1113c7da2f3 -r 6a37192481c8 chirp/drivers/btech.py
--- a/chirp/drivers/btech.py Wed Mar 08 15:05:23 2017 -0800
+++ b/chirp/drivers/btech.py Fri Mar 17 17:11:21 2017 -0400
@@ -167,6 +167,15 @@
# B-TECH UV-5001 third generation (3G)
UV5001G3_fp = "BTG304"
+# B-TECH UV-25X2
+UV25X2_fp = "UC2012"
+
+# B-TECH UV-25X4
+UV25X4_fp = "UC4014"
+
+# B-TECH UV-50X2
+UV50X2_fp = "UC2M12"
+
# special var to know when we found a BTECH Gen 3
BTECH3 = [UV2501G3_fp, UV2501_220G3_fp, UV5001G3_fp]
@@ -226,6 +235,10 @@
MSTRING = "\x55\x20\x15\x09\x20\x45\x4d\x02"
# for the QYT KT7900D & KT8900D
MSTRING_KT8900D = "\x55\x20\x16\x08\x01\xFF\xDC\x02"
+# for the BTECH UV-25X2 and UV-50X2
+MSTRING_UV25X2 = "\x55\x20\x16\x12\x28\xFF\xDC\x02"
+# for the BTECH UV-25X4
+MSTRING_UV25X4 = "\x55\x20\x16\x11\x18\xFF\xDC\x02"
def _clean_buffer(radio):
@@ -852,10 +865,12 @@
# Extra
mem.extra = RadioSettingGroup("extra", "Extra")
- scramble = RadioSetting("scramble", "Scramble",
- RadioSettingValueBoolean(bool(
- _mem.scramble)))
- mem.extra.append(scramble)
+ if not self.COLOR_LCD or \
+ (self.COLOR_LCD and not self.VENDOR == "BTECH"):
+ scramble = RadioSetting("scramble", "Scramble",
+ RadioSettingValueBoolean(bool(
+ _mem.scramble)))
+ mem.extra.append(scramble)
bcl = RadioSetting("bcl", "Busy channel lockout",
RadioSettingValueBoolean(bool(_mem.bcl)))
@@ -1061,11 +1076,18 @@
_mem.settings.pttlt))
basic.append(pttlt)
- emctp = RadioSetting("settings.emctp", "Alarm mode",
- RadioSettingValueList(
- LIST_EMCTP,
- LIST_EMCTP[_mem.settings.emctp]))
- basic.append(emctp)
+ if self.VENDOR == "BTECH" and self.COLOR_LCD:
+ emctp = RadioSetting("settings.emctp", "Alarm mode",
+ RadioSettingValueList(
+ LIST_EMCTPX,
+ LIST_EMCTPX[_mem.settings.emctp]))
+ basic.append(emctp)
+ else:
+ emctp = RadioSetting("settings.emctp", "Alarm mode",
+ RadioSettingValueList(
+ LIST_EMCTP,
+ LIST_EMCTP[_mem.settings.emctp]))
+ basic.append(emctp)
emcch = RadioSetting("settings.emcch", "Alarm channel",
RadioSettingValueInteger(0, 199,
@@ -1119,10 +1141,17 @@
basic.append(langua)
if self.VENDOR == "BTECH":
- sync = RadioSetting("settings.sync", "A/B channel sync",
- RadioSettingValueBoolean(
- _mem.settings.sync))
- basic.append(sync)
+ if self.COLOR_LCD:
+ sync = RadioSetting("settings.sync", "Channel display sync",
+ RadioSettingValueList(
+ LIST_SYNC,
+ LIST_SYNC[_mem.settings.sync]))
+ basic.append(sync)
+ else:
+ sync = RadioSetting("settings.sync", "A/B channel sync",
+ RadioSettingValueBoolean(
+ _mem.settings.sync))
+ basic.append(sync)
else:
autolk = RadioSetting("settings.sync", "Auto keylock",
RadioSettingValueBoolean(
@@ -1289,6 +1318,24 @@
_mem.settings.dtmfg))
basic.append(dtmfg)
+ if self.VENDOR == "BTECH" and self.COLOR_LCD:
+ mgain = RadioSetting("settings.mgain", "Mic gain",
+ RadioSettingValueInteger(0, 120,
+ _mem.settings.mgain))
+ basic.append(mgain)
+
+ skiptx = RadioSetting("settings.skiptx", "Skip TX",
+ RadioSettingValueList(
+ LIST_SKIPTX,
+ LIST_SKIPTX[_mem.settings.skiptx]))
+ basic.append(skiptx)
+
+ scmode = RadioSetting("settings.scmode", "Scan mode",
+ RadioSettingValueList(
+ LIST_SCMODE,
+ LIST_SCMODE[_mem.settings.scmode]))
+ basic.append(scmode)
+
# Advanced
def _filter(name):
filtered = ""
@@ -1802,17 +1849,19 @@
SPMUTE_LIST[_mem.vfo.d.spmute]))
work.append(vfodspmute)
- vfoascr = RadioSetting("vfo.a.scramble", "VFO A scramble",
- RadioSettingValueBoolean(
- _mem.vfo.a.scramble))
- work.append(vfoascr)
-
- vfobscr = RadioSetting("vfo.b.scramble", "VFO B scramble",
- RadioSettingValueBoolean(
- _mem.vfo.b.scramble))
- work.append(vfobscr)
-
- if self.COLOR_LCD:
+ if not self.COLOR_LCD or \
+ (self.COLOR_LCD and not self.VENDOR == "BTECH"):
+ vfoascr = RadioSetting("vfo.a.scramble", "VFO A scramble",
+ RadioSettingValueBoolean(
+ _mem.vfo.a.scramble))
+ work.append(vfoascr)
+
+ vfobscr = RadioSetting("vfo.b.scramble", "VFO B scramble",
+ RadioSettingValueBoolean(
+ _mem.vfo.b.scramble))
+ work.append(vfobscr)
+
+ if self.COLOR_LCD and not self.VENDOR == "BTECH":
vfocscr = RadioSetting("vfo.c.scramble", "VFO C scramble",
RadioSettingValueBoolean(
_mem.vfo.c.scramble))
@@ -3537,7 +3586,7 @@
LOG.info("Radio ranges: UHF %d to %d" % uhf)
# the additional bands
- if self.MODEL in ["KT7900D", ]:
+ if self.MODEL in ["UV-25X4", "KT7900D"]:
# 200Mhz band
vhf2 = _decode_ranges(ranges.vhf2_low, ranges.vhf2_high)
LOG.info("Radio ranges: VHF(220) %d to %d" % vhf2)
@@ -3554,6 +3603,43 @@
@directory.register
+class UV25X2(BTechColor):
+ """Baofeng Tech UV25X2"""
+ MODEL = "UV-25X2"
+ BANDS = 2
+ _vhf_range = (130000000, 180000000)
+ _uhf_range = (400000000, 521000000)
+ _magic = MSTRING_UV25X2
+ _fileid = [UV25X2_fp, ]
+
+
+(a)directory.register
+class UV25X4(BTechColor):
+ """Baofeng Tech UV25X4"""
+ MODEL = "UV-25X4"
+ BANDS = 4
+ _vhf_range = (130000000, 180000000)
+ _220_range = (200000000, 271000000)
+ _uhf_range = (400000000, 521000000)
+ _350_range = (350000000, 391000000)
+ _magic = MSTRING_UV25X4
+ _fileid = [UV25X4_fp, ]
+
+
+(a)directory.register
+class UV50X2(BTechColor):
+ """Baofeng Tech UV50X2"""
+ MODEL = "UV-50X2"
+ BANDS = 2
+ _vhf_range = (130000000, 180000000)
+ _uhf_range = (400000000, 521000000)
+ _magic = MSTRING_UV25X2
+ _fileid = [UV50X2_fp, ]
+ _power_levels = [chirp_common.PowerLevel("High", watts=50),
+ chirp_common.PowerLevel("Low", watts=10)]
+
+
+(a)directory.register
class KT7900D(BTechColor):
"""QYT KT7900D"""
VENDOR = "QYT"
1
2
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1499304522 14400
# Node ID a6eea51cc96a13c63737c5ef83bb48a66b6736ea
# Parent 0b2aaa54f3082a8fe735b4e32091466c50b9900b
[New Model] Add Radtel Model T18
This patch adds support for programming the channels and global settings
of the Radtel model T18 hand held radio.
#4969
diff -r 0b2aaa54f308 -r a6eea51cc96a chirp/drivers/radtel_t18.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/drivers/radtel_t18.py Wed Jul 05 21:28:42 2017 -0400
@@ -0,0 +1,501 @@
+# Copyright 2017 Jim Unroe <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 os
+import struct
+import unittest
+import logging
+
+from chirp import chirp_common, directory, memmap
+from chirp import bitwise, errors, util
+from chirp.settings import RadioSetting, RadioSettingGroup, \
+ RadioSettingValueInteger, RadioSettingValueList, \
+ RadioSettingValueBoolean, RadioSettings
+
+LOG = logging.getLogger(__name__)
+
+MEM_FORMAT = """
+#seekto 0x0010;
+struct {
+ lbcd rxfreq[4];
+ lbcd txfreq[4];
+ lbcd rxtone[2];
+ lbcd txtone[2];
+ u8 unknown1:1,
+ compander:1,
+ scramble:1,
+ skip:1,
+ highpower:1,
+ narrow:1,
+ unknown2:1,
+ bcl:1;
+ u8 unknown3[3];
+} memory[16];
+#seekto 0x03C0;
+struct {
+ u8 unknown1:1,
+ scanmode:1,
+ unknown2:2,
+ voiceprompt:2,
+ batterysaver:1,
+ beep:1;
+ u8 squelchlevel;
+ u8 unused2;
+ u8 timeouttimer;
+ u8 voxlevel;
+ u8 unknown3;
+ u8 unused;
+ u8 voxdelay;
+} settings;
+"""
+
+CMD_ACK = "\x06"
+BLOCK_SIZE = 0x08
+
+VOICE_LIST = ["Off", "Chinese", "English"]
+TIMEOUTTIMER_LIST = ["Off", "30 seconds", "60 seconds", "90 seconds",
+ "120 seconds", "150 seconds", "180 seconds",
+ "210 seconds", "240 seconds", "270 seconds",
+ "300 seconds"]
+SCANMODE_LIST = ["Carrier", "Time"]
+VOXLEVEL_LIST = ["Off", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
+VOXDELAY_LIST = ["0.5 seconds", "1.0 seconds", "1.5 seconds",
+ "2.0 seconds", "2.5 seconds", "3.0 seconds"]
+
+SETTING_LISTS = {
+ "voice": VOICE_LIST,
+ "timeouttimer": TIMEOUTTIMER_LIST,
+ "scanmode": SCANMODE_LIST,
+ "voxlevel": VOXLEVEL_LIST,
+ "voxdelay": VOXDELAY_LIST
+}
+
+
+def _t18_enter_programming_mode(radio):
+ serial = radio.pipe
+
+ try:
+ serial.write("\x02")
+ time.sleep(0.1)
+ serial.write("1ROGRAM")
+ ack = serial.read(1)
+ except:
+ raise errors.RadioError("Error communicating with radio")
+
+ if not ack:
+ raise errors.RadioError("No response from radio")
+ elif ack != CMD_ACK:
+ raise errors.RadioError("Radio refused to enter programming mode")
+
+ try:
+ serial.write("\x02")
+ ident = serial.read(8)
+ except:
+ raise errors.RadioError("Error communicating with radio")
+
+ if not ident.startswith("SMP558"):
+ LOG.debug(util.hexprint(ident))
+ raise errors.RadioError("Radio returned unknown identification string")
+
+ try:
+ serial.write(CMD_ACK)
+ ack = serial.read(1)
+ except:
+ raise errors.RadioError("Error communicating with radio")
+
+ if ack != CMD_ACK:
+ raise errors.RadioError("Radio refused to enter programming mode")
+
+ try:
+ serial.write("\x05")
+ response = serial.read(6)
+ except:
+ raise errors.RadioError("Error communicating with radio")
+
+ if not response == ("\xFF" * 6):
+ LOG.debug(util.hexprint(response))
+ raise errors.RadioError("Radio returned unexpected response")
+
+ try:
+ serial.write(CMD_ACK)
+ ack = serial.read(1)
+ except:
+ raise errors.RadioError("Error communicating with radio")
+
+ if ack != CMD_ACK:
+ raise errors.RadioError("Radio refused to enter programming mode")
+
+
+def _t18_exit_programming_mode(radio):
+ serial = radio.pipe
+ try:
+ serial.write("b")
+ except:
+ raise errors.RadioError("Radio refused to exit programming mode")
+
+
+def _t18_read_block(radio, block_addr, block_size):
+ serial = radio.pipe
+
+ cmd = struct.pack(">cHb", 'R', block_addr, BLOCK_SIZE)
+ expectedresponse = "W" + cmd[1:]
+ LOG.debug("Reading block %04x..." % (block_addr))
+
+ try:
+ serial.write(cmd)
+ response = serial.read(4 + BLOCK_SIZE)
+ if response[:4] != expectedresponse:
+ raise Exception("Error reading block %04x." % (block_addr))
+
+ block_data = response[4:]
+
+ serial.write(CMD_ACK)
+ ack = serial.read(1)
+ except:
+ raise errors.RadioError("Failed to read block at %04x" % block_addr)
+
+ if ack != CMD_ACK:
+ raise Exception("No ACK reading block %04x." % (block_addr))
+
+ return block_data
+
+
+def _t18_write_block(radio, block_addr, block_size):
+ serial = radio.pipe
+
+ cmd = struct.pack(">cHb", 'W', block_addr, BLOCK_SIZE)
+ data = radio.get_mmap()[block_addr:block_addr + 8]
+
+ LOG.debug("Writing Data:")
+ LOG.debug(util.hexprint(cmd + data))
+
+ try:
+ serial.write(cmd + data)
+ if serial.read(1) != CMD_ACK:
+ raise Exception("No ACK")
+ except:
+ raise errors.RadioError("Failed to send block "
+ "to radio at %04x" % block_addr)
+
+
+def do_download(radio):
+ LOG.debug("download")
+ _t18_enter_programming_mode(radio)
+
+ data = ""
+
+ status = chirp_common.Status()
+ status.msg = "Cloning from radio"
+
+ status.cur = 0
+ status.max = radio._memsize
+
+ for addr in range(0, radio._memsize, BLOCK_SIZE):
+ status.cur = addr + BLOCK_SIZE
+ radio.status_fn(status)
+
+ block = _t18_read_block(radio, addr, BLOCK_SIZE)
+ data += block
+
+ LOG.debug("Address: %04x" % addr)
+ LOG.debug(util.hexprint(block))
+
+ _t18_exit_programming_mode(radio)
+
+ return memmap.MemoryMap(data)
+
+
+def do_upload(radio):
+ status = chirp_common.Status()
+ status.msg = "Uploading to radio"
+
+ _t18_enter_programming_mode(radio)
+
+ status.cur = 0
+ status.max = radio._memsize
+
+ for start_addr, end_addr in radio._ranges:
+ for addr in range(start_addr, end_addr, BLOCK_SIZE):
+ status.cur = addr + BLOCK_SIZE
+ radio.status_fn(status)
+ _t18_write_block(radio, addr, BLOCK_SIZE)
+
+ _t18_exit_programming_mode(radio)
+
+
+def model_match(cls, data):
+ """Match the opened/downloaded image to the correct version"""
+
+ if len(data) == cls._memsize:
+ rid = data[0x03D0:0x03D8]
+ return "P558" in rid
+ else:
+ return False
+
+
+(a)directory.register
+class T18Radio(chirp_common.CloneModeRadio):
+ """radtel T18"""
+ VENDOR = "Radtel"
+ MODEL = "T18"
+ BAUD_RATE = 9600
+
+ _ranges = [
+ (0x0000, 0x03F0),
+ ]
+ _memsize = 0x03F0
+
+ def get_features(self):
+ rf = chirp_common.RadioFeatures()
+ rf.has_settings = True
+ rf.valid_modes = ["NFM", "FM"] # 12.5 KHz, 25 kHz.
+ rf.valid_skips = ["", "S"]
+ rf.valid_tmodes = ["", "Tone", "TSQL", "DTCS", "Cross"]
+ rf.valid_duplexes = ["", "-", "+", "split", "off"]
+ rf.can_odd_split = True
+ rf.has_rx_dtcs = True
+ rf.has_ctone = True
+ rf.has_cross = True
+ rf.valid_cross_modes = [
+ "Tone->Tone",
+ "DTCS->",
+ "->DTCS",
+ "Tone->DTCS",
+ "DTCS->Tone",
+ "->Tone",
+ "DTCS->DTCS"]
+ rf.has_tuning_step = False
+ rf.has_bank = False
+ rf.has_name = False
+ rf.memory_bounds = (1, 16)
+ rf.valid_bands = [(400000000, 470000000)]
+
+ return rf
+
+ def process_mmap(self):
+ self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)
+
+ def sync_in(self):
+ self._mmap = do_download(self)
+ self.process_mmap()
+
+ def sync_out(self):
+ do_upload(self)
+
+ def get_raw_memory(self, number):
+ return repr(self._memobj.memory[number - 1])
+
+ def _decode_tone(self, val):
+ val = int(val)
+ if val == 16665:
+ return '', None, None
+ elif val >= 12000:
+ return 'DTCS', val - 12000, 'R'
+ elif val >= 8000:
+ return 'DTCS', val - 8000, 'N'
+ else:
+ return 'Tone', val / 10.0, None
+
+ def _encode_tone(self, memval, mode, value, pol):
+ if mode == '':
+ memval[0].set_raw(0xFF)
+ memval[1].set_raw(0xFF)
+ elif mode == 'Tone':
+ memval.set_value(int(value * 10))
+ elif mode == 'DTCS':
+ flag = 0x80 if pol == 'N' else 0xC0
+ memval.set_value(value)
+ memval[1].set_bits(flag)
+ else:
+ raise Exception("Internal error: invalid mode `%s'" % mode)
+
+ def get_memory(self, number):
+ _mem = self._memobj.memory[number - 1]
+
+ mem = chirp_common.Memory()
+
+ mem.number = number
+ mem.freq = int(_mem.rxfreq) * 10
+
+ # We'll consider any blank (i.e. 0MHz frequency) to be empty
+ if mem.freq == 0:
+ mem.empty = True
+ return mem
+
+ if _mem.rxfreq.get_raw() == "\xFF\xFF\xFF\xFF":
+ mem.freq = 0
+ mem.empty = True
+ return mem
+
+ if _mem.txfreq.get_raw() == "\xFF\xFF\xFF\xFF":
+ mem.duplex = "off"
+ mem.offset = 0
+ elif int(_mem.rxfreq) == int(_mem.txfreq):
+ mem.duplex = ""
+ mem.offset = 0
+ else:
+ mem.duplex = int(_mem.rxfreq) > int(_mem.txfreq) and "-" or "+"
+ mem.offset = abs(int(_mem.rxfreq) - int(_mem.txfreq)) * 10
+
+ mem.mode = not _mem.narrow and "FM" or "NFM"
+
+ mem.skip = _mem.skip and "S" or ""
+
+ txtone = self._decode_tone(_mem.txtone)
+ rxtone = self._decode_tone(_mem.rxtone)
+ chirp_common.split_tone_decode(mem, txtone, rxtone)
+
+ mem.extra = RadioSettingGroup("Extra", "extra")
+ rs = RadioSetting("bcl", "Busy Channel Lockout",
+ RadioSettingValueBoolean(not _mem.bcl))
+ mem.extra.append(rs)
+ rs = RadioSetting("scramble", "Scramble",
+ RadioSettingValueBoolean(not _mem.scramble))
+ mem.extra.append(rs)
+ rs = RadioSetting("compander", "Compander",
+ RadioSettingValueBoolean(not _mem.compander))
+ mem.extra.append(rs)
+
+ return mem
+
+ def set_memory(self, mem):
+ # Get a low-level memory object mapped to the image
+ _mem = self._memobj.memory[mem.number - 1]
+
+ if mem.empty:
+ _mem.set_raw("\xFF" * (_mem.size() / 8))
+ return
+
+ _mem.rxfreq = mem.freq / 10
+
+ if mem.duplex == "off":
+ for i in range(0, 4):
+ _mem.txfreq[i].set_raw("\xFF")
+ elif mem.duplex == "split":
+ _mem.txfreq = mem.offset / 10
+ elif mem.duplex == "+":
+ _mem.txfreq = (mem.freq + mem.offset) / 10
+ elif mem.duplex == "-":
+ _mem.txfreq = (mem.freq - mem.offset) / 10
+ else:
+ _mem.txfreq = mem.freq / 10
+
+ txtone, rxtone = chirp_common.split_tone_encode(mem)
+ self._encode_tone(_mem.txtone, *txtone)
+ self._encode_tone(_mem.rxtone, *rxtone)
+
+ _mem.narrow = 'N' in mem.mode
+ _mem.skip = mem.skip == "S"
+
+ for setting in mem.extra:
+ # NOTE: Only three settings right now, all are inverted
+ setattr(_mem, setting.get_name(), not int(setting.value))
+
+ def get_settings(self):
+ _settings = self._memobj.settings
+ basic = RadioSettingGroup("basic", "Basic Settings")
+ top = RadioSettings(basic)
+
+ rs = RadioSetting("squelchlevel", "Squelch level",
+ RadioSettingValueInteger(
+ 0, 9, _settings.squelchlevel))
+ basic.append(rs)
+
+ rs = RadioSetting("timeouttimer", "Timeout timer",
+ RadioSettingValueList(
+ TIMEOUTTIMER_LIST,
+ TIMEOUTTIMER_LIST[
+ _settings.timeouttimer]))
+ basic.append(rs)
+
+ rs = RadioSetting("scanmode", "Scan mode",
+ RadioSettingValueList(
+ SCANMODE_LIST,
+ SCANMODE_LIST[_settings.scanmode]))
+ basic.append(rs)
+
+ rs = RadioSetting("voiceprompt", "Voice prompt",
+ RadioSettingValueList(
+ VOICE_LIST,
+ VOICE_LIST[_settings.voiceprompt]))
+ basic.append(rs)
+
+ rs = RadioSetting("voxlevel", "Vox level",
+ RadioSettingValueList(
+ VOXLEVEL_LIST,
+ VOXLEVEL_LIST[_settings.voxlevel]))
+ basic.append(rs)
+
+ rs = RadioSetting("voxdelay", "VOX delay",
+ RadioSettingValueList(
+ VOXDELAY_LIST,
+ VOXDELAY_LIST[_settings.voxdelay]))
+ basic.append(rs)
+
+ rs = RadioSetting("batterysaver", "Battery saver",
+ RadioSettingValueBoolean(_settings.batterysaver))
+ basic.append(rs)
+
+ rs = RadioSetting("beep", "Beep",
+ RadioSettingValueBoolean(_settings.beep))
+ basic.append(rs)
+
+ return top
+
+ def set_settings(self, settings):
+ for element in settings:
+ if not isinstance(element, RadioSetting):
+ self.set_settings(element)
+ continue
+ else:
+ try:
+ if "." in element.get_name():
+ bits = element.get_name().split(".")
+ obj = self._memobj
+ for bit in bits[:-1]:
+ obj = getattr(obj, bit)
+ setting = bits[-1]
+ else:
+ obj = self._memobj.settings
+ setting = element.get_name()
+
+ if element.has_apply_callback():
+ LOG.debug("Using apply callback")
+ element.run_apply_callback()
+ else:
+ LOG.debug("Setting %s = %s" % (setting, element.value))
+ setattr(obj, setting, element.value)
+ except Exception, e:
+ LOG.debug(element.get_name())
+ raise
+
+
+ @classmethod
+ def match_model(cls, filedata, filename):
+ match_size = False
+ match_model = False
+
+ # testing the file data size
+ if len(filedata) == cls._memsize:
+ match_size = True
+
+ # testing the model fingerprint
+ match_model = model_match(cls, filedata)
+
+ if match_size and match_model:
+ return True
+ else:
+ return False
1
1
Tested changes:
[Declan Rieb <nthreewx(a)gmail.com>] [ft2d] Add support for Yaesu FT2DR. #3257 #3325 #3887
[Tom Hayward <tom(a)tomh.us>] [id880] Fix typo in charset definition. #281
[Tom Hayward <tom(a)tomh.us>] [thf6a] Support full charset (ASCII). Fixes #141
[Tom Hayward <tom(a)tomh.us>] [id880] Support full charset. Fixes #281
[Tom Hayward <tom(a)tomh.us>] [vx5] Support full charset (ASCII). Fixes #292
[Tom Hayward <tom(a)tomh.us>] [id31a] set used bit when creating new memory, clear when deleting. Fixes #269
[Tom Hayward <tom(a)tomh.us>] Support PyGTK < 2.22 in bank edit. Fixes #231
[Tom Hayward <tom(a)tomh.us>] [d710] [v71] [d72] Fix tone list (not all tones are supported). Fixes #212
[Dan Smith <dsmith(a)danplanet.com>] [vx7] Fix setting memory power levels on 220MHz band
Fixes #214
[Dan Smith <dsmith(a)danplanet.com>] fips: Pennsylvania FIPS code was wrong. #117
[Marco Filippi <iz3gme.marco(a)gmail.com>] Consider lower bound frequency of each valid_band as valid
Fix bug #181
[Tom Hayward <tom(a)tomh.us>] tmd700: allow 8-char names. Fixes #176
[Dan Smith <dsmith(a)danplanet.com>] Fix the "blind deletion" problem, as well as properly direct copy/paste
Fixes #172
[David Griffith <dave(a)661.org>] Bug #155 fix: VX-7 1.25m power levels
[David Griffith <dave(a)661.org>] New INSTALL and README files
Fixes #122
[Tom Hayward <tom(a)tomh.us>] thd72: only use hardware flow on OS X. Fixes #166
[Marco Filippi <iz3gme.marco(a)gmail.com>] [FT817] Tone freq not set correctly
Same as #88 for FT857, to avoid code duplication fix code have been moved from
ft857 to its ancestor class
Fix bug #163
[Tom Hayward <tom(a)tomh.us>] Fix Mac .app so paths with spaces work. Fixes Bug #145
Full log:
Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/chirp-test/workspace
[workspace] $ hg showconfig paths.default
[workspace] $ hg pull --rev default
[workspace] $ hg update --clean --rev default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
[workspace] $ hg log --rev . --template {node}
[workspace] $ hg log --rev . --template {rev}
[workspace] $ hg log --rev 0b2aaa54f3082a8fe735b4e32091466c50b9900b
[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 0b2aaa54f3082a8fe735b4e32091466c50b9900b
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson656527698579009810.sh
[workspace] $ /bin/sh -xe /tmp/hudson1300335629673027629.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.061s
OK
Patch 'tip' is OK
Checking for PEP8 regressions...
./chirp/platform.py:255:80: E501 line too long (82 > 79 characters)
./chirp/ui/mainapp.py:1909:80: E501 line too long (82 > 79 characters)
./chirp/ui/mainapp.py:1965:80: E501 line too long (82 > 79 characters)
real 0m9.029s
user 0m8.860s
sys 0m0.044s
================================================
Tests OK
+ cat /var/lib/jenkins/.chirp/debug.log
[2017-07-05 17:54:07,150] chirp.logger - DEBUG: CHIRP 0.3.0dev on Linux - Ubuntu 16.04.2 LTS (Python 2.7.12)
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TH-D7 = THD7Radio
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TH-D7G = THD7GRadio
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TM-D700 = TMD700Radio
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TM-V7 = TMV7Radio
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TM-G707 = TMG707Radio
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TH-G71 = THG71Radio
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TH-F6 = THF6ARadio
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TH-F7 = THF7ERadio
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TM-D710 = TMD710Radio
[2017-07-05 17:54:07,167] chirp.directory - INFO: Registered Kenwood_TH-D72_live_mode = THD72Radio
[2017-07-05 17:54:07,168] chirp.directory - INFO: Registered Kenwood_TM-V71 = TMV71Radio
[2017-07-05 17:54:07,168] chirp.directory - INFO: Registered Kenwood_TM-D710G = TMD710GRadio
[2017-07-05 17:54:07,168] chirp.directory - INFO: Registered Kenwood_TH-K2 = THK2Radio
[2017-07-05 17:54:07,168] chirp.directory - INFO: Registered Kenwood_TM-271 = TM271Radio
[2017-07-05 17:54:07,168] chirp.directory - INFO: Registered Kenwood_TM-281 = TM281Radio
[2017-07-05 17:54:07,168] chirp.directory - INFO: Registered Kenwood_TM-471 = TM471Radio
[2017-07-05 17:54:07,168] chirp.directory - INFO: Registered Icom_7200 = Icom7200Radio
[2017-07-05 17:54:07,168] chirp.directory - INFO: Registered Icom_IC-7000 = Icom7000Radio
[2017-07-05 17:54:07,169] chirp.directory - INFO: Registered Icom_IC-7100 = Icom7100Radio
[2017-07-05 17:54:07,169] chirp.directory - INFO: Registered Icom_746 = Icom746Radio
[2017-07-05 17:54:07,172] chirp.directory - INFO: Registered Alinco_DR03T = DR03Radio
[2017-07-05 17:54:07,172] chirp.directory - INFO: Registered Alinco_DR06T = DR06Radio
[2017-07-05 17:54:07,172] chirp.directory - INFO: Registered Alinco_DR135T = DR135Radio
[2017-07-05 17:54:07,172] chirp.directory - INFO: Registered Alinco_DR235T = DR235Radio
[2017-07-05 17:54:07,172] chirp.directory - INFO: Registered Alinco_DR435T = DR435Radio
[2017-07-05 17:54:07,172] chirp.directory - INFO: Registered Alinco_DJ596 = DJ596Radio
[2017-07-05 17:54:07,172] chirp.directory - INFO: Registered Jetstream_JT220M = JT220MRadio
[2017-07-05 17:54:07,172] chirp.directory - INFO: Registered Alinco_DJ175 = DJ175Radio
[2017-07-05 17:54:07,172] chirp.directory - INFO: Registered Alinco_DJ-G7EG = AlincoDJG7EG
[2017-07-05 17:54:07,173] chirp.directory - INFO: Registered AnyTone_5888UV = AnyTone5888UVRadio
[2017-07-05 17:54:07,173] chirp.directory - INFO: Registered Intek_HR-2040 = IntekHR2040Radio
[2017-07-05 17:54:07,173] chirp.directory - INFO: Registered Polmar_DB-50M = PolmarDB50MRadio
[2017-07-05 17:54:07,173] chirp.directory - INFO: Registered Powerwerx_DB-750X = PowerwerxDB750XRadio
[2017-07-05 17:54:07,174] chirp.directory - INFO: Registered AnyTone_TERMN-8R = AnyToneTERMN8RRadio
[2017-07-05 17:54:07,174] chirp.directory - INFO: Registered AnyTone_OBLTR-8R = AnyToneOBLTR8RRadio
[2017-07-05 17:54:07,175] chirp.directory - INFO: Registered Baofeng_UV-3R = UV3RRadio
[2017-07-05 17:54:07,175] chirp.directory - INFO: Registered Baofeng_BF-A58 = BFA58
[2017-07-05 17:54:07,175] chirp.directory - INFO: Registered Baofeng_UV-82WP = UV82WP
[2017-07-05 17:54:07,175] chirp.directory - INFO: Registered Baofeng_GT-3WP = GT3WP
[2017-07-05 17:54:07,175] chirp.directory - INFO: Registered Retevis_RT6 = RT6
[2017-07-05 17:54:07,176] chirp.directory - INFO: Registered Baojie_BJ-9900 = BJ9900Radio
[2017-07-05 17:54:07,177] chirp.directory - INFO: Registered Baofeng_UV-5R = BaofengUV5RGeneric
[2017-07-05 17:54:07,177] chirp.directory - INFO: Registered Baofeng_F-11 = BaofengF11Radio
[2017-07-05 17:54:07,177] chirp.directory - INFO: Registered Baofeng_UV-82 = BaofengUV82Radio
[2017-07-05 17:54:07,177] chirp.directory - INFO: Registered Baofeng_UV-6 = BaofengUV6Radio
[2017-07-05 17:54:07,177] chirp.directory - INFO: Registered Intek_KT-980HP = IntekKT980Radio
[2017-07-05 17:54:07,177] chirp.directory - INFO: Registered Baofeng_BF-F8HP = BaofengBFF8HPRadio
[2017-07-05 17:54:07,177] chirp.directory - INFO: Registered Baofeng_UV-82HP = BaofengUV82HPRadio
[2017-07-05 17:54:07,177] chirp.directory - INFO: Registered Baojie_BJ-UV55 = BaojieBJUV55Radio
[2017-07-05 17:54:07,178] chirp.directory - INFO: Registered BTECH_UV-2501 = UV2501
[2017-07-05 17:54:07,178] chirp.directory - INFO: Registered BTECH_UV-2501+220 = UV2501_220
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered BTECH_UV-5001 = UV5001
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered WACCOM_MINI-8900 = MINI8900
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered QYT_KT-UV980 = KTUV980
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered QYT_KT8900 = KT9800
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered QYT_KT8900R = KT9800R
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered LUITON_LT-588UV = LT588UV
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered BTECH_UV-25X2 = UV25X2
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered BTECH_UV-25X4 = UV25X4
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered BTECH_UV-50X2 = UV50X2
[2017-07-05 17:54:07,179] chirp.directory - INFO: Registered QYT_KT7900D = KT7900D
[2017-07-05 17:54:07,180] chirp.directory - INFO: Registered QYT_KT8900D = KT8900D
[2017-07-05 17:54:07,180] chirp.directory - INFO: Registered Feidaxin_FD-268A = FD268ARadio
[2017-07-05 17:54:07,180] chirp.directory - INFO: Registered Feidaxin_FD-268B = FD268BRadio
[2017-07-05 17:54:07,180] chirp.directory - INFO: Registered Feidaxin_FD-288A = FD288ARadio
[2017-07-05 17:54:07,180] chirp.directory - INFO: Registered Feidaxin_FD-288B = FD288BRadio
[2017-07-05 17:54:07,180] chirp.directory - INFO: Registered Feidaxin_FD-150A = FD150ARadio
[2017-07-05 17:54:07,180] chirp.directory - INFO: Registered Feidaxin_FD-160A = FD160ARadio
[2017-07-05 17:54:07,180] chirp.directory - INFO: Registered Feidaxin_FD-450A = FD450ARadio
[2017-07-05 17:54:07,181] chirp.directory - INFO: Registered Feidaxin_FD-460A = FD460ARadio
[2017-07-05 17:54:07,181] chirp.directory - INFO: Registered Feidaxin_FD-460UH = FD460UHRadio
[2017-07-05 17:54:07,181] chirp.directory - INFO: Registered Yaesu_FT-1802M = FT1802Radio
[2017-07-05 17:54:07,182] chirp.directory - INFO: Registered Yaesu_FT-1D_R = FT1Radio
[2017-07-05 17:54:07,182] chirp.directory - INFO: Registered Yaesu_FT-2800M = FT2800Radio
[2017-07-05 17:54:07,183] chirp.directory - INFO: Registered Yaesu_FT-2900R_1900R = FT2900Radio
[2017-07-05 17:54:07,183] chirp.directory - INFO: Registered Yaesu_FT2D_R = FT2D
[2017-07-05 17:54:07,184] chirp.directory - INFO: Registered Yaesu_FT-50 = FT50Radio
[2017-07-05 17:54:07,184] chirp.directory - INFO: Registered Yaesu_FT-60 = FT60Radio
[2017-07-05 17:54:07,184] chirp.directory - INFO: Registered Yaesu_FT-7800_7900 = FT7800Radio
[2017-07-05 17:54:07,185] chirp.directory - INFO: Registered Yaesu_FT-8800 = FT8800Radio
[2017-07-05 17:54:07,185] chirp.directory - INFO: Registered Yaesu_FT-8900 = FT8900Radio
[2017-07-05 17:54:07,185] chirp.directory - INFO: Registered Yaesu_FT-8100 = FT8100Radio
[2017-07-05 17:54:07,185] chirp.directory - INFO: Registered Yaesu_FT-817 = FT817Radio
[2017-07-05 17:54:07,186] chirp.directory - INFO: Registered Yaesu_FT-817ND = FT817NDRadio
[2017-07-05 17:54:07,186] chirp.directory - INFO: Registered Yaesu_FT-817ND_US = FT817NDUSRadio
[2017-07-05 17:54:07,186] chirp.directory - INFO: Registered Yaesu_FT-857_897 = FT857Radio
[2017-07-05 17:54:07,186] chirp.directory - INFO: Registered Yaesu_FT-857_897_US = FT857USRadio
[2017-07-05 17:54:07,187] chirp.directory - INFO: Registered Yaesu_FT-90 = FT90Radio
[2017-07-05 17:54:07,187] chirp.directory - INFO: Registered Yaesu_FTM-3200D_R = FTM3200Radio
[2017-07-05 17:54:07,187] chirp.directory - INFO: Registered Yaesu_FTM-350 = FTM350Radio
[2017-07-05 17:54:07,188] chirp.directory - INFO: Registered Generic_CSV = CSVRadio
[2017-07-05 17:54:07,188] chirp.directory - INFO: Registered Commander_KG-UV = CommanderCSVRadio
[2017-07-05 17:54:07,188] chirp.directory - INFO: Registered RT_Systems_CSV = RTCSVRadio
[2017-07-05 17:54:07,188] chirp.directory - INFO: Registered ARRL_Travel_Plus = TpeRadio
[2017-07-05 17:54:07,197] chirp.directory - INFO: Registered Generic_XML = XMLRadio
[2017-07-05 17:54:07,198] chirp.directory - INFO: Registered BTECH_GMRS-V1 = GMRSV1
[2017-07-05 17:54:07,201] chirp.directory - INFO: Registered Baofeng_BF-888 = H777Radio
[2017-07-05 17:54:07,202] chirp.directory - INFO: Registered HobbyPCB_RS-UV3 = HobbyPCBRSUV3Radio
[2017-07-05 17:54:07,202] chirp.directory - INFO: Registered Icom_IC-208H = IC208Radio
[2017-07-05 17:54:07,202] chirp.directory - INFO: Registered Icom_IC-2100H = IC2100Radio
[2017-07-05 17:54:07,202] chirp.directory - INFO: Registered Icom_IC-2200H = IC2200Radio
[2017-07-05 17:54:07,203] chirp.directory - INFO: Registered Icom_IC-2300H = IC2300Radio
[2017-07-05 17:54:07,203] chirp.directory - INFO: Registered Icom_IC-2720H = IC2720Radio
[2017-07-05 17:54:07,203] chirp.directory - INFO: Registered Icom_IC-2820H = IC2820Radio
[2017-07-05 17:54:07,203] chirp.directory - INFO: Registered Icom_IC-91_92AD = IC9xRadio
[2017-07-05 17:54:07,204] chirp.directory - INFO: Registered Icom_IC-P7 = ICP7Radio
[2017-07-05 17:54:07,204] chirp.directory - INFO: Registered Icom_IC-Q7A = ICQ7Radio
[2017-07-05 17:54:07,204] chirp.directory - INFO: Registered Icom_IC-T70 = ICT70Radio
[2017-07-05 17:54:07,205] chirp.directory - INFO: Registered Icom_IC-T7H = ICT7HRadio
[2017-07-05 17:54:07,205] chirp.directory - INFO: Registered Icom_IC-T8A = ICT8ARadio
[2017-07-05 17:54:07,205] chirp.directory - INFO: Registered Icom_IC-W32A = ICW32ARadio
[2017-07-05 17:54:07,205] chirp.directory - INFO: Registered Icom_IC-W32E = ICW32ERadio
[2017-07-05 17:54:07,206] chirp.directory - INFO: Registered Icom_IC-V82_U82 = ICx8xRadio
[2017-07-05 17:54:07,206] chirp.directory - INFO: Registered Icom_ID-31A = ID31Radio
[2017-07-05 17:54:07,206] chirp.directory - INFO: Registered Icom_ID-51 = ID51Radio
[2017-07-05 17:54:07,206] chirp.directory - INFO: Registered Icom_ID-51_Plus = ID51PLUSRadio
[2017-07-05 17:54:07,207] chirp.directory - INFO: Registered Icom_ID-800H_v2 = ID800v2Radio
[2017-07-05 17:54:07,207] chirp.directory - INFO: Registered Icom_ID-880H = ID880Radio
[2017-07-05 17:54:07,207] chirp.directory - INFO: Registered Icom_ID-80H = ID80Radio
[2017-07-05 17:54:07,207] chirp.directory - INFO: Registered Kenwood_HMK = HMKRadio
[2017-07-05 17:54:07,207] chirp.directory - INFO: Registered Kenwood_ITM = ITMRadio
[2017-07-05 17:54:07,208] chirp.directory - INFO: Registered Wouxun_KG-UV8D = KGUV8DRadio
[2017-07-05 17:54:07,208] chirp.directory - INFO: Registered KYD_NC-630A = NC630aRadio
[2017-07-05 17:54:07,209] chirp.directory - INFO: Registered KYD_IP-620 = IP620Radio
[2017-07-05 17:54:07,210] chirp.directory - INFO: Registered Leixen_VV-898 = LeixenVV898Radio
[2017-07-05 17:54:07,210] chirp.directory - INFO: Registered Jetstream_JT270M = JetstreamJT270MRadio
[2017-07-05 17:54:07,210] chirp.directory - INFO: Registered Jetstream_JT270MH = JetstreamJT270MHRadio
[2017-07-05 17:54:07,210] chirp.directory - INFO: Registered Leixen_VV-898S = LeixenVV898SRadio
[2017-07-05 17:54:07,210] chirp.directory - INFO: Registered LUITON_LT-725UV = LT725UV
[2017-07-05 17:54:07,211] chirp.directory - INFO: Registered Wouxun_KG-UVD1P = KGUVD1PRadio
[2017-07-05 17:54:07,211] chirp.directory - INFO: Registered Wouxun_KG-UV6 = KGUV6DRadio
[2017-07-05 17:54:07,211] chirp.directory - INFO: Registered Wouxun_KG-816 = KG816Radio
[2017-07-05 17:54:07,211] chirp.directory - INFO: Registered Wouxun_KG-818 = KG818Radio
[2017-07-05 17:54:07,212] chirp.directory - INFO: Registered Puxing_PX-777 = Puxing777Radio
[2017-07-05 17:54:07,212] chirp.directory - INFO: Registered Puxing_PX-2R = Puxing2RRadio
[2017-07-05 17:54:07,212] chirp.directory - INFO: Registered Puxing_PX-888K = Puxing_PX888K_Radio
[2017-07-05 17:54:07,213] chirp.directory - INFO: Registered Retevis_RT1 = RT1Radio
[2017-07-05 17:54:07,213] chirp.directory - INFO: Registered Retevis_RT21 = RT21Radio
[2017-07-05 17:54:07,214] chirp.directory - INFO: Registered Retevis_RT22 = RT22Radio
[2017-07-05 17:54:07,214] chirp.directory - INFO: Registered WLN_KD-C1 = KDC1
[2017-07-05 17:54:07,214] chirp.directory - INFO: Registered Zastone_ZT-X6 = ZTX6
[2017-07-05 17:54:07,214] chirp.directory - INFO: Registered LUITON_LT-316 = LT316
[2017-07-05 17:54:07,214] chirp.directory - INFO: Registered TID_TD-M8 = TDM8
[2017-07-05 17:54:07,214] chirp.directory - INFO: Registered Retevis_RT23 = RT23Radio
[2017-07-05 17:54:07,215] chirp.directory - INFO: Registered Rugged_RH5R-V2 = RH5RV2
[2017-07-05 17:54:07,215] chirp.directory - INFO: Registered TDXone_TD-Q8A = TDXoneTDQ8A
[2017-07-05 17:54:07,216] chirp.directory - INFO: Registered TYT_TH-7800_File = TYTTH7800File
[2017-07-05 17:54:07,216] chirp.directory - INFO: Registered TYT_TH-7800 = TYTTH7800Radio
[2017-07-05 17:54:07,216] chirp.directory - INFO: Registered TYT_TH9000_220 = Th9000220Radio
[2017-07-05 17:54:07,216] chirp.directory - INFO: Registered TYT_TH9000_144 = Th9000144Radio
[2017-07-05 17:54:07,216] chirp.directory - INFO: Registered TYT_TH9000_440 = Th9000440Radio
[2017-07-05 17:54:07,217] chirp.directory - INFO: Registered TYT_TH-9800_File = TYTTH9800File
[2017-07-05 17:54:07,217] chirp.directory - INFO: Registered TYT_TH-9800 = TYTTH9800Radio
[2017-07-05 17:54:07,217] chirp.directory - INFO: Registered TYT_TH-UV3R = TYTUV3RRadio
[2017-07-05 17:54:07,217] chirp.directory - INFO: Registered TYT_TH-UV3R-25 = TYTUV3R25Radio
[2017-07-05 17:54:07,218] chirp.directory - INFO: Registered TYT_TH-UVF8D = TYTUVF8DRadio
[2017-07-05 17:54:07,218] chirp.directory - INFO: Registered Kenwood_TH-D72_clone_mode = THD72Radio
[2017-07-05 17:54:07,218] chirp.directory - INFO: Registered TYT_TH-UVF1 = TYTTHUVF1Radio
[2017-07-05 17:54:07,219] chirp.directory - INFO: Registered Kenwood_TK-260 = TK260_Radio
[2017-07-05 17:54:07,219] chirp.directory - INFO: Registered Kenwood_TK-270 = TK270_Radio
[2017-07-05 17:54:07,219] chirp.directory - INFO: Registered Kenwood_TK-272 = TK272_Radio
[2017-07-05 17:54:07,219] chirp.directory - INFO: Registered Kenwood_TK-278 = TK278_Radio
[2017-07-05 17:54:07,219] chirp.directory - INFO: Registered Kenwood_TK-360 = TK360_Radio
[2017-07-05 17:54:07,219] chirp.directory - INFO: Registered Kenwood_TK-370 = TK370_Radio
[2017-07-05 17:54:07,219] chirp.directory - INFO: Registered Kenwood_TK-372 = TK372_Radio
[2017-07-05 17:54:07,220] chirp.directory - INFO: Registered Kenwood_TK-378 = TK378_Radio
[2017-07-05 17:54:07,220] chirp.directory - INFO: Registered Kenwood_TK-760 = TK760_Radio
[2017-07-05 17:54:07,220] chirp.directory - INFO: Registered Kenwood_TK-762 = TK762_Radio
[2017-07-05 17:54:07,220] chirp.directory - INFO: Registered Kenwood_TK-768 = TK768_Radio
[2017-07-05 17:54:07,220] chirp.directory - INFO: Registered Kenwood_TK-860 = TK860_Radio
[2017-07-05 17:54:07,220] chirp.directory - INFO: Registered Kenwood_TK-862 = TK862_Radio
[2017-07-05 17:54:07,220] chirp.directory - INFO: Registered Kenwood_TK-868 = TK868_Radio
[2017-07-05 17:54:07,221] chirp.directory - INFO: Registered Kenwood_TK-868G = TK868G_Radios
[2017-07-05 17:54:07,221] chirp.directory - INFO: Registered Kenwood_TK-862G = TK862G_Radios
[2017-07-05 17:54:07,221] chirp.directory - INFO: Registered Kenwood_TK-860G = TK860G_Radios
[2017-07-05 17:54:07,221] chirp.directory - INFO: Registered Kenwood_TK-768G = TK768G_Radios
[2017-07-05 17:54:07,221] chirp.directory - INFO: Registered Kenwood_TK-762G = TK762G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-760G = TK760G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-388G = TK388G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-378G = TK378G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-372G = TK372G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-370G = TK370G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-360G = TK360G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-278G = TK278G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-272G = TK272G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-270G = TK270G_Radios
[2017-07-05 17:54:07,222] chirp.directory - INFO: Registered Kenwood_TK-260G = TK260G_Radios
[2017-07-05 17:54:07,223] chirp.directory - INFO: Registered Kenwood_TK-7102 = KenwoodTK7102Radio
[2017-07-05 17:54:07,223] chirp.directory - INFO: Registered Kenwood_TK-8102 = KenwoodTK8102Radio
[2017-07-05 17:54:07,223] chirp.directory - INFO: Registered Kenwood_TK-7108 = KenwoodTK7108Radio
[2017-07-05 17:54:07,223] chirp.directory - INFO: Registered Kenwood_TK-8108 = KenwoodTK8108Radio
[2017-07-05 17:54:07,224] chirp.directory - INFO: Registered Kenwood_TS-2000 = TS2000Radio
[2017-07-05 17:54:07,224] chirp.directory - INFO: Registered BTECH_UV-5X3 = UV5X3
[2017-07-05 17:54:07,224] chirp.directory - INFO: Registered Baofeng_UV-6R = UV6R
[2017-07-05 17:54:07,225] chirp.directory - INFO: Registered Baofeng_UV-B5 = BaofengUVB5
[2017-07-05 17:54:07,225] chirp.directory - INFO: Registered BTECH_UV-50X3 = UV50X3
[2017-07-05 17:54:07,226] chirp.directory - INFO: Registered Yaesu_VX-170 = VX170Radio
[2017-07-05 17:54:07,226] chirp.directory - INFO: Registered Yaesu_VX-2 = VX2Radio
[2017-07-05 17:54:07,226] chirp.directory - INFO: Registered Yaesu_VX-3 = VX3Radio
[2017-07-05 17:54:07,227] chirp.directory - INFO: Registered Yaesu_VX-5 = VX5Radio
[2017-07-05 17:54:07,227] chirp.directory - INFO: Registered Yaesu_VX-6 = VX6Radio
[2017-07-05 17:54:07,227] chirp.directory - INFO: Registered Yaesu_VX-7 = VX7Radio
[2017-07-05 17:54:07,228] chirp.directory - INFO: Registered Yaesu_VX-8R = VX8Radio
[2017-07-05 17:54:07,228] chirp.directory - INFO: Registered Yaesu_VX-8DR = VX8DRadio
[2017-07-05 17:54:07,228] chirp.directory - INFO: Registered Yaesu_VX-8GE = VX8GERadio
[2017-07-05 17:54:07,229] chirp.directory - INFO: Registered Vertex_Standard_VXA-700 = VXA700Radio
Email was triggered for: Success
Sending email for trigger: Success
1
0
Can we close or update issues #959 and #4729 (a duplicate) regarding
support for the Icom IC-2300H? My patch to address this seems to be in
nightly builds now. Thanks,
-Windsor
1
0
Thanks to Tom Hayward <tom(a)tomh.us <mailto:tom@tomh.us>> for unblinding me to the hg “add” function. I’ve now submitted a new support suggestion. I think it’d be A Good Idea to add the required instructions to the “Add_A_Radio” section of the blog, since one doesn’t add a whole file very often.
What he said worked a charm, AND correctly diagnosed my problem with the instructions;
> I think the issue is the the instructions are written for making
> changes to files, and you're trying to add a files. To add the new
> file to the patch, try this:
>
> hg add chirp/drivers/ft2.dpy
> hg qref
> hg export tip
>
>
> Tom KD7LXL
Declan Rieb WD5EQY
2
1