Developers
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
August 2016
- 11 participants
- 28 discussions
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1471569185 14400
# Node ID 3d77965ee7dccbe5f3fc3e6203a1440721e89920
# Parent f2a967b26e6ec947c935cdcfde1e99c6eb16f6b2
[UV-5X3] Fix Inverted Power Levels
Somehow I got the order of the power levels swapped. This patch puts
them in the proper order.
related to #3931
diff -r f2a967b26e6e -r 3d77965ee7dc chirp/drivers/uv5x3.py
--- a/chirp/drivers/uv5x3.py Thu Aug 18 21:10:16 2016 -0400
+++ b/chirp/drivers/uv5x3.py Thu Aug 18 21:13:05 2016 -0400
@@ -117,8 +117,8 @@
LENGTH_NAME = 7
SKIP_VALUES = ["", "S"]
DTCS_CODES = sorted(chirp_common.DTCS_CODES + [645])
- POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00),
- chirp_common.PowerLevel("High", watts=5.00)]
+ POWER_LEVELS = [chirp_common.PowerLevel("High", watts=5.00),
+ chirp_common.PowerLevel("Low", watts=1.00)]
VALID_BANDS = [(130000000, 180000000),
(222000000, 226000000),
(400000000, 521000000)]
1
0
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1471569016 14400
# Node ID f2a967b26e6ec947c935cdcfde1e99c6eb16f6b2
# Parent e4704124d5b9d21db4b7cabcdff037a1b85f2bd8
[UV-6R] Fix Inverted Power Levels
Somehow I got the order of the power levels swapped. This patch puts
them in the proper order.
related to #2761
diff -r e4704124d5b9 -r f2a967b26e6e chirp/drivers/uv6r.py
--- a/chirp/drivers/uv6r.py Thu Aug 18 06:29:52 2016 -0700
+++ b/chirp/drivers/uv6r.py Thu Aug 18 21:10:16 2016 -0400
@@ -117,8 +117,8 @@
LENGTH_NAME = 7
SKIP_VALUES = ["", "S"]
DTCS_CODES = sorted(chirp_common.DTCS_CODES + [645])
- POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00),
- chirp_common.PowerLevel("High", watts=5.00)]
+ POWER_LEVELS = [chirp_common.PowerLevel("High", watts=5.00),
+ chirp_common.PowerLevel("Low", watts=1.00)]
VALID_BANDS = [(136000000, 174000000),
(400000000, 520000000)]
PTTID_LIST = LIST_PTTID
1
0
Tested changes:
[Dan Smith <dsmith(a)danplanet.com>] Add test image for BTECH UV-5X3
Related to #3931
[Jim Unroe <rock.unroe(a)gmail.com>] [UV-6X3] Add Support for BTech UV-5X3
This driver adds support for the BTech UV-5X3 tri-band handheld radio.
related to #3931
[Tom Hayward <tom(a)tomh.us>] [id880] Fix typo in charset definition. #281
[Tom Hayward <tom(a)tomh.us>] [thf6a] Support full charset (ASCII). Fixes #141
[Tom Hayward <tom(a)tomh.us>] [id880] Support full charset. Fixes #281
[Tom Hayward <tom(a)tomh.us>] [vx5] Support full charset (ASCII). Fixes #292
[Tom Hayward <tom(a)tomh.us>] [id31a] set used bit when creating new memory, clear when deleting. Fixes #269
[Tom Hayward <tom(a)tomh.us>] Support PyGTK < 2.22 in bank edit. Fixes #231
[Tom Hayward <tom(a)tomh.us>] [d710] [v71] [d72] Fix tone list (not all tones are supported). Fixes #212
[Dan Smith <dsmith(a)danplanet.com>] [vx7] Fix setting memory power levels on 220MHz band
Fixes #214
[Dan Smith <dsmith(a)danplanet.com>] fips: Pennsylvania FIPS code was wrong. #117
[Marco Filippi <iz3gme.marco(a)gmail.com>] Consider lower bound frequency of each valid_band as valid
Fix bug #181
[Tom Hayward <tom(a)tomh.us>] tmd700: allow 8-char names. Fixes #176
[Dan Smith <dsmith(a)danplanet.com>] Fix the "blind deletion" problem, as well as properly direct copy/paste
Fixes #172
[David Griffith <dave(a)661.org>] Bug #155 fix: VX-7 1.25m power levels
[David Griffith <dave(a)661.org>] New INSTALL and README files
Fixes #122
[Tom Hayward <tom(a)tomh.us>] thd72: only use hardware flow on OS X. Fixes #166
[Marco Filippi <iz3gme.marco(a)gmail.com>] [FT817] Tone freq not set correctly
Same as #88 for FT857, to avoid code duplication fix code have been moved from
ft857 to its ancestor class
Fix bug #163
[Tom Hayward <tom(a)tomh.us>] Fix Mac .app so paths with spaces work. Fixes Bug #145
Full log:
Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/chirp-test/workspace
[workspace] $ hg showconfig paths.default
[workspace] $ hg pull --rev default
[workspace] $ hg update --clean --rev default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
[workspace] $ hg log --rev . --template {node}
[workspace] $ hg log --rev . --template {rev}
[workspace] $ hg log --rev 9310deb7f479388f499d3f66d4cd892ce19021bf
[workspace] $ hg log --template "<changeset node='{node}' author='{author|xmlescape}' rev='{rev}' date='{date}'><msg>{desc|xmlescape}</msg><added>{file_adds|stringify|xmlescape}</added><deleted>{file_dels|stringify|xmlescape}</deleted><files>{files|stringify|xmlescape}</files><parents>{parents}</parents></changeset>\n" --rev default:0 --follow --prune 9310deb7f479388f499d3f66d4cd892ce19021bf
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson9067631929135656029.sh
[workspace] $ /bin/sh -xe /tmp/hudson6615029749307646998.sh
+ PATH=/usr/bin:/bin:/usr/local/bin ./run_all_tests.sh
test_bit_array (tests.unit.test_bitwise.TestBitType) ... ok
test_bit_array_fail (tests.unit.test_bitwise.TestBitType) ... ok
test_bitfield_u16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u8 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_bbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_int_array (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u8 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_char (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_invalid_chars (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_wrong_length (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_comment_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_comment_inline_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_missing_semicolon (tests.unit.test_bitwise.TestBitwiseErrors) ... ok
test_seek (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_seekto (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_struct_one_element (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_two_elements (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_writes (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
split_tone_encode_test_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_fix_rounded_step_250 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_500 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_750 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_12_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_2_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_5_0 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_6_25 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_fractional_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step_fail (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_format_freq (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_bad (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_decimal (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whitespace (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whole (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_ensure_has_calls_almost_full (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_empty (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_partial (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full1 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full2 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_urcall_full (tests.unit.test_import_logic.DstarTests) ... ok
test_import_bank (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffA_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffB_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_negative (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_too_big_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_uhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_errors (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_warnings (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_invalid (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_am (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_fm (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_name (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_closest (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_dst (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_src (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_same (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffA_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffB_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModelIndexInterface) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_icom_bank (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_index_bounds (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_next_mapping_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_auto_tone_mode_cross (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_pol (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_rx (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tone (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tsql (tests.unit.test_memedit_edits.TestEdits) ... ok
test_init (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_bad_portnames (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_sorted (tests.unit.test_platform.Win32PlatformTest) ... ok
test_apply_callback (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_group (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_multi (tests.unit.test_settings.TestSettingContainers) ... ok
test_changed (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_boolean (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_float (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_integer (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_list (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_string (tests.unit.test_settings.TestSettingValues) ... ok
test_validate_callback (tests.unit.test_settings.TestSettingValues) ... ok
test_delete_hole_with_all (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_all_full (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_without_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_with_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_without_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
----------------------------------------------------------------------
Ran 151 tests in 0.055s
OK
Patch 'tip' is OK
Checking for PEP8 regressions...
./chirp/drivers/ft2900.py:1236:1: E265 block comment should start with '# '
./chirp/drivers/ft60.py:521:45: W291 trailing whitespace
./chirp/drivers/ft60.py:522:25: E128 continuation line under-indented for visual indent
./chirp/drivers/ft60.py:523:13: E301 expected 1 blank line, found 0
./chirp/drivers/ft817.py:587:41: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:684:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:688:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:691:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:692:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:695:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:696:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:699:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:702:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:705:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:708:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:711:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:714:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:717:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:720:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:721:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:724:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:725:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:728:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:731:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:732:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:735:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:736:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:739:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:740:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:743:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:744:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:747:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:750:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:753:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:754:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:757:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:758:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:761:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:764:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:767:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:768:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:771:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:772:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:775:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:776:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:779:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:782:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:783:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:786:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:789:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:790:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:793:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:794:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:810:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:811:31: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:814:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:817:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:821:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:827:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:832:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:836:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:840:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:844:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:848:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:893:25: E128 continuation line under-indented for visual indent
./chirp/drivers/thd72.py:188:1: E302 expected 2 blank lines, found 1
./chirp/drivers/thd72.py:203:23: E201 whitespace after '['
./chirp/drivers/thd72.py:203:80: E501 line too long (171 > 79 characters)
./chirp/drivers/thd72.py:203:170: E202 whitespace before ']'
./chirp/drivers/thd72.py:204:13: E201 whitespace after '['
./chirp/drivers/thd72.py:204:61: E202 whitespace before ']'
./chirp/drivers/thd72.py:205:23: E201 whitespace after '['
./chirp/drivers/thd72.py:205:74: E202 whitespace before ']'
./chirp/drivers/thd72.py:206:18: E201 whitespace after '['
./chirp/drivers/thd72.py:206:65: E202 whitespace before ']'
./chirp/drivers/thd72.py:595:1: W293 blank line contains whitespace
./chirp/drivers/thd72.py:603:1: W293 blank line contains whitespace
./chirp/ui/mainapp.py:647:13: E128 continuation line under-indented for visual indent
./chirp/ui/mainapp.py:661:5: E303 too many blank lines (2)
./chirp/ui/mainapp.py:1374:80: E501 line too long (81 > 79 characters)
./chirp/ui/mainapp.py:1378:80: E501 line too long (80 > 79 characters)
./chirp/ui/mainapp.py:1663:80: E501 line too long (85 > 79 characters)
real 0m7.470s
user 0m7.384s
sys 0m0.016s
================================================
Tests OK
+ cat /var/lib/jenkins/.chirp/debug.log
[2016-08-18 06:32:57,808] chirp.logger - DEBUG: CHIRP 0.3.0dev on Linux - Ubuntu 16.04.1 LTS (Python 2.7.12)
[2016-08-18 06:32:57,844] chirp.directory - INFO: Registered Kenwood_TH-D7 = THD7Radio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TH-D7G = THD7GRadio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TM-D700 = TMD700Radio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TM-V7 = TMV7Radio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TM-G707 = TMG707Radio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TH-G71 = THG71Radio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TH-F6 = THF6ARadio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TH-F7 = THF7ERadio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TM-D710 = TMD710Radio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TH-D72_live_mode = THD72Radio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TM-V71 = TMV71Radio
[2016-08-18 06:32:57,845] chirp.directory - INFO: Registered Kenwood_TM-D710G = TMD710GRadio
[2016-08-18 06:32:57,846] chirp.directory - INFO: Registered Kenwood_TH-K2 = THK2Radio
[2016-08-18 06:32:57,846] chirp.directory - INFO: Registered Kenwood_TM-271 = TM271Radio
[2016-08-18 06:32:57,846] chirp.directory - INFO: Registered Kenwood_TM-281 = TM281Radio
[2016-08-18 06:32:57,846] chirp.directory - INFO: Registered Kenwood_TM-471 = TM471Radio
[2016-08-18 06:32:57,846] chirp.directory - INFO: Registered Icom_7200 = Icom7200Radio
[2016-08-18 06:32:57,846] chirp.directory - INFO: Registered Icom_IC-7000 = Icom7000Radio
[2016-08-18 06:32:57,846] chirp.directory - INFO: Registered Icom_746 = Icom746Radio
[2016-08-18 06:32:57,847] chirp.directory - INFO: Registered Alinco_DR03T = DR03Radio
[2016-08-18 06:32:57,847] chirp.directory - INFO: Registered Alinco_DR06T = DR06Radio
[2016-08-18 06:32:57,847] chirp.directory - INFO: Registered Alinco_DR135T = DR135Radio
[2016-08-18 06:32:57,847] chirp.directory - INFO: Registered Alinco_DR235T = DR235Radio
[2016-08-18 06:32:57,847] chirp.directory - INFO: Registered Alinco_DR435T = DR435Radio
[2016-08-18 06:32:57,847] chirp.directory - INFO: Registered Alinco_DJ596 = DJ596Radio
[2016-08-18 06:32:57,847] chirp.directory - INFO: Registered Jetstream_JT220M = JT220MRadio
[2016-08-18 06:32:57,848] chirp.directory - INFO: Registered Alinco_DJ175 = DJ175Radio
[2016-08-18 06:32:57,848] chirp.directory - INFO: Registered AnyTone_5888UV = AnyTone5888UVRadio
[2016-08-18 06:32:57,848] chirp.directory - INFO: Registered Intek_HR-2040 = IntekHR2040Radio
[2016-08-18 06:32:57,848] chirp.directory - INFO: Registered Polmar_DB-50M = PolmarDB50MRadio
[2016-08-18 06:32:57,848] chirp.directory - INFO: Registered Powerwerx_DB-750X = PowerwerxDB750XRadio
[2016-08-18 06:32:57,848] chirp.directory - INFO: Registered AnyTone_TERMN-8R = AnyToneTERMN8RRadio
[2016-08-18 06:32:57,848] chirp.directory - INFO: Registered AnyTone_OBLTR-8R = AnyToneOBLTR8RRadio
[2016-08-18 06:32:57,849] chirp.directory - INFO: Registered Baofeng_UV-3R = UV3RRadio
[2016-08-18 06:32:57,850] chirp.directory - INFO: Registered Baojie_BJ-9900 = BJ9900Radio
[2016-08-18 06:32:57,850] chirp.directory - INFO: Registered Baofeng_UV-5R = BaofengUV5RGeneric
[2016-08-18 06:32:57,850] chirp.directory - INFO: Registered Baofeng_F-11 = BaofengF11Radio
[2016-08-18 06:32:57,851] chirp.directory - INFO: Registered Baofeng_UV-82 = BaofengUV82Radio
[2016-08-18 06:32:57,851] chirp.directory - INFO: Registered Baofeng_UV-6 = BaofengUV6Radio
[2016-08-18 06:32:57,851] chirp.directory - INFO: Registered Intek_KT-980HP = IntekKT980Radio
[2016-08-18 06:32:57,851] chirp.directory - INFO: Registered Baofeng_BF-F8HP = BaofengBFF8HPRadio
[2016-08-18 06:32:57,851] chirp.directory - INFO: Registered Baofeng_UV-82HP = BaofengUV82HPRadio
[2016-08-18 06:32:57,851] chirp.directory - INFO: Registered Baojie_BJ-UV55 = BaojieBJUV55Radio
[2016-08-18 06:32:57,851] chirp.directory - INFO: Registered BTECH_UV-2501 = UV2501
[2016-08-18 06:32:57,852] chirp.directory - INFO: Registered BTECH_UV-2501+220 = UV2501_220
[2016-08-18 06:32:57,852] chirp.directory - INFO: Registered BTECH_UV-5001 = UV5001
[2016-08-18 06:32:57,852] chirp.directory - INFO: Registered WACCOM_MINI-8900 = MINI8900
[2016-08-18 06:32:57,852] chirp.directory - INFO: Registered QYT_KT-UV980 = KTUV980
[2016-08-18 06:32:57,852] chirp.directory - INFO: Registered QYT_KT8900 = KT9800
[2016-08-18 06:32:57,852] chirp.directory - INFO: Registered QYT_KT8900R = KT9800R
[2016-08-18 06:32:57,852] chirp.directory - INFO: Registered LUITON_LT-588UV = LT588UV
[2016-08-18 06:32:57,852] chirp.directory - INFO: Registered Feidaxin_FD-268A = FD268ARadio
[2016-08-18 06:32:57,852] chirp.directory - INFO: Registered Feidaxin_FD-268B = FD268BRadio
[2016-08-18 06:32:57,853] chirp.directory - INFO: Registered Feidaxin_FD-288A = FD288ARadio
[2016-08-18 06:32:57,853] chirp.directory - INFO: Registered Feidaxin_FD-288B = FD288BRadio
[2016-08-18 06:32:57,853] chirp.directory - INFO: Registered Feidaxin_FD-150A = FD150ARadio
[2016-08-18 06:32:57,853] chirp.directory - INFO: Registered Feidaxin_FD-160A = FD160ARadio
[2016-08-18 06:32:57,853] chirp.directory - INFO: Registered Feidaxin_FD-450A = FD450ARadio
[2016-08-18 06:32:57,853] chirp.directory - INFO: Registered Feidaxin_FD-460A = FD460ARadio
[2016-08-18 06:32:57,853] chirp.directory - INFO: Registered Yaesu_FT-1802M = FT1802Radio
[2016-08-18 06:32:57,854] chirp.directory - INFO: Registered Yaesu_FT-1D_R = FT1Radio
[2016-08-18 06:32:57,854] chirp.directory - INFO: Registered Yaesu_FT-2800M = FT2800Radio
[2016-08-18 06:32:57,855] chirp.directory - INFO: Registered Yaesu_FT-2900R_1900R = FT2900Radio
[2016-08-18 06:32:57,855] chirp.directory - INFO: Registered Yaesu_FT-50 = FT50Radio
[2016-08-18 06:32:57,856] chirp.directory - INFO: Registered Yaesu_FT-60 = FT60Radio
[2016-08-18 06:32:57,856] chirp.directory - INFO: Registered Yaesu_FT-7800_7900 = FT7800Radio
[2016-08-18 06:32:57,856] chirp.directory - INFO: Registered Yaesu_FT-8800 = FT8800Radio
[2016-08-18 06:32:57,856] chirp.directory - INFO: Registered Yaesu_FT-8900 = FT8900Radio
[2016-08-18 06:32:57,856] chirp.directory - INFO: Registered Yaesu_FT-8100 = FT8100Radio
[2016-08-18 06:32:57,857] chirp.directory - INFO: Registered Yaesu_FT-817 = FT817Radio
[2016-08-18 06:32:57,857] chirp.directory - INFO: Registered Yaesu_FT-817ND = FT817NDRadio
[2016-08-18 06:32:57,857] chirp.directory - INFO: Registered Yaesu_FT-817ND_US = FT817NDUSRadio
[2016-08-18 06:32:57,857] chirp.directory - INFO: Registered Yaesu_FT-857_897 = FT857Radio
[2016-08-18 06:32:57,857] chirp.directory - INFO: Registered Yaesu_FT-857_897_US = FT857USRadio
[2016-08-18 06:32:57,858] chirp.directory - INFO: Registered Yaesu_FT-90 = FT90Radio
[2016-08-18 06:32:57,858] chirp.directory - INFO: Registered Yaesu_FTM-350 = FTM350Radio
[2016-08-18 06:32:57,859] chirp.directory - INFO: Registered Generic_CSV = CSVRadio
[2016-08-18 06:32:57,859] chirp.directory - INFO: Registered Commander_KG-UV = CommanderCSVRadio
[2016-08-18 06:32:57,859] chirp.directory - INFO: Registered RT_Systems_CSV = RTCSVRadio
[2016-08-18 06:32:57,859] chirp.directory - INFO: Registered ARRL_Travel_Plus = TpeRadio
[2016-08-18 06:32:57,867] chirp.directory - INFO: Registered Generic_XML = XMLRadio
[2016-08-18 06:32:57,870] chirp.directory - INFO: Registered Baofeng_BF-888 = H777Radio
[2016-08-18 06:32:57,871] chirp.directory - INFO: Registered HobbyPCB_RS-UV3 = HobbyPCBRSUV3Radio
[2016-08-18 06:32:57,871] chirp.directory - INFO: Registered Icom_IC-208H = IC208Radio
[2016-08-18 06:32:57,871] chirp.directory - INFO: Registered Icom_IC-2100H = IC2100Radio
[2016-08-18 06:32:57,871] chirp.directory - INFO: Registered Icom_IC-2200H = IC2200Radio
[2016-08-18 06:32:57,871] chirp.directory - INFO: Registered Icom_IC-2720H = IC2720Radio
[2016-08-18 06:32:57,872] chirp.directory - INFO: Registered Icom_IC-2820H = IC2820Radio
[2016-08-18 06:32:57,872] chirp.directory - INFO: Registered Icom_IC-91_92AD = IC9xRadio
[2016-08-18 06:32:57,872] chirp.directory - INFO: Registered Icom_IC-Q7A = ICQ7Radio
[2016-08-18 06:32:57,872] chirp.directory - INFO: Registered Icom_IC-T70 = ICT70Radio
[2016-08-18 06:32:57,873] chirp.directory - INFO: Registered Icom_IC-T7H = ICT7HRadio
[2016-08-18 06:32:57,873] chirp.directory - INFO: Registered Icom_IC-T8A = ICT8ARadio
[2016-08-18 06:32:57,873] chirp.directory - INFO: Registered Icom_IC-W32A = ICW32ARadio
[2016-08-18 06:32:57,873] chirp.directory - INFO: Registered Icom_IC-W32E = ICW32ERadio
[2016-08-18 06:32:57,874] chirp.directory - INFO: Registered Icom_IC-V82_U82 = ICx8xRadio
[2016-08-18 06:32:57,874] chirp.directory - INFO: Registered Icom_ID-31A = ID31Radio
[2016-08-18 06:32:57,874] chirp.directory - INFO: Registered Icom_ID-51 = ID51Radio
[2016-08-18 06:32:57,874] chirp.directory - INFO: Registered Icom_ID-51_Plus = ID51PLUSRadio
[2016-08-18 06:32:57,874] chirp.directory - INFO: Registered Icom_ID-800H_v2 = ID800v2Radio
[2016-08-18 06:32:57,875] chirp.directory - INFO: Registered Icom_ID-880H = ID880Radio
[2016-08-18 06:32:57,875] chirp.directory - INFO: Registered Icom_ID-80H = ID80Radio
[2016-08-18 06:32:57,875] chirp.directory - INFO: Registered Kenwood_HMK = HMKRadio
[2016-08-18 06:32:57,875] chirp.directory - INFO: Registered Kenwood_ITM = ITMRadio
[2016-08-18 06:32:57,875] chirp.directory - INFO: Registered Wouxun_KG-UV8D = KGUV8DRadio
[2016-08-18 06:32:57,876] chirp.directory - INFO: Registered KYD_NC-630A = NC630aRadio
[2016-08-18 06:32:57,876] chirp.directory - INFO: Registered KYD_IP-620 = IP620Radio
[2016-08-18 06:32:57,876] chirp.directory - INFO: Registered Leixen_VV-898 = LeixenVV898Radio
[2016-08-18 06:32:57,877] chirp.directory - INFO: Registered Jetstream_JT270M = JetstreamJT270MRadio
[2016-08-18 06:32:57,877] chirp.directory - INFO: Registered Wouxun_KG-UVD1P = KGUVD1PRadio
[2016-08-18 06:32:57,877] chirp.directory - INFO: Registered Wouxun_KG-UV6 = KGUV6DRadio
[2016-08-18 06:32:57,877] chirp.directory - INFO: Registered Wouxun_KG-816 = KG816Radio
[2016-08-18 06:32:57,877] chirp.directory - INFO: Registered Wouxun_KG-818 = KG818Radio
[2016-08-18 06:32:57,877] chirp.directory - INFO: Registered Puxing_PX-777 = Puxing777Radio
[2016-08-18 06:32:57,878] chirp.directory - INFO: Registered Puxing_PX-2R = Puxing2RRadio
[2016-08-18 06:32:57,878] chirp.directory - INFO: Registered TYT_TH-7800_File = TYTTH7800File
[2016-08-18 06:32:57,878] chirp.directory - INFO: Registered TYT_TH-7800 = TYTTH7800Radio
[2016-08-18 06:32:57,878] chirp.directory - INFO: Registered TYT_TH9000_220 = Th9000220Radio
[2016-08-18 06:32:57,878] chirp.directory - INFO: Registered TYT_TH9000_144 = Th9000144Radio
[2016-08-18 06:32:57,879] chirp.directory - INFO: Registered TYT_TH9000_440 = Th9000440Radio
[2016-08-18 06:32:57,879] chirp.directory - INFO: Registered TYT_TH-9800_File = TYTTH9800File
[2016-08-18 06:32:57,880] chirp.directory - INFO: Registered TYT_TH-9800 = TYTTH9800Radio
[2016-08-18 06:32:57,880] chirp.directory - INFO: Registered TYT_TH-UV3R = TYTUV3RRadio
[2016-08-18 06:32:57,880] chirp.directory - INFO: Registered TYT_TH-UV3R-25 = TYTUV3R25Radio
[2016-08-18 06:32:57,880] chirp.directory - INFO: Registered TYT_TH-UVF8D = TYTUVF8DRadio
[2016-08-18 06:32:57,881] chirp.directory - INFO: Registered Kenwood_TH-D72_clone_mode = THD72Radio
[2016-08-18 06:32:57,881] chirp.directory - INFO: Registered TYT_TH-UVF1 = TYTTHUVF1Radio
[2016-08-18 06:32:57,881] chirp.directory - INFO: Registered Kenwood_TK-260 = TK260_Radio
[2016-08-18 06:32:57,882] chirp.directory - INFO: Registered Kenwood_TK-270 = TK270_Radio
[2016-08-18 06:32:57,882] chirp.directory - INFO: Registered Kenwood_TK-272 = TK272_Radio
[2016-08-18 06:32:57,882] chirp.directory - INFO: Registered Kenwood_TK-278 = TK278_Radio
[2016-08-18 06:32:57,882] chirp.directory - INFO: Registered Kenwood_TK-360 = TK360_Radio
[2016-08-18 06:32:57,882] chirp.directory - INFO: Registered Kenwood_TK-370 = TK370_Radio
[2016-08-18 06:32:57,882] chirp.directory - INFO: Registered Kenwood_TK-372 = TK372_Radio
[2016-08-18 06:32:57,882] chirp.directory - INFO: Registered Kenwood_TK-378 = TK378_Radio
[2016-08-18 06:32:57,882] chirp.directory - INFO: Registered Kenwood_TK-760 = TK760_Radio
[2016-08-18 06:32:57,882] chirp.directory - INFO: Registered Kenwood_TK-762 = TK762_Radio
[2016-08-18 06:32:57,883] chirp.directory - INFO: Registered Kenwood_TK-768 = TK768_Radio
[2016-08-18 06:32:57,883] chirp.directory - INFO: Registered Kenwood_TK-860 = TK860_Radio
[2016-08-18 06:32:57,883] chirp.directory - INFO: Registered Kenwood_TK-862 = TK862_Radio
[2016-08-18 06:32:57,883] chirp.directory - INFO: Registered Kenwood_TK-868 = TK868_Radio
[2016-08-18 06:32:57,883] chirp.directory - INFO: Registered Kenwood_TK-868G = TK868G_Radios
[2016-08-18 06:32:57,883] chirp.directory - INFO: Registered Kenwood_TK-862G = TK862G_Radios
[2016-08-18 06:32:57,883] chirp.directory - INFO: Registered Kenwood_TK-860G = TK860G_Radios
[2016-08-18 06:32:57,884] chirp.directory - INFO: Registered Kenwood_TK-768G = TK768G_Radios
[2016-08-18 06:32:57,884] chirp.directory - INFO: Registered Kenwood_TK-762G = TK762G_Radios
[2016-08-18 06:32:57,884] chirp.directory - INFO: Registered Kenwood_TK-760G = TK760G_Radios
[2016-08-18 06:32:57,884] chirp.directory - INFO: Registered Kenwood_TK-278G = TK278G_Radios
[2016-08-18 06:32:57,884] chirp.directory - INFO: Registered Kenwood_TK-272G = TK272G_Radios
[2016-08-18 06:32:57,884] chirp.directory - INFO: Registered Kenwood_TK-270G = TK270G_Radios
[2016-08-18 06:32:57,884] chirp.directory - INFO: Registered Kenwood_TK-260G = TK260G_Radios
[2016-08-18 06:32:57,884] chirp.directory - INFO: Registered Kenwood_TK-7102 = KenwoodTK7102Radio
[2016-08-18 06:32:57,884] chirp.directory - INFO: Registered Kenwood_TK-8102 = KenwoodTK8102Radio
[2016-08-18 06:32:57,885] chirp.directory - INFO: Registered Kenwood_TK-7108 = KenwoodTK7108Radio
[2016-08-18 06:32:57,885] chirp.directory - INFO: Registered Kenwood_TK-8108 = KenwoodTK8108Radio
[2016-08-18 06:32:57,885] chirp.directory - INFO: Registered Kenwood_TS-2000 = TS2000Radio
[2016-08-18 06:32:57,886] chirp.directory - INFO: Registered BTECH_UV-5X3 = UV5X3
[2016-08-18 06:32:57,886] chirp.directory - INFO: Registered Baofeng_UV-6R = UV6R
[2016-08-18 06:32:57,886] chirp.directory - INFO: Registered Baofeng_UV-B5 = BaofengUVB5
[2016-08-18 06:32:57,887] chirp.directory - INFO: Registered BTECH_UV-50X3 = UV50X3
[2016-08-18 06:32:57,887] chirp.directory - INFO: Registered Yaesu_VX-170 = VX170Radio
[2016-08-18 06:32:57,887] chirp.directory - INFO: Registered Yaesu_VX-2 = VX2Radio
[2016-08-18 06:32:57,887] chirp.directory - INFO: Registered Yaesu_VX-3 = VX3Radio
[2016-08-18 06:32:57,888] chirp.directory - INFO: Registered Yaesu_VX-5 = VX5Radio
[2016-08-18 06:32:57,888] chirp.directory - INFO: Registered Yaesu_VX-6 = VX6Radio
[2016-08-18 06:32:57,888] chirp.directory - INFO: Registered Yaesu_VX-7 = VX7Radio
[2016-08-18 06:32:57,889] chirp.directory - INFO: Registered Yaesu_VX-8_R = VX8Radio
[2016-08-18 06:32:57,889] chirp.directory - INFO: Registered Yaesu_VX-8_DR = VX8DRadio
[2016-08-18 06:32:57,889] chirp.directory - INFO: Registered Yaesu_VX-8_GE = VX8GERadio
[2016-08-18 06:32:57,889] chirp.directory - INFO: Registered Vertex_Standard_VXA-700 = VXA700Radio
+ rm /tmp/Alinco_DJ175_09x2TP.img /tmp/Alinco_DJ175_MrFsWm.img /tmp/Alinco_DJ596_80A0G9.img /tmp/Alinco_DJ596_E_dowQ.img /tmp/Alinco_DR235T_7cmY3j.img /tmp/Alinco_DR235T_XDErCc.img /tmp/AnyTone_OBLTR-8R_Yb3GEw.img /tmp/AnyTone_OBLTR-8R_qYYRZf.img /tmp/AnyTone_TERMN-8R_PkUYVB.img /tmp/AnyTone_TERMN-8R_n0PFJ2.img /tmp/BTECH_UV-2501+220_W1HXj6.img /tmp/BTECH_UV-2501+220_zXmuY_.img /tmp/BTECH_UV-5001_TZNsox.img /tmp/BTECH_UV-5001_gIUan3.img /tmp/BTECH_UV-50X3_Eo3AOH.img /tmp/BTECH_UV-50X3_PAvjbV.img /tmp/BTECH_UV-50X3_ceYtqs.img /tmp/BTECH_UV-50X3_gAhJN6.img /tmp/BTECH_UV-50X3_gqpA0S.img /tmp/BTECH_UV-50X3_yoYmik.img /tmp/BTECH_UV-5X3_5pmKXm.img /tmp/Baofeng_BF-888_M8HHcD.img /tmp/Baofeng_BF-888_UX27Fp.img /tmp/Baofeng_F-11_aaoi4o.img /tmp/Baofeng_F-11_cg7zx7.img /tmp/Baofeng_UV-3R_OJYtx9.img /tmp/Baofeng_UV-3R_tVDaLl.img /tmp/Baofeng_UV-5R_UxHhGo.img /tmp/Baofeng_UV-5R_oHp4v3.img /tmp/Baofeng_UV-6R_UF5GtK.img /tmp/Baofeng_UV-6R_XcpTgm.img /tmp/Baofeng_UV-B5_UvT87Z.img /tmp/Baofeng_UV-B5_sd31IX.img /tmp/Baojie_BJ-9900_9UpO6p.img /tmp/Baojie_BJ-9900_EGJiFH.img /tmp/Baojie_BJ-9900_HyFXoY.img /tmp/Baojie_BJ-9900_eklZzC.img /tmp/Baojie_BJ-9900_lVIOF6.img /tmp/Baojie_BJ-9900_u4V97O.img /tmp/Feidaxin_FD-268A_MSvFC8.img /tmp/Feidaxin_FD-268A_uAGjFk.img /tmp/Feidaxin_FD-268B_HaHRtH.img /tmp/Feidaxin_FD-268B_oNMKTB.img /tmp/Feidaxin_FD-288B_PVJD8u.img /tmp/Feidaxin_FD-288B_Vn04rz.img /tmp/Icom_IC-208H_EZWVTn.img /tmp/Icom_IC-208H_jCsZZ9.img /tmp/Icom_IC-2100H_AIfRI4.img /tmp/Icom_IC-2100H_PgiTuN.img /tmp/Icom_IC-2200H_YmS0UQ.img /tmp/Icom_IC-2200H_YpN8rL.img /tmp/Icom_IC-2720H_5pXXLp.img /tmp/Icom_IC-2720H_Yrtpwj.img /tmp/Icom_IC-2820H_KmgH2P.img /tmp/Icom_IC-2820H__U9F1w.img /tmp/Icom_IC-Q7A_b96jK2.img /tmp/Icom_IC-Q7A_meHvNW.img /tmp/Icom_IC-T70_BqgYKV.img /tmp/Icom_IC-T70_kmDCXf.img /tmp/Icom_IC-T7H_2X91FI.img /tmp/Icom_IC-T7H_TIOfKK.img /tmp/Icom_IC-T8A_SntrM6.img /tmp/Icom_IC-T8A_cNRHr5.img /tmp/Icom_IC-V82_U82_3xOCE4.img /tmp/Icom_IC-V82_U82_J5oLDD.img /tmp/Icom_IC-W32A_AF3KuC.img /tmp/Icom_IC-W32A_SUqQJP.img /tmp/Icom_IC-W32A_o1kNyn.img /tmp/Icom_IC-W32A_pM1eR9.img /tmp/Icom_IC-W32A_p_CM96.img /tmp/Icom_IC-W32A_yg43DS.img /tmp/Icom_IC-W32E_43RyLY.img /tmp/Icom_IC-W32E_AF_Z_k.img /tmp/Icom_IC-W32E_RCkKcd.img /tmp/Icom_IC-W32E_dyXU2_.img /tmp/Icom_IC-W32E_gQgTO9.img /tmp/Icom_IC-W32E_p4W6kl.img /tmp/Icom_ID-31A_GwQnvI.img /tmp/Icom_ID-31A_hrWMQZ.img /tmp/Icom_ID-51 Plus_gfrK78.img /tmp/Icom_ID-51 Plus_w_VTiZ.img /tmp/Icom_ID-51_95pNhJ.img /tmp/Icom_ID-51_98QWkk.img /tmp/Icom_ID-800H_07w5es.img /tmp/Icom_ID-800H_4hrlbL.img /tmp/Icom_ID-880H_MCzjDy.img /tmp/Icom_ID-880H__gkyYl.img /tmp/Jetstream_JT220M_ZODQta.img /tmp/Jetstream_JT220M_uAFPgE.img /tmp/Jetstream_JT270M_AyJUDF.img /tmp/Jetstream_JT270M_IFGePk.img /tmp/KYD_IP-620_WsORc1.img /tmp/KYD_IP-620_y5daku.img /tmp/Kenwood_TH-D72 (clone mode)_fLdB45.img /tmp/Kenwood_TH-D72 (clone mode)_rl3eiV.img /tmp/Kenwood_TK-272G_4niLlo.img /tmp/Kenwood_TK-272G_WaSo7c.img /tmp/Kenwood_TK-760G_FmAdbp.img /tmp/Kenwood_TK-760G_sWTvJA.img /tmp/Kenwood_TK-8102_2N5o44.img /tmp/Kenwood_TK-8102_FWH61h.img /tmp/Leixen_VV-898_OMgzPE.img /tmp/Leixen_VV-898_xiNnJH.img /tmp/Polmar_DB-50M_90Nidd.img /tmp/Polmar_DB-50M_KhO7zS.img /tmp/Puxing_PX-2R_3aqZDZ.img /tmp/Puxing_PX-2R_YVai32.img /tmp/Puxing_PX-777_1G7KsS.img /tmp/Puxing_PX-777_ClN48N.img /tmp/TYT_TH-7800_InywFe.img /tmp/TYT_TH-7800_Xvawb3.img /tmp/TYT_TH-9800_a6q5sn.img /tmp/TYT_TH-9800_kpz8k_.img /tmp/TYT_TH-UV3R-25_9M8YXa.img /tmp/TYT_TH-UV3R-25_W8iyep.img /tmp/TYT_TH-UV3R_eeR7EV.img /tmp/TYT_TH-UV3R_n4bmwy.img /tmp/TYT_TH-UVF1_K2deXd.img /tmp/TYT_TH-UVF1__U6Tay.img /tmp/TYT_TH9000_144_SPmnIg.img /tmp/TYT_TH9000_144_t4DVDP.img /tmp/Vertex Standard_VXA-700_78mZH_.img /tmp/Vertex Standard_VXA-700_zvahkE.img /tmp/WACCOM_MINI-8900_WEDGPz.img /tmp/WACCOM_MINI-8900_iyX9Au.img /tmp/Wouxun_KG-816_wh1VtB.img /tmp/Wouxun_KG-816_xWhO1n.img /tmp/Wouxun_KG-818_4TXw92.img /tmp/Wouxun_KG-818_IrWpaS.img /tmp/Wouxun_KG-UV6_7Yv9p_.img /tmp/Wouxun_KG-UV6_YOxipb.img /tmp/Wouxun_KG-UV8D_2p5fQu.img /tmp/Wouxun_KG-UV8D_SUAJOZ.img /tmp/Wouxun_KG-UVD1P_S30L9T.img /tmp/Wouxun_KG-UVD1P_lgn6nY.img /tmp/Yaesu_FT-1802M_jJvpbx.img /tmp/Yaesu_FT-1802M_teCGjt.img /tmp/Yaesu_FT-1D_JWoSPF.img /tmp/Yaesu_FT-1D_v7OmRC.img /tmp/Yaesu_FT-2800M_ERXldI.img /tmp/Yaesu_FT-2800M_hrPyOj.img /tmp/Yaesu_FT-2900R_1900R_lK_LUV.img /tmp/Yaesu_FT-2900R_1900R_obzMwv.img /tmp/Yaesu_FT-50_TYXqEC.img /tmp/Yaesu_FT-50_zfgnEs.img /tmp/Yaesu_FT-60_XnVwXB.img /tmp/Yaesu_FT-60_dDUvHK.img /tmp/Yaesu_FT-7800_7900_InpNgr.img /tmp/Yaesu_FT-7800_7900_u2m1M0.img /tmp/Yaesu_FT-817ND (US)_X6UdJB.img /tmp/Yaesu_FT-817ND (US)_vvukAO.img /tmp/Yaesu_FT-817ND_NqRTSE.img /tmp/Yaesu_FT-817ND_tUI3_K.img /tmp/Yaesu_FT-817_qs_9Xz.img /tmp/Yaesu_FT-817_vlY0xs.img /tmp/Yaesu_FT-857_897 (US)_LCLrsK.img /tmp/Yaesu_FT-857_897 (US)_q6sw4l.img /tmp/Yaesu_FT-857_897_8m0S9p.img /tmp/Yaesu_FT-857_897_OqNJNO.img /tmp/Yaesu_FT-8800_8jNXje.img /tmp/Yaesu_FT-8800_Nz2B6i.img /tmp/Yaesu_FT-8800_ObbnZy.img /tmp/Yaesu_FT-8800_RUWwvC.img /tmp/Yaesu_FT-8800_aAB3eQ.img /tmp/Yaesu_FT-8800_p7y5R1.img /tmp/Yaesu_FT-8900_ZK4iOE.img /tmp/Yaesu_FT-8900_wSbS1A.img /tmp/Yaesu_FTM-350_50Sl03.img /tmp/Yaesu_FTM-350_Rj18NX.img /tmp/Yaesu_FTM-350_UxiQ9_.img /tmp/Yaesu_FTM-350_YVbCHj.img /tmp/Yaesu_FTM-350_YXcQ8x.img /tmp/Yaesu_FTM-350_xpu5Ug.img /tmp/Yaesu_VX-2_eq_DBs.img /tmp/Yaesu_VX-2_jxv0L8.img /tmp/Yaesu_VX-3_2XULeh.img /tmp/Yaesu_VX-3_VD4w8X.img /tmp/Yaesu_VX-5_DKem9B.img /tmp/Yaesu_VX-5__m2LQw.img /tmp/Yaesu_VX-6_8c5mnC.img /tmp/Yaesu_VX-6_mFQNTt.img /tmp/Yaesu_VX-7_5WYBfr.img /tmp/Yaesu_VX-7_o5plJ4.img /tmp/Yaesu_VX-8_82eUaC.img /tmp/Yaesu_VX-8_z0E_3z.img
Email was triggered for: Success
Sending email for trigger: Success
1
0
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1471473972 14400
# Node ID 94486d119baf0865094297c316e1655b66c0c325
# Parent 25e6a65fd82c55bb7dd98126a278d4854bc59731
[UV-6X3] Add Support for BTech UV-5X3
This driver adds support for the BTech UV-5X3 tri-band handheld radio.
related to #3931
diff -r 25e6a65fd82c -r 94486d119baf chirp/drivers/uv5x3.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/drivers/uv5x3.py Wed Aug 17 18:46:12 2016 -0400
@@ -0,0 +1,862 @@
+# Copyright 2016:
+# * Jim Unroe KC9HI, <rock.unroe(a)gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import time
+import struct
+import logging
+import re
+
+LOG = logging.getLogger(__name__)
+
+from chirp.drivers import baofeng_common
+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
+
+##### MAGICS #########################################################
+
+# BTECH UV-5X3 magic string
+MSTRING_UV5X3 = "\x50\x0D\x0C\x20\x16\x03\x28"
+
+##### ID strings #####################################################
+
+# BTECH UV-5X3
+UV5X3_fp1 = "UVVG302" # BFB300 original
+UV5X3_fp2 = "UVVG301" # UVV300 original
+UV5X3_fp3 = "UVVG306" # UVV306 original
+
+DTMF_CHARS = " 1234567890*#ABCD"
+STEPS = [2.5, 5.0, 6.25, 10.0, 12.5, 20.0, 25.0, 50.0]
+
+LIST_AB = ["A", "B"]
+LIST_ALMOD = ["Site", "Tone", "Code"]
+LIST_BANDWIDTH = ["Wide", "Narrow"]
+LIST_COLOR = ["Off", "Blue", "Orange", "Purple"]
+LIST_DTMFSPEED = ["%s ms" % x for x in range(50, 2010, 10)]
+LIST_DTMFST = ["Off", "DT-ST", "ANI-ST", "DT+ANI"]
+LIST_MODE = ["Channel", "Name", "Frequency"]
+LIST_OFF1TO9 = ["Off"] + list("123456789")
+LIST_OFF1TO10 = LIST_OFF1TO9 + ["10"]
+LIST_OFFAB = ["Off"] + LIST_AB
+LIST_RESUME = ["TO", "CO", "SE"]
+LIST_PONMSG = ["Full", "Message"]
+LIST_PTTID = ["Off", "BOT", "EOT", "Both"]
+LIST_SCODE = ["%s" % x for x in range(1, 16)]
+LIST_RPSTE = ["Off"] + ["%s" % x for x in range(1, 11)]
+LIST_SAVE = ["Off", "1:1", "1:2", "1:3", "1:4"]
+LIST_SHIFTD = ["Off", "+", "-"]
+LIST_STEDELAY = ["Off"] + ["%s ms" % x for x in range(100, 1100, 100)]
+LIST_STEP = [str(x) for x in STEPS]
+LIST_TIMEOUT = ["%s sec" % x for x in range(15, 615, 15)]
+LIST_TXPOWER = ["High", "Low"]
+LIST_VOICE = ["Off", "English", "Chinese"]
+LIST_WORKMODE = ["Frequency", "Channel"]
+
+def model_match(cls, data):
+ """Match the opened/downloaded image to the correct version"""
+ match_rid1 = False
+ match_rid2 = False
+
+ rid1 = data[0x1EF0:0x1EF7]
+
+ if rid1 in cls._fileid:
+ match_rid1 = True
+
+ if match_rid1:
+ return True
+ else:
+ return False
+
+
+(a)directory.register
+class UV5X3(baofeng_common.BaofengCommonHT):
+ """BTech UV-5X3"""
+ VENDOR = "BTECH"
+ MODEL = "UV-5X3"
+
+ _fileid = [UV5X3_fp3,
+ UV5X3_fp2,
+ UV5X3_fp1]
+
+ _magic = [MSTRING_UV5X3, ]
+ _magic_response_length = 14
+ _fw_ver_start = 0x1EF0
+ _recv_block_size = 0x40
+ _mem_size = 0x2000
+ _ack_block = True
+
+ _ranges = [(0x0000, 0x0DF0),
+ (0x0E00, 0x1800),
+ (0x1EE0, 0x1EF0),
+ (0x1F80, 0x1F90),
+ (0x1FA0, 0x1FB0),
+ (0x1FE0, 0x2000)]
+ _send_block_size = 0x10
+
+ MODES = ["FM", "NFM"]
+ VALID_CHARS = chirp_common.CHARSET_ALPHANUMERIC + \
+ "!@#$%^&*()+-=[]:\";'<>?,./"
+ LENGTH_NAME = 7
+ SKIP_VALUES = ["", "S"]
+ DTCS_CODES = sorted(chirp_common.DTCS_CODES + [645])
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00),
+ chirp_common.PowerLevel("High", watts=5.00)]
+ VALID_BANDS = [(130000000, 180000000),
+ (222000000, 226000000),
+ (400000000, 521000000)]
+ PTTID_LIST = LIST_PTTID
+ SCODE_LIST = LIST_SCODE
+
+
+ MEM_FORMAT = """
+ #seekto 0x0000;
+ struct {
+ lbcd rxfreq[4];
+ lbcd txfreq[4];
+ ul16 rxtone;
+ ul16 txtone;
+ u8 unknown0:4,
+ scode:4;
+ u8 unknown1;
+ u8 unknown2:7,
+ lowpower:1;
+ u8 unknown3:1,
+ wide:1,
+ unknown4:2,
+ bcl:1,
+ scan:1,
+ pttid:2;
+ } memory[128];
+
+ #seekto 0x0E20;
+ struct {
+ u8 unused00:4,
+ squelch:4;
+ u8 unused01:5,
+ step:3;
+ u8 unknown00;
+ u8 unused02:5,
+ save:3;
+ u8 unused03:4,
+ vox:4;
+ u8 unknown01;
+ u8 unused04:4,
+ abr:4;
+ u8 unused05:7,
+ tdr:1;
+ u8 unused06:7,
+ beep:1;
+ u8 unused07:2,
+ timeout:6;
+ u8 unknown02[4];
+ u8 unused09:6,
+ voice:2;
+ u8 unknown03;
+ u8 unused10:6,
+ dtmfst:2;
+ u8 unknown04;
+ u8 unused11:6,
+ screv:2;
+ u8 unused12:6,
+ pttid:2;
+ u8 unused13:2,
+ pttlt:6;
+ u8 unused14:6,
+ mdfa:2;
+ u8 unused15:6,
+ mdfb:2;
+ u8 unknown05;
+ u8 unused16:7,
+ sync:1;
+ u8 unknown06[4];
+ u8 unused17:6,
+ wtled:2;
+ u8 unused18:6,
+ rxled:2;
+ u8 unused19:6,
+ txled:2;
+ u8 unused20:6,
+ almod:2;
+ u8 unknown07;
+ u8 unused21:6,
+ tdrab:2;
+ u8 unused22:7,
+ ste:1;
+ u8 unused23:4,
+ rpste:4;
+ u8 unused24:4,
+ rptrl:4;
+ u8 unused25:7,
+ ponmsg:1;
+ u8 unused26:7,
+ roger:1;
+ u8 unused27:7,
+ dani:1;
+ u8 unused28:2,
+ dtmfg:6;
+ u8 unknown08:6,
+ reset:1,
+ unknown09:1;
+ u8 unknown10[3];
+ u8 cht;
+ u8 unknown11[13];
+ u8 displayab:1,
+ unknown12:2,
+ fmradio:1,
+ alarm:1,
+ unknown13:2,
+ menu:1;
+ u8 unknown14;
+ u8 unused29:7,
+ workmode:1;
+ u8 unused30:7,
+ keylock:1;
+ } settings;
+
+ #seekto 0x0E76;
+ struct {
+ u8 unused0:1,
+ mrcha:7;
+ u8 unused1:1,
+ mrchb:7;
+ } wmchannel;
+
+ struct vfo {
+ u8 unknown0[8];
+ u8 freq[8];
+ u8 offset[6];
+ ul16 rxtone;
+ ul16 txtone;
+ u8 unused0:7,
+ band:1;
+ u8 unknown3;
+ u8 unknown4:2,
+ sftd:2,
+ scode:4;
+ u8 unknown5;
+ u8 unknown6:1,
+ step:3,
+ unknown7:4;
+ u8 txpower:1,
+ widenarr:1,
+ unknown8:6;
+ };
+
+ #seekto 0x0F00;
+ struct {
+ struct vfo a;
+ struct vfo b;
+ } vfo;
+
+ #seekto 0x0F4E;
+ u16 fm_presets;
+
+ #seekto 0x1000;
+ struct {
+ char name[7];
+ u8 unknown[9];
+ } names[128];
+
+ #seekto 0x1ED0;
+ struct {
+ char line1[7];
+ char line2[7];
+ } sixpoweron_msg;
+
+ #seekto 0x1EF0;
+ struct {
+ char line1[7];
+ char line2[7];
+ } firmware_msg;
+
+ struct squelch {
+ u8 sql0;
+ u8 sql1;
+ u8 sql2;
+ u8 sql3;
+ u8 sql4;
+ u8 sql5;
+ u8 sql6;
+ u8 sql7;
+ u8 sql8;
+ u8 sql9;
+ };
+
+ #seekto 0x1F80;
+ struct {
+ struct squelch vhf;
+ u8 unknown0[6];
+ u8 unknown1[16];
+ struct squelch uhf;
+ } squelch;
+
+ #seekto 0x1FE0;
+ struct {
+ char line1[7];
+ char line2[7];
+ } poweron_msg;
+
+ struct limit {
+ u8 enable;
+ bbcd lower[2];
+ bbcd upper[2];
+ };
+
+ #seekto 0x1FF0;
+ struct {
+ struct limit vhf;
+ struct limit vhf2;
+ struct limit uhf;
+ } limits;
+
+ """
+
+ @classmethod
+ def get_prompts(cls):
+ rp = chirp_common.RadioPrompts()
+ rp.experimental = \
+ ('The BTech UV-5X3 driver is a beta version.\n'
+ '\n'
+ 'Please save an unedited copy of your first successful\n'
+ 'download to a CHIRP Radio Images(*.img) file.'
+ )
+ rp.pre_download = _(dedent("""\
+ Follow these instructions to download your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the download of your radio data
+ """))
+ rp.pre_upload = _(dedent("""\
+ Follow this instructions to upload your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the upload of your radio data
+ """))
+ return rp
+
+ def process_mmap(self):
+ """Process the mem map into the mem object"""
+ self._memobj = bitwise.parse(self.MEM_FORMAT, self._mmap)
+
+ def get_settings(self):
+ """Translate the bit in the mem_struct into settings in the UI"""
+ _mem = self._memobj
+ basic = RadioSettingGroup("basic", "Basic Settings")
+ advanced = RadioSettingGroup("advanced", "Advanced Settings")
+ other = RadioSettingGroup("other", "Other Settings")
+ work = RadioSettingGroup("work", "Work Mode Settings")
+ fm_preset = RadioSettingGroup("fm_preset", "FM Preset")
+ service = RadioSettingGroup("service", "Service Settings")
+ top = RadioSettings(basic, advanced, other, work, fm_preset, service)
+
+ # Basic settings
+ if _mem.settings.squelch > 0x09:
+ val = 0x00
+ else:
+ val = _mem.settings.squelch
+ rs = RadioSetting("settings.squelch", "Squelch",
+ RadioSettingValueList(
+ LIST_OFF1TO9, LIST_OFF1TO9[val]))
+ basic.append(rs)
+
+ if _mem.settings.save > 0x04:
+ val = 0x00
+ else:
+ val = _mem.settings.save
+ rs = RadioSetting("settings.save", "Battery Saver",
+ RadioSettingValueList(
+ LIST_SAVE, LIST_SAVE[val]))
+ basic.append(rs)
+
+ if _mem.settings.vox > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.vox
+ rs = RadioSetting("settings.vox", "Vox",
+ RadioSettingValueList(
+ LIST_OFF1TO10, LIST_OFF1TO10[val]))
+ basic.append(rs)
+
+ if _mem.settings.abr > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.abr
+ rs = RadioSetting("settings.abr", "Backlight Timeout",
+ RadioSettingValueList(
+ LIST_OFF1TO10, LIST_OFF1TO10[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.tdr", "Dual Watch",
+ RadioSettingValueBoolean(_mem.settings.tdr))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.beep", "Beep",
+ RadioSettingValueBoolean(_mem.settings.beep))
+ basic.append(rs)
+
+ if _mem.settings.timeout > 0x27:
+ val = 0x03
+ else:
+ val = _mem.settings.timeout
+ rs = RadioSetting("settings.timeout", "Timeout Timer",
+ RadioSettingValueList(
+ LIST_TIMEOUT, LIST_TIMEOUT[val]))
+ basic.append(rs)
+
+ if _mem.settings.voice > 0x02:
+ val = 0x01
+ else:
+ val = _mem.settings.voice
+ rs = RadioSetting("settings.voice", "Voice Prompt",
+ RadioSettingValueList(
+ LIST_VOICE, LIST_VOICE[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.dtmfst", "DTMF Sidetone",
+ RadioSettingValueList(LIST_DTMFST, LIST_DTMFST[
+ _mem.settings.dtmfst]))
+ basic.append(rs)
+
+ if _mem.settings.screv > 0x02:
+ val = 0x01
+ else:
+ val = _mem.settings.screv
+ rs = RadioSetting("settings.screv", "Scan Resume",
+ RadioSettingValueList(
+ LIST_RESUME, LIST_RESUME[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.pttid", "When to send PTT ID",
+ RadioSettingValueList(LIST_PTTID, LIST_PTTID[
+ _mem.settings.pttid]))
+ basic.append(rs)
+
+ if _mem.settings.pttlt > 0x1E:
+ val = 0x05
+ else:
+ val = _mem.settings.pttlt
+ rs = RadioSetting("pttlt", "PTT ID Delay",
+ RadioSettingValueInteger(0, 50, val))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.mdfa", "Display Mode (A)",
+ RadioSettingValueList(LIST_MODE, LIST_MODE[
+ _mem.settings.mdfa]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.mdfb", "Display Mode (B)",
+ RadioSettingValueList(LIST_MODE, LIST_MODE[
+ _mem.settings.mdfb]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.sync", "Sync A & B",
+ RadioSettingValueBoolean(_mem.settings.sync))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.wtled", "Standby LED Color",
+ RadioSettingValueList(
+ LIST_COLOR, LIST_COLOR[_mem.settings.wtled]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.rxled", "RX LED Color",
+ RadioSettingValueList(
+ LIST_COLOR, LIST_COLOR[_mem.settings.rxled]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.txled", "TX LED Color",
+ RadioSettingValueList(
+ LIST_COLOR, LIST_COLOR[_mem.settings.txled]))
+ basic.append(rs)
+
+ if _mem.settings.almod > 0x02:
+ val = 0x00
+ else:
+ val = _mem.settings.almod
+ rs = RadioSetting("settings.almod", "Alarm Mode",
+ RadioSettingValueList(
+ LIST_ALMOD, LIST_ALMOD[val]))
+ basic.append(rs)
+
+ if _mem.settings.tdrab > 0x02:
+ val = 0x00
+ else:
+ val = _mem.settings.tdrab
+ rs = RadioSetting("settings.tdrab", "Dual Watch TX Priority",
+ RadioSettingValueList(
+ LIST_OFFAB, LIST_OFFAB[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.ste", "Squelch Tail Eliminate (HT to HT)",
+ RadioSettingValueBoolean(_mem.settings.ste))
+ basic.append(rs)
+
+ if _mem.settings.rpste > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.rpste
+ rs = RadioSetting("settings.rpste",
+ "Squelch Tail Eliminate (repeater)",
+ RadioSettingValueList(
+ LIST_RPSTE, LIST_RPSTE[val]))
+ basic.append(rs)
+
+ if _mem.settings.rptrl > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.rptrl
+ rs = RadioSetting("settings.rptrl", "STE Repeater Delay",
+ RadioSettingValueList(
+ LIST_STEDELAY, LIST_STEDELAY[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.ponmsg", "Power-On Message",
+ RadioSettingValueList(LIST_PONMSG, LIST_PONMSG[
+ _mem.settings.ponmsg]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.roger", "Roger Beep",
+ RadioSettingValueBoolean(_mem.settings.roger))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.dani", "Decode ANI",
+ RadioSettingValueBoolean(_mem.settings.dani))
+ basic.append(rs)
+
+ if _mem.settings.dtmfg > 0x3C:
+ val = 0x14
+ else:
+ val = _mem.settings.dtmfg
+ rs = RadioSetting("settings.dtmfg", "DTMF Gain",
+ RadioSettingValueInteger(0, 60, val))
+ basic.append(rs)
+
+ # Advanced settings
+ rs = RadioSetting("settings.reset", "RESET Menu",
+ RadioSettingValueBoolean(_mem.settings.reset))
+ advanced.append(rs)
+
+ rs = RadioSetting("settings.menu", "All Menus",
+ RadioSettingValueBoolean(_mem.settings.menu))
+ advanced.append(rs)
+
+ rs = RadioSetting("settings.fmradio", "Broadcast FM Radio",
+ RadioSettingValueBoolean(_mem.settings.fmradio))
+ advanced.append(rs)
+
+ rs = RadioSetting("settings.alarm", "Alarm Sound",
+ RadioSettingValueBoolean(_mem.settings.alarm))
+ advanced.append(rs)
+
+ # Other settings
+ def _filter(name):
+ filtered = ""
+ for char in str(name):
+ if char in chirp_common.CHARSET_ASCII:
+ filtered += char
+ else:
+ filtered += " "
+ return filtered
+
+ _msg = _mem.firmware_msg
+ val = RadioSettingValueString(0, 7, _filter(_msg.line1))
+ val.set_mutable(False)
+ rs = RadioSetting("firmware_msg.line1", "Firmware Message 1", val)
+ other.append(rs)
+
+ val = RadioSettingValueString(0, 7, _filter(_msg.line2))
+ val.set_mutable(False)
+ rs = RadioSetting("firmware_msg.line2", "Firmware Message 2", val)
+ other.append(rs)
+
+ _msg = _mem.sixpoweron_msg
+ val = RadioSettingValueString(0, 7, _filter(_msg.line1))
+ val.set_mutable(False)
+ rs = RadioSetting("sixpoweron_msg.line1", "6+Power-On Message 1", val)
+ other.append(rs)
+ val = RadioSettingValueString(0, 7, _filter(_msg.line2))
+ val.set_mutable(False)
+ rs = RadioSetting("sixpoweron_msg.line2", "6+Power-On Message 2", val)
+ other.append(rs)
+
+ _msg = _mem.poweron_msg
+ rs = RadioSetting("poweron_msg.line1", "Power-On Message 1",
+ RadioSettingValueString(
+ 0, 7, _filter(_msg.line1)))
+ other.append(rs)
+ rs = RadioSetting("poweron_msg.line2", "Power-On Message 2",
+ RadioSettingValueString(
+ 0, 7, _filter(_msg.line2)))
+ other.append(rs)
+
+ if str(_mem.firmware_msg.line1) == "UVVG302":
+ lower = 136
+ upper = 174
+ else:
+ lower = 130
+ upper = 179
+ rs = RadioSetting("limits.vhf.lower", "VHF Lower Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.vhf.lower))
+ other.append(rs)
+
+ rs = RadioSetting("limits.vhf.upper", "VHF Upper Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.vhf.upper))
+ other.append(rs)
+
+ if str(_mem.firmware_msg.line1) == "UVVG302":
+ lower = 200
+ upper = 230
+ else:
+ lower = 222
+ upper = 225
+ rs = RadioSetting("limits.vhf2.lower", "VHF2 Lower Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.vhf2.lower))
+ other.append(rs)
+
+ rs = RadioSetting("limits.vhf2.upper", "VHF2 Upper Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.vhf2.upper))
+ other.append(rs)
+
+ if str(_mem.firmware_msg.line1) == "UVVG302":
+ lower = 400
+ upper = 480
+ else:
+ lower = 400
+ upper = 520
+ rs = RadioSetting("limits.uhf.lower", "UHF Lower Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.uhf.lower))
+ other.append(rs)
+
+ rs = RadioSetting("limits.uhf.upper", "UHF Upper Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.uhf.upper))
+ other.append(rs)
+
+ # Work mode settings
+ rs = RadioSetting("settings.displayab", "Display",
+ RadioSettingValueList(
+ LIST_AB, LIST_AB[_mem.settings.displayab]))
+ work.append(rs)
+
+ rs = RadioSetting("settings.workmode", "VFO/MR Mode",
+ RadioSettingValueList(
+ LIST_WORKMODE,
+ LIST_WORKMODE[_mem.settings.workmode]))
+ work.append(rs)
+
+ rs = RadioSetting("settings.keylock", "Keypad Lock",
+ RadioSettingValueBoolean(_mem.settings.keylock))
+ work.append(rs)
+
+ rs = RadioSetting("wmchannel.mrcha", "MR A Channel",
+ RadioSettingValueInteger(0, 127,
+ _mem.wmchannel.mrcha))
+ work.append(rs)
+
+ rs = RadioSetting("wmchannel.mrchb", "MR B Channel",
+ RadioSettingValueInteger(0, 127,
+ _mem.wmchannel.mrchb))
+ work.append(rs)
+
+ def convert_bytes_to_freq(bytes):
+ real_freq = 0
+ for byte in bytes:
+ real_freq = (real_freq * 10) + byte
+ return chirp_common.format_freq(real_freq * 10)
+
+ def my_validate(value):
+ _vhf_lower = int(_mem.limits.vhf.lower)
+ _vhf_upper = int(_mem.limits.vhf.upper)
+ _vhf2_lower = int(_mem.limits.vhf2.lower)
+ _vhf2_upper = int(_mem.limits.vhf2.upper)
+ _uhf_lower = int(_mem.limits.uhf.lower)
+ _uhf_upper = int(_mem.limits.uhf.upper)
+ value = chirp_common.parse_freq(value)
+ msg = ("Can't be less than %i.0000")
+ if value > 99000000 and value < _vhf_lower * 1000000:
+ raise InvalidValueError(msg % (_vhf_lower))
+ msg = ("Can't be between %i.9975-%i.0000")
+ if (_vhf_upper + 1) * 1000000 <= value and \
+ value < _vhf2_lower * 1000000:
+ raise InvalidValueError(msg % (_vhf_upper, _vhf2_lower))
+ if (_vhf2_upper + 1) * 1000000 <= value and \
+ value < _uhf_lower * 1000000:
+ raise InvalidValueError(msg % (_vhf2_upper, _uhf_lower))
+ msg = ("Can't be greater than %i.9975")
+ if value > 99000000 and value >= (_uhf_upper + 1) * 1000000:
+ raise InvalidValueError(msg % (_uhf_upper))
+ return chirp_common.format_freq(value)
+
+ def apply_freq(setting, obj):
+ value = chirp_common.parse_freq(str(setting.value)) / 10
+ for i in range(7, -1, -1):
+ obj.freq[i] = value % 10
+ value /= 10
+
+ val1a = RadioSettingValueString(0, 10,
+ convert_bytes_to_freq(_mem.vfo.a.freq))
+ val1a.set_validate_callback(my_validate)
+ rs = RadioSetting("vfo.a.freq", "VFO A Frequency", val1a)
+ rs.set_apply_callback(apply_freq, _mem.vfo.a)
+ work.append(rs)
+
+ val1b = RadioSettingValueString(0, 10,
+ convert_bytes_to_freq(_mem.vfo.b.freq))
+ val1b.set_validate_callback(my_validate)
+ rs = RadioSetting("vfo.b.freq", "VFO B Frequency", val1b)
+ rs.set_apply_callback(apply_freq, _mem.vfo.b)
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.sftd", "VFO A Shift",
+ RadioSettingValueList(
+ LIST_SHIFTD, LIST_SHIFTD[_mem.vfo.a.sftd]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.sftd", "VFO B Shift",
+ RadioSettingValueList(
+ LIST_SHIFTD, LIST_SHIFTD[_mem.vfo.b.sftd]))
+ work.append(rs)
+
+ def convert_bytes_to_offset(bytes):
+ real_offset = 0
+ for byte in bytes:
+ real_offset = (real_offset * 10) + byte
+ return chirp_common.format_freq(real_offset * 1000)
+
+ def apply_offset(setting, obj):
+ value = chirp_common.parse_freq(str(setting.value)) / 1000
+ for i in range(5, -1, -1):
+ obj.offset[i] = value % 10
+ value /= 10
+
+ val1a = RadioSettingValueString(
+ 0, 10, convert_bytes_to_offset(_mem.vfo.a.offset))
+ rs = RadioSetting("vfo.a.offset",
+ "VFO A Offset", val1a)
+ rs.set_apply_callback(apply_offset, _mem.vfo.a)
+ work.append(rs)
+
+ val1b = RadioSettingValueString(
+ 0, 10, convert_bytes_to_offset(_mem.vfo.b.offset))
+ rs = RadioSetting("vfo.b.offset",
+ "VFO B Offset", val1b)
+ rs.set_apply_callback(apply_offset, _mem.vfo.b)
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.txpower", "VFO A Power",
+ RadioSettingValueList(
+ LIST_TXPOWER,
+ LIST_TXPOWER[_mem.vfo.a.txpower]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.txpower", "VFO B Power",
+ RadioSettingValueList(
+ LIST_TXPOWER,
+ LIST_TXPOWER[_mem.vfo.b.txpower]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.widenarr", "VFO A Bandwidth",
+ RadioSettingValueList(
+ LIST_BANDWIDTH,
+ LIST_BANDWIDTH[_mem.vfo.a.widenarr]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.widenarr", "VFO B Bandwidth",
+ RadioSettingValueList(
+ LIST_BANDWIDTH,
+ LIST_BANDWIDTH[_mem.vfo.b.widenarr]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.scode", "VFO A S-CODE",
+ RadioSettingValueList(
+ LIST_SCODE,
+ LIST_SCODE[_mem.vfo.a.scode]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.scode", "VFO B S-CODE",
+ RadioSettingValueList(
+ LIST_SCODE,
+ LIST_SCODE[_mem.vfo.b.scode]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.step", "VFO A Tuning Step",
+ RadioSettingValueList(
+ LIST_STEP, LIST_STEP[_mem.vfo.a.step]))
+ work.append(rs)
+ rs = RadioSetting("vfo.b.step", "VFO B Tuning Step",
+ RadioSettingValueList(
+ LIST_STEP, LIST_STEP[_mem.vfo.b.step]))
+ work.append(rs)
+
+ # broadcast FM settings
+ _fm_presets = self._memobj.fm_presets
+ if _fm_presets <= 108.0 * 10 - 650:
+ preset = _fm_presets / 10.0 + 65
+ elif _fm_presets >= 65.0 * 10 and _fm_presets <= 108.0 * 10:
+ preset = _fm_presets / 10.0
+ else:
+ preset = 76.0
+ rs = RadioSetting("fm_presets", "FM Preset(MHz)",
+ RadioSettingValueFloat(65, 108.0, preset, 0.1, 1))
+ fm_preset.append(rs)
+
+ # Service settings
+ for band in ["vhf", "uhf"]:
+ for index in range(0, 10):
+ key = "squelch.%s.sql%i" % (band, index)
+ if band == "vhf":
+ _obj = self._memobj.squelch.vhf
+ elif band == "uhf":
+ _obj = self._memobj.squelch.uhf
+ val = RadioSettingValueInteger(0, 123,
+ getattr(_obj, "sql%i" % (index)))
+ if index == 0:
+ val.set_mutable(False)
+ name = "%s Squelch %i" % (band.upper(), index)
+ rs = RadioSetting(key, name, val)
+ service.append(rs)
+
+ return top
+
+ @classmethod
+ def match_model(cls, filedata, filename):
+ match_size = False
+ match_model = False
+
+ # testing the file data size
+ if len(filedata) == 0x200E:
+ 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
1
1
Tested changes:
[Dan Smith <dsmith(a)danplanet.com>] Add test image for Baofeng UV-6R
Related to #2761
[Jim Unroe <rock.unroe(a)gmail.com>] [UV-6R] Add Support for Baofeng UV-6R
This driver adds support for the Baofeng UV-6R handheld radio.
related to #2761
[Jim Unroe <rock.unroe(a)gmail.com>] [UV-6R] Add Baofeng Common Driver
This driver is being added in preparaton for adding Baofeng UV-6R support.
It contains common functions that will be used for new Baofeng (and similar)
handheld radios.
related to #2761
[Tom Hayward <tom(a)tomh.us>] [id880] Fix typo in charset definition. #281
[Tom Hayward <tom(a)tomh.us>] [thf6a] Support full charset (ASCII). Fixes #141
[Tom Hayward <tom(a)tomh.us>] [id880] Support full charset. Fixes #281
[Tom Hayward <tom(a)tomh.us>] [vx5] Support full charset (ASCII). Fixes #292
[Tom Hayward <tom(a)tomh.us>] [id31a] set used bit when creating new memory, clear when deleting. Fixes #269
[Tom Hayward <tom(a)tomh.us>] Support PyGTK < 2.22 in bank edit. Fixes #231
[Tom Hayward <tom(a)tomh.us>] [d710] [v71] [d72] Fix tone list (not all tones are supported). Fixes #212
[Dan Smith <dsmith(a)danplanet.com>] [vx7] Fix setting memory power levels on 220MHz band
Fixes #214
[Dan Smith <dsmith(a)danplanet.com>] fips: Pennsylvania FIPS code was wrong. #117
[Marco Filippi <iz3gme.marco(a)gmail.com>] Consider lower bound frequency of each valid_band as valid
Fix bug #181
[Tom Hayward <tom(a)tomh.us>] tmd700: allow 8-char names. Fixes #176
[Dan Smith <dsmith(a)danplanet.com>] Fix the "blind deletion" problem, as well as properly direct copy/paste
Fixes #172
[David Griffith <dave(a)661.org>] Bug #155 fix: VX-7 1.25m power levels
[David Griffith <dave(a)661.org>] New INSTALL and README files
Fixes #122
[Tom Hayward <tom(a)tomh.us>] thd72: only use hardware flow on OS X. Fixes #166
[Marco Filippi <iz3gme.marco(a)gmail.com>] [FT817] Tone freq not set correctly
Same as #88 for FT857, to avoid code duplication fix code have been moved from
ft857 to its ancestor class
Fix bug #163
[Tom Hayward <tom(a)tomh.us>] Fix Mac .app so paths with spaces work. Fixes Bug #145
Full log:
Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/chirp-test/workspace
[workspace] $ hg showconfig paths.default
[workspace] $ hg pull --rev default
[workspace] $ hg update --clean --rev default
3 files updated, 0 files merged, 0 files removed, 0 files unresolved
[workspace] $ hg log --rev . --template {node}
[workspace] $ hg log --rev . --template {rev}
[workspace] $ hg log --rev 513daf2e15ca0bd15d9adcda03a78da03eee29c1
[workspace] $ hg log --template "<changeset node='{node}' author='{author|xmlescape}' rev='{rev}' date='{date}'><msg>{desc|xmlescape}</msg><added>{file_adds|stringify|xmlescape}</added><deleted>{file_dels|stringify|xmlescape}</deleted><files>{files|stringify|xmlescape}</files><parents>{parents}</parents></changeset>\n" --rev default:0 --follow --prune 513daf2e15ca0bd15d9adcda03a78da03eee29c1
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson2230800027217874436.sh
[workspace] $ /bin/sh -xe /tmp/hudson3903235975794094842.sh
+ PATH=/usr/bin:/bin:/usr/local/bin ./run_all_tests.sh
test_bit_array (tests.unit.test_bitwise.TestBitType) ... ok
test_bit_array_fail (tests.unit.test_bitwise.TestBitType) ... ok
test_bitfield_u16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u8 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_bbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_int_array (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u8 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_char (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_invalid_chars (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_wrong_length (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_comment_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_comment_inline_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_missing_semicolon (tests.unit.test_bitwise.TestBitwiseErrors) ... ok
test_seek (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_seekto (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_struct_one_element (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_two_elements (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_writes (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
split_tone_encode_test_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_fix_rounded_step_250 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_500 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_750 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_12_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_2_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_5_0 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_6_25 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_fractional_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step_fail (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_format_freq (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_bad (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_decimal (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whitespace (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whole (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_ensure_has_calls_almost_full (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_empty (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_partial (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full1 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full2 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_urcall_full (tests.unit.test_import_logic.DstarTests) ... ok
test_import_bank (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffA_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffB_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_negative (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_too_big_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_uhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_errors (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_warnings (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_invalid (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_am (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_fm (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_name (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_closest (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_dst (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_src (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_same (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffA_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffB_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModelIndexInterface) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_icom_bank (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_index_bounds (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_next_mapping_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_auto_tone_mode_cross (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_pol (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_rx (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tone (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tsql (tests.unit.test_memedit_edits.TestEdits) ... ok
test_init (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_bad_portnames (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_sorted (tests.unit.test_platform.Win32PlatformTest) ... ok
test_apply_callback (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_group (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_multi (tests.unit.test_settings.TestSettingContainers) ... ok
test_changed (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_boolean (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_float (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_integer (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_list (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_string (tests.unit.test_settings.TestSettingValues) ... ok
test_validate_callback (tests.unit.test_settings.TestSettingValues) ... ok
test_delete_hole_with_all (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_all_full (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_without_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_with_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_without_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
----------------------------------------------------------------------
Ran 151 tests in 0.053s
OK
Patch 'tip' is OK
Checking for PEP8 regressions...
./chirp/drivers/ft2900.py:1236:1: E265 block comment should start with '# '
./chirp/drivers/ft60.py:521:45: W291 trailing whitespace
./chirp/drivers/ft60.py:522:25: E128 continuation line under-indented for visual indent
./chirp/drivers/ft60.py:523:13: E301 expected 1 blank line, found 0
./chirp/drivers/ft817.py:587:41: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:684:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:688:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:691:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:692:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:695:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:696:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:699:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:702:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:705:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:708:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:711:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:714:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:717:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:720:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:721:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:724:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:725:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:728:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:731:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:732:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:735:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:736:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:739:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:740:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:743:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:744:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:747:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:750:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:753:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:754:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:757:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:758:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:761:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:764:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:767:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:768:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:771:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:772:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:775:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:776:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:779:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:782:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:783:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:786:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:789:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:790:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:793:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:794:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:810:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:811:31: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:814:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:817:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:821:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:827:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:832:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:836:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:840:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:844:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:848:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:893:25: E128 continuation line under-indented for visual indent
./chirp/drivers/thd72.py:188:1: E302 expected 2 blank lines, found 1
./chirp/drivers/thd72.py:203:23: E201 whitespace after '['
./chirp/drivers/thd72.py:203:80: E501 line too long (171 > 79 characters)
./chirp/drivers/thd72.py:203:170: E202 whitespace before ']'
./chirp/drivers/thd72.py:204:13: E201 whitespace after '['
./chirp/drivers/thd72.py:204:61: E202 whitespace before ']'
./chirp/drivers/thd72.py:205:23: E201 whitespace after '['
./chirp/drivers/thd72.py:205:74: E202 whitespace before ']'
./chirp/drivers/thd72.py:206:18: E201 whitespace after '['
./chirp/drivers/thd72.py:206:65: E202 whitespace before ']'
./chirp/drivers/thd72.py:595:1: W293 blank line contains whitespace
./chirp/drivers/thd72.py:603:1: W293 blank line contains whitespace
./chirp/ui/mainapp.py:647:13: E128 continuation line under-indented for visual indent
./chirp/ui/mainapp.py:661:5: E303 too many blank lines (2)
./chirp/ui/mainapp.py:1374:80: E501 line too long (81 > 79 characters)
./chirp/ui/mainapp.py:1378:80: E501 line too long (80 > 79 characters)
./chirp/ui/mainapp.py:1663:80: E501 line too long (85 > 79 characters)
real 0m7.549s
user 0m7.428s
sys 0m0.052s
================================================
Tests OK
+ cat /var/lib/jenkins/.chirp/debug.log
[2016-08-17 12:17:55,353] chirp.logger - DEBUG: CHIRP 0.3.0dev on Linux - Ubuntu 16.04.1 LTS (Python 2.7.12)
[2016-08-17 12:17:55,390] chirp.directory - INFO: Registered Kenwood_TH-D7 = THD7Radio
[2016-08-17 12:17:55,390] chirp.directory - INFO: Registered Kenwood_TH-D7G = THD7GRadio
[2016-08-17 12:17:55,390] chirp.directory - INFO: Registered Kenwood_TM-D700 = TMD700Radio
[2016-08-17 12:17:55,390] chirp.directory - INFO: Registered Kenwood_TM-V7 = TMV7Radio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TM-G707 = TMG707Radio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TH-G71 = THG71Radio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TH-F6 = THF6ARadio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TH-F7 = THF7ERadio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TM-D710 = TMD710Radio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TH-D72_live_mode = THD72Radio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TM-V71 = TMV71Radio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TM-D710G = TMD710GRadio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TH-K2 = THK2Radio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TM-271 = TM271Radio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TM-281 = TM281Radio
[2016-08-17 12:17:55,391] chirp.directory - INFO: Registered Kenwood_TM-471 = TM471Radio
[2016-08-17 12:17:55,392] chirp.directory - INFO: Registered Icom_7200 = Icom7200Radio
[2016-08-17 12:17:55,392] chirp.directory - INFO: Registered Icom_IC-7000 = Icom7000Radio
[2016-08-17 12:17:55,392] chirp.directory - INFO: Registered Icom_746 = Icom746Radio
[2016-08-17 12:17:55,393] chirp.directory - INFO: Registered Alinco_DR03T = DR03Radio
[2016-08-17 12:17:55,393] chirp.directory - INFO: Registered Alinco_DR06T = DR06Radio
[2016-08-17 12:17:55,393] chirp.directory - INFO: Registered Alinco_DR135T = DR135Radio
[2016-08-17 12:17:55,393] chirp.directory - INFO: Registered Alinco_DR235T = DR235Radio
[2016-08-17 12:17:55,393] chirp.directory - INFO: Registered Alinco_DR435T = DR435Radio
[2016-08-17 12:17:55,393] chirp.directory - INFO: Registered Alinco_DJ596 = DJ596Radio
[2016-08-17 12:17:55,393] chirp.directory - INFO: Registered Jetstream_JT220M = JT220MRadio
[2016-08-17 12:17:55,393] chirp.directory - INFO: Registered Alinco_DJ175 = DJ175Radio
[2016-08-17 12:17:55,393] chirp.directory - INFO: Registered AnyTone_5888UV = AnyTone5888UVRadio
[2016-08-17 12:17:55,394] chirp.directory - INFO: Registered Intek_HR-2040 = IntekHR2040Radio
[2016-08-17 12:17:55,394] chirp.directory - INFO: Registered Polmar_DB-50M = PolmarDB50MRadio
[2016-08-17 12:17:55,394] chirp.directory - INFO: Registered Powerwerx_DB-750X = PowerwerxDB750XRadio
[2016-08-17 12:17:55,394] chirp.directory - INFO: Registered AnyTone_TERMN-8R = AnyToneTERMN8RRadio
[2016-08-17 12:17:55,394] chirp.directory - INFO: Registered AnyTone_OBLTR-8R = AnyToneOBLTR8RRadio
[2016-08-17 12:17:55,395] chirp.directory - INFO: Registered Baofeng_UV-3R = UV3RRadio
[2016-08-17 12:17:55,395] chirp.directory - INFO: Registered Baojie_BJ-9900 = BJ9900Radio
[2016-08-17 12:17:55,396] chirp.directory - INFO: Registered Baofeng_UV-5R = BaofengUV5RGeneric
[2016-08-17 12:17:55,396] chirp.directory - INFO: Registered Baofeng_F-11 = BaofengF11Radio
[2016-08-17 12:17:55,396] chirp.directory - INFO: Registered Baofeng_UV-82 = BaofengUV82Radio
[2016-08-17 12:17:55,396] chirp.directory - INFO: Registered Baofeng_UV-6 = BaofengUV6Radio
[2016-08-17 12:17:55,396] chirp.directory - INFO: Registered Intek_KT-980HP = IntekKT980Radio
[2016-08-17 12:17:55,396] chirp.directory - INFO: Registered Baofeng_BF-F8HP = BaofengBFF8HPRadio
[2016-08-17 12:17:55,396] chirp.directory - INFO: Registered Baofeng_UV-82HP = BaofengUV82HPRadio
[2016-08-17 12:17:55,397] chirp.directory - INFO: Registered Baojie_BJ-UV55 = BaojieBJUV55Radio
[2016-08-17 12:17:55,397] chirp.directory - INFO: Registered BTECH_UV-2501 = UV2501
[2016-08-17 12:17:55,397] chirp.directory - INFO: Registered BTECH_UV-2501+220 = UV2501_220
[2016-08-17 12:17:55,397] chirp.directory - INFO: Registered BTECH_UV-5001 = UV5001
[2016-08-17 12:17:55,397] chirp.directory - INFO: Registered WACCOM_MINI-8900 = MINI8900
[2016-08-17 12:17:55,397] chirp.directory - INFO: Registered QYT_KT-UV980 = KTUV980
[2016-08-17 12:17:55,397] chirp.directory - INFO: Registered QYT_KT8900 = KT9800
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered QYT_KT8900R = KT9800R
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered LUITON_LT-588UV = LT588UV
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered Feidaxin_FD-268A = FD268ARadio
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered Feidaxin_FD-268B = FD268BRadio
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered Feidaxin_FD-288A = FD288ARadio
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered Feidaxin_FD-288B = FD288BRadio
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered Feidaxin_FD-150A = FD150ARadio
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered Feidaxin_FD-160A = FD160ARadio
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered Feidaxin_FD-450A = FD450ARadio
[2016-08-17 12:17:55,398] chirp.directory - INFO: Registered Feidaxin_FD-460A = FD460ARadio
[2016-08-17 12:17:55,399] chirp.directory - INFO: Registered Yaesu_FT-1802M = FT1802Radio
[2016-08-17 12:17:55,400] chirp.directory - INFO: Registered Yaesu_FT-1D_R = FT1Radio
[2016-08-17 12:17:55,400] chirp.directory - INFO: Registered Yaesu_FT-2800M = FT2800Radio
[2016-08-17 12:17:55,400] chirp.directory - INFO: Registered Yaesu_FT-2900R_1900R = FT2900Radio
[2016-08-17 12:17:55,401] chirp.directory - INFO: Registered Yaesu_FT-50 = FT50Radio
[2016-08-17 12:17:55,401] chirp.directory - INFO: Registered Yaesu_FT-60 = FT60Radio
[2016-08-17 12:17:55,401] chirp.directory - INFO: Registered Yaesu_FT-7800_7900 = FT7800Radio
[2016-08-17 12:17:55,401] chirp.directory - INFO: Registered Yaesu_FT-8800 = FT8800Radio
[2016-08-17 12:17:55,402] chirp.directory - INFO: Registered Yaesu_FT-8900 = FT8900Radio
[2016-08-17 12:17:55,402] chirp.directory - INFO: Registered Yaesu_FT-8100 = FT8100Radio
[2016-08-17 12:17:55,402] chirp.directory - INFO: Registered Yaesu_FT-817 = FT817Radio
[2016-08-17 12:17:55,402] chirp.directory - INFO: Registered Yaesu_FT-817ND = FT817NDRadio
[2016-08-17 12:17:55,402] chirp.directory - INFO: Registered Yaesu_FT-817ND_US = FT817NDUSRadio
[2016-08-17 12:17:55,403] chirp.directory - INFO: Registered Yaesu_FT-857_897 = FT857Radio
[2016-08-17 12:17:55,403] chirp.directory - INFO: Registered Yaesu_FT-857_897_US = FT857USRadio
[2016-08-17 12:17:55,403] chirp.directory - INFO: Registered Yaesu_FT-90 = FT90Radio
[2016-08-17 12:17:55,403] chirp.directory - INFO: Registered Yaesu_FTM-350 = FTM350Radio
[2016-08-17 12:17:55,404] chirp.directory - INFO: Registered Generic_CSV = CSVRadio
[2016-08-17 12:17:55,404] chirp.directory - INFO: Registered Commander_KG-UV = CommanderCSVRadio
[2016-08-17 12:17:55,404] chirp.directory - INFO: Registered RT_Systems_CSV = RTCSVRadio
[2016-08-17 12:17:55,405] chirp.directory - INFO: Registered ARRL_Travel_Plus = TpeRadio
[2016-08-17 12:17:55,412] chirp.directory - INFO: Registered Generic_XML = XMLRadio
[2016-08-17 12:17:55,415] chirp.directory - INFO: Registered Baofeng_BF-888 = H777Radio
[2016-08-17 12:17:55,416] chirp.directory - INFO: Registered HobbyPCB_RS-UV3 = HobbyPCBRSUV3Radio
[2016-08-17 12:17:55,416] chirp.directory - INFO: Registered Icom_IC-208H = IC208Radio
[2016-08-17 12:17:55,416] chirp.directory - INFO: Registered Icom_IC-2100H = IC2100Radio
[2016-08-17 12:17:55,416] chirp.directory - INFO: Registered Icom_IC-2200H = IC2200Radio
[2016-08-17 12:17:55,416] chirp.directory - INFO: Registered Icom_IC-2720H = IC2720Radio
[2016-08-17 12:17:55,416] chirp.directory - INFO: Registered Icom_IC-2820H = IC2820Radio
[2016-08-17 12:17:55,417] chirp.directory - INFO: Registered Icom_IC-91_92AD = IC9xRadio
[2016-08-17 12:17:55,417] chirp.directory - INFO: Registered Icom_IC-Q7A = ICQ7Radio
[2016-08-17 12:17:55,417] chirp.directory - INFO: Registered Icom_IC-T70 = ICT70Radio
[2016-08-17 12:17:55,418] chirp.directory - INFO: Registered Icom_IC-T7H = ICT7HRadio
[2016-08-17 12:17:55,418] chirp.directory - INFO: Registered Icom_IC-T8A = ICT8ARadio
[2016-08-17 12:17:55,418] chirp.directory - INFO: Registered Icom_IC-W32A = ICW32ARadio
[2016-08-17 12:17:55,418] chirp.directory - INFO: Registered Icom_IC-W32E = ICW32ERadio
[2016-08-17 12:17:55,418] chirp.directory - INFO: Registered Icom_IC-V82_U82 = ICx8xRadio
[2016-08-17 12:17:55,419] chirp.directory - INFO: Registered Icom_ID-31A = ID31Radio
[2016-08-17 12:17:55,419] chirp.directory - INFO: Registered Icom_ID-51 = ID51Radio
[2016-08-17 12:17:55,419] chirp.directory - INFO: Registered Icom_ID-51_Plus = ID51PLUSRadio
[2016-08-17 12:17:55,419] chirp.directory - INFO: Registered Icom_ID-800H_v2 = ID800v2Radio
[2016-08-17 12:17:55,419] chirp.directory - INFO: Registered Icom_ID-880H = ID880Radio
[2016-08-17 12:17:55,420] chirp.directory - INFO: Registered Icom_ID-80H = ID80Radio
[2016-08-17 12:17:55,420] chirp.directory - INFO: Registered Kenwood_HMK = HMKRadio
[2016-08-17 12:17:55,420] chirp.directory - INFO: Registered Kenwood_ITM = ITMRadio
[2016-08-17 12:17:55,420] chirp.directory - INFO: Registered Wouxun_KG-UV8D = KGUV8DRadio
[2016-08-17 12:17:55,421] chirp.directory - INFO: Registered KYD_NC-630A = NC630aRadio
[2016-08-17 12:17:55,421] chirp.directory - INFO: Registered KYD_IP-620 = IP620Radio
[2016-08-17 12:17:55,421] chirp.directory - INFO: Registered Leixen_VV-898 = LeixenVV898Radio
[2016-08-17 12:17:55,421] chirp.directory - INFO: Registered Jetstream_JT270M = JetstreamJT270MRadio
[2016-08-17 12:17:55,422] chirp.directory - INFO: Registered Wouxun_KG-UVD1P = KGUVD1PRadio
[2016-08-17 12:17:55,422] chirp.directory - INFO: Registered Wouxun_KG-UV6 = KGUV6DRadio
[2016-08-17 12:17:55,422] chirp.directory - INFO: Registered Wouxun_KG-816 = KG816Radio
[2016-08-17 12:17:55,422] chirp.directory - INFO: Registered Wouxun_KG-818 = KG818Radio
[2016-08-17 12:17:55,422] chirp.directory - INFO: Registered Puxing_PX-777 = Puxing777Radio
[2016-08-17 12:17:55,422] chirp.directory - INFO: Registered Puxing_PX-2R = Puxing2RRadio
[2016-08-17 12:17:55,423] chirp.directory - INFO: Registered TYT_TH-7800_File = TYTTH7800File
[2016-08-17 12:17:55,423] chirp.directory - INFO: Registered TYT_TH-7800 = TYTTH7800Radio
[2016-08-17 12:17:55,423] chirp.directory - INFO: Registered TYT_TH9000_220 = Th9000220Radio
[2016-08-17 12:17:55,423] chirp.directory - INFO: Registered TYT_TH9000_144 = Th9000144Radio
[2016-08-17 12:17:55,423] chirp.directory - INFO: Registered TYT_TH9000_440 = Th9000440Radio
[2016-08-17 12:17:55,424] chirp.directory - INFO: Registered TYT_TH-9800_File = TYTTH9800File
[2016-08-17 12:17:55,425] chirp.directory - INFO: Registered TYT_TH-9800 = TYTTH9800Radio
[2016-08-17 12:17:55,425] chirp.directory - INFO: Registered TYT_TH-UV3R = TYTUV3RRadio
[2016-08-17 12:17:55,425] chirp.directory - INFO: Registered TYT_TH-UV3R-25 = TYTUV3R25Radio
[2016-08-17 12:17:55,425] chirp.directory - INFO: Registered TYT_TH-UVF8D = TYTUVF8DRadio
[2016-08-17 12:17:55,426] chirp.directory - INFO: Registered Kenwood_TH-D72_clone_mode = THD72Radio
[2016-08-17 12:17:55,426] chirp.directory - INFO: Registered TYT_TH-UVF1 = TYTTHUVF1Radio
[2016-08-17 12:17:55,426] chirp.directory - INFO: Registered Kenwood_TK-260 = TK260_Radio
[2016-08-17 12:17:55,426] chirp.directory - INFO: Registered Kenwood_TK-270 = TK270_Radio
[2016-08-17 12:17:55,426] chirp.directory - INFO: Registered Kenwood_TK-272 = TK272_Radio
[2016-08-17 12:17:55,426] chirp.directory - INFO: Registered Kenwood_TK-278 = TK278_Radio
[2016-08-17 12:17:55,427] chirp.directory - INFO: Registered Kenwood_TK-360 = TK360_Radio
[2016-08-17 12:17:55,427] chirp.directory - INFO: Registered Kenwood_TK-370 = TK370_Radio
[2016-08-17 12:17:55,427] chirp.directory - INFO: Registered Kenwood_TK-372 = TK372_Radio
[2016-08-17 12:17:55,427] chirp.directory - INFO: Registered Kenwood_TK-378 = TK378_Radio
[2016-08-17 12:17:55,427] chirp.directory - INFO: Registered Kenwood_TK-760 = TK760_Radio
[2016-08-17 12:17:55,427] chirp.directory - INFO: Registered Kenwood_TK-762 = TK762_Radio
[2016-08-17 12:17:55,427] chirp.directory - INFO: Registered Kenwood_TK-768 = TK768_Radio
[2016-08-17 12:17:55,427] chirp.directory - INFO: Registered Kenwood_TK-860 = TK860_Radio
[2016-08-17 12:17:55,427] chirp.directory - INFO: Registered Kenwood_TK-862 = TK862_Radio
[2016-08-17 12:17:55,428] chirp.directory - INFO: Registered Kenwood_TK-868 = TK868_Radio
[2016-08-17 12:17:55,428] chirp.directory - INFO: Registered Kenwood_TK-868G = TK868G_Radios
[2016-08-17 12:17:55,428] chirp.directory - INFO: Registered Kenwood_TK-862G = TK862G_Radios
[2016-08-17 12:17:55,428] chirp.directory - INFO: Registered Kenwood_TK-860G = TK860G_Radios
[2016-08-17 12:17:55,428] chirp.directory - INFO: Registered Kenwood_TK-768G = TK768G_Radios
[2016-08-17 12:17:55,428] chirp.directory - INFO: Registered Kenwood_TK-762G = TK762G_Radios
[2016-08-17 12:17:55,428] chirp.directory - INFO: Registered Kenwood_TK-760G = TK760G_Radios
[2016-08-17 12:17:55,428] chirp.directory - INFO: Registered Kenwood_TK-278G = TK278G_Radios
[2016-08-17 12:17:55,429] chirp.directory - INFO: Registered Kenwood_TK-272G = TK272G_Radios
[2016-08-17 12:17:55,429] chirp.directory - INFO: Registered Kenwood_TK-270G = TK270G_Radios
[2016-08-17 12:17:55,429] chirp.directory - INFO: Registered Kenwood_TK-260G = TK260G_Radios
[2016-08-17 12:17:55,429] chirp.directory - INFO: Registered Kenwood_TK-7102 = KenwoodTK7102Radio
[2016-08-17 12:17:55,429] chirp.directory - INFO: Registered Kenwood_TK-8102 = KenwoodTK8102Radio
[2016-08-17 12:17:55,429] chirp.directory - INFO: Registered Kenwood_TK-7108 = KenwoodTK7108Radio
[2016-08-17 12:17:55,429] chirp.directory - INFO: Registered Kenwood_TK-8108 = KenwoodTK8108Radio
[2016-08-17 12:17:55,430] chirp.directory - INFO: Registered Kenwood_TS-2000 = TS2000Radio
[2016-08-17 12:17:55,430] chirp.directory - INFO: Registered Baofeng_UV-6R = UV6R
[2016-08-17 12:17:55,430] chirp.directory - INFO: Registered Baofeng_UV-B5 = BaofengUVB5
[2016-08-17 12:17:55,431] chirp.directory - INFO: Registered BTECH_UV-50X3 = UV50X3
[2016-08-17 12:17:55,431] chirp.directory - INFO: Registered Yaesu_VX-170 = VX170Radio
[2016-08-17 12:17:55,431] chirp.directory - INFO: Registered Yaesu_VX-2 = VX2Radio
[2016-08-17 12:17:55,432] chirp.directory - INFO: Registered Yaesu_VX-3 = VX3Radio
[2016-08-17 12:17:55,432] chirp.directory - INFO: Registered Yaesu_VX-5 = VX5Radio
[2016-08-17 12:17:55,432] chirp.directory - INFO: Registered Yaesu_VX-6 = VX6Radio
[2016-08-17 12:17:55,433] chirp.directory - INFO: Registered Yaesu_VX-7 = VX7Radio
[2016-08-17 12:17:55,433] chirp.directory - INFO: Registered Yaesu_VX-8_R = VX8Radio
[2016-08-17 12:17:55,433] chirp.directory - INFO: Registered Yaesu_VX-8_DR = VX8DRadio
[2016-08-17 12:17:55,433] chirp.directory - INFO: Registered Yaesu_VX-8_GE = VX8GERadio
[2016-08-17 12:17:55,434] chirp.directory - INFO: Registered Vertex_Standard_VXA-700 = VXA700Radio
+ rm /tmp/Alinco_DJ175_dk99uQ.img /tmp/Alinco_DJ175_zUSp_D.img /tmp/Alinco_DJ596_F9wxQp.img /tmp/Alinco_DJ596_O9DhCQ.img /tmp/Alinco_DR235T_8thX48.img /tmp/Alinco_DR235T_lSFQow.img /tmp/AnyTone_OBLTR-8R_chNARs.img /tmp/AnyTone_OBLTR-8R_xc5nV4.img /tmp/AnyTone_TERMN-8R_MYUJMv.img /tmp/AnyTone_TERMN-8R_O1zXiy.img /tmp/BTECH_UV-2501+220_ITmVo5.img /tmp/BTECH_UV-2501+220_ZgxRT5.img /tmp/BTECH_UV-5001__TM9sM.img /tmp/BTECH_UV-5001_eQM9m5.img /tmp/BTECH_UV-50X3_7rH_y3.img /tmp/BTECH_UV-50X3_DoYNRn.img /tmp/BTECH_UV-50X3_GOCtiq.img /tmp/BTECH_UV-50X3_JVTavu.img /tmp/BTECH_UV-50X3_NreSGC.img /tmp/BTECH_UV-50X3_hw01Ot.img /tmp/Baofeng_BF-888_oYWq4O.img /tmp/Baofeng_BF-888_rUWFxu.img /tmp/Baofeng_F-11_Y3TcnD.img /tmp/Baofeng_F-11_fimRqe.img /tmp/Baofeng_UV-3R_k6JIO2.img /tmp/Baofeng_UV-3R_yymP9M.img /tmp/Baofeng_UV-5R_YFHLBe.img /tmp/Baofeng_UV-5R_vnNZDz.img /tmp/Baofeng_UV-6R_myfMzV.img /tmp/Baofeng_UV-B5_8TLmRr.img /tmp/Baofeng_UV-B5_xNK5sF.img /tmp/Baojie_BJ-9900_1vvx3q.img /tmp/Baojie_BJ-9900_KkVzgU.img /tmp/Baojie_BJ-9900_OxOFHQ.img /tmp/Baojie_BJ-9900_PKW321.img /tmp/Baojie_BJ-9900_cw6bin.img /tmp/Baojie_BJ-9900_m33PNn.img /tmp/Feidaxin_FD-268A_0kUTph.img /tmp/Feidaxin_FD-268A_DNGbf3.img /tmp/Feidaxin_FD-268B_F1dbfd.img /tmp/Feidaxin_FD-268B_MROY3e.img /tmp/Feidaxin_FD-288B_652G_a.img /tmp/Feidaxin_FD-288B_ZaobJ2.img /tmp/Icom_IC-208H_8Qd7kY.img /tmp/Icom_IC-208H_KKvHBz.img /tmp/Icom_IC-2100H_qmuH8O.img /tmp/Icom_IC-2100H_s2opAk.img /tmp/Icom_IC-2200H_Uyv0pY.img /tmp/Icom_IC-2200H_tNhglp.img /tmp/Icom_IC-2720H_j_qtFv.img /tmp/Icom_IC-2720H_lrFeNy.img /tmp/Icom_IC-2820H__jnydK.img /tmp/Icom_IC-2820H_vDOzjL.img /tmp/Icom_IC-Q7A_HTKv3P.img /tmp/Icom_IC-Q7A_Tb4Viy.img /tmp/Icom_IC-T70_F6BB2H.img /tmp/Icom_IC-T70_JW3Xxv.img /tmp/Icom_IC-T7H_AB6eb9.img /tmp/Icom_IC-T7H_dv0ubL.img /tmp/Icom_IC-T8A_1i_2y8.img /tmp/Icom_IC-T8A_I6hlDl.img /tmp/Icom_IC-V82_U82_ub7wMZ.img /tmp/Icom_IC-V82_U82_xrYIUb.img /tmp/Icom_IC-W32A_4zWLLi.img /tmp/Icom_IC-W32A_DHTN40.img /tmp/Icom_IC-W32A_IdXH9q.img /tmp/Icom_IC-W32A_V3kC1t.img /tmp/Icom_IC-W32A_fMwjut.img /tmp/Icom_IC-W32A_pFGGix.img /tmp/Icom_IC-W32E_8rptTT.img /tmp/Icom_IC-W32E_DCiATN.img /tmp/Icom_IC-W32E_SYdPjR.img /tmp/Icom_IC-W32E_SjlIpn.img /tmp/Icom_IC-W32E_Yp1CQp.img /tmp/Icom_IC-W32E_gkm9K7.img /tmp/Icom_ID-31A_US9kjT.img /tmp/Icom_ID-31A_uWTorB.img /tmp/Icom_ID-51 Plus_0tR1mb.img /tmp/Icom_ID-51 Plus_HlaZ9p.img /tmp/Icom_ID-51_97C5UA.img /tmp/Icom_ID-51_WjMQJ1.img /tmp/Icom_ID-800H_fC5CO5.img /tmp/Icom_ID-800H_gzH1Wx.img /tmp/Icom_ID-880H_QGoR6T.img /tmp/Icom_ID-880H_QpdCsj.img /tmp/Jetstream_JT220M_9qiZuc.img /tmp/Jetstream_JT220M_k2oiHy.img /tmp/Jetstream_JT270M_SCnUFT.img /tmp/Jetstream_JT270M_cFHtaV.img /tmp/KYD_IP-620_18OrAQ.img /tmp/KYD_IP-620_LtKqtK.img /tmp/Kenwood_TH-D72 (clone mode)_8uqVfa.img /tmp/Kenwood_TH-D72 (clone mode)_P2a00P.img /tmp/Kenwood_TK-272G_oHu_Uo.img /tmp/Kenwood_TK-272G_szlvmb.img /tmp/Kenwood_TK-760G_5rD_v6.img /tmp/Kenwood_TK-760G_yE3I8b.img /tmp/Kenwood_TK-8102_0WOqhq.img /tmp/Kenwood_TK-8102_7R6dF2.img /tmp/Leixen_VV-898_SGzJOa.img /tmp/Leixen_VV-898_huKpjW.img /tmp/Polmar_DB-50M_3R4s1X.img /tmp/Polmar_DB-50M_DrF6K1.img /tmp/Puxing_PX-2R_AKsc8j.img /tmp/Puxing_PX-2R_fUCauy.img /tmp/Puxing_PX-777_fqJO0q.img /tmp/Puxing_PX-777_wEBc0X.img /tmp/TYT_TH-7800_3tpsaK.img /tmp/TYT_TH-7800_v9ebmc.img /tmp/TYT_TH-9800_1NATkn.img /tmp/TYT_TH-9800_7IUOKf.img /tmp/TYT_TH-UV3R-25_cISQeX.img /tmp/TYT_TH-UV3R-25_q4XL1x.img /tmp/TYT_TH-UV3R_GctfU7.img /tmp/TYT_TH-UV3R_JPtC8t.img /tmp/TYT_TH-UVF1_fpwMmC.img /tmp/TYT_TH-UVF1_gh2_Y_.img /tmp/TYT_TH9000_144_HIQ_Yc.img /tmp/TYT_TH9000_144_f7cxwz.img /tmp/Vertex Standard_VXA-700_EUOlZM.img /tmp/Vertex Standard_VXA-700_if2eTV.img /tmp/WACCOM_MINI-8900_QkpzYr.img /tmp/WACCOM_MINI-8900_kCWd0N.img /tmp/Wouxun_KG-816_PReeJ2.img /tmp/Wouxun_KG-816_oQLJpn.img /tmp/Wouxun_KG-818_Yk3BaC.img /tmp/Wouxun_KG-818_y72xsN.img /tmp/Wouxun_KG-UV6_gGCE6k.img /tmp/Wouxun_KG-UV6_lhAhII.img /tmp/Wouxun_KG-UV8D_F4tCgI.img /tmp/Wouxun_KG-UV8D_TOuYln.img /tmp/Wouxun_KG-UVD1P_H2Q47t.img /tmp/Wouxun_KG-UVD1P_LDbn4o.img /tmp/Yaesu_FT-1802M_XA7ApN.img /tmp/Yaesu_FT-1802M_v4Qgur.img /tmp/Yaesu_FT-1D_fGwbyf.img /tmp/Yaesu_FT-1D_i4NBVw.img /tmp/Yaesu_FT-2800M_7rtrbP.img /tmp/Yaesu_FT-2800M_ivPOnC.img /tmp/Yaesu_FT-2900R_1900R_vj2pNK.img /tmp/Yaesu_FT-2900R_1900R_xpPhIk.img /tmp/Yaesu_FT-50_60as0Q.img /tmp/Yaesu_FT-50_QRSHLF.img /tmp/Yaesu_FT-60_CR2sNe.img /tmp/Yaesu_FT-60_tktVyU.img /tmp/Yaesu_FT-7800_7900_ifvbzR.img /tmp/Yaesu_FT-7800_7900_yktGso.img /tmp/Yaesu_FT-817ND (US)_B5XAcN.img /tmp/Yaesu_FT-817ND (US)_DZysKO.img /tmp/Yaesu_FT-817ND_dqbAg4.img /tmp/Yaesu_FT-817ND_mH7zbc.img /tmp/Yaesu_FT-817_HbAYdD.img /tmp/Yaesu_FT-817_Q3mCub.img /tmp/Yaesu_FT-857_897 (US)_S6mD7E.img /tmp/Yaesu_FT-857_897 (US)_kJEyy6.img /tmp/Yaesu_FT-857_897_N3JwK7.img /tmp/Yaesu_FT-857_897_O5dCuG.img /tmp/Yaesu_FT-8800_3BnoTk.img /tmp/Yaesu_FT-8800_OE7UB5.img /tmp/Yaesu_FT-8800_jr1aq0.img /tmp/Yaesu_FT-8800_yTo0ml.img /tmp/Yaesu_FT-8800_z7ut7i.img /tmp/Yaesu_FT-8800_zAIbGS.img /tmp/Yaesu_FT-8900_USXK0J.img /tmp/Yaesu_FT-8900_pVGDGo.img /tmp/Yaesu_FTM-350_9d5ILA.img /tmp/Yaesu_FTM-350_L42fyA.img /tmp/Yaesu_FTM-350_n_EdMl.img /tmp/Yaesu_FTM-350_oYe60z.img /tmp/Yaesu_FTM-350_wZBLHW.img /tmp/Yaesu_FTM-350_yxVKSc.img /tmp/Yaesu_VX-2_HNOIRq.img /tmp/Yaesu_VX-2_jColVp.img /tmp/Yaesu_VX-3_L0MuEx.img /tmp/Yaesu_VX-3_ohBMdH.img /tmp/Yaesu_VX-5_I_9eL0.img /tmp/Yaesu_VX-5_yP3aS4.img /tmp/Yaesu_VX-6_E_50tS.img /tmp/Yaesu_VX-6_seuq7Z.img /tmp/Yaesu_VX-7_PLLlGh.img /tmp/Yaesu_VX-7_ctzfms.img /tmp/Yaesu_VX-8_3pRFDD.img /tmp/Yaesu_VX-8_bOLrc9.img
Email was triggered for: Success
Sending email for trigger: Success
1
0
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1471390530 14400
# Node ID 25e6a65fd82c55bb7dd98126a278d4854bc59731
# Parent 03d700ed2aec42bbf17de6f138360dc2aac2ce20
[UV-6R] Add Support for Baofeng UV-6R
This driver adds support for the Baofeng UV-6R handheld radio.
related to #2761
diff -r 03d700ed2aec -r 25e6a65fd82c chirp/drivers/uv6r.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/drivers/uv6r.py Tue Aug 16 19:35:30 2016 -0400
@@ -0,0 +1,871 @@
+# Copyright 2016:
+# * Jim Unroe KC9HI, <rock.unroe(a)gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import time
+import struct
+import logging
+import re
+
+LOG = logging.getLogger(__name__)
+
+from chirp.drivers import baofeng_common
+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
+
+##### MAGICS #########################################################
+
+# Baofeng UV-6R magic string
+MSTRING_UV6R = "\x50\xBB\xFF\x20\x14\x11\x22"
+
+##### ID strings #####################################################
+
+# Baofeng UV-6R
+UV6R_fp1 = " BF230#1"
+
+DTMF_CHARS = "0123456789 *#ABCD"
+STEPS = [2.5, 5.0, 6.25, 10.0, 12.5, 20.0, 25.0, 50.0]
+
+LIST_AB = ["A", "B"]
+LIST_ALMOD = ["Site", "Tone", "Code"]
+LIST_BANDWIDTH = ["Wide", "Narrow"]
+LIST_COLOR = ["Off", "Blue", "Orange", "Purple"]
+LIST_DTMFSPEED = ["%s ms" % x for x in range(50, 2010, 10)]
+LIST_DTMFST = ["Off", "DT-ST", "ANI-ST", "DT+ANI"]
+LIST_MODE = ["Channel", "Name", "Frequency"]
+LIST_OFF1TO9 = ["Off"] + list("123456789")
+LIST_OFF1TO10 = LIST_OFF1TO9 + ["10"]
+LIST_OFFAB = ["Off"] + LIST_AB
+LIST_RESUME = ["TO", "CO", "SE"]
+LIST_PONMSG = ["Full", "Message"]
+LIST_PTTID = ["Off", "BOT", "EOT", "Both"]
+LIST_SCODE = ["%s" % x for x in range(1, 16)]
+LIST_RPSTE = ["Off"] + ["%s" % x for x in range(1, 11)]
+LIST_SAVE = ["Off", "1:1", "1:2", "1:3", "1:4"]
+LIST_SHIFTD = ["Off", "+", "-"]
+LIST_STEDELAY = ["Off"] + ["%s ms" % x for x in range(100, 1100, 100)]
+LIST_STEP = [str(x) for x in STEPS]
+LIST_TCALL = ["Off", "1000 Hz", "1450 Hz", "1750 Hz", "2100 Hz"]
+LIST_TIMEOUT = ["%s sec" % x for x in range(15, 615, 15)]
+LIST_TXPOWER = ["High", "Low"]
+LIST_VOICE = ["Off", "English", "Chinese"]
+LIST_WORKMODE = ["Frequency", "Channel"]
+
+def model_match(cls, data):
+ """Match the opened/downloaded image to the correct version"""
+ match_rid1 = False
+ match_rid2 = False
+
+ rid1 = data[0x1FF8:0x2000]
+
+ if rid1 in cls._fileid:
+ match_rid1 = True
+
+ rid2 = data[0x1FD0:0x1FD5]
+
+ if rid2 == cls.MODEL:
+ match_rid2 = True
+
+ if match_rid1 and match_rid2:
+ return True
+ else:
+ return False
+
+
+(a)directory.register
+class UV6R(baofeng_common.BaofengCommonHT):
+ """Baofeng UV-6R"""
+ VENDOR = "Baofeng"
+ MODEL = "UV-6R"
+
+ _fileid = [UV6R_fp1, ]
+
+ _magic = [MSTRING_UV6R, ]
+ _magic_response_length = 8
+ _fw_ver_start = 0x1FF0
+ _recv_block_size = 0x40
+ _mem_size = 0x2000
+ _ack_block = False
+
+ _ranges = [(0x0000, 0x1800),
+ (0x1F40, 0x1F50),
+ (0x1FC0, 0x1FD0),
+ (0x1FE0, 0x1FF0)]
+ _send_block_size = 0x10
+
+ MODES = ["FM", "NFM"]
+ VALID_CHARS = chirp_common.CHARSET_ALPHANUMERIC + \
+ "!@#$%^&*()+-=[]:\";'<>?,./"
+ LENGTH_NAME = 7
+ SKIP_VALUES = ["", "S"]
+ DTCS_CODES = sorted(chirp_common.DTCS_CODES + [645])
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00),
+ chirp_common.PowerLevel("High", watts=5.00)]
+ VALID_BANDS = [(136000000, 174000000),
+ (400000000, 520000000)]
+ PTTID_LIST = LIST_PTTID
+ SCODE_LIST = LIST_SCODE
+
+
+ MEM_FORMAT = """
+ #seekto 0x0000;
+ struct {
+ lbcd rxfreq[4];
+ lbcd txfreq[4];
+ ul16 rxtone;
+ ul16 txtone;
+ u8 unknown0:4,
+ scode:4;
+ u8 unknown1;
+ u8 unknown2:7,
+ lowpower:1;
+ u8 unknown3:1,
+ wide:1,
+ unknown4:2,
+ bcl:1,
+ scan:1,
+ pttid:2;
+ } memory[128];
+
+ #seekto 0x0B00;
+ struct {
+ u8 code[5];
+ u8 unused[11];
+ } pttid[15];
+
+ #seekto 0x0CAA;
+ struct {
+ u8 code[5];
+ u8 unused:6,
+ aniid:2;
+ u8 unknown[2];
+ u8 dtmfon;
+ u8 dtmfoff;
+ } ani;
+
+ #seekto 0x0E20;
+ struct {
+ u8 unused00:4,
+ squelch:4;
+ u8 unused01:5,
+ step:3;
+ u8 unknown00;
+ u8 unused02:5,
+ save:3;
+ u8 unused03:4,
+ vox:4;
+ u8 unknown01;
+ u8 unused04:4,
+ abr:4;
+ u8 unused05:7,
+ tdr:1;
+ u8 unused06:7,
+ beep:1;
+ u8 unused07:2,
+ timeout:6;
+ u8 unused08:6,
+ tcall:2;
+ u8 unknown02[3];
+ u8 unused09:6,
+ voice:2;
+ u8 unknown03;
+ u8 unused10:6,
+ dtmfst:2;
+ u8 unknown04;
+ u8 unused11:6,
+ screv:2;
+ u8 unused12:6,
+ pttid:2;
+ u8 unused13:2,
+ pttlt:6;
+ u8 unused14:6,
+ mdfa:2;
+ u8 unused15:6,
+ mdfb:2;
+ u8 unknown05;
+ u8 unused16:7,
+ autolk:1;
+ u8 unknown06[4];
+ u8 unused17:6,
+ wtled:2;
+ u8 unused18:6,
+ rxled:2;
+ u8 unused19:6,
+ txled:2;
+ u8 unused20:6,
+ almod:2;
+ u8 unknown07[2];
+ u8 unused22:7,
+ ste:1;
+ u8 unused23:4,
+ rpste:4;
+ u8 unused24:4,
+ rptrl:4;
+ u8 unused25:7,
+ ponmsg:1;
+ u8 unused26:7,
+ roger:1;
+ u8 unused27:7,
+ reset:1;
+ u8 unknown08;
+ u8 displayab:1,
+ unknown09:2,
+ fmradio:1,
+ alarm:1,
+ unknown10:1,
+ reset:1,
+ menu:1;
+ u8 unknown11;
+ u8 unused29:7,
+ workmode:1;
+ u8 unused30:7,
+ keylock:1;
+ u8 cht;
+ } settings;
+
+ #seekto 0x0E76;
+ struct {
+ u8 unused0:1,
+ mrcha:7;
+ u8 unused1:1,
+ mrchb:7;
+ } wmchannel;
+
+ struct vfo {
+ u8 unknown0[8];
+ u8 freq[8];
+ u8 offset[6];
+ ul16 rxtone;
+ ul16 txtone;
+ u8 unused0:7,
+ band:1;
+ u8 unknown3;
+ u8 unknown4:2,
+ sftd:2,
+ scode:4;
+ u8 unknown5;
+ u8 unknown6:1,
+ step:3,
+ unknown7:4;
+ u8 txpower:1,
+ widenarr:1,
+ unknown8:6;
+ };
+
+ #seekto 0x0F00;
+ struct {
+ struct vfo a;
+ struct vfo b;
+ } vfo;
+
+ #seekto 0x0F4E;
+ u16 fm_presets;
+
+ #seekto 0x1000;
+ struct {
+ char name[7];
+ u8 unknown[9];
+ } names[128];
+
+ #seekto 0x1F40;
+ struct {
+ u8 sql0;
+ u8 sql1;
+ u8 sql2;
+ u8 sql3;
+ u8 sql4;
+ u8 sql5;
+ u8 sql6;
+ u8 sql7;
+ u8 sql8;
+ u8 sql9;
+ } squelch;
+
+ struct limit {
+ u8 enable;
+ bbcd lower[2];
+ bbcd upper[2];
+ };
+
+ #seekto 0x1FC0;
+ struct {
+ struct limit vhf;
+ struct limit uhf;
+ } limits;
+
+ #seekto 0x1FD0;
+ struct {
+ char line1[8];
+ char line2[8];
+ } sixpoweron_msg;
+
+ #seekto 0x1FE0;
+ struct {
+ char line1[7];
+ char line2[7];
+ } poweron_msg;
+
+ #seekto 0x1FF0;
+ struct {
+ char line1[8];
+ char line2[8];
+ } firmware_msg;
+
+ """
+
+ @classmethod
+ def get_prompts(cls):
+ rp = chirp_common.RadioPrompts()
+ rp.experimental = \
+ ('The BTech UV-6R driver is a beta version.\n'
+ '\n'
+ 'Please save an unedited copy of your first successful\n'
+ 'download to a CHIRP Radio Images(*.img) file.'
+ )
+ rp.pre_download = _(dedent("""\
+ Follow these instructions to download your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the download of your radio data
+ """))
+ rp.pre_upload = _(dedent("""\
+ Follow this instructions to upload your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the upload of your radio data
+ """))
+ return rp
+
+ def process_mmap(self):
+ """Process the mem map into the mem object"""
+ self._memobj = bitwise.parse(self.MEM_FORMAT, self._mmap)
+
+ def get_settings(self):
+ """Translate the bit in the mem_struct into settings in the UI"""
+ _mem = self._memobj
+ basic = RadioSettingGroup("basic", "Basic Settings")
+ advanced = RadioSettingGroup("advanced", "Advanced Settings")
+ other = RadioSettingGroup("other", "Other Settings")
+ work = RadioSettingGroup("work", "Work Mode Settings")
+ fm_preset = RadioSettingGroup("fm_preset", "FM Preset")
+ dtmfe = RadioSettingGroup("dtmfe", "DTMF Encode Settings")
+ service = RadioSettingGroup("service", "Service Settings")
+ top = RadioSettings(basic, advanced, other, work, fm_preset, dtmfe,
+ service)
+
+ # Basic settings
+ if _mem.settings.squelch > 0x09:
+ val = 0x00
+ else:
+ val = _mem.settings.squelch
+ rs = RadioSetting("settings.squelch", "Squelch",
+ RadioSettingValueList(
+ LIST_OFF1TO9, LIST_OFF1TO9[val]))
+ basic.append(rs)
+
+ if _mem.settings.save > 0x04:
+ val = 0x00
+ else:
+ val = _mem.settings.save
+ rs = RadioSetting("settings.save", "Battery Saver",
+ RadioSettingValueList(
+ LIST_SAVE, LIST_SAVE[val]))
+ basic.append(rs)
+
+ if _mem.settings.vox > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.vox
+ rs = RadioSetting("settings.vox", "Vox",
+ RadioSettingValueList(
+ LIST_OFF1TO10, LIST_OFF1TO10[val]))
+ basic.append(rs)
+
+ if _mem.settings.abr > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.abr
+ rs = RadioSetting("settings.abr", "Backlight Timeout",
+ RadioSettingValueList(
+ LIST_OFF1TO10, LIST_OFF1TO10[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.tdr", "Dual Watch",
+ RadioSettingValueBoolean(_mem.settings.tdr))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.beep", "Beep",
+ RadioSettingValueBoolean(_mem.settings.beep))
+ basic.append(rs)
+
+ if _mem.settings.timeout > 0x27:
+ val = 0x03
+ else:
+ val = _mem.settings.timeout
+ rs = RadioSetting("settings.timeout", "Timeout Timer",
+ RadioSettingValueList(
+ LIST_TIMEOUT, LIST_TIMEOUT[val]))
+ basic.append(rs)
+
+ if _mem.settings.voice > 0x02:
+ val = 0x01
+ else:
+ val = _mem.settings.voice
+ rs = RadioSetting("settings.voice", "Voice Prompt",
+ RadioSettingValueList(
+ LIST_VOICE, LIST_VOICE[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.dtmfst", "DTMF Sidetone",
+ RadioSettingValueList(LIST_DTMFST, LIST_DTMFST[
+ _mem.settings.dtmfst]))
+ basic.append(rs)
+
+ if _mem.settings.screv > 0x02:
+ val = 0x01
+ else:
+ val = _mem.settings.screv
+ rs = RadioSetting("settings.screv", "Scan Resume",
+ RadioSettingValueList(
+ LIST_RESUME, LIST_RESUME[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.pttid", "When to send PTT ID",
+ RadioSettingValueList(LIST_PTTID, LIST_PTTID[
+ _mem.settings.pttid]))
+ basic.append(rs)
+
+ if _mem.settings.pttlt > 0x1E:
+ val = 0x05
+ else:
+ val = _mem.settings.pttlt
+ rs = RadioSetting("pttlt", "PTT ID Delay",
+ RadioSettingValueInteger(0, 50, val))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.mdfa", "Display Mode (A)",
+ RadioSettingValueList(LIST_MODE, LIST_MODE[
+ _mem.settings.mdfa]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.mdfb", "Display Mode (B)",
+ RadioSettingValueList(LIST_MODE, LIST_MODE[
+ _mem.settings.mdfb]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.autolk", "Auto Lock Keypad",
+ RadioSettingValueBoolean(_mem.settings.autolk))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.wtled", "Standby LED Color",
+ RadioSettingValueList(
+ LIST_COLOR, LIST_COLOR[_mem.settings.wtled]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.rxled", "RX LED Color",
+ RadioSettingValueList(
+ LIST_COLOR, LIST_COLOR[_mem.settings.rxled]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.txled", "TX LED Color",
+ RadioSettingValueList(
+ LIST_COLOR, LIST_COLOR[_mem.settings.txled]))
+ basic.append(rs)
+
+ if _mem.settings.almod > 0x02:
+ val = 0x00
+ else:
+ val = _mem.settings.almod
+ rs = RadioSetting("settings.almod", "Alarm Mode",
+ RadioSettingValueList(
+ LIST_ALMOD, LIST_ALMOD[val]))
+ basic.append(rs)
+
+ if _mem.settings.tcall > 0x05:
+ val = 0x00
+ else:
+ val = _mem.settings.tcall
+ rs = RadioSetting("settings.tcall", "Tone Burst Frequency",
+ RadioSettingValueList(
+ LIST_TCALL, LIST_TCALL[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.ste", "Squelch Tail Eliminate (HT to HT)",
+ RadioSettingValueBoolean(_mem.settings.ste))
+ basic.append(rs)
+
+ if _mem.settings.rpste > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.rpste
+ rs = RadioSetting("settings.rpste",
+ "Squelch Tail Eliminate (repeater)",
+ RadioSettingValueList(
+ LIST_RPSTE, LIST_RPSTE[val]))
+ basic.append(rs)
+
+ if _mem.settings.rptrl > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.rptrl
+ rs = RadioSetting("settings.rptrl", "STE Repeater Delay",
+ RadioSettingValueList(
+ LIST_STEDELAY, LIST_STEDELAY[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.ponmsg", "Power-On Message",
+ RadioSettingValueList(LIST_PONMSG, LIST_PONMSG[
+ _mem.settings.ponmsg]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.roger", "Roger Beep",
+ RadioSettingValueBoolean(_mem.settings.roger))
+ basic.append(rs)
+
+ # Advanced settings
+ rs = RadioSetting("settings.reset", "RESET Menu",
+ RadioSettingValueBoolean(_mem.settings.reset))
+ advanced.append(rs)
+
+ rs = RadioSetting("settings.menu", "All Menus",
+ RadioSettingValueBoolean(_mem.settings.menu))
+ advanced.append(rs)
+
+ rs = RadioSetting("settings.fmradio", "Broadcast FM Radio",
+ RadioSettingValueBoolean(_mem.settings.fmradio))
+ advanced.append(rs)
+
+ rs = RadioSetting("settings.alarm", "Alarm Sound",
+ RadioSettingValueBoolean(_mem.settings.alarm))
+ advanced.append(rs)
+
+ # Other settings
+ def _filter(name):
+ filtered = ""
+ for char in str(name):
+ if char in chirp_common.CHARSET_ASCII:
+ filtered += char
+ else:
+ filtered += " "
+ return filtered
+
+ _msg = _mem.firmware_msg
+ val = RadioSettingValueString(0, 8, _filter(_msg.line1))
+ val.set_mutable(False)
+ rs = RadioSetting("firmware_msg.line1", "Firmware Message 1", val)
+ other.append(rs)
+
+ val = RadioSettingValueString(0, 8, _filter(_msg.line2))
+ val.set_mutable(False)
+ rs = RadioSetting("firmware_msg.line2", "Firmware Message 2", val)
+ other.append(rs)
+
+ _msg = _mem.sixpoweron_msg
+ val = RadioSettingValueString(0, 8, _filter(_msg.line1))
+ val.set_mutable(False)
+ rs = RadioSetting("sixpoweron_msg.line1", "6+Power-On Message 1", val)
+ other.append(rs)
+ val = RadioSettingValueString(0, 8, _filter(_msg.line2))
+ val.set_mutable(False)
+ rs = RadioSetting("sixpoweron_msg.line2", "6+Power-On Message 2", val)
+ other.append(rs)
+
+ _msg = _mem.poweron_msg
+ rs = RadioSetting("poweron_msg.line1", "Power-On Message 1",
+ RadioSettingValueString(
+ 0, 7, _filter(_msg.line1)))
+ other.append(rs)
+ rs = RadioSetting("poweron_msg.line2", "Power-On Message 2",
+ RadioSettingValueString(
+ 0, 7, _filter(_msg.line2)))
+ other.append(rs)
+
+ lower = 136
+ upper = 174
+ rs = RadioSetting("limits.vhf.lower", "VHF Lower Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.vhf.lower))
+ other.append(rs)
+
+ rs = RadioSetting("limits.vhf.upper", "VHF Upper Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.vhf.upper))
+ other.append(rs)
+
+ lower = 400
+ upper = 520
+ rs = RadioSetting("limits.uhf.lower", "UHF Lower Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.uhf.lower))
+ other.append(rs)
+
+ rs = RadioSetting("limits.uhf.upper", "UHF Upper Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.uhf.upper))
+ other.append(rs)
+
+ # Work mode settings
+ rs = RadioSetting("settings.displayab", "Display",
+ RadioSettingValueList(
+ LIST_AB, LIST_AB[_mem.settings.displayab]))
+ work.append(rs)
+
+ rs = RadioSetting("settings.workmode", "VFO/MR Mode",
+ RadioSettingValueList(
+ LIST_WORKMODE,
+ LIST_WORKMODE[_mem.settings.workmode]))
+ work.append(rs)
+
+ rs = RadioSetting("settings.keylock", "Keypad Lock",
+ RadioSettingValueBoolean(_mem.settings.keylock))
+ work.append(rs)
+
+ rs = RadioSetting("wmchannel.mrcha", "MR A Channel",
+ RadioSettingValueInteger(0, 127,
+ _mem.wmchannel.mrcha))
+ work.append(rs)
+
+ rs = RadioSetting("wmchannel.mrchb", "MR B Channel",
+ RadioSettingValueInteger(0, 127,
+ _mem.wmchannel.mrchb))
+ work.append(rs)
+
+ def convert_bytes_to_freq(bytes):
+ real_freq = 0
+ for byte in bytes:
+ real_freq = (real_freq * 10) + byte
+ return chirp_common.format_freq(real_freq * 10)
+
+ def my_validate(value):
+ _vhf_lower = int(_mem.limits.vhf.lower)
+ _vhf_upper = int(_mem.limits.vhf.upper)
+ _uhf_lower = int(_mem.limits.uhf.lower)
+ _uhf_upper = int(_mem.limits.uhf.upper)
+ value = chirp_common.parse_freq(value)
+ msg = ("Can't be less than %i.0000")
+ if value > 99000000 and value < _vhf_lower * 1000000:
+ raise InvalidValueError(msg % _vhf_lower)
+ msg = ("Can't be between %i.9975-%i.0000")
+ if _vhf_upper * 1000000 <= value and value < _uhf_lower * 1000000:
+ raise InvalidValueError(msg % (_vhf_upper - 1, _uhf_lower))
+ msg = ("Can't be greater than %i.9975")
+ if value > 99000000 and value >= _uhf_upper * 1000000:
+ raise InvalidValueError(msg % (_uhf_upper - 1))
+ return chirp_common.format_freq(value)
+
+ def apply_freq(setting, obj):
+ value = chirp_common.parse_freq(str(setting.value)) / 10
+ for i in range(7, -1, -1):
+ obj.freq[i] = value % 10
+ value /= 10
+
+ val1a = RadioSettingValueString(0, 10,
+ convert_bytes_to_freq(_mem.vfo.a.freq))
+ val1a.set_validate_callback(my_validate)
+ rs = RadioSetting("vfo.a.freq", "VFO A Frequency", val1a)
+ rs.set_apply_callback(apply_freq, _mem.vfo.a)
+ work.append(rs)
+
+ val1b = RadioSettingValueString(0, 10,
+ convert_bytes_to_freq(_mem.vfo.b.freq))
+ val1b.set_validate_callback(my_validate)
+ rs = RadioSetting("vfo.b.freq", "VFO B Frequency", val1b)
+ rs.set_apply_callback(apply_freq, _mem.vfo.b)
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.sftd", "VFO A Shift",
+ RadioSettingValueList(
+ LIST_SHIFTD, LIST_SHIFTD[_mem.vfo.a.sftd]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.sftd", "VFO B Shift",
+ RadioSettingValueList(
+ LIST_SHIFTD, LIST_SHIFTD[_mem.vfo.b.sftd]))
+ work.append(rs)
+
+ def convert_bytes_to_offset(bytes):
+ real_offset = 0
+ for byte in bytes:
+ real_offset = (real_offset * 10) + byte
+ return chirp_common.format_freq(real_offset * 1000)
+
+ def apply_offset(setting, obj):
+ value = chirp_common.parse_freq(str(setting.value)) / 1000
+ for i in range(5, -1, -1):
+ obj.offset[i] = value % 10
+ value /= 10
+
+ val1a = RadioSettingValueString(
+ 0, 10, convert_bytes_to_offset(_mem.vfo.a.offset))
+ rs = RadioSetting("vfo.a.offset",
+ "VFO A Offset", val1a)
+ rs.set_apply_callback(apply_offset, _mem.vfo.a)
+ work.append(rs)
+
+ val1b = RadioSettingValueString(
+ 0, 10, convert_bytes_to_offset(_mem.vfo.b.offset))
+ rs = RadioSetting("vfo.b.offset",
+ "VFO B Offset", val1b)
+ rs.set_apply_callback(apply_offset, _mem.vfo.b)
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.txpower", "VFO A Power",
+ RadioSettingValueList(
+ LIST_TXPOWER,
+ LIST_TXPOWER[_mem.vfo.a.txpower]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.txpower", "VFO B Power",
+ RadioSettingValueList(
+ LIST_TXPOWER,
+ LIST_TXPOWER[_mem.vfo.b.txpower]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.widenarr", "VFO A Bandwidth",
+ RadioSettingValueList(
+ LIST_BANDWIDTH,
+ LIST_BANDWIDTH[_mem.vfo.a.widenarr]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.widenarr", "VFO B Bandwidth",
+ RadioSettingValueList(
+ LIST_BANDWIDTH,
+ LIST_BANDWIDTH[_mem.vfo.b.widenarr]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.scode", "VFO A S-CODE",
+ RadioSettingValueList(
+ LIST_SCODE,
+ LIST_SCODE[_mem.vfo.a.scode]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.scode", "VFO B S-CODE",
+ RadioSettingValueList(
+ LIST_SCODE,
+ LIST_SCODE[_mem.vfo.b.scode]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.step", "VFO A Tuning Step",
+ RadioSettingValueList(
+ LIST_STEP, LIST_STEP[_mem.vfo.a.step]))
+ work.append(rs)
+ rs = RadioSetting("vfo.b.step", "VFO B Tuning Step",
+ RadioSettingValueList(
+ LIST_STEP, LIST_STEP[_mem.vfo.b.step]))
+ work.append(rs)
+
+ # broadcast FM settings
+ _fm_presets = self._memobj.fm_presets
+ if _fm_presets <= 108.0 * 10 - 650:
+ preset = _fm_presets / 10.0 + 65
+ elif _fm_presets >= 65.0 * 10 and _fm_presets <= 108.0 * 10:
+ preset = _fm_presets / 10.0
+ else:
+ preset = 76.0
+ rs = RadioSetting("fm_presets", "FM Preset(MHz)",
+ RadioSettingValueFloat(65, 108.0, preset, 0.1, 1))
+ fm_preset.append(rs)
+
+ # DTMF settings
+ def apply_code(setting, obj, length):
+ code = []
+ for j in range(0, length):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.code = code
+
+ for i in range(0, 15):
+ _codeobj = self._memobj.pttid[i].code
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 5, _code, False)
+ val.set_charset(DTMF_CHARS)
+ pttid = RadioSetting("pttid/%i.code" % i,
+ "Signal Code %i" % (i + 1), val)
+ pttid.set_apply_callback(apply_code, self._memobj.pttid[i], 5)
+ dtmfe.append(pttid)
+
+ if _mem.ani.dtmfon > 0xC3:
+ val = 0x03
+ else:
+ val = _mem.ani.dtmfon
+ rs = RadioSetting("ani.dtmfon", "DTMF Speed (on)",
+ RadioSettingValueList(LIST_DTMFSPEED,
+ LIST_DTMFSPEED[val]))
+ dtmfe.append(rs)
+
+ if _mem.ani.dtmfoff > 0xC3:
+ val = 0x03
+ else:
+ val = _mem.ani.dtmfoff
+ rs = RadioSetting("ani.dtmfoff", "DTMF Speed (off)",
+ RadioSettingValueList(LIST_DTMFSPEED,
+ LIST_DTMFSPEED[val]))
+ dtmfe.append(rs)
+
+ _codeobj = self._memobj.ani.code
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 5, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.code", "ANI Code", val)
+ rs.set_apply_callback(apply_code, self._memobj.ani, 5)
+ dtmfe.append(rs)
+
+ rs = RadioSetting("ani.aniid", "When to send ANI ID",
+ RadioSettingValueList(LIST_PTTID,
+ LIST_PTTID[_mem.ani.aniid]))
+ dtmfe.append(rs)
+
+ # Service settings
+ for index in range(0, 10):
+ key = "squelch.sql%i" % (index)
+ _obj = self._memobj.squelch
+ val = RadioSettingValueInteger(0, 123,
+ getattr(_obj, "sql%i" % (index)))
+ if index == 0:
+ val.set_mutable(False)
+ name = "Squelch %i" % (index)
+ rs = RadioSetting(key, name, val)
+ service.append(rs)
+
+ return top
+
+ @classmethod
+ def match_model(cls, filedata, filename):
+ match_size = False
+ match_model = False
+
+ # testing the file data size
+ if len(filedata) == 0x2008:
+ 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
1
2
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1471390530 14400
# Node ID 25e6a65fd82c55bb7dd98126a278d4854bc59731
# Parent 03d700ed2aec42bbf17de6f138360dc2aac2ce20
[UV-6R] Add Support for Baofeng UV-6R
This driver adds support for the Baofeng UV-6R handheld radio.
related to #2761
diff -r 03d700ed2aec -r 25e6a65fd82c chirp/drivers/uv6r.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/drivers/uv6r.py Tue Aug 16 19:35:30 2016 -0400
@@ -0,0 +1,871 @@
+# Copyright 2016:
+# * Jim Unroe KC9HI, <rock.unroe(a)gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import time
+import struct
+import logging
+import re
+
+LOG = logging.getLogger(__name__)
+
+from chirp.drivers import baofeng_common
+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
+
+##### MAGICS #########################################################
+
+# Baofeng UV-6R magic string
+MSTRING_UV6R = "\x50\xBB\xFF\x20\x14\x11\x22"
+
+##### ID strings #####################################################
+
+# Baofeng UV-6R
+UV6R_fp1 = " BF230#1"
+
+DTMF_CHARS = "0123456789 *#ABCD"
+STEPS = [2.5, 5.0, 6.25, 10.0, 12.5, 20.0, 25.0, 50.0]
+
+LIST_AB = ["A", "B"]
+LIST_ALMOD = ["Site", "Tone", "Code"]
+LIST_BANDWIDTH = ["Wide", "Narrow"]
+LIST_COLOR = ["Off", "Blue", "Orange", "Purple"]
+LIST_DTMFSPEED = ["%s ms" % x for x in range(50, 2010, 10)]
+LIST_DTMFST = ["Off", "DT-ST", "ANI-ST", "DT+ANI"]
+LIST_MODE = ["Channel", "Name", "Frequency"]
+LIST_OFF1TO9 = ["Off"] + list("123456789")
+LIST_OFF1TO10 = LIST_OFF1TO9 + ["10"]
+LIST_OFFAB = ["Off"] + LIST_AB
+LIST_RESUME = ["TO", "CO", "SE"]
+LIST_PONMSG = ["Full", "Message"]
+LIST_PTTID = ["Off", "BOT", "EOT", "Both"]
+LIST_SCODE = ["%s" % x for x in range(1, 16)]
+LIST_RPSTE = ["Off"] + ["%s" % x for x in range(1, 11)]
+LIST_SAVE = ["Off", "1:1", "1:2", "1:3", "1:4"]
+LIST_SHIFTD = ["Off", "+", "-"]
+LIST_STEDELAY = ["Off"] + ["%s ms" % x for x in range(100, 1100, 100)]
+LIST_STEP = [str(x) for x in STEPS]
+LIST_TCALL = ["Off", "1000 Hz", "1450 Hz", "1750 Hz", "2100 Hz"]
+LIST_TIMEOUT = ["%s sec" % x for x in range(15, 615, 15)]
+LIST_TXPOWER = ["High", "Low"]
+LIST_VOICE = ["Off", "English", "Chinese"]
+LIST_WORKMODE = ["Frequency", "Channel"]
+
+def model_match(cls, data):
+ """Match the opened/downloaded image to the correct version"""
+ match_rid1 = False
+ match_rid2 = False
+
+ rid1 = data[0x1FF8:0x2000]
+
+ if rid1 in cls._fileid:
+ match_rid1 = True
+
+ rid2 = data[0x1FD0:0x1FD5]
+
+ if rid2 == cls.MODEL:
+ match_rid2 = True
+
+ if match_rid1 and match_rid2:
+ return True
+ else:
+ return False
+
+
+(a)directory.register
+class UV6R(baofeng_common.BaofengCommonHT):
+ """Baofeng UV-6R"""
+ VENDOR = "Baofeng"
+ MODEL = "UV-6R"
+
+ _fileid = [UV6R_fp1, ]
+
+ _magic = [MSTRING_UV6R, ]
+ _magic_response_length = 8
+ _fw_ver_start = 0x1FF0
+ _recv_block_size = 0x40
+ _mem_size = 0x2000
+ _ack_block = False
+
+ _ranges = [(0x0000, 0x1800),
+ (0x1F40, 0x1F50),
+ (0x1FC0, 0x1FD0),
+ (0x1FE0, 0x1FF0)]
+ _send_block_size = 0x10
+
+ MODES = ["FM", "NFM"]
+ VALID_CHARS = chirp_common.CHARSET_ALPHANUMERIC + \
+ "!@#$%^&*()+-=[]:\";'<>?,./"
+ LENGTH_NAME = 7
+ SKIP_VALUES = ["", "S"]
+ DTCS_CODES = sorted(chirp_common.DTCS_CODES + [645])
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00),
+ chirp_common.PowerLevel("High", watts=5.00)]
+ VALID_BANDS = [(136000000, 174000000),
+ (400000000, 520000000)]
+ PTTID_LIST = LIST_PTTID
+ SCODE_LIST = LIST_SCODE
+
+
+ MEM_FORMAT = """
+ #seekto 0x0000;
+ struct {
+ lbcd rxfreq[4];
+ lbcd txfreq[4];
+ ul16 rxtone;
+ ul16 txtone;
+ u8 unknown0:4,
+ scode:4;
+ u8 unknown1;
+ u8 unknown2:7,
+ lowpower:1;
+ u8 unknown3:1,
+ wide:1,
+ unknown4:2,
+ bcl:1,
+ scan:1,
+ pttid:2;
+ } memory[128];
+
+ #seekto 0x0B00;
+ struct {
+ u8 code[5];
+ u8 unused[11];
+ } pttid[15];
+
+ #seekto 0x0CAA;
+ struct {
+ u8 code[5];
+ u8 unused:6,
+ aniid:2;
+ u8 unknown[2];
+ u8 dtmfon;
+ u8 dtmfoff;
+ } ani;
+
+ #seekto 0x0E20;
+ struct {
+ u8 unused00:4,
+ squelch:4;
+ u8 unused01:5,
+ step:3;
+ u8 unknown00;
+ u8 unused02:5,
+ save:3;
+ u8 unused03:4,
+ vox:4;
+ u8 unknown01;
+ u8 unused04:4,
+ abr:4;
+ u8 unused05:7,
+ tdr:1;
+ u8 unused06:7,
+ beep:1;
+ u8 unused07:2,
+ timeout:6;
+ u8 unused08:6,
+ tcall:2;
+ u8 unknown02[3];
+ u8 unused09:6,
+ voice:2;
+ u8 unknown03;
+ u8 unused10:6,
+ dtmfst:2;
+ u8 unknown04;
+ u8 unused11:6,
+ screv:2;
+ u8 unused12:6,
+ pttid:2;
+ u8 unused13:2,
+ pttlt:6;
+ u8 unused14:6,
+ mdfa:2;
+ u8 unused15:6,
+ mdfb:2;
+ u8 unknown05;
+ u8 unused16:7,
+ autolk:1;
+ u8 unknown06[4];
+ u8 unused17:6,
+ wtled:2;
+ u8 unused18:6,
+ rxled:2;
+ u8 unused19:6,
+ txled:2;
+ u8 unused20:6,
+ almod:2;
+ u8 unknown07[2];
+ u8 unused22:7,
+ ste:1;
+ u8 unused23:4,
+ rpste:4;
+ u8 unused24:4,
+ rptrl:4;
+ u8 unused25:7,
+ ponmsg:1;
+ u8 unused26:7,
+ roger:1;
+ u8 unused27:7,
+ reset:1;
+ u8 unknown08;
+ u8 displayab:1,
+ unknown09:2,
+ fmradio:1,
+ alarm:1,
+ unknown10:1,
+ reset:1,
+ menu:1;
+ u8 unknown11;
+ u8 unused29:7,
+ workmode:1;
+ u8 unused30:7,
+ keylock:1;
+ u8 cht;
+ } settings;
+
+ #seekto 0x0E76;
+ struct {
+ u8 unused0:1,
+ mrcha:7;
+ u8 unused1:1,
+ mrchb:7;
+ } wmchannel;
+
+ struct vfo {
+ u8 unknown0[8];
+ u8 freq[8];
+ u8 offset[6];
+ ul16 rxtone;
+ ul16 txtone;
+ u8 unused0:7,
+ band:1;
+ u8 unknown3;
+ u8 unknown4:2,
+ sftd:2,
+ scode:4;
+ u8 unknown5;
+ u8 unknown6:1,
+ step:3,
+ unknown7:4;
+ u8 txpower:1,
+ widenarr:1,
+ unknown8:6;
+ };
+
+ #seekto 0x0F00;
+ struct {
+ struct vfo a;
+ struct vfo b;
+ } vfo;
+
+ #seekto 0x0F4E;
+ u16 fm_presets;
+
+ #seekto 0x1000;
+ struct {
+ char name[7];
+ u8 unknown[9];
+ } names[128];
+
+ #seekto 0x1F40;
+ struct {
+ u8 sql0;
+ u8 sql1;
+ u8 sql2;
+ u8 sql3;
+ u8 sql4;
+ u8 sql5;
+ u8 sql6;
+ u8 sql7;
+ u8 sql8;
+ u8 sql9;
+ } squelch;
+
+ struct limit {
+ u8 enable;
+ bbcd lower[2];
+ bbcd upper[2];
+ };
+
+ #seekto 0x1FC0;
+ struct {
+ struct limit vhf;
+ struct limit uhf;
+ } limits;
+
+ #seekto 0x1FD0;
+ struct {
+ char line1[8];
+ char line2[8];
+ } sixpoweron_msg;
+
+ #seekto 0x1FE0;
+ struct {
+ char line1[7];
+ char line2[7];
+ } poweron_msg;
+
+ #seekto 0x1FF0;
+ struct {
+ char line1[8];
+ char line2[8];
+ } firmware_msg;
+
+ """
+
+ @classmethod
+ def get_prompts(cls):
+ rp = chirp_common.RadioPrompts()
+ rp.experimental = \
+ ('The BTech UV-6R driver is a beta version.\n'
+ '\n'
+ 'Please save an unedited copy of your first successful\n'
+ 'download to a CHIRP Radio Images(*.img) file.'
+ )
+ rp.pre_download = _(dedent("""\
+ Follow these instructions to download your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the download of your radio data
+ """))
+ rp.pre_upload = _(dedent("""\
+ Follow this instructions to upload your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the upload of your radio data
+ """))
+ return rp
+
+ def process_mmap(self):
+ """Process the mem map into the mem object"""
+ self._memobj = bitwise.parse(self.MEM_FORMAT, self._mmap)
+
+ def get_settings(self):
+ """Translate the bit in the mem_struct into settings in the UI"""
+ _mem = self._memobj
+ basic = RadioSettingGroup("basic", "Basic Settings")
+ advanced = RadioSettingGroup("advanced", "Advanced Settings")
+ other = RadioSettingGroup("other", "Other Settings")
+ work = RadioSettingGroup("work", "Work Mode Settings")
+ fm_preset = RadioSettingGroup("fm_preset", "FM Preset")
+ dtmfe = RadioSettingGroup("dtmfe", "DTMF Encode Settings")
+ service = RadioSettingGroup("service", "Service Settings")
+ top = RadioSettings(basic, advanced, other, work, fm_preset, dtmfe,
+ service)
+
+ # Basic settings
+ if _mem.settings.squelch > 0x09:
+ val = 0x00
+ else:
+ val = _mem.settings.squelch
+ rs = RadioSetting("settings.squelch", "Squelch",
+ RadioSettingValueList(
+ LIST_OFF1TO9, LIST_OFF1TO9[val]))
+ basic.append(rs)
+
+ if _mem.settings.save > 0x04:
+ val = 0x00
+ else:
+ val = _mem.settings.save
+ rs = RadioSetting("settings.save", "Battery Saver",
+ RadioSettingValueList(
+ LIST_SAVE, LIST_SAVE[val]))
+ basic.append(rs)
+
+ if _mem.settings.vox > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.vox
+ rs = RadioSetting("settings.vox", "Vox",
+ RadioSettingValueList(
+ LIST_OFF1TO10, LIST_OFF1TO10[val]))
+ basic.append(rs)
+
+ if _mem.settings.abr > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.abr
+ rs = RadioSetting("settings.abr", "Backlight Timeout",
+ RadioSettingValueList(
+ LIST_OFF1TO10, LIST_OFF1TO10[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.tdr", "Dual Watch",
+ RadioSettingValueBoolean(_mem.settings.tdr))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.beep", "Beep",
+ RadioSettingValueBoolean(_mem.settings.beep))
+ basic.append(rs)
+
+ if _mem.settings.timeout > 0x27:
+ val = 0x03
+ else:
+ val = _mem.settings.timeout
+ rs = RadioSetting("settings.timeout", "Timeout Timer",
+ RadioSettingValueList(
+ LIST_TIMEOUT, LIST_TIMEOUT[val]))
+ basic.append(rs)
+
+ if _mem.settings.voice > 0x02:
+ val = 0x01
+ else:
+ val = _mem.settings.voice
+ rs = RadioSetting("settings.voice", "Voice Prompt",
+ RadioSettingValueList(
+ LIST_VOICE, LIST_VOICE[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.dtmfst", "DTMF Sidetone",
+ RadioSettingValueList(LIST_DTMFST, LIST_DTMFST[
+ _mem.settings.dtmfst]))
+ basic.append(rs)
+
+ if _mem.settings.screv > 0x02:
+ val = 0x01
+ else:
+ val = _mem.settings.screv
+ rs = RadioSetting("settings.screv", "Scan Resume",
+ RadioSettingValueList(
+ LIST_RESUME, LIST_RESUME[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.pttid", "When to send PTT ID",
+ RadioSettingValueList(LIST_PTTID, LIST_PTTID[
+ _mem.settings.pttid]))
+ basic.append(rs)
+
+ if _mem.settings.pttlt > 0x1E:
+ val = 0x05
+ else:
+ val = _mem.settings.pttlt
+ rs = RadioSetting("pttlt", "PTT ID Delay",
+ RadioSettingValueInteger(0, 50, val))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.mdfa", "Display Mode (A)",
+ RadioSettingValueList(LIST_MODE, LIST_MODE[
+ _mem.settings.mdfa]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.mdfb", "Display Mode (B)",
+ RadioSettingValueList(LIST_MODE, LIST_MODE[
+ _mem.settings.mdfb]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.autolk", "Auto Lock Keypad",
+ RadioSettingValueBoolean(_mem.settings.autolk))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.wtled", "Standby LED Color",
+ RadioSettingValueList(
+ LIST_COLOR, LIST_COLOR[_mem.settings.wtled]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.rxled", "RX LED Color",
+ RadioSettingValueList(
+ LIST_COLOR, LIST_COLOR[_mem.settings.rxled]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.txled", "TX LED Color",
+ RadioSettingValueList(
+ LIST_COLOR, LIST_COLOR[_mem.settings.txled]))
+ basic.append(rs)
+
+ if _mem.settings.almod > 0x02:
+ val = 0x00
+ else:
+ val = _mem.settings.almod
+ rs = RadioSetting("settings.almod", "Alarm Mode",
+ RadioSettingValueList(
+ LIST_ALMOD, LIST_ALMOD[val]))
+ basic.append(rs)
+
+ if _mem.settings.tcall > 0x05:
+ val = 0x00
+ else:
+ val = _mem.settings.tcall
+ rs = RadioSetting("settings.tcall", "Tone Burst Frequency",
+ RadioSettingValueList(
+ LIST_TCALL, LIST_TCALL[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.ste", "Squelch Tail Eliminate (HT to HT)",
+ RadioSettingValueBoolean(_mem.settings.ste))
+ basic.append(rs)
+
+ if _mem.settings.rpste > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.rpste
+ rs = RadioSetting("settings.rpste",
+ "Squelch Tail Eliminate (repeater)",
+ RadioSettingValueList(
+ LIST_RPSTE, LIST_RPSTE[val]))
+ basic.append(rs)
+
+ if _mem.settings.rptrl > 0x0A:
+ val = 0x00
+ else:
+ val = _mem.settings.rptrl
+ rs = RadioSetting("settings.rptrl", "STE Repeater Delay",
+ RadioSettingValueList(
+ LIST_STEDELAY, LIST_STEDELAY[val]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.ponmsg", "Power-On Message",
+ RadioSettingValueList(LIST_PONMSG, LIST_PONMSG[
+ _mem.settings.ponmsg]))
+ basic.append(rs)
+
+ rs = RadioSetting("settings.roger", "Roger Beep",
+ RadioSettingValueBoolean(_mem.settings.roger))
+ basic.append(rs)
+
+ # Advanced settings
+ rs = RadioSetting("settings.reset", "RESET Menu",
+ RadioSettingValueBoolean(_mem.settings.reset))
+ advanced.append(rs)
+
+ rs = RadioSetting("settings.menu", "All Menus",
+ RadioSettingValueBoolean(_mem.settings.menu))
+ advanced.append(rs)
+
+ rs = RadioSetting("settings.fmradio", "Broadcast FM Radio",
+ RadioSettingValueBoolean(_mem.settings.fmradio))
+ advanced.append(rs)
+
+ rs = RadioSetting("settings.alarm", "Alarm Sound",
+ RadioSettingValueBoolean(_mem.settings.alarm))
+ advanced.append(rs)
+
+ # Other settings
+ def _filter(name):
+ filtered = ""
+ for char in str(name):
+ if char in chirp_common.CHARSET_ASCII:
+ filtered += char
+ else:
+ filtered += " "
+ return filtered
+
+ _msg = _mem.firmware_msg
+ val = RadioSettingValueString(0, 8, _filter(_msg.line1))
+ val.set_mutable(False)
+ rs = RadioSetting("firmware_msg.line1", "Firmware Message 1", val)
+ other.append(rs)
+
+ val = RadioSettingValueString(0, 8, _filter(_msg.line2))
+ val.set_mutable(False)
+ rs = RadioSetting("firmware_msg.line2", "Firmware Message 2", val)
+ other.append(rs)
+
+ _msg = _mem.sixpoweron_msg
+ val = RadioSettingValueString(0, 8, _filter(_msg.line1))
+ val.set_mutable(False)
+ rs = RadioSetting("sixpoweron_msg.line1", "6+Power-On Message 1", val)
+ other.append(rs)
+ val = RadioSettingValueString(0, 8, _filter(_msg.line2))
+ val.set_mutable(False)
+ rs = RadioSetting("sixpoweron_msg.line2", "6+Power-On Message 2", val)
+ other.append(rs)
+
+ _msg = _mem.poweron_msg
+ rs = RadioSetting("poweron_msg.line1", "Power-On Message 1",
+ RadioSettingValueString(
+ 0, 7, _filter(_msg.line1)))
+ other.append(rs)
+ rs = RadioSetting("poweron_msg.line2", "Power-On Message 2",
+ RadioSettingValueString(
+ 0, 7, _filter(_msg.line2)))
+ other.append(rs)
+
+ lower = 136
+ upper = 174
+ rs = RadioSetting("limits.vhf.lower", "VHF Lower Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.vhf.lower))
+ other.append(rs)
+
+ rs = RadioSetting("limits.vhf.upper", "VHF Upper Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.vhf.upper))
+ other.append(rs)
+
+ lower = 400
+ upper = 520
+ rs = RadioSetting("limits.uhf.lower", "UHF Lower Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.uhf.lower))
+ other.append(rs)
+
+ rs = RadioSetting("limits.uhf.upper", "UHF Upper Limit (MHz)",
+ RadioSettingValueInteger(
+ lower, upper, _mem.limits.uhf.upper))
+ other.append(rs)
+
+ # Work mode settings
+ rs = RadioSetting("settings.displayab", "Display",
+ RadioSettingValueList(
+ LIST_AB, LIST_AB[_mem.settings.displayab]))
+ work.append(rs)
+
+ rs = RadioSetting("settings.workmode", "VFO/MR Mode",
+ RadioSettingValueList(
+ LIST_WORKMODE,
+ LIST_WORKMODE[_mem.settings.workmode]))
+ work.append(rs)
+
+ rs = RadioSetting("settings.keylock", "Keypad Lock",
+ RadioSettingValueBoolean(_mem.settings.keylock))
+ work.append(rs)
+
+ rs = RadioSetting("wmchannel.mrcha", "MR A Channel",
+ RadioSettingValueInteger(0, 127,
+ _mem.wmchannel.mrcha))
+ work.append(rs)
+
+ rs = RadioSetting("wmchannel.mrchb", "MR B Channel",
+ RadioSettingValueInteger(0, 127,
+ _mem.wmchannel.mrchb))
+ work.append(rs)
+
+ def convert_bytes_to_freq(bytes):
+ real_freq = 0
+ for byte in bytes:
+ real_freq = (real_freq * 10) + byte
+ return chirp_common.format_freq(real_freq * 10)
+
+ def my_validate(value):
+ _vhf_lower = int(_mem.limits.vhf.lower)
+ _vhf_upper = int(_mem.limits.vhf.upper)
+ _uhf_lower = int(_mem.limits.uhf.lower)
+ _uhf_upper = int(_mem.limits.uhf.upper)
+ value = chirp_common.parse_freq(value)
+ msg = ("Can't be less than %i.0000")
+ if value > 99000000 and value < _vhf_lower * 1000000:
+ raise InvalidValueError(msg % _vhf_lower)
+ msg = ("Can't be between %i.9975-%i.0000")
+ if _vhf_upper * 1000000 <= value and value < _uhf_lower * 1000000:
+ raise InvalidValueError(msg % (_vhf_upper - 1, _uhf_lower))
+ msg = ("Can't be greater than %i.9975")
+ if value > 99000000 and value >= _uhf_upper * 1000000:
+ raise InvalidValueError(msg % (_uhf_upper - 1))
+ return chirp_common.format_freq(value)
+
+ def apply_freq(setting, obj):
+ value = chirp_common.parse_freq(str(setting.value)) / 10
+ for i in range(7, -1, -1):
+ obj.freq[i] = value % 10
+ value /= 10
+
+ val1a = RadioSettingValueString(0, 10,
+ convert_bytes_to_freq(_mem.vfo.a.freq))
+ val1a.set_validate_callback(my_validate)
+ rs = RadioSetting("vfo.a.freq", "VFO A Frequency", val1a)
+ rs.set_apply_callback(apply_freq, _mem.vfo.a)
+ work.append(rs)
+
+ val1b = RadioSettingValueString(0, 10,
+ convert_bytes_to_freq(_mem.vfo.b.freq))
+ val1b.set_validate_callback(my_validate)
+ rs = RadioSetting("vfo.b.freq", "VFO B Frequency", val1b)
+ rs.set_apply_callback(apply_freq, _mem.vfo.b)
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.sftd", "VFO A Shift",
+ RadioSettingValueList(
+ LIST_SHIFTD, LIST_SHIFTD[_mem.vfo.a.sftd]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.sftd", "VFO B Shift",
+ RadioSettingValueList(
+ LIST_SHIFTD, LIST_SHIFTD[_mem.vfo.b.sftd]))
+ work.append(rs)
+
+ def convert_bytes_to_offset(bytes):
+ real_offset = 0
+ for byte in bytes:
+ real_offset = (real_offset * 10) + byte
+ return chirp_common.format_freq(real_offset * 1000)
+
+ def apply_offset(setting, obj):
+ value = chirp_common.parse_freq(str(setting.value)) / 1000
+ for i in range(5, -1, -1):
+ obj.offset[i] = value % 10
+ value /= 10
+
+ val1a = RadioSettingValueString(
+ 0, 10, convert_bytes_to_offset(_mem.vfo.a.offset))
+ rs = RadioSetting("vfo.a.offset",
+ "VFO A Offset", val1a)
+ rs.set_apply_callback(apply_offset, _mem.vfo.a)
+ work.append(rs)
+
+ val1b = RadioSettingValueString(
+ 0, 10, convert_bytes_to_offset(_mem.vfo.b.offset))
+ rs = RadioSetting("vfo.b.offset",
+ "VFO B Offset", val1b)
+ rs.set_apply_callback(apply_offset, _mem.vfo.b)
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.txpower", "VFO A Power",
+ RadioSettingValueList(
+ LIST_TXPOWER,
+ LIST_TXPOWER[_mem.vfo.a.txpower]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.txpower", "VFO B Power",
+ RadioSettingValueList(
+ LIST_TXPOWER,
+ LIST_TXPOWER[_mem.vfo.b.txpower]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.widenarr", "VFO A Bandwidth",
+ RadioSettingValueList(
+ LIST_BANDWIDTH,
+ LIST_BANDWIDTH[_mem.vfo.a.widenarr]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.widenarr", "VFO B Bandwidth",
+ RadioSettingValueList(
+ LIST_BANDWIDTH,
+ LIST_BANDWIDTH[_mem.vfo.b.widenarr]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.scode", "VFO A S-CODE",
+ RadioSettingValueList(
+ LIST_SCODE,
+ LIST_SCODE[_mem.vfo.a.scode]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.b.scode", "VFO B S-CODE",
+ RadioSettingValueList(
+ LIST_SCODE,
+ LIST_SCODE[_mem.vfo.b.scode]))
+ work.append(rs)
+
+ rs = RadioSetting("vfo.a.step", "VFO A Tuning Step",
+ RadioSettingValueList(
+ LIST_STEP, LIST_STEP[_mem.vfo.a.step]))
+ work.append(rs)
+ rs = RadioSetting("vfo.b.step", "VFO B Tuning Step",
+ RadioSettingValueList(
+ LIST_STEP, LIST_STEP[_mem.vfo.b.step]))
+ work.append(rs)
+
+ # broadcast FM settings
+ _fm_presets = self._memobj.fm_presets
+ if _fm_presets <= 108.0 * 10 - 650:
+ preset = _fm_presets / 10.0 + 65
+ elif _fm_presets >= 65.0 * 10 and _fm_presets <= 108.0 * 10:
+ preset = _fm_presets / 10.0
+ else:
+ preset = 76.0
+ rs = RadioSetting("fm_presets", "FM Preset(MHz)",
+ RadioSettingValueFloat(65, 108.0, preset, 0.1, 1))
+ fm_preset.append(rs)
+
+ # DTMF settings
+ def apply_code(setting, obj, length):
+ code = []
+ for j in range(0, length):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.code = code
+
+ for i in range(0, 15):
+ _codeobj = self._memobj.pttid[i].code
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 5, _code, False)
+ val.set_charset(DTMF_CHARS)
+ pttid = RadioSetting("pttid/%i.code" % i,
+ "Signal Code %i" % (i + 1), val)
+ pttid.set_apply_callback(apply_code, self._memobj.pttid[i], 5)
+ dtmfe.append(pttid)
+
+ if _mem.ani.dtmfon > 0xC3:
+ val = 0x03
+ else:
+ val = _mem.ani.dtmfon
+ rs = RadioSetting("ani.dtmfon", "DTMF Speed (on)",
+ RadioSettingValueList(LIST_DTMFSPEED,
+ LIST_DTMFSPEED[val]))
+ dtmfe.append(rs)
+
+ if _mem.ani.dtmfoff > 0xC3:
+ val = 0x03
+ else:
+ val = _mem.ani.dtmfoff
+ rs = RadioSetting("ani.dtmfoff", "DTMF Speed (off)",
+ RadioSettingValueList(LIST_DTMFSPEED,
+ LIST_DTMFSPEED[val]))
+ dtmfe.append(rs)
+
+ _codeobj = self._memobj.ani.code
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 5, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.code", "ANI Code", val)
+ rs.set_apply_callback(apply_code, self._memobj.ani, 5)
+ dtmfe.append(rs)
+
+ rs = RadioSetting("ani.aniid", "When to send ANI ID",
+ RadioSettingValueList(LIST_PTTID,
+ LIST_PTTID[_mem.ani.aniid]))
+ dtmfe.append(rs)
+
+ # Service settings
+ for index in range(0, 10):
+ key = "squelch.sql%i" % (index)
+ _obj = self._memobj.squelch
+ val = RadioSettingValueInteger(0, 123,
+ getattr(_obj, "sql%i" % (index)))
+ if index == 0:
+ val.set_mutable(False)
+ name = "Squelch %i" % (index)
+ rs = RadioSetting(key, name, val)
+ service.append(rs)
+
+ return top
+
+ @classmethod
+ def match_model(cls, filedata, filename):
+ match_size = False
+ match_model = False
+
+ # testing the file data size
+ if len(filedata) == 0x2008:
+ 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
1
0
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1471389478 14400
# Node ID 03d700ed2aec42bbf17de6f138360dc2aac2ce20
# Parent 08c7fe428b99035b951bb310524d6e16006820e0
[UV-6R] Add Baofeng Common Driver
This driver is being added in preparaton for adding Baofeng UV-6R support.
It contains common functions that will be used for new Baofeng (and similar)
handheld radios.
related to #2761
diff -r 08c7fe428b99 -r 03d700ed2aec chirp/drivers/baofeng_common.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/drivers/baofeng_common.py Tue Aug 16 19:17:58 2016 -0400
@@ -0,0 +1,620 @@
+# Copyright 2016:
+# * Jim Unroe KC9HI, <rock.unroe(a)gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""common functions for Baofeng (or similar) handheld radios"""
+
+import time
+import struct
+import logging
+from chirp import chirp_common, directory, memmap
+from chirp import bitwise, errors, util
+from chirp.settings import RadioSettingGroup, RadioSetting, \
+ RadioSettingValueBoolean, RadioSettingValueList
+
+LOG = logging.getLogger(__name__)
+
+STIMEOUT = 1.5
+
+
+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:
+ msg = "Generic error reading data from radio; check your cable."
+ raise errors.RadioError(msg)
+
+ if len(data) != amount:
+ msg = "Error reading data 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(">BHB", ord(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 """
+ # read 4 bytes of header
+ hdr = _rawrecv(radio, 4)
+
+ # read data
+ data = _rawrecv(radio, length)
+
+ # DEBUG
+ LOG.info("Response:")
+ LOG.debug(util.hexprint(hdr + data))
+
+ c, a, l = struct.unpack(">BHB", hdr)
+ if a != addr or l != length or c != ord("X"):
+ LOG.error("Invalid answer for block 0x%04x:" % addr)
+ LOG.debug("CMD: %s ADDR: %04x SIZE: %02x" % (c, a, l))
+ raise errors.RadioError("Unknown response from the radio")
+
+ return data
+
+
+def _get_radio_firmware_version(radio):
+ msg = struct.pack(">BHB", ord("S"), radio._fw_ver_start,
+ radio._recv_block_size)
+ radio.pipe.write(msg)
+ block = _recv(radio, radio._fw_ver_start, radio._recv_block_size)
+ _rawsend(radio, "\x06")
+ time.sleep(0.05)
+ version = block[0:16]
+ return version
+
+
+def _image_ident_from_data(data, start, stop):
+ return data[start:stop]
+
+
+def _get_image_firmware_version(radio):
+ return _image_ident_from_data(radio.get_mmap(), radio._fw_ver_start,
+ radio._fw_ver_start + 0x10)
+
+
+def _do_ident(radio, magic):
+ """Put the radio in PROGRAM mode"""
+ # set the serial discipline
+ radio.pipe.baudrate = 9600
+ radio.pipe.parity = "N"
+ radio.pipe.timeout = STIMEOUT
+
+ # flush input buffer
+ _clean_buffer(radio)
+
+ # send request to enter program mode
+ _rawsend(radio, magic)
+
+ ack = _rawrecv(radio, 1)
+ if ack != "\x06":
+ if ack:
+ LOG.debug(repr(ack))
+ raise errors.RadioError("Radio did not respond")
+
+ _rawsend(radio, "\x02")
+
+ # Ok, get the response
+ ident = _rawrecv(radio, radio._magic_response_length)
+
+ # check if response is OK
+ if not ident.startswith("\xaa") or not ident.endswith("\xdd"):
+ # bad response
+ msg = "Unexpected response, got this:"
+ msg += util.hexprint(ident)
+ LOG.debug(msg)
+ raise errors.RadioError("Unexpected response from radio.")
+
+ # DEBUG
+ LOG.info("Valid response, got this:")
+ LOG.debug(util.hexprint(ident))
+
+ _rawsend(radio, "\x06")
+ ack = _rawrecv(radio, 1)
+ if ack != "\x06":
+ if ack:
+ LOG.debug(repr(ack))
+ raise errors.RadioError("Radio refused clone")
+
+ return ident
+
+
+def _ident_radio(radio):
+ for magic in radio._magic:
+ error = None
+ try:
+ data = _do_ident(radio, magic)
+ return data
+ except errors.RadioError, e:
+ print e
+ error = e
+ time.sleep(2)
+ if error:
+ raise error
+ raise errors.RadioError("Radio did not respond")
+
+
+def _download(radio):
+ """Get the memory map"""
+ # put radio in program mode
+ ident = _ident_radio(radio)
+
+ # identify radio
+ radio_ident = _get_radio_firmware_version(radio)
+ LOG.info("Radio firmware version:")
+ LOG.debug(util.hexprint(radio_ident))
+
+ # UI progress
+ status = chirp_common.Status()
+ status.cur = 0
+ status.max = radio._mem_size / radio._recv_block_size
+ status.msg = "Cloning from radio..."
+ radio.status_fn(status)
+
+ data = ""
+ for addr in range(0, radio._mem_size, radio._recv_block_size):
+ frame = _make_frame("S", addr, radio._recv_block_size)
+ # DEBUG
+ LOG.info("Request sent:")
+ LOG.debug(util.hexprint(frame))
+
+ # sending the read request
+ _rawsend(radio, frame)
+
+ if radio._ack_block:
+ ack = _rawrecv(radio, 1)
+ if ack != "\x06":
+ raise errors.RadioError(
+ "Radio refused to send block 0x%04x" % addr)
+
+ # now we read
+ d = _recv(radio, addr, radio._recv_block_size)
+
+ _rawsend(radio, "\x06")
+ time.sleep(0.05)
+
+ # aggregate the data
+ data += d
+
+ # UI Update
+ status.cur = addr / radio._recv_block_size
+ status.msg = "Cloning from radio..."
+ radio.status_fn(status)
+
+ data += ident
+
+ return data
+
+
+def _upload(radio):
+ """Upload procedure"""
+ # put radio in program mode
+ _ident_radio(radio)
+
+ # identify radio
+ radio_ident = _get_radio_firmware_version(radio)
+ LOG.info("Radio firmware version:")
+ LOG.debug(util.hexprint(radio_ident))
+ # identify image
+ image_ident = _get_image_firmware_version(radio)
+ LOG.info("Image firmware version:")
+ LOG.debug(util.hexprint(image_ident))
+
+ if radio_ident != "0xFF" * 16 and image_ident == radio_ident:
+ _ranges = radio._ranges
+ else:
+ _ranges = [(0x0000, 0x0DF0),
+ (0x0E00, 0x1800)]
+
+ # UI progress
+ status = chirp_common.Status()
+ status.cur = 0
+ status.max = radio._mem_size / radio._send_block_size
+ status.msg = "Cloning to radio..."
+ radio.status_fn(status)
+
+ # the fun start here
+ for start, end in _ranges:
+ for addr in range(start, end, radio._send_block_size):
+ # sending the data
+ data = radio.get_mmap()[addr:addr + radio._send_block_size]
+
+ frame = _make_frame("X", addr, radio._send_block_size, data)
+
+ _rawsend(radio, frame)
+ time.sleep(0.05)
+
+ # receiving the response
+ ack = _rawrecv(radio, 1)
+ if ack != "\x06":
+ msg = "Bad ack writing block 0x%04x" % addr
+ raise errors.RadioError(msg)
+
+ # UI Update
+ status.cur = addr / radio._send_block_size
+ status.msg = "Cloning to radio..."
+ radio.status_fn(status)
+
+
+def _split(rf, f1, f2):
+ """Returns False if the two freqs are in the same band (no split)
+ or True otherwise"""
+
+ # determine if the two freqs are in the same band
+ for low, high in rf.valid_bands:
+ if f1 >= low and f1 <= high and \
+ f2 >= low and f2 <= high:
+ # if the two freqs are on the same Band this is not a split
+ return False
+
+ # if you get here is because the freq pairs are split
+ return True
+
+class BaofengCommonHT(chirp_common.CloneModeRadio,
+ chirp_common.ExperimentalRadio):
+ """Baofeng HT Sytle Radios"""
+ VENDOR = "Baofeng"
+ MODEL = ""
+ IDENT = ""
+
+ 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 get_features(self):
+ """Get the radio's features"""
+
+ rf = chirp_common.RadioFeatures()
+ rf.has_settings = True
+ rf.has_bank = False
+ rf.has_tuning_step = False
+ rf.can_odd_split = True
+ rf.has_name = True
+ rf.has_offset = True
+ rf.has_mode = True
+ rf.has_dtcs = True
+ rf.has_rx_dtcs = True
+ rf.has_dtcs_polarity = True
+ rf.has_ctone = True
+ rf.has_cross = True
+ rf.valid_modes = self.MODES
+ rf.valid_characters = self.VALID_CHARS
+ rf.valid_name_length = self.LENGTH_NAME
+ rf.valid_duplexes = ["", "-", "+", "split", "off"]
+ rf.valid_tmodes = ['', 'Tone', 'TSQL', 'DTCS', 'Cross']
+ rf.valid_cross_modes = [
+ "Tone->Tone",
+ "DTCS->",
+ "->DTCS",
+ "Tone->DTCS",
+ "DTCS->Tone",
+ "->Tone",
+ "DTCS->DTCS"]
+ rf.valid_skips = self.SKIP_VALUES
+ rf.valid_dtcs_codes = self.DTCS_CODES
+ rf.memory_bounds = (0, 127)
+ rf.valid_power_levels = self.POWER_LEVELS
+ rf.valid_bands = self.VALID_BANDS
+
+ return rf
+
+ def _is_txinh(self, _mem):
+ raw_tx = ""
+ for i in range(0, 4):
+ raw_tx += _mem.txfreq[i].get_raw()
+ return raw_tx == "\xFF\xFF\xFF\xFF"
+
+ def get_memory(self, number):
+ _mem = self._memobj.memory[number]
+ _nam = self._memobj.names[number]
+
+ mem = chirp_common.Memory()
+ mem.number = number
+
+ if _mem.get_raw()[0] == "\xff":
+ mem.empty = True
+ return mem
+
+ mem.freq = int(_mem.rxfreq) * 10
+
+ if self._is_txinh(_mem):
+ # TX freq not set
+ mem.duplex = "off"
+ mem.offset = 0
+ else:
+ # TX freq set
+ offset = (int(_mem.txfreq) * 10) - mem.freq
+ if offset != 0:
+ if _split(self.get_features(), mem.freq, int(_mem.txfreq) * 10):
+ mem.duplex = "split"
+ mem.offset = int(_mem.txfreq) * 10
+ elif offset < 0:
+ mem.offset = abs(offset)
+ mem.duplex = "-"
+ elif offset > 0:
+ mem.offset = offset
+ mem.duplex = "+"
+ else:
+ mem.offset = 0
+
+ for char in _nam.name:
+ if str(char) == "\xFF":
+ char = " " # The OEM software may have 0xFF mid-name
+ mem.name += str(char)
+ mem.name = mem.name.rstrip()
+
+ dtcs_pol = ["N", "N"]
+
+ if _mem.txtone in [0, 0xFFFF]:
+ txmode = ""
+ elif _mem.txtone >= 0x0258:
+ txmode = "Tone"
+ mem.rtone = int(_mem.txtone) / 10.0
+ elif _mem.txtone <= 0x0258:
+ txmode = "DTCS"
+ if _mem.txtone > 0x69:
+ index = _mem.txtone - 0x6A
+ dtcs_pol[0] = "R"
+ else:
+ index = _mem.txtone - 1
+ mem.dtcs = self.DTCS_CODES[index]
+ else:
+ LOG.warn("Bug: txtone is %04x" % _mem.txtone)
+
+ if _mem.rxtone in [0, 0xFFFF]:
+ rxmode = ""
+ elif _mem.rxtone >= 0x0258:
+ rxmode = "Tone"
+ mem.ctone = int(_mem.rxtone) / 10.0
+ elif _mem.rxtone <= 0x0258:
+ rxmode = "DTCS"
+ if _mem.rxtone >= 0x6A:
+ index = _mem.rxtone - 0x6A
+ dtcs_pol[1] = "R"
+ else:
+ index = _mem.rxtone - 1
+ mem.rx_dtcs = self.DTCS_CODES[index]
+ else:
+ LOG.warn("Bug: rxtone is %04x" % _mem.rxtone)
+
+ 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)
+
+ if not _mem.scan:
+ mem.skip = "S"
+
+ levels = self.POWER_LEVELS
+ try:
+ mem.power = levels[_mem.lowpower]
+ except IndexError:
+ LOG.error("Radio reported invalid power level %s (in %s)" %
+ (_mem.power, levels))
+ mem.power = levels[0]
+
+ mem.mode = _mem.wide and "FM" or "NFM"
+
+ mem.extra = RadioSettingGroup("Extra", "extra")
+
+ rs = RadioSetting("bcl", "BCL",
+ RadioSettingValueBoolean(_mem.bcl))
+ mem.extra.append(rs)
+
+ rs = RadioSetting("pttid", "PTT ID",
+ RadioSettingValueList(self.PTTID_LIST,
+ self.PTTID_LIST[_mem.pttid]))
+ mem.extra.append(rs)
+
+ rs = RadioSetting("scode", "S-CODE",
+ RadioSettingValueList(self.SCODE_LIST,
+ self.SCODE_LIST[_mem.scode]))
+ mem.extra.append(rs)
+
+ return mem
+
+ def set_memory(self, mem):
+ _mem = self._memobj.memory[mem.number]
+ _nam = self._memobj.names[mem.number]
+
+ if mem.empty:
+ _mem.set_raw("\xff" * 16)
+ _nam.set_raw("\xff" * 16)
+ return
+
+ _mem.set_raw("\x00" * 16)
+
+ _mem.rxfreq = mem.freq / 10
+
+ if mem.duplex == "off":
+ for i in range(0, 4):
+ _mem.txfreq[i].set_raw("\xFF")
+ elif mem.duplex == "split":
+ _mem.txfreq = mem.offset / 10
+ elif mem.duplex == "+":
+ _mem.txfreq = (mem.freq + mem.offset) / 10
+ elif mem.duplex == "-":
+ _mem.txfreq = (mem.freq - mem.offset) / 10
+ else:
+ _mem.txfreq = mem.freq / 10
+
+ _namelength = self.get_features().valid_name_length
+ for i in range(_namelength):
+ try:
+ _nam.name[i] = mem.name[i]
+ except IndexError:
+ _nam.name[i] = "\xFF"
+
+ rxmode = txmode = ""
+ if mem.tmode == "Tone":
+ _mem.txtone = int(mem.rtone * 10)
+ _mem.rxtone = 0
+ elif mem.tmode == "TSQL":
+ _mem.txtone = int(mem.ctone * 10)
+ _mem.rxtone = int(mem.ctone * 10)
+ elif mem.tmode == "DTCS":
+ rxmode = txmode = "DTCS"
+ _mem.txtone = self.DTCS_CODES.index(mem.dtcs) + 1
+ _mem.rxtone = self.DTCS_CODES.index(mem.dtcs) + 1
+ elif mem.tmode == "Cross":
+ txmode, rxmode = mem.cross_mode.split("->", 1)
+ if txmode == "Tone":
+ _mem.txtone = int(mem.rtone * 10)
+ elif txmode == "DTCS":
+ _mem.txtone = self.DTCS_CODES.index(mem.dtcs) + 1
+ else:
+ _mem.txtone = 0
+ if rxmode == "Tone":
+ _mem.rxtone = int(mem.ctone * 10)
+ elif rxmode == "DTCS":
+ _mem.rxtone = self.DTCS_CODES.index(mem.rx_dtcs) + 1
+ else:
+ _mem.rxtone = 0
+ else:
+ _mem.rxtone = 0
+ _mem.txtone = 0
+
+ if txmode == "DTCS" and mem.dtcs_polarity[0] == "R":
+ _mem.txtone += 0x69
+ if rxmode == "DTCS" and mem.dtcs_polarity[1] == "R":
+ _mem.rxtone += 0x69
+
+ _mem.scan = mem.skip != "S"
+ _mem.wide = mem.mode == "FM"
+
+ if mem.power:
+ _mem.lowpower = self.POWER_LEVELS.index(mem.power)
+ else:
+ _mem.lowpower = 0
+
+ # extra settings
+ if len(mem.extra) > 0:
+ # there are setting, parse
+ for setting in mem.extra:
+ setattr(_mem, setting.get_name(), setting.value)
+ else:
+ # there are no extra settings, load defaults
+ _mem.bcl = 0
+ _mem.pttid = 0
+ _mem.scode = 0
+
+ def set_settings(self, settings):
+ _settings = self._memobj.settings
+ _mem = self._memobj
+ for element in settings:
+ if not isinstance(element, RadioSetting):
+ if element.get_name() == "fm_preset":
+ self._set_fm_preset(element)
+ else:
+ 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
+
+ def _set_fm_preset(self, settings):
+ for element in settings:
+ try:
+ val = element.value
+ if self._memobj.fm_presets <= 108.0 * 10 - 650:
+ value = int(val.get_value() * 10 - 650)
+ else:
+ value = int(val.get_value() * 10)
+ LOG.debug("Setting fm_presets = %s" % (value))
+ self._memobj.fm_presets = value
+ except Exception, e:
+ LOG.debug(element.get_name())
+ raise
1
0
Tested changes:
[Jim Unroe <rock.unroe(a)gmail.com>] [UV-5R] Add Support for UV-6 with Longer 12 byte Ident
The currently shipping Baofeng UV-6 responds to the clone request by
returning a 12 byte "ident". The original model replies with an 8 byte "ident"
(the same as all other radios currently supported by the uv5r.py driver).
The current CHIRP driver appends the radio's memory image after the "ident"
so the settings structures are all offset by 8 bytes to accomodate these extra
bytes at the beginning of the image. So there must alway be exactly 8 bytes
prepended to the actual memory map data.
Original UV-6 ident:
AA 36 74 04 00 05 20 DD
New UV-6 ident:
AA 01 01 36 01 74 01 04 00 05 20 DD
This patch works around the issue by doing the following...
1. The "ident" is now read one byte at a time until the last byte ("\xdd")
is received. This make it compatible with an 8 byte and 12 byte "ident".
2. The 4 bytes of the ident containing "\x01" are discarded to shorten the
ident to the standard 8 byte length and to put the "ident" in the same
format as the "ident" of the other radio models.
Related to Bug #3063
[Tom Hayward <tom(a)tomh.us>] [id880] Fix typo in charset definition. #281
[Tom Hayward <tom(a)tomh.us>] [thf6a] Support full charset (ASCII). Fixes #141
[Tom Hayward <tom(a)tomh.us>] [id880] Support full charset. Fixes #281
[Tom Hayward <tom(a)tomh.us>] [vx5] Support full charset (ASCII). Fixes #292
[Tom Hayward <tom(a)tomh.us>] [id31a] set used bit when creating new memory, clear when deleting. Fixes #269
[Tom Hayward <tom(a)tomh.us>] Support PyGTK < 2.22 in bank edit. Fixes #231
[Tom Hayward <tom(a)tomh.us>] [d710] [v71] [d72] Fix tone list (not all tones are supported). Fixes #212
[Dan Smith <dsmith(a)danplanet.com>] [vx7] Fix setting memory power levels on 220MHz band
Fixes #214
[Dan Smith <dsmith(a)danplanet.com>] fips: Pennsylvania FIPS code was wrong. #117
[Marco Filippi <iz3gme.marco(a)gmail.com>] Consider lower bound frequency of each valid_band as valid
Fix bug #181
[Tom Hayward <tom(a)tomh.us>] tmd700: allow 8-char names. Fixes #176
[Dan Smith <dsmith(a)danplanet.com>] Fix the "blind deletion" problem, as well as properly direct copy/paste
Fixes #172
[David Griffith <dave(a)661.org>] Bug #155 fix: VX-7 1.25m power levels
[David Griffith <dave(a)661.org>] New INSTALL and README files
Fixes #122
[Tom Hayward <tom(a)tomh.us>] thd72: only use hardware flow on OS X. Fixes #166
[Marco Filippi <iz3gme.marco(a)gmail.com>] [FT817] Tone freq not set correctly
Same as #88 for FT857, to avoid code duplication fix code have been moved from
ft857 to its ancestor class
Fix bug #163
[Tom Hayward <tom(a)tomh.us>] Fix Mac .app so paths with spaces work. Fixes Bug #145
Full log:
Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/chirp-test/workspace
[workspace] $ hg showconfig paths.default
[workspace] $ hg pull --rev default
[workspace] $ hg update --clean --rev default
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
[workspace] $ hg log --rev . --template {node}
[workspace] $ hg log --rev . --template {rev}
[workspace] $ hg log --rev 08c7fe428b99035b951bb310524d6e16006820e0
[workspace] $ hg log --template "<changeset node='{node}' author='{author|xmlescape}' rev='{rev}' date='{date}'><msg>{desc|xmlescape}</msg><added>{file_adds|stringify|xmlescape}</added><deleted>{file_dels|stringify|xmlescape}</deleted><files>{files|stringify|xmlescape}</files><parents>{parents}</parents></changeset>\n" --rev default:0 --follow --prune 08c7fe428b99035b951bb310524d6e16006820e0
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson6800590269838185584.sh
[workspace] $ /bin/sh -xe /tmp/hudson4727623467570632969.sh
+ PATH=/usr/bin:/bin:/usr/local/bin ./run_all_tests.sh
test_bit_array (tests.unit.test_bitwise.TestBitType) ... ok
test_bit_array_fail (tests.unit.test_bitwise.TestBitType) ... ok
test_bitfield_u16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u8 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_bbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_int_array (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u8 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_char (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_invalid_chars (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_wrong_length (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_comment_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_comment_inline_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_missing_semicolon (tests.unit.test_bitwise.TestBitwiseErrors) ... ok
test_seek (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_seekto (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_struct_one_element (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_two_elements (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_writes (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
split_tone_encode_test_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_fix_rounded_step_250 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_500 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_750 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_12_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_2_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_5_0 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_6_25 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_fractional_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step_fail (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_format_freq (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_bad (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_decimal (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whitespace (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whole (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_ensure_has_calls_almost_full (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_empty (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_partial (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full1 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full2 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_urcall_full (tests.unit.test_import_logic.DstarTests) ... ok
test_import_bank (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffA_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffB_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_negative (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_too_big_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_uhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_errors (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_warnings (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_invalid (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_am (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_fm (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_name (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_closest (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_dst (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_src (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_same (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffA_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffB_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModelIndexInterface) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_icom_bank (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_index_bounds (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_next_mapping_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_auto_tone_mode_cross (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_pol (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_rx (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tone (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tsql (tests.unit.test_memedit_edits.TestEdits) ... ok
test_init (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_bad_portnames (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_sorted (tests.unit.test_platform.Win32PlatformTest) ... ok
test_apply_callback (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_group (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_multi (tests.unit.test_settings.TestSettingContainers) ... ok
test_changed (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_boolean (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_float (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_integer (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_list (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_string (tests.unit.test_settings.TestSettingValues) ... ok
test_validate_callback (tests.unit.test_settings.TestSettingValues) ... ok
test_delete_hole_with_all (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_all_full (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_without_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_with_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_without_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
----------------------------------------------------------------------
Ran 151 tests in 0.052s
OK
Patch 'tip' is OK
Checking for PEP8 regressions...
./chirp/drivers/ft2900.py:1236:1: E265 block comment should start with '# '
./chirp/drivers/ft60.py:521:45: W291 trailing whitespace
./chirp/drivers/ft60.py:522:25: E128 continuation line under-indented for visual indent
./chirp/drivers/ft60.py:523:13: E301 expected 1 blank line, found 0
./chirp/drivers/ft817.py:587:41: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:684:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:688:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:691:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:692:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:695:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:696:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:699:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:702:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:705:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:708:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:711:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:714:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:717:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:720:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:721:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:724:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:725:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:728:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:731:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:732:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:735:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:736:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:739:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:740:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:743:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:744:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:747:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:750:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:753:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:754:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:757:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:758:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:761:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:764:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:767:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:768:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:771:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:772:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:775:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:776:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:779:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:782:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:783:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:786:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:789:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:790:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:793:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:794:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:810:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:811:31: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:814:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:817:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:821:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:827:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:832:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:836:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:840:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:844:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:848:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:893:25: E128 continuation line under-indented for visual indent
./chirp/drivers/thd72.py:188:1: E302 expected 2 blank lines, found 1
./chirp/drivers/thd72.py:203:23: E201 whitespace after '['
./chirp/drivers/thd72.py:203:80: E501 line too long (171 > 79 characters)
./chirp/drivers/thd72.py:203:170: E202 whitespace before ']'
./chirp/drivers/thd72.py:204:13: E201 whitespace after '['
./chirp/drivers/thd72.py:204:61: E202 whitespace before ']'
./chirp/drivers/thd72.py:205:23: E201 whitespace after '['
./chirp/drivers/thd72.py:205:74: E202 whitespace before ']'
./chirp/drivers/thd72.py:206:18: E201 whitespace after '['
./chirp/drivers/thd72.py:206:65: E202 whitespace before ']'
./chirp/drivers/thd72.py:595:1: W293 blank line contains whitespace
./chirp/drivers/thd72.py:603:1: W293 blank line contains whitespace
./chirp/ui/mainapp.py:647:13: E128 continuation line under-indented for visual indent
./chirp/ui/mainapp.py:661:5: E303 too many blank lines (2)
./chirp/ui/mainapp.py:1374:80: E501 line too long (81 > 79 characters)
./chirp/ui/mainapp.py:1378:80: E501 line too long (80 > 79 characters)
./chirp/ui/mainapp.py:1663:80: E501 line too long (85 > 79 characters)
real 0m7.545s
user 0m7.448s
sys 0m0.028s
================================================
Tests OK
+ cat /var/lib/jenkins/.chirp/debug.log
[2016-08-15 09:57:54,470] chirp.logger - DEBUG: CHIRP 0.3.0dev on Linux - Ubuntu 16.04.1 LTS (Python 2.7.12)
[2016-08-15 09:57:54,506] chirp.directory - INFO: Registered Kenwood_TH-D7 = THD7Radio
[2016-08-15 09:57:54,506] chirp.directory - INFO: Registered Kenwood_TH-D7G = THD7GRadio
[2016-08-15 09:57:54,506] chirp.directory - INFO: Registered Kenwood_TM-D700 = TMD700Radio
[2016-08-15 09:57:54,506] chirp.directory - INFO: Registered Kenwood_TM-V7 = TMV7Radio
[2016-08-15 09:57:54,506] chirp.directory - INFO: Registered Kenwood_TM-G707 = TMG707Radio
[2016-08-15 09:57:54,506] chirp.directory - INFO: Registered Kenwood_TH-G71 = THG71Radio
[2016-08-15 09:57:54,506] chirp.directory - INFO: Registered Kenwood_TH-F6 = THF6ARadio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Kenwood_TH-F7 = THF7ERadio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Kenwood_TM-D710 = TMD710Radio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Kenwood_TH-D72_live_mode = THD72Radio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Kenwood_TM-V71 = TMV71Radio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Kenwood_TM-D710G = TMD710GRadio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Kenwood_TH-K2 = THK2Radio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Kenwood_TM-271 = TM271Radio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Kenwood_TM-281 = TM281Radio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Kenwood_TM-471 = TM471Radio
[2016-08-15 09:57:54,507] chirp.directory - INFO: Registered Icom_7200 = Icom7200Radio
[2016-08-15 09:57:54,508] chirp.directory - INFO: Registered Icom_IC-7000 = Icom7000Radio
[2016-08-15 09:57:54,508] chirp.directory - INFO: Registered Icom_746 = Icom746Radio
[2016-08-15 09:57:54,508] chirp.directory - INFO: Registered Alinco_DR03T = DR03Radio
[2016-08-15 09:57:54,508] chirp.directory - INFO: Registered Alinco_DR06T = DR06Radio
[2016-08-15 09:57:54,508] chirp.directory - INFO: Registered Alinco_DR135T = DR135Radio
[2016-08-15 09:57:54,509] chirp.directory - INFO: Registered Alinco_DR235T = DR235Radio
[2016-08-15 09:57:54,509] chirp.directory - INFO: Registered Alinco_DR435T = DR435Radio
[2016-08-15 09:57:54,509] chirp.directory - INFO: Registered Alinco_DJ596 = DJ596Radio
[2016-08-15 09:57:54,509] chirp.directory - INFO: Registered Jetstream_JT220M = JT220MRadio
[2016-08-15 09:57:54,509] chirp.directory - INFO: Registered Alinco_DJ175 = DJ175Radio
[2016-08-15 09:57:54,509] chirp.directory - INFO: Registered AnyTone_5888UV = AnyTone5888UVRadio
[2016-08-15 09:57:54,509] chirp.directory - INFO: Registered Intek_HR-2040 = IntekHR2040Radio
[2016-08-15 09:57:54,509] chirp.directory - INFO: Registered Polmar_DB-50M = PolmarDB50MRadio
[2016-08-15 09:57:54,509] chirp.directory - INFO: Registered Powerwerx_DB-750X = PowerwerxDB750XRadio
[2016-08-15 09:57:54,510] chirp.directory - INFO: Registered AnyTone_TERMN-8R = AnyToneTERMN8RRadio
[2016-08-15 09:57:54,510] chirp.directory - INFO: Registered AnyTone_OBLTR-8R = AnyToneOBLTR8RRadio
[2016-08-15 09:57:54,511] chirp.directory - INFO: Registered Baofeng_UV-3R = UV3RRadio
[2016-08-15 09:57:54,511] chirp.directory - INFO: Registered Baojie_BJ-9900 = BJ9900Radio
[2016-08-15 09:57:54,511] chirp.directory - INFO: Registered Baofeng_UV-5R = BaofengUV5RGeneric
[2016-08-15 09:57:54,511] chirp.directory - INFO: Registered Baofeng_F-11 = BaofengF11Radio
[2016-08-15 09:57:54,512] chirp.directory - INFO: Registered Baofeng_UV-82 = BaofengUV82Radio
[2016-08-15 09:57:54,512] chirp.directory - INFO: Registered Baofeng_UV-6 = BaofengUV6Radio
[2016-08-15 09:57:54,512] chirp.directory - INFO: Registered Intek_KT-980HP = IntekKT980Radio
[2016-08-15 09:57:54,512] chirp.directory - INFO: Registered Baofeng_BF-F8HP = BaofengBFF8HPRadio
[2016-08-15 09:57:54,512] chirp.directory - INFO: Registered Baofeng_UV-82HP = BaofengUV82HPRadio
[2016-08-15 09:57:54,512] chirp.directory - INFO: Registered Baojie_BJ-UV55 = BaojieBJUV55Radio
[2016-08-15 09:57:54,513] chirp.directory - INFO: Registered BTECH_UV-2501 = UV2501
[2016-08-15 09:57:54,513] chirp.directory - INFO: Registered BTECH_UV-2501+220 = UV2501_220
[2016-08-15 09:57:54,513] chirp.directory - INFO: Registered BTECH_UV-5001 = UV5001
[2016-08-15 09:57:54,513] chirp.directory - INFO: Registered WACCOM_MINI-8900 = MINI8900
[2016-08-15 09:57:54,513] chirp.directory - INFO: Registered QYT_KT-UV980 = KTUV980
[2016-08-15 09:57:54,513] chirp.directory - INFO: Registered QYT_KT8900 = KT9800
[2016-08-15 09:57:54,513] chirp.directory - INFO: Registered QYT_KT8900R = KT9800R
[2016-08-15 09:57:54,513] chirp.directory - INFO: Registered LUITON_LT-588UV = LT588UV
[2016-08-15 09:57:54,513] chirp.directory - INFO: Registered Feidaxin_FD-268A = FD268ARadio
[2016-08-15 09:57:54,514] chirp.directory - INFO: Registered Feidaxin_FD-268B = FD268BRadio
[2016-08-15 09:57:54,514] chirp.directory - INFO: Registered Feidaxin_FD-288A = FD288ARadio
[2016-08-15 09:57:54,514] chirp.directory - INFO: Registered Feidaxin_FD-288B = FD288BRadio
[2016-08-15 09:57:54,514] chirp.directory - INFO: Registered Feidaxin_FD-150A = FD150ARadio
[2016-08-15 09:57:54,514] chirp.directory - INFO: Registered Feidaxin_FD-160A = FD160ARadio
[2016-08-15 09:57:54,514] chirp.directory - INFO: Registered Feidaxin_FD-450A = FD450ARadio
[2016-08-15 09:57:54,514] chirp.directory - INFO: Registered Feidaxin_FD-460A = FD460ARadio
[2016-08-15 09:57:54,514] chirp.directory - INFO: Registered Yaesu_FT-1802M = FT1802Radio
[2016-08-15 09:57:54,515] chirp.directory - INFO: Registered Yaesu_FT-1D_R = FT1Radio
[2016-08-15 09:57:54,515] chirp.directory - INFO: Registered Yaesu_FT-2800M = FT2800Radio
[2016-08-15 09:57:54,516] chirp.directory - INFO: Registered Yaesu_FT-2900R_1900R = FT2900Radio
[2016-08-15 09:57:54,516] chirp.directory - INFO: Registered Yaesu_FT-50 = FT50Radio
[2016-08-15 09:57:54,517] chirp.directory - INFO: Registered Yaesu_FT-60 = FT60Radio
[2016-08-15 09:57:54,517] chirp.directory - INFO: Registered Yaesu_FT-7800_7900 = FT7800Radio
[2016-08-15 09:57:54,517] chirp.directory - INFO: Registered Yaesu_FT-8800 = FT8800Radio
[2016-08-15 09:57:54,517] chirp.directory - INFO: Registered Yaesu_FT-8900 = FT8900Radio
[2016-08-15 09:57:54,517] chirp.directory - INFO: Registered Yaesu_FT-8100 = FT8100Radio
[2016-08-15 09:57:54,518] chirp.directory - INFO: Registered Yaesu_FT-817 = FT817Radio
[2016-08-15 09:57:54,518] chirp.directory - INFO: Registered Yaesu_FT-817ND = FT817NDRadio
[2016-08-15 09:57:54,518] chirp.directory - INFO: Registered Yaesu_FT-817ND_US = FT817NDUSRadio
[2016-08-15 09:57:54,518] chirp.directory - INFO: Registered Yaesu_FT-857_897 = FT857Radio
[2016-08-15 09:57:54,518] chirp.directory - INFO: Registered Yaesu_FT-857_897_US = FT857USRadio
[2016-08-15 09:57:54,519] chirp.directory - INFO: Registered Yaesu_FT-90 = FT90Radio
[2016-08-15 09:57:54,519] chirp.directory - INFO: Registered Yaesu_FTM-350 = FTM350Radio
[2016-08-15 09:57:54,520] chirp.directory - INFO: Registered Generic_CSV = CSVRadio
[2016-08-15 09:57:54,520] chirp.directory - INFO: Registered Commander_KG-UV = CommanderCSVRadio
[2016-08-15 09:57:54,520] chirp.directory - INFO: Registered RT_Systems_CSV = RTCSVRadio
[2016-08-15 09:57:54,520] chirp.directory - INFO: Registered ARRL_Travel_Plus = TpeRadio
[2016-08-15 09:57:54,527] chirp.directory - INFO: Registered Generic_XML = XMLRadio
[2016-08-15 09:57:54,530] chirp.directory - INFO: Registered Baofeng_BF-888 = H777Radio
[2016-08-15 09:57:54,531] chirp.directory - INFO: Registered HobbyPCB_RS-UV3 = HobbyPCBRSUV3Radio
[2016-08-15 09:57:54,531] chirp.directory - INFO: Registered Icom_IC-208H = IC208Radio
[2016-08-15 09:57:54,531] chirp.directory - INFO: Registered Icom_IC-2100H = IC2100Radio
[2016-08-15 09:57:54,531] chirp.directory - INFO: Registered Icom_IC-2200H = IC2200Radio
[2016-08-15 09:57:54,531] chirp.directory - INFO: Registered Icom_IC-2720H = IC2720Radio
[2016-08-15 09:57:54,531] chirp.directory - INFO: Registered Icom_IC-2820H = IC2820Radio
[2016-08-15 09:57:54,532] chirp.directory - INFO: Registered Icom_IC-91_92AD = IC9xRadio
[2016-08-15 09:57:54,532] chirp.directory - INFO: Registered Icom_IC-Q7A = ICQ7Radio
[2016-08-15 09:57:54,532] chirp.directory - INFO: Registered Icom_IC-T70 = ICT70Radio
[2016-08-15 09:57:54,533] chirp.directory - INFO: Registered Icom_IC-T7H = ICT7HRadio
[2016-08-15 09:57:54,533] chirp.directory - INFO: Registered Icom_IC-T8A = ICT8ARadio
[2016-08-15 09:57:54,533] chirp.directory - INFO: Registered Icom_IC-W32A = ICW32ARadio
[2016-08-15 09:57:54,533] chirp.directory - INFO: Registered Icom_IC-W32E = ICW32ERadio
[2016-08-15 09:57:54,533] chirp.directory - INFO: Registered Icom_IC-V82_U82 = ICx8xRadio
[2016-08-15 09:57:54,534] chirp.directory - INFO: Registered Icom_ID-31A = ID31Radio
[2016-08-15 09:57:54,534] chirp.directory - INFO: Registered Icom_ID-51 = ID51Radio
[2016-08-15 09:57:54,534] chirp.directory - INFO: Registered Icom_ID-51_Plus = ID51PLUSRadio
[2016-08-15 09:57:54,534] chirp.directory - INFO: Registered Icom_ID-800H_v2 = ID800v2Radio
[2016-08-15 09:57:54,534] chirp.directory - INFO: Registered Icom_ID-880H = ID880Radio
[2016-08-15 09:57:54,535] chirp.directory - INFO: Registered Icom_ID-80H = ID80Radio
[2016-08-15 09:57:54,535] chirp.directory - INFO: Registered Kenwood_HMK = HMKRadio
[2016-08-15 09:57:54,535] chirp.directory - INFO: Registered Kenwood_ITM = ITMRadio
[2016-08-15 09:57:54,535] chirp.directory - INFO: Registered Wouxun_KG-UV8D = KGUV8DRadio
[2016-08-15 09:57:54,536] chirp.directory - INFO: Registered KYD_NC-630A = NC630aRadio
[2016-08-15 09:57:54,536] chirp.directory - INFO: Registered KYD_IP-620 = IP620Radio
[2016-08-15 09:57:54,536] chirp.directory - INFO: Registered Leixen_VV-898 = LeixenVV898Radio
[2016-08-15 09:57:54,536] chirp.directory - INFO: Registered Jetstream_JT270M = JetstreamJT270MRadio
[2016-08-15 09:57:54,537] chirp.directory - INFO: Registered Wouxun_KG-UVD1P = KGUVD1PRadio
[2016-08-15 09:57:54,537] chirp.directory - INFO: Registered Wouxun_KG-UV6 = KGUV6DRadio
[2016-08-15 09:57:54,537] chirp.directory - INFO: Registered Wouxun_KG-816 = KG816Radio
[2016-08-15 09:57:54,537] chirp.directory - INFO: Registered Wouxun_KG-818 = KG818Radio
[2016-08-15 09:57:54,537] chirp.directory - INFO: Registered Puxing_PX-777 = Puxing777Radio
[2016-08-15 09:57:54,537] chirp.directory - INFO: Registered Puxing_PX-2R = Puxing2RRadio
[2016-08-15 09:57:54,538] chirp.directory - INFO: Registered TYT_TH-7800_File = TYTTH7800File
[2016-08-15 09:57:54,538] chirp.directory - INFO: Registered TYT_TH-7800 = TYTTH7800Radio
[2016-08-15 09:57:54,538] chirp.directory - INFO: Registered TYT_TH9000_220 = Th9000220Radio
[2016-08-15 09:57:54,538] chirp.directory - INFO: Registered TYT_TH9000_144 = Th9000144Radio
[2016-08-15 09:57:54,538] chirp.directory - INFO: Registered TYT_TH9000_440 = Th9000440Radio
[2016-08-15 09:57:54,539] chirp.directory - INFO: Registered TYT_TH-9800_File = TYTTH9800File
[2016-08-15 09:57:54,539] chirp.directory - INFO: Registered TYT_TH-9800 = TYTTH9800Radio
[2016-08-15 09:57:54,539] chirp.directory - INFO: Registered TYT_TH-UV3R = TYTUV3RRadio
[2016-08-15 09:57:54,540] chirp.directory - INFO: Registered TYT_TH-UV3R-25 = TYTUV3R25Radio
[2016-08-15 09:57:54,540] chirp.directory - INFO: Registered TYT_TH-UVF8D = TYTUVF8DRadio
[2016-08-15 09:57:54,540] chirp.directory - INFO: Registered Kenwood_TH-D72_clone_mode = THD72Radio
[2016-08-15 09:57:54,541] chirp.directory - INFO: Registered TYT_TH-UVF1 = TYTTHUVF1Radio
[2016-08-15 09:57:54,541] chirp.directory - INFO: Registered Kenwood_TK-260 = TK260_Radio
[2016-08-15 09:57:54,541] chirp.directory - INFO: Registered Kenwood_TK-270 = TK270_Radio
[2016-08-15 09:57:54,541] chirp.directory - INFO: Registered Kenwood_TK-272 = TK272_Radio
[2016-08-15 09:57:54,541] chirp.directory - INFO: Registered Kenwood_TK-278 = TK278_Radio
[2016-08-15 09:57:54,541] chirp.directory - INFO: Registered Kenwood_TK-360 = TK360_Radio
[2016-08-15 09:57:54,541] chirp.directory - INFO: Registered Kenwood_TK-370 = TK370_Radio
[2016-08-15 09:57:54,542] chirp.directory - INFO: Registered Kenwood_TK-372 = TK372_Radio
[2016-08-15 09:57:54,542] chirp.directory - INFO: Registered Kenwood_TK-378 = TK378_Radio
[2016-08-15 09:57:54,542] chirp.directory - INFO: Registered Kenwood_TK-760 = TK760_Radio
[2016-08-15 09:57:54,542] chirp.directory - INFO: Registered Kenwood_TK-762 = TK762_Radio
[2016-08-15 09:57:54,542] chirp.directory - INFO: Registered Kenwood_TK-768 = TK768_Radio
[2016-08-15 09:57:54,542] chirp.directory - INFO: Registered Kenwood_TK-860 = TK860_Radio
[2016-08-15 09:57:54,542] chirp.directory - INFO: Registered Kenwood_TK-862 = TK862_Radio
[2016-08-15 09:57:54,542] chirp.directory - INFO: Registered Kenwood_TK-868 = TK868_Radio
[2016-08-15 09:57:54,543] chirp.directory - INFO: Registered Kenwood_TK-868G = TK868G_Radios
[2016-08-15 09:57:54,543] chirp.directory - INFO: Registered Kenwood_TK-862G = TK862G_Radios
[2016-08-15 09:57:54,543] chirp.directory - INFO: Registered Kenwood_TK-860G = TK860G_Radios
[2016-08-15 09:57:54,543] chirp.directory - INFO: Registered Kenwood_TK-768G = TK768G_Radios
[2016-08-15 09:57:54,543] chirp.directory - INFO: Registered Kenwood_TK-762G = TK762G_Radios
[2016-08-15 09:57:54,543] chirp.directory - INFO: Registered Kenwood_TK-760G = TK760G_Radios
[2016-08-15 09:57:54,543] chirp.directory - INFO: Registered Kenwood_TK-278G = TK278G_Radios
[2016-08-15 09:57:54,544] chirp.directory - INFO: Registered Kenwood_TK-272G = TK272G_Radios
[2016-08-15 09:57:54,544] chirp.directory - INFO: Registered Kenwood_TK-270G = TK270G_Radios
[2016-08-15 09:57:54,544] chirp.directory - INFO: Registered Kenwood_TK-260G = TK260G_Radios
[2016-08-15 09:57:54,544] chirp.directory - INFO: Registered Kenwood_TK-7102 = KenwoodTK7102Radio
[2016-08-15 09:57:54,544] chirp.directory - INFO: Registered Kenwood_TK-8102 = KenwoodTK8102Radio
[2016-08-15 09:57:54,544] chirp.directory - INFO: Registered Kenwood_TK-7108 = KenwoodTK7108Radio
[2016-08-15 09:57:54,544] chirp.directory - INFO: Registered Kenwood_TK-8108 = KenwoodTK8108Radio
[2016-08-15 09:57:54,545] chirp.directory - INFO: Registered Kenwood_TS-2000 = TS2000Radio
[2016-08-15 09:57:54,545] chirp.directory - INFO: Registered Baofeng_UV-B5 = BaofengUVB5
[2016-08-15 09:57:54,545] chirp.directory - INFO: Registered BTECH_UV-50X3 = UV50X3
[2016-08-15 09:57:54,546] chirp.directory - INFO: Registered Yaesu_VX-170 = VX170Radio
[2016-08-15 09:57:54,546] chirp.directory - INFO: Registered Yaesu_VX-2 = VX2Radio
[2016-08-15 09:57:54,546] chirp.directory - INFO: Registered Yaesu_VX-3 = VX3Radio
[2016-08-15 09:57:54,546] chirp.directory - INFO: Registered Yaesu_VX-5 = VX5Radio
[2016-08-15 09:57:54,547] chirp.directory - INFO: Registered Yaesu_VX-6 = VX6Radio
[2016-08-15 09:57:54,547] chirp.directory - INFO: Registered Yaesu_VX-7 = VX7Radio
[2016-08-15 09:57:54,548] chirp.directory - INFO: Registered Yaesu_VX-8_R = VX8Radio
[2016-08-15 09:57:54,548] chirp.directory - INFO: Registered Yaesu_VX-8_DR = VX8DRadio
[2016-08-15 09:57:54,548] chirp.directory - INFO: Registered Yaesu_VX-8_GE = VX8GERadio
[2016-08-15 09:57:54,548] chirp.directory - INFO: Registered Vertex_Standard_VXA-700 = VXA700Radio
+ rm /tmp/Alinco_DJ175_GIeTVC.img /tmp/Alinco_DJ175_sHq4RF.img /tmp/Alinco_DJ596_3Zk0kg.img /tmp/Alinco_DJ596_ff8zp1.img /tmp/Alinco_DR235T_eXwXuI.img /tmp/Alinco_DR235T_gDPcIi.img /tmp/AnyTone_OBLTR-8R_hbvPdK.img /tmp/AnyTone_OBLTR-8R_qJGLca.img /tmp/AnyTone_TERMN-8R_6WGSJO.img /tmp/AnyTone_TERMN-8R_U5bRuJ.img /tmp/BTECH_UV-2501+220_C6TnCk.img /tmp/BTECH_UV-2501+220_HM4E_h.img /tmp/BTECH_UV-5001_9zqf8D.img /tmp/BTECH_UV-5001_o4CLD5.img /tmp/BTECH_UV-50X3_LA9cyz.img /tmp/BTECH_UV-50X3_Ot9Igf.img /tmp/BTECH_UV-50X3_QH_yVo.img /tmp/BTECH_UV-50X3_eiVeSE.img /tmp/BTECH_UV-50X3_grvLUP.img /tmp/BTECH_UV-50X3_sYRkTS.img /tmp/Baofeng_BF-888_AmDeqQ.img /tmp/Baofeng_BF-888_votOvF.img /tmp/Baofeng_F-11_0uyJeP.img /tmp/Baofeng_F-11_eAEis5.img /tmp/Baofeng_UV-3R_mnWHq3.img /tmp/Baofeng_UV-3R_nPFZIS.img /tmp/Baofeng_UV-5R_HVZkjx.img /tmp/Baofeng_UV-5R_KvVU2k.img /tmp/Baofeng_UV-B5_dcs6rA.img /tmp/Baofeng_UV-B5_zs2NaQ.img /tmp/Baojie_BJ-9900_8_c93e.img /tmp/Baojie_BJ-9900_ACmyky.img /tmp/Baojie_BJ-9900_ZCBjSr.img /tmp/Baojie_BJ-9900__XB9n6.img /tmp/Baojie_BJ-9900_etKraE.img /tmp/Baojie_BJ-9900_h8Mn8t.img /tmp/Feidaxin_FD-268A_OXMkoD.img /tmp/Feidaxin_FD-268A_oYKmXk.img /tmp/Feidaxin_FD-268B_Qu4Kga.img /tmp/Feidaxin_FD-268B_SdcHv0.img /tmp/Feidaxin_FD-288B_BdLDLE.img /tmp/Feidaxin_FD-288B_MPkefa.img /tmp/Icom_IC-208H__QAE7a.img /tmp/Icom_IC-208H_k0nMGH.img /tmp/Icom_IC-2100H_LQhCJB.img /tmp/Icom_IC-2100H_jkLUhp.img /tmp/Icom_IC-2200H_DQM2dh.img /tmp/Icom_IC-2200H_x0Uwfi.img /tmp/Icom_IC-2720H_GtlT9H.img /tmp/Icom_IC-2720H_rJtlwS.img /tmp/Icom_IC-2820H_VKEAUV.img /tmp/Icom_IC-2820H_dJgsi_.img /tmp/Icom_IC-Q7A_FA7Vjx.img /tmp/Icom_IC-Q7A_WLDiJj.img /tmp/Icom_IC-T70_GobkpY.img /tmp/Icom_IC-T70_PiXW1k.img /tmp/Icom_IC-T7H_cAkPZo.img /tmp/Icom_IC-T7H_g9D_E5.img /tmp/Icom_IC-T8A_pXV7jH.img /tmp/Icom_IC-T8A_q_2qbT.img /tmp/Icom_IC-V82_U82_ZXkkCH.img /tmp/Icom_IC-V82_U82_gi4WE5.img /tmp/Icom_IC-W32A_DPde1q.img /tmp/Icom_IC-W32A_EnakTt.img /tmp/Icom_IC-W32A_Nw9dr2.img /tmp/Icom_IC-W32A_UNUJTt.img /tmp/Icom_IC-W32A_i8_T8m.img /tmp/Icom_IC-W32A_z6r5Vj.img /tmp/Icom_IC-W32E_D1j54a.img /tmp/Icom_IC-W32E_Fph979.img /tmp/Icom_IC-W32E_G3pfWv.img /tmp/Icom_IC-W32E_Sle2H2.img /tmp/Icom_IC-W32E_gQqKDI.img /tmp/Icom_IC-W32E_j2yduy.img /tmp/Icom_ID-31A_64kW3s.img /tmp/Icom_ID-31A_ErAWOY.img /tmp/Icom_ID-51 Plus_TGK3dN.img /tmp/Icom_ID-51 Plus_cag2Lq.img /tmp/Icom_ID-51_2k5W9Y.img /tmp/Icom_ID-51_DgM6bE.img /tmp/Icom_ID-800H_ZTPmU3.img /tmp/Icom_ID-800H_iNpIht.img /tmp/Icom_ID-880H_46s3LO.img /tmp/Icom_ID-880H_cUsT7l.img /tmp/Jetstream_JT220M_N6W9GB.img /tmp/Jetstream_JT220M_eXOHNc.img /tmp/Jetstream_JT270M_9lyMJ7.img /tmp/Jetstream_JT270M_vJHK0P.img /tmp/KYD_IP-620_CDeOCs.img /tmp/KYD_IP-620_DcNW4c.img /tmp/Kenwood_TH-D72 (clone mode)_HkENqm.img /tmp/Kenwood_TH-D72 (clone mode)_rB_5f0.img /tmp/Kenwood_TK-272G_NOWHCc.img /tmp/Kenwood_TK-272G_ybinka.img /tmp/Kenwood_TK-760G_SQNC45.img /tmp/Kenwood_TK-760G_VzKyFZ.img /tmp/Kenwood_TK-8102_C8aURO.img /tmp/Kenwood_TK-8102_tB_O36.img /tmp/Leixen_VV-898_4tkplA.img /tmp/Leixen_VV-898_sf0qYp.img /tmp/Polmar_DB-50M_NLUElW.img /tmp/Polmar_DB-50M_yaP2jW.img /tmp/Puxing_PX-2R_CtrVoS.img /tmp/Puxing_PX-2R_W3kV3c.img /tmp/Puxing_PX-777_7Q41__.img /tmp/Puxing_PX-777_b0cWPe.img /tmp/TYT_TH-7800_fTxzAo.img /tmp/TYT_TH-7800_lMGyrL.img /tmp/TYT_TH-9800_Dq5zF_.img /tmp/TYT_TH-9800_sUF49Q.img /tmp/TYT_TH-UV3R-25_29TV0A.img /tmp/TYT_TH-UV3R-25_do_WrJ.img /tmp/TYT_TH-UV3R_KhS8aS.img /tmp/TYT_TH-UV3R_c4oFH1.img /tmp/TYT_TH-UVF1_dQ7Z3t.img /tmp/TYT_TH-UVF1_wx31mm.img /tmp/TYT_TH9000_144_Hly8iy.img /tmp/TYT_TH9000_144_mkvA22.img /tmp/Vertex Standard_VXA-700_9c_75z.img /tmp/Vertex Standard_VXA-700_pE3yk3.img /tmp/WACCOM_MINI-8900_W0Trya.img /tmp/WACCOM_MINI-8900_Xmf8_x.img /tmp/Wouxun_KG-816_AVQL4o.img /tmp/Wouxun_KG-816_iZAiYF.img /tmp/Wouxun_KG-818_vGjc9V.img /tmp/Wouxun_KG-818_w88VjU.img /tmp/Wouxun_KG-UV6_ItEDFh.img /tmp/Wouxun_KG-UV6_ohmYEr.img /tmp/Wouxun_KG-UV8D_AwSYNy.img /tmp/Wouxun_KG-UV8D_vgdU5u.img /tmp/Wouxun_KG-UVD1P_3mlLbi.img /tmp/Wouxun_KG-UVD1P_rLetdi.img /tmp/Yaesu_FT-1802M_1GcqAH.img /tmp/Yaesu_FT-1802M_fPh6ww.img /tmp/Yaesu_FT-1D_QijR_i.img /tmp/Yaesu_FT-1D_xmP4QZ.img /tmp/Yaesu_FT-2800M_DqNA5X.img /tmp/Yaesu_FT-2800M_v8043p.img /tmp/Yaesu_FT-2900R_1900R_FF79Hg.img /tmp/Yaesu_FT-2900R_1900R_GbAI2X.img /tmp/Yaesu_FT-50_h5YHZp.img /tmp/Yaesu_FT-50_iWQV_A.img /tmp/Yaesu_FT-60_XL2l1Z.img /tmp/Yaesu_FT-60_rqXCZZ.img /tmp/Yaesu_FT-7800_7900_GCnXML.img /tmp/Yaesu_FT-7800_7900_xv_LvL.img /tmp/Yaesu_FT-817ND (US)_OiahIy.img /tmp/Yaesu_FT-817ND (US)_jHWrCU.img /tmp/Yaesu_FT-817ND_FVmmiN.img /tmp/Yaesu_FT-817ND_O05uMl.img /tmp/Yaesu_FT-817_0ji_HZ.img /tmp/Yaesu_FT-817_yRA6iw.img /tmp/Yaesu_FT-857_897 (US)_DHL3OB.img /tmp/Yaesu_FT-857_897 (US)_WgEOzj.img /tmp/Yaesu_FT-857_897__Dskvq.img /tmp/Yaesu_FT-857_897_jd8MPE.img /tmp/Yaesu_FT-8800_Fg7Opp.img /tmp/Yaesu_FT-8800_Oq22Re.img /tmp/Yaesu_FT-8800_PfyXn6.img /tmp/Yaesu_FT-8800_bzEO41.img /tmp/Yaesu_FT-8800_ikeJgL.img /tmp/Yaesu_FT-8800_uI44yJ.img /tmp/Yaesu_FT-8900_93jn3m.img /tmp/Yaesu_FT-8900_Xe8irD.img /tmp/Yaesu_FTM-350_1zd0JK.img /tmp/Yaesu_FTM-350_PyvARe.img /tmp/Yaesu_FTM-350_TvDg_Q.img /tmp/Yaesu_FTM-350_oh6Jwm.img /tmp/Yaesu_FTM-350_rDHbwi.img /tmp/Yaesu_FTM-350_sU3Ac3.img /tmp/Yaesu_VX-2_l_BD2q.img /tmp/Yaesu_VX-2_ztILCZ.img /tmp/Yaesu_VX-3_Codglv.img /tmp/Yaesu_VX-3_byl5tI.img /tmp/Yaesu_VX-5_Zwwjst.img /tmp/Yaesu_VX-5_qGuEtF.img /tmp/Yaesu_VX-6_Mznv9v.img /tmp/Yaesu_VX-6_eYBhQO.img /tmp/Yaesu_VX-7_S05zi9.img /tmp/Yaesu_VX-7_itvww6.img /tmp/Yaesu_VX-8_qE6QSL.img /tmp/Yaesu_VX-8_wy7ace.img
Email was triggered for: Success
Sending email for trigger: Success
1
0
[chirp_devel] [PATCH] [UV-5R] Add Support for UV-6 with Longer 12 byte Ident
by Jim Unroe 12 Aug '16
by Jim Unroe 12 Aug '16
12 Aug '16
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1471021507 14400
# Node ID 6bb69e375abee8778da5c6b7f77df1dddb8efe64
# Parent d32e651e117af20f04a946aeaa00b99fb828bae3
[UV-5R] Add Support for UV-6 with Longer 12 byte Ident
The currently shipping Baofeng UV-6 responds to the clone request by
returning a 12 byte "ident". The original model replies with an 8 byte "ident"
(the same as all other radios currently supported by the uv5r.py driver).
The current CHIRP driver appends the radio's memory image after the "ident"
so the settings structures are all offset by 8 bytes to accomodate these extra
bytes at the beginning of the image. So there must alway be exactly 8 bytes
prepended to the actual memory map data.
Original UV-6 ident:
AA 36 74 04 00 05 20 DD
New UV-6 ident:
AA 01 01 36 01 74 01 04 00 05 20 DD
This patch works around the issue by doing the following...
1. The "ident" is now read one byte at a time until the last byte ("\xdd")
is received. This make it compatible with an 8 byte and 12 byte "ident".
2. The 4 bytes of the ident containing "\x01" are discarded to shorten the
ident to the standard 8 byte length and to put the "ident" in the same
format as the "ident" of the other radio models.
Related to Bug #3063
diff -r d32e651e117a -r 6bb69e375abe chirp/drivers/uv5r.py
--- a/chirp/drivers/uv5r.py Mon Aug 01 10:35:10 2016 -0400
+++ b/chirp/drivers/uv5r.py Fri Aug 12 13:05:07 2016 -0400
@@ -284,7 +284,7 @@
BASETYPE_F11 = ["USA"]
BASETYPE_UV82 = ["US2S", "B82S", "BF82", "N82-2", "N822"]
BASETYPE_BJ55 = ["BJ55"] # needed for for the Baojie UV-55 in bjuv55.py
-BASETYPE_UV6 = ["BF1"]
+BASETYPE_UV6 = ["BF1", "UV6"]
BASETYPE_KT980HP = ["BFP3V3 B"]
BASETYPE_F8HP = ["BFP3V3 F", "N5R-3", "N5R3", "F5R3", "BFT"]
BASETYPE_UV82HP = ["N82-3", "N823"]
@@ -411,9 +411,40 @@
raise errors.RadioError("Radio did not respond")
serial.write("\x02")
- ident = serial.read(8)
- LOG.info("Ident: %s" % util.hexprint(ident))
+ # Until recently, the "ident" returned by the radios supported by this
+ # driver have always been 8 bytes long. The image sturcture is the 8 byte
+ # "ident" followed by the downloaded memory data. So all of the settings
+ # structures are offset by 8 bytes. The ident returned from a UV-6 radio
+ # can be 8 bytes (original model) or now 12 bytes.
+ #
+ # To accomodate this, the "ident" is now read one byte at a time until the
+ # last byte ("\xdd") is encountered. The bytes containing the value "\x01"
+ # are discarded to shrink the "ident" length down to 8 bytes to keep the
+ # image data aligned with the existing settings structures.
+
+ # Ok, get the response
+ ident = ""
+ for i in range(1, 13):
+ response = serial.read(1)
+ # discard any bytes containing "\x01" and keep the rest
+ if response != "\x01":
+ ident += response
+ # stop reading once the last byte ("\xdd") is encountered
+ if response == "\xdd":
+ break
+
+ # check if response is OK
+ if len(ident) != 8 or not ident.startswith("\xaa"):
+ # bad response
+ msg = "Unexpected response, got this:"
+ msg += util.hexprint(ident)
+ LOG.debug(msg)
+ raise errors.RadioError("Unexpected response from radio.")
+
+ # DEBUG
+ LOG.info("Valid response, got this:")
+ LOG.debug(util.hexprint(ident))
serial.write("\x06")
ack = serial.read(1)
1
0