Developers
Threads by month
- ----- 2024 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
June 2019
- 5 participants
- 11 discussions
Hello,
I initially used MS Windows to develop some changes to CHIRP. I am
having a problem with TOX. It appears that it can not find the chirp
modules and the version numbers. I tried building and testing under
Linux and things worked fine. I noticed the zip file is named for the
version under Linux and unknown with zeros under windows
Is CHIRP only meant to be developed using Linux or do I have a setup
problem?
73 Eric
---
This email has been checked for viruses by Avast antivirus software.
https://www.avast.com/antivirus
3
9
> ImportError: cannot import name Serial
>
> What part of the setup have I missed?
You're missing python-serial. Can you add deps=serial to the
[testenv:driver] section in tox.ini and see if that works?
Added serial to tox deps and it gets a bit further, any thoughts? as before
UNKNOWN-0.0.0.zp can't be write, and now we have no module named chirp. Is
there something to be done with the build first? Thanks. Nicolas
nicolass-Mac-mini:chirp.hg nicolas$ tox -e driver -- -d Icom_IC-2820H
*GLOB sdist-make: /Users/nicolas/Documents/FT70CHIRP/chirp.hg/setup.py*
*driver inst-nodeps:
/Users/nicolas/Documents/FT70CHIRP/chirp.hg/.tox/dist/UNKNOWN-0.0.0.zip*
ERROR: invocation failed (exit code 1), logfile:
/Users/nicolas/Documents/FT70CHIRP/chirp.hg/.tox/driver/log/driver-4.log
ERROR: actionid: driver
msg: installpkg
cmdargs:
['/Users/nicolas/Documents/FT70CHIRP/chirp.hg/.tox/driver/bin/pip',
'install', '-U', '--no-deps',
'/Users/nicolas/Documents/FT70CHIRP/chirp.hg/.tox/dist/UNKNOWN-0.0.0.zip']
Processing ./.tox/dist/UNKNOWN-0.0.0.zip
Complete output from command python setup.py egg_info:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File
"/private/var/folders/yf/rh0gfjk57pzfvdls7z6nwnmr0000gn/T/pip-kuILg4-build/setup.py",
line 5, in <module>
from chirp import CHIRP_VERSION
ImportError: No module named chirp
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in
/private/var/folders/yf/rh0gfjk57pzfvdls7z6nwnmr0000gn/T/pip-kuILg4-build/
*driver installed:
future==0.16.0,iso8601==0.1.12,libxml2-python==2.9.7,lxml==4.1.1,mercurial==4.5,pluggy==0.6.0,py==1.5.2,pycairo==1.15.3,PyYAML==3.12,serial==0.0.38,six==1.11.0,tox==2.9.1,virtualenv==15.1.0*
_______________________________________________________________________________
summary
_______________________________________________________________________________
ERROR: driver: InvocationError:
/Users/nicolas/Documents/FT70CHIRP/chirp.hg/.tox/driver/bin/pip install -U
--no-deps
/Users/nicolas/Documents/FT70CHIRP/chirp.hg/.tox/dist/UNKNOWN-0.0.0.zip
(see
/Users/nicolas/Documents/FT70CHIRP/chirp.hg/.tox/driver/log/driver-4.log)
nicolass-Mac-mini:chirp.hg nicolas$
4
5
Fixed typos in previous release, changed info prompt.
Manifest is updated.
--
Rick DeWitt
AA0RD
Sequim, Washington, USA 98382
(360) 681-3494
2
1
OK, the perfect IC-2730 patch is attached, along with an updated image file.
--
Rick DeWitt
AA0RD
Sequim, Washington, USA 98382
(360) 681-3494
2
1
Attached is the perfectly styled, tested and patched new driver for the
TYT TH-UV8000 series,
Also included is the updated manifest and the appropriate image file.
What could possibly go wrong....
--
Rick DeWitt
AA0RD
Sequim, Washington, USA 98382
(360) 681-3494
1
0
OK, here is the modified JC-2730 driver update. Back to Unix EOL chars,
and many style fixes.
I tried to use function calls in get_settings to make it more readable
but I think it only made it worse, so I reverted back to the original
all-in-line format.
I have to respectfully disagree on the Information prompt; the manuals
either do not mention these issues, or are very confusing. Issue #2745,
items #54 and #55 both attest to this.
I still can't get the cpep8.py test to run under windows... import errors.
--
Rick DeWitt
AA0RD
Sequim, Washington, USA 98382
(360) 681-3494
3
3
Attached is the update to the IC-2730A driver that incorporates all the
Settings tabs and fixes the C0/C1 special channels lookup error.
The referenced issue is #6711, which duplicated 2745, 4085 and 4147.
--
Rick DeWitt
AA0RD
Sequim, Washington, USA 98382
(360) 681-3494
2
2
Tested changes:
Changes for Build #821
[Dan Smith <dsmith(a)danplanet.com>] Update the about box for 2019
#0
[Dan Smith <dsmith(a)danplanet.com>] Fix ic2730 driver style issues and add to cpep8.manifest
In anticipation of #6711
[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 330 lines...]
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_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_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_YaesuFT70D)
Testing Yaesu FT-70D banks ... ok
test_brute_force (tests.TestCase_YaesuFT70D)
Testing Yaesu FT-70D brute force ... ok
test_clone (tests.TestCase_YaesuFT70D)
Testing Yaesu FT-70D clone ... ok
test_copy_all (tests.TestCase_YaesuFT70D)
Testing Yaesu FT-70D copy all ... ok
test_detect (tests.TestCase_YaesuFT70D)
Testing Yaesu FT-70D detect ... ok
test_edges (tests.TestCase_YaesuFT70D)
Testing Yaesu FT-70D edges ... ok
test_settings (tests.TestCase_YaesuFT70D)
Testing Yaesu FT-70D 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 ... ok
test_edges (tests.TestCase_RetevisRT26)
Testing Retevis RT26 edges ... ok
test_settings (tests.TestCase_RetevisRT26)
Testing Retevis RT26 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_BaofengUV6R)
Testing Baofeng UV-6R banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengUV6R)
Testing Baofeng UV-6R brute force ... ok
test_clone (tests.TestCase_BaofengUV6R)
Testing Baofeng UV-6R clone ... ok
test_copy_all (tests.TestCase_BaofengUV6R)
Testing Baofeng UV-6R copy all ... ok
test_detect (tests.TestCase_BaofengUV6R)
Testing Baofeng UV-6R detect ... ok
test_edges (tests.TestCase_BaofengUV6R)
Testing Baofeng UV-6R edges ... ok
test_settings (tests.TestCase_BaofengUV6R)
Testing Baofeng UV-6R 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_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'
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_IcomIC2820H)
Testing Icom IC-2820H banks ... ok
test_brute_force (tests.TestCase_IcomIC2820H)
Testing Icom IC-2820H brute force ... ok
test_clone (tests.TestCase_IcomIC2820H)
Testing Icom IC-2820H clone ... ok
test_copy_all (tests.TestCase_IcomIC2820H)
Testing Icom IC-2820H copy all ... ok
test_detect (tests.TestCase_IcomIC2820H)
Testing Icom IC-2820H detect ... ok
test_edges (tests.TestCase_IcomIC2820H)
Testing Icom IC-2820H edges ... ok
test_settings (tests.TestCase_IcomIC2820H)
Testing Icom IC-2820H 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_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_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_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_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_IcomICT7H)
Testing Icom IC-T7H banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_IcomICT7H)
Testing Icom IC-T7H brute force ... ok
test_clone (tests.TestCase_IcomICT7H)
Testing Icom IC-T7H clone ... ok
test_copy_all (tests.TestCase_IcomICT7H)
Testing Icom IC-T7H copy all ... ok
test_detect (tests.TestCase_IcomICT7H)
Testing Icom IC-T7H detect ... ok
test_edges (tests.TestCase_IcomICT7H)
Testing Icom IC-T7H edges ... ok
test_settings (tests.TestCase_IcomICT7H)
Testing Icom IC-T7H settings ... skipped 'Settings not supported'
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_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_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_TDXoneTDQ8A)
Testing TDXone TD-Q8A banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TDXoneTDQ8A)
Testing TDXone TD-Q8A brute force ... ok
test_clone (tests.TestCase_TDXoneTDQ8A)
Testing TDXone TD-Q8A clone ... ok
test_copy_all (tests.TestCase_TDXoneTDQ8A)
Testing TDXone TD-Q8A copy all ... ok
test_detect (tests.TestCase_TDXoneTDQ8A)
Testing TDXone TD-Q8A detect ... ok
test_edges (tests.TestCase_TDXoneTDQ8A)
Testing TDXone TD-Q8A edges ... ok
test_settings (tests.TestCase_TDXoneTDQ8A)
Testing TDXone TD-Q8A settings ... ok
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_TYTTH350)
Testing TYT TH-350 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTH350)
Testing TYT TH-350 brute force ... ok
test_clone (tests.TestCase_TYTTH350)
Testing TYT TH-350 clone ... ok
test_copy_all (tests.TestCase_TYTTH350)
Testing TYT TH-350 copy all ... ok
test_detect (tests.TestCase_TYTTH350)
Testing TYT TH-350 detect ... ok
test_edges (tests.TestCase_TYTTH350)
Testing TYT TH-350 edges ... ok
test_settings (tests.TestCase_TYTTH350)
Testing TYT TH-350 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_BaofengUV3R)
Testing Baofeng UV-3R banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengUV3R)
Testing Baofeng UV-3R brute force ... ok
test_clone (tests.TestCase_BaofengUV3R)
Testing Baofeng UV-3R clone ... ok
test_copy_all (tests.TestCase_BaofengUV3R)
Testing Baofeng UV-3R copy all ... ok
test_detect (tests.TestCase_BaofengUV3R)
Testing Baofeng UV-3R detect ... ok
test_edges (tests.TestCase_BaofengUV3R)
Testing Baofeng UV-3R edges ... ok
test_settings (tests.TestCase_BaofengUV3R)
Testing Baofeng UV-3R settings ... ok
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_AnyToneTERMN8R)
Testing AnyTone TERMN-8R banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_AnyToneTERMN8R)
Testing AnyTone TERMN-8R brute force ... ok
test_clone (tests.TestCase_AnyToneTERMN8R)
Testing AnyTone TERMN-8R clone ... ok
test_copy_all (tests.TestCase_AnyToneTERMN8R)
Testing AnyTone TERMN-8R copy all ... ok
test_detect (tests.TestCase_AnyToneTERMN8R)
Testing AnyTone TERMN-8R detect ... ok
test_edges (tests.TestCase_AnyToneTERMN8R)
Testing AnyTone TERMN-8R edges ... ok
test_settings (tests.TestCase_AnyToneTERMN8R)
Testing AnyTone TERMN-8R settings ... ok
test_banks (tests.TestCase_BTECHGMRS50X1)
Testing BTECH GMRS-50X1 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHGMRS50X1)
Testing BTECH GMRS-50X1 brute force ... ok
test_clone (tests.TestCase_BTECHGMRS50X1)
Testing BTECH GMRS-50X1 clone ... ok
test_copy_all (tests.TestCase_BTECHGMRS50X1)
Testing BTECH GMRS-50X1 copy all ... ok
test_detect (tests.TestCase_BTECHGMRS50X1)
Testing BTECH GMRS-50X1 detect ... ok
test_edges (tests.TestCase_BTECHGMRS50X1)
Testing BTECH GMRS-50X1 edges ... ok
test_settings (tests.TestCase_BTECHGMRS50X1)
Testing BTECH GMRS-50X1 settings ... ok
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_YaesuFT7100M)
Testing Yaesu FT-7100M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT7100M)
Testing Yaesu FT-7100M brute force ... ok
test_clone (tests.TestCase_YaesuFT7100M)
Testing Yaesu FT-7100M clone ... ok
test_copy_all (tests.TestCase_YaesuFT7100M)
Testing Yaesu FT-7100M copy all ... ok
test_detect (tests.TestCase_YaesuFT7100M)
Testing Yaesu FT-7100M detect ... ok
test_edges (tests.TestCase_YaesuFT7100M)
Testing Yaesu FT-7100M edges ... ok
test_settings (tests.TestCase_YaesuFT7100M)
Testing Yaesu FT-7100M settings ... ok
test_banks (tests.TestCase_IcomICP7)
Testing Icom IC-P7 banks ... ok
test_brute_force (tests.TestCase_IcomICP7)
Testing Icom IC-P7 brute force ... ok
test_clone (tests.TestCase_IcomICP7)
Testing Icom IC-P7 clone ... ok
test_copy_all (tests.TestCase_IcomICP7)
Testing Icom IC-P7 copy all ... ok
test_detect (tests.TestCase_IcomICP7)
Testing Icom IC-P7 detect ... ok
test_edges (tests.TestCase_IcomICP7)
Testing Icom IC-P7 edges ... ok
test_settings (tests.TestCase_IcomICP7)
Testing Icom IC-P7 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_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_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_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_YaesuFT65R)
Testing Yaesu FT-65R banks ... ok
test_brute_force (tests.TestCase_YaesuFT65R)
Testing Yaesu FT-65R brute force ... ok
test_clone (tests.TestCase_YaesuFT65R)
Testing Yaesu FT-65R clone ... ok
test_copy_all (tests.TestCase_YaesuFT65R)
Testing Yaesu FT-65R copy all ... ok
test_detect (tests.TestCase_YaesuFT65R)
Testing Yaesu FT-65R detect ... ok
test_edges (tests.TestCase_YaesuFT65R)
Testing Yaesu FT-65R edges ... ok
test_settings (tests.TestCase_YaesuFT65R)
Testing Yaesu FT-65R 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_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_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_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_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_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_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_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_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_QYTKT7900D)
Testing QYT KT7900D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_QYTKT7900D)
Testing QYT KT7900D brute force ... ok
test_clone (tests.TestCase_QYTKT7900D)
Testing QYT KT7900D clone ... ok
test_copy_all (tests.TestCase_QYTKT7900D)
Testing QYT KT7900D copy all ... ok
test_detect (tests.TestCase_QYTKT7900D)
Testing QYT KT7900D detect ... ok
test_edges (tests.TestCase_QYTKT7900D)
Testing QYT KT7900D edges ... ok
test_settings (tests.TestCase_QYTKT7900D)
Testing QYT KT7900D settings ... ok
test_banks (tests.TestCase_WouxunKGUVD1P)
Testing Wouxun KG-UVD1P banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKGUVD1P)
Testing Wouxun KG-UVD1P brute force ... ok
test_clone (tests.TestCase_WouxunKGUVD1P)
Testing Wouxun KG-UVD1P clone ... ok
test_copy_all (tests.TestCase_WouxunKGUVD1P)
Testing Wouxun KG-UVD1P copy all ... ok
test_detect (tests.TestCase_WouxunKGUVD1P)
Testing Wouxun KG-UVD1P detect ... ok
test_edges (tests.TestCase_WouxunKGUVD1P)
Testing Wouxun KG-UVD1P edges ... ok
test_settings (tests.TestCase_WouxunKGUVD1P)
Testing Wouxun KG-UVD1P 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_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_YaesuVX3)
Testing Yaesu VX-3 banks ... ok
test_brute_force (tests.TestCase_YaesuVX3)
Testing Yaesu VX-3 brute force ... ok
test_clone (tests.TestCase_YaesuVX3)
Testing Yaesu VX-3 clone ... ok
test_copy_all (tests.TestCase_YaesuVX3)
Testing Yaesu VX-3 copy all ... ok
test_detect (tests.TestCase_YaesuVX3)
Testing Yaesu VX-3 detect ... ok
test_edges (tests.TestCase_YaesuVX3)
Testing Yaesu VX-3 edges ... ok
test_settings (tests.TestCase_YaesuVX3)
Testing Yaesu VX-3 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_BaofengUV5R)
Testing Baofeng UV-5R banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengUV5R)
Testing Baofeng UV-5R brute force ... ok
test_clone (tests.TestCase_BaofengUV5R)
Testing Baofeng UV-5R clone ... ok
test_copy_all (tests.TestCase_BaofengUV5R)
Testing Baofeng UV-5R copy all ... ok
test_detect (tests.TestCase_BaofengUV5R)
Testing Baofeng UV-5R detect ... ok
test_edges (tests.TestCase_BaofengUV5R)
Testing Baofeng UV-5R edges ... ok
test_settings (tests.TestCase_BaofengUV5R)
Testing Baofeng UV-5R 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_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_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_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_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_KYDNC630A)
Testing KYD NC-630A banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KYDNC630A)
Testing KYD NC-630A brute force ... ok
test_clone (tests.TestCase_KYDNC630A)
Testing KYD NC-630A clone ... ok
test_copy_all (tests.TestCase_KYDNC630A)
Testing KYD NC-630A copy all ... ok
test_detect (tests.TestCase_KYDNC630A)
Testing KYD NC-630A detect ... ok
test_edges (tests.TestCase_KYDNC630A)
Testing KYD NC-630A edges ... ok
test_settings (tests.TestCase_KYDNC630A)
Testing KYD NC-630A settings ... ok
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_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_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_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_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_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_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_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_KenwoodTHD72clonemode)
Testing Kenwood TH-D72 (clone mode) banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTHD72clonemode)
Testing Kenwood TH-D72 (clone mode) brute force ... ok
test_clone (tests.TestCase_KenwoodTHD72clonemode)
Testing Kenwood TH-D72 (clone mode) clone ... ok
test_copy_all (tests.TestCase_KenwoodTHD72clonemode)
Testing Kenwood TH-D72 (clone mode) copy all ... ok
test_detect (tests.TestCase_KenwoodTHD72clonemode)
Testing Kenwood TH-D72 (clone mode) detect ... ok
test_edges (tests.TestCase_KenwoodTHD72clonemode)
Testing Kenwood TH-D72 (clone mode) edges ... ok
test_settings (tests.TestCase_KenwoodTHD72clonemode)
Testing Kenwood TH-D72 (clone mode) settings ... ok
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_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_BaofengF11)
Testing Baofeng F-11 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengF11)
Testing Baofeng F-11 brute force ... ok
test_clone (tests.TestCase_BaofengF11)
Testing Baofeng F-11 clone ... ok
test_copy_all (tests.TestCase_BaofengF11)
Testing Baofeng F-11 copy all ... ok
test_detect (tests.TestCase_BaofengF11)
Testing Baofeng F-11 detect ... ok
test_edges (tests.TestCase_BaofengF11)
Testing Baofeng F-11 edges ... ok
test_settings (tests.TestCase_BaofengF11)
Testing Baofeng F-11 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_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_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_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_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_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_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_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_YaesuFT78007900)
Testing Yaesu FT-7800/7900 banks ... ok
test_brute_force (tests.TestCase_YaesuFT78007900)
Testing Yaesu FT-7800/7900 brute force ... ok
test_clone (tests.TestCase_YaesuFT78007900)
Testing Yaesu FT-7800/7900 clone ... ok
test_copy_all (tests.TestCase_YaesuFT78007900)
Testing Yaesu FT-7800/7900 copy all ... ok
test_detect (tests.TestCase_YaesuFT78007900)
Testing Yaesu FT-7800/7900 detect ... ok
test_edges (tests.TestCase_YaesuFT78007900)
Testing Yaesu FT-7800/7900 edges ... ok
test_settings (tests.TestCase_YaesuFT78007900)
Testing Yaesu FT-7800/7900 settings ... ok
test_banks (tests.TestCase_YaesuVX2)
Testing Yaesu VX-2 banks ... ok
test_brute_force (tests.TestCase_YaesuVX2)
Testing Yaesu VX-2 brute force ... ok
test_clone (tests.TestCase_YaesuVX2)
Testing Yaesu VX-2 clone ... ok
test_copy_all (tests.TestCase_YaesuVX2)
Testing Yaesu VX-2 copy all ... ok
test_detect (tests.TestCase_YaesuVX2)
Testing Yaesu VX-2 detect ... ok
test_edges (tests.TestCase_YaesuVX2)
Testing Yaesu VX-2 edges ... ok
test_settings (tests.TestCase_YaesuVX2)
Testing Yaesu VX-2 settings ... ok
test_banks (tests.TestCase_WouxunKGUV8DPlus)
Testing Wouxun KG-UV8D Plus banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKGUV8DPlus)
Testing Wouxun KG-UV8D Plus brute force ... ok
test_clone (tests.TestCase_WouxunKGUV8DPlus)
Testing Wouxun KG-UV8D Plus clone ... ok
test_copy_all (tests.TestCase_WouxunKGUV8DPlus)
Testing Wouxun KG-UV8D Plus copy all ... ok
test_detect (tests.TestCase_WouxunKGUV8DPlus)
Testing Wouxun KG-UV8D Plus detect ... ok
test_edges (tests.TestCase_WouxunKGUV8DPlus)
Testing Wouxun KG-UV8D Plus edges ... ok
test_settings (tests.TestCase_WouxunKGUV8DPlus)
Testing Wouxun KG-UV8D Plus settings ... ok
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_KenwoodTK272G)
Testing Kenwood TK-272G banks ... ok
test_brute_force (tests.TestCase_KenwoodTK272G)
Testing Kenwood TK-272G brute force ... ok
test_clone (tests.TestCase_KenwoodTK272G)
Testing Kenwood TK-272G clone ... ok
test_copy_all (tests.TestCase_KenwoodTK272G)
Testing Kenwood TK-272G copy all ... ok
test_detect (tests.TestCase_KenwoodTK272G)
Testing Kenwood TK-272G detect ... ok
test_edges (tests.TestCase_KenwoodTK272G)
Testing Kenwood TK-272G edges ... ok
test_settings (tests.TestCase_KenwoodTK272G)
Testing Kenwood TK-272G settings ... ok
test_banks (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D brute force ... ok
test_clone (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D clone ... ok
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_YaesuVX6)
Testing Yaesu VX-6 banks ... ok
test_brute_force (tests.TestCase_YaesuVX6)
Testing Yaesu VX-6 brute force ... ok
test_clone (tests.TestCase_YaesuVX6)
Testing Yaesu VX-6 clone ... ok
test_copy_all (tests.TestCase_YaesuVX6)
Testing Yaesu VX-6 copy all ... ok
test_detect (tests.TestCase_YaesuVX6)
Testing Yaesu VX-6 detect ... ok
test_edges (tests.TestCase_YaesuVX6)
Testing Yaesu VX-6 edges ... ok
test_settings (tests.TestCase_YaesuVX6)
Testing Yaesu VX-6 settings ... ok
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_WouxunKGUV8E)
Testing Wouxun KG-UV8E banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKGUV8E)
Testing Wouxun KG-UV8E brute force ... ok
test_clone (tests.TestCase_WouxunKGUV8E)
Testing Wouxun KG-UV8E clone ... ok
test_copy_all (tests.TestCase_WouxunKGUV8E)
Testing Wouxun KG-UV8E copy all ... ok
test_detect (tests.TestCase_WouxunKGUV8E)
Testing Wouxun KG-UV8E detect ... ok
test_edges (tests.TestCase_WouxunKGUV8E)
Testing Wouxun KG-UV8E edges ... ok
test_settings (tests.TestCase_WouxunKGUV8E)
Testing Wouxun KG-UV8E 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_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_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_PuxingPX888K)
Testing Puxing PX-888K banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_PuxingPX888K)
Testing Puxing PX-888K brute force ... ok
test_clone (tests.TestCase_PuxingPX888K)
Testing Puxing PX-888K clone ... ok
test_copy_all (tests.TestCase_PuxingPX888K)
Testing Puxing PX-888K copy all ... ok
test_detect (tests.TestCase_PuxingPX888K)
Testing Puxing PX-888K detect ... ok
test_edges (tests.TestCase_PuxingPX888K)
Testing Puxing PX-888K edges ... ok
test_settings (tests.TestCase_PuxingPX888K)
Testing Puxing PX-888K 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_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_AnyToneOBLTR8R)
Testing AnyTone OBLTR-8R banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_AnyToneOBLTR8R)
Testing AnyTone OBLTR-8R brute force ... ok
test_clone (tests.TestCase_AnyToneOBLTR8R)
Testing AnyTone OBLTR-8R clone ... ok
test_copy_all (tests.TestCase_AnyToneOBLTR8R)
Testing AnyTone OBLTR-8R copy all ... ok
test_detect (tests.TestCase_AnyToneOBLTR8R)
Testing AnyTone OBLTR-8R detect ... ok
test_edges (tests.TestCase_AnyToneOBLTR8R)
Testing AnyTone OBLTR-8R edges ... ok
test_settings (tests.TestCase_AnyToneOBLTR8R)
Testing AnyTone OBLTR-8R 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_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_IcomICQ7A)
Testing Icom IC-Q7A banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_IcomICQ7A)
Testing Icom IC-Q7A brute force ... ok
test_clone (tests.TestCase_IcomICQ7A)
Testing Icom IC-Q7A clone ... ok
test_copy_all (tests.TestCase_IcomICQ7A)
Testing Icom IC-Q7A copy all ... ok
test_detect (tests.TestCase_IcomICQ7A)
Testing Icom IC-Q7A detect ... ok
test_edges (tests.TestCase_IcomICQ7A)
Testing Icom IC-Q7A edges ... ok
test_settings (tests.TestCase_IcomICQ7A)
Testing Icom IC-Q7A 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_IcomICT70)
Testing Icom IC-T70 banks ... ok
test_brute_force (tests.TestCase_IcomICT70)
Testing Icom IC-T70 brute force ... ok
test_clone (tests.TestCase_IcomICT70)
Testing Icom IC-T70 clone ... ok
test_copy_all (tests.TestCase_IcomICT70)
Testing Icom IC-T70 copy all ... ok
test_detect (tests.TestCase_IcomICT70)
Testing Icom IC-T70 detect ... ok
test_edges (tests.TestCase_IcomICT70)
Testing Icom IC-T70 edges ... ok
test_settings (tests.TestCase_IcomICT70)
Testing Icom IC-T70 settings ... skipped 'Settings not supported'
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_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_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_PuxingPX777)
Testing Puxing PX-777 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_PuxingPX777)
Testing Puxing PX-777 brute force ... ok
test_clone (tests.TestCase_PuxingPX777)
Testing Puxing PX-777 clone ... ok
test_copy_all (tests.TestCase_PuxingPX777)
Testing Puxing PX-777 copy all ... ok
test_detect (tests.TestCase_PuxingPX777)
Testing Puxing PX-777 detect ... ok
test_edges (tests.TestCase_PuxingPX777)
Testing Puxing PX-777 edges ... ok
test_settings (tests.TestCase_PuxingPX777)
Testing Puxing PX-777 settings ... skipped 'Settings not supported'
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_AlincoDR235T)
Testing Alinco DR235T banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_AlincoDR235T)
Testing Alinco DR235T brute force ... ok
test_clone (tests.TestCase_AlincoDR235T)
Testing Alinco DR235T clone ... ok
test_copy_all (tests.TestCase_AlincoDR235T)
Testing Alinco DR235T copy all ... ok
test_detect (tests.TestCase_AlincoDR235T)
Testing Alinco DR235T detect ... ok
test_edges (tests.TestCase_AlincoDR235T)
Testing Alinco DR235T edges ... ok
test_settings (tests.TestCase_AlincoDR235T)
Testing Alinco DR235T settings ... skipped 'Settings not supported'
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_YaesuVX5)
Testing Yaesu VX-5 banks ... ok
test_brute_force (tests.TestCase_YaesuVX5)
Testing Yaesu VX-5 brute force ... ok
test_clone (tests.TestCase_YaesuVX5)
Testing Yaesu VX-5 clone ... ok
test_copy_all (tests.TestCase_YaesuVX5)
Testing Yaesu VX-5 copy all ... ok
test_detect (tests.TestCase_YaesuVX5)
Testing Yaesu VX-5 detect ... ok
test_edges (tests.TestCase_YaesuVX5)
Testing Yaesu VX-5 edges ... ok
test_settings (tests.TestCase_YaesuVX5)
Testing Yaesu VX-5 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_WouxunKGUV9DPlus)
Testing Wouxun KG-UV9D Plus banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKGUV9DPlus)
Testing Wouxun KG-UV9D Plus brute force ... ok
test_clone (tests.TestCase_WouxunKGUV9DPlus)
Testing Wouxun KG-UV9D Plus clone ... ok
test_copy_all (tests.TestCase_WouxunKGUV9DPlus)
Testing Wouxun KG-UV9D Plus copy all ... ok
test_detect (tests.TestCase_WouxunKGUV9DPlus)
Testing Wouxun KG-UV9D Plus detect ... ok
test_edges (tests.TestCase_WouxunKGUV9DPlus)
Testing Wouxun KG-UV9D Plus edges ... ok
test_settings (tests.TestCase_WouxunKGUV9DPlus)
Testing Wouxun KG-UV9D Plus settings ... ok
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_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_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_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
----------------------------------------------------------------------
Ran 847 tests in 239.921s
OK (skipped=117)
style create: /chirp/.tox/style
style installdeps: pep8==1.6.2
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,filelock==3.0.10,Mako==1.0.3,MarkupSafe==0.23,mercurial==3.7.3,pep8==1.6.2,pluggy==0.8.1,py==1.7.0,pygobject==3.20.0,pyserial==3.0.1,six==1.12.0,toml==0.10.0,tox==3.7.0,virtualenv==16.4.0
style run-test-pre: PYTHONHASHSEED='3762684545'
style runtests: commands[0] | python ./tools/cpep8.py
___________________________________ summary ____________________________________
unit: commands succeeded
driver: commands succeeded
style: commands succeeded
congratulations :)
Email was triggered for: Success
Sending email for trigger: Success
1
0
I've read #174, #375, and #807, and it appears Drew had a look, but did not complete the project.
Is there any other information available regarding support for the IC-V80?
Thanks,
--JRW
John R. Wolfe, KF7ECO
1
0
I haven't seen this submission come back to my developer's inbox, so
here it is again--
# HG changeset patch
# User Rick DeWitt <aa0rd(a)yahoo.com>
# Date 1559148360 25200
#?????????? Wed May 29 09:46:00 2019 -0700
# Node ID 0815b185dbcbaccb3590a95568a8da25e899f4b0
# Parent?? 76c88493bd3f873d355d08e66c624c6acf201b4d
[th-uv8000] New driver for TYT TH-UV8000 family, fixes issue #2837
Submitting new driver in support of 11 issues 2837 ... 6183
diff -r 76c88493bd3f -r 0815b185dbcb chirp/drivers/th_uv8000.py
--- /dev/null?????? Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/drivers/th_uv8000.py?????? Wed May 29 09:46:00 2019 -0700
@@ -0,0 +1,1582 @@
+# Copyright 2019: Rick DeWitt (RJD), <aa0rd(a)yahoo.com>
+# Version 1.0 for TYT-UV8000D/E
+# Thanks to Damon Schaefer (K9CQB)and the Loudoun County, VA ARES
+#?????? club for the donated radio.
+# And thanks to Ian Harris (W2OOT) for decoding the mamory map.
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.?? See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.?? If not, see <http://www.gnu.org/licenses/>.
+
+import time
+import struct
+import logging
+import re
+import math
+
+LOG = logging.getLogger(__name__)
+
+from chirp import chirp_common, directory, memmap
+from chirp import bitwise, errors, util
+from chirp.settings import RadioSettingGroup, RadioSetting, \
+?????? RadioSettingValueBoolean, RadioSettingValueList, \
+?????? RadioSettingValueString, RadioSettingValueInteger, \
+?????? RadioSettingValueFloat, RadioSettings,InvalidValueError
+from textwrap import dedent
+
+MEM_FORMAT = """
+struct chns {
+?? ul32 rxfreq;
+?? ul32 txfreq;
+?? u8 rxtone[2];
+?? u8 txtone[2];
+?? u8?? wide:1???? // 0x0c
+?????????? vox_on:1
+?????????? chunk01:1
+?????????? bcl:1?????? // inv bool
+?????????? epilogue:1
+?????????? power:1
+?????????? chunk02:1
+?????????? chunk03:1;
+?? u8?? ani:1???????? // 0x0d inv
+?????????? chunk08:1
+?????????? ptt:2
+?????????? chpad04:4;
+?? u8?? chunk05;?? // 0x0e
+?? u16 id_code; // 0x0f, 10
+?? u8?? chunk06;
+?? u8?? name[7];
+?? ul32 chpad06; // Need 56 byte pad
+?? ul16 chpad07;
+?? u8?? chpad08;
+};
+
+struct fm_chn {
+?? ul16 rxfreq;
+};
+
+struct frqx {
+?? ul32 rxfreq;
+?? ul24 ofst;
+?? u8?? fqunk01:4?? // 0x07
+?????????? funk10:2
+?????????? duplx:2;
+?? u8 rxtone[2]; // 0x08, 9
+?? u8 txtone[2]; // 0x0a, b
+?? u8?? wide:1?????? // 0x0c
+?????????? vox_on:1
+?????????? funk11:1
+?????????? bcl:1???????? // inv bool
+?????????? epilogue:1
+?????????? power:1
+?????????? fqunk02:2;
+?? u8?? ani:1???????? // 0x0d inv bool
+?????????? fqunk03:1
+?????????? ptt:2
+?????????? fqunk12:1
+?????????? fqunk04:3;
+?? u8?? fqunk07;?? // 0x0e
+?? u16 id_code;?? // 0x0f, 0x10
+?? u8?? name[7];?????? // dummy
+?? u8 fqunk09[8];?? // empty bytes after 1st entry
+};
+
+struct bitmap {
+?? u8?? map[16];
+};
+
+#seekto 0x0010;
+struct chns chan_mem[128];
+
+#seekto 0x1010;
+struct frqx frq[2];
+
+#seekto 0x1050;
+struct fm_chn fm_stations[25];
+
+#seekto 0x1080;
+struct {
+?? u8?? fmunk01[14];
+?? ul16 fmcur;
+} fmfrqs;
+
+#seekto 0x1190;
+struct bitmap chnmap;
+
+#seekto 0x11a0;
+struct bitmap skpchns;
+
+#seekto 0x011b0;
+struct {
+?? u8?? fmset[4];
+} fmmap;
+
+#seekto 0x011b4;
+struct {
+?? u8?? setunk01[4];
+?? u8?? setunk02[3];
+?? u8?? chs_name:1?????? // 0x11bb
+?????????? txsel:1
+?????????? dbw:1
+?????????? setunk05:1
+?????????? ponfmchs:2
+?????????? ponchs:2;
+?? u8?? voltx:2???????????? // 0x11bc
+?????????? setunk04:1
+?????????? keylok:1
+?????????? setunk07:1
+?????????? batsav:3;
+?? u8?? setunk09:1?????? // 0x11bd
+?????????? rxinhib:1
+?????????? rgrbeep:1?????? // inv bool
+?????????? lampon:2
+?????????? voice:2
+?????????? beepon:1;
+?? u8?? setunk11:1?????? // 0x11be
+?????????? manualset:1
+?????????? xbandon:1???????? // inv
+?????????? xbandenable:1
+?????????? openmsg:2
+?????????? ledclr:2;
+?? u8?? tot:4???????????????? // 0x11bf
+?????????? sql:4;
+?? u8?? setunk27:1???? // 0x11c0
+?????????? voxdelay:2
+?????????? setunk28:1
+?????????? voxgain:4;
+?? u8?? fmstep:4?????????? // 0x11c1
+?????????? freqstep:4;
+?? u8?? scanspeed:4???? // 0x11c2
+?????????? scanmode:4;
+?? u8?? scantmo;?????????? // 0x11c3
+?? u8?? prichan;?????????? // 0x11c4
+?? u8?? setunk12:4?????? // 0x11c5
+?????????? supersave:4;
+?? u8?? setunk13;
+?? u8?? fmsclo;???????????? // 0x11c7 ??? placeholder
+?? u8?? radioname[7]; // hex char codes, not true ASCII
+?? u8?? fmschi;???????????? // ??? placeholder
+?? u8?? setunk14[3];?? // 0x11d0
+?? u8 setunk17[2];???? // 0x011d3, 4
+?? u8?? setunk18:4
+?????????? dtmfspd:4;
+?? u8?? dtmfdig1dly:4 // 0x11d6
+?????????? dtmfdig1time:4;
+?? u8?? stuntype:1
+?????????? setunk19:1
+?????????? dtmfspms:2
+?????????? grpcode:4;
+?? u8?? setunk20:1?????? // 0x11d8
+?????????? txdecode:1
+?????????? codeabcd:1
+?????????? idedit:1
+?????????? pttidon:2
+?????????? setunk40:1,
+?????????? dtmfside:1;
+?? u8?? setunk50:4,
+?????????? autoresettmo:4;
+?? u8?? codespctim:4, // 0x11da
+?????????? decodetmo:4;
+?? u8?? pttecnt:4???????? // 0x11db
+?????????? pttbcnt:4;
+?? lbcd?? dtmfdecode[3];
+?? u8?? setunk22;
+?? u8?? stuncnt;?????????? // 0x11e0
+?? u8?? stuncode[5];
+?? u8?? setunk60;
+?? u8?? setunk61;
+?? u8?? pttbot[8];?????? // 0x11e8-f
+?? u8?? ptteot[8];?????? // 0x11f0-7
+?? u8?? setunk62;???????? // 0x11f8
+?? u8?? setunk63;
+?? u8?? setunk64;???????? // 0x11fa
+?? u8?? setunk65;
+?? u8?? setunk66;
+?? u8?? manfrqyn;???????? // 0x11fd
+?? u8?? setunk27:3
+?????????? frqr3:1
+?????????? setunk28:1
+?????????? frqr2:1
+?????????? setunk29:1
+?????????? frqr1:1;
+?? u8?? setunk25;
+?? ul32 frqr1lo;?? // 0x1200
+?? ul32 frqr1hi;
+?? ul32 frqr2lo;
+?? ul32 frqr2hi;
+?? ul32 frqr3lo;?? // 0x1210
+?? ul32 frqr3hi;
+?? u8 setunk26[8];
+} setstuf;
+
+#seekto 0x1260;
+struct {
+?? u8 modnum[7];
+} modcode;
+
+#seekto 0x1300;
+struct {
+?? char?? mod_num[9];
+} mod_id;
+"""
+
+MEM_SIZE = 0x1300
+BLOCK_SIZE = 0x10???? # can read 0x20, but must write 0x10
+STIMEOUT = 2
+BAUDRATE = 4800
+# Channel power: 2 levels
+POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=5.00),
+?????????????????????????????? chirp_common.PowerLevel("High", watts=10.00)]
+
+LIST_RECVMODE = ["QT/DQT", "QT/DQT + Signaling"]
+LIST_COLOR = ["Off", "Orange", "Blue", "Purple"]
+LIST_LEDSW = ["Auto", "On"]
+LIST_TIMEOUT = ["Off"] + ["%s" % x for x in range(30, 390, 30)]
+LIST_VFOMODE = ["Frequency Mode", "Channel Mode"]
+# Tones are numeric, Defined in \chirp\chirp_common.py
+TONES_CTCSS = sorted(chirp_common.TONES)
+# Converted to strings
+LIST_CTCSS = ["Off"] + [str(x) for x in TONES_CTCSS]
+# Now append the DxxxN and DxxxI DTCS codes from chirp_common
+for x in chirp_common.DTCS_CODES:
+?????? LIST_CTCSS.append("D{:03d}N".format(x))
+for x in chirp_common.DTCS_CODES:
+?????? LIST_CTCSS.append("D{:03d}R".format(x))
+LIST_BW = ["Narrow", "Wide"]
+LIST_SHIFT = ["off", "+", "-"]
+STEPS = [0.5, 2.5, 5.0, 6.25, 10.0, 12.5, 25.0, 37.5, 50.0, 100.0]
+LIST_STEPS = [str(x) for x in STEPS]
+LIST_VOXDLY = ["0.5", "1.0", "2.0", "3.0"]?????????? # LISTS must be strings
+LIST_PTT = ["Both", "EoT", "BoT", "Off"]
+
+SETTING_LISTS = {
+"tot": LIST_TIMEOUT,
+"wtled": LIST_COLOR,
+"rxled": LIST_COLOR,
+"txled": LIST_COLOR,
+"ledsw": LIST_LEDSW,
+"frq_chn_mode": LIST_VFOMODE,
+"rx_tone": LIST_CTCSS,
+"tx_tone": LIST_CTCSS,
+"rx_mode": LIST_RECVMODE,
+"fm_bw": LIST_BW,
+"shift": LIST_SHIFT,
+"step": LIST_STEPS,
+"vox_dly": LIST_VOXDLY,
+"ptt": LIST_PTT
+}
+
+def _clean_buffer(radio):
+?????? radio.pipe.timeout = 0.005
+?????? junk = radio.pipe.read(256)
+?????? radio.pipe.timeout = STIMEOUT
+?????? if junk:
+?????????????? Log.debug("Got %i bytes of junk before starting" % len(junk))
+
+
+def _rawrecv(radio, amount):
+?????? """Raw read from the radio device"""
+?????? data = ""
+?????? try:
+?????????????? data = radio.pipe.read(amount)
+?????? except:
+?????????????? _exit_program_mode(radio)
+?????????????? msg = "Generic error reading data from radio; check your cable."
+?????????????? raise errors.RadioError(msg)
+
+?????? if len(data) != amount:
+?????????????? _exit_program_mode(radio)
+?????????????? msg = "Error reading from radio: not the amount of data we want."
+?????????????? raise errors.RadioError(msg)
+
+?????? return data
+
+
+def _rawsend(radio, data):
+?????? """Raw send to the radio device"""
+?????? try:
+?????????????? radio.pipe.write(data)
+?????? except:
+?????????????? raise errors.RadioError("Error sending data to radio")
+
+
+def _make_frame(cmd, addr, length, data=""):
+?????? """Pack the info in the headder format"""
+?????? frame = struct.pack(">shB", cmd, addr, length)
+?????? # Add the data if set
+?????? if len(data) != 0:
+?????????????? frame += data
+?????? # Return the data
+?????? return frame
+
+
+def _recv(radio, addr, length):
+?????? """Get data from the radio """
+
+?????? data = _rawrecv(radio, length)
+
+?????? # DEBUG
+?????? LOG.info("Response:")
+?????? LOG.debug(util.hexprint(data))
+
+?????? return data
+
+
+def _do_ident(radio):
+?????? """Put the radio in PROGRAM mode & identify it"""
+?????? radio.pipe.baudrate = BAUDRATE
+?????? radio.pipe.parity = "N"
+?????? radio.pipe.timeout = STIMEOUT
+
+?????? # Flush input buffer
+?????? _clean_buffer(radio)
+
+?????? magic = "PROGRAMa"
+?????? _rawsend(radio, magic)
+?????? ack = _rawrecv(radio, 1)
+?????? # LOG.warning("PROGa Ack:" + util.hexprint(ack))
+?????? if ack != "\x06":
+?????????????? _exit_program_mode(radio)
+?????????????? if ack:
+?????????????????????? LOG.debug(repr(ack))
+?????????????? raise errors.RadioError("Radio did not respond")
+?????? magic = "PROGRAMb"
+?????? _rawsend(radio, magic)
+?????? ack = _rawrecv(radio, 1)
+?????? if ack != "\x06":
+?????????????? _exit_program_mode(radio)
+?????????????? if ack:
+?????????????????????? LOG.debug(repr(ack))
+?????????????? raise errors.RadioError("Radio did not respond to B")
+?????? magic = chr(0x02)
+?????? _rawsend(radio, magic)
+?????? ack = _rawrecv(radio, 1)?????? # s/b: 0x50
+?????? magic = _rawrecv(radio, 7)?? # s/b TC88...
+?????? magic = "MTC88CUMHS3E7BN-"
+?????? _rawsend(radio, magic)
+?????? ack = _rawrecv(radio, 1)?????? # s/b 0x80
+?????? magic = chr(0x06)
+?????? _rawsend(radio, magic)
+?????? ack = _rawrecv(radio, 1)
+
+?????? return True
+
+
+def _exit_program_mode(radio):
+?????? endframe = "E"
+?????? _rawsend(radio, endframe)
+
+
+def _download(radio):
+?????? """Get the memory map"""
+
+?????? # Put radio in program mode and identify it
+?????? _do_ident(radio)
+
+?????? # UI progress
+?????? status = chirp_common.Status()
+?????? status.cur = 0
+?????? status.max = MEM_SIZE / BLOCK_SIZE
+?????? status.msg = "Cloning from radio..."
+?????? radio.status_fn(status)
+
+?????? data = ""
+?????? for addr in range(0, MEM_SIZE, BLOCK_SIZE):
+?????????????? frame = _make_frame("R", addr, BLOCK_SIZE)
+?????????????? # DEBUG
+?????????????? LOG.info("Request sent:")
+?????????????? LOG.debug("Frame=" + util.hexprint(frame))
+
+?????????????? # Sending the read request
+?????????????? _rawsend(radio, frame)
+?????????????? dx = _rawrecv(radio, 4)
+
+?????????????? # Now we read data
+?????????????? d = _recv(radio, addr, BLOCK_SIZE)
+?????????????? # LOG.warning("Data= " + util.hexprint(d))
+
+?????????????? # Aggregate the data
+?????????????? data += d
+
+?????????????? # UI Update
+?????????????? status.cur = addr / BLOCK_SIZE
+?????????????? status.msg = "Cloning from radio..."
+?????????????? radio.status_fn(status)
+
+?????? _exit_program_mode(radio)
+?????? # Append the model number to the downloaded memory
+?????? data += radio.MODEL.ljust(9)
+
+?????? return data
+
+def _upload(radio):
+?????? """Upload procedure"""
+?????? # Put radio in program mode and identify it
+?????? _do_ident(radio)
+
+?????? # UI progress
+?????? status = chirp_common.Status()
+?????? status.cur = 0
+?????? status.max = MEM_SIZE / BLOCK_SIZE
+?????? status.msg = "Cloning to radio..."
+?????? radio.status_fn(status)
+
+?????? # The fun starts here
+?????? for addr in range(0, MEM_SIZE, BLOCK_SIZE):
+?????????????? # Sending the data
+?????????????? data = radio.get_mmap()[addr:addr + BLOCK_SIZE]
+
+?????????????? frame = _make_frame("W", addr, BLOCK_SIZE, data)
+?????????????? # LOG.warning("Frame:%s:" % util.hexprint(frame))
+?????????????? _rawsend(radio, frame)
+
+?????????????? # Receiving the response
+?????????????? ack = _rawrecv(radio, 1)
+?????????????? if ack != "\x06":
+?????????????????????? _exit_program_mode(radio)
+?????????????????????? msg = "Bad ack writing block 0x%04x" % addr
+?????????????????????? raise errors.RadioError(msg)
+
+?????????????? # UI Update
+?????????????? status.cur = addr / BLOCK_SIZE
+?????????????? status.msg = "Cloning to radio..."
+?????????????? radio.status_fn(status)
+
+?????? _exit_program_mode(radio)
+
+def force_odd(fmfrq):
+?????? """Force FM Broadcast Frequency to have odd KHz """
+?????? oddfrq = int(fmfrq / 100000)?????? # remove 10Khz and lower
+?????? if (oddfrq % 2) == 0:?????? # increment to odd
+?????????????? oddfrq += 1
+?????? return (oddfrq * 100000)
+
+def set_tone(_mem, txrx, ctdt, tval, pol):
+?????? """Set rxtone[] or txtone[] word values as decimal bytes"""
+?????? # txrx: Boolean T= set Rx tones, F= set Tx tones
+?????? # ctdt: Boolean T = CTCSS, F= DTCS
+?????? # tval = integer tone freq (*10) or DTCS code
+?????? # pol = string for DTCS polarity "R" or "N"
+?????? xv = int(str(tval), 16)
+?????? if txrx:?????????????? # True = set rxtones
+?????????????? _mem.rxtone[0] = xv & 0xFF?? # Low byte
+?????????????? _mem.rxtone[1] = (xv >> 8)???? # Hi byte
+?????????????? if not ctdt:?????? # dtcs,
+?????????????????????? if pol == "R":
+?????????????????????????????? _mem.rxtone[1] = _mem.rxtone[1] | 0xC0
+?????????????????????? else:
+?????????????????????????????? _mem.rxtone[1] = _mem.rxtone[1] | 0x80
+?????? else:???????????????????? # txtones
+?????????????? _mem.txtone[0] = xv & 0xFF?? # Low byte
+?????????????? _mem.txtone[1] = (xv >> 8)
+?????????????? if not ctdt:?????? # dtcs
+?????????????????????? if pol == "R":
+?????????????????????????????? _mem.txtone[1] = _mem.txtone[1] | 0xC0
+?????????????????????? else:
+?????????????????????????????? _mem.txtone[1] = _mem.txtone[1] | 0x80
+
+?????? return 0
+
+def model_match(cls, data):
+?????? """Match the opened/downloaded image to the correct version"""
+?????? if len(data) == 0x1307:
+?????????????? rid = data[0x1300:0x1309]
+?????????????? return rid.startswith(cls.MODEL)
+?????? else:
+?????????????? return False
+
+def _do_map(chn, sclr, mary):
+?????? """Set or Clear the chn (1-128) bit in mary[] word array map"""
+?????? # chn is 1-based channel, sclr:1 = set, 0= = clear, 2= return state
+?????? # mary[] is u8 array, but the map is by nibbles
+?????? ndx = int(math.floor((chn - 1) / 8))
+?????? bv = (chn -1) % 8
+?????? msk = 1 << bv
+?????? mapbit = sclr
+?????? if sclr == 1:?????? # Set the bit
+?????????????? mary[ndx] = mary[ndx] | msk
+?????? elif sclr == 0:?? # clear
+?????????????? mary[ndx] = mary[ndx] & (~ msk)???????? # ~ is complement
+?????? else:???????????? # return current bit state
+?????????????? mapbit = 0
+?????????????? if (mary[ndx] & msk) > 0: mapbit = 1
+?????? # LOG.warning("-?? Do_Map chn %d, sclr= %d, ndx= %d" % (chn, sclr, ndx))
+?????? # LOG.warning("-?? bv= %d, msk = %02x, mapbit= %d" % (bv, msk, mapbit))
+?????? # LOG.warning("-?? mary[%d] = %02x" % (ndx, mary[ndx]))
+?????? return mapbit
+
+(a)directory.register
+class tyt_uv8000d(chirp_common.CloneModeRadio):
+?????? """TYT UV8000D Radio"""
+?????? VENDOR = "TYT"
+?????? MODEL = "TH-UV8000"
+?????? MODES = ["NFM", "FM"]
+?????? TONES = chirp_common.TONES
+?????? DTCS_CODES = sorted(chirp_common.DTCS_CODES + [645])
+?????? NAME_LENGTH = 7
+?????? DTMF_CHARS = list("0123456789ABCD*#")
+?????? # NOTE: SE Model supports 220-260 MHz
+?????? # The following bands are the the range the radio is capable of,
+?????? #???? not the legal FCC amateur bands
+?????? VALID_BANDS = [(87500000, 107900000), (136000000, 174000000),
+???????????????????????????????????? (220000000, 260000000), (400000000, 520000000)]
+
+?????? # Valid chars on the LCD
+?????? VALID_CHARS = chirp_common.CHARSET_ALPHANUMERIC + \
+???????????????????? "`!\"#$%&'()*+,-./:;<=>?@[]^_"
+
+?????? # Special Channels Declaration
+?????? # WARNING Indecis are hard wired in get/set_memory code !!!
+?????? # Channels print in + increasing index order (most negative first)
+?????? SPECIAL_MEMORIES = {
+???????????? "FM 25": -3,
+???????????? "FM 24": -4,
+???????????? "FM 23": -5,
+???????????? "FM 22": -6,
+???????????? "FM 21": -7,
+???????????? "FM 20": -8,
+???????????? "FM 19": -9,
+???????????? "FM 18": -10,
+???????????? "FM 17": -11,
+???????????? "FM 16": -12,
+???????????? "FM 15": -13,
+???????????? "FM 14": -14,
+???????????? "FM 13": -15,
+???????????? "FM 12": -16,
+???????????? "FM 11": -17,
+???????????? "FM 10": -18,
+???????????? "FM 09": -19,
+???????????? "FM 08": -20,
+???????????? "FM 07": -21,
+???????????? "FM 06": -22,
+???????????? "FM 05": -23,
+???????????? "FM 04": -24,
+???????????? "FM 03": -25,
+???????????? "FM 02": -26,
+???????????? "FM 01": -27
+?????? }
+?????? FIRST_FM_INDEX = -3
+?????? LAST_FM_INDEX = -27
+
+?????? SPECIAL_FREQ = {
+???????????? "UpVFO": -2,
+???????????? "LoVFO": -1
+?????? }
+?????? FIRST_FREQ_INDEX = -1
+?????? LAST_FREQ_INDEX = -2
+?????? SPECIAL_MEMORIES.update(SPECIAL_FREQ)
+
+?????? SPECIAL_MEMORIES_REV = dict(zip(SPECIAL_MEMORIES.values(),
+?????????????????????????????????????????????????????????????????????? SPECIAL_MEMORIES.keys()))
+
+?????? @classmethod
+?????? def get_prompts(cls):
+?????????????? rp = chirp_common.RadioPrompts()
+?????????????? rp.info = \
+?????????????????????? ('NOTE 1: Some of these radios come shipped with the
frequency '
+???????????????????????? 'ranges locked to comply with FCC band limitations.\n'
+???????????????????????? 'This driver allows the user to program frequencies outside '
+???????????????????????? 'the legal amateur bands, so that they can receive on
marine, '
+???????????????????????? 'aviation, FRS/GMRS and NOAA weather bands.\n'
+???????????????????????? 'If these frequencies are locked out on your radio, '
+???????????????????????? 'you will receive an error beep when attempting to operate.\n'
+???????????????????????? 'It is the users responsibility to only transmit on '
+???????????????????????? 'authorized freqencies. \n\n'
+???????????????????????? 'NOTE 2: Click on the "Special Channels" tab of the layout '
+???????????????????????? 'screen to see/set the upper and lower frequency-mode
values, '
+???????????????????????? 'as well as the 25 FM broadcast radio station channels.\n\n'
+???????????????????????? 'NOTE 3: The PTT ID codes are 1-16 characters of DTMF (0-9, '
+???????????????????????? 'A-D,*,#). The per-channel ANI Id Codes are not
implemented at '
+???????????????????????? 'this time. However they may be set manually by using the '
+???????????????????????? 'Browser developer tool. Contact Rick at AA0RD(a)Yahoo.com.\n\n'
+???????????????????????? 'NOTE 4: To access the stored FM broadcast stations:
activate '
+???????????????????????? 'FM mode (F, MONI), then # and up/down.'
+?????????????????????? )
+
+?????????????? rp.pre_download = _(dedent("""\
+?????????????????????? Follow these instructions to download your config:
+
+?????????????????????? 1 - Turn off your radio
+?????????????????????? 2 - Connect your interface cable
+?????????????????????? 3 - Turn on your radio, volume @ 50%
+?????????????????????? 4 - Radio > Download from radio
+?????????????????????? """))
+?????????????? rp.pre_upload = _(dedent("""\
+?????????????????????? Follow this instructions to upload your config:
+
+?????????????????????? 1 - Turn off your radio
+?????????????????????? 2 - Connect your interface cable
+?????????????????????? 3 - Turn on your radio, volume @ 50%
+?????????????????????? 4 - Radio > Upload to radio
+?????????????????????? """))
+?????????????? return rp
+
+?????? def get_features(self):
+?????????????? rf = chirp_common.RadioFeatures()
+?????????????? # .has. attributes are boolean, .valid. are lists
+?????????????? rf.has_settings = True
+?????????????? rf.has_bank = False
+?????????????? rf.has_comment = False
+?????????????? rf.has_tuning_step = False?? # Not as chan feature
+?????????????? rf.can_odd_split = False
+?????????????? rf.has_name = True
+?????????????? rf.has_offset = True
+?????????????? rf.has_mode = True
+?????????????? rf.has_dtcs = True
+?????????????? rf.has_rx_dtcs = True
+?????????????? rf.has_dtcs_polarity = True
+?????????????? rf.has_ctone = True
+?????????????? rf.has_cross = True
+?????????????? rf.has_sub_devices = False
+?????????????? rf.valid_name_length = self.NAME_LENGTH
+?????????????? rf.valid_modes = self.MODES
+?????????????? rf.valid_characters = self.VALID_CHARS
+?????????????? rf.valid_duplexes = ["-", "+", "off", ""]
+?????????????? rf.valid_tmodes = ['', 'Tone', 'TSQL', 'DTCS', 'Cross']
+?????????????? rf.valid_cross_modes = [
+?????????????????????? "Tone->Tone",
+?????????????????????? "DTCS->",
+?????????????????????? "->DTCS",
+?????????????????????? "Tone->DTCS",
+?????????????????????? "DTCS->Tone",
+?????????????????????? "->Tone",
+?????????????????????? "DTCS->DTCS"]
+?????????????? rf.valid_skips = []
+?????????????? rf.valid_power_levels = POWER_LEVELS
+?????????????? rf.valid_dtcs_codes = self.DTCS_CODES
+?????????????? rf.valid_bands = self.VALID_BANDS
+?????????????? rf.memory_bounds = (1, 128)
+?????????????? rf.valid_skips = ["", "S"]
+?????????????? rf.valid_special_chans = sorted(self.SPECIAL_MEMORIES.keys())
+?????????????? return rf
+
+?????? def sync_in(self):
+?????????????? """Download from radio"""
+?????????????? try:
+?????????????????????? data = _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 = memmap.MemoryMap(data)
+?????????????? self.process_mmap()
+
+?????? def sync_out(self):
+?????????????? """Upload to radio"""
+
+?????????????? try:
+?????????????????????? _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 process_mmap(self):
+?????????????? """Process the mem map into the mem object"""
+?????????????? self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)
+
+?????? def get_raw_memory(self, number):
+?????????????? return repr(self._memobj.memory[number - 1])
+
+?????? def get_memory(self, number):
+?????????????? if isinstance(number, str):
+?????????????????????? return self._get_special(number)
+?????????????? elif number < 0:
+?????????????????????? # I can't stop delete operation from loosing extd_number but
+?????????????????????? # I know how to get it back
+?????????????????????? return self._get_special(self.SPECIAL_MEMORIES_REV[number])
+?????????????? else:
+?????????????????????? return self._get_normal(number)
+
+?????? def set_memory(self, memory):
+?????????????? """A value in a UI column for chan 'number' has been modified."""
+?????????????? # update all raw channel memory values (_mem) from UI (mem)
+?????????????? if memory.number < 0:
+?????????????????????? return self._set_special(memory)
+?????????????? else:
+?????????????????????? return self._set_normal(memory)
+
+?????? def _get_fm_memory(self, mem, _mem):
+?????????????? mem.name = "----"
+?????????????? rx = self._memobj.fm_stations[mem.number + 2].rxfreq
+?????????????? if rx == 0xFFFF:
+?????????????????????? mem.empty = True
+?????????????????????? return mem
+?????????????? else:
+?????????????????????? mem.freq = (float(int(rx)) / 40) * 1000000
+?????????????????????? mem.empty = False
+
+?????????????? mem.offset = 0.0
+?????????????? mem.power = 0
+?????????????? mem.duplex = "off"?????????? # inhibits tx
+?????????????? mem.mode = self.MODES[1]
+?????????????? dtcs_pol = ["N", "N"]
+?????????????? mem.ctone = 88.5
+?????????????? mem.rtone = 88.5
+?????????????? mem.tmode = ""
+?????????????? mem.cross_mode = "Tone->Tone"
+?????????????? mem.skip = ""
+?????????????? mem.comment = ""
+
+?????????????? return mem
+
+?????? def _get_normal(self, number):
+?????????????? # radio first channel is 1, mem map is base 0
+?????????????? _mem = self._memobj.chan_mem[number - 1]
+?????????????? mem = chirp_common.Memory()
+?????????????? mem.number = number
+
+?????????????? return self._get_memory(mem, _mem)
+
+?????? def _get_memory(self, mem, _mem):
+?????????????? """Convert raw channel memory data into UI columns"""
+?????????????? mem.extra = RadioSettingGroup("extra", "Extra")
+
+?????????????? if _mem.get_raw()[0] == "\xff":
+?????????????????????? mem.empty = True
+?????????????????????? return mem
+
+?????????????? mem.empty = False
+?????????????? # This function process both 'normal' and Freq up/down' entries
+?????????????? mem.freq = int(_mem.rxfreq) * 10
+?????????????? mem.power = POWER_LEVELS[_mem.power]
+?????????????? mem.mode = self.MODES[_mem.wide]
+?????????????? dtcs_pol = ["N", "N"]
+
+?????????????? if _mem.rxtone[0] == 0xFF:
+?????????????????????? rxmode = ""
+?????????????? elif _mem.rxtone[1] < 0x26:
+?????????????????????? # CTCSS
+?????????????????????? rxmode = "Tone"
+?????????????????????? tonehi = int(str(_mem.rxtone[1])[2:])
+?????????????????????? tonelo = int(str(_mem.rxtone[0])[2:])
+?????????????????????? mem.ctone = int(tonehi * 100 + tonelo) / 10.0
+?????????????? else:
+?????????????????????? # Digital
+?????????????????????? rxmode = "DTCS"
+?????????????????????? tonehi = int(str(_mem.rxtone[1] & 0x3f))
+?????????????????????? tonelo = int(str(_mem.rxtone[0])[2:])
+?????????????????????? mem.rx_dtcs = int(tonehi * 100 + tonelo)
+?????????????????????? if (_mem.rxtone[1] & 0x40) != 0:
+?????????????????????????????? dtcs_pol[1] = "R"
+
+?????????????? if _mem.txtone[0] == 0xFF:
+?????????????????????? txmode = ""
+?????????????? elif _mem.txtone[1] < 0x26:
+?????????????????????? # CTCSS
+?????????????????????? txmode = "Tone"
+?????????????????????? tonehi = int(str(_mem.txtone[1])[2:])
+?????????????????????? tonelo = int(str(_mem.txtone[0])[2:])
+?????????????????????? mem.rtone = int(tonehi * 100 + tonelo) / 10.0
+?????????????? else:
+?????????????????????? # Digital
+?????????????????????? txmode = "DTCS"
+?????????????????????? tonehi = int(str(_mem.txtone[1] & 0x3f))
+?????????????????????? tonelo = int(str(_mem.txtone[0])[2:])
+?????????????????????? mem.dtcs = int(tonehi * 100 + tonelo)
+?????????????????????? if (_mem.txtone[1] & 0x40) != 0:
+?????????????????????????????? dtcs_pol[0] = "R"
+
+?????????????? mem.tmode = ""
+?????????????? if txmode == "Tone" and not rxmode:
+?????????????????????? mem.tmode = "Tone"
+?????????????? elif txmode == rxmode and txmode == "Tone" and mem.rtone ==
mem.ctone:
+?????????????????????? mem.tmode = "TSQL"
+?????????????? elif txmode == rxmode and txmode == "DTCS" and mem.dtcs ==
mem.rx_dtcs:
+?????????????????????? mem.tmode = "DTCS"
+?????????????? elif rxmode or txmode:
+?????????????????????? mem.tmode = "Cross"
+?????????????????????? mem.cross_mode = "%s->%s" % (txmode, rxmode)
+
+?????????????? mem.dtcs_polarity = "".join(dtcs_pol)
+
+?????????????? # Now test the mem.number to process special vs normal
+?????????????? if mem.number >=0:?????????? # Normal
+?????????????????????? mem.name = ""
+?????????????????????? for i in range(self.NAME_LENGTH):???? # 0 - 6
+?????????????????????????????? mem.name += chr(_mem.name[i] + 32)
+?????????????????????? mem.name = mem.name.rstrip()?????? # remove trailing spaces
+
+?????????????????????? if _mem.txfreq == 0xFFFFFFFF:
+?????????????????????????????? # TX freq not set
+?????????????????????????????? mem.duplex = "off"
+?????????????????????????????? mem.offset = 0
+?????????????????????? elif int(_mem.rxfreq) == int(_mem.txfreq):
+?????????????????????????????? mem.duplex = ""
+?????????????????????????????? mem.offset = 0
+?????????????????????? else:
+?????????????????????????????? mem.duplex = int(_mem.rxfreq) > int(_mem.txfreq) and
"-" or "+"
+?????????????????????????????? mem.offset = abs(int(_mem.rxfreq) - int(_mem.txfreq)) * 10
+
+?????????????????????? if _do_map(mem.number, 2, self._memobj.skpchns.map) > 0:
+?????????????????????????????? mem.skip = "S"
+?????????????????????? else:
+?????????????????????????????? mem.skip = ""
+
+?????????????? else:???????????? # specials VFO
+?????????????????????? mem.name = "----"
+?????????????????????? mem.duplex = LIST_SHIFT[_mem.duplx]
+?????????????????????? mem.offset = int(_mem.ofst) * 10
+?????????????????????? mem.skip = ""
+?????????????? # End if specials
+
+?????????????? # Channel Extra settings: Only Boolean & List methods, no
call-backs
+?????????????? rx = RadioSettingValueBoolean(bool(not _mem.bcl))???? # Inverted bool
+?????????????? # NOTE: first param of RadioSetting is the object attribute name
+?????????????? rset = RadioSetting("bcl", "Busy Channel Lockout", rx)
+?????????????? mem.extra.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(not _mem.vox_on))
+?????????????? rset = RadioSetting("vox_on", "Vox", rx)
+?????????????? mem.extra.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(not _mem.ani))
+?????????????? rset = RadioSetting("ani", "Auto Number ID (ANI)", rx)
+?????????????? mem.extra.append(rset)
+
+?????????????? # ID code can't be done in extra - no Integer method or call-back
+
+?????????????? rx = RadioSettingValueList(LIST_PTT, LIST_PTT[_mem.ptt])
+?????????????? rset = RadioSetting("ptt", "Xmit PTT ID", rx)
+?????????????? mem.extra.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_mem.epilogue))
+?????????????? rset = RadioSetting("epilogue", "Epilogue/Tail", rx)
+?????????????? mem.extra.append(rset)
+
+?????????????? return mem
+
+?????? def _get_special(self, number):
+?????????????? mem = chirp_common.Memory()
+?????????????? mem.number = self.SPECIAL_MEMORIES[number]
+?????????????? mem.extd_number = number
+?????????????? # Unused attributes are ignored in Set_memory
+?????????????? if (mem.number == -1) or (mem.number == -2):
+?????????????????????? # Print Upper[1] first, and Lower[0] next
+?????????????????????? rx = 0
+?????????????????????? if mem.number == -2:
+?????????????????????????????? rx = 1
+?????????????????????? _mem = self._memobj.frq[rx]
+?????????????????????? # immutable = ["number", "extd_number", "name"]
+?????????????????????? mem = self._get_memory(mem, _mem)
+?????????????? elif mem.number in range(self.FIRST_FM_INDEX,
+?????????????????????????????????????? self.LAST_FM_INDEX - 1, -1):
+?????????????????????? _mem = self._memobj.fm_stations[-self.LAST_FM_INDEX +
mem.number]
+?????????????????????? # immutable = ["number", "extd_number", "name", "power",
"ctone",
+?????????????????????? #?????????????????????? "rtone", "skip", "duplex", "offset", "mode"]
+?????????????????????? mem = self._get_fm_memory(mem, _mem)?????????????? # special fnctn
+?????????????? else:
+?????????????????????? raise Exception("Sorry, you can't edit that special"
+???????????????????????????????????? " memory channel %i." % mem.number)
+
+?????????????? # mem.immutable = immutable
+
+?????????????? return mem
+
+?????? def _set_memory(self, mem, _mem):
+?????????????? """Convert UI column data (mem) into MEM_FORMAT memory (_mem)."""
+?????????????? # At this point mem points to either normal, fm or Freq chans
+?????????????? # These first attributes are common to all types
+?????????????? if mem.empty:
+?????????????????????? if mem.number > 0:
+?????????????????????????????? _mem.rxfreq = 0xffffffff
+?????????????????????????????? # Set 'empty' and 'skip' bits
+?????????????????????????????? _do_map(mem.number, 1, self._memobj.chnmap.map)
+?????????????????????????????? _do_map(mem.number, 1, self._memobj.skpchns.map)
+?????????????????????? elif mem.number == -2:?? #?? upper VFO Freq
+?????????????????????????????? _mem.rxfreq = 14652000???? # VHF National Calling freq
+?????????????????????? elif mem.number == -1:?? #?? lower VFO
+?????????????????????????????? _mem.rxfreq = 44600000???? # UHF National Calling freq
+?????????????????????? else:???????????? # FM stations, mem.number -3 to -27
+?????????????????????????????? _mem.rxfreq = 0xffff
+?????????????????????????????? _do_map(mem.number + 28, 1, self._memobj.fmmap.fmset)
+?????????????????????? return
+
+?????????????? _mem.rxfreq = mem.freq / 10
+
+?????????????? if mem.number < -2:???????? # FM stations, only rxfreq
+?????????????????????? _mem.rxfreq = (force_odd(mem.freq) * 40) / 1000000
+?????????????????????? _do_map(mem.number + 28, 0, self._memobj.fmmap.fmset)
+?????????????????????? return
+
+?????????????? if str(mem.power) == "Low":
+?????????????????????? _mem.power = 0
+?????????????? else:
+?????????????????????? _mem.power = 1
+
+?????????????? _mem.wide = self.MODES.index(mem.mode)
+
+?????????????? rxmode = ""
+?????????????? txmode = ""
+
+?????????????? if mem.tmode == "Tone":
+?????????????????????? txmode = "Tone"
+?????????????? elif mem.tmode == "TSQL":
+?????????????????????? rxmode = "Tone"
+?????????????????????? txmode = "TSQL"
+?????????????? elif mem.tmode == "DTCS":
+?????????????????????? rxmode = "DTCSSQL"
+?????????????????????? txmode = "DTCS"
+?????????????? elif mem.tmode == "Cross":
+?????????????????????? txmode, rxmode = mem.cross_mode.split("->", 1)
+
+?????????????? sx = mem.dtcs_polarity[1]
+?????????????? if rxmode == "":
+?????????????????????? _mem.rxtone[0] = 0xFF
+?????????????????????? _mem.rxtone[1] = 0xFF
+?????????????? elif rxmode == "Tone":
+?????????????????????? val = int(mem.ctone * 10)
+?????????????????????? i = set_tone(_mem, True, True, val, sx)
+?????????????? elif rxmode == "DTCSSQL":
+?????????????????????? i = set_tone(_mem, True, False, mem.dtcs, sx)
+?????????????? elif rxmode == "DTCS":
+?????????????????????? i = set_tone(_mem, True, False, mem.rx_dtcs, sx)
+
+?????????????? sx = mem.dtcs_polarity[0]
+?????????????? if txmode == "":
+?????????????????????? _mem.txtone[0] = 0xFF
+?????????????????????? _mem.txtone[1] = 0xFF
+?????????????? elif txmode == "Tone":
+?????????????????????? val = int(mem.rtone * 10)
+?????????????????????? i = set_tone(_mem, False, True, val, sx)
+?????????????? elif txmode == "TSQL":
+?????????????????????? val = int(mem.ctone * 10)
+?????????????????????? i = set_tone(_mem, False, True, val, sx)
+?????????????? elif txmode == "DTCS":
+?????????????????????? i = set_tone(_mem, False, False, mem.dtcs, sx)
+
+?????????????? if mem.number > 0:?????????? # Normal chans
+?????????????????????? for i in range(self.NAME_LENGTH):
+?????????????????????????????? pq = ord(mem.name.ljust(self.NAME_LENGTH)[i]) -32
+?????????????????????????????? if pq < 0: pq = 0
+?????????????????????????????? _mem.name[i] = pq
+
+?????????????????????? if mem.duplex == "off":
+?????????????????????????????? _mem.txfreq = 0xFFFFFFFF
+?????????????????????? elif mem.duplex == "+":
+?????????????????????????????? _mem.txfreq = (mem.freq + mem.offset) / 10
+?????????????????????? elif mem.duplex == "-":
+?????????????????????????????? _mem.txfreq = (mem.freq - mem.offset) / 10
+?????????????????????? else:
+?????????????????????????????? _mem.txfreq = mem.freq / 10
+
+?????????????????????? # Set the channel map bit FALSE = Enabled
+?????????????????????? _do_map(mem.number, 0, self._memobj.chnmap.map)
+?????????????????????? # Skip
+?????????????????????? if mem.skip == "S":
+?????????????????????????????? _do_map(mem.number, 1, self._memobj.skpchns.map)
+?????????????????????? else:
+?????????????????????????????? _do_map(mem.number, 0, self._memobj.skpchns.map)
+
+?????????????? else:?????? # Freq (VFO) chans
+?????????????????????? _mem.duplx = 0
+?????????????????????? _mem.ofst = 0
+?????????????????????? if mem.duplex == "+":
+?????????????????????????????? _mem.duplx = 1
+?????????????????????????????? _mem.ofst = mem.offset / 10
+?????????????????????? elif mem.duplex == "-":
+?????????????????????????????? _mem.duplx = 2
+?????????????????????????????? _mem.ofst = mem.offset / 10
+?????????????????????? for i in range(self.NAME_LENGTH):
+?????????????????????????????? _mem.name[i] = 0xff
+
+?????????????? # All mem.extra << Once the channel is defined
+?????????????? for setting in mem.extra:
+?????????????????????? # Overide list strings with signed value
+?????????????????????? if setting.get_name() == "ptt":
+?????????????????????????????? sx = str(setting.value)
+?????????????????????????????? for i in range(0, 4):
+?????????????????????????????????????? if sx == LIST_PTT[i]:
+?????????????????????????????????????????????? val = i
+?????????????????????????????? setattr(_mem, "ptt", val)
+?????????????????????? elif setting.get_name() == "epilogue":?? # not inverted bool
+?????????????????????????????????????? setattr(_mem, setting.get_name(), setting.value)
+?????????????????????? else:???????????? # inverted booleans
+?????????????????????????????? setattr(_mem, setting.get_name(), not setting.value)
+
+?????? def _set_special(self, mem):
+
+?????????????? cur_mem = self._get_special(self.SPECIAL_MEMORIES_REV[mem.number])
+
+?????????????? if mem.number == -2:?????? # upper frq[1]
+?????????????????????? _mem = self._memobj.frq[1]
+?????????????? elif mem.number == -1:?? # lower frq[0]
+?????????????????????? _mem = self._memobj.frq[0]
+?????????????? elif mem.number in range(self.FIRST_FM_INDEX,
+?????????????????????????????????????? self.LAST_FM_INDEX - 1, -1):
+?????????????????????? _mem = self._memobj.fm_stations[-self.LAST_FM_INDEX +
mem.number]
+?????????????? else:
+?????????????????????? raise Exception("Sorry, you can't edit that special memory.")
+
+?????????????? self._set_memory(mem, _mem)???????? # Now update the _mem
+
+?????? def _set_normal(self, mem):
+?????????????? _mem = self._memobj.chan_mem[mem.number - 1]
+
+?????????????? self._set_memory(mem, _mem)
+
+?????? def get_settings(self):
+?????????????? """Translate the MEM_FORMAT structs into setstuf in the UI"""
+?????????????? # Define mem struct write-back shortcuts
+?????????????? _sets = self._memobj.setstuf
+?????????????? _fmx = self._memobj.fmfrqs
+
+?????????????? basic = RadioSettingGroup("basic", "Basic Settings")
+?????????????? adv = RadioSettingGroup("adv", "Other Settings")
+?????????????? fmb = RadioSettingGroup("fmb", "FM Broadcast")
+?????????????? scn = RadioSettingGroup("scn", "Scan Settings")
+?????????????? dtmf = RadioSettingGroup("dtmf", "DTMF Settings")
+?????????????? frng = RadioSettingGroup("frng", "Frequency Ranges")
+?????????????? group = RadioSettings(basic, adv, scn, fmb, dtmf, frng)
+
+?????????????? def my_val_list(setting, obj, atrb):
+?????????????????????? """Callback:from ValueList with non-sequential, actual
values."""
+?????????????????????? # This call back also used in get_settings
+?????????????????????? value = int(str(setting.value)) # Get the integer value
+?????????????????????? setattr(obj, atrb, value)
+?????????????????????? return
+
+?????????????? def my_adjraw(setting, obj, atrb, fix):
+?????????????????????? """Callback from Integer add or subtract fix from value."""
+?????????????????????? vx = int(str(setting.value))
+?????????????????????? value = vx?? + int(fix)
+?????????????????????? if value < 0:
+?????????????????????????????? value = 0
+?????????????????????? setattr(obj, atrb, value)
+?????????????????????? return
+
+?????????????? def my_strnam(setting, obj, atrb, mln):
+?????????????????????? """Callback from String to build u8 array with -32 offset."""
+?????????????????????? # mln is max string length
+?????????????????????? ary = []
+?????????????????????? knt = mln
+?????????????????????? for j in range (mln - 1, -1, -1):?? # Strip trailing spaces
or nulls
+?????????????????????????????? pq = str(setting.value)[j]
+?????????????????????????????? if pq == "" or pq == " ":
+?????????????????????????????????????? knt = knt - 1
+?????????????????????????????? else:
+?????????????????????????????????????? break
+?????????????????????? for j in range(mln):?? # 0 to mln-1
+?????????????????????????????? pq = str(setting.value).ljust(mln)[j]
+?????????????????????????????? if j < knt: ary.append(ord(pq) - 32)
+?????????????????????????????? else: ary.append(0)
+?????????????????????? setattr(obj, atrb, ary)
+?????????????????????? return
+
+?????????????? def unpack_str(cary, cknt, mxw):
+?????????????????????? """Convert u8 nibble array to a string: NOT a callback."""
+?????????????????????? # cknt is char count, 2/word; mxw is max WORDS
+?????????????????????? stx = ""
+?????????????????????? mty = True
+?????????????????????? for i in range(mxw):?????? # unpack entire array
+?????????????????????????????? nib = (cary[i] & 0xf0) >> 4?? # LE, Hi nib first
+?????????????????????????????? if nib != 0xf: mty = False
+?????????????????????????????? stx += format(nib, '0X')
+?????????????????????????????? nib = cary[i] & 0xf
+?????????????????????????????? if nib != 0xf: mty = False
+?????????????????????????????? stx += format(nib, '0X')
+?????????????????????? stx = stx[:cknt]
+?????????????????????? if mty:???????? # all ff, empty string
+?????????????????????????????? sty = ""
+?????????????????????? else:
+?????????????????????????????? # Convert E to #, F to *
+?????????????????????????????? sty = ""
+?????????????????????????????? for i in range(cknt):
+?????????????????????????????????????? if stx[i] == "E":
+?????????????????????????????????????????????? sty += "#"
+?????????????????????????????????????? elif stx[i] == "F":
+?????????????????????????????????????????????? sty += "*"
+?????????????????????????????????????? else:
+?????????????????????????????????????????????? sty += stx[i]
+
+?????????????????????? return sty
+
+?????????????? def pack_chars(setting, obj, atrstr, atrcnt, mxl):
+?????????????????????? """Callback to build 0-9,A-D,*# nibble array from string"""
+?????????????????????? # cknt is generated char count, 2 chars per word
+?????????????????????? # String will be f padded to mxl
+?????????????????????? # Chars are stored as hex values
+?????????????????????? # store cknt-1 in atrcnt, 0xf if empty
+?????????????????????? cknt = 0
+?????????????????????? ary = []
+?????????????????????? stx = str(setting.value).upper()
+?????????????????????? stx = stx.strip()???????????? # trim spaces
+?????????????????????? # Remove illegal characters first
+?????????????????????? sty = ""
+?????????????????????? for j in range(0, len(stx)):
+?????????????????????????????? if stx[j] in self.DTMF_CHARS: sty += stx[j]
+?????????????????????? for j in range(mxl):
+?????????????????????????????? if j < len(sty):
+?????????????????????????????????????? if sty[j] == "#":
+?????????????????????????????????????????????? chrv = 0xE
+?????????????????????????????????????? elif sty[j] == "*":
+?????????????????????????????????????????????? chrv = 0xF
+?????????????????????????????????????? else:
+?????????????????????????????????????????????? chrv = int(sty[j], 16)
+?????????????????????????????????????? cknt += 1?????????? # char count
+?????????????????????????????? else:???? # pad to mxl, cknt does not increment
+?????????????????????????????????????? chrv = 0xF
+?????????????????????????????? if (j % 2) == 0:?? # odd count (0-based), high nibble
+?????????????????????????????????????? hi_nib = chrv
+?????????????????????????????? else:???? # even count, lower nibble
+?????????????????????????????????????? lo_nib = chrv
+?????????????????????????????????????? nibs = lo_nib | (hi_nib << 4)
+?????????????????????????????????????? ary.append(nibs)?????? # append word
+?????????????????????? setattr(obj, atrstr, ary)
+?????????????????????? if setting.get_name() != "setstuf.stuncode":?? # cknt is actual
+?????????????????????????????? if cknt > 0:
+?????????????????????????????????????? cknt = cknt - 1
+?????????????????????????????? else:
+?????????????????????????????????????? cknt = 0xf
+?????????????????????? setattr(obj, atrcnt, cknt)
+?????????????????????? return
+
+?????????????? def myset_freq(setting, obj, atrb, mult):
+?????????????????????? """ Callback to set frequency by applying multiplier"""
+?????????????????????? value = int(float(str(setting.value)) * mult)
+?????????????????????? setattr(obj, atrb, value)
+?????????????????????? return
+
+?????????????? def my_invbool(setting, obj, atrb):
+?????????????????????? """Callback to invert the boolean """
+?????????????????????? bval = not setting.value
+?????????????????????? setattr(obj, atrb, bval)
+?????????????????????? return
+
+?????????????? def my_batsav(setting, obj, atrb):
+?????????????????????? """Callback to set batsav attribute """
+?????????????????????? stx = str(setting.value)?? # Off, 1:1...
+?????????????????????? if stx == "Off":
+?????????????????????????????? value = 0x1???????? # bit value 4 clear, ratio 1 = 1:2
+?????????????????????? elif stx == "1:1":
+?????????????????????????????? value = 0x4???????? # On, ratio 0 = 1:1
+?????????????????????? elif stx == "1:2":
+?????????????????????????????? value = 0x5???????? # On, ratio 1 = 1:2
+?????????????????????? elif stx == "1:3":
+?????????????????????????????? value = 0x6???????? # On, ratio 2 = 1:3
+?????????????????????? else:
+?????????????????????????????? value = 0x7???????? # On, ratio 3 = 1:4
+?????????????????????? # LOG.warning("Batsav stx:%s:, value= %x" % (stx, value))
+?????????????????????? setattr(obj, atrb, value)
+?????????????????????? return
+
+?????????????? def my_manfrq(setting, obj, atrb):
+?????????????????????? """Callback to set 2-byte manfrqyn yes/no """
+?????????????????????? # LOG.warning("Manfrq value = %d" % setting.value)
+?????????????????????? if (str(setting.value)) == "No":
+?????????????????????????????? value = 0xff
+?????????????????????? else:
+?????????????????????????????? value = 0xaa
+?????????????????????? setattr(obj, atrb, value)
+?????????????????????? return
+
+?????????????? rx = RadioSettingValueInteger(1, 9, _sets.voxgain + 1)
+?????????????? rset = RadioSetting("setstuf.voxgain", "Vox Level", rx)
+?????????????? rset.set_apply_callback(my_adjraw, _sets, "voxgain", -1)
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueList(LIST_VOXDLY,
LIST_VOXDLY[_sets.voxdelay])
+?????????????? rset = RadioSetting("setstuf.voxdelay", "Vox Delay (secs)", rx)
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueInteger(0, 9, _sets.sql)
+?????????????? rset = RadioSetting("setstuf.sql", "Squelch", rx)
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueList(LIST_STEPS, LIST_STEPS[_sets.freqstep])
+?????????????? rset = RadioSetting("setstuf.freqstep", "VFO Tune Step (KHz))", rx)
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.dbw))???????? # true logic
+?????????????? rset = RadioSetting("setstuf.dbw", "Dual Band Watch (D.WAIT)", rx)
+?????????????? basic.append(rset)
+
+?????????????? options = ["Off", "On", "Auto"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.lampon])
+?????????????? rset = RadioSetting("setstuf.lampon", "Backlight (LED)", rx)
+?????????????? basic.append(rset)
+
+?????????????? options = ["Orange", "Purple", "Blue"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.ledclr])
+?????????????? rset = RadioSetting("setstuf.ledclr", "Backlight Color
(LIGHT)", rx)
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.beepon))
+?????????????? rset = RadioSetting("setstuf.beepon", "Keypad Beep", rx)
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.xbandenable))
+?????????????? rset = RadioSetting("setstuf.xbandenable", "Cross Band
Allowed", rx)
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(not _sets.xbandon))
+?????????????? rset = RadioSetting("setstuf.xbandon", "Cross Band On", rx)
+?????????????? rset.set_apply_callback(my_invbool, _sets, "xbandon")
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueList(LIST_TIMEOUT, LIST_TIMEOUT[_sets.tot])
+?????????????? rset = RadioSetting("setstuf.tot", "TX Timeout (Secs)", rx)
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(not _sets.rgrbeep))?? # Invert
+?????????????? rset = RadioSetting("setstuf.rgrbeep", "Beep at Eot (Roger)", rx)
+?????????????? rset.set_apply_callback(my_invbool, _sets, "rgrbeep")
+?????????????? basic.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(not _sets.keylok))
+?????????????? rset = RadioSetting("setstuf.keylok", "Keypad AutoLock", rx)
+?????????????? rset.set_apply_callback(my_invbool, _sets, "keylok")
+?????????????? basic.append(rset)
+
+?????????????? options = ["None", "Message", "DC Volts"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.openmsg])
+?????????????? rset = RadioSetting("setstuf.openmsg", "Power-On Display", rx)
+?????????????? basic.append(rset)
+
+?????????????? options = ["Channel Name", "Frequency"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.chs_name])
+?????????????? rset = RadioSetting("setstuf.chs_name", "Display Name/Frq", rx)
+?????????????? basic.append(rset)
+
+?????????????? sx = ""
+?????????????? for i in range(7):
+?????????????????????? if _sets.radioname[i] != 0:
+?????????????????????????????? sx += chr(_sets.radioname[i] + 32)
+?????????????? rx = RadioSettingValueString(0, 7, sx)
+?????????????? rset = RadioSetting("setstuf.radioname", "Power-On Message", rx)
+?????????????? rset.set_apply_callback(my_strnam, _sets, "radioname", 7)
+?????????????? basic.append(rset)
+
+?????????????? # Advanced (Strange) Settings
+?????????????? options = ["Busy: Last Tx Band", "Edit: Current Band"]
+?????????????? rx?? = RadioSettingValueList(options, options[_sets.txsel])
+?????????????? rset = RadioSetting("setstuf.txsel", "Transmit Priority", rx)
+?????????????? rset.set_doc("'Busy' transmits on last band used, not current
one.")
+?????????????? adv.append(rset)
+
+?????????????? options = ["Off", "English", "Unk", "Chinese"]
+?????????????? val = _sets.voice
+?????????????? rx = RadioSettingValueList(options, options[val])
+?????????????? rset = RadioSetting("setstuf.voice", "Voice", rx)
+?????????????? adv.append(rset)
+
+?????????????? options = ["Off", "1:1", "1:2", "1:3", "1:4"]
+?????????????? val = (_sets.batsav & 0x3) +1???????? # ratio
+?????????????? if (_sets.batsav & 0x4) == 0:?????? # Off
+?????????????????????? val = 0
+?????????????? rx = RadioSettingValueList(options, options[val])
+?????????????? rset = RadioSetting("setstuf.batsav", "Battery Saver", rx)
+?????????????? rset.set_apply_callback(my_batsav, _sets, "batsav")
+?????????????? adv.append(rset)
+
+?????????????? # Find out what & where SuperSave is
+?????????????? options = ["Off", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.supersave])
+?????????????? rset = RadioSetting("setstuf.supersave", "Super Save (Secs)", rx)
+?????????????? rset.set_doc("Unknown radio attribute??")
+?????????????? adv.append(rset)
+
+?????????????? sx = unpack_str(_sets.pttbot, _sets.pttbcnt + 1, 8)
+?????????????? rx = RadioSettingValueString(0, 16, sx)
+?????????????? rset = RadioSetting("setstuf.pttbot", "PTT BoT Code", rx)
+?????????????? rset.set_apply_callback(pack_chars, _sets, "pttbot", "pttbcnt", 16)
+?????????????? adv.append(rset)
+
+?????????????? sx = unpack_str(_sets.ptteot, _sets.pttecnt + 1, 8)
+?????????????? rx = RadioSettingValueString(0, 16, sx)
+?????????????? rset = RadioSetting("setstuf.ptteot", "PTT EoT Code", rx)
+?????????????? rset.set_apply_callback(pack_chars, _sets, "ptteot", "pttecnt", 16)
+?????????????? adv.append(rset)
+
+?????????????? options = ["None", "Low", "High", "Both"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.voltx])
+?????????????? rset = RadioSetting("setstuf.voltx", "Transmit Inhibit
Voltage", rx)
+?????????????? rset.set_doc("Block Transmit if battery volts are too high or
low,")
+?????????????? adv.append(rset)
+
+?????????????? val = 0???????? # No = 0xff
+?????????????? if _sets.manfrqyn == 0xaa: val = 1
+?????????????? options = ["No", "Yes"]
+?????????????? rx = RadioSettingValueList(options, options[val])
+?????????????? rset = RadioSetting("setstuf.manfrqyn", "Manual Frequency", rx)
+?????????????? rset.set_apply_callback(my_manfrq, _sets, "manfrqyn")
+?????????????? adv.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.manualset))
+?????????????? rset = RadioSetting("setstuf.manualset", "Manual Setting", rx)
+?????????????? adv.append(rset)
+
+?????????????? # Scan Settings
+?????????????? options = ["CO: During Rx", "TO: Timed", "SE: Halt"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.scanmode])
+?????????????? rset = RadioSetting("setstuf.scanmode",
+???????????????????????????????????? "Scan Mode (Scan Pauses When)", rx)
+?????????????? scn.append(rset)
+
+?????????????? options = ["100", "150", "200", "250",
+???????????????????????????????????? "300", "350", "400", "450"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.scanspeed])
+?????????????? rset = RadioSetting("setstuf.scanspeed", "Scan Speed (ms)", rx)
+?????????????? scn.append(rset)
+
+?????????????? val =_sets.scantmo + 3
+?????????????? rx = RadioSettingValueInteger(3, 30, val)
+?????????????? rset = RadioSetting("setstuf.scantmo",
+?????????????????????????????? "TO Mode Timeout (secs)", rx)
+?????????????? rset.set_apply_callback(my_adjraw, _sets, "scantmo", -3)
+?????????????? scn.append(rset)
+
+?????????????? val = _sets.prichan
+?????????????? if val <= 0: val = 1
+?????????????? rx = RadioSettingValueInteger(1, 128, val)
+?????????????? rset = RadioSetting("setstuf.prichan", "Priority Channel", rx)
+?????????????? scn.append(rset)
+
+?????????????? # FM Broadcast Settings
+?????????????? val =_fmx.fmcur
+?????????????? val = val / 40.0
+?????????????? if val < 87.5 or val > 107.9: val = 88.0
+?????????????? rx = RadioSettingValueFloat(87.5, 107.9, val, 0.1, 1)
+?????????????? rset = RadioSetting("fmfrqs.fmcur", "Manual FM Freq (MHz)", rx)
+?????????????? rset.set_apply_callback(myset_freq, _fmx, "fmcur", 40)
+?????????????? fmb.append(rset)
+
+?????????????? options = ["5", "50", "100", "200(USA)"]?????? # 5 is not used
+?????????????? rx = RadioSettingValueList(options, options[_sets.fmstep])
+?????????????? rset = RadioSetting("setstuf.fmstep", "FM Freq Step (KHz)", rx)
+?????????????? fmb.append(rset)
+
+?????????????? if False:???? # Skip these unknowns
+?????????????????????? # FM Scan Range lo and Hi ??? MEM
+?????????????????????? val = 87.5
+?????????????????????? rx = RadioSettingValueFloat(87.5, 107.9, val, 0.1, 1)
+?????????????????????? rset = RadioSetting("setstuf.fmsclo",
+???????????????????????????????????? "Low FM Scan Bound (MHz)", rx)
+?????????????????????? rset.set_apply_callback(myset_freq, _sets, "fmsclo", 40)
+?????????????????????? fmb.append(rset)
+
+?????????????????????? val = 107.9???????? # ??? @@@ where
+?????????????????????? rx = RadioSettingValueFloat(87.5, 107.9, val, 0.1, 1)
+?????????????????????? rset = RadioSetting("setstuf.fmschi",
+???????????????????????????????????? "High FM Scan Freq (MHz)", rx)
+?????????????????????? rset.set_apply_callback(myset_freq, _sets, "fmschi", 40)
+?????????????????????? fmb.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.rxinhib))
+?????????????? rset = RadioSetting("setstuf.rxinhib",
+?????????????????????????????? "Rcvr Will Interupt FM (DW)", rx)
+?????????????? fmb.append(rset)
+
+?????????????? options = [str(x) for x in range(4, 16)]
+?????????????? rx = RadioSettingValueList(options, options[_sets.dtmfspd])
+?????????????? rset = RadioSetting("setstuf.dtmfspd",
+???????????????????????????????????? "Tx Speed (digits/sec)", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? options = [str(x) for x in range(0, 1100, 100)]
+?????????????? rx = RadioSettingValueList(options, options[_sets.dtmfdig1time])
+?????????????? rset = RadioSetting("setstuf.dtmfdig1time",
+?????????????????????????????? "Tx 1st Digit Time (ms)", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? options = [str(x) for x in range(100, 1100, 100)]
+?????????????? rx = RadioSettingValueList(options, options[_sets.dtmfdig1dly])
+?????????????? rset = RadioSetting("setstuf.dtmfdig1dly",
+???????????????????????????????????? "Tx 1st Digit Delay (ms)", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? options = ["0", "100", "500", "1000"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.dtmfspms])
+?????????????? rset = RadioSetting("setstuf.dtmfspms",
+???????????????????????????????????? "Tx Star & Pound Time (ms)", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? options = ["None"] + [str(x) for x in range(600, 2100, 100)]
+?????????????? rx = RadioSettingValueList(options, options[_sets.codespctim])
+?????????????? rset = RadioSetting("setstuf.codespctim",
+???????????????????????????????????? "Tx Code Space Time (ms)", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.codeabcd))
+?????????????? rset = RadioSetting("setstuf.codeabcd", "Tx Codes A,B,C,D", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.dtmfside))
+?????????????? rset = RadioSetting("setstuf.dtmfside", "DTMF Side Tone", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? options = ["Off", "A", "B", "C", "D"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.grpcode])
+?????????????? rset = RadioSetting("setstuf.grpcode", "Rx Group Code", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? options = ["Off"] + [str(x) for x in range(1, 16)]
+?????????????? rx = RadioSettingValueList(options, options[_sets.autoresettmo])
+?????????????? rset = RadioSetting("setstuf.autoresettmo",
+???????????????????????????????????? "Rx Auto Reset Timeout (secs)", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.txdecode))
+?????????????? rset = RadioSetting("setstuf.txdecode", "Tx Decode", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.idedit))
+?????????????? rset = RadioSetting("setstuf.idedit", "Allow ANI Code Edit", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? options = [str(x) for x in range(500, 1600, 100)]
+?????????????? rx = RadioSettingValueList(options, options[_sets.decodetmo])
+?????????????? rset = RadioSetting("setstuf.decodetmo",
+?????????????????????????????? "Rx Decode Timeout (ms)", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? options = ["Tx & Rx Inhibit", "Tx Inhibit"]
+?????????????? rx = RadioSettingValueList(options, options[_sets.stuntype])
+?????????????? rset = RadioSetting("setstuf.stuntype", "Stun Type", rx)
+?????????????? dtmf.append(rset)
+
+?????????????? sx = unpack_str(_sets.stuncode, _sets.stuncnt, 5)
+?????????????? rx = RadioSettingValueString(0, 10, sx)
+?????????????? rset = RadioSetting("setstuf.stuncode", "Stun Code", rx)
+?????????????? rset.set_apply_callback(pack_chars, _sets,
+???????????????????????????????????? "stuncode", "stuncnt", 10)
+?????????????? dtmf.append(rset)
+
+?????????????? # Frequency ranges
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.frqr1))
+?????????????? rset = RadioSetting("setstuf.frqr1", "Freq Range 1 (UHF)", rx)
+?????????????? rset.set_doc("Enable the UHF frequency bank.")
+?????????????? frng.append(rset)
+
+?????????????? rx = RadioSettingValueBoolean(bool(_sets.frqr2))
+?????????????? rset = RadioSetting("setstuf.frqr2", "Freq Range 2 (VHF)", rx)
+?????????????? rset.set_doc("Enable the VHF frequency bank.")
+?????????????? frng.append(rset)
+
+?????????????? mod_se = True???????? # UV8000SE has 3rd freq bank
+?????????????? if mod_se:
+?????????????????????? rx = RadioSettingValueBoolean(bool(_sets.frqr3))
+?????????????????????? rset = RadioSetting("setstuf.frqr3", "Freq Range 3
(220Mhz)", rx)
+?????????????????????? rset.set_doc("Enable the 220MHz frequency bank.")
+?????????????????????? frng.append(rset)
+
+?????????????? frqm = 100000
+?????????????? val = _sets.frqr1lo / frqm
+?????????????? rx = RadioSettingValueFloat(400.0, 520.0, val, 0.005, 3)
+?????????????? rset = RadioSetting("setstuf.frqr1lo",
+???????????????????????????????????? "UHF Range Low Limit (MHz)", rx)
+?????????????? rset.set_apply_callback(myset_freq, _sets, "frqr1lo", frqm)
+?????????????? rset.set_doc("Low limit of the UHF frequency bank.")
+?????????????? frng.append(rset)
+
+?????????????? val = _sets.frqr1hi / frqm
+?????????????? rx = RadioSettingValueFloat(400.0, 520.0, val, 0.005, 3)
+?????????????? rset = RadioSetting("setstuf.frqr1hi",
+?????????????????????? "UHF Range High Limit (MHz)", rx)
+?????????????? rset.set_apply_callback(myset_freq, _sets, "frqr1hi", frqm)
+?????????????? rset.set_doc("High limit of the UHF frequency bank.")
+?????????????? frng.append(rset)
+
+?????????????? val = _sets.frqr2lo / frqm
+?????????????? rx = RadioSettingValueFloat(136.0, 174.0, val, 0.005, 3)
+?????????????? rset = RadioSetting("setstuf.frqr2lo",
+???????????????????????????????????? "VHF Range Low Limit (MHz)", rx)
+?????????????? rset.set_apply_callback(myset_freq, _sets, "frqr2lo", frqm)
+?????????????? rset.set_doc("Low limit of the VHF frequency bank.")
+?????????????? frng.append(rset)
+
+?????????????? val = _sets.frqr2hi / frqm
+?????????????? rx = RadioSettingValueFloat(136.0, 174.0, val, 0.005, 3)
+?????????????? rset = RadioSetting("setstuf.frqr2hi",
+?????????????????????????????? "VHF Range High Limit (MHz)", rx)
+?????????????? rset.set_apply_callback(myset_freq, _sets, "frqr2hi", frqm)
+?????????????? rset.set_doc("High limit of the VHF frequency bank.")
+?????????????? frng.append(rset)
+
+?????????????? if mod_se:
+?????????????????????? val = _sets.frqr3lo / frqm
+?????????????????????? if val == 0: val = 222.0
+?????????????????????? rx = RadioSettingValueFloat(220.0, 260.0, val, 0.005, 3)
+?????????????????????? rset = RadioSetting("setstuf.frqr3lo",
+???????????????????????????????????? "1.25m Range Low Limit (MHz)", rx)
+?????????????????????? rset.set_apply_callback(myset_freq, _sets, "frqr3lo", frqm)
+?????????????????????? frng.append(rset)
+
+?????????????????????? val = _sets.frqr3hi / frqm
+?????????????????????? if val == 0: val = 225.0
+?????????????????????? rx = RadioSettingValueFloat(220.0, 260.0, val, 0.005, 3)
+?????????????????????? rset = RadioSetting("setstuf.frqr3hi",
+?????????????????????????????????????? "1.25m Range High Limit (MHz)", rx)
+?????????????????????? rset.set_apply_callback(myset_freq, _sets, "frqr3hi", 1000)
+?????????????????????? frng.append(rset)
+
+?????????????? return group???????????? # END get_settings()
+
+
+?????? def set_settings(self, settings):
+?????????????? _settings = self._memobj.setstuf
+?????????????? _mem = self._memobj
+?????????????? for element in settings:
+?????????????????????? if not isinstance(element, RadioSetting):
+?????????????????????????????? self.set_settings(element)
+?????????????????????????????? continue
+?????????????????????? else:
+?????????????????????????????? try:
+?????????????????????????????????????? name = element.get_name()
+?????????????????????????????????????? if "." in name:
+?????????????????????????????????????????????? bits = name.split(".")
+?????????????????????????????????????????????? obj = self._memobj
+?????????????????????????????????????????????? for bit in bits[:-1]:
+?????????????????????????????????????????????????????? if "/" in bit:
+?????????????????????????????????????????????????????????????? bit, index = bit.split("/", 1)
+?????????????????????????????????????????????????????????????? index = int(index)
+?????????????????????????????????????????????????????????????? obj = getattr(obj, bit)[index]
+?????????????????????????????????????????????????????? else:
+?????????????????????????????????????????????????????????????? obj = getattr(obj, bit)
+?????????????????????????????????????????????? setting = bits[-1]
+?????????????????????????????????????? else:
+?????????????????????????????????????????????? obj = _settings
+?????????????????????????????????????????????? setting = element.get_name()
+
+?????????????????????????????????????? if element.has_apply_callback():
+?????????????????????????????????????????????? LOG.debug("Using apply callback")
+?????????????????????????????????????????????? element.run_apply_callback()
+?????????????????????????????????????? elif element.value.get_mutable():
+?????????????????????????????????????????????? LOG.debug("Setting %s = %s" % (setting,
element.value))
+?????????????????????????????????????????????? setattr(obj, setting, element.value)
+?????????????????????????????? except Exception, e:
+?????????????????????????????????????? LOG.debug(element.get_name())
+?????????????????????????????????????? raise
+
+?????? @classmethod
+?????? def match_model(cls, filedata, filename):
+?????????????? match_size = False
+?????????????? match_model = False
+
+?????????????? # Testing the file data size
+?????????????? if len(filedata) == MEM_SIZE + 10:
+?????????????????????? match_size = True
+
+?????????????? # Testing the firmware model fingerprint
+?????????????? match_model = model_match(cls, filedata)
+
+?????????????? if match_size and match_model:
+?????????????????????? return True
+?????????????? else:
+?????????????????????? return False
--
Rick DeWitt
AA0RD
Sequim, Washington, USA
360-681-3494
3
2