Developers
Threads by month
- ----- 2025 -----
- January
- ----- 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
- 1 participants
- 2965 discussions
[chirp_devel] [PATCH] [BTECH] change set_options to be less model specific for 220 band radio #3015
by Jim Unroe 27 Mar '16
by Jim Unroe 27 Mar '16
27 Mar '16
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1459130071 14400
# Node ID f72dc17eee0a32e1d6b6b5ad523c17eda2b6b094
# Parent 7d6ddfaba49a4e490cb25c831a87197bf55d9966
[BTECH] change set_options to be less model specific for 220 band radio #3015
This patch includes the following changes:
Bug fixes
- update branching method for models with 220 band
diff -r 7d6ddfaba49a -r f72dc17eee0a chirp/drivers/btech.py
--- a/chirp/drivers/btech.py Sun Mar 27 21:27:43 2016 -0400
+++ b/chirp/drivers/btech.py Sun Mar 27 21:54:31 2016 -0400
@@ -712,7 +712,7 @@
ranges"""
# setting the correct ranges for each radio type
- if self.MODEL == "UV-2501+220":
+ if "+220" in self.MODEL:
# the model 2501+220 has a segment in 220
# and a different position in the memmap
ranges = self._memobj.ranges220
@@ -728,7 +728,7 @@
LOG.info("Radio ranges: UHF %d to %d" % uhf)
# 220Mhz case
- if self.MODEL == "UV-2501+220":
+ if "+220" in self.MODEL:
vhf2 = _decode_ranges(ranges.vhf2_low, ranges.vhf2_high)
LOG.info("Radio ranges: VHF(220) %d to %d" % vhf2)
self._220_range = vhf2
1
0
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1459128463 14400
# Node ID 7d6ddfaba49a4e490cb25c831a87197bf55d9966
# Parent 1171fff35e0c4f98716b22de83fd763edca89349
[BTECH] rename base class for BTECH #3015
This patch includes the following changes:
Bug fixes
Renamed the base class as BTech (from btech)
diff -r 1171fff35e0c -r 7d6ddfaba49a chirp/drivers/btech.py
--- a/chirp/drivers/btech.py Sun Mar 27 21:16:54 2016 -0400
+++ b/chirp/drivers/btech.py Sun Mar 27 21:27:43 2016 -0400
@@ -595,7 +595,7 @@
return False
-class btech(chirp_common.CloneModeRadio, chirp_common.ExperimentalRadio):
+class BTech(chirp_common.CloneModeRadio, chirp_common.ExperimentalRadio):
"""BTECH's UV-5001 and alike radios"""
VENDOR = "BTECH"
MODEL = ""
@@ -989,7 +989,7 @@
# - At the end the pre-production units (pp) as this will be unique
@directory.register
-class UV2501(btech):
+class UV2501(BTech):
"""Baofeng Tech UV2501"""
MODEL = "UV-2501"
_magic = [MSTRING, ]
@@ -997,7 +997,7 @@
@directory.register
-class UV2501_220(btech):
+class UV2501_220(BTech):
"""Baofeng Tech UV2501+220"""
MODEL = "UV-2501+220"
_magic = [MSTRING_220, ]
@@ -1006,7 +1006,7 @@
@directory.register
-class UV5001(btech):
+class UV5001(BTech):
"""Baofeng Tech UV5001"""
MODEL = "UV-5001"
_magic = [MSTRING, MSTRING_MINI8900]
@@ -1014,7 +1014,7 @@
@directory.register
-class MINI8900(btech):
+class MINI8900(BTech):
"""WACCOM MINI-8900"""
VENDOR = "WACCOM"
MODEL = "MINI-8900"
1
0
Tested changes:
[Jim Unroe <rock.unroe(a)gmail.com>] [BTECH] sigcode bug fix for out-of-range value #3015
This patch includes the following changes:
Bug fixes
- Address when OEM software put an out-of-range vale for sigcode
(0x*F is reset to 0x*0)
[Jim Unroe <rock.unroe(a)gmail.com>] [New Model] Support for the BTECH Mobile Radios, update 1 for #3015
This patch includes the following changes:
Bug fixes
- Fixed the bug found by minuteman1120 about the duplex not working in some
cases
- New "split" algorithm for the duplex bug above
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 1dea27fb59f7adefe00398d8e5648120cddc8e12
[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 1dea27fb59f7adefe00398d8e5648120cddc8e12
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson6311256316578758460.sh
[workspace] $ /bin/sh -xe /tmp/hudson7206186958759586836.sh
+ PATH=/usr/bin:/bin:/usr/local/bin ./run_all_tests.sh
test_bit_array (tests.unit.test_bitwise.TestBitType) ... ok
test_bit_array_fail (tests.unit.test_bitwise.TestBitType) ... ok
test_bitfield_u16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u8 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_bbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_int_array (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u8 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_char (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_invalid_chars (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_wrong_length (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_comment_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_comment_inline_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_missing_semicolon (tests.unit.test_bitwise.TestBitwiseErrors) ... ok
test_seek (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_seekto (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_struct_one_element (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_two_elements (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_writes (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
split_tone_encode_test_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_fix_rounded_step_250 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_500 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_750 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_12_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_2_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_5_0 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_6_25 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_fractional_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step_fail (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_format_freq (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_bad (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_decimal (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whitespace (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whole (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_ensure_has_calls_almost_full (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_empty (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_partial (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full1 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full2 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_urcall_full (tests.unit.test_import_logic.DstarTests) ... ok
test_import_bank (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffA_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffB_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_negative (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_too_big_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_uhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_errors (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_warnings (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_invalid (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_am (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_fm (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_name (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_closest (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_dst (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_src (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_same (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffA_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffB_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModelIndexInterface) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_icom_bank (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_index_bounds (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_next_mapping_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_auto_tone_mode_cross (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_pol (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_rx (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tone (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tsql (tests.unit.test_memedit_edits.TestEdits) ... ok
test_init (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_bad_portnames (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_sorted (tests.unit.test_platform.Win32PlatformTest) ... ok
test_apply_callback (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_group (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_multi (tests.unit.test_settings.TestSettingContainers) ... ok
test_changed (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_boolean (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_float (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_integer (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_list (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_string (tests.unit.test_settings.TestSettingValues) ... ok
test_validate_callback (tests.unit.test_settings.TestSettingValues) ... ok
test_delete_hole_with_all (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_all_full (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_without_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_with_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_without_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
----------------------------------------------------------------------
Ran 151 tests in 0.051s
OK
Patch 'tip' is OK
Checking for PEP8 regressions...
./chirp/drivers/ft60.py:521:45: W291 trailing whitespace
./chirp/drivers/ft60.py:522:25: E128 continuation line under-indented for visual indent
./chirp/drivers/ft60.py:523:13: E301 expected 1 blank line, found 0
./chirp/drivers/ft817.py:587:41: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:681:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:685:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:688:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:689:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:692:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:693:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:696:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:699:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:702:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:705:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:708:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:711:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:714:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:717:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:718:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:721:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:722:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:725:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:728:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:729:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:732:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:733:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:736:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:737:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:740:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:741:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:744:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:747:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:750:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:751:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:754:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:755:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:758:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:761:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:764:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:765:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:768:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:769:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:772:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:773:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:776:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:779:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:780:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:783:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:786:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:787:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:790:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:791:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:807:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:808:31: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:811:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:814:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:818:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:824:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:829:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:833:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:837:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:841:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:845:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:890:25: E128 continuation line under-indented for visual indent
./chirp/drivers/thd72.py:188:1: E302 expected 2 blank lines, found 1
./chirp/drivers/thd72.py:203:23: E201 whitespace after '['
./chirp/drivers/thd72.py:203:80: E501 line too long (171 > 79 characters)
./chirp/drivers/thd72.py:203:170: E202 whitespace before ']'
./chirp/drivers/thd72.py:204:13: E201 whitespace after '['
./chirp/drivers/thd72.py:204:61: E202 whitespace before ']'
./chirp/drivers/thd72.py:205:23: E201 whitespace after '['
./chirp/drivers/thd72.py:205:74: E202 whitespace before ']'
./chirp/drivers/thd72.py:206:18: E201 whitespace after '['
./chirp/drivers/thd72.py:206:65: E202 whitespace before ']'
./chirp/drivers/thd72.py:591:1: W293 blank line contains whitespace
./chirp/drivers/thd72.py:599:1: W293 blank line contains whitespace
./chirp/ui/mainapp.py:637:13: E128 continuation line under-indented for visual indent
./chirp/ui/mainapp.py:651:5: E303 too many blank lines (2)
./chirp/ui/mainapp.py:1355:80: E501 line too long (81 > 79 characters)
./chirp/ui/mainapp.py:1637:80: E501 line too long (85 > 79 characters)
real 0m7.542s
user 0m7.426s
sys 0m0.044s
================================================
Tests OK
+ cat /var/lib/jenkins/.chirp/debug.log
[2016-03-27 18:27:27,890] chirp.logger - DEBUG: CHIRP 0.3.0dev on Linux - Ubuntu 14.04.3 LTS (Python 2.7.6)
[2016-03-27 18:27:27,900] chirp.directory - INFO: Registered Kenwood_TH-D7 = THD7Radio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TH-D7G = THD7GRadio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TM-D700 = TMD700Radio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TM-V7 = TMV7Radio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TM-G707 = TMG707Radio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TH-G71 = THG71Radio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TH-F6 = THF6ARadio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TH-F7 = THF7ERadio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TM-D710 = TMD710Radio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TH-D72_live_mode = THD72Radio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TM-V71 = TMV71Radio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TM-D710G = TMD710GRadio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TH-K2 = THK2Radio
[2016-03-27 18:27:27,901] chirp.directory - INFO: Registered Kenwood_TM-271 = TM271Radio
[2016-03-27 18:27:27,902] chirp.directory - INFO: Registered Kenwood_TM-281 = TM281Radio
[2016-03-27 18:27:27,902] chirp.directory - INFO: Registered Kenwood_TM-471 = TM471Radio
[2016-03-27 18:27:27,902] chirp.directory - INFO: Registered Icom_7200 = Icom7200Radio
[2016-03-27 18:27:27,902] chirp.directory - INFO: Registered Icom_IC-7000 = Icom7000Radio
[2016-03-27 18:27:27,902] chirp.directory - INFO: Registered Icom_746 = Icom746Radio
[2016-03-27 18:27:27,903] chirp.directory - INFO: Registered Alinco_DR03T = DR03Radio
[2016-03-27 18:27:27,903] chirp.directory - INFO: Registered Alinco_DR06T = DR06Radio
[2016-03-27 18:27:27,903] chirp.directory - INFO: Registered Alinco_DR135T = DR135Radio
[2016-03-27 18:27:27,903] chirp.directory - INFO: Registered Alinco_DR235T = DR235Radio
[2016-03-27 18:27:27,903] chirp.directory - INFO: Registered Alinco_DR435T = DR435Radio
[2016-03-27 18:27:27,903] chirp.directory - INFO: Registered Alinco_DJ596 = DJ596Radio
[2016-03-27 18:27:27,903] chirp.directory - INFO: Registered Jetstream_JT220M = JT220MRadio
[2016-03-27 18:27:27,903] chirp.directory - INFO: Registered Alinco_DJ175 = DJ175Radio
[2016-03-27 18:27:27,904] chirp.directory - INFO: Registered AnyTone_5888UV = AnyTone5888UVRadio
[2016-03-27 18:27:27,904] chirp.directory - INFO: Registered Intek_HR-2040 = IntekHR2040Radio
[2016-03-27 18:27:27,904] chirp.directory - INFO: Registered Polmar_DB-50M = PolmarDB50MRadio
[2016-03-27 18:27:27,904] chirp.directory - INFO: Registered Powerwerx_DB-750X = PowerwerxDB750XRadio
[2016-03-27 18:27:27,904] chirp.directory - INFO: Registered AnyTone_TERMN-8R = AnyToneTERMN8RRadio
[2016-03-27 18:27:27,904] chirp.directory - INFO: Registered AnyTone_OBLTR-8R = AnyToneOBLTR8RRadio
[2016-03-27 18:27:27,905] chirp.directory - INFO: Registered Sainsonic_AP510 = AP510Radio
[2016-03-27 18:27:27,905] chirp.directory - INFO: Registered Baofeng_UV-3R = UV3RRadio
[2016-03-27 18:27:27,905] chirp.directory - INFO: Registered Baojie_BJ-9900 = BJ9900Radio
[2016-03-27 18:27:27,906] chirp.directory - INFO: Registered Baofeng_UV-5R = BaofengUV5R
[2016-03-27 18:27:27,906] chirp.directory - INFO: Registered Baofeng_F-11 = BaofengF11Radio
[2016-03-27 18:27:27,906] chirp.directory - INFO: Registered Baofeng_UV-82 = BaofengUV82Radio
[2016-03-27 18:27:27,906] chirp.directory - INFO: Registered Baofeng_UV-6 = BaofengUV6Radio
[2016-03-27 18:27:27,906] chirp.directory - INFO: Registered Intek_KT-980HP = IntekKT980Radio
[2016-03-27 18:27:27,906] chirp.directory - INFO: Registered Baofeng_BF-F8HP = BaofengBFF8HPRadio
[2016-03-27 18:27:27,906] chirp.directory - INFO: Registered Baofeng_UV-82HP = BaofengUV82HPRadio
[2016-03-27 18:27:27,907] chirp.directory - INFO: Registered Baojie_BJ-UV55 = BaojieBJUV55Radio
[2016-03-27 18:27:27,907] chirp.directory - INFO: Registered BTECH_UV-2501 = UV2501
[2016-03-27 18:27:27,907] chirp.directory - INFO: Registered BTECH_UV-2501+220 = UV2501_220
[2016-03-27 18:27:27,907] chirp.directory - INFO: Registered BTECH_UV-5001 = UV5001
[2016-03-27 18:27:27,907] chirp.directory - INFO: Registered WACCOM_MINI-8900 = MINI8900
[2016-03-27 18:27:27,907] chirp.directory - INFO: Registered Feidaxin_FD-268A = FD268ARadio
[2016-03-27 18:27:27,907] chirp.directory - INFO: Registered Feidaxin_FD-268B = FD268BRadio
[2016-03-27 18:27:27,908] chirp.directory - INFO: Registered Feidaxin_FD-288A = FD288ARadio
[2016-03-27 18:27:27,908] chirp.directory - INFO: Registered Feidaxin_FD-288B = FD288BRadio
[2016-03-27 18:27:27,908] chirp.directory - INFO: Registered Feidaxin_FD-150A = FD150ARadio
[2016-03-27 18:27:27,908] chirp.directory - INFO: Registered Feidaxin_FD-160A = FD160ARadio
[2016-03-27 18:27:27,908] chirp.directory - INFO: Registered Feidaxin_FD-450A = FD450ARadio
[2016-03-27 18:27:27,908] chirp.directory - INFO: Registered Feidaxin_FD-460A = FD460ARadio
[2016-03-27 18:27:27,908] chirp.directory - INFO: Registered Yaesu_FT-1802M = FT1802Radio
[2016-03-27 18:27:27,909] chirp.directory - INFO: Registered Yaesu_FT-1D_R = FT1Radio
[2016-03-27 18:27:27,909] chirp.directory - INFO: Registered Yaesu_FT-2800M = FT2800Radio
[2016-03-27 18:27:27,910] chirp.directory - INFO: Registered Yaesu_FT-2900R_1900R = FT2900Radio
[2016-03-27 18:27:27,910] chirp.directory - INFO: Registered Yaesu_FT-2900E_1900E_E = FT2900ERadio
[2016-03-27 18:27:27,910] chirp.directory - INFO: Registered Yaesu_FT-2900_1900_Modded_Opened_Xmit = FT2900ModRadio
[2016-03-27 18:27:27,910] chirp.directory - INFO: Registered Yaesu_FT-50 = FT50Radio
[2016-03-27 18:27:27,911] chirp.directory - INFO: Registered Yaesu_FT-60 = FT60Radio
[2016-03-27 18:27:27,911] chirp.directory - INFO: Registered Yaesu_FT-7800_7900 = FT7800Radio
[2016-03-27 18:27:27,911] chirp.directory - INFO: Registered Yaesu_FT-8800 = FT8800Radio
[2016-03-27 18:27:27,911] chirp.directory - INFO: Registered Yaesu_FT-8900 = FT8900Radio
[2016-03-27 18:27:27,911] chirp.directory - INFO: Registered Yaesu_FT-8100 = FT8100Radio
[2016-03-27 18:27:27,912] chirp.directory - INFO: Registered Yaesu_FT-817 = FT817Radio
[2016-03-27 18:27:27,912] chirp.directory - INFO: Registered Yaesu_FT-817ND = FT817NDRadio
[2016-03-27 18:27:27,912] chirp.directory - INFO: Registered Yaesu_FT-817ND_US = FT817NDUSRadio
[2016-03-27 18:27:27,912] chirp.directory - INFO: Registered Yaesu_FT-857_897 = FT857Radio
[2016-03-27 18:27:27,912] chirp.directory - INFO: Registered Yaesu_FT-857_897_US = FT857USRadio
[2016-03-27 18:27:27,913] chirp.directory - INFO: Registered Yaesu_FT-90 = FT90Radio
[2016-03-27 18:27:27,913] chirp.directory - INFO: Registered Yaesu_FTM-350 = FTM350Radio
[2016-03-27 18:27:27,914] chirp.directory - INFO: Registered Generic_CSV = CSVRadio
[2016-03-27 18:27:27,914] chirp.directory - INFO: Registered Commander_KG-UV = CommanderCSVRadio
[2016-03-27 18:27:27,914] chirp.directory - INFO: Registered RT_Systems_CSV = RTCSVRadio
[2016-03-27 18:27:27,914] chirp.directory - INFO: Registered ARRL_Travel_Plus = TpeRadio
[2016-03-27 18:27:27,920] chirp.directory - INFO: Registered Generic_XML = XMLRadio
[2016-03-27 18:27:27,923] chirp.directory - INFO: Registered Baofeng_BF-888 = H777Radio
[2016-03-27 18:27:27,923] chirp.directory - INFO: Registered Icom_IC-208H = IC208Radio
[2016-03-27 18:27:27,923] chirp.directory - INFO: Registered Icom_IC-2100H = IC2100Radio
[2016-03-27 18:27:27,924] chirp.directory - INFO: Registered Icom_IC-2200H = IC2200Radio
[2016-03-27 18:27:27,924] chirp.directory - INFO: Registered Icom_IC-2720H = IC2720Radio
[2016-03-27 18:27:27,924] chirp.directory - INFO: Registered Icom_IC-2820H = IC2820Radio
[2016-03-27 18:27:27,924] chirp.directory - INFO: Registered Icom_IC-91_92AD = IC9xRadio
[2016-03-27 18:27:27,925] chirp.directory - INFO: Registered Icom_IC-Q7A = ICQ7Radio
[2016-03-27 18:27:27,925] chirp.directory - INFO: Registered Icom_IC-T70 = ICT70Radio
[2016-03-27 18:27:27,925] chirp.directory - INFO: Registered Icom_IC-T7H = ICT7HRadio
[2016-03-27 18:27:27,925] chirp.directory - INFO: Registered Icom_IC-T8A = ICT8ARadio
[2016-03-27 18:27:27,925] chirp.directory - INFO: Registered Icom_IC-W32A = ICW32ARadio
[2016-03-27 18:27:27,926] chirp.directory - INFO: Registered Icom_IC-W32E = ICW32ERadio
[2016-03-27 18:27:27,926] chirp.directory - INFO: Registered Icom_IC-V82_U82 = ICx8xRadio
[2016-03-27 18:27:27,926] chirp.directory - INFO: Registered Icom_ID-31A = ID31Radio
[2016-03-27 18:27:27,926] chirp.directory - INFO: Registered Icom_ID-51 = ID51Radio
[2016-03-27 18:27:27,927] chirp.directory - INFO: Registered Icom_ID-51_Plus = ID51PLUSRadio
[2016-03-27 18:27:27,927] chirp.directory - INFO: Registered Icom_ID-800H_v2 = ID800v2Radio
[2016-03-27 18:27:27,927] chirp.directory - INFO: Registered Icom_ID-880H = ID880Radio
[2016-03-27 18:27:27,927] chirp.directory - INFO: Registered Icom_ID-80H = ID80Radio
[2016-03-27 18:27:27,927] chirp.directory - INFO: Registered Kenwood_HMK = HMKRadio
[2016-03-27 18:27:27,928] chirp.directory - INFO: Registered Kenwood_ITM = ITMRadio
[2016-03-27 18:27:27,928] chirp.directory - INFO: Registered Wouxun_KG-UV8D = KGUV8DRadio
[2016-03-27 18:27:27,928] chirp.directory - INFO: Registered KYD_NC-630A = NC630aRadio
[2016-03-27 18:27:27,929] chirp.directory - INFO: Registered KYD_IP-620 = IP620Radio
[2016-03-27 18:27:27,929] chirp.directory - INFO: Registered Leixen_VV-898 = LeixenVV898Radio
[2016-03-27 18:27:27,929] chirp.directory - INFO: Registered Jetstream_JT270M = JetstreamJT270MRadio
[2016-03-27 18:27:27,929] chirp.directory - INFO: Registered Wouxun_KG-UVD1P = KGUVD1PRadio
[2016-03-27 18:27:27,929] chirp.directory - INFO: Registered Wouxun_KG-UV6 = KGUV6DRadio
[2016-03-27 18:27:27,930] chirp.directory - INFO: Registered Wouxun_KG-816 = KG816Radio
[2016-03-27 18:27:27,930] chirp.directory - INFO: Registered Wouxun_KG-818 = KG818Radio
[2016-03-27 18:27:27,930] chirp.directory - INFO: Registered Puxing_PX-777 = Puxing777Radio
[2016-03-27 18:27:27,930] chirp.directory - INFO: Registered Puxing_PX-2R = Puxing2RRadio
[2016-03-27 18:27:27,930] chirp.directory - INFO: Registered TYT_TH9000_220 = Th9000220Radio
[2016-03-27 18:27:27,930] chirp.directory - INFO: Registered TYT_TH9000_144 = Th9000144Radio
[2016-03-27 18:27:27,930] chirp.directory - INFO: Registered TYT_TH9000_440 = Th9000440Radio
[2016-03-27 18:27:27,931] chirp.directory - INFO: Registered TYT_TH-9800_File = TYTTH9800File
[2016-03-27 18:27:27,931] chirp.directory - INFO: Registered TYT_TH-9800 = TYTTH9800Radio
[2016-03-27 18:27:27,931] chirp.directory - INFO: Registered TYT_TH-UV3R = TYTUV3RRadio
[2016-03-27 18:27:27,932] chirp.directory - INFO: Registered TYT_TH-UV3R-25 = TYTUV3R25Radio
[2016-03-27 18:27:27,932] chirp.directory - INFO: Registered TYT_TH-UVF8D = TYTUVF8DRadio
[2016-03-27 18:27:27,932] chirp.directory - INFO: Registered Kenwood_TH-D72_clone_mode = THD72Radio
[2016-03-27 18:27:27,932] chirp.directory - INFO: Registered TYT_TH-UVF1 = TYTTHUVF1Radio
[2016-03-27 18:27:27,933] chirp.directory - INFO: Registered Kenwood_TK-260 = TK260_Radio
[2016-03-27 18:27:27,933] chirp.directory - INFO: Registered Kenwood_TK-270 = TK270_Radio
[2016-03-27 18:27:27,933] chirp.directory - INFO: Registered Kenwood_TK-272 = TK272_Radio
[2016-03-27 18:27:27,933] chirp.directory - INFO: Registered Kenwood_TK-278 = TK278_Radio
[2016-03-27 18:27:27,933] chirp.directory - INFO: Registered Kenwood_TK-360 = TK360_Radio
[2016-03-27 18:27:27,933] chirp.directory - INFO: Registered Kenwood_TK-370 = TK370_Radio
[2016-03-27 18:27:27,933] chirp.directory - INFO: Registered Kenwood_TK-372 = TK372_Radio
[2016-03-27 18:27:27,933] chirp.directory - INFO: Registered Kenwood_TK-378 = TK378_Radio
[2016-03-27 18:27:27,936] chirp.directory - INFO: Registered Kenwood_TK-760 = TK760_Radio
[2016-03-27 18:27:27,936] chirp.directory - INFO: Registered Kenwood_TK-762 = TK762_Radio
[2016-03-27 18:27:27,936] chirp.directory - INFO: Registered Kenwood_TK-768 = TK768_Radio
[2016-03-27 18:27:27,936] chirp.directory - INFO: Registered Kenwood_TK-860 = TK860_Radio
[2016-03-27 18:27:27,936] chirp.directory - INFO: Registered Kenwood_TK-862 = TK862_Radio
[2016-03-27 18:27:27,936] chirp.directory - INFO: Registered Kenwood_TK-868 = TK868_Radio
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-868G = TK868G_Radios
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-862G = TK862G_Radios
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-860G = TK860G_Radios
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-768G = TK768G_Radios
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-762G = TK762G_Radios
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-760G = TK760G_Radios
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-278G = TK278G_Radios
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-272G = TK272G_Radios
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-270G = TK270G_Radios
[2016-03-27 18:27:27,937] chirp.directory - INFO: Registered Kenwood_TK-260G = TK260G_Radios
[2016-03-27 18:27:27,938] chirp.directory - INFO: Registered Kenwood_TK-7102 = KenwoodTK7102Radio
[2016-03-27 18:27:27,938] chirp.directory - INFO: Registered Kenwood_TK-8102 = KenwoodTK8102Radio
[2016-03-27 18:27:27,938] chirp.directory - INFO: Registered Kenwood_TK-7108 = KenwoodTK7108Radio
[2016-03-27 18:27:27,938] chirp.directory - INFO: Registered Kenwood_TK-8108 = KenwoodTK8108Radio
[2016-03-27 18:27:27,939] chirp.directory - INFO: Registered Kenwood_TS-2000 = TS2000Radio
[2016-03-27 18:27:27,939] chirp.directory - INFO: Registered Baofeng_UV-B5 = BaofengUVB5
[2016-03-27 18:27:27,939] chirp.directory - INFO: Registered Yaesu_VX-170 = VX170Radio
[2016-03-27 18:27:27,940] chirp.directory - INFO: Registered Yaesu_VX-2 = VX2Radio
[2016-03-27 18:27:27,940] chirp.directory - INFO: Registered Yaesu_VX-3 = VX3Radio
[2016-03-27 18:27:27,940] chirp.directory - INFO: Registered Yaesu_VX-5 = VX5Radio
[2016-03-27 18:27:27,941] chirp.directory - INFO: Registered Yaesu_VX-6 = VX6Radio
[2016-03-27 18:27:27,941] chirp.directory - INFO: Registered Yaesu_VX-7 = VX7Radio
[2016-03-27 18:27:27,941] chirp.directory - INFO: Registered Yaesu_VX-8_R = VX8Radio
[2016-03-27 18:27:27,942] chirp.directory - INFO: Registered Yaesu_VX-8_DR = VX8DRadio
[2016-03-27 18:27:27,942] chirp.directory - INFO: Registered Yaesu_VX-8_GE = VX8GERadio
[2016-03-27 18:27:27,942] chirp.directory - INFO: Registered Vertex_Standard_VXA-700 = VXA700Radio
Email was triggered for: Success
Sending email for trigger: Success
1
0
27 Mar '16
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1459127814 14400
# Node ID 1171fff35e0c4f98716b22de83fd763edca89349
# Parent c7ad0f850fc95ac27e98ff47b127127bcd60acfe
[BTECH] sigcode bug fix for out-of-range value #3015
This patch includes the following changes:
Bug fixes
- Address when OEM software put an out-of-range vale for sigcode
(0x*F is reset to 0x*0)
diff -r c7ad0f850fc9 -r 1171fff35e0c chirp/drivers/btech.py
--- a/chirp/drivers/btech.py Sun Mar 27 20:50:56 2016 -0400
+++ b/chirp/drivers/btech.py Sun Mar 27 21:16:54 2016 -0400
@@ -870,10 +870,12 @@
PTTID_LIST[_mem.pttid]))
mem.extra.append(pttid)
+ # validating scode
+ scode = _mem.scode if _mem.scode != 15 else 0
pttidcode = RadioSetting("scode", "PTT ID signal code",
RadioSettingValueList(
PTTIDCODE_LIST,
- PTTIDCODE_LIST[_mem.scode]))
+ PTTIDCODE_LIST[scode]))
mem.extra.append(pttidcode)
optsig = RadioSetting("optsig", "Optional signaling",
1
0
[chirp_devel] [PATCH] [New Model] Support for the BTECH Mobile Radios, update 1 for #3015
by Jim Unroe 27 Mar '16
by Jim Unroe 27 Mar '16
27 Mar '16
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1459126256 14400
# Node ID c7ad0f850fc95ac27e98ff47b127127bcd60acfe
# Parent 1dea27fb59f7adefe00398d8e5648120cddc8e12
[New Model] Support for the BTECH Mobile Radios, update 1 for #3015
This patch includes the following changes:
Bug fixes
- Fixed the bug found by minuteman1120 about the duplex not working in some
cases
- New "split" algorithm for the duplex bug above
diff -r 1dea27fb59f7 -r c7ad0f850fc9 chirp/drivers/btech.py
--- a/chirp/drivers/btech.py Tue Mar 22 18:50:50 2016 -0700
+++ b/chirp/drivers/btech.py Sun Mar 27 20:50:56 2016 -0400
@@ -580,6 +580,21 @@
return (ilow, ihigh)
+def _split(rf, f1, f2):
+ """Returns False if the two freqs are in the same band (no split)
+ or True otherwise"""
+
+ # determine if the two freqs are in the same band
+ for low, high in rf.valid_bands:
+ if f1 >= low and f1 <= high and \
+ f2 >= low and f2 <= high:
+ # if the two freqs are on the same Band this is not a split
+ return False
+
+ # if you get here is because the freq pairs are split
+ return False
+
+
class btech(chirp_common.CloneModeRadio, chirp_common.ExperimentalRadio):
"""BTECH's UV-5001 and alike radios"""
VENDOR = "BTECH"
@@ -805,7 +820,7 @@
# TX freq set
offset = (int(_mem.txfreq) * 10) - mem.freq
if offset != 0:
- if offset > 70000000: # 70 Mhz
+ if _split(self.get_features(), mem.freq, int(_mem.txfreq) * 10):
mem.duplex = "split"
mem.offset = int(_mem.txfreq) * 10
elif offset < 0:
1
0
Update on the driver for the Jetstream JT2705M . It looks like Jim's
observation is correct - the JT2705 looks like a variant of the 8900.
I successfully did an image download from the radio by adding a class to
the existing Btech file and updating the magic and fileid. I was able to
get an image, and also it displayed the channels correctly (need to do more
testing to make sure this assertion is correct.).
I posted the image on the ticket: http://chirp.danplanet.com/issues/3481
I'll do some more work to test this out, and I'll post a patch for the
btech.py file when I'm ready (most likely later this week). Since this
model is under active development, let me know if there are any issues or
updates that I should be aware of.
thanks
Dave
3
5
[chirp_devel] [PATCH] [New Model] Support for the BTECH Mobile Radios, fixes issue #3015
by Jim Unroe 24 Mar '16
by Jim Unroe 24 Mar '16
24 Mar '16
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1458694045 14400
# Node ID e6f8013627457dba4eaa5dac4a026d2a455a6e3d
# Parent 86fcbefbcf670ca1ace59c34262550c5cae4a792
[New Model] Support for the BTECH Mobile Radios, fixes issue #3015
This patch adds "basic support" for the the following radios:
BTECH UV-5001, UV-2501 and UV-2501+220
WACCOM MINI-8900 Plus
"Basic support" is a complete implementaton of the per-channel
settings, including:
Speaker mute
Scramble
Busy channel lockout
PTT ID
PTT ID signal code
Optional signaling
also related to #2673
diff -r 86fcbefbcf67 -r e6f801362745 chirp/drivers/btech.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/chirp/drivers/btech.py Tue Mar 22 20:47:25 2016 -0400
@@ -0,0 +1,1009 @@
+# Copyright 2016:
+# * Pavel Milanes CO7WT, <co7wt(a)frcuba.co.cu> <pavelmc(a)gmail.com>
+# * Jim Unroe KC9HI, <rock.unroe(a)gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+import time
+import struct
+import logging
+
+LOG = logging.getLogger(__name__)
+
+from chirp import chirp_common, directory, memmap
+from chirp import bitwise, errors, util
+from chirp.settings import RadioSettingGroup, RadioSetting, \
+ RadioSettingValueBoolean, RadioSettingValueList, \
+ RadioSettingValueString, RadioSettingValueInteger, \
+ RadioSettings
+from textwrap import dedent
+
+MEM_FORMAT = """
+#seekto 0x0000;
+struct {
+ lbcd rxfreq[4];
+ lbcd txfreq[4];
+ ul16 rxtone;
+ ul16 txtone;
+ u8 unknown0:4,
+ scode:4;
+ u8 unknown1:2,
+ spmute:1,
+ unknown2:3,
+ optsig:2;
+ u8 unknown3:3,
+ scramble:1,
+ unknown4:3,
+ power:1;
+ u8 unknown5:1,
+ wide:1,
+ unknown6:2,
+ bcl:1,
+ add:1,
+ pttid:2;
+} memory[200];
+
+#seekto 0x1000;
+struct {
+ char name[6];
+ u8 unknown1[10];
+} names[200];
+
+#seekto 0x3C90;
+struct {
+ u8 vhf_low[3];
+ u8 vhf_high[3];
+ u8 uhf_low[3];
+ u8 uhf_high[3];
+} ranges;
+
+// the 2501+220 has a different zone for storing ranges
+
+#seekto 0x3CD0;
+struct {
+ u8 vhf_low[3];
+ u8 vhf_high[3];
+ u8 unknown1[4];
+ u8 unknown2[6];
+ u8 vhf2_low[3];
+ u8 vhf2_high[3];
+ u8 unknown3[4];
+ u8 unknown4[6];
+ u8 uhf_low[3];
+ u8 uhf_high[3];
+} ranges220;
+
+"""
+
+# A note about the memmory in these radios
+#
+# The real memory of these radios extends to 0x4000
+# On read the factory software only uses up to 0x3200
+# On write it just uploads the contents up to 0x3100
+#
+# The mem beyond 0x3200 holds the ID data
+
+MEM_SIZE = 0x4000
+BLOCK_SIZE = 0x40
+TX_BLOCK_SIZE = 0x10
+ACK_CMD = "\x06"
+MODES = ["FM", "NFM"]
+SKIP_VALUES = ["S", ""]
+TONES = chirp_common.TONES
+DTCS = sorted(chirp_common.DTCS_CODES + [645])
+NAME_LENGTH = 6
+PTTID_LIST = ["OFF", "BOT", "EOT", "BOTH"]
+PTTIDCODE_LIST = ["%s" % x for x in range(1, 16)]
+OPTSIG_LIST = ["OFF", "DTMF", "2TONE", "5TONE"]
+
+# this var controls the verbosity in the debug and by default it's low (False)
+# make it True and you will to get a very verbose debug.log
+debug = False
+
+# Power Levels
+NORMAL_POWER_LEVELS = [chirp_common.PowerLevel("High", watts=25),
+ chirp_common.PowerLevel("Low", watts=10)]
+UV5001_POWER_LEVELS = [chirp_common.PowerLevel("High", watts=50),
+ chirp_common.PowerLevel("Low", watts=10)]
+
+# this must be defined globaly
+POWER_LEVELS = None
+
+# valid chars on the LCD, Note that " " (space) is stored as "\xFF"
+VALID_CHARS = chirp_common.CHARSET_ALPHANUMERIC + \
+ "`{|}!\"#$%&'()*+,-./:;<=>?@[]^_"
+
+
+##### ID strings #####################################################
+
+# BTECH UV2501 pre-production units
+UV2501pp_fp = "M2C294"
+# BTECH UV2501 pre-production units 2 + and 1st Gen radios
+UV2501pp2_fp = "M29204"
+# B-TECH UV-2501 second generation (2G) radios
+UV2501G2_fp = "BTG214"
+
+
+# B-TECH UV-2501+220 pre-production units
+UV2501_220pp_fp = "M3C281"
+# extra block read for the 2501+220 pre-production units
+UV2501_220pp_id = " 280528"
+# B-TECH UV-2501+220
+UV2501_220_fp = "M3G201"
+# extra block read for the 2501+220
+# the extra block is the same as the pp unit
+
+
+# B-TECH UV-5001 pre-production units + 1st Gen radios
+UV5001pp_fp = "V19204"
+# B-TECH UV-5001 alpha units
+UV5001alpha_fp = "V28204"
+# B-TECH UV-5001 second generation (2G) radios
+# !!!! This is the same as the UV-2501 (2G) Radios !!!!
+UV5001G2_fp = "BTG214"
+# B-TECH UV-5001 second generation (2G2)
+UV5001G22_fp = "V2G204"
+
+
+# WACCOM Mini-8900
+MINI8900_fp = "M28854"
+
+
+#### MAGICS
+# for the Waccom Mini-8900
+MSTRING_MINI8900 = "\x55\xA5\xB5\x45\x55\x45\x4d\x02"
+# for the B-TECH UV-2501+220 (including pre production ones)
+MSTRING_220 = "\x55\x20\x15\x12\x12\x01\x4d\x02"
+# magic string for all other models
+MSTRING = "\x55\x20\x15\x09\x20\x45\x4d\x02"
+
+
+def _rawrecv(radio, amount):
+ """Raw read from the radio device, new approach, this time a byte at
+ a time as the original driver, the receive data has to be atomic"""
+ data = ""
+
+ try:
+ tdiff = 0
+ start = time.time()
+ maxtime = amount * 0.020
+
+ while len(data) < amount and tdiff < maxtime:
+ d = radio.pipe.read(1)
+ if len(d) == 1:
+ data += d
+
+ # Delta time
+ tdiff = time.time() - start
+
+ # DEBUG
+ if debug is True:
+ LOG.debug("time diff %.04f maxtime %.04f, data: %d" %
+ (tdiff, maxtime, len(data)))
+
+ # DEBUG
+ if debug is True:
+ LOG.debug("<== (%d) bytes:\n\n%s" %
+ (len(data), util.hexprint(data)))
+
+ if len(data) < amount:
+ LOG.error("Short reading %d bytes from the %d requested." %
+ (len(data), amount))
+
+ except:
+ raise errors.RadioError("Error reading data from radio")
+
+ return data
+
+
+def _rawsend(radio, data):
+ """Raw send to the radio device"""
+ try:
+ for byte in data:
+ radio.pipe.write(byte)
+ time.sleep(0.003)
+
+ # DEBUG
+ if debug is True:
+ LOG.debug("==> (%d) bytes:\n\n%s" %
+ (len(data), util.hexprint(data)))
+ except:
+ raise errors.RadioError("Error sending data to radio")
+
+
+def _make_frame(cmd, addr, length, data=""):
+ """Pack the info in the headder format"""
+ frame = "\x06" + struct.pack(">BHB", ord(cmd), addr, length)
+ # add the data if set
+ if len(data) != 0:
+ frame += data
+
+ return frame
+
+
+def _send(radio, frame, pause=0):
+ """Generic send data to the radio"""
+ _rawsend(radio, frame)
+
+ # make a *optional* pause, to allow to build for an answer
+ if pause != 0:
+ time.sleep(pause)
+
+
+def _recv(radio, addr):
+ """Get data from the radio """
+ # 1 byte ACK +
+ # 4 bytes header +
+ # data of length of data (as I see always 0x40 = 64 bytes)
+
+ # catching ack
+ ack = _rawrecv(radio, 1)
+
+ # checking for a response
+ if len(ack) != 1:
+ msg = "No response in the read of the block #0x%04x" % addr
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # valid data
+ if ack != ACK_CMD:
+ msg = "Bad ack received from radio in block 0x%04x" % addr
+ LOG.error(msg)
+ LOG.debug("Bad ACK was 0x%02x" % ord(ack))
+ raise errors.RadioError(msg)
+
+ # Get the header + basic sanitize
+ hdr = _rawrecv(radio, 4)
+ if len(hdr) != 4:
+ msg = "Short header for block: 0x%04x" % addr
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # receive and validate the header
+ c, a, l = struct.unpack(">BHB", hdr)
+ if a != addr or l != BLOCK_SIZE or c != ord("X"):
+ msg = "Invalid answer for block 0x%04x:" % addr
+ LOG.error(msg)
+ LOG.debug("CMD: %s ADDR: %04x SIZE: %02x" % (c, a, l))
+ raise errors.RadioError(msg)
+
+ # Get the data
+ data = _rawrecv(radio, l)
+
+ # basic validation
+ if len(data) != l:
+ msg = "Short block of data in block #0x%04x" % addr
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ return data
+
+
+def _do_magic(radio, status):
+ """Try to put the radio in program mode and get the ident string
+ it will make multiple tries"""
+
+ # how many tries
+ tries = 5
+
+ # prep the data to show in the UI
+ status.cur = 0
+ status.msg = "Identifying the radio..."
+ status.max = len(radio._magic) * tries
+ radio.status_fn(status)
+ mc = 0
+
+ try:
+ # do the magic
+ for magic in radio._magic:
+ # we try a few times
+ for a in range(0, tries):
+ # Update the UI
+ status.cur = (mc * tries) + a
+ radio.status_fn(status)
+
+ # cleaning the serial buffer, try wrapped
+ try:
+ radio.pipe.flushInput()
+ except:
+ msg = "Error with a serial rx buffer flush at _do_magic"
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # send the magic a byte at a time
+ for byte in magic:
+ ack = _rawrecv(radio, 1)
+ _send(radio, byte)
+
+ # A explicit time delay, with a longer one for the UV-5001
+ if "5001" in radio.MODEL:
+ time.sleep(0.5)
+ else:
+ time.sleep(0.1)
+
+ # Now you get a x06 of ACK if all goes well
+ ack = _rawrecv(radio, 1)
+
+ if ack == "\x06":
+ # DEBUG
+ LOG.info("Magic ACK received")
+ status.msg = "Positive Ident!"
+ status.cur = status.max
+ radio.status_fn(status)
+
+ return True
+
+ # increment the count of magics to send, this is for the UI status
+ mc += 1
+
+ # wait between tries for different MAGICs to allow the radio to
+ # timeout, this is an experimental fature for the 5001 alpha that
+ # has the same ident as the MINI8900, raise it if it don't work
+ time.sleep(5)
+
+ except errors.RadioError:
+ raise
+ except Exception, e:
+ msg = "Unknown error sending Magic to radio:\n%s" % e
+ raise errors.RadioError(msg)
+
+ return False
+
+
+def _do_ident(radio, status):
+ """Put the radio in PROGRAM mode & identify it"""
+ # set the serial discipline
+ radio.pipe.setBaudrate(9600)
+ radio.pipe.setParity("N")
+ radio.pipe.setTimeout(0.005)
+ # cleaning the serial buffer, try wrapped
+ try:
+ radio.pipe.flushInput()
+ except:
+ msg = "Error with a serial rx buffer flush at _do_ident"
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # do the magic trick
+ if _do_magic(radio, status) is False:
+ msg = "Radio did not respond to magic string, check your cable."
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # Ok, get the ident string
+ ident = _rawrecv(radio, 49)
+
+ # basic check for the ident
+ if len(ident) != 49:
+ msg = "Radio send a sort ident block, you need to increase maxtime."
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # check if ident is OK
+ itis = False
+ for fp in radio._fileid:
+ if fp in ident:
+ itis = True
+ break
+
+ if itis is False:
+ # bad ident
+ msg = "Incorrect model ID, got this:\n\n"
+ msg += util.hexprint(ident)
+ LOG.debug(msg)
+ raise errors.RadioError("Radio identification failed.")
+
+ # DEBUG
+ LOG.info("Positive ident, this is a %s" % radio.MODEL)
+
+ # Ok, we have a radio in the other end, we need a pause here
+ time.sleep(0.01)
+
+ # the 2501+220 has one more check:
+ # reading the block 0x3DF0 to see if it's a code inside
+ if "+220" in radio.MODEL:
+ # DEBUG
+ LOG.debug("This is a BTECH UV-2501+220, requesting the extra ID")
+ # send the read request
+ _send(radio, _make_frame("S", 0x3DF0, 16), 0.04)
+ id2 = _rawrecv(radio, 20)
+ # WARNING !!!!!!
+ # Different versions send as response with a different amount of data
+ # it seems that it's padded with \xff, \x20 and some times with \x00
+ # we just care about the first 16, our magic string is in there
+ if len(id2) < 16:
+ msg = "The extra UV-2501+220 ID is short, aborting."
+ # DEBUG
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # ok, check for it, any of the correct ID must be in the received data
+ itis = False
+ for eid in radio._id2:
+ if eid in id2:
+ # DEBUG
+ LOG.info("Confirmed, this is a BTECH UV-2501+220")
+ # set the flag and exit
+ itis = True
+ break
+
+ # It is a UV-2501+220?
+ if itis is False:
+ msg = "The extra UV-2501+220 ID is wrong, aborting."
+ # DEBUG
+ LOG.error(msg)
+ LOG.debug("Full extra ID on the 2501+220 is: \n%s" %
+ util.hexprint(id2))
+ raise errors.RadioError(msg)
+
+ return True
+
+
+def _download(radio):
+ """Get the memory map"""
+
+ # UI progress
+ status = chirp_common.Status()
+
+ # put radio in program mode and identify it
+ _do_ident(radio, status)
+
+ # the first dummy packet for all model but the 2501+220
+ if not "+220" in radio.MODEL:
+ # In the logs we have found that the first block is discarded
+ # this is the \x05 in ack one, so we will simulate it here
+ _send(radio, _make_frame("S", 0, BLOCK_SIZE), 0.1)
+ discard = _rawrecv(radio, BLOCK_SIZE)
+
+ if debug is True:
+ LOG.info("Dummy first block read done, got this:\n\n")
+ LOG.debug(util.hexprint(discard))
+
+ # reset the progress bar in the UI
+ status.max = MEM_SIZE / BLOCK_SIZE
+ status.msg = "Cloning from radio..."
+ status.cur = 0
+ radio.status_fn(status)
+
+ data = ""
+ for addr in range(0, MEM_SIZE, BLOCK_SIZE):
+ # flush input, as per the original driver behavior, try wrapped
+ try:
+ radio.pipe.flushInput()
+ except:
+ msg = "Error with a serial rx buffer flush at _download"
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # sending the read request
+ _send(radio, _make_frame("S", addr, BLOCK_SIZE), 0.1)
+
+ # read
+ d = _recv(radio, addr)
+
+ # aggregate the data
+ data += d
+
+ # UI Update
+ status.cur = addr / BLOCK_SIZE
+ status.msg = "Cloning from radio..."
+ radio.status_fn(status)
+
+ return data
+
+
+def _upload(radio):
+ """Upload procedure"""
+
+ # The UPLOAD mem is restricted to lower than 0x3100,
+ # so we will overide that here localy
+ MEM_SIZE = 0x3100
+
+ # UI progress
+ status = chirp_common.Status()
+
+ # put radio in program mode and identify it
+ _do_ident(radio, status)
+
+ # get the data to upload to radio
+ data = radio.get_mmap()
+
+ # Reset the UI progress
+ status.max = MEM_SIZE / TX_BLOCK_SIZE
+ status.cur = 0
+ status.msg = "Cloning to radio..."
+ radio.status_fn(status)
+
+ # the fun start here
+ for addr in range(0, MEM_SIZE, TX_BLOCK_SIZE):
+ # flush input, as per the original driver behavior, try wrapped
+ try:
+ radio.pipe.flushInput()
+ except:
+ msg = "Error with a serial rx buffer flush at _upload"
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ # sending the data
+ d = data[addr:addr + TX_BLOCK_SIZE]
+ _send(radio, _make_frame("X", addr, TX_BLOCK_SIZE, d), 0.015)
+
+ # receiving the response
+ ack = _rawrecv(radio, 1)
+
+ # basic check
+ if len(ack) != 1:
+ msg = "No response in the write of block #0x%04x" % addr
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+
+ if not ack in "\x06\x05":
+ msg = "Bad ack writing block 0x%04x:" % addr
+ LOG.info(msg)
+ raise errors.RadioError(msg)
+
+ # UI Update
+ status.cur = addr / TX_BLOCK_SIZE
+ status.msg = "Cloning to radio..."
+ radio.status_fn(status)
+
+
+def model_match(cls, data):
+ """Match the opened/downloaded image to the correct version"""
+ rid = data[0x3f70:0x3f76]
+
+ if rid in cls._fileid:
+ return True
+
+ return False
+
+
+def _decode_ranges(low, high):
+ """Unpack the data in the ranges zones in the memmap and return
+ a tuple with the integer corresponding to the Mhz it means"""
+ ilow = int(low[0]) * 100 + int(low[1]) * 10 + int(low[2])
+ ihigh = int(high[0]) * 100 + int(high[1]) * 10 + int(high[2])
+ ilow *= 1000000
+ ihigh *= 1000000
+
+ return (ilow, ihigh)
+
+
+class btech(chirp_common.CloneModeRadio, chirp_common.ExperimentalRadio):
+ """BTECH's UV-5001 and alike radios"""
+ VENDOR = "BTECH"
+ MODEL = ""
+ IDENT = ""
+ _vhf_range = (130000000, 180000000)
+ _220_range = (210000000, 231000000)
+ _uhf_range = (400000000, 521000000)
+ _upper = 199
+ _magic = None
+ _fileid = None
+
+ @classmethod
+ def get_prompts(cls):
+ rp = chirp_common.RadioPrompts()
+ rp.experimental = \
+ ('This driver is experimental and for personal use only.\n'
+ '\n'
+ 'Please keep a copy of your memories with the original software '
+ 'if you treasure them, this is the first release and may contain'
+ ' bugs.\n'
+ '\n'
+ 'You will miss the setting tab, we are working on it. Your '
+ 'success/failure story is appreciated, visit the Chirp\'s '
+ 'website and drop us a comment or just say THANKS if it works '
+ 'for you.\n'
+ )
+ rp.pre_download = _(dedent("""\
+ Follow these instructions to download your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the download of your radio data
+
+ """))
+ rp.pre_upload = _(dedent("""\
+ Follow these instructions to upload your info:
+
+ 1 - Turn off your radio
+ 2 - Connect your interface cable
+ 3 - Turn on your radio
+ 4 - Do the upload of your radio data
+
+ """))
+ return rp
+
+ def get_features(self):
+ """Get the radio's features"""
+
+ # we will use the following var as global
+ global POWER_LEVELS
+
+ rf = chirp_common.RadioFeatures()
+ rf.has_settings = False
+ rf.has_bank = False
+ rf.has_tuning_step = False
+ rf.can_odd_split = True
+ rf.has_name = True
+ rf.has_offset = True
+ rf.has_mode = True
+ rf.has_dtcs = True
+ rf.has_rx_dtcs = True
+ rf.has_dtcs_polarity = True
+ rf.has_ctone = True
+ rf.has_cross = True
+ rf.valid_modes = MODES
+ rf.valid_characters = VALID_CHARS
+ rf.valid_name_length = NAME_LENGTH
+ rf.valid_duplexes = ["", "-", "+", "split", "off"]
+ rf.valid_tmodes = ['', 'Tone', 'TSQL', 'DTCS', 'Cross']
+ rf.valid_cross_modes = [
+ "Tone->Tone",
+ "DTCS->",
+ "->DTCS",
+ "Tone->DTCS",
+ "DTCS->Tone",
+ "->Tone",
+ "DTCS->DTCS"]
+ rf.valid_skips = SKIP_VALUES
+ rf.valid_dtcs_codes = DTCS
+ rf.memory_bounds = (0, self._upper)
+
+ # power levels
+ if self.MODEL == "UV-5001":
+ POWER_LEVELS = UV5001_POWER_LEVELS # Higher power (50W)
+ else:
+ POWER_LEVELS = NORMAL_POWER_LEVELS # Lower power (25W)
+
+ rf.valid_power_levels = POWER_LEVELS
+
+ # bands
+ rf.valid_bands = [self._vhf_range, self._uhf_range]
+
+ # 2501+220
+ if self.MODEL == "UV-2501+220":
+ rf.valid_bands.append(self._220_range)
+
+ return rf
+
+ def sync_in(self):
+ """Download from radio"""
+ data = _download(self)
+ self._mmap = memmap.MemoryMap(data)
+ self.process_mmap()
+
+ def sync_out(self):
+ """Upload to radio"""
+ try:
+ _upload(self)
+ except errors.RadioError:
+ raise
+ except Exception, e:
+ raise errors.RadioError("Error: %s" % e)
+
+ def set_options(self):
+ """This is to read the options from the image and set it in the
+ environment, for now just the limits of the freqs in the VHF/UHF
+ ranges"""
+
+ # setting the correct ranges for each radio type
+ if self.MODEL == "UV-2501+220":
+ # the model 2501+220 has a segment in 220
+ # and a different position in the memmap
+ ranges = self._memobj.ranges220
+ else:
+ ranges = self._memobj.ranges
+
+ # the normal dual bands
+ vhf = _decode_ranges(ranges.vhf_low, ranges.vhf_high)
+ uhf = _decode_ranges(ranges.uhf_low, ranges.uhf_high)
+
+ # DEBUG
+ LOG.info("Radio ranges: VHF %d to %d" % vhf)
+ LOG.info("Radio ranges: UHF %d to %d" % uhf)
+
+ # 220Mhz case
+ if self.MODEL == "UV-2501+220":
+ vhf2 = _decode_ranges(ranges.vhf2_low, ranges.vhf2_high)
+ LOG.info("Radio ranges: VHF(220) %d to %d" % vhf2)
+ self._220_range = vhf2
+
+ # set the class with the real data
+ self._vhf_range = vhf
+ self._uhf_range = uhf
+
+ def process_mmap(self):
+ """Process the mem map into the mem object"""
+
+ # Get it
+ self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)
+
+ # load specific parameters from the radio image
+ self.set_options()
+
+ def get_raw_memory(self, number):
+ return repr(self._memobj.memory[number])
+
+ def _decode_tone(self, val):
+ """Parse the tone data to decode from mem, it returns:
+ Mode (''|DTCS|Tone), Value (None|###), Polarity (None,N,R)"""
+ pol = None
+
+ if val in [0, 65535]:
+ return '', None, None
+ elif val > 0x0258:
+ a = val / 10.0
+ return 'Tone', a, pol
+ else:
+ if val > 0x69:
+ index = val - 0x6A
+ pol = "R"
+ else:
+ index = val - 1
+ pol = "N"
+
+ tone = DTCS[index]
+ return 'DTCS', tone, pol
+
+ def _encode_tone(self, memval, mode, val, pol):
+ """Parse the tone data to encode from UI to mem"""
+ if mode == '' or mode is None:
+ memval.set_raw("\x00\x00")
+ elif mode == 'Tone':
+ memval.set_value(val * 10)
+ elif mode == 'DTCS':
+ # detect the index in the DTCS list
+ try:
+ index = DTCS.index(val)
+ if pol == "N":
+ index += 1
+ else:
+ index += 0x6A
+ memval.set_value(index)
+ except:
+ msg = "Digital Tone '%d' is not supported" % value
+ LOG.error(msg)
+ raise errors.RadioError(msg)
+ else:
+ msg = "Internal error: invalid mode '%s'" % mode
+ LOG.error(msg)
+ raise errors.InvalidDataError(msg)
+
+ def get_memory(self, number):
+ """Get the mem representation from the radio image"""
+ _mem = self._memobj.memory[number]
+ _names = self._memobj.names[number]
+
+ # Create a high-level memory object to return to the UI
+ mem = chirp_common.Memory()
+
+ # Memory number
+ mem.number = number
+
+ if _mem.get_raw()[0] == "\xFF":
+ mem.empty = True
+ return mem
+
+ # Freq and offset
+ mem.freq = int(_mem.rxfreq) * 10
+ # tx freq can be blank
+ if _mem.get_raw()[4] == "\xFF":
+ # TX freq not set
+ mem.offset = 0
+ mem.duplex = "off"
+ else:
+ # TX freq set
+ offset = (int(_mem.txfreq) * 10) - mem.freq
+ if offset != 0:
+ if offset > 70000000: # 70 Mhz
+ mem.duplex = "split"
+ mem.offset = int(_mem.txfreq) * 10
+ elif offset < 0:
+ mem.offset = abs(offset)
+ mem.duplex = "-"
+ elif offset > 0:
+ mem.offset = offset
+ mem.duplex = "+"
+ else:
+ mem.offset = 0
+
+ # name TAG of the channel
+ mem.name = str(_names.name).rstrip("\xFF").replace("\xFF", " ")
+
+ # power
+ mem.power = POWER_LEVELS[int(_mem.power)]
+
+ # wide/narrow
+ mem.mode = MODES[int(_mem.wide)]
+
+ # skip
+ mem.skip = SKIP_VALUES[_mem.add]
+
+ # tone data
+ rxtone = txtone = None
+ txtone = self._decode_tone(_mem.txtone)
+ rxtone = self._decode_tone(_mem.rxtone)
+ chirp_common.split_tone_decode(mem, txtone, rxtone)
+
+ # Extra
+ mem.extra = RadioSettingGroup("extra", "Extra")
+
+ spmute = RadioSetting("spmute", "Speaker mute",
+ RadioSettingValueBoolean(bool(_mem.spmute)))
+ mem.extra.append(spmute)
+
+ scramble = RadioSetting("scramble", "Scramble",
+ RadioSettingValueBoolean(bool(_mem.scramble)))
+ mem.extra.append(scramble)
+
+ bcl = RadioSetting("bcl", "Busy channel lockout",
+ RadioSettingValueBoolean(bool(_mem.bcl)))
+ mem.extra.append(bcl)
+
+ pttid = RadioSetting("pttid", "PTT ID",
+ RadioSettingValueList(PTTID_LIST,
+ PTTID_LIST[_mem.pttid]))
+ mem.extra.append(pttid)
+
+ pttidcode = RadioSetting("scode", "PTT ID signal code",
+ RadioSettingValueList(
+ PTTIDCODE_LIST,
+ PTTIDCODE_LIST[_mem.scode]))
+ mem.extra.append(pttidcode)
+
+ optsig = RadioSetting("optsig", "Optional signaling",
+ RadioSettingValueList(
+ OPTSIG_LIST,
+ OPTSIG_LIST[_mem.optsig]))
+ mem.extra.append(optsig)
+
+ return mem
+
+ def set_memory(self, mem):
+ """Set the memory data in the eeprom img from the UI"""
+ # get the eprom representation of this channel
+ _mem = self._memobj.memory[mem.number]
+ _names = self._memobj.names[mem.number]
+
+ # if empty memmory
+ if mem.empty:
+ # the channel itself
+ _mem.set_raw("\xFF" * 16)
+ # the name tag
+ _names.set_raw("\xFF" * 16)
+ return
+
+ # frequency
+ _mem.rxfreq = mem.freq / 10
+
+ # duplex
+ if mem.duplex == "+":
+ _mem.txfreq = (mem.freq + mem.offset) / 10
+ elif mem.duplex == "-":
+ _mem.txfreq = (mem.freq - mem.offset) / 10
+ elif mem.duplex == "off":
+ for i in _mem.txfreq:
+ i.set_raw("\xFF")
+ elif mem.duplex == "split":
+ _mem.txfreq = mem.offset / 10
+ else:
+ _mem.txfreq = mem.freq / 10
+
+ # tone data
+ ((txmode, txtone, txpol), (rxmode, rxtone, rxpol)) = \
+ chirp_common.split_tone_encode(mem)
+ self._encode_tone(_mem.txtone, txmode, txtone, txpol)
+ self._encode_tone(_mem.rxtone, rxmode, rxtone, rxpol)
+
+ # name TAG of the channel
+ if len(mem.name) < NAME_LENGTH:
+ # we must pad to NAME_LENGTH chars, " " = "\xFF"
+ mem.name = str(mem.name).ljust(NAME_LENGTH, " ")
+ _names.name = str(mem.name).replace(" ", "\xFF")
+
+ # power, # default power level is high
+ _mem.power = 0 if mem.power is None else POWER_LEVELS.index(mem.power)
+
+ # wide/narrow
+ _mem.wide = MODES.index(mem.mode)
+
+ # scan add property
+ _mem.add = SKIP_VALUES.index(mem.skip)
+
+ # reseting unknowns, this have to be set by hand
+ _mem.unknown0 = 0
+ _mem.unknown1 = 0
+ _mem.unknown2 = 0
+ _mem.unknown3 = 0
+ _mem.unknown4 = 0
+ _mem.unknown5 = 0
+ _mem.unknown6 = 0
+
+ # extra settings
+ if len(mem.extra) > 0:
+ # there are setting, parse
+ for setting in mem.extra:
+ setattr(_mem, setting.get_name(), setting.value)
+ else:
+ # there is no extra settings, load defaults
+ _mem.spmute = 0
+ _mem.optsig = 0
+ _mem.scramble = 0
+ _mem.bcl = 0
+ _mem.pttid = 0
+ _mem.scode = 0
+
+ return mem
+
+ @classmethod
+ def match_model(cls, filedata, filename):
+ match_size = False
+ match_model = False
+
+ # testing the file data size
+ if len(filedata) == MEM_SIZE:
+ match_size = True
+
+ # testing the firmware model fingerprint
+ match_model = model_match(cls, filedata)
+
+ if match_size and match_model:
+ return True
+ else:
+ return False
+
+
+# Note:
+# the order in the lists in the _magic, IDENT and _fileid is important
+# we put the most common units first, the policy is as follows:
+
+# - First latest (newer) units, as they will be the most common
+# - Second the former latest version, and recursively...
+# - At the end the pre-production units (pp) as this will be unique
+
+(a)directory.register
+class UV2501(btech):
+ """Baofeng Tech UV2501"""
+ MODEL = "UV-2501"
+ _magic = [MSTRING, ]
+ _fileid = [UV2501G2_fp, UV2501pp2_fp, UV2501pp_fp]
+
+
+(a)directory.register
+class UV2501_220(btech):
+ """Baofeng Tech UV2501+220"""
+ MODEL = "UV-2501+220"
+ _magic = [MSTRING_220, ]
+ _fileid = [UV2501_220_fp, UV2501_220pp_fp]
+ _id2 = [UV2501_220pp_id, ]
+
+
+(a)directory.register
+class UV5001(btech):
+ """Baofeng Tech UV5001"""
+ MODEL = "UV-5001"
+ _magic = [MSTRING, MSTRING_MINI8900]
+ _fileid = [UV5001G22_fp, UV5001G2_fp, UV5001alpha_fp, UV5001pp_fp]
+
+
+(a)directory.register
+class MINI8900(btech):
+ """WACCOM MINI-8900"""
+ VENDOR = "WACCOM"
+ MODEL = "MINI-8900"
+ _magic = [MSTRING_MINI8900, ]
+ _fileid = [MINI8900_fp, ]
diff -r 86fcbefbcf67 -r e6f801362745 tests/images/BTECH_UV-2501+220.img
Binary file tests/images/BTECH_UV-2501+220.img has changed
diff -r 86fcbefbcf67 -r e6f801362745 tests/images/BTECH_UV-5001.img
Binary file tests/images/BTECH_UV-5001.img has changed
diff -r 86fcbefbcf67 -r e6f801362745 tests/images/WACCOM_MINI-8900.img
Binary file tests/images/WACCOM_MINI-8900.img has changed
3
16
Hi all,
I think I've been a little lazy about making sure we update the model
support list on the wiki recently.
Just as a reminder, if you add support for a new model, please update
the list here:
http://chirp.danplanet.com/projects/chirp/wiki/Supported_Radios
We don't need to mention every possible variant there, but if you add
support for a whole new model (or a new radio that is a clone of
another), please edit that list accordingly.
If you've added one or more recently, please have a look and see if it
is there and add it if not.
Thanks!
--Dan
2
3
Tested changes:
[Dan Smith <dsmith(a)danplanet.com>] Add test images for #3015
>From Jim Unroe
[Jim Unroe <rock.unroe(a)gmail.com>] [New Model] Support for the BTECH Mobile Radios, fixes issue #3015
This patch adds "basic support" for the the following radios:
BTECH UV-5001, UV-2501 and UV-2501+220
WACCOM MINI-8900 Plus
"Basic support" is a complete implementaton of the per-channel
settings, including:
Speaker mute
Scramble
Busy channel lockout
PTT ID
PTT ID signal code
Optional signaling
also related to #2673
Full log:
Started by an SCM change
Building in workspace /var/lib/jenkins/jobs/chirp-test/workspace
[workspace] $ hg showconfig paths.default
[workspace] $ hg pull --rev default
[workspace] $ hg update --clean --rev default
4 files updated, 0 files merged, 0 files removed, 0 files unresolved
[workspace] $ hg log --rev . --template {node}
[workspace] $ hg log --rev . --template {rev}
[workspace] $ hg log --rev 86fcbefbcf670ca1ace59c34262550c5cae4a792
[workspace] $ hg log --template "<changeset node='{node}' author='{author|xmlescape}' rev='{rev}' date='{date}'><msg>{desc|xmlescape}</msg><added>{file_adds|stringify|xmlescape}</added><deleted>{file_dels|stringify|xmlescape}</deleted><files>{files|stringify|xmlescape}</files><parents>{parents}</parents></changeset>\n" --rev default:0 --follow --prune 86fcbefbcf670ca1ace59c34262550c5cae4a792
No emails were triggered.
[workspace] $ /bin/sh -xe /tmp/hudson2676806215449273542.sh
[workspace] $ /bin/sh -xe /tmp/hudson7304769136041885128.sh
+ PATH=/usr/bin:/bin:/usr/local/bin ./run_all_tests.sh
test_bit_array (tests.unit.test_bitwise.TestBitType) ... ok
test_bit_array_fail (tests.unit.test_bitwise.TestBitType) ... ok
test_bitfield_u16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_u8 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul16 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bitfield_ul24 (tests.unit.test_bitwise.TestBitfieldTypes) ... ok
test_bbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_bbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_lbcd_array (tests.unit.test_bitwise.TestBitwiseBCDTypes) ... ok
test_int_array (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_u8 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul16 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul24 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_type_ul32 (tests.unit.test_bitwise.TestBitwiseBaseIntTypes) ... ok
test_char (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_invalid_chars (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_string_wrong_length (tests.unit.test_bitwise.TestBitwiseCharTypes) ... ok
test_comment_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_comment_inline_cppstyle (tests.unit.test_bitwise.TestBitwiseComments) ... ok
test_missing_semicolon (tests.unit.test_bitwise.TestBitwiseErrors) ... ok
test_seek (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_seekto (tests.unit.test_bitwise.TestBitwiseSeek) ... ok
test_struct_one_element (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_two_elements (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
test_struct_writes (tests.unit.test_bitwise.TestBitwiseStructTypes) ... ok
split_tone_encode_test_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
split_tone_encode_test_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_dtcs_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_none_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_cross_tone_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_dtcs (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_none (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tone (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_split_tone_decode_tsql (tests.unit.test_chirp_common.TestSplitTone) ... ok
test_fix_rounded_step_250 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_500 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_fix_rounded_step_750 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_12_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_2_5 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_5_0 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_6_25 (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_is_fractional_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_required_step_fail (tests.unit.test_chirp_common.TestStepFunctions) ... ok
test_format_freq (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_bad (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_decimal (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whitespace (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_parse_freq_whole (tests.unit.test_chirp_common.TestUtilityFunctions) ... ok
test_ensure_has_calls_almost_full (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_empty (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_partial (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full1 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_rptcall_full2 (tests.unit.test_import_logic.DstarTests) ... ok
test_ensure_has_calls_urcall_full (tests.unit.test_import_logic.DstarTests) ... ok
test_import_bank (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffA_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_dtcs_diffB_dtcs (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_negative (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_too_big_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_uhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_duplex_vhf (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_errors (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mem_with_warnings (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_invalid (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_am (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_mode_valid_fm (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_name (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_closest (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_dst (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_no_src (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_power_same (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffA_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_import_tone_diffB_tsql (tests.unit.test_import_logic.ImportFieldTests) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseBank) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseBankModel) ... ok
test_mapping (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestBaseMapping) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_get_name (tests.unit.test_mappingmodel.TestBaseMappingModel) ... ok
test_base_class (tests.unit.test_mappingmodel.TestBaseMappingModelIndexInterface) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomBankModel) ... ok
test_icom_bank (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_mapping_eq (tests.unit.test_mappingmodel.TestIcomBanks) ... ok
test_add_memory_to_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_index_bounds (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mapping_memories (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_memory_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_next_mapping_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_get_num_mappings (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_no_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_remove_memory_from_mapping_wrong_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_bank (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_set_memory_index_bad_index (tests.unit.test_mappingmodel.TestIcomIndexedBankModel) ... ok
test_auto_tone_mode_cross (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_pol (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_dtcs_rx (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tone (tests.unit.test_memedit_edits.TestEdits) ... ok
test_auto_tone_mode_tsql (tests.unit.test_memedit_edits.TestEdits) ... ok
test_init (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_bad_portnames (tests.unit.test_platform.Win32PlatformTest) ... ok
test_serial_ports_sorted (tests.unit.test_platform.Win32PlatformTest) ... ok
test_apply_callback (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_group (tests.unit.test_settings.TestSettingContainers) ... ok
test_radio_setting_multi (tests.unit.test_settings.TestSettingContainers) ... ok
test_changed (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_boolean (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_float (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_integer (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_list (tests.unit.test_settings.TestSettingValues) ... ok
test_radio_setting_value_string (tests.unit.test_settings.TestSettingValues) ... ok
test_validate_callback (tests.unit.test_settings.TestSettingValues) ... ok
test_delete_hole_with_all (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_all_full (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_with_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_delete_hole_without_hole (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_with_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
test_insert_hole_without_space (tests.unit.test_shiftdialog.ShiftDialogTest) ... ok
----------------------------------------------------------------------
Ran 151 tests in 0.051s
OK
FAIL: Please keep commit message lines to <80 columns
Checking for PEP8 regressions...
./chirp/drivers/ft60.py:521:45: W291 trailing whitespace
./chirp/drivers/ft60.py:522:25: E128 continuation line under-indented for visual indent
./chirp/drivers/ft60.py:523:13: E301 expected 1 blank line, found 0
./chirp/drivers/ft817.py:587:41: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:681:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:685:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:688:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:689:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:692:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:693:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:696:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:699:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:702:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:705:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:708:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:711:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:714:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:717:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:718:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:721:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:722:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:725:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:728:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:729:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:732:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:733:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:736:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:737:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:740:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:741:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:744:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:747:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:750:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:751:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:754:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:755:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:758:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:761:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:764:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:765:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:768:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:769:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:772:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:773:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:776:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:779:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:780:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:783:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:786:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:787:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:790:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:791:29: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:807:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:808:31: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:811:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:814:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:818:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:824:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:829:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:833:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:837:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:841:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:845:25: E128 continuation line under-indented for visual indent
./chirp/drivers/kguv8d.py:890:25: E128 continuation line under-indented for visual indent
./chirp/drivers/thd72.py:188:1: E302 expected 2 blank lines, found 1
./chirp/drivers/thd72.py:203:23: E201 whitespace after '['
./chirp/drivers/thd72.py:203:80: E501 line too long (171 > 79 characters)
./chirp/drivers/thd72.py:203:170: E202 whitespace before ']'
./chirp/drivers/thd72.py:204:13: E201 whitespace after '['
./chirp/drivers/thd72.py:204:61: E202 whitespace before ']'
./chirp/drivers/thd72.py:205:23: E201 whitespace after '['
./chirp/drivers/thd72.py:205:74: E202 whitespace before ']'
./chirp/drivers/thd72.py:206:18: E201 whitespace after '['
./chirp/drivers/thd72.py:206:65: E202 whitespace before ']'
./chirp/drivers/thd72.py:591:1: W293 blank line contains whitespace
./chirp/drivers/thd72.py:599:1: W293 blank line contains whitespace
./chirp/ui/mainapp.py:637:13: E128 continuation line under-indented for visual indent
./chirp/ui/mainapp.py:651:5: E303 too many blank lines (2)
./chirp/ui/mainapp.py:1355:80: E501 line too long (81 > 79 characters)
./chirp/ui/mainapp.py:1637:80: E501 line too long (85 > 79 characters)
real 0m7.520s
user 0m7.366s
sys 0m0.078s
================================================
Tests FAILED: style tests
Build step 'Execute shell' marked build as failure
Email was triggered for: Failure
Sending email for trigger: Failure
1
1
[chirp_devel] Loan offer to make the Kenwoods TK-880/TK-981 into Chirp, any developer available?
by M.Sc. Pavel Milanes Costa 21 Mar '16
by M.Sc. Pavel Milanes Costa 21 Mar '16
21 Mar '16
Issue #3475 has been updated by Yaron Oren-Pines.
Hi Pavel,
I would be happy to loan a Kenwood Radio in this family (Can loan TK-880
and/or TK-981) to a local developer.
I live in the San Francisco Bay Area (San Jose, California) and can be
reached at k6yop(a)arrl.net
If you know of anyone local here, please put us in touch,
Yaron - K6YOP
New Model #3475: Support for Kenwood: other Kenwood Radios that work in
the HAM Bands
============================
From my experience all Commercial Kenwoods are essentially the same
inside, there are two drivers already in Chirp (tk760.py & tk760g.py)
that can be used as templates.
A there is a third one under development here for the TK-790, I lack
time right now an sending the radio to me is (yet) a hard task (I live
in Cuba, customs, etc.)
Commercial Kenwoods are a *X because they use the same layout for
different radios in the same family, the only thing you need is to
acquire the IDs and band edges for the other members of the family and
boom! you will have a driver that can handle a bunch of radios.
I can help but not lead the development, without the radio is a hard task.
73 CO7WT.
1
0