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
- 3 participants
- 2964 discussions
[chirp_devel] Fwd: [PATCH 2 of 3] [BJ-318] Driver prep to make ready to support the Baojie BJ-318
by Jim Unroe 12 Apr '21
by Jim Unroe 12 Apr '21
12 Apr '21
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Mon, Apr 12, 2021 at 12:29 PM
Subject: [PATCH 2 of 3] [BJ-318] Driver prep to make ready to support
the Baojie BJ-318
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1618189954 14400
# Sun Apr 11 21:12:34 2021 -0400
# Node ID 60b475e41306144198481bc84d428ef0ca6adb5b
# Parent 9f38db094e0e56b31998f97abda4ca6f53572a0a
[BJ-318] Driver prep to make ready to support the Baojie BJ-318
This patch makes changes to the lt725uv.py driver to facilitate the addition
of support for the Baojie BJ-318.
The features and settings of the radio models that this driver currently
supports are not affected.
related to #6235
diff -r 9f38db094e0e -r 60b475e41306 chirp/drivers/lt725uv.py
--- a/chirp/drivers/lt725uv.py Sun Apr 11 16:45:34 2021 -0400
+++ b/chirp/drivers/lt725uv.py Sun Apr 11 21:12:34 2021 -0400
@@ -1,4 +1,4 @@
-# Copyright 2016:
+# Copyright 2016-2021:
# * Jim Unroe KC9HI, <rock.unroe(a)gmail.com>
# Modified for Baojie BJ-218: 2018 by Rick DeWitt (RJD), <aa0rd(a)yahoo.com>#
# This program is free software: you can redistribute it and/or modify
@@ -173,9 +173,6 @@
MEM_SIZE = 0x1C00
BLOCK_SIZE = 0x40
STIMEOUT = 2
-# Channel power: 2 levels
-POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=5.00),
- chirp_common.PowerLevel("High", watts=30.00)]
LIST_RECVMODE = ["QT/DQT", "QT/DQT + Signaling"]
LIST_SIGNAL = ["Off"] + ["DTMF%s" % x for x in range(1, 9)] + \
@@ -428,6 +425,10 @@
NAME_LENGTH = 7
DTMF_CHARS = list("0123456789ABCD*#")
+ # Channel power: 2 levels
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=5.00),
+ chirp_common.PowerLevel("High", watts=30.00)]
+
VALID_BANDS = [(136000000, 176000000),
(400000000, 480000000)]
@@ -499,7 +500,7 @@
"->Tone",
"DTCS->DTCS"]
rf.valid_skips = []
- rf.valid_power_levels = POWER_LEVELS
+ rf.valid_power_levels = self.POWER_LEVELS
rf.valid_name_length = self.NAME_LENGTH
rf.valid_dtcs_codes = self.DTCS_CODES
rf.valid_bands = self.VALID_BANDS
@@ -624,7 +625,7 @@
mem.mode = _mem.wide and "FM" or "NFM"
- mem.power = POWER_LEVELS[_mem.power]
+ mem.power = self.POWER_LEVELS[_mem.power]
# Extra
mem.extra = RadioSettingGroup("extra", "Extra")
@@ -745,7 +746,7 @@
_mem.txtone = self._set_dcs(mem.dtcs)
_mem.wide = self.MODES.index(mem.mode)
- _mem.power = mem.power == POWER_LEVELS[1]
+ _mem.power = mem.power == self.POWER_LEVELS[1]
# Extra settings
for setting in mem.extra:
@@ -1440,9 +1441,22 @@
MODEL = "BJ-218"
+class Baojie218Upper(LT725UVUpper):
+ VENDOR = "Baojie"
+ MODEL = "BJ-218"
+
+
+class Baojie218Lower(LT725UVLower):
+ VENDOR = "Baojie"
+ MODEL = "BJ-218"
+
+
@directory.register
class Baojie218(LT725UV):
"""Baojie BJ-218"""
VENDOR = "Baojie"
MODEL = "BJ-218"
ALIASES = [Zastone, Hesenate, ]
+
+ def get_sub_devices(self):
+ return [Baojie218Upper(self._mmap), Baojie218Lower(self._mmap)]
1
0
[chirp_devel] Fwd: [PATCH 1 of 3] [LT-725UV] Fix for incorrect range specified for VFO B Initial Chan: setting
by Jim Unroe 12 Apr '21
by Jim Unroe 12 Apr '21
12 Apr '21
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Mon, Apr 12, 2021 at 12:29 PM
Subject: [PATCH 1 of 3] [LT-725UV] Fix for incorrect range specified
for VFO B Initial Chan: setting
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1618173934 14400
# Sun Apr 11 16:45:34 2021 -0400
# Node ID 9f38db094e0e56b31998f97abda4ca6f53572a0a
# Parent 42c5ae551170c33b04f997e3a07a9e1857bdb504
[LT-725UV] Fix for incorrect range specified for VFO B Initial Chan: setting
The Settings -> VFO B-Lower Settings -> Initial Chan:" setting currently
provies a selection range of 0-127. This range should be 1-128.
This patch updates the Initial Chan: seting to provide the correct range.
Models affected:
LUITON LT-725UV
Baojie BJ-218 / Hesenate BJ-218 / Zastone BJ-218
Fixes #8979
diff -r 42c5ae551170 -r 9f38db094e0e chirp/drivers/lt725uv.py
--- a/chirp/drivers/lt725uv.py Mon Apr 05 17:23:17 2021 -0700
+++ b/chirp/drivers/lt725uv.py Sun Apr 11 16:45:34 2021 -0400
@@ -1043,7 +1043,7 @@
val = _vfob.chan_num + 1
rs = RadioSetting("lower.vfob.chan_num", "Initial Chan",
- RadioSettingValueInteger(0, 127, val))
+ RadioSettingValueInteger(1, 128, val))
rs.set_apply_callback(my_adjraw, _vfob, "chan_num", -1)
b_band.append(rs)
1
0
Tested changes:
Changes for Build #910
[Jim Unroe <rock.unroe(a)gmail.com>] [RT76] Retevis RT76
This patch adds support for the Retevis RT76.
Related to #8959
[Jim Unroe <rock.unroe(a)gmail.com>] [RB26] Retevis RB26
This patch adds support for the Retevis RB26.
Related to #8661
[Jim Unroe <rock.unroe(a)gmail.com>] [RB17A] Retevis RB17A
This patch adds support for the Retevis RB17A.
Related to #8957
[Jim Unroe <rock.unroe(a)gmail.com>] [RT21] Driver Maintenance: retevis_rt21.py
This patch is prepare the driver for adding additional radio models.
1: fixes some incorrect code
2: reformats some code
3: allows CHIRP to make 5 attempts at putting radio into programming mode.
Other than for number 3, no features or settings have been added or removed from
this driver.
Related to #8957, #8661 and #8959
[Rick DeWitt <aa0rd(a)yahoo.com>] [icomciv] Add IC-7300 Live Mode support, Issue #4013
[Jim Unroe <rock.unroe(a)gmail.com>] [AT-778UV] Add support model variants that include VOX
This patch adds support for the new model variants that now include VOX:
Anytone AT-778UV VOX 3.0
Retevis RT95 VOX 2.0
fixes #8859
[Jim Unroe <rock.unroe(a)gmail.com>] [AT-778UV] Add anytone778uv.py driver to cpep8.manifext
This patch adds the anytone778uv.py driver to the cpep8.manifest in order to
enable style checking.
related to #8859
[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:
[...truncated 812 lines...]
test_copy_all (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D copy all ... ok
test_detect (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D detect ... ok
test_edges (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D edges ... ok
test_settings (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D settings ... ok
test_banks (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G banks ... ok
test_brute_force (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G brute force ... ok
test_clone (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G clone ... ok
test_copy_all (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G copy all ... ok
test_detect (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G detect ... ok
test_edges (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G edges ... ok
test_settings (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G settings ... ok
test_banks (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 brute force ... ok
test_clone (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 clone ... ok
test_copy_all (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 copy all ... ok
test_detect (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 detect ... ok
test_edges (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 edges ... ok
test_settings (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 settings ... ok
test_banks (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 banks ... ok
test_brute_force (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 brute force ... ok
test_clone (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 clone ... ok
test_copy_all (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 copy all ... ok
test_detect (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 detect ... ok
test_edges (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 edges ... ok
test_settings (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 brute force ... ok
test_clone (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 clone ... ok
test_copy_all (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 copy all ... ok
test_detect (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 detect ... ok
test_edges (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 edges ... ok
test_settings (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 settings ... ok
test_banks (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 brute force ... ok
test_clone (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 clone ... ok
test_copy_all (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 copy all ... ok
test_detect (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 detect ... ok
test_edges (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 edges ... ok
test_settings (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 settings ... ok
test_banks (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 brute force ... ok
test_clone (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 clone ... ok
test_copy_all (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 copy all ... ok
test_detect (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 detect ... ok
test_edges (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 edges ... ok
test_settings (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 settings ... ok
test_banks (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M brute force ... ok
test_clone (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M clone ... ok
test_copy_all (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M copy all ... ok
test_detect (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M detect ... ok
test_edges (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M edges ... ok
test_settings (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 banks ... ok
test_brute_force (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 brute force ... ok
test_clone (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 clone ... ok
test_copy_all (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 copy all ... ok
test_detect (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 detect ... ok
test_edges (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 edges ... ok
test_settings (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 brute force ... ok
test_clone (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 clone ... ok
test_copy_all (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 copy all ... ok
test_detect (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 detect ... ok
test_edges (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 edges ... ok
test_settings (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 settings ... ok
test_banks (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 brute force ... ok
test_clone (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 clone ... ok
test_copy_all (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 copy all ... ok
test_detect (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 detect ... ok
test_edges (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 edges ... ok
test_settings (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 brute force ... ok
test_clone (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 clone ... ok
test_copy_all (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 copy all ... ok
test_detect (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 detect ... ok
test_edges (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 edges ... ok
test_settings (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 settings ... ok
test_banks (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A brute force ... ok
test_clone (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A clone ... ok
test_copy_all (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A copy all ... ok
test_detect (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A detect ... ok
test_edges (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A edges ... ok
test_settings (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 brute force ... ok
test_clone (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 clone ... ok
test_copy_all (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 copy all ... ok
test_detect (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 detect ... ok
test_edges (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 edges ... skipped 'No mutable memory locations found'
test_settings (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 settings ... ok
test_banks (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND brute force ... ok
test_clone (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND clone ... ok
test_copy_all (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND copy all ... ok
test_detect (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND detect ... ok
test_edges (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND edges ... ok
test_settings (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND settings ... ok
test_banks (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 brute force ... ok
test_clone (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 clone ... ok
test_copy_all (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 copy all ... ok
test_detect (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 detect ... ok
test_edges (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 edges ... ok
test_settings (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 settings ... ok
test_banks (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M brute force ... ok
test_clone (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M clone ... ok
test_copy_all (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M copy all ... ok
test_detect (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M detect ... ok
test_edges (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M edges ... ok
test_settings (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_RadioddityR2)
Testing Radioddity R2 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RadioddityR2)
Testing Radioddity R2 brute force ... ok
test_clone (tests.TestCase_RadioddityR2)
Testing Radioddity R2 clone ... ok
test_copy_all (tests.TestCase_RadioddityR2)
Testing Radioddity R2 copy all ... ok
test_detect (tests.TestCase_RadioddityR2)
Testing Radioddity R2 detect ... ok
test_edges (tests.TestCase_RadioddityR2)
Testing Radioddity R2 edges ... ok
test_settings (tests.TestCase_RadioddityR2)
Testing Radioddity R2 settings ... ok
test_banks (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus brute force ... ok
test_clone (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus clone ... ok
test_copy_all (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus copy all ... ok
test_detect (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus detect ... ok
test_edges (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus edges ... ok
test_settings (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus settings ... ok
test_banks (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) brute force ... ok
test_clone (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) clone ... ok
test_copy_all (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) copy all ... ok
test_detect (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) detect ... ok
test_edges (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) edges ... ok
test_settings (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) settings ... ok
test_banks (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E brute force ... ok
test_clone (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E clone ... ok
test_copy_all (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E copy all ... ok
test_detect (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E detect ... ok
test_edges (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E edges ... ok
test_settings (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 brute force ... ok
test_clone (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 clone ... ok
test_copy_all (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 copy all ... ok
test_detect (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 detect ... ok
test_edges (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 edges ... ok
test_settings (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR banks ... ok
test_brute_force (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR brute force ... ok
test_clone (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR clone ... ok
test_copy_all (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR copy all ... ok
test_detect (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR detect ... ok
test_edges (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR edges ... ok
test_settings (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR settings ... ok
test_banks (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 brute force ... ok
test_clone (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 clone ... ok
test_copy_all (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 copy all ... ok
test_detect (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 detect ... ok
test_edges (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 edges ... ok
test_settings (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 settings ... ok
test_banks (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 brute force ... ok
test_clone (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 clone ... ok
test_copy_all (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 copy all ... ok
test_detect (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 detect ... ok
test_edges (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 edges ... ok
test_settings (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 settings ... ok
test_banks (tests.TestCase_RadtelT18)
Testing Radtel T18 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RadtelT18)
Testing Radtel T18 brute force ... ok
test_clone (tests.TestCase_RadtelT18)
Testing Radtel T18 clone ... ok
test_copy_all (tests.TestCase_RadtelT18)
Testing Radtel T18 copy all ... ok
test_detect (tests.TestCase_RadtelT18)
Testing Radtel T18 detect ... ok
test_edges (tests.TestCase_RadtelT18)
Testing Radtel T18 edges ... ok
test_settings (tests.TestCase_RadtelT18)
Testing Radtel T18 settings ... ok
test_banks (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 brute force ... ok
test_clone (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 clone ... ok
test_copy_all (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 copy all ... ok
test_detect (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 detect ... ok
test_edges (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 edges ... ok
test_settings (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 settings ... ok
test_banks (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV brute force ... ok
test_clone (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV clone ... ok
test_copy_all (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV copy all ... ok
test_detect (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV detect ... ok
test_edges (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV edges ... ok
test_settings (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV settings ... ok
test_banks (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R brute force ... ok
test_clone (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R clone ... ok
test_copy_all (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R copy all ... ok
test_detect (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R detect ... ok
test_edges (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R edges ... ok
test_settings (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 brute force ... ok
test_clone (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 clone ... ok
test_copy_all (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 copy all ... ok
test_detect (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 detect ... ok
test_edges (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 edges ... ok
test_settings (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 settings ... ok
test_banks (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A brute force ... ok
test_clone (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A clone ... ok
test_copy_all (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A copy all ... ok
test_detect (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A detect ... ok
test_edges (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A edges ... skipped 'No mutable memory locations found'
test_settings (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A settings ... ok
test_banks (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 brute force ... ok
test_clone (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 clone ... ok
test_copy_all (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 copy all ... ok
test_detect (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 detect ... ok
test_edges (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 edges ... ok
test_settings (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 settings ... ok
test_banks (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 brute force ... ok
test_clone (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 clone ... ok
test_copy_all (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 copy all ... ok
test_detect (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 detect ... ok
test_edges (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 edges ... ok
test_settings (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 settings ... ok
test_banks (tests.TestCase_IcomID31A)
Testing Icom ID-31A banks ... ok
test_brute_force (tests.TestCase_IcomID31A)
Testing Icom ID-31A brute force ... ok
test_clone (tests.TestCase_IcomID31A)
Testing Icom ID-31A clone ... ok
test_copy_all (tests.TestCase_IcomID31A)
Testing Icom ID-31A copy all ... ok
test_detect (tests.TestCase_IcomID31A)
Testing Icom ID-31A detect ... ok
test_edges (tests.TestCase_IcomID31A)
Testing Icom ID-31A edges ... ok
test_settings (tests.TestCase_IcomID31A)
Testing Icom ID-31A settings ... ok
test_banks (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A brute force ... ok
test_clone (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A clone ... ok
test_copy_all (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A copy all ... ok
test_detect (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A detect ... ok
test_edges (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A edges ... ok
test_settings (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A settings ... ok
test_banks (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE banks ... ok
test_brute_force (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE brute force ... ok
test_clone (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE clone ... ok
test_copy_all (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE copy all ... ok
test_detect (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE detect ... ok
test_edges (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE edges ... ok
test_settings (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE settings ... ok
test_banks (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D banks ... ok
test_brute_force (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D brute force ... ok
test_clone (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D clone ... ok
test_copy_all (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D copy all ... ok
test_detect (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D detect ... ok
test_edges (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D edges ... ok
test_settings (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D settings ... ok
test_banks (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode brute force ... ok
test_clone (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode clone ... ok
test_copy_all (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode copy all ... ok
test_detect (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode detect ... ok
test_edges (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode edges ... ok
test_settings (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode settings ... ok
test_banks (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 brute force ... ok
test_clone (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 clone ... ok
test_copy_all (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 copy all ... ok
test_detect (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 detect ... ok
test_edges (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 edges ... ok
test_settings (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 settings ... ok
test_banks (tests.TestCase_RetevisRB26)
Testing Retevis RB26 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRB26)
Testing Retevis RB26 brute force ... ok
test_clone (tests.TestCase_RetevisRB26)
Testing Retevis RB26 clone ... ok
test_copy_all (tests.TestCase_RetevisRB26)
Testing Retevis RB26 copy all ... ok
test_detect (tests.TestCase_RetevisRB26)
Testing Retevis RB26 detect ... ok
test_edges (tests.TestCase_RetevisRB26)
Testing Retevis RB26 edges ... skipped 'No mutable memory locations found'
test_settings (tests.TestCase_RetevisRB26)
Testing Retevis RB26 settings ... ok
test_banks (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 brute force ... ok
test_clone (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 clone ... ok
test_copy_all (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 copy all ... ok
test_detect (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 detect ... ok
test_edges (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 edges ... ok
test_settings (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 settings ... ok
test_banks (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) brute force ... ok
test_clone (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) clone ... ok
test_copy_all (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) copy all ... ok
test_detect (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) detect ... ok
test_edges (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) edges ... ok
test_settings (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) settings ... ok
test_banks (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B brute force ... ok
test_clone (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B clone ... ok
test_copy_all (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B copy all ... ok
test_detect (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B detect ... ok
test_edges (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B edges ... ok
test_settings (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B settings ... ok
test_banks (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R banks ... ok
test_brute_force (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R brute force ... ok
test_clone (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R clone ... ok
test_copy_all (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R copy all ... ok
test_detect (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R detect ... ok
test_edges (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R edges ... ok
test_settings (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R settings ... ok
test_banks (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R banks ... ok
test_brute_force (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R brute force ... ok
test_clone (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R clone ... ok
test_copy_all (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R copy all ... ok
test_detect (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R detect ... ok
test_edges (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R edges ... ok
test_settings (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R settings ... ok
test_banks (tests.TestCase_RetevisRT1)
Testing Retevis RT1 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT1)
Testing Retevis RT1 brute force ... ok
test_clone (tests.TestCase_RetevisRT1)
Testing Retevis RT1 clone ... ok
test_copy_all (tests.TestCase_RetevisRT1)
Testing Retevis RT1 copy all ... ok
test_detect (tests.TestCase_RetevisRT1)
Testing Retevis RT1 detect ... ok
test_edges (tests.TestCase_RetevisRT1)
Testing Retevis RT1 edges ... ok
test_settings (tests.TestCase_RetevisRT1)
Testing Retevis RT1 settings ... ok
test_banks (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 brute force ... ok
test_clone (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 clone ... ok
test_copy_all (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 copy all ... ok
test_detect (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 detect ... ok
test_edges (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 edges ... ok
test_settings (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 settings ... ok
test_banks (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode brute force ... ok
test_clone (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode clone ... ok
test_copy_all (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode copy all ... ok
test_detect (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode detect ... ok
test_edges (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode edges ... ok
test_settings (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode settings ... ok
test_banks (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 brute force ... ok
test_clone (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 clone ... ok
test_copy_all (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 copy all ... ok
test_detect (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 detect ... ok
test_edges (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 edges ... ok
test_settings (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 settings ... ok
test_banks (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 banks ... ok
test_brute_force (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 brute force ... ok
test_clone (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 clone ... ok
test_copy_all (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 copy all ... ok
test_detect (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 detect ... ok
test_edges (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 edges ... ok
test_settings (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B brute force ... ok
test_clone (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B clone ... ok
test_copy_all (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B copy all ... ok
test_detect (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B detect ... ok
test_edges (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B edges ... ok
test_settings (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B settings ... ok
test_banks (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M brute force ... ok
test_clone (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M clone ... ok
test_copy_all (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M copy all ... ok
test_detect (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M detect ... ok
test_edges (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M edges ... ok
test_settings (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_RetevisRT21)
Testing Retevis RT21 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT21)
Testing Retevis RT21 brute force ... ok
test_clone (tests.TestCase_RetevisRT21)
Testing Retevis RT21 clone ... ok
test_copy_all (tests.TestCase_RetevisRT21)
Testing Retevis RT21 copy all ... ok
test_detect (tests.TestCase_RetevisRT21)
Testing Retevis RT21 detect ... ok
test_edges (tests.TestCase_RetevisRT21)
Testing Retevis RT21 edges ... ok
test_settings (tests.TestCase_RetevisRT21)
Testing Retevis RT21 settings ... ok
test_banks (tests.TestCase_IcomID51)
Testing Icom ID-51 banks ... ok
test_brute_force (tests.TestCase_IcomID51)
Testing Icom ID-51 brute force ... ok
test_clone (tests.TestCase_IcomID51)
Testing Icom ID-51 clone ... ok
test_copy_all (tests.TestCase_IcomID51)
Testing Icom ID-51 copy all ... ok
test_detect (tests.TestCase_IcomID51)
Testing Icom ID-51 detect ... ok
test_edges (tests.TestCase_IcomID51)
Testing Icom ID-51 edges ... ok
test_settings (tests.TestCase_IcomID51)
Testing Icom ID-51 settings ... ok
test_banks (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 brute force ... ok
test_clone (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 clone ... ok
test_copy_all (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 copy all ... ok
test_detect (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 detect ... ok
test_edges (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 edges ... ok
test_settings (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 settings ... ok
test_banks (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode brute force ... ok
test_clone (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode clone ... ok
test_copy_all (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode copy all ... ok
test_detect (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode detect ... ok
test_edges (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode edges ... ok
test_settings (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode settings ... ok
test_banks (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 brute force ... ok
test_clone (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 clone ... ok
test_copy_all (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 copy all ... ok
test_detect (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 detect ... ok
test_edges (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 edges ... ok
test_settings (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_IcomIC208H)
Testing Icom IC-208H banks ... ok
test_brute_force (tests.TestCase_IcomIC208H)
Testing Icom IC-208H brute force ... ok
test_clone (tests.TestCase_IcomIC208H)
Testing Icom IC-208H clone ... ok
test_copy_all (tests.TestCase_IcomIC208H)
Testing Icom IC-208H copy all ... ok
test_detect (tests.TestCase_IcomIC208H)
Testing Icom IC-208H detect ... ok
test_edges (tests.TestCase_IcomIC208H)
Testing Icom IC-208H edges ... ok
test_settings (tests.TestCase_IcomIC208H)
Testing Icom IC-208H settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 brute force ... ok
test_clone (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 clone ... ok
test_copy_all (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 copy all ... ok
test_detect (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 detect ... ok
test_edges (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 edges ... ok
test_settings (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 settings ... ok
test_banks (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R banks ... ok
test_brute_force (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R brute force ... ok
test_clone (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R clone ... ok
test_copy_all (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R copy all ... ok
test_detect (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R detect ... ok
test_edges (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R edges ... ok
test_settings (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R settings ... ok
test_banks (tests.TestCase_RetevisRT22)
Testing Retevis RT22 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT22)
Testing Retevis RT22 brute force ... ok
test_clone (tests.TestCase_RetevisRT22)
Testing Retevis RT22 clone ... ok
test_copy_all (tests.TestCase_RetevisRT22)
Testing Retevis RT22 copy all ... ok
test_detect (tests.TestCase_RetevisRT22)
Testing Retevis RT22 detect ... ok
test_edges (tests.TestCase_RetevisRT22)
Testing Retevis RT22 edges ... ok
test_settings (tests.TestCase_RetevisRT22)
Testing Retevis RT22 settings ... ok
test_banks (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 brute force ... ok
test_clone (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 clone ... ok
test_copy_all (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 copy all ... ok
test_detect (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 detect ... ok
test_edges (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 edges ... ok
test_settings (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode brute force ... ok
test_clone (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode clone ... ok
test_copy_all (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode copy all ... ok
test_detect (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode detect ... ok
test_edges (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode edges ... ok
test_settings (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode settings ... ok
test_banks (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H brute force ... ok
test_clone (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H clone ... ok
test_copy_all (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H copy all ... ok
test_detect (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H detect ... ok
test_edges (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H edges ... ok
test_settings (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS brute force ... ok
test_clone (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS clone ... ok
test_copy_all (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS copy all ... ok
test_detect (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS detect ... ok
test_edges (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS edges ... ok
test_settings (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS settings ... ok
test_banks (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D brute force ... ok
test_clone (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D clone ... ok
test_copy_all (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D copy all ... ok
test_detect (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D detect ... ok
test_edges (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D edges ... ok
test_settings (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D settings ... ok
test_banks (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus banks ... ok
test_brute_force (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus brute force ... ok
test_clone (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus clone ... ok
test_copy_all (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus copy all ... ok
test_detect (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus detect ... ok
test_edges (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus edges ... ok
test_settings (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus settings ... ok
test_banks (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 brute force ... ok
test_clone (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 clone ... ok
test_copy_all (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 copy all ... ok
test_detect (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 detect ... ok
test_edges (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 edges ... ok
test_settings (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 settings ... ok
test_banks (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 brute force ... ok
test_clone (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 clone ... ok
test_copy_all (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 copy all ... ok
test_detect (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 detect ... ok
test_edges (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 edges ... ok
test_settings (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 settings ... ok
test_banks (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV brute force ... ok
test_clone (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV clone ... ok
test_copy_all (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV copy all ... ok
test_detect (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV detect ... ok
test_edges (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV edges ... ok
test_settings (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV settings ... ok
test_banks (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H banks ... ok
test_brute_force (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H brute force ... ok
test_clone (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H clone ... ok
test_copy_all (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H copy all ... ok
test_detect (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H detect ... ok
test_edges (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H edges ... ok
test_settings (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H settings ... ok
test_banks (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D banks ... ok
test_brute_force (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D brute force ... ok
test_clone (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D clone ... ok
test_copy_all (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D copy all ... ok
test_detect (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D detect ... ok
test_edges (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D edges ... ok
test_settings (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D settings ... ok
test_banks (tests.TestCase_RetevisRT23)
Testing Retevis RT23 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT23)
Testing Retevis RT23 brute force ... ok
test_clone (tests.TestCase_RetevisRT23)
Testing Retevis RT23 clone ... ok
test_copy_all (tests.TestCase_RetevisRT23)
Testing Retevis RT23 copy all ... ok
test_detect (tests.TestCase_RetevisRT23)
Testing Retevis RT23 detect ... ok
test_edges (tests.TestCase_RetevisRT23)
Testing Retevis RT23 edges ... ok
test_settings (tests.TestCase_RetevisRT23)
Testing Retevis RT23 settings ... ok
test_banks (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR banks ... ok
test_brute_force (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR brute force ... ok
test_clone (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR clone ... ok
test_copy_all (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR copy all ... ok
test_detect (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR detect ... ok
test_edges (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR edges ... ok
test_settings (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR settings ... ok
test_banks (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG brute force ... ok
test_clone (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG clone ... ok
test_copy_all (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG copy all ... ok
test_detect (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG detect ... ok
test_edges (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG edges ... ok
test_settings (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 brute force ... ok
test_clone (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 clone ... ok
test_copy_all (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 copy all ... ok
test_detect (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 detect ... ok
test_edges (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 edges ... ok
test_settings (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 settings ... ok
test_banks (tests.TestCase_IcomID800H)
Testing Icom ID-800H banks ... ok
test_brute_force (tests.TestCase_IcomID800H)
Testing Icom ID-800H brute force ... ok
test_clone (tests.TestCase_IcomID800H)
Testing Icom ID-800H clone ... ok
test_copy_all (tests.TestCase_IcomID800H)
Testing Icom ID-800H copy all ... ok
test_detect (tests.TestCase_IcomID800H)
Testing Icom ID-800H detect ... ok
test_edges (tests.TestCase_IcomID800H)
Testing Icom ID-800H edges ... ok
test_settings (tests.TestCase_IcomID800H)
Testing Icom ID-800H settings ... ok
test_banks (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H banks ... ok
test_brute_force (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H brute force ... ok
test_clone (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H clone ... ok
test_copy_all (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H copy all ... ok
test_detect (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H detect ... ok
test_edges (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H edges ... ok
test_settings (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H settings ... ok
test_banks (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 brute force ... ok
test_clone (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 clone ... ok
test_copy_all (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 copy all ... ok
test_detect (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 detect ... ok
test_edges (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 edges ... ok
test_settings (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 settings ... ok
test_banks (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 brute force ... ok
test_clone (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 clone ... ok
test_copy_all (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 copy all ... ok
test_detect (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 detect ... ok
test_edges (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 edges ... ok
test_settings (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 settings ... ok
test_banks (tests.TestCase_RetevisRT26)
Testing Retevis RT26 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT26)
Testing Retevis RT26 brute force ... ok
test_clone (tests.TestCase_RetevisRT26)
Testing Retevis RT26 clone ... ok
test_copy_all (tests.TestCase_RetevisRT26)
Testing Retevis RT26 copy all ... ok
test_detect (tests.TestCase_RetevisRT26)
Testing Retevis RT26 detect ... ERROR
test_edges (tests.TestCase_RetevisRT26)
Testing Retevis RT26 edges ... ok
test_settings (tests.TestCase_RetevisRT26)
Testing Retevis RT26 settings ... ok
test_banks (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE banks ... ok
test_brute_force (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE brute force ... ok
test_clone (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE clone ... ok
test_copy_all (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE copy all ... ok
test_detect (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE detect ... ok
test_edges (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE edges ... ok
test_settings (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE settings ... ok
test_banks (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 brute force ... ok
test_clone (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 clone ... ok
test_copy_all (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 copy all ... ok
test_detect (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 detect ... ok
test_edges (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 edges ... ok
test_settings (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 settings ... ok
test_banks (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 brute force ... ok
test_clone (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 clone ... ok
test_copy_all (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 copy all ... ok
test_detect (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 detect ... ok
test_edges (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 edges ... ok
test_settings (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H banks ... ok
test_brute_force (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H brute force ... ok
test_clone (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H clone ... ok
test_copy_all (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H copy all ... ok
test_detect (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H detect ... ok
test_edges (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H edges ... ok
test_settings (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 brute force ... ok
test_clone (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 clone ... ok
test_copy_all (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 copy all ... ok
test_detect (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 detect ... ok
test_edges (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 edges ... ok
test_settings (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 settings ... ok
test_banks (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D banks ... ok
test_brute_force (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D brute force ... ok
test_clone (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D clone ... ok
test_copy_all (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D copy all ... ok
test_detect (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D detect ... ok
test_edges (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D edges ... ok
test_settings (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D settings ... ok
test_banks (tests.TestCase_IcomID880H)
Testing Icom ID-880H banks ... ok
test_brute_force (tests.TestCase_IcomID880H)
Testing Icom ID-880H brute force ... ok
test_clone (tests.TestCase_IcomID880H)
Testing Icom ID-880H clone ... ok
test_copy_all (tests.TestCase_IcomID880H)
Testing Icom ID-880H copy all ... ok
test_detect (tests.TestCase_IcomID880H)
Testing Icom ID-880H detect ... ok
test_edges (tests.TestCase_IcomID880H)
Testing Icom ID-880H edges ... ok
test_settings (tests.TestCase_IcomID880H)
Testing Icom ID-880H settings ... ok
test_banks (tests.TestCase_RetevisRT622)
Testing Retevis RT622 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT622)
Testing Retevis RT622 brute force ... ok
test_clone (tests.TestCase_RetevisRT622)
Testing Retevis RT622 clone ... ok
test_copy_all (tests.TestCase_RetevisRT622)
Testing Retevis RT622 copy all ... ok
test_detect (tests.TestCase_RetevisRT622)
Testing Retevis RT622 detect ... ok
test_edges (tests.TestCase_RetevisRT622)
Testing Retevis RT622 edges ... ok
test_settings (tests.TestCase_RetevisRT622)
Testing Retevis RT622 settings ... ok
test_banks (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S brute force ... ok
test_clone (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S clone ... ok
test_copy_all (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S copy all ... ok
test_detect (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S detect ... ok
test_edges (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S edges ... ok
test_settings (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S settings ... ok
test_banks (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 brute force ... ok
test_clone (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 clone ... ok
test_copy_all (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 copy all ... ok
test_detect (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 detect ... ok
test_edges (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 edges ... ok
test_settings (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S brute force ... ok
test_clone (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S clone ... ok
test_copy_all (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S copy all ... ok
test_detect (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S detect ... ok
test_edges (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S edges ... ok
test_settings (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S settings ... ok
test_banks (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR banks ... ok
test_brute_force (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR brute force ... ok
test_clone (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR clone ... ok
test_copy_all (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR copy all ... ok
test_detect (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR detect ... ok
test_edges (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR edges ... ok
test_settings (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR settings ... ok
test_banks (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 brute force ... ok
test_clone (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 clone ... ok
test_copy_all (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 copy all ... ok
test_detect (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 detect ... ok
test_edges (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 edges ... ok
test_settings (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 settings ... ok
test_banks (tests.TestCase_RetevisRT76)
Testing Retevis RT76 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT76)
Testing Retevis RT76 brute force ... ok
test_clone (tests.TestCase_RetevisRT76)
Testing Retevis RT76 clone ... ok
test_copy_all (tests.TestCase_RetevisRT76)
Testing Retevis RT76 copy all ... ok
test_detect (tests.TestCase_RetevisRT76)
Testing Retevis RT76 detect ... ok
test_edges (tests.TestCase_RetevisRT76)
Testing Retevis RT76 edges ... skipped 'No mutable memory locations found'
test_settings (tests.TestCase_RetevisRT76)
Testing Retevis RT76 settings ... ok
test_banks (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A banks ... ok
test_brute_force (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A brute force ... ok
test_clone (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A clone ... ok
test_copy_all (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A copy all ... ok
test_detect (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A detect ... ok
test_edges (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A edges ... ok
test_settings (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A settings ... ok
test_banks (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M brute force ... ok
test_clone (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M clone ... ok
test_copy_all (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M copy all ... ok
test_detect (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M detect ... ok
test_edges (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M edges ... ok
test_settings (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 brute force ... ok
test_clone (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 clone ... ok
test_copy_all (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 copy all ... ok
test_detect (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 detect ... ok
test_edges (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 edges ... ok
test_settings (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 settings ... ok
test_banks (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D brute force ... ok
test_clone (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D clone ... ok
test_copy_all (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D copy all ... ok
test_detect (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D detect ... ok
test_edges (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D edges ... ok
test_settings (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D brute force ... ok
test_clone (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D clone ... ok
test_copy_all (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D copy all ... ok
test_detect (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D detect ... ok
test_edges (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D edges ... ok
test_settings (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D settings ... ok
test_banks (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M brute force ... ok
test_clone (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M clone ... ok
test_copy_all (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M copy all ... ok
test_detect (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M detect ... ok
test_edges (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M edges ... ok
test_settings (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M settings ... ok
test_banks (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 brute force ... ok
test_clone (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 clone ... ok
test_copy_all (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 copy all ... ok
test_detect (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 detect ... ok
test_edges (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 edges ... ok
test_settings (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 settings ... ok
test_banks (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 banks ... ok
test_brute_force (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 brute force ... ok
test_clone (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 clone ... ok
test_copy_all (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 copy all ... ok
test_detect (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 detect ... ok
test_edges (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 edges ... ok
test_settings (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 settings ... ok
test_banks (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 brute force ... ok
test_clone (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 clone ... ok
test_copy_all (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 copy all ... ok
test_detect (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 detect ... ok
test_edges (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 edges ... ok
test_settings (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH brute force ... ok
test_clone (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH clone ... ok
test_copy_all (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH copy all ... ok
test_detect (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH detect ... ok
test_edges (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH edges ... ok
test_settings (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH settings ... ok
test_banks (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M brute force ... ok
test_clone (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M clone ... ok
test_copy_all (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M copy all ... ok
test_detect (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M detect ... ok
test_edges (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M edges ... ok
test_settings (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M settings ... ok
test_banks (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E banks ... ok
test_brute_force (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E brute force ... ok
test_clone (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E clone ... ok
test_copy_all (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E copy all ... ok
test_detect (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E detect ... ok
test_edges (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E edges ... ok
test_settings (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E settings ... ok
test_banks (tests.TestCase_KYDIP620)
Testing KYD IP-620 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KYDIP620)
Testing KYD IP-620 brute force ... ok
test_clone (tests.TestCase_KYDIP620)
Testing KYD IP-620 clone ... ok
test_copy_all (tests.TestCase_KYDIP620)
Testing KYD IP-620 copy all ... ok
test_detect (tests.TestCase_KYDIP620)
Testing KYD IP-620 detect ... ok
test_edges (tests.TestCase_KYDIP620)
Testing KYD IP-620 edges ... ok
test_settings (tests.TestCase_KYDIP620)
Testing KYD IP-620 settings ... ok
test_banks (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D brute force ... ok
test_clone (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D clone ... ok
test_copy_all (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D copy all ... ok
test_detect (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D detect ... ok
test_edges (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D edges ... ok
test_settings (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R brute force ... ok
test_clone (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R clone ... ok
test_copy_all (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R copy all ... ok
test_detect (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R detect ... ok
test_edges (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R edges ... ok
test_settings (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R settings ... skipped 'Settings not supported'
======================================================================
ERROR: test_detect (tests.TestCase_RetevisRT26)
Testing Retevis RT26 detect
----------------------------------------------------------------------
Traceback (most recent call last):
File "tests/__init__.py", line 68, in test_detect
self._runtest(run_tests.TestCaseDetect)
File "tests/__init__.py", line 42, in _runtest
failures = testcase.run()
File "tests/run_tests.py", line 879, in run
(self._wrapper._dstclass, radio.__class__))
TestFailedError: <class 'chirp.drivers.retevis_rt26.RT26Radio'> detected as <class 'chirp.drivers.retevis_rt21.RT21Radio'>
----------------------------------------------------------------------
Ran 1064 tests in 477.664s
FAILED (errors=1, skipped=148)
struct memory {
bbcd rx_freq[4];
bbcd tx_freq[4];
lbcd rx_tone[2];
lbcd tx_tone[2];
u8 unknown10:5,
highpower:1,
unknown11:2;
u8 unknown20:4,
narrow:1,
unknown21:3;
u8 unknown31:1,
scanadd:1,
unknown32:6;
u8 unknown4;
};
struct name {
char name[7];
};
#seekto 0x0010;
struct memory channels[128];
#seekto 0x08C0;
struct name names[128];
#seekto 0x2020;
struct memory vfo1;
struct memory vfo2;
ERROR: InvocationError for command /chirp/.tox/driver/bin/python -munittest -vb tests (exited with code 1)
style create: /chirp/.tox/style
style installdeps: pep8==1.6.2, future
style inst: /chirp/.tox/.tmp/package/1/chirp-0.3.0dev.zip
style installed: DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.,chirp==0.3.0.dev0,configparser==3.7.4,contextlib2==0.5.5,filelock==3.0.12,future==0.15.2,importlib-metadata==0.18,Mako==1.0.3,MarkupSafe==0.23,mercurial==3.7.3,packaging==19.0,pathlib2==2.3.4,pep8==1.6.2,pluggy==0.12.0,py==1.8.0,pygobject==3.20.0,pyparsing==2.4.0,pyserial==3.0.1,scandir==1.10.0,six==1.12.0,toml==0.10.0,tox==3.13.2,virtualenv==16.6.1,zipp==0.5.2
style run-test-pre: PYTHONHASHSEED='3850205741'
style run-test: commands[0] | python ./tools/cpep8.py
___________________________________ summary ____________________________________
unit: commands succeeded
ERROR: driver: commands failed
style: commands succeeded
Build step 'Execute shell' marked build as failure
Email was triggered for: Failure
Sending email for trigger: Failure
3
3
Note: image files were attached to their respective patches.
Jim KC9HI
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Sat, Apr 3, 2021 at 8:59 PM
Subject: [PATCH 4 of 4] [RT76] Retevis RT76
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1617488266 14400
# Sat Apr 03 18:17:46 2021 -0400
# Node ID 35ce102f7e2d432b0ba6a30b580904ad816c846e
# Parent c11f6ae9ccfd9b306db3b5f1e7fe166364a822b0
[RT76] Retevis RT76
This patch adds support for the Retevis RT76.
Related to #8959
diff -r c11f6ae9ccfd -r 35ce102f7e2d chirp/drivers/retevis_rt21.py
--- a/chirp/drivers/retevis_rt21.py Sat Apr 03 18:13:37 2021 -0400
+++ b/chirp/drivers/retevis_rt21.py Sat Apr 03 18:17:46 2021 -0400
@@ -197,6 +197,48 @@
} settings3;
"""
+MEM_FORMAT_RT76 = """
+#seekto 0x0000;
+struct {
+ lbcd rxfreq[4]; // RX Frequency 0-3
+ lbcd txfreq[4]; // TX Frequency 4-7
+ ul16 rx_tone; // PL/DPL Decode 8-9
+ ul16 tx_tone; // PL/DPL Encode A-B
+ u8 compander:1, // Compander C
+ unknown1:1, //
+ highpower:1, // Power Level
+ wide:1, // Bandwidth
+ unknown2:4; //
+ u8 reserved[3]; // Reserved D-F
+} memory[30];
+
+#seekto 0x002D;
+struct {
+ u8 unknown_1:1, // 002D
+ chnumberd:1, // Channel Number Disable
+ gain:1, // MIC Gain ---
+ savem:1, // Battery Save Mode ---
+ save:1, // Battery Save ---
+ beep:1, // Beep ---
+ voice:2; // Voice Prompts ---
+ u8 squelch; // Squelch 002E ---
+ u8 tot; // Time-out Timer 002F ---
+ u8 channel_4[13]; // 0030-003C
+ u8 unused:7, // 003D
+ vox:1; // Vox ---
+ u8 voxl; // Vox Level 003E ---
+ u8 voxd; // Vox Delay 003F ---
+ u8 channel_5[13]; // 0040-004C
+ u8 unknown_4; // 004D
+ u8 unknown_5[2]; // 004E-004F
+ u8 channel_6[13]; // 0050-005C
+ u8 chnumber; // Channel Number 005D ---
+ u8 unknown_7[2]; // 005E-005F
+ u8 channel_7[13]; // 0060-006C
+ u8 warn; // 006D ---
+} settings;
+"""
+
CMD_ACK = "\x06"
ALARM_LIST = ["Local Alarm", "Remote Alarm"]
@@ -211,6 +253,7 @@
TOTALERT_LIST = ["Off"] + ["%s seconds" % x for x in range(1, 11)]
VOICE_LIST = ["Off", "Chinese", "English"]
VOICE_LIST2 = ["Off", "English"]
+VOICE_LIST3 = VOICE_LIST2 + ["Chinese"]
VOX_LIST = ["OFF"] + ["%s" % x for x in range(1, 17)]
VOXD_LIST = ["0.5", "1.0", "1.5", "2.0", "2.5", "3.0"]
VOXL_LIST = ["OFF"] + ["%s" % x for x in range(1, 9)]
@@ -232,6 +275,7 @@
"totalert": TOTALERT_LIST,
"voice": VOICE_LIST,
"voice": VOICE_LIST2,
+ "voice": VOICE_LIST3,
"vox": VOX_LIST,
"voxd": VOXD_LIST,
"voxl": VOXL_LIST,
@@ -253,7 +297,7 @@
exito = False
for i in range(0, 5):
serial.write(radio._magic)
- if radio.MODEL == "RB26":
+ if radio.MODEL == "RB26" or radio.MODEL == "RT76":
serial.read(1)
ack = serial.read(1)
@@ -387,7 +431,7 @@
status.cur = addr + radio.BLOCK_SIZE
radio.status_fn(status)
- if radio.MODEL == "RB26":
+ if radio.MODEL == "RB26" or radio.MODEL == "RT76":
block = _rb26_read_block(radio, addr, radio.BLOCK_SIZE)
else:
block = _read_block(radio, addr, radio.BLOCK_SIZE)
@@ -633,7 +677,7 @@
LOG.debug("Initializing empty memory")
if self.MODEL == "RB17A":
_mem.set_raw("\x00" * 13 + "\x04\xFF\xFF")
- if self.MODEL == "RB26":
+ if self.MODEL == "RB26" or self.MODEL == "RT76":
_mem.set_raw("\x00" * 13 + _rsvd)
else:
_mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
@@ -651,8 +695,9 @@
mem.power = self.POWER_LEVELS[_mem.highpower]
- mem.skip = "" if (_skp & bitpos) else "S"
- LOG.debug("mem.skip %s" % mem.skip)
+ if self.MODEL != "RT76":
+ mem.skip = "" if (_skp & bitpos) else "S"
+ LOG.debug("mem.skip %s" % mem.skip)
mem.extra = RadioSettingGroup("Extra", "extra")
@@ -671,10 +716,11 @@
rset = RadioSetting("cdcss", "Cdcss Mode", rs)
mem.extra.append(rset)
- if self.MODEL == "RB26":
- rs = RadioSettingValueBoolean(_mem.bcl)
- rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
- mem.extra.append(rset)
+ if self.MODEL == "RB26" or self.MODEL == "RT76":
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueBoolean(_mem.bcl)
+ rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
+ mem.extra.append(rset)
rs = RadioSettingValueBoolean(_mem.compander)
rset = RadioSetting("compander", "Compander", rs)
@@ -749,7 +795,7 @@
if mem.empty:
if self.MODEL == "RB17A":
_mem.set_raw("\xFF" * 12 + "\x00\x00\xFF\xFF")
- elif self.MODEL == "RB26":
+ elif self.MODEL == "RB26" or self.MODEL == "RT76":
_mem.set_raw("\xFF" * 13 + _rsvd)
else:
_mem.set_raw("\xFF" * (_mem.size() / 8))
@@ -773,7 +819,7 @@
if self.MODEL == "RB17A":
_mem.set_raw("\x00" * 13 + "\x00\xFF\xFF")
- elif self.MODEL == "RB26":
+ elif self.MODEL == "RB26" or self.MODEL == "RT76":
_mem.set_raw("\x00" * 13 + _rsvd)
else:
_mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
@@ -798,11 +844,12 @@
_mem.highpower = mem.power == self.POWER_LEVELS[1]
- if mem.skip != "S":
- _skp |= bitpos
- else:
- _skp &= ~bitpos
- LOG.debug("_skp %s" % _skp)
+ if self.MODEL != "RT76":
+ if mem.skip != "S":
+ _skp |= bitpos
+ else:
+ _skp &= ~bitpos
+ LOG.debug("_skp %s" % _skp)
for setting in mem.extra:
if setting.get_name() == "scramble_type":
@@ -894,9 +941,10 @@
rset.set_apply_callback(apply_topkey_listvalue, _keys.topkey)
basic.append(rset)
- if self.MODEL == "RB26":
- _settings2 = self._memobj.settings2
- _settings3 = self._memobj.settings3
+ if self.MODEL == "RB26" or self.MODEL == "RT76":
+ if self.MODEL == "RB26":
+ _settings2 = self._memobj.settings2
+ _settings3 = self._memobj.settings3
rs = RadioSettingValueInteger(0, 9, _settings.squelch)
rset = RadioSetting("squelch", "Squelch Level", rs)
@@ -907,14 +955,21 @@
rset = RadioSetting("tot", "Time-out timer", rs)
basic.append(rset)
- rs = RadioSettingValueList(VOICE_LIST2,
- VOICE_LIST2[_settings.voice])
- rset = RadioSetting("voice", "Voice Annumciation", rs)
- basic.append(rset)
+ if self.MODEL == "RT76":
+ rs = RadioSettingValueList(VOICE_LIST3,
+ VOICE_LIST3[_settings.voice])
+ rset = RadioSetting("voice", "Voice Annumciation", rs)
+ basic.append(rset)
- rs = RadioSettingValueBoolean(not _settings.chnumberd)
- rset = RadioSetting("chnumberd", "Channel Number Enable", rs)
- basic.append(rset)
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueList(VOICE_LIST2,
+ VOICE_LIST2[_settings.voice])
+ rset = RadioSetting("voice", "Voice Annumciation", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(not _settings.chnumberd)
+ rset = RadioSetting("chnumberd", "Channel Number Enable", rs)
+ basic.append(rset)
rs = RadioSettingValueBoolean(_settings.save)
rset = RadioSetting("save", "Battery Save", rs)
@@ -924,9 +979,10 @@
rset = RadioSetting("beep", "Beep", rs)
basic.append(rset)
- rs = RadioSettingValueBoolean(not _settings.tail)
- rset = RadioSetting("tail", "QT/DQT Tail", rs)
- basic.append(rset)
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueBoolean(not _settings.tail)
+ rset = RadioSetting("tail", "QT/DQT Tail", rs)
+ basic.append(rset)
rs = RadioSettingValueList(SAVE_LIST, SAVE_LIST[_settings.savem])
rset = RadioSetting("savem", "Battery Save Mode", rs)
@@ -940,29 +996,53 @@
rset = RadioSetting("warn", "Warn Mode", rs)
basic.append(rset)
- rs = RadioSettingValueBoolean(_settings3.vox)
- rset = RadioSetting("settings3.vox", "Vox Function", rs)
- basic.append(rset)
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueBoolean(_settings3.vox)
+ rset = RadioSetting("settings3.vox", "Vox Function", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(VOXL_LIST,
+ VOXL_LIST[_settings3.voxl])
+ rset = RadioSetting("settings3.voxl", "Vox Level", rs)
+ basic.append(rset)
- rs = RadioSettingValueList(VOXL_LIST, VOXL_LIST[_settings3.voxl])
- rset = RadioSetting("settings3.voxl", "Vox Level", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(VOXD_LIST,
+ VOXD_LIST[_settings3.voxd])
+ rset = RadioSetting("settings3.voxd", "Vox Delay", rs)
+ basic.append(rset)
- rs = RadioSettingValueList(VOXD_LIST, VOXD_LIST[_settings3.voxd])
- rset = RadioSetting("settings3.voxd", "Vox Delay", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(PFKEY_LIST,
+ PFKEY_LIST[_settings.pf1])
+ rset = RadioSetting("pf1", "PF1 Key Set", rs)
+ basic.append(rset)
- rs = RadioSettingValueList(PFKEY_LIST, PFKEY_LIST[_settings.pf1])
- rset = RadioSetting("pf1", "PF1 Key Set", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(PFKEY_LIST,
+ PFKEY_LIST[_settings.pf2])
+ rset = RadioSetting("pf2", "PF2 Key Set", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueInteger(1, 30, _settings2.chnumber + 1)
+ rset = RadioSetting("settings2.chnumber", "Channel Number", rs)
+ basic.append(rset)
+
+ if self.MODEL == "RT76":
+ rs = RadioSettingValueBoolean(_settings.vox)
+ rset = RadioSetting("vox", "Vox Function", rs)
+ basic.append(rset)
- rs = RadioSettingValueList(PFKEY_LIST, PFKEY_LIST[_settings.pf2])
- rset = RadioSetting("pf2", "PF2 Key Set", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(VOXL_LIST,
+ VOXL_LIST[_settings.voxl])
+ rset = RadioSetting("voxl", "Vox Level", rs)
+ basic.append(rset)
- rs = RadioSettingValueInteger(1, 30, _settings2.chnumber + 1)
- rset = RadioSetting("settings2.chnumber", "Channel Number", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(VOXD_LIST,
+ VOXD_LIST[_settings.voxd])
+ rset = RadioSetting("voxd", "Vox Delay", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueInteger(1, 30, _settings.chnumber + 1)
+ rset = RadioSetting("chnumber", "Channel Number", rs)
+ basic.append(rset)
return top
@@ -1059,6 +1139,34 @@
def process_mmap(self):
self._memobj = bitwise.parse(MEM_FORMAT_RB26, self._mmap)
+
+(a)directory.register
+class RT76Radio(RT21Radio):
+ """RETEVIS RT76"""
+ VENDOR = "Retevis"
+ MODEL = "RT76"
+ BAUD_RATE = 9600
+ BLOCK_SIZE = 0x20
+ BLOCK_SIZE_UP = 0x10
+
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=0.50),
+ chirp_common.PowerLevel("High", watts=5.00)]
+
+ _magic = "PHOGR\x14\xD4"
+ _fingerprint = "P32073" + "\x02\xFF"
+ _upper = 30
+ _skipflags = False
+ _reserved = True
+ _gmrs = True
+
+ _ranges = [
+ (0x0000, 0x01E0),
+ ]
+ _memsize = 0x01E0
+
+ def process_mmap(self):
+ self._memobj = bitwise.parse(MEM_FORMAT_RT76, self._mmap)
+
@classmethod
def match_model(cls, filedata, filename):
if cls.MODEL == "RT21":
1
0
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Sat, Apr 3, 2021 at 8:59 PM
Subject: [PATCH 3 of 4] [RB26] Retevis RB26
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1617488017 14400
# Sat Apr 03 18:13:37 2021 -0400
# Node ID c11f6ae9ccfd9b306db3b5f1e7fe166364a822b0
# Parent 53ff4720769f9db27a2a0a56885aa505fef3da09
[RB26] Retevis RB26
This patch adds support for the Retevis RB26.
Related to #8661
diff -r 53ff4720769f -r c11f6ae9ccfd chirp/drivers/retevis_rt21.py
--- a/chirp/drivers/retevis_rt21.py Sat Apr 03 18:09:19 2021 -0400
+++ b/chirp/drivers/retevis_rt21.py Sat Apr 03 18:13:37 2021 -0400
@@ -135,16 +135,86 @@
u8 skipflags[4]; // Scan Add
"""
+MEM_FORMAT_RB26 = """
+#seekto 0x0000;
+struct {
+ lbcd rxfreq[4]; // RX Frequency 0-3
+ lbcd txfreq[4]; // TX Frequency 4-7
+ ul16 rx_tone; // PL/DPL Decode 8-9
+ ul16 tx_tone; // PL/DPL Encode A-B
+ u8 compander:1, // Compander C
+ unknown1:1, //
+ highpower:1, // Power Level
+ wide:1, // Bandwidth
+ bcl:1, // Busy Lock OFF=0 ON=1
+ unknown2:3; //
+ u8 reserved[3]; // Reserved D-F
+} memory[30];
+
+#seekto 0x002D;
+struct {
+ u8 unknown_1:1, // 002D
+ chnumberd:1, // Channel Number Disable
+ gain:1, // MIC Gain
+ savem:1, // Battery Save Mode
+ save:1, // Battery Save
+ beep:1, // Beep
+ voice:1, // Voice Prompts
+ unknown_2:1; //
+ u8 squelch; // Squelch 002E
+ u8 tot; // Time-out Timer 002F
+ u8 channel_4[13]; // 0030-003C
+ u8 unknown_3[3]; // 003D-003F
+ u8 channel_5[13]; // 0040-004C
+ u8 unknown_4; // 004D
+ u8 unknown_5[2]; // 004E-004F
+ u8 channel_6[13]; // 0050-005C
+ u8 unknown_6; // 005D
+ u8 unknown_7[2]; // 005E-005F
+ u8 channel_7[13]; // 0060-006C
+ u8 warn; // Warn Mode 006D
+ u8 pf1; // Key Set PF1 006E
+ u8 pf2; // Key Set PF2 006F
+ u8 channel_8[13]; // 0070-007C
+ u8 unknown_8; // 007D
+ u8 tail; // QT/DQT Tail(inverted) 007E
+} settings;
+
+#seekto 0x01F0;
+u8 skipflags[4]; // Scan Add
+
+#seekto 0x029F;
+struct {
+ u8 chnumber; // Channel Number 029F
+} settings2;
+
+#seekto 0x031D;
+struct {
+ u8 unused:7, // 031D
+ vox:1; // Vox
+ u8 voxl; // Vox Level 031E
+ u8 voxd; // Vox Delay 031F
+} settings3;
+"""
+
CMD_ACK = "\x06"
ALARM_LIST = ["Local Alarm", "Remote Alarm"]
BCL_LIST = ["Off", "Carrier", "QT/DQT"]
CDCSS_LIST = ["Normal Code", "Special Code 2", "Special Code 1"]
+GAIN_LIST = ["Standard", "Enhanced"]
+PFKEY_LIST = ["None", "Monitor", "Lamp", "Warn", "VOX", "VOX Delay",
+ "Key Lock", "Scan"]
+SAVE_LIST = ["Standard", "Super"]
SCRAMBLE_LIST = ["%s" % x for x in range(1, 9)]
TIMEOUTTIMER_LIST = ["%s seconds" % x for x in range(15, 615, 15)]
TOTALERT_LIST = ["Off"] + ["%s seconds" % x for x in range(1, 11)]
VOICE_LIST = ["Off", "Chinese", "English"]
+VOICE_LIST2 = ["Off", "English"]
VOX_LIST = ["OFF"] + ["%s" % x for x in range(1, 17)]
+VOXD_LIST = ["0.5", "1.0", "1.5", "2.0", "2.5", "3.0"]
+VOXL_LIST = ["OFF"] + ["%s" % x for x in range(1, 9)]
+WARN_LIST = ["OFF", "Native Warn", "Remote Warn"]
PF1_CHOICES = ["None", "Monitor", "Scan", "Scramble", "Alarm"]
PF1_VALUES = [0x0F, 0x04, 0x06, 0x08, 0x0C]
TOPKEY_CHOICES = ["None", "Alarming"]
@@ -154,11 +224,18 @@
"alarm": ALARM_LIST,
"bcl": BCL_LIST,
"cdcss": CDCSS_LIST,
+ "gain": GAIN_LIST,
+ "pfkey": PFKEY_LIST,
+ "save": SAVE_LIST,
"scramble": SCRAMBLE_LIST,
"tot": TIMEOUTTIMER_LIST,
"totalert": TOTALERT_LIST,
"voice": VOICE_LIST,
+ "voice": VOICE_LIST2,
"vox": VOX_LIST,
+ "voxd": VOXD_LIST,
+ "voxl": VOXL_LIST,
+ "warn": WARN_LIST,
}
GMRS_FREQS1 = [462.5625, 462.5875, 462.6125, 462.6375, 462.6625,
@@ -176,6 +253,8 @@
exito = False
for i in range(0, 5):
serial.write(radio._magic)
+ if radio.MODEL == "RB26":
+ serial.read(1)
ack = serial.read(1)
try:
@@ -246,6 +325,34 @@
return block_data
+def _rb26_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:]
+
+ if block_addr != 0:
+ serial.write(CMD_ACK)
+ ack = serial.read(1)
+ except:
+ raise errors.RadioError("Failed to read block at %04x" % block_addr)
+
+ if block_addr != 0:
+ if ack != CMD_ACK:
+ raise Exception("No ACK reading block %04x." % (block_addr))
+
+ return block_data
+
+
def _write_block(radio, block_addr, block_size):
serial = radio.pipe
@@ -280,7 +387,10 @@
status.cur = addr + radio.BLOCK_SIZE
radio.status_fn(status)
- block = _read_block(radio, addr, radio.BLOCK_SIZE)
+ if radio.MODEL == "RB26":
+ block = _rb26_read_block(radio, addr, radio.BLOCK_SIZE)
+ else:
+ block = _read_block(radio, addr, radio.BLOCK_SIZE)
data += block
LOG.debug("Address: %04x" % addr)
@@ -504,6 +614,9 @@
else:
_mem = self._memobj.memory[number - 1]
+ if self._reserved:
+ _rsvd = _mem.reserved.get_raw()
+
mem.freq = int(_mem.rxfreq) * 10
# We'll consider any blank (i.e. 0MHz frequency) to be empty
@@ -520,6 +633,8 @@
LOG.debug("Initializing empty memory")
if self.MODEL == "RB17A":
_mem.set_raw("\x00" * 13 + "\x04\xFF\xFF")
+ if self.MODEL == "RB26":
+ _mem.set_raw("\x00" * 13 + _rsvd)
else:
_mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
@@ -556,6 +671,15 @@
rset = RadioSetting("cdcss", "Cdcss Mode", rs)
mem.extra.append(rset)
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueBoolean(_mem.bcl)
+ rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
+ mem.extra.append(rset)
+
+ rs = RadioSettingValueBoolean(_mem.compander)
+ rset = RadioSetting("compander", "Compander", rs)
+ mem.extra.append(rset)
+
if self._gmrs:
GMRS_IMMUTABLE = ["freq", "duplex", "offset"]
if mem.number >= 8 and mem.number <= 14:
@@ -619,9 +743,14 @@
else:
_mem = self._memobj.memory[mem.number - 1]
+ if self._reserved:
+ _rsvd = _mem.reserved.get_raw()
+
if mem.empty:
if self.MODEL == "RB17A":
_mem.set_raw("\xFF" * 12 + "\x00\x00\xFF\xFF")
+ elif self.MODEL == "RB26":
+ _mem.set_raw("\xFF" * 13 + _rsvd)
else:
_mem.set_raw("\xFF" * (_mem.size() / 8))
@@ -644,6 +773,8 @@
if self.MODEL == "RB17A":
_mem.set_raw("\x00" * 13 + "\x00\xFF\xFF")
+ elif self.MODEL == "RB26":
+ _mem.set_raw("\x00" * 13 + _rsvd)
else:
_mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
@@ -763,6 +894,76 @@
rset.set_apply_callback(apply_topkey_listvalue, _keys.topkey)
basic.append(rset)
+ if self.MODEL == "RB26":
+ _settings2 = self._memobj.settings2
+ _settings3 = self._memobj.settings3
+
+ rs = RadioSettingValueInteger(0, 9, _settings.squelch)
+ rset = RadioSetting("squelch", "Squelch Level", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(TIMEOUTTIMER_LIST,
+ TIMEOUTTIMER_LIST[_settings.tot - 1])
+ rset = RadioSetting("tot", "Time-out timer", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(VOICE_LIST2,
+ VOICE_LIST2[_settings.voice])
+ rset = RadioSetting("voice", "Voice Annumciation", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(not _settings.chnumberd)
+ rset = RadioSetting("chnumberd", "Channel Number Enable", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(_settings.save)
+ rset = RadioSetting("save", "Battery Save", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(_settings.beep)
+ rset = RadioSetting("beep", "Beep", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(not _settings.tail)
+ rset = RadioSetting("tail", "QT/DQT Tail", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(SAVE_LIST, SAVE_LIST[_settings.savem])
+ rset = RadioSetting("savem", "Battery Save Mode", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(GAIN_LIST, GAIN_LIST[_settings.gain])
+ rset = RadioSetting("gain", "MIC Gain", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(WARN_LIST, WARN_LIST[_settings.warn])
+ rset = RadioSetting("warn", "Warn Mode", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(_settings3.vox)
+ rset = RadioSetting("settings3.vox", "Vox Function", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(VOXL_LIST, VOXL_LIST[_settings3.voxl])
+ rset = RadioSetting("settings3.voxl", "Vox Level", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(VOXD_LIST, VOXD_LIST[_settings3.voxd])
+ rset = RadioSetting("settings3.voxd", "Vox Delay", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(PFKEY_LIST, PFKEY_LIST[_settings.pf1])
+ rset = RadioSetting("pf1", "PF1 Key Set", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(PFKEY_LIST, PFKEY_LIST[_settings.pf2])
+ rset = RadioSetting("pf2", "PF2 Key Set", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueInteger(1, 30, _settings2.chnumber + 1)
+ rset = RadioSetting("settings2.chnumber", "Channel Number", rs)
+ basic.append(rset)
+
return top
def set_settings(self, settings):
@@ -787,6 +988,12 @@
element.run_apply_callback()
elif setting == "channel":
setattr(obj, setting, int(element.value) - 1)
+ elif setting == "chnumber":
+ setattr(obj, setting, int(element.value) - 1)
+ elif setting == "chnumberd":
+ setattr(obj, setting, not int(element.value))
+ elif setting == "tail":
+ setattr(obj, setting, not int(element.value))
elif setting == "tot":
setattr(obj, setting, int(element.value) + 1)
elif element.value.get_mutable():
@@ -824,6 +1031,34 @@
def process_mmap(self):
self._memobj = bitwise.parse(MEM_FORMAT_RB17A, self._mmap)
+
+(a)directory.register
+class RB26Radio(RT21Radio):
+ """RETEVIS RB26"""
+ VENDOR = "Retevis"
+ MODEL = "RB26"
+ BAUD_RATE = 9600
+ BLOCK_SIZE = 0x20
+ BLOCK_SIZE_UP = 0x10
+
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=0.50),
+ chirp_common.PowerLevel("High", watts=3.00)]
+
+ _magic = "PHOGR" + "\x01" + "0"
+ _fingerprint = "P32073" + "\x02\xFF"
+ _upper = 30
+ _skipflags = True
+ _reserved = True
+ _gmrs = True
+
+ _ranges = [
+ (0x0000, 0x0320),
+ ]
+ _memsize = 0x0320
+
+ def process_mmap(self):
+ self._memobj = bitwise.parse(MEM_FORMAT_RB26, self._mmap)
+
@classmethod
def match_model(cls, filedata, filename):
if cls.MODEL == "RT21":
1
0
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Sat, Apr 3, 2021 at 8:59 PM
Subject: [PATCH 2 of 4] [RB17A] Retevis RB17A
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1617487759 14400
# Sat Apr 03 18:09:19 2021 -0400
# Node ID 53ff4720769f9db27a2a0a56885aa505fef3da09
# Parent d292f6aff5e0687bff7cf839f5de3e3164fe9f41
[RB17A] Retevis RB17A
This patch adds support for the Retevis RB17A.
Related to #8957
diff -r d292f6aff5e0 -r 53ff4720769f chirp/drivers/retevis_rt21.py
--- a/chirp/drivers/retevis_rt21.py Sat Apr 03 18:05:05 2021 -0400
+++ b/chirp/drivers/retevis_rt21.py Sat Apr 03 18:09:19 2021 -0400
@@ -83,9 +83,63 @@
u8 skipflags[2]; // SCAN_ADD
"""
+MEM_FORMAT_RB17A = """
+struct memory {
+ lbcd rxfreq[4]; // 0-3
+ lbcd txfreq[4]; // 4-7
+ ul16 rx_tone; // 8-9
+ ul16 tx_tone; // A-B
+ u8 unknown1:1, // C
+ compander:1, // Compand
+ bcl:2, // Busy Channel Lock-out
+ cdcss:1, // Cdcss Mode
+ scramble_type:3; // Scramble Type
+ u8 unknown2:4, // D
+ middlepower:1, // Power Level-Middle
+ unknown3:1, //
+ highpower:1, // Power Level-High/Low
+ wide:1; // Bandwidth
+ u8 unknown4; // E
+ u8 unknown5; // F
+};
+
+#seekto 0x0010;
+ struct memory lomems[16];
+
+#seekto 0x0200;
+ struct memory himems[14];
+
+#seekto 0x011D;
+struct {
+ u8 pf1; // 011D PF1 Key
+ u8 topkey; // 011E Top Key
+} keys;
+
+#seekto 0x012C;
+struct {
+ u8 use_scramble; // 012C Scramble Enable
+ u8 channel; // 012D Channel Number
+ u8 alarm; // 012E Alarm Type
+ u8 voice; // 012F Voice Annunciation
+ u8 tot; // 0130 Time-out Timer
+ u8 totalert; // 0131 Time-out Timer Pre-alert
+ u8 unknown2[2];
+ u8 squelch; // 0134 Squelch Level
+ u8 save; // 0135 Battery Saver
+ u8 unknown3[3];
+ u8 use_vox; // 0139 VOX Enable
+ u8 vox; // 013A VOX Gain
+} settings;
+
+#seekto 0x017E;
+u8 skipflags[4]; // Scan Add
+"""
+
CMD_ACK = "\x06"
+ALARM_LIST = ["Local Alarm", "Remote Alarm"]
BCL_LIST = ["Off", "Carrier", "QT/DQT"]
+CDCSS_LIST = ["Normal Code", "Special Code 2", "Special Code 1"]
SCRAMBLE_LIST = ["%s" % x for x in range(1, 9)]
TIMEOUTTIMER_LIST = ["%s seconds" % x for x in range(15, 615, 15)]
TOTALERT_LIST = ["Off"] + ["%s seconds" % x for x in range(1, 11)]
@@ -93,9 +147,13 @@
VOX_LIST = ["OFF"] + ["%s" % x for x in range(1, 17)]
PF1_CHOICES = ["None", "Monitor", "Scan", "Scramble", "Alarm"]
PF1_VALUES = [0x0F, 0x04, 0x06, 0x08, 0x0C]
+TOPKEY_CHOICES = ["None", "Alarming"]
+TOPKEY_VALUES = [0xFF, 0x0C]
SETTING_LISTS = {
+ "alarm": ALARM_LIST,
"bcl": BCL_LIST,
+ "cdcss": CDCSS_LIST,
"scramble": SCRAMBLE_LIST,
"tot": TIMEOUTTIMER_LIST,
"totalert": TOTALERT_LIST,
@@ -103,6 +161,14 @@
"vox": VOX_LIST,
}
+GMRS_FREQS1 = [462.5625, 462.5875, 462.6125, 462.6375, 462.6625,
+ 462.6875, 462.7125]
+GMRS_FREQS2 = [467.5625, 467.5875, 467.6125, 467.6375, 467.6625,
+ 467.6875, 467.7125]
+GMRS_FREQS3 = [462.5500, 462.5750, 462.6000, 462.6250, 462.6500,
+ 462.6750, 462.7000, 462.7250]
+GMRS_FREQS = GMRS_FREQS1 + GMRS_FREQS2 + GMRS_FREQS3 * 2
+
def _enter_programming_mode(radio):
serial = radio.pipe
@@ -300,6 +366,52 @@
def process_mmap(self):
self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)
+ def validate_memory(self, mem):
+ msgs = ""
+ msgs = chirp_common.CloneModeRadio.validate_memory(self, mem)
+
+ _msg_freq = 'Memory location cannot change frequency'
+ _msg_simplex = 'Memory location only supports Duplex:(None)'
+ _msg_duplex = 'Memory location only supports Duplex: +'
+ _msg_offset = 'Memory location only supports Offset: 5.000000'
+ _msg_nfm = 'Memory location only supports Mode: NFM'
+ _msg_txp = 'Memory location only supports Power: Low'
+
+ # GMRS models
+ if self._gmrs:
+ # range of memories with values set by FCC rules
+ if mem.freq != int(GMRS_FREQS[mem.number - 1] * 1000000):
+ # warn user can't change frequency
+ msgs.append(chirp_common.ValidationError(_msg_freq))
+
+ # channels 1 - 22 are simplex only
+ if mem.number <= 22:
+ if str(mem.duplex) != "":
+ # warn user can't change duplex
+ msgs.append(chirp_common.ValidationError(_msg_simplex))
+
+ # channels 23 - 30 are +5 MHz duplex only
+ if mem.number >= 23:
+ if str(mem.duplex) != "+":
+ # warn user can't change duplex
+ msgs.append(chirp_common.ValidationError(_msg_duplex))
+
+ if str(mem.offset) != "5000000":
+ # warn user can't change offset
+ msgs.append(chirp_common.ValidationError(_msg_offset))
+
+ # channels 8 - 14 are low power NFM only
+ if mem.number >= 8 and mem.number <= 14:
+ if mem.mode != "NFM":
+ # warn user can't change mode
+ msgs.append(chirp_common.ValidationError(_msg_nfm))
+
+ if mem.power != "Low":
+ # warn user can't change power
+ msgs.append(chirp_common.ValidationError(_msg_txp))
+
+ return msgs
+
def sync_in(self):
"""Download from radio"""
try:
@@ -380,11 +492,18 @@
LOG.debug("bytepos %s" % bytepos)
_skp = self._memobj.skipflags[bytepos]
- _mem = self._memobj.memory[number - 1]
-
mem = chirp_common.Memory()
mem.number = number
+
+ if self.MODEL == "RB17A":
+ if mem.number < 17:
+ _mem = self._memobj.lomems[number - 1]
+ else:
+ _mem = self._memobj.himems[number - 17]
+ else:
+ _mem = self._memobj.memory[number - 1]
+
mem.freq = int(_mem.rxfreq) * 10
# We'll consider any blank (i.e. 0MHz frequency) to be empty
@@ -399,7 +518,10 @@
if _mem.get_raw() == ("\xFF" * 16):
LOG.debug("Initializing empty memory")
- _mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
+ if self.MODEL == "RB17A":
+ _mem.set_raw("\x00" * 13 + "\x04\xFF\xFF")
+ else:
+ _mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
if int(_mem.rxfreq) == int(_mem.txfreq):
mem.duplex = ""
@@ -419,7 +541,7 @@
mem.extra = RadioSettingGroup("Extra", "extra")
- if self.MODEL == "RT21":
+ if self.MODEL == "RT21" or self.MODEL == "RB17A":
rs = RadioSettingValueList(BCL_LIST, BCL_LIST[_mem.bcl])
rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
mem.extra.append(rset)
@@ -429,6 +551,18 @@
rset = RadioSetting("scramble_type", "Scramble Type", rs)
mem.extra.append(rset)
+ if self.MODEL == "RB17A":
+ rs = RadioSettingValueList(CDCSS_LIST, CDCSS_LIST[_mem.cdcss])
+ rset = RadioSetting("cdcss", "Cdcss Mode", rs)
+ mem.extra.append(rset)
+
+ if self._gmrs:
+ GMRS_IMMUTABLE = ["freq", "duplex", "offset"]
+ if mem.number >= 8 and mem.number <= 14:
+ mem.immutable = GMRS_IMMUTABLE + ["power", "mode"]
+ else:
+ mem.immutable = GMRS_IMMUTABLE
+
return mem
def _set_tone(self, mem, _mem):
@@ -477,13 +611,41 @@
LOG.debug("bytepos %s" % bytepos)
_skp = self._memobj.skipflags[bytepos]
- _mem = self._memobj.memory[mem.number - 1]
+ if self.MODEL == "RB17A":
+ if mem.number < 17:
+ _mem = self._memobj.lomems[mem.number - 1]
+ else:
+ _mem = self._memobj.himems[mem.number - 17]
+ else:
+ _mem = self._memobj.memory[mem.number - 1]
if mem.empty:
- _mem.set_raw("\xFF" * (_mem.size() / 8))
+ if self.MODEL == "RB17A":
+ _mem.set_raw("\xFF" * 12 + "\x00\x00\xFF\xFF")
+ else:
+ _mem.set_raw("\xFF" * (_mem.size() / 8))
+
+ if self._gmrs:
+ GMRS_FREQ = int(GMRS_FREQS[mem.number - 1] * 100000)
+ if mem.number > 22:
+ _mem.rxfreq = GMRS_FREQ
+ _mem.txfreq = int(_mem.rxfreq) + 500000
+ _mem.wide = True
+ else:
+ _mem.rxfreq = _mem.txfreq = GMRS_FREQ
+ if mem.number >= 8 and mem.number <= 14:
+ _mem.wide = False
+ _mem.highpower = False
+ else:
+ _mem.wide = True
+ _mem.highpower = True
+
return
- _mem.set_raw("\x00" * 13 + "\x00\x8F\xF8")
+ if self.MODEL == "RB17A":
+ _mem.set_raw("\x00" * 13 + "\x00\xFF\xFF")
+ else:
+ _mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
_mem.rxfreq = mem.freq / 10
@@ -523,7 +685,7 @@
basic = RadioSettingGroup("basic", "Basic Settings")
top = RadioSettings(basic)
- if self.MODEL == "RT21":
+ if self.MODEL == "RT21" or self.MODEL == "RB17A":
_keys = self._memobj.keys
rs = RadioSettingValueList(TIMEOUTTIMER_LIST,
@@ -544,6 +706,12 @@
rset = RadioSetting("voice", "Voice Annumciation", rs)
basic.append(rset)
+ if self.MODEL == "RB17A":
+ rs = RadioSettingValueList(ALARM_LIST,
+ ALARM_LIST[_settings.alarm])
+ rset = RadioSetting("alarm", "Alarm Type", rs)
+ basic.append(rset)
+
rs = RadioSettingValueBoolean(_settings.save)
rset = RadioSetting("save", "Battery Saver", rs)
basic.append(rset)
@@ -577,6 +745,24 @@
rset.set_apply_callback(apply_pf1_listvalue, _keys.pf1)
basic.append(rset)
+ def apply_topkey_listvalue(setting, obj):
+ LOG.debug("Setting value: " + str(setting.value) +
+ " from list")
+ val = str(setting.value)
+ index = TOPKEY_CHOICES.index(val)
+ val = TOPKEY_VALUES[index]
+ obj.set_value(val)
+
+ if self.MODEL == "RB17A":
+ if _keys.topkey in TOPKEY_VALUES:
+ idx = TOPKEY_VALUES.index(_keys.topkey)
+ else:
+ idx = TOPKEY_VALUES.index(0x0C)
+ rs = RadioSettingValueList(TOPKEY_CHOICES, TOPKEY_CHOICES[idx])
+ rset = RadioSetting("keys.topkey", "Top Key Function", rs)
+ rset.set_apply_callback(apply_topkey_listvalue, _keys.topkey)
+ basic.append(rset)
+
return top
def set_settings(self, settings):
@@ -599,6 +785,8 @@
if element.has_apply_callback():
LOG.debug("Using apply callback")
element.run_apply_callback()
+ elif setting == "channel":
+ setattr(obj, setting, int(element.value) - 1)
elif setting == "tot":
setattr(obj, setting, int(element.value) + 1)
elif element.value.get_mutable():
@@ -608,6 +796,34 @@
LOG.debug(element.get_name())
raise
+
+(a)directory.register
+class RB17ARadio(RT21Radio):
+ """RETEVIS RB17A"""
+ VENDOR = "Retevis"
+ MODEL = "RB17A"
+ BAUD_RATE = 9600
+ BLOCK_SIZE = 0x40
+ BLOCK_SIZE_UP = 0x10
+
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=0.50),
+ chirp_common.PowerLevel("High", watts=5.00)]
+
+ _magic = "PROA8US"
+ _fingerprint = "P3217s\xF8\xFF"
+ _upper = 30
+ _skipflags = True
+ _reserved = False
+ _gmrs = True
+
+ _ranges = [
+ (0x0000, 0x0300),
+ ]
+ _memsize = 0x0300
+
+ def process_mmap(self):
+ self._memobj = bitwise.parse(MEM_FORMAT_RB17A, self._mmap)
+
@classmethod
def match_model(cls, filedata, filename):
if cls.MODEL == "RT21":
1
0
[chirp_devel] Fwd: [PATCH 1 of 4] [RT21] Driver Maintenance: retevis_rt21.py
by Jim Unroe 03 Apr '21
by Jim Unroe 03 Apr '21
03 Apr '21
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Sat, Apr 3, 2021 at 8:59 PM
Subject: [PATCH 1 of 4] [RT21] Driver Maintenance: retevis_rt21.py
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1617487505 14400
# Sat Apr 03 18:05:05 2021 -0400
# Node ID d292f6aff5e0687bff7cf839f5de3e3164fe9f41
# Parent b4e9bcbae55f10d09d7e385f402cad104ab56269
[RT21] Driver Maintenance: retevis_rt21.py
This patch is prepare the driver for adding additional radio models.
1: fixes some incorrect code
2: reformats some code
3: allows CHIRP to make 5 attempts at putting radio into programming mode.
Other than for number 3, no features or settings have been added or removed from
this driver.
Related to #8957, #8661 and #8959
diff -r b4e9bcbae55f -r d292f6aff5e0 chirp/drivers/retevis_rt21.py
--- a/chirp/drivers/retevis_rt21.py Thu Apr 01 12:39:47 2021 -0400
+++ b/chirp/drivers/retevis_rt21.py Sat Apr 03 18:05:05 2021 -0400
@@ -1,4 +1,4 @@
-# Copyright 2016 Jim Unroe <rock.unroe(a)gmail.com>
+# Copyright 2021 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
@@ -18,72 +18,75 @@
import struct
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
+from chirp import (
+ bitwise,
+ chirp_common,
+ directory,
+ errors,
+ memmap,
+ util,
+)
+from chirp.settings import (
+ RadioSetting,
+ RadioSettingGroup,
+ RadioSettings,
+ RadioSettingValueBoolean,
+ RadioSettingValueInteger,
+ RadioSettingValueList,
+ RadioSettingValueString,
+)
LOG = logging.getLogger(__name__)
MEM_FORMAT = """
#seekto 0x0010;
struct {
- lbcd rxfreq[4];
- lbcd txfreq[4];
- ul16 rx_tone;
- ul16 tx_tone;
- u8 unknown1:3,
- bcl:2, // Busy Lock
+ lbcd rxfreq[4]; // RX Frequency 0-3
+ lbcd txfreq[4]; // TX Frequency 4-7
+ ul16 rx_tone; // PL/DPL Decode 8-9
+ ul16 tx_tone; // PL/DPL Encode A-B
+ u8 unknown1:3, // C
+ bcl:2, // Busy Lock
unknown2:3;
- u8 unknown3:2,
- highpower:1, // Power Level
- wide:1, // Bandwidth
+ u8 unknown3:2, // D
+ highpower:1, // Power Level
+ wide:1, // Bandwidth
unknown4:4;
- u8 scramble_type:4,
+ u8 scramble_type:4, // Scramble Type E
unknown5:4;
u8 unknown6:4,
- scramble_type2:4;
+ scramble_type2:4; // Scramble Type 2 F
} memory[16];
#seekto 0x011D;
struct {
u8 unused:4,
- pf1:4; // Programmable Function Key 1
+ pf1:4; // Programmable Function Key 1
} keys;
#seekto 0x012C;
struct {
- u8 use_scramble; // Scramble Enable
+ u8 use_scramble; // Scramble Enable
u8 unknown1[2];
- u8 voice; // Voice Annunciation
- u8 tot; // Time-out Timer
- u8 totalert; // Time-out Timer Pre-alert
+ u8 voice; // Voice Annunciation
+ u8 tot; // Time-out Timer
+ u8 totalert; // Time-out Timer Pre-alert
u8 unknown2[2];
- u8 squelch; // Squelch Level
- u8 save; // Battery Saver
+ u8 squelch; // Squelch Level
+ u8 save; // Battery Saver
u8 unknown3[3];
- u8 use_vox; // VOX Enable
- u8 vox; // VOX Gain
+ u8 use_vox; // VOX Enable
+ u8 vox; // VOX Gain
} settings;
#seekto 0x017E;
-u8 skipflags[2]; // SCAN_ADD
+u8 skipflags[2]; // SCAN_ADD
"""
CMD_ACK = "\x06"
-BLOCK_SIZE = 0x10
-
-RT21_POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00),
- chirp_common.PowerLevel("High", watts=2.50)]
-
-
-RT21_DTCS = sorted(chirp_common.DTCS_CODES +
- [17, 50, 55, 135, 217, 254, 305, 645, 765])
BCL_LIST = ["Off", "Carrier", "QT/DQT"]
-SCRAMBLE_LIST = ["Scramble 1", "Scramble 2", "Scramble 3", "Scramble 4",
- "Scramble 5", "Scramble 6", "Scramble 7", "Scramble 8"]
+SCRAMBLE_LIST = ["%s" % x for x in range(1, 9)]
TIMEOUTTIMER_LIST = ["%s seconds" % x for x in range(15, 615, 15)]
TOTALERT_LIST = ["Off"] + ["%s seconds" % x for x in range(1, 11)]
VOICE_LIST = ["Off", "Chinese", "English"]
@@ -101,19 +104,27 @@
}
-def _rt21_enter_programming_mode(radio):
+def _enter_programming_mode(radio):
serial = radio.pipe
- try:
- serial.write("PRMZUNE")
+ exito = False
+ for i in range(0, 5):
+ serial.write(radio._magic)
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:
+ if ack == CMD_ACK:
+ exito = True
+ break
+ except:
+ LOG.debug("Attempt #%s, failed, trying again" % i)
+ pass
+
+ # check if we had EXITO
+ if exito is False:
+ msg = "The radio did not accept program mode after five tries.\n"
+ msg += "Check you interface cable and power cycle your radio."
+ raise errors.RadioError(msg)
try:
serial.write("\x02")
@@ -121,7 +132,7 @@
except:
raise errors.RadioError("Error communicating with radio")
- if not ident.startswith("P3207"):
+ if not ident == radio._fingerprint:
LOG.debug(util.hexprint(ident))
raise errors.RadioError("Radio returned unknown identification string")
@@ -135,7 +146,7 @@
raise errors.RadioError("Radio refused to enter programming mode")
-def _rt21_exit_programming_mode(radio):
+def _exit_programming_mode(radio):
serial = radio.pipe
try:
serial.write("E")
@@ -143,16 +154,16 @@
raise errors.RadioError("Radio refused to exit programming mode")
-def _rt21_read_block(radio, block_addr, block_size):
+def _read_block(radio, block_addr, block_size):
serial = radio.pipe
- cmd = struct.pack(">cHb", 'R', block_addr, BLOCK_SIZE)
+ 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)
+ response = serial.read(4 + block_size)
if response[:4] != expectedresponse:
raise Exception("Error reading block %04x." % (block_addr))
@@ -169,11 +180,11 @@
return block_data
-def _rt21_write_block(radio, block_addr, block_size):
+def _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 + BLOCK_SIZE]
+ cmd = struct.pack(">cHb", 'W', block_addr, block_size)
+ data = radio.get_mmap()[block_addr:block_addr + block_size]
LOG.debug("Writing Data:")
LOG.debug(util.hexprint(cmd + data))
@@ -189,7 +200,7 @@
def do_download(radio):
LOG.debug("download")
- _rt21_enter_programming_mode(radio)
+ _enter_programming_mode(radio)
data = ""
@@ -199,17 +210,17 @@
status.cur = 0
status.max = radio._memsize
- for addr in range(0, radio._memsize, BLOCK_SIZE):
- status.cur = addr + BLOCK_SIZE
+ for addr in range(0, radio._memsize, radio.BLOCK_SIZE):
+ status.cur = addr + radio.BLOCK_SIZE
radio.status_fn(status)
- block = _rt21_read_block(radio, addr, BLOCK_SIZE)
+ block = _read_block(radio, addr, radio.BLOCK_SIZE)
data += block
LOG.debug("Address: %04x" % addr)
LOG.debug(util.hexprint(block))
- _rt21_exit_programming_mode(radio)
+ _exit_programming_mode(radio)
return memmap.MemoryMap(data)
@@ -218,18 +229,18 @@
status = chirp_common.Status()
status.msg = "Uploading to radio"
- _rt21_enter_programming_mode(radio)
+ _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
+ for addr in range(start_addr, end_addr, radio.BLOCK_SIZE_UP):
+ status.cur = addr + radio.BLOCK_SIZE_UP
radio.status_fn(status)
- _rt21_write_block(radio, addr, BLOCK_SIZE)
+ _write_block(radio, addr, radio.BLOCK_SIZE_UP)
- _rt21_exit_programming_mode(radio)
+ _exit_programming_mode(radio)
def model_match(cls, data):
@@ -245,6 +256,18 @@
VENDOR = "Retevis"
MODEL = "RT21"
BAUD_RATE = 9600
+ BLOCK_SIZE = 0x10
+ BLOCK_SIZE_UP = 0x10
+
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00),
+ chirp_common.PowerLevel("High", watts=2.50)]
+
+ _magic = "PRMZUNE"
+ _fingerprint = "P3207s\xF8\xFF"
+ _upper = 16
+ _skipflags = True
+ _reserved = False
+ _gmrs = False
_ranges = [
(0x0000, 0x0400),
@@ -265,10 +288,10 @@
rf.valid_tmodes = ["", "Tone", "TSQL", "DTCS", "Cross"]
rf.valid_cross_modes = ["Tone->Tone", "Tone->DTCS", "DTCS->Tone",
"->Tone", "->DTCS", "DTCS->", "DTCS->DTCS"]
- rf.valid_power_levels = RT21_POWER_LEVELS
+ rf.valid_power_levels = self.POWER_LEVELS
rf.valid_duplexes = ["", "-", "+", "split", "off"]
rf.valid_modes = ["NFM", "FM"] # 12.5 KHz, 25 kHz.
- rf.memory_bounds = (1, 16)
+ rf.memory_bounds = (1, self._upper)
rf.valid_tuning_steps = [2.5, 5., 6.25, 10., 12.5, 25.]
rf.valid_bands = [(400000000, 480000000)]
@@ -278,11 +301,31 @@
self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)
def sync_in(self):
- self._mmap = do_download(self)
+ """Download from radio"""
+ try:
+ data = do_download(self)
+ except errors.RadioError:
+ # Pass through any real errors we raise
+ raise
+ except:
+ # If anything unexpected happens, make sure we raise
+ # a RadioError and log the problem
+ LOG.exception('Unexpected error during download')
+ raise errors.RadioError('Unexpected error communicating '
+ 'with the radio')
+ self._mmap = data
self.process_mmap()
def sync_out(self):
- do_upload(self)
+ """Upload to radio"""
+ try:
+ do_upload(self)
+ except:
+ # If anything unexpected happens, make sure we raise
+ # a RadioError and log the problem
+ LOG.exception('Unexpected error during upload')
+ raise errors.RadioError('Unexpected error communicating '
+ 'with the radio')
def get_raw_memory(self, number):
return repr(self._memobj.memory[number - 1])
@@ -330,13 +373,14 @@
(txmode, _mem.tx_tone, rxmode, _mem.rx_tone))
def get_memory(self, number):
- bitpos = (1 << ((number - 1) % 8))
- bytepos = ((number - 1) / 8)
- LOG.debug("bitpos %s" % bitpos)
- LOG.debug("bytepos %s" % bytepos)
+ if self._skipflags:
+ bitpos = (1 << ((number - 1) % 8))
+ bytepos = ((number - 1) / 8)
+ LOG.debug("bitpos %s" % bitpos)
+ LOG.debug("bytepos %s" % bytepos)
+ _skp = self._memobj.skipflags[bytepos]
_mem = self._memobj.memory[number - 1]
- _skp = self._memobj.skipflags[bytepos]
mem = chirp_common.Memory()
@@ -368,23 +412,22 @@
self._get_tone(_mem, mem)
- mem.power = RT21_POWER_LEVELS[_mem.highpower]
+ mem.power = self.POWER_LEVELS[_mem.highpower]
mem.skip = "" if (_skp & bitpos) else "S"
LOG.debug("mem.skip %s" % mem.skip)
mem.extra = RadioSettingGroup("Extra", "extra")
- rs = RadioSetting("bcl", "Busy Channel Lockout",
- RadioSettingValueList(
- BCL_LIST, BCL_LIST[_mem.bcl]))
- mem.extra.append(rs)
+ if self.MODEL == "RT21":
+ rs = RadioSettingValueList(BCL_LIST, BCL_LIST[_mem.bcl])
+ rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
+ mem.extra.append(rset)
- rs = RadioSetting("scramble_type", "Scramble Type",
- RadioSettingValueList(SCRAMBLE_LIST,
- SCRAMBLE_LIST[
- _mem.scramble_type - 8]))
- mem.extra.append(rs)
+ rs = RadioSettingValueList(SCRAMBLE_LIST,
+ SCRAMBLE_LIST[_mem.scramble_type - 8])
+ rset = RadioSetting("scramble_type", "Scramble Type", rs)
+ mem.extra.append(rset)
return mem
@@ -427,13 +470,14 @@
(tx_mode, _mem.tx_tone, rx_mode, _mem.rx_tone))
def set_memory(self, mem):
- bitpos = (1 << ((mem.number - 1) % 8))
- bytepos = ((mem.number - 1) / 8)
- LOG.debug("bitpos %s" % bitpos)
- LOG.debug("bytepos %s" % bytepos)
+ if self._skipflags:
+ bitpos = (1 << ((mem.number - 1) % 8))
+ bytepos = ((mem.number - 1) / 8)
+ LOG.debug("bitpos %s" % bitpos)
+ LOG.debug("bytepos %s" % bytepos)
+ _skp = self._memobj.skipflags[bytepos]
_mem = self._memobj.memory[mem.number - 1]
- _skp = self._memobj.skipflags[bytepos]
if mem.empty:
_mem.set_raw("\xFF" * (_mem.size() / 8))
@@ -459,7 +503,7 @@
self._set_tone(mem, _mem)
- _mem.highpower = mem.power == RT21_POWER_LEVELS[1]
+ _mem.highpower = mem.power == self.POWER_LEVELS[1]
if mem.skip != "S":
_skp |= bitpos
@@ -475,65 +519,63 @@
setattr(_mem, setting.get_name(), setting.value)
def get_settings(self):
- _keys = self._memobj.keys
_settings = self._memobj.settings
basic = RadioSettingGroup("basic", "Basic Settings")
top = RadioSettings(basic)
- rs = RadioSetting("tot", "Time-out timer",
- RadioSettingValueList(
- TIMEOUTTIMER_LIST,
- TIMEOUTTIMER_LIST[_settings.tot - 1]))
- basic.append(rs)
+ if self.MODEL == "RT21":
+ _keys = self._memobj.keys
- rs = RadioSetting("totalert", "TOT Pre-alert",
- RadioSettingValueList(
- TOTALERT_LIST,
- TOTALERT_LIST[_settings.totalert]))
- basic.append(rs)
+ rs = RadioSettingValueList(TIMEOUTTIMER_LIST,
+ TIMEOUTTIMER_LIST[_settings.tot - 1])
+ rset = RadioSetting("tot", "Time-out timer", rs)
+ basic.append(rset)
- rs = RadioSetting("squelch", "Squelch Level",
- RadioSettingValueInteger(0, 9, _settings.squelch))
- basic.append(rs)
+ rs = RadioSettingValueList(TOTALERT_LIST,
+ TOTALERT_LIST[_settings.totalert])
+ rset = RadioSetting("totalert", "TOT Pre-alert", rs)
+ basic.append(rset)
- rs = RadioSetting("voice", "Voice Annumciation",
- RadioSettingValueList(
- VOICE_LIST, VOICE_LIST[_settings.voice]))
- basic.append(rs)
+ rs = RadioSettingValueInteger(0, 9, _settings.squelch)
+ rset = RadioSetting("squelch", "Squelch Level", rs)
+ basic.append(rset)
- rs = RadioSetting("save", "Battery Saver",
- RadioSettingValueBoolean(_settings.save))
- basic.append(rs)
+ rs = RadioSettingValueList(VOICE_LIST, VOICE_LIST[_settings.voice])
+ rset = RadioSetting("voice", "Voice Annumciation", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(_settings.save)
+ rset = RadioSetting("save", "Battery Saver", rs)
+ basic.append(rset)
- rs = RadioSetting("use_scramble", "Scramble",
- RadioSettingValueBoolean(_settings.use_scramble))
- basic.append(rs)
+ rs = RadioSettingValueBoolean(_settings.use_scramble)
+ rset = RadioSetting("use_scramble", "Scramble", rs)
+ basic.append(rset)
- rs = RadioSetting("use_vox", "VOX",
- RadioSettingValueBoolean(_settings.use_vox))
- basic.append(rs)
+ rs = RadioSettingValueBoolean(_settings.use_vox)
+ rset = RadioSetting("use_vox", "VOX", rs)
+ basic.append(rset)
- rs = RadioSetting("vox", "VOX Gain",
- RadioSettingValueList(
- VOX_LIST, VOX_LIST[_settings.vox]))
- basic.append(rs)
+ rs = RadioSettingValueList(VOX_LIST, VOX_LIST[_settings.vox])
+ rset = RadioSetting("vox", "VOX Gain", rs)
+ basic.append(rset)
- def apply_pf1_listvalue(setting, obj):
- LOG.debug("Setting value: " + str(setting.value) + " from list")
- val = str(setting.value)
- index = PF1_CHOICES.index(val)
- val = PF1_VALUES[index]
- obj.set_value(val)
+ def apply_pf1_listvalue(setting, obj):
+ LOG.debug("Setting value: " + str(
+ setting.value) + " from list")
+ val = str(setting.value)
+ index = PF1_CHOICES.index(val)
+ val = PF1_VALUES[index]
+ obj.set_value(val)
- if _keys.pf1 in PF1_VALUES:
- idx = PF1_VALUES.index(_keys.pf1)
- else:
- idx = LIST_DTMF_SPECIAL_VALUES.index(0x04)
- rs = RadioSetting("keys.pf1", "PF1 Key Function",
- RadioSettingValueList(PF1_CHOICES,
- PF1_CHOICES[idx]))
- rs.set_apply_callback(apply_pf1_listvalue, _keys.pf1)
- basic.append(rs)
+ if _keys.pf1 in PF1_VALUES:
+ idx = PF1_VALUES.index(_keys.pf1)
+ else:
+ idx = LIST_DTMF_SPECIAL_VALUES.index(0x04)
+ rs = RadioSettingValueList(PF1_CHOICES, PF1_CHOICES[idx])
+ rset = RadioSetting("keys.pf1", "PF1 Key Function", rs)
+ rset.set_apply_callback(apply_pf1_listvalue, _keys.pf1)
+ basic.append(rset)
return top
@@ -568,17 +610,23 @@
@classmethod
def match_model(cls, filedata, filename):
- match_size = False
- match_model = False
+ if cls.MODEL == "RT21":
+ # The RT21 is pre-metadata, so do old-school detection
+ match_size = False
+ match_model = False
- # testing the file data size
- if len(filedata) in [0x0400, ]:
- match_size = True
+ # testing the file data size
+ if len(filedata) in [0x0400, ]:
+ match_size = True
- # testing the model fingerprint
- match_model = model_match(cls, filedata)
+ # testing the model fingerprint
+ match_model = model_match(cls, filedata)
- if match_size and match_model:
- return True
+ if match_size and match_model:
+ return True
+ else:
+ return False
else:
+ # Radios that have always been post-metadata, so never do
+ # old-school detection
return False
1
0
Attached is the patch adding IC-7300 live-mode support to icomciv.py per
issue #4013.
--
1
0
[chirp_devel] Fwd: [PATCH 2 of 2] [AT-778UV] Add support model variants that include VOX
by Jim Unroe 17 Mar '21
by Jim Unroe 17 Mar '21
17 Mar '21
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Wed, Mar 17, 2021 at 4:28 PM
Subject: [PATCH 2 of 2] [AT-778UV] Add support model variants that include VOX
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1616012561 14400
# Wed Mar 17 16:22:41 2021 -0400
# Node ID 9d2390ab9a62918238bd5d1b59909e23287bd8ec
# Parent 975f31e5d96e0e9d35327f0e8aa0756b9fac1132
[AT-778UV] Add support model variants that include VOX
This patch adds support for the new model variants that now include VOX:
Anytone AT-778UV VOX 3.0
Retevis RT95 VOX 2.0
fixes #8859
diff -r 975f31e5d96e -r 9d2390ab9a62 chirp/drivers/anytone778uv.py
--- a/chirp/drivers/anytone778uv.py Wed Mar 17 16:18:15 2021 -0400
+++ b/chirp/drivers/anytone778uv.py Wed Mar 17 16:22:41 2021 -0400
@@ -1,5 +1,5 @@
# Copyright 2020 Joe Milbourn <joe(a)milbourn.org.uk>
-# Copyright 2020 Jim Unroe <rock.unroe(a)gmail.com>
+# Copyright 2021 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
@@ -106,8 +106,9 @@
u8 unknown7;
u8 unknown8;
u8 unknown9;
- u8 unknown10;
- char name[5];
+ char name[6]; // the VOX models have 6-character names
+ // the original models only have 5-character names
+ // the 1st byte is not used and will always be 0x00
ul16 customctcss;
} memory[200];
#seekto 0x1940;
@@ -204,6 +205,10 @@
powerOnReset:1, // power on reset
trfEnable:1, // trf enable
knobMode:1; // knob mode
+ u8 unk321c:7, // 0x321C
+ voxOnOff:1; // vox on/off
+ u8 voxLevel; // 0x321D vox level
+ u8 voxDelay; // 0x321E vox delay
} settings;
#seekto 0x3240;
@@ -627,6 +632,8 @@
'''AnyTone 778UV and probably Retivis RT95 and others'''
BAUD_RATE = 9600
NEEDS_COMPAT_SERIAL = False
+ NAME_LENGTH = 5
+ HAS_VOX = False
@classmethod
def get_prompts(cls):
@@ -648,7 +655,7 @@
rf.can_odd_split = True
rf.has_name = True
rf.has_offset = True
- rf.valid_name_length = 5
+ rf.valid_name_length = self.NAME_LENGTH
rf.valid_duplexes = ['', '+', '-', 'split', 'off']
rf.valid_characters = CHARSET_ASCII_PLUS
@@ -723,7 +730,14 @@
mem.skip = 'S'
# set the name
- mem.name = str(_mem.name).rstrip() # Set the alpha tag
+ if self.NAME_LENGTH == 5:
+ # original models with 5-character name length
+ temp_name = str(_mem.name)
+ # Strip the first character and set the alpha tag
+ mem.name = str(temp_name[1:6]).rstrip()
+ else:
+ # new VOX models with 6-character name length
+ mem.name = str(_mem.name).rstrip() # Set the alpha tag
# Convert your low-level frequency and offset to Hertz
mem.freq = int(_mem.freq) * 10
@@ -922,7 +936,15 @@
_mem.freq = int(mem.freq / 10)
_mem.offset = int(mem.offset / 10)
- _mem.name = mem.name.ljust(5)[:5] # Store the alpha tag
+ # Store the alpha tag
+ if self.NAME_LENGTH == 5:
+ # original models with 5-character name length
+ temp_name = mem.name.ljust(self.NAME_LENGTH)[:self.NAME_LENGTH]
+ # prefix the 5-character name with 0x00 to fit structure
+ _mem.name = temp_name.rjust(6, chr(00))
+ else:
+ # new VOX models with 6-character name length
+ _mem.name = mem.name.ljust(self.NAME_LENGTH)[:self.NAME_LENGTH]
# TODO support busy channel lockout - disabled for now
_mem.busy_channel_lockout = BUSY_CHANNEL_LOCKOUT_OFF
@@ -1055,7 +1077,6 @@
_mem.unknown7 = 0x00
_mem.unknown8 = 0x00
_mem.unknown9 = 0x00
- _mem.unknown10 = 0x00
def get_settings(self):
"""Translate the MEM_FORMAT structs into setstuf in the UI"""
@@ -1171,39 +1192,42 @@
function.append(rset)
# ON/OFF SET
- # Power-on Password
- rs = RadioSettingValueBoolean(_settings.powerOnPasswd)
- rset = RadioSetting("settings.powerOnPasswd", "Power-on Password", rs)
- function.append(rset)
+ # The Power-on Password feature is not available on models with VOX
+ if not self.HAS_VOX:
+ # Power-on Password
+ rs = RadioSettingValueBoolean(_settings.powerOnPasswd)
+ rset = RadioSetting("settings.powerOnPasswd", "Power-on Password",
+ rs)
+ function.append(rset)
- # Password
- def _char_to_str(chrx):
- """ Remove ff pads from char array """
- # chrx is char array
- str1 = ""
- for sx in chrx:
- if int(sx) > 31 and int(sx) < 127:
- str1 += chr(sx)
- return str1
+ # Password
+ def _char_to_str(chrx):
+ """ Remove ff pads from char array """
+ # chrx is char array
+ str1 = ""
+ for sx in chrx:
+ if int(sx) > 31 and int(sx) < 127:
+ str1 += chr(sx)
+ return str1
- def _pswd_vfy(setting, obj, atrb):
- """ Verify password is 1-6 chars, numbers 1-5 """
- str1 = str(setting.value).strip() # initial
- str2 = filter(lambda c: c in '0123456789', str1) # valid chars
- if str1 != str2:
- # Two lines due to python 73 char limit
- sx = "Bad characters in Password"
- raise errors.RadioError(sx)
- str2 = str1.ljust(6, chr(00)) # pad to 6 with 00's
- setattr(obj, atrb, str2)
- return
+ def _pswd_vfy(setting, obj, atrb):
+ """ Verify password is 1-6 chars, numbers 1-5 """
+ str1 = str(setting.value).strip() # initial
+ str2 = filter(lambda c: c in '0123456789', str1) # valid chars
+ if str1 != str2:
+ # Two lines due to python 73 char limit
+ sx = "Bad characters in Password"
+ raise errors.RadioError(sx)
+ str2 = str1.ljust(6, chr(00)) # pad to 6 with 00's
+ setattr(obj, atrb, str2)
+ return
- sx = _char_to_str(_password.digits).strip()
- rx = RadioSettingValueString(0, 6, sx)
- sx = "Password (numerals 0-9)"
- rset = RadioSetting("password.digits", sx, rx)
- rset.set_apply_callback(_pswd_vfy, _password, "digits")
- function.append(rset)
+ sx = _char_to_str(_password.digits).strip()
+ rx = RadioSettingValueString(0, 6, sx)
+ sx = "Password (numerals 0-9)"
+ rset = RadioSetting("password.digits", sx, rx)
+ rset.set_apply_callback(_pswd_vfy, _password, "digits")
+ function.append(rset)
# Menu 9 - Auto Power On
rs = RadioSettingValueBoolean(_settings.autoPowerOn)
@@ -1300,6 +1324,26 @@
rset = RadioSetting("settings.trfEnable", "TRF enable", rs)
function.append(rset)
+ if self.HAS_VOX:
+ # VOX On/Off
+ rs = RadioSettingValueBoolean(_settings.voxOnOff)
+ rset = RadioSetting("settings.voxOnOff",
+ "VOX", rs)
+ function.append(rset)
+
+ # VOX Delay
+ options = ["0.5 S", "1.0 S", "1.5 S", "2.0 S", "2.5 S",
+ "3.0 S", "3.5 S", "4.0 S", "4.5 S"]
+ rs = RadioSettingValueList(options, options[_settings.voxDelay])
+ rset = RadioSetting("settings.voxDelay", "VOX delay", rs)
+ function.append(rset)
+
+ # VOX Level
+ options = ["%s" % x for x in range(1, 10)]
+ rs = RadioSettingValueList(options, options[_settings.voxLevel])
+ rset = RadioSetting("settings.voxLevel", "VOX Level", rs)
+ function.append(rset)
+
# Key Assignment
pfkeys = RadioSettingGroup("pfkeys", "Key Assignment")
group.append(pfkeys)
@@ -1308,6 +1352,9 @@
"CAL", "TALK", "BND", "SFT", "MON", "DIR", "TRF", "RDW",
"NULL"]
+ if self.HAS_VOX:
+ options.insert(16, "VOX")
+
# Key Mode 1
# P1
rs = RadioSettingValueList(options, options[_pfkeys.keyMode1P1 - 1])
@@ -1385,6 +1432,9 @@
options = ["V/M", "SQL", "VOL", "POW", "CDT", "REV", "SCN", "CAL",
"TALK", "BND", "SFT", "MON", "DIR", "TRF", "RDW"]
+ if self.HAS_VOX:
+ options.insert(15, "VOX")
+
# PA
rs = RadioSettingValueList(options, options[_settings.keyPA - 2])
rset = RadioSetting("settings.keyPA",
@@ -1653,6 +1703,7 @@
LOG.debug(element.get_name())
raise
+# Original non-VOX models
if has_future:
@directory.register
class AnyTone778UV(AnyTone778UVBase):
@@ -1693,3 +1744,27 @@
# Allowed radio types is a dict keyed by model of a list of version
# strings
ALLOWED_RADIO_TYPES = {'YCM04UV': ['V100']}
+
+
+class AnyTone778UVvoxBase(AnyTone778UVBase):
+ '''AnyTone 778UV VOX, Retivis RT95 VOX and others'''
+ NAME_LENGTH = 6
+ HAS_VOX = True
+
+# New VOX models
+if has_future:
+ @directory.register
+ class AnyTone778UVvox(AnyTone778UVvoxBase):
+ VENDOR = "AnyTone"
+ MODEL = "778UV VOX"
+ # Allowed radio types is a dict keyed by model of a list of version
+ # strings
+ ALLOWED_RADIO_TYPES = {'778UV-P': ['V100']}
+
+ @directory.register
+ class RetevisRT95vox(AnyTone778UVvoxBase):
+ VENDOR = "Retevis"
+ MODEL = "RT95 VOX"
+ # Allowed radio types is a dict keyed by model of a list of version
+ # strings
+ ALLOWED_RADIO_TYPES = {'RT95-P': ['V100']}
1
0
[chirp_devel] Fwd: [PATCH 1 of 2] [AT-778UV] Add anytone778uv.py driver to cpep8.manifext
by Jim Unroe 17 Mar '21
by Jim Unroe 17 Mar '21
17 Mar '21
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Wed, Mar 17, 2021 at 4:28 PM
Subject: [PATCH 1 of 2] [AT-778UV] Add anytone778uv.py driver to cpep8.manifext
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1616012295 14400
# Wed Mar 17 16:18:15 2021 -0400
# Node ID 975f31e5d96e0e9d35327f0e8aa0756b9fac1132
# Parent b3ddf88a9432528557d1976df9c667eed4b7319e
[AT-778UV] Add anytone778uv.py driver to cpep8.manifext
This patch adds the anytone778uv.py driver to the cpep8.manifest in order to
enable style checking.
related to #8859
diff -r b3ddf88a9432 -r 975f31e5d96e tools/cpep8.manifest
--- a/tools/cpep8.manifest Sun Mar 07 00:47:19 2021 -0800
+++ b/tools/cpep8.manifest Wed Mar 17 16:18:15 2021 -0400
@@ -14,6 +14,7 @@
./chirp/drivers/alinco.py
./chirp/drivers/anytone.py
./chirp/drivers/anytone_ht.py
+./chirp/drivers/anytone778uv.py
./chirp/drivers/ap510.py
./chirp/drivers/baofeng_common.py
./chirp/drivers/baofeng_uv3r.py
1
0