Developers
Threads by month
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
April 2021
- 7 participants
- 28 discussions
[chirp_devel] Fwd: [PATCH 3 of 3] [BJ-318] Add support for the Baojie BJ-318
by Jim Unroe 12 Apr '21
by Jim Unroe 12 Apr '21
12 Apr '21
Baojie BJ-318 CHIRP Radio Images (*.img) file attached.
Jim KC9HI
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Mon, Apr 12, 2021 at 12:29 PM
Subject: [PATCH 3 of 3] [BJ-318] Add support for the Baojie BJ-318
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1618244518 14400
# Mon Apr 12 12:21:58 2021 -0400
# Node ID d1f3307170d3c5fc1ab329cf5e20d24df8a04960
# Parent 60b475e41306144198481bc84d428ef0ca6adb5b
[BJ-318] Add support for the Baojie BJ-318
This patch adds support for the Bajoie BJ-318 mobile radio.
Research and main coding by Mark Hartong
Assistance, pep8 compliance and submission by Jim Unroe
related to #6235
diff -r 60b475e41306 -r d1f3307170d3 chirp/drivers/lt725uv.py
--- a/chirp/drivers/lt725uv.py Sun Apr 11 21:12:34 2021 -0400
+++ b/chirp/drivers/lt725uv.py Mon Apr 12 12:21:58 2021 -0400
@@ -1,6 +1,10 @@
# Copyright 2016-2021:
# * Jim Unroe KC9HI, <rock.unroe(a)gmail.com>
-# Modified for Baojie BJ-218: 2018 by Rick DeWitt (RJD), <aa0rd(a)yahoo.com>#
+# Modified for Baojie BJ-218: 2018
+# Rick DeWitt (RJD), <aa0rd(a)yahoo.com>
+# Modified for Baojie BJ-318: April 2021
+# Mark Hartong, AJ4YI <mark.hartong(a)verizon.net>
+#
# 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
@@ -32,12 +36,12 @@
MEM_FORMAT = """
#seekto 0x0200;
struct {
- u8 init_bank;
- u8 volume;
- u16 fm_freq;
- u8 wtled;
- u8 rxled;
- u8 txled;
+ u8 init_bank; // determines which VFO is primary A or B
+ u8 volume; // not used BJ-318, band volume is controlled vfo u8 bvol
+ u16 fm_freq; // not used BJ-318, freq is controlled hello_lims u16 fm_318
+ u8 wtled; // not used BJ-318
+ u8 rxled; // not used BJ-318
+ u8 txled; // not used BJ-318
u8 ledsw;
u8 beep;
u8 ring;
@@ -45,7 +49,7 @@
u8 tot;
u16 sig_freq;
u16 dtmf_txms;
- u8 init_sql;
+ u8 init_sql; // not used BJ-318, band squelch is controlled vfo u8 sql
u8 rptr_mode;
} settings;
@@ -92,15 +96,25 @@
#seekto 0x02d0;
struct {
- u8 hello1_cnt;
- char hello1[7];
- u8 hello2_cnt;
- char hello2[7];
+ u8 hello1_cnt; // not used in BJ-318, is set in memory map
+ char hello1[7]; // not used in BJ-318, is set in memory map
+ u8 hello2_cnt; // not used in BJ-318, is set in memory map
+ char hello2[7]; // not used in BJ-318, is set in memory map
u32 vhf_low;
u32 vhf_high;
u32 uhf_low;
u32 uhf_high;
- u8 lims_on;
+ u8 lims_on; // first byte @ at address 0x02f0;
+ u8 unknown_1; // use in BJ-318 unknown
+ u8 lang; // BJ-318 Display language
+ // 02 = English 00 and 01 are Asian
+ u8 up_scr_color; // BJ-318 upper screen character color
+ u8 dn_scr_color; // BJ-318 lower screen character color
+ // purple=00, red=01, emerald=02, blue=03,
+ // sky_blue=04, black=05, required hex values for color
+ // Note sky_blue and black look the same on the
+ // BJ-318 screen
+ u16 fm_318; // FM stored Frequency in BJ-318
} hello_lims;
struct vfo {
@@ -117,14 +131,18 @@
tx_tone:14;
u8 launch_sig;
u8 tx_end_sig;
- u8 bpower;
+ u8 bpower; // sets power Hi=02h, Medium=01h, Low=00
+ // sets power for entire vfo band
u8 fm_bw;
u8 cmp_nder;
u8 scrm_blr;
u8 shift;
u32 offset;
u16 step;
- u8 sql;
+ u8 sql; // squelch for entire vfo band
+ // integer values 0 (low) to 9 (high)
+ u8 bvol; // sets volume for vfo band
+ // integer values 0 (low) TO 10 (high)
};
#seekto 0x0300;
@@ -149,7 +167,11 @@
txtone:14;
u8 botsignal;
u8 eotsignal;
- u8 power:1,
+ u8 power:1, // binary value for
+ // indiviudal channel power
+ // set to "High" or "Low"
+ // BJ-318 band power overrides any
+ // individual channel power setting
wide:1,
compandor:1
scrambler:1
@@ -173,14 +195,18 @@
MEM_SIZE = 0x1C00
BLOCK_SIZE = 0x40
STIMEOUT = 2
-
LIST_RECVMODE = ["QT/DQT", "QT/DQT + Signaling"]
LIST_SIGNAL = ["Off"] + ["DTMF%s" % x for x in range(1, 9)] + \
["DTMF%s + Identity" % x for x in range(1, 9)] + \
["Identity code"]
# Band Power settings, can be different than channel power
LIST_BPOWER = ["Low", "Mid", "High"] # Tri-power models
+
+# Screen Color Settings
+# BJ-218 Colors
LIST_COLOR = ["Off", "Orange", "Blue", "Purple"]
+# BJ-318 Colors
+LIST_COLOR318 = ["Purple", "Red", "Emerald", "Blue", "Sky_Blue", "Black"]
LIST_LEDSW = ["Auto", "On"]
LIST_RING = ["Off"] + ["%s" % x for x in range(1, 10)]
LIST_TDR_DEF = ["A-Upper", "B-Lower"]
@@ -206,9 +232,9 @@
SETTING_LISTS = {
"init_bank": LIST_TDR_DEF,
"tot": LIST_TIMEOUT,
- "wtled": LIST_COLOR,
- "rxled": LIST_COLOR,
- "txled": LIST_COLOR,
+ "wtled": LIST_COLOR, # not used in BJ-318, other radios use
+ "rxled": LIST_COLOR, # not used in BJ-318, other radios use
+ "txled": LIST_COLOR, # not used in BJ-318, other radios use
"sig_freq": LIST_SSF,
"dtmf_txms": LIST_DTMFTX,
"ledsw": LIST_LEDSW,
@@ -223,7 +249,9 @@
"shift": LIST_SHIFT,
"step": LIST_STEPS,
"ring": LIST_RING,
- "state_now": LIST_STATE
+ "state_now": LIST_STATE,
+ "up_scr_color": LIST_COLOR318, # unique to BJ-318
+ "dn_scr_color": LIST_COLOR318, # unique to BJ-318
}
@@ -425,7 +453,14 @@
NAME_LENGTH = 7
DTMF_CHARS = list("0123456789ABCD*#")
- # Channel power: 2 levels
+ # Channel Power: 2 levels
+ # BJ-318 uses 3 power levels for each VFO "Band"
+ # Low = 5W, Med = 10W, High = 25W
+ # The band power selection in a VFO applies to the VFO and overrides
+ # the stored channel power selection
+ # The firmware chanel memory structure provides only 1 bit for
+ # individual chanel power settings, limiting potential channel
+ # power selection options to 2 levels: Low or High.
POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=5.00),
chirp_common.PowerLevel("High", watts=30.00)]
@@ -439,20 +474,39 @@
@classmethod
def get_prompts(cls):
rp = chirp_common.RadioPrompts()
- rp.info = \
- ('Some notes about POWER settings:\n'
- '- The individual channel power settings are ignored'
- ' by the radio.\n'
- ' They are allowed to be set (and downloaded) in hopes of'
- ' a future firmware update.\n'
- '- Power settings done \'Live\' in the radio apply to the'
- ' entire upper or lower band.\n'
- '- Tri-power radio models will set and download the three'
- ' band-power'
- ' levels, but they are converted to just Low and High at'
- ' upload.'
- ' The Mid setting reverts to Low.'
- )
+ if cls.MODEL == "BJ-318":
+ msg = \
+ (' BJ-318 EXPERIMENTAL\n'
+ ' PLEASE REPORT ANY ISSUES \n'
+ '\n'
+ 'The individual channel power settings are ignored by \n'
+ 'the radio. They are allowed to be set in hopes of a \n'
+ 'future firmware change. Changing a stored channel power \n'
+ 'setting must be done manually using the front panel menu \n'
+ 'control (or the microphone control controls while in VFO \n'
+ 'mode) to change the VFO power. The CHIRP driver will \n'
+ 'allow setting the individual VFO power to High (25W), \n'
+ 'Med (10W) or Low (5W) and setting the unused individual \n'
+ 'channel power setting to High (25W) or Low (5W)'
+ )
+
+ else:
+ msg = \
+ ('Some notes about POWER settings:\n'
+ '- The individual channel power settings are ignored'
+ ' by the radio.\n'
+ ' They are allowed to be set (and downloaded) in hopes of'
+ ' a future firmware update.\n'
+ '- Power settings done \'Live\' in the radio apply to the'
+ ' entire upper or lower band.\n'
+ '- Tri-power radio models will set and download the three'
+ ' band-power'
+ ' levels, but they are converted to just Low and High at'
+ ' upload.'
+ ' The Mid setting reverts to Low.'
+ )
+
+ rp.info = msg
rp.pre_download = _(dedent("""\
Follow this instructions to download your info:
@@ -776,19 +830,25 @@
_sets.init_bank]))
basic.append(bnd_mode)
- volume = RadioSetting("settings.volume", "Volume",
- RadioSettingValueInteger(0, 20, _sets.volume))
- basic.append(volume)
+ # BJ-318 set by vfo, skip
+ if self.MODEL != "BJ-318":
+ rs = RadioSettingValueInteger(0, 20, _sets.volume)
+ volume = RadioSetting("settings.volume", "Volume", rs)
+ basic.append(volume)
- val = _vfoa.bpower # 2bits values 0,1,2= Low, Mid, High
- rx = RadioSettingValueList(LIST_BPOWER, LIST_BPOWER[val])
- powera = RadioSetting("upper.vfoa.bpower", "Power (Upper)", rx)
- basic.append(powera)
+ # BJ-318 set by vfo, skip
+ if self.MODEL != "BJ-318":
+ vala = _vfoa.bpower # 2bits values 0,1,2= Low, Mid, High
+ rx = RadioSettingValueList(LIST_BPOWER, LIST_BPOWER[vala])
+ powera = RadioSetting("upper.vfoa.bpower", "Power (Upper)", rx)
+ basic.append(powera)
- val = _vfob.bpower
- rx = RadioSettingValueList(LIST_BPOWER, LIST_BPOWER[val])
- powerb = RadioSetting("lower.vfob.bpower", "Power (Lower)", rx)
- basic.append(powerb)
+ # BJ-318 set by vfo, skip
+ if self.MODEL != "BJ-318":
+ valb = _vfob.bpower
+ rx = RadioSettingValueList(LIST_BPOWER, LIST_BPOWER[valb])
+ powerb = RadioSetting("lower.vfob.bpower", "Power (Lower)", rx)
+ basic.append(powerb)
def my_word2raw(setting, obj, atrb, mlt=10):
"""Callback function to convert UI floating value to u16 int"""
@@ -874,28 +934,48 @@
setattr(obj, tone_atr, tonx)
return
- val = _sets.fm_freq / 10.0
- if val == 0:
- val = 88.9 # 0 is not valid
- rx = RadioSettingValueFloat(65, 108.0, val, 0.1, 1)
- rs = RadioSetting("settings.fm_freq", "FM Broadcast Freq (MHz)", rx)
- rs.set_apply_callback(my_word2raw, _sets, "fm_freq")
- basic.append(rs)
+ # not used by BJ-318 skip
+ if self.MODEL != "BJ-318":
+ val = _sets.fm_freq / 10.0
+ if val == 0:
+ val = 88.9 # 0 is not valid
+ rx = RadioSettingValueFloat(65, 108.0, val, 0.1, 1)
+ rs = RadioSetting("settings.fm_freq",
+ "FM Broadcast Freq (MHz)", rx)
+ rs.set_apply_callback(my_word2raw, _sets, "fm_freq")
+ basic.append(rs)
- wtled = RadioSetting("settings.wtled", "Standby LED Color",
- RadioSettingValueList(LIST_COLOR, LIST_COLOR[
- _sets.wtled]))
- basic.append(wtled)
+ # BJ-318 fm frequency
+ if self.MODEL == "BJ-318":
+ val = _lims.fm_318 / 10.0
+ if val == 0:
+ val = 88.9 # 0 is not valid
+ rx = RadioSettingValueFloat(65, 108.0, val, 0.1, 1)
+ rs = RadioSetting("hello_lims.fm_318",
+ "FM Broadcast Freq (MHz)", rx)
+ rs.set_apply_callback(my_word2raw, _lims, "fm_318")
+ basic.append(rs)
- rxled = RadioSetting("settings.rxled", "RX LED Color",
- RadioSettingValueList(LIST_COLOR, LIST_COLOR[
- _sets.rxled]))
- basic.append(rxled)
+ # not used in BJ-318, skip
+ if self.MODEL != "BJ-318":
+ rs = RadioSettingValueList(LIST_COLOR,
+ LIST_COLOR[_sets.wtled])
+ wtled = RadioSetting("settings.wtled", "Standby LED Color", rs)
+ basic.append(wtled)
- txled = RadioSetting("settings.txled", "TX LED Color",
- RadioSettingValueList(LIST_COLOR, LIST_COLOR[
- _sets.txled]))
- basic.append(txled)
+ # not used in BJ-318, skip
+ if self.MODEL != "BJ-318":
+ rs = RadioSettingValueList(LIST_COLOR,
+ LIST_COLOR[_sets.rxled])
+ rxled = RadioSetting("settings.rxled", "RX LED Color", rs)
+ basic.append(rxled)
+
+ # not used in BJ-318, skip
+ if self.MODEL != "BJ-318":
+ rs = RadioSettingValueList(LIST_COLOR,
+ LIST_COLOR[_sets.txled])
+ txled = RadioSetting("settings.txled", "TX LED Color", rs)
+ basic.append(txled)
ledsw = RadioSetting("settings.ledsw", "Back light mode",
RadioSettingValueList(LIST_LEDSW, LIST_LEDSW[
@@ -915,21 +995,24 @@
RadioSettingValueBoolean(bool(_sets.bcl)))
basic.append(bcl)
- if _vfoa.sql == 0xFF:
- val = 0x04
- else:
- val = _vfoa.sql
- sqla = RadioSetting("upper.vfoa.sql", "Squelch (Upper)",
- RadioSettingValueInteger(0, 9, val))
- basic.append(sqla)
+ # squelch for non-BJ-318 models
+ # BJ-318 squelch set by VFO basis
+ if self.MODEL != "BJ-318":
+ if _vfoa.sql == 0xFF:
+ val = 0x04
+ else:
+ val = _vfoa.sql
+ sqla = RadioSetting("upper.vfoa.sql", "Squelch (Upper)",
+ RadioSettingValueInteger(0, 9, val))
+ basic.append(sqla)
- if _vfob.sql == 0xFF:
- val = 0x04
- else:
- val = _vfob.sql
- sqlb = RadioSetting("lower.vfob.sql", "Squelch (Lower)",
- RadioSettingValueInteger(0, 9, val))
- basic.append(sqlb)
+ if _vfob.sql == 0xFF:
+ val = 0x04
+ else:
+ val = _vfob.sql
+ sqlb = RadioSetting("lower.vfob.sql", "Squelch (Lower)",
+ RadioSettingValueInteger(0, 9, val))
+ basic.append(sqlb)
tmp = str(int(_sets.tot) * 30) # 30 sec step counter
rs = RadioSetting("settings.tot", "Transmit Timeout (Secs)",
@@ -1034,6 +1117,38 @@
rs.set_apply_callback(my_word2raw, _vfoa, "step", 100)
a_band.append(rs)
+ # BJ-318 upper band squelch
+ if self.MODEL == "BJ-318":
+ if _vfoa.sql == 0xFF:
+ valq = 0x04 # setting default squelch to 04
+ else:
+ valq = _vfoa.sql
+ sqla = RadioSetting("upper.vfoa.sql", "Squelch",
+ RadioSettingValueInteger(0, 9, valq))
+ a_band.append(sqla)
+
+ # BJ-318 upper band volume
+ if self.MODEL == "BJ-318":
+ bvolume_u = RadioSetting("upper.vfoa.bvol",
+ "Volume", RadioSettingValueInteger(
+ 0, 10, _vfoa.bvol))
+ a_band.append(bvolume_u)
+
+ # BJ-318 Upper Screen Color
+ if self.MODEL == "BJ-318":
+ rs_u = RadioSettingValueList(LIST_COLOR318,
+ LIST_COLOR318[_lims.up_scr_color])
+ up_scr_color = RadioSetting("hello_lims.up_scr_color",
+ "Screen Color", rs_u)
+ a_band.append(up_scr_color)
+
+ # BJ-318 Upper band power
+ if self.MODEL == "BJ-318":
+ val_b = _vfoa.bpower # 2bits values 0,1,2= Low, Mid, High
+ rx = RadioSettingValueList(LIST_BPOWER, LIST_BPOWER[val_b])
+ power_u = RadioSetting("upper.vfoa.bpower", "Power", rx)
+ a_band.append(power_u)
+
# LOWER BAND SETTINGS
val = _vfob.frq_chn_mode / 2
@@ -1110,8 +1225,39 @@
rs.set_apply_callback(my_word2raw, _vfob, "step", 100)
b_band.append(rs)
+ # BJ-318 lower band squelch
+ if self.MODEL == "BJ-318":
+ if _vfob.sql == 0xFF:
+ val_l = 0x04 # setting default squelch to 04
+ else:
+ val_l = _vfob.sql
+ sql_b = RadioSetting("lower.vfob.sql", "Squelch",
+ RadioSettingValueInteger(0, 9, val_l))
+ b_band.append(sql_b)
+
+ # BJ-318 lower band volume
+ if self.MODEL == "BJ-318":
+ bvolume_l = RadioSetting("lower.vfob.bvol",
+ "Volume", RadioSettingValueInteger(
+ 0, 10, _vfob.bvol))
+ b_band.append(bvolume_l)
+
+ # BJ-318 Lower Screen Color
+ if self.MODEL == "BJ-318":
+ rs_l = RadioSettingValueList(LIST_COLOR318,
+ LIST_COLOR318[_lims.dn_scr_color])
+ dn_scr_color = RadioSetting("hello_lims.dn_scr_color",
+ "Screen Color", rs_l)
+ b_band.append(dn_scr_color)
+
+ # BJ-318 lower band power
+ if self.MODEL == "BJ-318":
+ val_l = _vfoa.bpower # 2bits values 0,1,2= Low, Mid, High
+ rx = RadioSettingValueList(LIST_BPOWER, LIST_BPOWER[val_l])
+ powera = RadioSetting("lower.vfob.bpower", "Power", rx)
+ b_band.append(powera)
+
# PowerOn & Freq Limits Settings
-
def chars2str(cary, knt):
"""Convert raw memory char array to a string: NOT a callback."""
stx = ""
@@ -1137,17 +1283,21 @@
setattr(obj, atrbc, knt)
return
- tmp = chars2str(_lims.hello1, _lims.hello1_cnt)
- rs = RadioSetting("hello_lims.hello1", "Power-On Message 1",
- RadioSettingValueString(0, 7, tmp))
- rs.set_apply_callback(my_str2ary, _lims, "hello1", "hello1_cnt")
- lims.append(rs)
+ # not used in BJ-318 startup screen
+ if self.MODEL != "BJ-318":
+ tmp = chars2str(_lims.hello1, _lims.hello1_cnt)
+ rs = RadioSetting("hello_lims.hello1", "Power-On Message 1",
+ RadioSettingValueString(0, 7, tmp))
+ rs.set_apply_callback(my_str2ary, _lims, "hello1", "hello1_cnt")
+ lims.append(rs)
- tmp = chars2str(_lims.hello2, _lims.hello2_cnt)
- rs = RadioSetting("hello_lims.hello2", "Power-On Message 2",
- RadioSettingValueString(0, 7, tmp))
- rs.set_apply_callback(my_str2ary, _lims, "hello2", "hello2_cnt")
- lims.append(rs)
+ # not used in BJ-318 startup screen
+ if self.MODEL != "BJ-318":
+ tmp = chars2str(_lims.hello2, _lims.hello2_cnt)
+ rs = RadioSetting("hello_lims.hello2", "Power-On Message 2",
+ RadioSettingValueString(0, 7, tmp))
+ rs.set_apply_callback(my_str2ary, _lims, "hello2", "hello2_cnt")
+ lims.append(rs)
# VALID_BANDS = [(136000000, 176000000),400000000, 480000000)]
@@ -1460,3 +1610,23 @@
def get_sub_devices(self):
return [Baojie218Upper(self._mmap), Baojie218Lower(self._mmap)]
+
+
+class Baojie318Upper(LT725UVUpper):
+ VENDOR = "Baojie"
+ MODEL = "BJ-318"
+
+
+class Baojie318Lower(LT725UVLower):
+ VENDOR = "Baojie"
+ MODEL = "BJ-318"
+
+
+(a)directory.register
+class Baojie318(LT725UV):
+ """Baojie BJ-318"""
+ VENDOR = "Baojie"
+ MODEL = "BJ-318"
+
+ def get_sub_devices(self):
+ return [Baojie318Upper(self._mmap), Baojie318Lower(self._mmap)]
1
0
[chirp_devel] Fwd: [PATCH 2 of 3] [BJ-318] Driver prep to make ready to support the Baojie BJ-318
by Jim Unroe 12 Apr '21
by Jim Unroe 12 Apr '21
12 Apr '21
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Mon, Apr 12, 2021 at 12:29 PM
Subject: [PATCH 2 of 3] [BJ-318] Driver prep to make ready to support
the Baojie BJ-318
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1618189954 14400
# Sun Apr 11 21:12:34 2021 -0400
# Node ID 60b475e41306144198481bc84d428ef0ca6adb5b
# Parent 9f38db094e0e56b31998f97abda4ca6f53572a0a
[BJ-318] Driver prep to make ready to support the Baojie BJ-318
This patch makes changes to the lt725uv.py driver to facilitate the addition
of support for the Baojie BJ-318.
The features and settings of the radio models that this driver currently
supports are not affected.
related to #6235
diff -r 9f38db094e0e -r 60b475e41306 chirp/drivers/lt725uv.py
--- a/chirp/drivers/lt725uv.py Sun Apr 11 16:45:34 2021 -0400
+++ b/chirp/drivers/lt725uv.py Sun Apr 11 21:12:34 2021 -0400
@@ -1,4 +1,4 @@
-# Copyright 2016:
+# Copyright 2016-2021:
# * Jim Unroe KC9HI, <rock.unroe(a)gmail.com>
# Modified for Baojie BJ-218: 2018 by Rick DeWitt (RJD), <aa0rd(a)yahoo.com>#
# This program is free software: you can redistribute it and/or modify
@@ -173,9 +173,6 @@
MEM_SIZE = 0x1C00
BLOCK_SIZE = 0x40
STIMEOUT = 2
-# Channel power: 2 levels
-POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=5.00),
- chirp_common.PowerLevel("High", watts=30.00)]
LIST_RECVMODE = ["QT/DQT", "QT/DQT + Signaling"]
LIST_SIGNAL = ["Off"] + ["DTMF%s" % x for x in range(1, 9)] + \
@@ -428,6 +425,10 @@
NAME_LENGTH = 7
DTMF_CHARS = list("0123456789ABCD*#")
+ # Channel power: 2 levels
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=5.00),
+ chirp_common.PowerLevel("High", watts=30.00)]
+
VALID_BANDS = [(136000000, 176000000),
(400000000, 480000000)]
@@ -499,7 +500,7 @@
"->Tone",
"DTCS->DTCS"]
rf.valid_skips = []
- rf.valid_power_levels = POWER_LEVELS
+ rf.valid_power_levels = self.POWER_LEVELS
rf.valid_name_length = self.NAME_LENGTH
rf.valid_dtcs_codes = self.DTCS_CODES
rf.valid_bands = self.VALID_BANDS
@@ -624,7 +625,7 @@
mem.mode = _mem.wide and "FM" or "NFM"
- mem.power = POWER_LEVELS[_mem.power]
+ mem.power = self.POWER_LEVELS[_mem.power]
# Extra
mem.extra = RadioSettingGroup("extra", "Extra")
@@ -745,7 +746,7 @@
_mem.txtone = self._set_dcs(mem.dtcs)
_mem.wide = self.MODES.index(mem.mode)
- _mem.power = mem.power == POWER_LEVELS[1]
+ _mem.power = mem.power == self.POWER_LEVELS[1]
# Extra settings
for setting in mem.extra:
@@ -1440,9 +1441,22 @@
MODEL = "BJ-218"
+class Baojie218Upper(LT725UVUpper):
+ VENDOR = "Baojie"
+ MODEL = "BJ-218"
+
+
+class Baojie218Lower(LT725UVLower):
+ VENDOR = "Baojie"
+ MODEL = "BJ-218"
+
+
@directory.register
class Baojie218(LT725UV):
"""Baojie BJ-218"""
VENDOR = "Baojie"
MODEL = "BJ-218"
ALIASES = [Zastone, Hesenate, ]
+
+ def get_sub_devices(self):
+ return [Baojie218Upper(self._mmap), Baojie218Lower(self._mmap)]
1
0
[chirp_devel] Fwd: [PATCH 1 of 3] [LT-725UV] Fix for incorrect range specified for VFO B Initial Chan: setting
by Jim Unroe 12 Apr '21
by Jim Unroe 12 Apr '21
12 Apr '21
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Mon, Apr 12, 2021 at 12:29 PM
Subject: [PATCH 1 of 3] [LT-725UV] Fix for incorrect range specified
for VFO B Initial Chan: setting
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1618173934 14400
# Sun Apr 11 16:45:34 2021 -0400
# Node ID 9f38db094e0e56b31998f97abda4ca6f53572a0a
# Parent 42c5ae551170c33b04f997e3a07a9e1857bdb504
[LT-725UV] Fix for incorrect range specified for VFO B Initial Chan: setting
The Settings -> VFO B-Lower Settings -> Initial Chan:" setting currently
provies a selection range of 0-127. This range should be 1-128.
This patch updates the Initial Chan: seting to provide the correct range.
Models affected:
LUITON LT-725UV
Baojie BJ-218 / Hesenate BJ-218 / Zastone BJ-218
Fixes #8979
diff -r 42c5ae551170 -r 9f38db094e0e chirp/drivers/lt725uv.py
--- a/chirp/drivers/lt725uv.py Mon Apr 05 17:23:17 2021 -0700
+++ b/chirp/drivers/lt725uv.py Sun Apr 11 16:45:34 2021 -0400
@@ -1043,7 +1043,7 @@
val = _vfob.chan_num + 1
rs = RadioSetting("lower.vfob.chan_num", "Initial Chan",
- RadioSettingValueInteger(0, 127, val))
+ RadioSettingValueInteger(1, 128, val))
rs.set_apply_callback(my_adjraw, _vfob, "chan_num", -1)
b_band.append(rs)
1
0
Tested changes:
Changes for Build #910
[Jim Unroe <rock.unroe(a)gmail.com>] [RT76] Retevis RT76
This patch adds support for the Retevis RT76.
Related to #8959
[Jim Unroe <rock.unroe(a)gmail.com>] [RB26] Retevis RB26
This patch adds support for the Retevis RB26.
Related to #8661
[Jim Unroe <rock.unroe(a)gmail.com>] [RB17A] Retevis RB17A
This patch adds support for the Retevis RB17A.
Related to #8957
[Jim Unroe <rock.unroe(a)gmail.com>] [RT21] Driver Maintenance: retevis_rt21.py
This patch is prepare the driver for adding additional radio models.
1: fixes some incorrect code
2: reformats some code
3: allows CHIRP to make 5 attempts at putting radio into programming mode.
Other than for number 3, no features or settings have been added or removed from
this driver.
Related to #8957, #8661 and #8959
[Rick DeWitt <aa0rd(a)yahoo.com>] [icomciv] Add IC-7300 Live Mode support, Issue #4013
[Jim Unroe <rock.unroe(a)gmail.com>] [AT-778UV] Add support model variants that include VOX
This patch adds support for the new model variants that now include VOX:
Anytone AT-778UV VOX 3.0
Retevis RT95 VOX 2.0
fixes #8859
[Jim Unroe <rock.unroe(a)gmail.com>] [AT-778UV] Add anytone778uv.py driver to cpep8.manifext
This patch adds the anytone778uv.py driver to the cpep8.manifest in order to
enable style checking.
related to #8859
[Tom Hayward <tom(a)tomh.us>] [id880] Fix typo in charset definition. #281
[Tom Hayward <tom(a)tomh.us>] [thf6a] Support full charset (ASCII). Fixes #141
[Tom Hayward <tom(a)tomh.us>] [id880] Support full charset. Fixes #281
[Tom Hayward <tom(a)tomh.us>] [vx5] Support full charset (ASCII). Fixes #292
[Tom Hayward <tom(a)tomh.us>] [id31a] set used bit when creating new memory, clear when deleting. Fixes #269
[Tom Hayward <tom(a)tomh.us>] Support PyGTK < 2.22 in bank edit. Fixes #231
[Tom Hayward <tom(a)tomh.us>] [d710] [v71] [d72] Fix tone list (not all tones are supported). Fixes #212
[Dan Smith <dsmith(a)danplanet.com>] [vx7] Fix setting memory power levels on 220MHz band
Fixes #214
[Dan Smith <dsmith(a)danplanet.com>] fips: Pennsylvania FIPS code was wrong. #117
[Marco Filippi <iz3gme.marco(a)gmail.com>] Consider lower bound frequency of each valid_band as valid
Fix bug #181
[Tom Hayward <tom(a)tomh.us>] tmd700: allow 8-char names. Fixes #176
[Dan Smith <dsmith(a)danplanet.com>] Fix the "blind deletion" problem, as well as properly direct copy/paste
Fixes #172
[David Griffith <dave(a)661.org>] Bug #155 fix: VX-7 1.25m power levels
[David Griffith <dave(a)661.org>] New INSTALL and README files
Fixes #122
[Tom Hayward <tom(a)tomh.us>] thd72: only use hardware flow on OS X. Fixes #166
[Marco Filippi <iz3gme.marco(a)gmail.com>] [FT817] Tone freq not set correctly
Same as #88 for FT857, to avoid code duplication fix code have been moved from
ft857 to its ancestor class
Fix bug #163
[Tom Hayward <tom(a)tomh.us>] Fix Mac .app so paths with spaces work. Fixes Bug #145
Full log:
[...truncated 812 lines...]
test_copy_all (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D copy all ... ok
test_detect (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D detect ... ok
test_edges (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D edges ... ok
test_settings (tests.TestCase_QYTKT8900D)
Testing QYT KT8900D settings ... ok
test_banks (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G banks ... ok
test_brute_force (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G brute force ... ok
test_clone (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G clone ... ok
test_copy_all (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G copy all ... ok
test_detect (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G detect ... ok
test_edges (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G edges ... ok
test_settings (tests.TestCase_KenwoodTK760G)
Testing Kenwood TK-760G settings ... ok
test_banks (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 brute force ... ok
test_clone (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 clone ... ok
test_copy_all (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 copy all ... ok
test_detect (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 detect ... ok
test_edges (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 edges ... ok
test_settings (tests.TestCase_BaofengUVB5)
Testing Baofeng UV-B5 settings ... ok
test_banks (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 banks ... ok
test_brute_force (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 brute force ... ok
test_clone (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 clone ... ok
test_copy_all (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 copy all ... ok
test_detect (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 detect ... ok
test_edges (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 edges ... ok
test_settings (tests.TestCase_IcomICV82U82)
Testing Icom IC-V82/U82 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 brute force ... ok
test_clone (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 clone ... ok
test_copy_all (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 copy all ... ok
test_detect (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 detect ... ok
test_edges (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 edges ... ok
test_settings (tests.TestCase_BTECHGMRSV1)
Testing BTECH GMRS-V1 settings ... ok
test_banks (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 brute force ... ok
test_clone (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 clone ... ok
test_copy_all (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 copy all ... ok
test_detect (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 detect ... ok
test_edges (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 edges ... ok
test_settings (tests.TestCase_YaesuFT817)
Testing Yaesu FT-817 settings ... ok
test_banks (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 brute force ... ok
test_clone (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 clone ... ok
test_copy_all (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 copy all ... ok
test_detect (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 detect ... ok
test_edges (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 edges ... ok
test_settings (tests.TestCase_TYTTH7800)
Testing TYT TH-7800 settings ... ok
test_banks (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M brute force ... ok
test_clone (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M clone ... ok
test_copy_all (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M copy all ... ok
test_detect (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M detect ... ok
test_edges (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M edges ... ok
test_settings (tests.TestCase_YaesuFT1500M)
Testing Yaesu FT-1500M settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 banks ... ok
test_brute_force (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 brute force ... ok
test_clone (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 clone ... ok
test_copy_all (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 copy all ... ok
test_detect (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 detect ... ok
test_edges (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 edges ... ok
test_settings (tests.TestCase_YaesuVX7)
Testing Yaesu VX-7 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 brute force ... ok
test_clone (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 clone ... ok
test_copy_all (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 copy all ... ok
test_detect (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 detect ... ok
test_edges (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 edges ... ok
test_settings (tests.TestCase_RadioddityGA510)
Testing Radioddity GA-510 settings ... ok
test_banks (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 brute force ... ok
test_clone (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 clone ... ok
test_copy_all (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 copy all ... ok
test_detect (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 detect ... ok
test_edges (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 edges ... ok
test_settings (tests.TestCase_BaojieBJ9900)
Testing Baojie BJ-9900 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 brute force ... ok
test_clone (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 clone ... ok
test_copy_all (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 copy all ... ok
test_detect (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 detect ... ok
test_edges (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 edges ... ok
test_settings (tests.TestCase_KenwoodTK8102)
Testing Kenwood TK-8102 settings ... ok
test_banks (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A brute force ... ok
test_clone (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A clone ... ok
test_copy_all (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A copy all ... ok
test_detect (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A detect ... ok
test_edges (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A edges ... ok
test_settings (tests.TestCase_IcomICW32A)
Testing Icom IC-W32A settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 brute force ... ok
test_clone (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 clone ... ok
test_copy_all (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 copy all ... ok
test_detect (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 detect ... ok
test_edges (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 edges ... skipped 'No mutable memory locations found'
test_settings (tests.TestCase_BTECHMURSV1)
Testing BTECH MURS-V1 settings ... ok
test_banks (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND brute force ... ok
test_clone (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND clone ... ok
test_copy_all (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND copy all ... ok
test_detect (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND detect ... ok
test_edges (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND edges ... ok
test_settings (tests.TestCase_YaesuFT817ND)
Testing Yaesu FT-817ND settings ... ok
test_banks (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 brute force ... ok
test_clone (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 clone ... ok
test_copy_all (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 copy all ... ok
test_detect (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 detect ... ok
test_edges (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 edges ... ok
test_settings (tests.TestCase_TYTTH9800)
Testing TYT TH-9800 settings ... ok
test_banks (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M brute force ... ok
test_clone (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M clone ... ok
test_copy_all (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M copy all ... ok
test_detect (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M detect ... ok
test_edges (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M edges ... ok
test_settings (tests.TestCase_YaesuFT1802M)
Testing Yaesu FT-1802M settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_RadioddityR2)
Testing Radioddity R2 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RadioddityR2)
Testing Radioddity R2 brute force ... ok
test_clone (tests.TestCase_RadioddityR2)
Testing Radioddity R2 clone ... ok
test_copy_all (tests.TestCase_RadioddityR2)
Testing Radioddity R2 copy all ... ok
test_detect (tests.TestCase_RadioddityR2)
Testing Radioddity R2 detect ... ok
test_edges (tests.TestCase_RadioddityR2)
Testing Radioddity R2 edges ... ok
test_settings (tests.TestCase_RadioddityR2)
Testing Radioddity R2 settings ... ok
test_banks (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus brute force ... ok
test_clone (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus clone ... ok
test_copy_all (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus copy all ... ok
test_detect (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus detect ... ok
test_edges (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus edges ... ok
test_settings (tests.TestCase_BoblovX3Plus)
Testing Boblov X3Plus settings ... ok
test_banks (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) brute force ... ok
test_clone (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) clone ... ok
test_copy_all (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) copy all ... ok
test_detect (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) detect ... ok
test_edges (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) edges ... ok
test_settings (tests.TestCase_YaesuFT817NDUS)
Testing Yaesu FT-817ND (US) settings ... ok
test_banks (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E brute force ... ok
test_clone (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E clone ... ok
test_copy_all (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E copy all ... ok
test_detect (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E detect ... ok
test_edges (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E edges ... ok
test_settings (tests.TestCase_IcomICW32E)
Testing Icom IC-W32E settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 brute force ... ok
test_clone (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 clone ... ok
test_copy_all (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 copy all ... ok
test_detect (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 detect ... ok
test_edges (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 edges ... ok
test_settings (tests.TestCase_TYTTHUV3R25)
Testing TYT TH-UV3R-25 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR banks ... ok
test_brute_force (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR brute force ... ok
test_clone (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR clone ... ok
test_copy_all (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR copy all ... ok
test_detect (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR detect ... ok
test_edges (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR edges ... ok
test_settings (tests.TestCase_YaesuVX8DR)
Testing Yaesu VX-8DR settings ... ok
test_banks (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 brute force ... ok
test_clone (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 clone ... ok
test_copy_all (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 copy all ... ok
test_detect (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 detect ... ok
test_edges (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 edges ... ok
test_settings (tests.TestCase_BTECHUV2501220)
Testing BTECH UV-2501+220 settings ... ok
test_banks (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 brute force ... ok
test_clone (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 clone ... ok
test_copy_all (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 copy all ... ok
test_detect (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 detect ... ok
test_edges (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 edges ... ok
test_settings (tests.TestCase_KenwoodTK8180)
Testing Kenwood TK-8180 settings ... ok
test_banks (tests.TestCase_RadtelT18)
Testing Radtel T18 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RadtelT18)
Testing Radtel T18 brute force ... ok
test_clone (tests.TestCase_RadtelT18)
Testing Radtel T18 clone ... ok
test_copy_all (tests.TestCase_RadtelT18)
Testing Radtel T18 copy all ... ok
test_detect (tests.TestCase_RadtelT18)
Testing Radtel T18 detect ... ok
test_edges (tests.TestCase_RadtelT18)
Testing Radtel T18 edges ... ok
test_settings (tests.TestCase_RadtelT18)
Testing Radtel T18 settings ... ok
test_banks (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 brute force ... ok
test_clone (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 clone ... ok
test_copy_all (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 copy all ... ok
test_detect (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 detect ... ok
test_edges (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 edges ... ok
test_settings (tests.TestCase_YaesuFT818)
Testing Yaesu FT-818 settings ... ok
test_banks (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV brute force ... ok
test_clone (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV clone ... ok
test_copy_all (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV copy all ... ok
test_detect (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV detect ... ok
test_edges (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV edges ... ok
test_settings (tests.TestCase_CRTMicronUV)
Testing CRT Micron UV settings ... ok
test_banks (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R brute force ... ok
test_clone (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R clone ... ok
test_copy_all (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R copy all ... ok
test_detect (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R detect ... ok
test_edges (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R edges ... ok
test_settings (tests.TestCase_TYTTHUV3R)
Testing TYT TH-UV3R settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 brute force ... ok
test_clone (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 clone ... ok
test_copy_all (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 copy all ... ok
test_detect (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 detect ... ok
test_edges (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 edges ... ok
test_settings (tests.TestCase_BTECHUV25X2)
Testing BTECH UV-25X2 settings ... ok
test_banks (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A brute force ... ok
test_clone (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A clone ... ok
test_copy_all (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A copy all ... ok
test_detect (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A detect ... ok
test_edges (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A edges ... skipped 'No mutable memory locations found'
test_settings (tests.TestCase_RetevisRB17A)
Testing Retevis RB17A settings ... ok
test_banks (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 brute force ... ok
test_clone (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 clone ... ok
test_copy_all (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 copy all ... ok
test_detect (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 detect ... ok
test_edges (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 edges ... ok
test_settings (tests.TestCase_YaesuFT857897)
Testing Yaesu FT-857/897 settings ... ok
test_banks (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 brute force ... ok
test_clone (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 clone ... ok
test_copy_all (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 copy all ... ok
test_detect (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 detect ... ok
test_edges (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 edges ... ok
test_settings (tests.TestCase_TYTTHUV8000)
Testing TYT TH-UV8000 settings ... ok
test_banks (tests.TestCase_IcomID31A)
Testing Icom ID-31A banks ... ok
test_brute_force (tests.TestCase_IcomID31A)
Testing Icom ID-31A brute force ... ok
test_clone (tests.TestCase_IcomID31A)
Testing Icom ID-31A clone ... ok
test_copy_all (tests.TestCase_IcomID31A)
Testing Icom ID-31A copy all ... ok
test_detect (tests.TestCase_IcomID31A)
Testing Icom ID-31A detect ... ok
test_edges (tests.TestCase_IcomID31A)
Testing Icom ID-31A edges ... ok
test_settings (tests.TestCase_IcomID31A)
Testing Icom ID-31A settings ... ok
test_banks (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A brute force ... ok
test_clone (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A clone ... ok
test_copy_all (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A copy all ... ok
test_detect (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A detect ... ok
test_edges (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A edges ... ok
test_settings (tests.TestCase_FeidaxinFD268A)
Testing Feidaxin FD-268A settings ... ok
test_banks (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE banks ... ok
test_brute_force (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE brute force ... ok
test_clone (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE clone ... ok
test_copy_all (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE copy all ... ok
test_detect (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE detect ... ok
test_edges (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE edges ... ok
test_settings (tests.TestCase_YaesuVX8GE)
Testing Yaesu VX-8GE settings ... ok
test_banks (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D banks ... ok
test_brute_force (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D brute force ... ok
test_clone (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D clone ... ok
test_copy_all (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D copy all ... ok
test_detect (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D detect ... ok
test_edges (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D edges ... ok
test_settings (tests.TestCase_YaesuFT1D)
Testing Yaesu FT-1D settings ... ok
test_banks (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode brute force ... ok
test_clone (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode clone ... ok
test_copy_all (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode copy all ... ok
test_detect (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode detect ... ok
test_edges (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode edges ... ok
test_settings (tests.TestCase_KenwoodTMD710GCloneMode)
Testing Kenwood TM-D710G_CloneMode settings ... ok
test_banks (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 brute force ... ok
test_clone (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 clone ... ok
test_copy_all (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 copy all ... ok
test_detect (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 detect ... ok
test_edges (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 edges ... ok
test_settings (tests.TestCase_TYTTHUV88)
Testing TYT TH-UV88 settings ... ok
test_banks (tests.TestCase_RetevisRB26)
Testing Retevis RB26 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRB26)
Testing Retevis RB26 brute force ... ok
test_clone (tests.TestCase_RetevisRB26)
Testing Retevis RB26 clone ... ok
test_copy_all (tests.TestCase_RetevisRB26)
Testing Retevis RB26 copy all ... ok
test_detect (tests.TestCase_RetevisRB26)
Testing Retevis RB26 detect ... ok
test_edges (tests.TestCase_RetevisRB26)
Testing Retevis RB26 edges ... skipped 'No mutable memory locations found'
test_settings (tests.TestCase_RetevisRB26)
Testing Retevis RB26 settings ... ok
test_banks (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 brute force ... ok
test_clone (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 clone ... ok
test_copy_all (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 copy all ... ok
test_detect (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 detect ... ok
test_edges (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 edges ... ok
test_settings (tests.TestCase_BTECHUV25X4)
Testing BTECH UV-25X4 settings ... ok
test_banks (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) brute force ... ok
test_clone (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) clone ... ok
test_copy_all (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) copy all ... ok
test_detect (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) detect ... ok
test_edges (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) edges ... ok
test_settings (tests.TestCase_YaesuFT857897US)
Testing Yaesu FT-857/897 (US) settings ... ok
test_banks (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B brute force ... ok
test_clone (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B clone ... ok
test_copy_all (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B copy all ... ok
test_detect (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B detect ... ok
test_edges (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B edges ... ok
test_settings (tests.TestCase_FeidaxinFD268B)
Testing Feidaxin FD-268B settings ... ok
test_banks (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R banks ... ok
test_brute_force (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R brute force ... ok
test_clone (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R clone ... ok
test_copy_all (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R copy all ... ok
test_detect (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R detect ... ok
test_edges (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R edges ... ok
test_settings (tests.TestCase_YaesuFT25R)
Testing Yaesu FT-25R settings ... ok
test_banks (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R banks ... ok
test_brute_force (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R brute force ... ok
test_clone (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R clone ... ok
test_copy_all (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R copy all ... ok
test_detect (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R detect ... ok
test_edges (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R edges ... ok
test_settings (tests.TestCase_YaesuVX8R)
Testing Yaesu VX-8R settings ... ok
test_banks (tests.TestCase_RetevisRT1)
Testing Retevis RT1 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT1)
Testing Retevis RT1 brute force ... ok
test_clone (tests.TestCase_RetevisRT1)
Testing Retevis RT1 clone ... ok
test_copy_all (tests.TestCase_RetevisRT1)
Testing Retevis RT1 copy all ... ok
test_detect (tests.TestCase_RetevisRT1)
Testing Retevis RT1 detect ... ok
test_edges (tests.TestCase_RetevisRT1)
Testing Retevis RT1 edges ... ok
test_settings (tests.TestCase_RetevisRT1)
Testing Retevis RT1 settings ... ok
test_banks (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 brute force ... ok
test_clone (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 clone ... ok
test_copy_all (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 copy all ... ok
test_detect (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 detect ... ok
test_edges (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 edges ... ok
test_settings (tests.TestCase_TYTTHUVF1)
Testing TYT TH-UVF1 settings ... ok
test_banks (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode brute force ... ok
test_clone (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode clone ... ok
test_copy_all (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode copy all ... ok
test_detect (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode detect ... ok
test_edges (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode edges ... ok
test_settings (tests.TestCase_KenwoodTMD710CloneMode)
Testing Kenwood TM-D710_CloneMode settings ... ok
test_banks (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 brute force ... ok
test_clone (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 clone ... ok
test_copy_all (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 copy all ... ok
test_detect (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 detect ... ok
test_edges (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 edges ... ok
test_settings (tests.TestCase_BTECHUV5001)
Testing BTECH UV-5001 settings ... ok
test_banks (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 banks ... ok
test_brute_force (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 brute force ... ok
test_clone (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 clone ... ok
test_copy_all (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 copy all ... ok
test_detect (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 detect ... ok
test_edges (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 edges ... ok
test_settings (tests.TestCase_YaesuFT8800)
Testing Yaesu FT-8800 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B brute force ... ok
test_clone (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B clone ... ok
test_copy_all (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B copy all ... ok
test_detect (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B detect ... ok
test_edges (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B edges ... ok
test_settings (tests.TestCase_FeidaxinFD288B)
Testing Feidaxin FD-288B settings ... ok
test_banks (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M brute force ... ok
test_clone (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M clone ... ok
test_copy_all (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M copy all ... ok
test_detect (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M detect ... ok
test_edges (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M edges ... ok
test_settings (tests.TestCase_YaesuFT2800M)
Testing Yaesu FT-2800M settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_RetevisRT21)
Testing Retevis RT21 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT21)
Testing Retevis RT21 brute force ... ok
test_clone (tests.TestCase_RetevisRT21)
Testing Retevis RT21 clone ... ok
test_copy_all (tests.TestCase_RetevisRT21)
Testing Retevis RT21 copy all ... ok
test_detect (tests.TestCase_RetevisRT21)
Testing Retevis RT21 detect ... ok
test_edges (tests.TestCase_RetevisRT21)
Testing Retevis RT21 edges ... ok
test_settings (tests.TestCase_RetevisRT21)
Testing Retevis RT21 settings ... ok
test_banks (tests.TestCase_IcomID51)
Testing Icom ID-51 banks ... ok
test_brute_force (tests.TestCase_IcomID51)
Testing Icom ID-51 brute force ... ok
test_clone (tests.TestCase_IcomID51)
Testing Icom ID-51 clone ... ok
test_copy_all (tests.TestCase_IcomID51)
Testing Icom ID-51 copy all ... ok
test_detect (tests.TestCase_IcomID51)
Testing Icom ID-51 detect ... ok
test_edges (tests.TestCase_IcomID51)
Testing Icom ID-51 edges ... ok
test_settings (tests.TestCase_IcomID51)
Testing Icom ID-51 settings ... ok
test_banks (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 brute force ... ok
test_clone (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 clone ... ok
test_copy_all (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 copy all ... ok
test_detect (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 detect ... ok
test_edges (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 edges ... ok
test_settings (tests.TestCase_TYTTH9000144)
Testing TYT TH9000_144 settings ... ok
test_banks (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode brute force ... ok
test_clone (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode clone ... ok
test_copy_all (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode copy all ... ok
test_detect (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode detect ... ok
test_edges (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode edges ... ok
test_settings (tests.TestCase_KenwoodTS480CloneMode)
Testing Kenwood TS-480_CloneMode settings ... ok
test_banks (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 brute force ... ok
test_clone (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 clone ... ok
test_copy_all (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 copy all ... ok
test_detect (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 detect ... ok
test_edges (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 edges ... ok
test_settings (tests.TestCase_YaesuFT8900)
Testing Yaesu FT-8900 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_IcomIC208H)
Testing Icom IC-208H banks ... ok
test_brute_force (tests.TestCase_IcomIC208H)
Testing Icom IC-208H brute force ... ok
test_clone (tests.TestCase_IcomIC208H)
Testing Icom IC-208H clone ... ok
test_copy_all (tests.TestCase_IcomIC208H)
Testing Icom IC-208H copy all ... ok
test_detect (tests.TestCase_IcomIC208H)
Testing Icom IC-208H detect ... ok
test_edges (tests.TestCase_IcomIC208H)
Testing Icom IC-208H edges ... ok
test_settings (tests.TestCase_IcomIC208H)
Testing Icom IC-208H settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 brute force ... ok
test_clone (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 clone ... ok
test_copy_all (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 copy all ... ok
test_detect (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 detect ... ok
test_edges (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 edges ... ok
test_settings (tests.TestCase_BTECHUV50X2)
Testing BTECH UV-50X2 settings ... ok
test_banks (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R banks ... ok
test_brute_force (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R brute force ... ok
test_clone (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R clone ... ok
test_copy_all (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R copy all ... ok
test_detect (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R detect ... ok
test_edges (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R edges ... ok
test_settings (tests.TestCase_YaesuFT2900R1900R)
Testing Yaesu FT-2900R/1900R settings ... ok
test_banks (tests.TestCase_RetevisRT22)
Testing Retevis RT22 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT22)
Testing Retevis RT22 brute force ... ok
test_clone (tests.TestCase_RetevisRT22)
Testing Retevis RT22 clone ... ok
test_copy_all (tests.TestCase_RetevisRT22)
Testing Retevis RT22 copy all ... ok
test_detect (tests.TestCase_RetevisRT22)
Testing Retevis RT22 detect ... ok
test_edges (tests.TestCase_RetevisRT22)
Testing Retevis RT22 edges ... ok
test_settings (tests.TestCase_RetevisRT22)
Testing Retevis RT22 settings ... ok
test_banks (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 brute force ... ok
test_clone (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 clone ... ok
test_copy_all (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 copy all ... ok
test_detect (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 detect ... ok
test_edges (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 edges ... ok
test_settings (tests.TestCase_VertexStandardVXA700)
Testing Vertex Standard VXA-700 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode brute force ... ok
test_clone (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode clone ... ok
test_copy_all (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode copy all ... ok
test_detect (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode detect ... ok
test_edges (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode edges ... ok
test_settings (tests.TestCase_KenwoodTS590SGCloneMode)
Testing Kenwood TS-590SG_CloneMode settings ... ok
test_banks (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H brute force ... ok
test_clone (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H clone ... ok
test_copy_all (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H copy all ... ok
test_detect (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H detect ... ok
test_edges (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H edges ... ok
test_settings (tests.TestCase_IcomIC2100H)
Testing Icom IC-2100H settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS brute force ... ok
test_clone (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS clone ... ok
test_copy_all (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS copy all ... ok
test_detect (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS detect ... ok
test_edges (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS edges ... ok
test_settings (tests.TestCase_RetevisRT22FRS)
Testing Retevis RT22FRS settings ... ok
test_banks (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D brute force ... ok
test_clone (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D clone ... ok
test_copy_all (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D copy all ... ok
test_detect (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D detect ... ok
test_edges (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D edges ... ok
test_settings (tests.TestCase_YaesuFT450D)
Testing Yaesu FT-450D settings ... ok
test_banks (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus banks ... ok
test_brute_force (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus brute force ... ok
test_clone (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus clone ... ok
test_copy_all (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus copy all ... ok
test_detect (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus detect ... ok
test_edges (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus edges ... ok
test_settings (tests.TestCase_IcomID51Plus)
Testing Icom ID-51 Plus settings ... ok
test_banks (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 brute force ... ok
test_clone (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 clone ... ok
test_copy_all (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 copy all ... ok
test_detect (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 detect ... ok
test_edges (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 edges ... ok
test_settings (tests.TestCase_BTECHUV50X3)
Testing BTECH UV-50X3 settings ... ok
test_banks (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 brute force ... ok
test_clone (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 clone ... ok
test_copy_all (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 copy all ... ok
test_detect (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 detect ... ok
test_edges (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 edges ... ok
test_settings (tests.TestCase_WACCOMMINI8900)
Testing WACCOM MINI-8900 settings ... ok
test_banks (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV brute force ... ok
test_clone (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV clone ... ok
test_copy_all (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV copy all ... ok
test_detect (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV detect ... ok
test_edges (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV edges ... ok
test_settings (tests.TestCase_LUITONLT725UV)
Testing LUITON LT-725UV settings ... ok
test_banks (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H banks ... ok
test_brute_force (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H brute force ... ok
test_clone (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H clone ... ok
test_copy_all (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H copy all ... ok
test_detect (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H detect ... ok
test_edges (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H edges ... ok
test_settings (tests.TestCase_IcomIC2200H)
Testing Icom IC-2200H settings ... ok
test_banks (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D banks ... ok
test_brute_force (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D brute force ... ok
test_clone (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D clone ... ok
test_copy_all (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D copy all ... ok
test_detect (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D detect ... ok
test_edges (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D edges ... ok
test_settings (tests.TestCase_YaesuFT2D)
Testing Yaesu FT2D settings ... ok
test_banks (tests.TestCase_RetevisRT23)
Testing Retevis RT23 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT23)
Testing Retevis RT23 brute force ... ok
test_clone (tests.TestCase_RetevisRT23)
Testing Retevis RT23 clone ... ok
test_copy_all (tests.TestCase_RetevisRT23)
Testing Retevis RT23 copy all ... ok
test_detect (tests.TestCase_RetevisRT23)
Testing Retevis RT23 detect ... ok
test_edges (tests.TestCase_RetevisRT23)
Testing Retevis RT23 edges ... ok
test_settings (tests.TestCase_RetevisRT23)
Testing Retevis RT23 settings ... ok
test_banks (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR banks ... ok
test_brute_force (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR brute force ... ok
test_clone (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR clone ... ok
test_copy_all (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR copy all ... ok
test_detect (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR detect ... ok
test_edges (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR edges ... ok
test_settings (tests.TestCase_YaesuFT4VR)
Testing Yaesu FT-4VR settings ... ok
test_banks (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG brute force ... ok
test_clone (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG clone ... ok
test_copy_all (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG copy all ... ok
test_detect (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG detect ... ok
test_edges (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG edges ... ok
test_settings (tests.TestCase_AlincoDJG7EG)
Testing Alinco DJ-G7EG settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 brute force ... ok
test_clone (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 clone ... ok
test_copy_all (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 copy all ... ok
test_detect (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 detect ... ok
test_edges (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 edges ... ok
test_settings (tests.TestCase_BTECHUV5X3)
Testing BTECH UV-5X3 settings ... ok
test_banks (tests.TestCase_IcomID800H)
Testing Icom ID-800H banks ... ok
test_brute_force (tests.TestCase_IcomID800H)
Testing Icom ID-800H brute force ... ok
test_clone (tests.TestCase_IcomID800H)
Testing Icom ID-800H clone ... ok
test_copy_all (tests.TestCase_IcomID800H)
Testing Icom ID-800H copy all ... ok
test_detect (tests.TestCase_IcomID800H)
Testing Icom ID-800H detect ... ok
test_edges (tests.TestCase_IcomID800H)
Testing Icom ID-800H edges ... ok
test_settings (tests.TestCase_IcomID800H)
Testing Icom ID-800H settings ... ok
test_banks (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H banks ... ok
test_brute_force (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H brute force ... ok
test_clone (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H clone ... ok
test_copy_all (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H copy all ... ok
test_detect (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H detect ... ok
test_edges (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H edges ... ok
test_settings (tests.TestCase_IcomIC2300H)
Testing Icom IC-2300H settings ... ok
test_banks (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 brute force ... ok
test_clone (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 clone ... ok
test_copy_all (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 copy all ... ok
test_detect (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 detect ... ok
test_edges (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 edges ... ok
test_settings (tests.TestCase_WouxunKG816)
Testing Wouxun KG-816 settings ... ok
test_banks (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 brute force ... ok
test_clone (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 clone ... ok
test_copy_all (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 copy all ... ok
test_detect (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 detect ... ok
test_edges (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 edges ... ok
test_settings (tests.TestCase_LeixenVV898)
Testing Leixen VV-898 settings ... ok
test_banks (tests.TestCase_RetevisRT26)
Testing Retevis RT26 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT26)
Testing Retevis RT26 brute force ... ok
test_clone (tests.TestCase_RetevisRT26)
Testing Retevis RT26 clone ... ok
test_copy_all (tests.TestCase_RetevisRT26)
Testing Retevis RT26 copy all ... ok
test_detect (tests.TestCase_RetevisRT26)
Testing Retevis RT26 detect ... ERROR
test_edges (tests.TestCase_RetevisRT26)
Testing Retevis RT26 edges ... ok
test_settings (tests.TestCase_RetevisRT26)
Testing Retevis RT26 settings ... ok
test_banks (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE banks ... ok
test_brute_force (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE brute force ... ok
test_clone (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE clone ... ok
test_copy_all (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE copy all ... ok
test_detect (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE detect ... ok
test_edges (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE edges ... ok
test_settings (tests.TestCase_YaesuFT4XE)
Testing Yaesu FT-4XE settings ... ok
test_banks (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 brute force ... ok
test_clone (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 clone ... ok
test_copy_all (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 copy all ... ok
test_detect (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 detect ... ok
test_edges (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 edges ... ok
test_settings (tests.TestCase_BaofengBF888)
Testing Baofeng BF-888 settings ... ok
test_banks (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 brute force ... ok
test_clone (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 clone ... ok
test_copy_all (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 copy all ... ok
test_detect (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 detect ... ok
test_edges (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 edges ... ok
test_settings (tests.TestCase_AlincoDJ175)
Testing Alinco DJ175 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H banks ... ok
test_brute_force (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H brute force ... ok
test_clone (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H clone ... ok
test_copy_all (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H copy all ... ok
test_detect (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H detect ... ok
test_edges (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H edges ... ok
test_settings (tests.TestCase_IcomIC2720H)
Testing Icom IC-2720H settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 brute force ... ok
test_clone (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 clone ... ok
test_copy_all (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 copy all ... ok
test_detect (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 detect ... ok
test_edges (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 edges ... ok
test_settings (tests.TestCase_WouxunKG818)
Testing Wouxun KG-818 settings ... ok
test_banks (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D banks ... ok
test_brute_force (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D brute force ... ok
test_clone (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D clone ... ok
test_copy_all (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D copy all ... ok
test_detect (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D detect ... ok
test_edges (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D edges ... ok
test_settings (tests.TestCase_YaesuFT3D)
Testing Yaesu FT3D settings ... ok
test_banks (tests.TestCase_IcomID880H)
Testing Icom ID-880H banks ... ok
test_brute_force (tests.TestCase_IcomID880H)
Testing Icom ID-880H brute force ... ok
test_clone (tests.TestCase_IcomID880H)
Testing Icom ID-880H clone ... ok
test_copy_all (tests.TestCase_IcomID880H)
Testing Icom ID-880H copy all ... ok
test_detect (tests.TestCase_IcomID880H)
Testing Icom ID-880H detect ... ok
test_edges (tests.TestCase_IcomID880H)
Testing Icom ID-880H edges ... ok
test_settings (tests.TestCase_IcomID880H)
Testing Icom ID-880H settings ... ok
test_banks (tests.TestCase_RetevisRT622)
Testing Retevis RT622 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT622)
Testing Retevis RT622 brute force ... ok
test_clone (tests.TestCase_RetevisRT622)
Testing Retevis RT622 clone ... ok
test_copy_all (tests.TestCase_RetevisRT622)
Testing Retevis RT622 copy all ... ok
test_detect (tests.TestCase_RetevisRT622)
Testing Retevis RT622 detect ... ok
test_edges (tests.TestCase_RetevisRT622)
Testing Retevis RT622 edges ... ok
test_settings (tests.TestCase_RetevisRT622)
Testing Retevis RT622 settings ... ok
test_banks (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S brute force ... ok
test_clone (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S clone ... ok
test_copy_all (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S copy all ... ok
test_detect (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S detect ... ok
test_edges (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S edges ... ok
test_settings (tests.TestCase_LeixenVV898S)
Testing Leixen VV-898S settings ... ok
test_banks (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 brute force ... ok
test_clone (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 clone ... ok
test_copy_all (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 copy all ... ok
test_detect (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 detect ... ok
test_edges (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 edges ... ok
test_settings (tests.TestCase_AlincoDJ596)
Testing Alinco DJ596 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S brute force ... ok
test_clone (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S clone ... ok
test_copy_all (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S copy all ... ok
test_detect (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S detect ... ok
test_edges (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S edges ... ok
test_settings (tests.TestCase_BaofengBFA58S)
Testing Baofeng BF-A58S settings ... ok
test_banks (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR banks ... ok
test_brute_force (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR brute force ... ok
test_clone (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR clone ... ok
test_copy_all (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR copy all ... ok
test_detect (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR detect ... ok
test_edges (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR edges ... ok
test_settings (tests.TestCase_YaesuFT4XR)
Testing Yaesu FT-4XR settings ... ok
test_banks (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 brute force ... ok
test_clone (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 clone ... ok
test_copy_all (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 copy all ... ok
test_detect (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 detect ... ok
test_edges (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 edges ... ok
test_settings (tests.TestCase_WouxunKGUV6)
Testing Wouxun KG-UV6 settings ... ok
test_banks (tests.TestCase_RetevisRT76)
Testing Retevis RT76 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_RetevisRT76)
Testing Retevis RT76 brute force ... ok
test_clone (tests.TestCase_RetevisRT76)
Testing Retevis RT76 clone ... ok
test_copy_all (tests.TestCase_RetevisRT76)
Testing Retevis RT76 copy all ... ok
test_detect (tests.TestCase_RetevisRT76)
Testing Retevis RT76 detect ... ok
test_edges (tests.TestCase_RetevisRT76)
Testing Retevis RT76 edges ... skipped 'No mutable memory locations found'
test_settings (tests.TestCase_RetevisRT76)
Testing Retevis RT76 settings ... ok
test_banks (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A banks ... ok
test_brute_force (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A brute force ... ok
test_clone (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A clone ... ok
test_copy_all (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A copy all ... ok
test_detect (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A detect ... ok
test_edges (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A edges ... ok
test_settings (tests.TestCase_IcomIC2730A)
Testing Icom IC-2730A settings ... ok
test_banks (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M brute force ... ok
test_clone (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M clone ... ok
test_copy_all (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M copy all ... ok
test_detect (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M detect ... ok
test_edges (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M edges ... ok
test_settings (tests.TestCase_JetstreamJT220M)
Testing Jetstream JT220M settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 brute force ... ok
test_clone (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 clone ... ok
test_copy_all (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 copy all ... ok
test_detect (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 detect ... ok
test_edges (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 edges ... ok
test_settings (tests.TestCase_YaesuFT50)
Testing Yaesu FT-50 settings ... ok
test_banks (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D brute force ... ok
test_clone (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D clone ... ok
test_copy_all (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D copy all ... ok
test_detect (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D detect ... ok
test_edges (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D edges ... ok
test_settings (tests.TestCase_YaesuFTM3200D)
Testing Yaesu FTM-3200D settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D brute force ... ok
test_clone (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D clone ... ok
test_copy_all (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D copy all ... ok
test_detect (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D detect ... ok
test_edges (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D edges ... ok
test_settings (tests.TestCase_WouxunKGUV8D)
Testing Wouxun KG-UV8D settings ... ok
test_banks (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M brute force ... ok
test_clone (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M clone ... ok
test_copy_all (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M copy all ... ok
test_detect (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M detect ... ok
test_edges (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M edges ... ok
test_settings (tests.TestCase_JetstreamJT270M)
Testing Jetstream JT270M settings ... ok
test_banks (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 brute force ... ok
test_clone (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 clone ... ok
test_copy_all (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 copy all ... ok
test_detect (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 detect ... ok
test_edges (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 edges ... ok
test_settings (tests.TestCase_MidlandDBR2500)
Testing Midland DBR2500 settings ... ok
test_banks (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 banks ... ok
test_brute_force (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 brute force ... ok
test_clone (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 clone ... ok
test_copy_all (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 copy all ... ok
test_detect (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 detect ... ok
test_edges (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 edges ... ok
test_settings (tests.TestCase_YaesuFT60)
Testing Yaesu FT-60 settings ... ok
test_banks (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 brute force ... ok
test_clone (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 clone ... ok
test_copy_all (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 copy all ... ok
test_detect (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 detect ... ok
test_edges (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 edges ... ok
test_settings (tests.TestCase_YaesuFTM350)
Testing Yaesu FTM-350 settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH brute force ... ok
test_clone (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH clone ... ok
test_copy_all (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH copy all ... ok
test_detect (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH detect ... ok
test_edges (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH edges ... ok
test_settings (tests.TestCase_JetstreamJT270MH)
Testing Jetstream JT270MH settings ... ok
test_banks (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M brute force ... ok
test_clone (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M clone ... ok
test_copy_all (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M copy all ... ok
test_detect (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M detect ... ok
test_edges (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M edges ... ok
test_settings (tests.TestCase_PolmarDB50M)
Testing Polmar DB-50M settings ... ok
test_banks (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E banks ... ok
test_brute_force (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E brute force ... ok
test_clone (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E clone ... ok
test_copy_all (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E copy all ... ok
test_detect (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E detect ... ok
test_edges (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E edges ... ok
test_settings (tests.TestCase_YaesuFT65E)
Testing Yaesu FT-65E settings ... ok
test_banks (tests.TestCase_KYDIP620)
Testing KYD IP-620 banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_KYDIP620)
Testing KYD IP-620 brute force ... ok
test_clone (tests.TestCase_KYDIP620)
Testing KYD IP-620 clone ... ok
test_copy_all (tests.TestCase_KYDIP620)
Testing KYD IP-620 copy all ... ok
test_detect (tests.TestCase_KYDIP620)
Testing KYD IP-620 detect ... ok
test_edges (tests.TestCase_KYDIP620)
Testing KYD IP-620 edges ... ok
test_settings (tests.TestCase_KYDIP620)
Testing KYD IP-620 settings ... ok
test_banks (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D brute force ... ok
test_clone (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D clone ... ok
test_copy_all (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D copy all ... ok
test_detect (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D detect ... ok
test_edges (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D edges ... ok
test_settings (tests.TestCase_YaesuFTM7250D)
Testing Yaesu FTM-7250D settings ... skipped 'Settings not supported'
test_banks (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R banks ... skipped 'Banks not supported'
test_brute_force (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R brute force ... ok
test_clone (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R clone ... ok
test_copy_all (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R copy all ... ok
test_detect (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R detect ... ok
test_edges (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R edges ... ok
test_settings (tests.TestCase_PuxingPX2R)
Testing Puxing PX-2R settings ... skipped 'Settings not supported'
======================================================================
ERROR: test_detect (tests.TestCase_RetevisRT26)
Testing Retevis RT26 detect
----------------------------------------------------------------------
Traceback (most recent call last):
File "tests/__init__.py", line 68, in test_detect
self._runtest(run_tests.TestCaseDetect)
File "tests/__init__.py", line 42, in _runtest
failures = testcase.run()
File "tests/run_tests.py", line 879, in run
(self._wrapper._dstclass, radio.__class__))
TestFailedError: <class 'chirp.drivers.retevis_rt26.RT26Radio'> detected as <class 'chirp.drivers.retevis_rt21.RT21Radio'>
----------------------------------------------------------------------
Ran 1064 tests in 477.664s
FAILED (errors=1, skipped=148)
struct memory {
bbcd rx_freq[4];
bbcd tx_freq[4];
lbcd rx_tone[2];
lbcd tx_tone[2];
u8 unknown10:5,
highpower:1,
unknown11:2;
u8 unknown20:4,
narrow:1,
unknown21:3;
u8 unknown31:1,
scanadd:1,
unknown32:6;
u8 unknown4;
};
struct name {
char name[7];
};
#seekto 0x0010;
struct memory channels[128];
#seekto 0x08C0;
struct name names[128];
#seekto 0x2020;
struct memory vfo1;
struct memory vfo2;
ERROR: InvocationError for command /chirp/.tox/driver/bin/python -munittest -vb tests (exited with code 1)
style create: /chirp/.tox/style
style installdeps: pep8==1.6.2, future
style inst: /chirp/.tox/.tmp/package/1/chirp-0.3.0dev.zip
style installed: DEPRECATION: Python 2.7 will reach the end of its life on January 1st, 2020. Please upgrade your Python as Python 2.7 won't be maintained after that date. A future version of pip will drop support for Python 2.7.,chirp==0.3.0.dev0,configparser==3.7.4,contextlib2==0.5.5,filelock==3.0.12,future==0.15.2,importlib-metadata==0.18,Mako==1.0.3,MarkupSafe==0.23,mercurial==3.7.3,packaging==19.0,pathlib2==2.3.4,pep8==1.6.2,pluggy==0.12.0,py==1.8.0,pygobject==3.20.0,pyparsing==2.4.0,pyserial==3.0.1,scandir==1.10.0,six==1.12.0,toml==0.10.0,tox==3.13.2,virtualenv==16.6.1,zipp==0.5.2
style run-test-pre: PYTHONHASHSEED='3850205741'
style run-test: commands[0] | python ./tools/cpep8.py
___________________________________ summary ____________________________________
unit: commands succeeded
ERROR: driver: commands failed
style: commands succeeded
Build step 'Execute shell' marked build as failure
Email was triggered for: Failure
Sending email for trigger: Failure
3
3
Note: image files were attached to their respective patches.
Jim KC9HI
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Sat, Apr 3, 2021 at 8:59 PM
Subject: [PATCH 4 of 4] [RT76] Retevis RT76
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1617488266 14400
# Sat Apr 03 18:17:46 2021 -0400
# Node ID 35ce102f7e2d432b0ba6a30b580904ad816c846e
# Parent c11f6ae9ccfd9b306db3b5f1e7fe166364a822b0
[RT76] Retevis RT76
This patch adds support for the Retevis RT76.
Related to #8959
diff -r c11f6ae9ccfd -r 35ce102f7e2d chirp/drivers/retevis_rt21.py
--- a/chirp/drivers/retevis_rt21.py Sat Apr 03 18:13:37 2021 -0400
+++ b/chirp/drivers/retevis_rt21.py Sat Apr 03 18:17:46 2021 -0400
@@ -197,6 +197,48 @@
} settings3;
"""
+MEM_FORMAT_RT76 = """
+#seekto 0x0000;
+struct {
+ lbcd rxfreq[4]; // RX Frequency 0-3
+ lbcd txfreq[4]; // TX Frequency 4-7
+ ul16 rx_tone; // PL/DPL Decode 8-9
+ ul16 tx_tone; // PL/DPL Encode A-B
+ u8 compander:1, // Compander C
+ unknown1:1, //
+ highpower:1, // Power Level
+ wide:1, // Bandwidth
+ unknown2:4; //
+ u8 reserved[3]; // Reserved D-F
+} memory[30];
+
+#seekto 0x002D;
+struct {
+ u8 unknown_1:1, // 002D
+ chnumberd:1, // Channel Number Disable
+ gain:1, // MIC Gain ---
+ savem:1, // Battery Save Mode ---
+ save:1, // Battery Save ---
+ beep:1, // Beep ---
+ voice:2; // Voice Prompts ---
+ u8 squelch; // Squelch 002E ---
+ u8 tot; // Time-out Timer 002F ---
+ u8 channel_4[13]; // 0030-003C
+ u8 unused:7, // 003D
+ vox:1; // Vox ---
+ u8 voxl; // Vox Level 003E ---
+ u8 voxd; // Vox Delay 003F ---
+ u8 channel_5[13]; // 0040-004C
+ u8 unknown_4; // 004D
+ u8 unknown_5[2]; // 004E-004F
+ u8 channel_6[13]; // 0050-005C
+ u8 chnumber; // Channel Number 005D ---
+ u8 unknown_7[2]; // 005E-005F
+ u8 channel_7[13]; // 0060-006C
+ u8 warn; // 006D ---
+} settings;
+"""
+
CMD_ACK = "\x06"
ALARM_LIST = ["Local Alarm", "Remote Alarm"]
@@ -211,6 +253,7 @@
TOTALERT_LIST = ["Off"] + ["%s seconds" % x for x in range(1, 11)]
VOICE_LIST = ["Off", "Chinese", "English"]
VOICE_LIST2 = ["Off", "English"]
+VOICE_LIST3 = VOICE_LIST2 + ["Chinese"]
VOX_LIST = ["OFF"] + ["%s" % x for x in range(1, 17)]
VOXD_LIST = ["0.5", "1.0", "1.5", "2.0", "2.5", "3.0"]
VOXL_LIST = ["OFF"] + ["%s" % x for x in range(1, 9)]
@@ -232,6 +275,7 @@
"totalert": TOTALERT_LIST,
"voice": VOICE_LIST,
"voice": VOICE_LIST2,
+ "voice": VOICE_LIST3,
"vox": VOX_LIST,
"voxd": VOXD_LIST,
"voxl": VOXL_LIST,
@@ -253,7 +297,7 @@
exito = False
for i in range(0, 5):
serial.write(radio._magic)
- if radio.MODEL == "RB26":
+ if radio.MODEL == "RB26" or radio.MODEL == "RT76":
serial.read(1)
ack = serial.read(1)
@@ -387,7 +431,7 @@
status.cur = addr + radio.BLOCK_SIZE
radio.status_fn(status)
- if radio.MODEL == "RB26":
+ if radio.MODEL == "RB26" or radio.MODEL == "RT76":
block = _rb26_read_block(radio, addr, radio.BLOCK_SIZE)
else:
block = _read_block(radio, addr, radio.BLOCK_SIZE)
@@ -633,7 +677,7 @@
LOG.debug("Initializing empty memory")
if self.MODEL == "RB17A":
_mem.set_raw("\x00" * 13 + "\x04\xFF\xFF")
- if self.MODEL == "RB26":
+ if self.MODEL == "RB26" or self.MODEL == "RT76":
_mem.set_raw("\x00" * 13 + _rsvd)
else:
_mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
@@ -651,8 +695,9 @@
mem.power = self.POWER_LEVELS[_mem.highpower]
- mem.skip = "" if (_skp & bitpos) else "S"
- LOG.debug("mem.skip %s" % mem.skip)
+ if self.MODEL != "RT76":
+ mem.skip = "" if (_skp & bitpos) else "S"
+ LOG.debug("mem.skip %s" % mem.skip)
mem.extra = RadioSettingGroup("Extra", "extra")
@@ -671,10 +716,11 @@
rset = RadioSetting("cdcss", "Cdcss Mode", rs)
mem.extra.append(rset)
- if self.MODEL == "RB26":
- rs = RadioSettingValueBoolean(_mem.bcl)
- rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
- mem.extra.append(rset)
+ if self.MODEL == "RB26" or self.MODEL == "RT76":
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueBoolean(_mem.bcl)
+ rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
+ mem.extra.append(rset)
rs = RadioSettingValueBoolean(_mem.compander)
rset = RadioSetting("compander", "Compander", rs)
@@ -749,7 +795,7 @@
if mem.empty:
if self.MODEL == "RB17A":
_mem.set_raw("\xFF" * 12 + "\x00\x00\xFF\xFF")
- elif self.MODEL == "RB26":
+ elif self.MODEL == "RB26" or self.MODEL == "RT76":
_mem.set_raw("\xFF" * 13 + _rsvd)
else:
_mem.set_raw("\xFF" * (_mem.size() / 8))
@@ -773,7 +819,7 @@
if self.MODEL == "RB17A":
_mem.set_raw("\x00" * 13 + "\x00\xFF\xFF")
- elif self.MODEL == "RB26":
+ elif self.MODEL == "RB26" or self.MODEL == "RT76":
_mem.set_raw("\x00" * 13 + _rsvd)
else:
_mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
@@ -798,11 +844,12 @@
_mem.highpower = mem.power == self.POWER_LEVELS[1]
- if mem.skip != "S":
- _skp |= bitpos
- else:
- _skp &= ~bitpos
- LOG.debug("_skp %s" % _skp)
+ if self.MODEL != "RT76":
+ if mem.skip != "S":
+ _skp |= bitpos
+ else:
+ _skp &= ~bitpos
+ LOG.debug("_skp %s" % _skp)
for setting in mem.extra:
if setting.get_name() == "scramble_type":
@@ -894,9 +941,10 @@
rset.set_apply_callback(apply_topkey_listvalue, _keys.topkey)
basic.append(rset)
- if self.MODEL == "RB26":
- _settings2 = self._memobj.settings2
- _settings3 = self._memobj.settings3
+ if self.MODEL == "RB26" or self.MODEL == "RT76":
+ if self.MODEL == "RB26":
+ _settings2 = self._memobj.settings2
+ _settings3 = self._memobj.settings3
rs = RadioSettingValueInteger(0, 9, _settings.squelch)
rset = RadioSetting("squelch", "Squelch Level", rs)
@@ -907,14 +955,21 @@
rset = RadioSetting("tot", "Time-out timer", rs)
basic.append(rset)
- rs = RadioSettingValueList(VOICE_LIST2,
- VOICE_LIST2[_settings.voice])
- rset = RadioSetting("voice", "Voice Annumciation", rs)
- basic.append(rset)
+ if self.MODEL == "RT76":
+ rs = RadioSettingValueList(VOICE_LIST3,
+ VOICE_LIST3[_settings.voice])
+ rset = RadioSetting("voice", "Voice Annumciation", rs)
+ basic.append(rset)
- rs = RadioSettingValueBoolean(not _settings.chnumberd)
- rset = RadioSetting("chnumberd", "Channel Number Enable", rs)
- basic.append(rset)
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueList(VOICE_LIST2,
+ VOICE_LIST2[_settings.voice])
+ rset = RadioSetting("voice", "Voice Annumciation", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(not _settings.chnumberd)
+ rset = RadioSetting("chnumberd", "Channel Number Enable", rs)
+ basic.append(rset)
rs = RadioSettingValueBoolean(_settings.save)
rset = RadioSetting("save", "Battery Save", rs)
@@ -924,9 +979,10 @@
rset = RadioSetting("beep", "Beep", rs)
basic.append(rset)
- rs = RadioSettingValueBoolean(not _settings.tail)
- rset = RadioSetting("tail", "QT/DQT Tail", rs)
- basic.append(rset)
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueBoolean(not _settings.tail)
+ rset = RadioSetting("tail", "QT/DQT Tail", rs)
+ basic.append(rset)
rs = RadioSettingValueList(SAVE_LIST, SAVE_LIST[_settings.savem])
rset = RadioSetting("savem", "Battery Save Mode", rs)
@@ -940,29 +996,53 @@
rset = RadioSetting("warn", "Warn Mode", rs)
basic.append(rset)
- rs = RadioSettingValueBoolean(_settings3.vox)
- rset = RadioSetting("settings3.vox", "Vox Function", rs)
- basic.append(rset)
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueBoolean(_settings3.vox)
+ rset = RadioSetting("settings3.vox", "Vox Function", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(VOXL_LIST,
+ VOXL_LIST[_settings3.voxl])
+ rset = RadioSetting("settings3.voxl", "Vox Level", rs)
+ basic.append(rset)
- rs = RadioSettingValueList(VOXL_LIST, VOXL_LIST[_settings3.voxl])
- rset = RadioSetting("settings3.voxl", "Vox Level", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(VOXD_LIST,
+ VOXD_LIST[_settings3.voxd])
+ rset = RadioSetting("settings3.voxd", "Vox Delay", rs)
+ basic.append(rset)
- rs = RadioSettingValueList(VOXD_LIST, VOXD_LIST[_settings3.voxd])
- rset = RadioSetting("settings3.voxd", "Vox Delay", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(PFKEY_LIST,
+ PFKEY_LIST[_settings.pf1])
+ rset = RadioSetting("pf1", "PF1 Key Set", rs)
+ basic.append(rset)
- rs = RadioSettingValueList(PFKEY_LIST, PFKEY_LIST[_settings.pf1])
- rset = RadioSetting("pf1", "PF1 Key Set", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(PFKEY_LIST,
+ PFKEY_LIST[_settings.pf2])
+ rset = RadioSetting("pf2", "PF2 Key Set", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueInteger(1, 30, _settings2.chnumber + 1)
+ rset = RadioSetting("settings2.chnumber", "Channel Number", rs)
+ basic.append(rset)
+
+ if self.MODEL == "RT76":
+ rs = RadioSettingValueBoolean(_settings.vox)
+ rset = RadioSetting("vox", "Vox Function", rs)
+ basic.append(rset)
- rs = RadioSettingValueList(PFKEY_LIST, PFKEY_LIST[_settings.pf2])
- rset = RadioSetting("pf2", "PF2 Key Set", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(VOXL_LIST,
+ VOXL_LIST[_settings.voxl])
+ rset = RadioSetting("voxl", "Vox Level", rs)
+ basic.append(rset)
- rs = RadioSettingValueInteger(1, 30, _settings2.chnumber + 1)
- rset = RadioSetting("settings2.chnumber", "Channel Number", rs)
- basic.append(rset)
+ rs = RadioSettingValueList(VOXD_LIST,
+ VOXD_LIST[_settings.voxd])
+ rset = RadioSetting("voxd", "Vox Delay", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueInteger(1, 30, _settings.chnumber + 1)
+ rset = RadioSetting("chnumber", "Channel Number", rs)
+ basic.append(rset)
return top
@@ -1059,6 +1139,34 @@
def process_mmap(self):
self._memobj = bitwise.parse(MEM_FORMAT_RB26, self._mmap)
+
+(a)directory.register
+class RT76Radio(RT21Radio):
+ """RETEVIS RT76"""
+ VENDOR = "Retevis"
+ MODEL = "RT76"
+ BAUD_RATE = 9600
+ BLOCK_SIZE = 0x20
+ BLOCK_SIZE_UP = 0x10
+
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=0.50),
+ chirp_common.PowerLevel("High", watts=5.00)]
+
+ _magic = "PHOGR\x14\xD4"
+ _fingerprint = "P32073" + "\x02\xFF"
+ _upper = 30
+ _skipflags = False
+ _reserved = True
+ _gmrs = True
+
+ _ranges = [
+ (0x0000, 0x01E0),
+ ]
+ _memsize = 0x01E0
+
+ def process_mmap(self):
+ self._memobj = bitwise.parse(MEM_FORMAT_RT76, self._mmap)
+
@classmethod
def match_model(cls, filedata, filename):
if cls.MODEL == "RT21":
1
0
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Sat, Apr 3, 2021 at 8:59 PM
Subject: [PATCH 3 of 4] [RB26] Retevis RB26
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1617488017 14400
# Sat Apr 03 18:13:37 2021 -0400
# Node ID c11f6ae9ccfd9b306db3b5f1e7fe166364a822b0
# Parent 53ff4720769f9db27a2a0a56885aa505fef3da09
[RB26] Retevis RB26
This patch adds support for the Retevis RB26.
Related to #8661
diff -r 53ff4720769f -r c11f6ae9ccfd chirp/drivers/retevis_rt21.py
--- a/chirp/drivers/retevis_rt21.py Sat Apr 03 18:09:19 2021 -0400
+++ b/chirp/drivers/retevis_rt21.py Sat Apr 03 18:13:37 2021 -0400
@@ -135,16 +135,86 @@
u8 skipflags[4]; // Scan Add
"""
+MEM_FORMAT_RB26 = """
+#seekto 0x0000;
+struct {
+ lbcd rxfreq[4]; // RX Frequency 0-3
+ lbcd txfreq[4]; // TX Frequency 4-7
+ ul16 rx_tone; // PL/DPL Decode 8-9
+ ul16 tx_tone; // PL/DPL Encode A-B
+ u8 compander:1, // Compander C
+ unknown1:1, //
+ highpower:1, // Power Level
+ wide:1, // Bandwidth
+ bcl:1, // Busy Lock OFF=0 ON=1
+ unknown2:3; //
+ u8 reserved[3]; // Reserved D-F
+} memory[30];
+
+#seekto 0x002D;
+struct {
+ u8 unknown_1:1, // 002D
+ chnumberd:1, // Channel Number Disable
+ gain:1, // MIC Gain
+ savem:1, // Battery Save Mode
+ save:1, // Battery Save
+ beep:1, // Beep
+ voice:1, // Voice Prompts
+ unknown_2:1; //
+ u8 squelch; // Squelch 002E
+ u8 tot; // Time-out Timer 002F
+ u8 channel_4[13]; // 0030-003C
+ u8 unknown_3[3]; // 003D-003F
+ u8 channel_5[13]; // 0040-004C
+ u8 unknown_4; // 004D
+ u8 unknown_5[2]; // 004E-004F
+ u8 channel_6[13]; // 0050-005C
+ u8 unknown_6; // 005D
+ u8 unknown_7[2]; // 005E-005F
+ u8 channel_7[13]; // 0060-006C
+ u8 warn; // Warn Mode 006D
+ u8 pf1; // Key Set PF1 006E
+ u8 pf2; // Key Set PF2 006F
+ u8 channel_8[13]; // 0070-007C
+ u8 unknown_8; // 007D
+ u8 tail; // QT/DQT Tail(inverted) 007E
+} settings;
+
+#seekto 0x01F0;
+u8 skipflags[4]; // Scan Add
+
+#seekto 0x029F;
+struct {
+ u8 chnumber; // Channel Number 029F
+} settings2;
+
+#seekto 0x031D;
+struct {
+ u8 unused:7, // 031D
+ vox:1; // Vox
+ u8 voxl; // Vox Level 031E
+ u8 voxd; // Vox Delay 031F
+} settings3;
+"""
+
CMD_ACK = "\x06"
ALARM_LIST = ["Local Alarm", "Remote Alarm"]
BCL_LIST = ["Off", "Carrier", "QT/DQT"]
CDCSS_LIST = ["Normal Code", "Special Code 2", "Special Code 1"]
+GAIN_LIST = ["Standard", "Enhanced"]
+PFKEY_LIST = ["None", "Monitor", "Lamp", "Warn", "VOX", "VOX Delay",
+ "Key Lock", "Scan"]
+SAVE_LIST = ["Standard", "Super"]
SCRAMBLE_LIST = ["%s" % x for x in range(1, 9)]
TIMEOUTTIMER_LIST = ["%s seconds" % x for x in range(15, 615, 15)]
TOTALERT_LIST = ["Off"] + ["%s seconds" % x for x in range(1, 11)]
VOICE_LIST = ["Off", "Chinese", "English"]
+VOICE_LIST2 = ["Off", "English"]
VOX_LIST = ["OFF"] + ["%s" % x for x in range(1, 17)]
+VOXD_LIST = ["0.5", "1.0", "1.5", "2.0", "2.5", "3.0"]
+VOXL_LIST = ["OFF"] + ["%s" % x for x in range(1, 9)]
+WARN_LIST = ["OFF", "Native Warn", "Remote Warn"]
PF1_CHOICES = ["None", "Monitor", "Scan", "Scramble", "Alarm"]
PF1_VALUES = [0x0F, 0x04, 0x06, 0x08, 0x0C]
TOPKEY_CHOICES = ["None", "Alarming"]
@@ -154,11 +224,18 @@
"alarm": ALARM_LIST,
"bcl": BCL_LIST,
"cdcss": CDCSS_LIST,
+ "gain": GAIN_LIST,
+ "pfkey": PFKEY_LIST,
+ "save": SAVE_LIST,
"scramble": SCRAMBLE_LIST,
"tot": TIMEOUTTIMER_LIST,
"totalert": TOTALERT_LIST,
"voice": VOICE_LIST,
+ "voice": VOICE_LIST2,
"vox": VOX_LIST,
+ "voxd": VOXD_LIST,
+ "voxl": VOXL_LIST,
+ "warn": WARN_LIST,
}
GMRS_FREQS1 = [462.5625, 462.5875, 462.6125, 462.6375, 462.6625,
@@ -176,6 +253,8 @@
exito = False
for i in range(0, 5):
serial.write(radio._magic)
+ if radio.MODEL == "RB26":
+ serial.read(1)
ack = serial.read(1)
try:
@@ -246,6 +325,34 @@
return block_data
+def _rb26_read_block(radio, block_addr, block_size):
+ serial = radio.pipe
+
+ cmd = struct.pack(">cHb", 'R', block_addr, block_size)
+ expectedresponse = "W" + cmd[1:]
+ LOG.debug("Reading block %04x..." % (block_addr))
+
+ try:
+ serial.write(cmd)
+ response = serial.read(4 + block_size)
+ if response[:4] != expectedresponse:
+ raise Exception("Error reading block %04x." % (block_addr))
+
+ block_data = response[4:]
+
+ if block_addr != 0:
+ serial.write(CMD_ACK)
+ ack = serial.read(1)
+ except:
+ raise errors.RadioError("Failed to read block at %04x" % block_addr)
+
+ if block_addr != 0:
+ if ack != CMD_ACK:
+ raise Exception("No ACK reading block %04x." % (block_addr))
+
+ return block_data
+
+
def _write_block(radio, block_addr, block_size):
serial = radio.pipe
@@ -280,7 +387,10 @@
status.cur = addr + radio.BLOCK_SIZE
radio.status_fn(status)
- block = _read_block(radio, addr, radio.BLOCK_SIZE)
+ if radio.MODEL == "RB26":
+ block = _rb26_read_block(radio, addr, radio.BLOCK_SIZE)
+ else:
+ block = _read_block(radio, addr, radio.BLOCK_SIZE)
data += block
LOG.debug("Address: %04x" % addr)
@@ -504,6 +614,9 @@
else:
_mem = self._memobj.memory[number - 1]
+ if self._reserved:
+ _rsvd = _mem.reserved.get_raw()
+
mem.freq = int(_mem.rxfreq) * 10
# We'll consider any blank (i.e. 0MHz frequency) to be empty
@@ -520,6 +633,8 @@
LOG.debug("Initializing empty memory")
if self.MODEL == "RB17A":
_mem.set_raw("\x00" * 13 + "\x04\xFF\xFF")
+ if self.MODEL == "RB26":
+ _mem.set_raw("\x00" * 13 + _rsvd)
else:
_mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
@@ -556,6 +671,15 @@
rset = RadioSetting("cdcss", "Cdcss Mode", rs)
mem.extra.append(rset)
+ if self.MODEL == "RB26":
+ rs = RadioSettingValueBoolean(_mem.bcl)
+ rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
+ mem.extra.append(rset)
+
+ rs = RadioSettingValueBoolean(_mem.compander)
+ rset = RadioSetting("compander", "Compander", rs)
+ mem.extra.append(rset)
+
if self._gmrs:
GMRS_IMMUTABLE = ["freq", "duplex", "offset"]
if mem.number >= 8 and mem.number <= 14:
@@ -619,9 +743,14 @@
else:
_mem = self._memobj.memory[mem.number - 1]
+ if self._reserved:
+ _rsvd = _mem.reserved.get_raw()
+
if mem.empty:
if self.MODEL == "RB17A":
_mem.set_raw("\xFF" * 12 + "\x00\x00\xFF\xFF")
+ elif self.MODEL == "RB26":
+ _mem.set_raw("\xFF" * 13 + _rsvd)
else:
_mem.set_raw("\xFF" * (_mem.size() / 8))
@@ -644,6 +773,8 @@
if self.MODEL == "RB17A":
_mem.set_raw("\x00" * 13 + "\x00\xFF\xFF")
+ elif self.MODEL == "RB26":
+ _mem.set_raw("\x00" * 13 + _rsvd)
else:
_mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
@@ -763,6 +894,76 @@
rset.set_apply_callback(apply_topkey_listvalue, _keys.topkey)
basic.append(rset)
+ if self.MODEL == "RB26":
+ _settings2 = self._memobj.settings2
+ _settings3 = self._memobj.settings3
+
+ rs = RadioSettingValueInteger(0, 9, _settings.squelch)
+ rset = RadioSetting("squelch", "Squelch Level", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(TIMEOUTTIMER_LIST,
+ TIMEOUTTIMER_LIST[_settings.tot - 1])
+ rset = RadioSetting("tot", "Time-out timer", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(VOICE_LIST2,
+ VOICE_LIST2[_settings.voice])
+ rset = RadioSetting("voice", "Voice Annumciation", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(not _settings.chnumberd)
+ rset = RadioSetting("chnumberd", "Channel Number Enable", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(_settings.save)
+ rset = RadioSetting("save", "Battery Save", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(_settings.beep)
+ rset = RadioSetting("beep", "Beep", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(not _settings.tail)
+ rset = RadioSetting("tail", "QT/DQT Tail", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(SAVE_LIST, SAVE_LIST[_settings.savem])
+ rset = RadioSetting("savem", "Battery Save Mode", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(GAIN_LIST, GAIN_LIST[_settings.gain])
+ rset = RadioSetting("gain", "MIC Gain", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(WARN_LIST, WARN_LIST[_settings.warn])
+ rset = RadioSetting("warn", "Warn Mode", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(_settings3.vox)
+ rset = RadioSetting("settings3.vox", "Vox Function", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(VOXL_LIST, VOXL_LIST[_settings3.voxl])
+ rset = RadioSetting("settings3.voxl", "Vox Level", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(VOXD_LIST, VOXD_LIST[_settings3.voxd])
+ rset = RadioSetting("settings3.voxd", "Vox Delay", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(PFKEY_LIST, PFKEY_LIST[_settings.pf1])
+ rset = RadioSetting("pf1", "PF1 Key Set", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueList(PFKEY_LIST, PFKEY_LIST[_settings.pf2])
+ rset = RadioSetting("pf2", "PF2 Key Set", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueInteger(1, 30, _settings2.chnumber + 1)
+ rset = RadioSetting("settings2.chnumber", "Channel Number", rs)
+ basic.append(rset)
+
return top
def set_settings(self, settings):
@@ -787,6 +988,12 @@
element.run_apply_callback()
elif setting == "channel":
setattr(obj, setting, int(element.value) - 1)
+ elif setting == "chnumber":
+ setattr(obj, setting, int(element.value) - 1)
+ elif setting == "chnumberd":
+ setattr(obj, setting, not int(element.value))
+ elif setting == "tail":
+ setattr(obj, setting, not int(element.value))
elif setting == "tot":
setattr(obj, setting, int(element.value) + 1)
elif element.value.get_mutable():
@@ -824,6 +1031,34 @@
def process_mmap(self):
self._memobj = bitwise.parse(MEM_FORMAT_RB17A, self._mmap)
+
+(a)directory.register
+class RB26Radio(RT21Radio):
+ """RETEVIS RB26"""
+ VENDOR = "Retevis"
+ MODEL = "RB26"
+ BAUD_RATE = 9600
+ BLOCK_SIZE = 0x20
+ BLOCK_SIZE_UP = 0x10
+
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=0.50),
+ chirp_common.PowerLevel("High", watts=3.00)]
+
+ _magic = "PHOGR" + "\x01" + "0"
+ _fingerprint = "P32073" + "\x02\xFF"
+ _upper = 30
+ _skipflags = True
+ _reserved = True
+ _gmrs = True
+
+ _ranges = [
+ (0x0000, 0x0320),
+ ]
+ _memsize = 0x0320
+
+ def process_mmap(self):
+ self._memobj = bitwise.parse(MEM_FORMAT_RB26, self._mmap)
+
@classmethod
def match_model(cls, filedata, filename):
if cls.MODEL == "RT21":
1
0
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Sat, Apr 3, 2021 at 8:59 PM
Subject: [PATCH 2 of 4] [RB17A] Retevis RB17A
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1617487759 14400
# Sat Apr 03 18:09:19 2021 -0400
# Node ID 53ff4720769f9db27a2a0a56885aa505fef3da09
# Parent d292f6aff5e0687bff7cf839f5de3e3164fe9f41
[RB17A] Retevis RB17A
This patch adds support for the Retevis RB17A.
Related to #8957
diff -r d292f6aff5e0 -r 53ff4720769f chirp/drivers/retevis_rt21.py
--- a/chirp/drivers/retevis_rt21.py Sat Apr 03 18:05:05 2021 -0400
+++ b/chirp/drivers/retevis_rt21.py Sat Apr 03 18:09:19 2021 -0400
@@ -83,9 +83,63 @@
u8 skipflags[2]; // SCAN_ADD
"""
+MEM_FORMAT_RB17A = """
+struct memory {
+ lbcd rxfreq[4]; // 0-3
+ lbcd txfreq[4]; // 4-7
+ ul16 rx_tone; // 8-9
+ ul16 tx_tone; // A-B
+ u8 unknown1:1, // C
+ compander:1, // Compand
+ bcl:2, // Busy Channel Lock-out
+ cdcss:1, // Cdcss Mode
+ scramble_type:3; // Scramble Type
+ u8 unknown2:4, // D
+ middlepower:1, // Power Level-Middle
+ unknown3:1, //
+ highpower:1, // Power Level-High/Low
+ wide:1; // Bandwidth
+ u8 unknown4; // E
+ u8 unknown5; // F
+};
+
+#seekto 0x0010;
+ struct memory lomems[16];
+
+#seekto 0x0200;
+ struct memory himems[14];
+
+#seekto 0x011D;
+struct {
+ u8 pf1; // 011D PF1 Key
+ u8 topkey; // 011E Top Key
+} keys;
+
+#seekto 0x012C;
+struct {
+ u8 use_scramble; // 012C Scramble Enable
+ u8 channel; // 012D Channel Number
+ u8 alarm; // 012E Alarm Type
+ u8 voice; // 012F Voice Annunciation
+ u8 tot; // 0130 Time-out Timer
+ u8 totalert; // 0131 Time-out Timer Pre-alert
+ u8 unknown2[2];
+ u8 squelch; // 0134 Squelch Level
+ u8 save; // 0135 Battery Saver
+ u8 unknown3[3];
+ u8 use_vox; // 0139 VOX Enable
+ u8 vox; // 013A VOX Gain
+} settings;
+
+#seekto 0x017E;
+u8 skipflags[4]; // Scan Add
+"""
+
CMD_ACK = "\x06"
+ALARM_LIST = ["Local Alarm", "Remote Alarm"]
BCL_LIST = ["Off", "Carrier", "QT/DQT"]
+CDCSS_LIST = ["Normal Code", "Special Code 2", "Special Code 1"]
SCRAMBLE_LIST = ["%s" % x for x in range(1, 9)]
TIMEOUTTIMER_LIST = ["%s seconds" % x for x in range(15, 615, 15)]
TOTALERT_LIST = ["Off"] + ["%s seconds" % x for x in range(1, 11)]
@@ -93,9 +147,13 @@
VOX_LIST = ["OFF"] + ["%s" % x for x in range(1, 17)]
PF1_CHOICES = ["None", "Monitor", "Scan", "Scramble", "Alarm"]
PF1_VALUES = [0x0F, 0x04, 0x06, 0x08, 0x0C]
+TOPKEY_CHOICES = ["None", "Alarming"]
+TOPKEY_VALUES = [0xFF, 0x0C]
SETTING_LISTS = {
+ "alarm": ALARM_LIST,
"bcl": BCL_LIST,
+ "cdcss": CDCSS_LIST,
"scramble": SCRAMBLE_LIST,
"tot": TIMEOUTTIMER_LIST,
"totalert": TOTALERT_LIST,
@@ -103,6 +161,14 @@
"vox": VOX_LIST,
}
+GMRS_FREQS1 = [462.5625, 462.5875, 462.6125, 462.6375, 462.6625,
+ 462.6875, 462.7125]
+GMRS_FREQS2 = [467.5625, 467.5875, 467.6125, 467.6375, 467.6625,
+ 467.6875, 467.7125]
+GMRS_FREQS3 = [462.5500, 462.5750, 462.6000, 462.6250, 462.6500,
+ 462.6750, 462.7000, 462.7250]
+GMRS_FREQS = GMRS_FREQS1 + GMRS_FREQS2 + GMRS_FREQS3 * 2
+
def _enter_programming_mode(radio):
serial = radio.pipe
@@ -300,6 +366,52 @@
def process_mmap(self):
self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)
+ def validate_memory(self, mem):
+ msgs = ""
+ msgs = chirp_common.CloneModeRadio.validate_memory(self, mem)
+
+ _msg_freq = 'Memory location cannot change frequency'
+ _msg_simplex = 'Memory location only supports Duplex:(None)'
+ _msg_duplex = 'Memory location only supports Duplex: +'
+ _msg_offset = 'Memory location only supports Offset: 5.000000'
+ _msg_nfm = 'Memory location only supports Mode: NFM'
+ _msg_txp = 'Memory location only supports Power: Low'
+
+ # GMRS models
+ if self._gmrs:
+ # range of memories with values set by FCC rules
+ if mem.freq != int(GMRS_FREQS[mem.number - 1] * 1000000):
+ # warn user can't change frequency
+ msgs.append(chirp_common.ValidationError(_msg_freq))
+
+ # channels 1 - 22 are simplex only
+ if mem.number <= 22:
+ if str(mem.duplex) != "":
+ # warn user can't change duplex
+ msgs.append(chirp_common.ValidationError(_msg_simplex))
+
+ # channels 23 - 30 are +5 MHz duplex only
+ if mem.number >= 23:
+ if str(mem.duplex) != "+":
+ # warn user can't change duplex
+ msgs.append(chirp_common.ValidationError(_msg_duplex))
+
+ if str(mem.offset) != "5000000":
+ # warn user can't change offset
+ msgs.append(chirp_common.ValidationError(_msg_offset))
+
+ # channels 8 - 14 are low power NFM only
+ if mem.number >= 8 and mem.number <= 14:
+ if mem.mode != "NFM":
+ # warn user can't change mode
+ msgs.append(chirp_common.ValidationError(_msg_nfm))
+
+ if mem.power != "Low":
+ # warn user can't change power
+ msgs.append(chirp_common.ValidationError(_msg_txp))
+
+ return msgs
+
def sync_in(self):
"""Download from radio"""
try:
@@ -380,11 +492,18 @@
LOG.debug("bytepos %s" % bytepos)
_skp = self._memobj.skipflags[bytepos]
- _mem = self._memobj.memory[number - 1]
-
mem = chirp_common.Memory()
mem.number = number
+
+ if self.MODEL == "RB17A":
+ if mem.number < 17:
+ _mem = self._memobj.lomems[number - 1]
+ else:
+ _mem = self._memobj.himems[number - 17]
+ else:
+ _mem = self._memobj.memory[number - 1]
+
mem.freq = int(_mem.rxfreq) * 10
# We'll consider any blank (i.e. 0MHz frequency) to be empty
@@ -399,7 +518,10 @@
if _mem.get_raw() == ("\xFF" * 16):
LOG.debug("Initializing empty memory")
- _mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
+ if self.MODEL == "RB17A":
+ _mem.set_raw("\x00" * 13 + "\x04\xFF\xFF")
+ else:
+ _mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
if int(_mem.rxfreq) == int(_mem.txfreq):
mem.duplex = ""
@@ -419,7 +541,7 @@
mem.extra = RadioSettingGroup("Extra", "extra")
- if self.MODEL == "RT21":
+ if self.MODEL == "RT21" or self.MODEL == "RB17A":
rs = RadioSettingValueList(BCL_LIST, BCL_LIST[_mem.bcl])
rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
mem.extra.append(rset)
@@ -429,6 +551,18 @@
rset = RadioSetting("scramble_type", "Scramble Type", rs)
mem.extra.append(rset)
+ if self.MODEL == "RB17A":
+ rs = RadioSettingValueList(CDCSS_LIST, CDCSS_LIST[_mem.cdcss])
+ rset = RadioSetting("cdcss", "Cdcss Mode", rs)
+ mem.extra.append(rset)
+
+ if self._gmrs:
+ GMRS_IMMUTABLE = ["freq", "duplex", "offset"]
+ if mem.number >= 8 and mem.number <= 14:
+ mem.immutable = GMRS_IMMUTABLE + ["power", "mode"]
+ else:
+ mem.immutable = GMRS_IMMUTABLE
+
return mem
def _set_tone(self, mem, _mem):
@@ -477,13 +611,41 @@
LOG.debug("bytepos %s" % bytepos)
_skp = self._memobj.skipflags[bytepos]
- _mem = self._memobj.memory[mem.number - 1]
+ if self.MODEL == "RB17A":
+ if mem.number < 17:
+ _mem = self._memobj.lomems[mem.number - 1]
+ else:
+ _mem = self._memobj.himems[mem.number - 17]
+ else:
+ _mem = self._memobj.memory[mem.number - 1]
if mem.empty:
- _mem.set_raw("\xFF" * (_mem.size() / 8))
+ if self.MODEL == "RB17A":
+ _mem.set_raw("\xFF" * 12 + "\x00\x00\xFF\xFF")
+ else:
+ _mem.set_raw("\xFF" * (_mem.size() / 8))
+
+ if self._gmrs:
+ GMRS_FREQ = int(GMRS_FREQS[mem.number - 1] * 100000)
+ if mem.number > 22:
+ _mem.rxfreq = GMRS_FREQ
+ _mem.txfreq = int(_mem.rxfreq) + 500000
+ _mem.wide = True
+ else:
+ _mem.rxfreq = _mem.txfreq = GMRS_FREQ
+ if mem.number >= 8 and mem.number <= 14:
+ _mem.wide = False
+ _mem.highpower = False
+ else:
+ _mem.wide = True
+ _mem.highpower = True
+
return
- _mem.set_raw("\x00" * 13 + "\x00\x8F\xF8")
+ if self.MODEL == "RB17A":
+ _mem.set_raw("\x00" * 13 + "\x00\xFF\xFF")
+ else:
+ _mem.set_raw("\x00" * 13 + "\x30\x8F\xF8")
_mem.rxfreq = mem.freq / 10
@@ -523,7 +685,7 @@
basic = RadioSettingGroup("basic", "Basic Settings")
top = RadioSettings(basic)
- if self.MODEL == "RT21":
+ if self.MODEL == "RT21" or self.MODEL == "RB17A":
_keys = self._memobj.keys
rs = RadioSettingValueList(TIMEOUTTIMER_LIST,
@@ -544,6 +706,12 @@
rset = RadioSetting("voice", "Voice Annumciation", rs)
basic.append(rset)
+ if self.MODEL == "RB17A":
+ rs = RadioSettingValueList(ALARM_LIST,
+ ALARM_LIST[_settings.alarm])
+ rset = RadioSetting("alarm", "Alarm Type", rs)
+ basic.append(rset)
+
rs = RadioSettingValueBoolean(_settings.save)
rset = RadioSetting("save", "Battery Saver", rs)
basic.append(rset)
@@ -577,6 +745,24 @@
rset.set_apply_callback(apply_pf1_listvalue, _keys.pf1)
basic.append(rset)
+ def apply_topkey_listvalue(setting, obj):
+ LOG.debug("Setting value: " + str(setting.value) +
+ " from list")
+ val = str(setting.value)
+ index = TOPKEY_CHOICES.index(val)
+ val = TOPKEY_VALUES[index]
+ obj.set_value(val)
+
+ if self.MODEL == "RB17A":
+ if _keys.topkey in TOPKEY_VALUES:
+ idx = TOPKEY_VALUES.index(_keys.topkey)
+ else:
+ idx = TOPKEY_VALUES.index(0x0C)
+ rs = RadioSettingValueList(TOPKEY_CHOICES, TOPKEY_CHOICES[idx])
+ rset = RadioSetting("keys.topkey", "Top Key Function", rs)
+ rset.set_apply_callback(apply_topkey_listvalue, _keys.topkey)
+ basic.append(rset)
+
return top
def set_settings(self, settings):
@@ -599,6 +785,8 @@
if element.has_apply_callback():
LOG.debug("Using apply callback")
element.run_apply_callback()
+ elif setting == "channel":
+ setattr(obj, setting, int(element.value) - 1)
elif setting == "tot":
setattr(obj, setting, int(element.value) + 1)
elif element.value.get_mutable():
@@ -608,6 +796,34 @@
LOG.debug(element.get_name())
raise
+
+(a)directory.register
+class RB17ARadio(RT21Radio):
+ """RETEVIS RB17A"""
+ VENDOR = "Retevis"
+ MODEL = "RB17A"
+ BAUD_RATE = 9600
+ BLOCK_SIZE = 0x40
+ BLOCK_SIZE_UP = 0x10
+
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=0.50),
+ chirp_common.PowerLevel("High", watts=5.00)]
+
+ _magic = "PROA8US"
+ _fingerprint = "P3217s\xF8\xFF"
+ _upper = 30
+ _skipflags = True
+ _reserved = False
+ _gmrs = True
+
+ _ranges = [
+ (0x0000, 0x0300),
+ ]
+ _memsize = 0x0300
+
+ def process_mmap(self):
+ self._memobj = bitwise.parse(MEM_FORMAT_RB17A, self._mmap)
+
@classmethod
def match_model(cls, filedata, filename):
if cls.MODEL == "RT21":
1
0
[chirp_devel] Fwd: [PATCH 1 of 4] [RT21] Driver Maintenance: retevis_rt21.py
by Jim Unroe 04 Apr '21
by Jim Unroe 04 Apr '21
04 Apr '21
---------- Forwarded message ---------
From: Jim Unroe <kc9hi(a)comcast.net>
Date: Sat, Apr 3, 2021 at 8:59 PM
Subject: [PATCH 1 of 4] [RT21] Driver Maintenance: retevis_rt21.py
To: <Rock.Unroe(a)gmail.com>
# HG changeset patch
# User Jim Unroe <rock.unroe(a)gmail.com>
# Date 1617487505 14400
# Sat Apr 03 18:05:05 2021 -0400
# Node ID d292f6aff5e0687bff7cf839f5de3e3164fe9f41
# Parent b4e9bcbae55f10d09d7e385f402cad104ab56269
[RT21] Driver Maintenance: retevis_rt21.py
This patch is prepare the driver for adding additional radio models.
1: fixes some incorrect code
2: reformats some code
3: allows CHIRP to make 5 attempts at putting radio into programming mode.
Other than for number 3, no features or settings have been added or removed from
this driver.
Related to #8957, #8661 and #8959
diff -r b4e9bcbae55f -r d292f6aff5e0 chirp/drivers/retevis_rt21.py
--- a/chirp/drivers/retevis_rt21.py Thu Apr 01 12:39:47 2021 -0400
+++ b/chirp/drivers/retevis_rt21.py Sat Apr 03 18:05:05 2021 -0400
@@ -1,4 +1,4 @@
-# Copyright 2016 Jim Unroe <rock.unroe(a)gmail.com>
+# Copyright 2021 Jim Unroe <rock.unroe(a)gmail.com>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -18,72 +18,75 @@
import struct
import logging
-from chirp import chirp_common, directory, memmap
-from chirp import bitwise, errors, util
-from chirp.settings import RadioSetting, RadioSettingGroup, \
- RadioSettingValueInteger, RadioSettingValueList, \
- RadioSettingValueBoolean, RadioSettings
+from chirp import (
+ bitwise,
+ chirp_common,
+ directory,
+ errors,
+ memmap,
+ util,
+)
+from chirp.settings import (
+ RadioSetting,
+ RadioSettingGroup,
+ RadioSettings,
+ RadioSettingValueBoolean,
+ RadioSettingValueInteger,
+ RadioSettingValueList,
+ RadioSettingValueString,
+)
LOG = logging.getLogger(__name__)
MEM_FORMAT = """
#seekto 0x0010;
struct {
- lbcd rxfreq[4];
- lbcd txfreq[4];
- ul16 rx_tone;
- ul16 tx_tone;
- u8 unknown1:3,
- bcl:2, // Busy Lock
+ lbcd rxfreq[4]; // RX Frequency 0-3
+ lbcd txfreq[4]; // TX Frequency 4-7
+ ul16 rx_tone; // PL/DPL Decode 8-9
+ ul16 tx_tone; // PL/DPL Encode A-B
+ u8 unknown1:3, // C
+ bcl:2, // Busy Lock
unknown2:3;
- u8 unknown3:2,
- highpower:1, // Power Level
- wide:1, // Bandwidth
+ u8 unknown3:2, // D
+ highpower:1, // Power Level
+ wide:1, // Bandwidth
unknown4:4;
- u8 scramble_type:4,
+ u8 scramble_type:4, // Scramble Type E
unknown5:4;
u8 unknown6:4,
- scramble_type2:4;
+ scramble_type2:4; // Scramble Type 2 F
} memory[16];
#seekto 0x011D;
struct {
u8 unused:4,
- pf1:4; // Programmable Function Key 1
+ pf1:4; // Programmable Function Key 1
} keys;
#seekto 0x012C;
struct {
- u8 use_scramble; // Scramble Enable
+ u8 use_scramble; // Scramble Enable
u8 unknown1[2];
- u8 voice; // Voice Annunciation
- u8 tot; // Time-out Timer
- u8 totalert; // Time-out Timer Pre-alert
+ u8 voice; // Voice Annunciation
+ u8 tot; // Time-out Timer
+ u8 totalert; // Time-out Timer Pre-alert
u8 unknown2[2];
- u8 squelch; // Squelch Level
- u8 save; // Battery Saver
+ u8 squelch; // Squelch Level
+ u8 save; // Battery Saver
u8 unknown3[3];
- u8 use_vox; // VOX Enable
- u8 vox; // VOX Gain
+ u8 use_vox; // VOX Enable
+ u8 vox; // VOX Gain
} settings;
#seekto 0x017E;
-u8 skipflags[2]; // SCAN_ADD
+u8 skipflags[2]; // SCAN_ADD
"""
CMD_ACK = "\x06"
-BLOCK_SIZE = 0x10
-
-RT21_POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00),
- chirp_common.PowerLevel("High", watts=2.50)]
-
-
-RT21_DTCS = sorted(chirp_common.DTCS_CODES +
- [17, 50, 55, 135, 217, 254, 305, 645, 765])
BCL_LIST = ["Off", "Carrier", "QT/DQT"]
-SCRAMBLE_LIST = ["Scramble 1", "Scramble 2", "Scramble 3", "Scramble 4",
- "Scramble 5", "Scramble 6", "Scramble 7", "Scramble 8"]
+SCRAMBLE_LIST = ["%s" % x for x in range(1, 9)]
TIMEOUTTIMER_LIST = ["%s seconds" % x for x in range(15, 615, 15)]
TOTALERT_LIST = ["Off"] + ["%s seconds" % x for x in range(1, 11)]
VOICE_LIST = ["Off", "Chinese", "English"]
@@ -101,19 +104,27 @@
}
-def _rt21_enter_programming_mode(radio):
+def _enter_programming_mode(radio):
serial = radio.pipe
- try:
- serial.write("PRMZUNE")
+ exito = False
+ for i in range(0, 5):
+ serial.write(radio._magic)
ack = serial.read(1)
- except:
- raise errors.RadioError("Error communicating with radio")
- if not ack:
- raise errors.RadioError("No response from radio")
- elif ack != CMD_ACK:
- raise errors.RadioError("Radio refused to enter programming mode")
+ try:
+ if ack == CMD_ACK:
+ exito = True
+ break
+ except:
+ LOG.debug("Attempt #%s, failed, trying again" % i)
+ pass
+
+ # check if we had EXITO
+ if exito is False:
+ msg = "The radio did not accept program mode after five tries.\n"
+ msg += "Check you interface cable and power cycle your radio."
+ raise errors.RadioError(msg)
try:
serial.write("\x02")
@@ -121,7 +132,7 @@
except:
raise errors.RadioError("Error communicating with radio")
- if not ident.startswith("P3207"):
+ if not ident == radio._fingerprint:
LOG.debug(util.hexprint(ident))
raise errors.RadioError("Radio returned unknown identification string")
@@ -135,7 +146,7 @@
raise errors.RadioError("Radio refused to enter programming mode")
-def _rt21_exit_programming_mode(radio):
+def _exit_programming_mode(radio):
serial = radio.pipe
try:
serial.write("E")
@@ -143,16 +154,16 @@
raise errors.RadioError("Radio refused to exit programming mode")
-def _rt21_read_block(radio, block_addr, block_size):
+def _read_block(radio, block_addr, block_size):
serial = radio.pipe
- cmd = struct.pack(">cHb", 'R', block_addr, BLOCK_SIZE)
+ cmd = struct.pack(">cHb", 'R', block_addr, block_size)
expectedresponse = "W" + cmd[1:]
LOG.debug("Reading block %04x..." % (block_addr))
try:
serial.write(cmd)
- response = serial.read(4 + BLOCK_SIZE)
+ response = serial.read(4 + block_size)
if response[:4] != expectedresponse:
raise Exception("Error reading block %04x." % (block_addr))
@@ -169,11 +180,11 @@
return block_data
-def _rt21_write_block(radio, block_addr, block_size):
+def _write_block(radio, block_addr, block_size):
serial = radio.pipe
- cmd = struct.pack(">cHb", 'W', block_addr, BLOCK_SIZE)
- data = radio.get_mmap()[block_addr:block_addr + BLOCK_SIZE]
+ cmd = struct.pack(">cHb", 'W', block_addr, block_size)
+ data = radio.get_mmap()[block_addr:block_addr + block_size]
LOG.debug("Writing Data:")
LOG.debug(util.hexprint(cmd + data))
@@ -189,7 +200,7 @@
def do_download(radio):
LOG.debug("download")
- _rt21_enter_programming_mode(radio)
+ _enter_programming_mode(radio)
data = ""
@@ -199,17 +210,17 @@
status.cur = 0
status.max = radio._memsize
- for addr in range(0, radio._memsize, BLOCK_SIZE):
- status.cur = addr + BLOCK_SIZE
+ for addr in range(0, radio._memsize, radio.BLOCK_SIZE):
+ status.cur = addr + radio.BLOCK_SIZE
radio.status_fn(status)
- block = _rt21_read_block(radio, addr, BLOCK_SIZE)
+ block = _read_block(radio, addr, radio.BLOCK_SIZE)
data += block
LOG.debug("Address: %04x" % addr)
LOG.debug(util.hexprint(block))
- _rt21_exit_programming_mode(radio)
+ _exit_programming_mode(radio)
return memmap.MemoryMap(data)
@@ -218,18 +229,18 @@
status = chirp_common.Status()
status.msg = "Uploading to radio"
- _rt21_enter_programming_mode(radio)
+ _enter_programming_mode(radio)
status.cur = 0
status.max = radio._memsize
for start_addr, end_addr in radio._ranges:
- for addr in range(start_addr, end_addr, BLOCK_SIZE):
- status.cur = addr + BLOCK_SIZE
+ for addr in range(start_addr, end_addr, radio.BLOCK_SIZE_UP):
+ status.cur = addr + radio.BLOCK_SIZE_UP
radio.status_fn(status)
- _rt21_write_block(radio, addr, BLOCK_SIZE)
+ _write_block(radio, addr, radio.BLOCK_SIZE_UP)
- _rt21_exit_programming_mode(radio)
+ _exit_programming_mode(radio)
def model_match(cls, data):
@@ -245,6 +256,18 @@
VENDOR = "Retevis"
MODEL = "RT21"
BAUD_RATE = 9600
+ BLOCK_SIZE = 0x10
+ BLOCK_SIZE_UP = 0x10
+
+ POWER_LEVELS = [chirp_common.PowerLevel("Low", watts=1.00),
+ chirp_common.PowerLevel("High", watts=2.50)]
+
+ _magic = "PRMZUNE"
+ _fingerprint = "P3207s\xF8\xFF"
+ _upper = 16
+ _skipflags = True
+ _reserved = False
+ _gmrs = False
_ranges = [
(0x0000, 0x0400),
@@ -265,10 +288,10 @@
rf.valid_tmodes = ["", "Tone", "TSQL", "DTCS", "Cross"]
rf.valid_cross_modes = ["Tone->Tone", "Tone->DTCS", "DTCS->Tone",
"->Tone", "->DTCS", "DTCS->", "DTCS->DTCS"]
- rf.valid_power_levels = RT21_POWER_LEVELS
+ rf.valid_power_levels = self.POWER_LEVELS
rf.valid_duplexes = ["", "-", "+", "split", "off"]
rf.valid_modes = ["NFM", "FM"] # 12.5 KHz, 25 kHz.
- rf.memory_bounds = (1, 16)
+ rf.memory_bounds = (1, self._upper)
rf.valid_tuning_steps = [2.5, 5., 6.25, 10., 12.5, 25.]
rf.valid_bands = [(400000000, 480000000)]
@@ -278,11 +301,31 @@
self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)
def sync_in(self):
- self._mmap = do_download(self)
+ """Download from radio"""
+ try:
+ data = do_download(self)
+ except errors.RadioError:
+ # Pass through any real errors we raise
+ raise
+ except:
+ # If anything unexpected happens, make sure we raise
+ # a RadioError and log the problem
+ LOG.exception('Unexpected error during download')
+ raise errors.RadioError('Unexpected error communicating '
+ 'with the radio')
+ self._mmap = data
self.process_mmap()
def sync_out(self):
- do_upload(self)
+ """Upload to radio"""
+ try:
+ do_upload(self)
+ except:
+ # If anything unexpected happens, make sure we raise
+ # a RadioError and log the problem
+ LOG.exception('Unexpected error during upload')
+ raise errors.RadioError('Unexpected error communicating '
+ 'with the radio')
def get_raw_memory(self, number):
return repr(self._memobj.memory[number - 1])
@@ -330,13 +373,14 @@
(txmode, _mem.tx_tone, rxmode, _mem.rx_tone))
def get_memory(self, number):
- bitpos = (1 << ((number - 1) % 8))
- bytepos = ((number - 1) / 8)
- LOG.debug("bitpos %s" % bitpos)
- LOG.debug("bytepos %s" % bytepos)
+ if self._skipflags:
+ bitpos = (1 << ((number - 1) % 8))
+ bytepos = ((number - 1) / 8)
+ LOG.debug("bitpos %s" % bitpos)
+ LOG.debug("bytepos %s" % bytepos)
+ _skp = self._memobj.skipflags[bytepos]
_mem = self._memobj.memory[number - 1]
- _skp = self._memobj.skipflags[bytepos]
mem = chirp_common.Memory()
@@ -368,23 +412,22 @@
self._get_tone(_mem, mem)
- mem.power = RT21_POWER_LEVELS[_mem.highpower]
+ mem.power = self.POWER_LEVELS[_mem.highpower]
mem.skip = "" if (_skp & bitpos) else "S"
LOG.debug("mem.skip %s" % mem.skip)
mem.extra = RadioSettingGroup("Extra", "extra")
- rs = RadioSetting("bcl", "Busy Channel Lockout",
- RadioSettingValueList(
- BCL_LIST, BCL_LIST[_mem.bcl]))
- mem.extra.append(rs)
+ if self.MODEL == "RT21":
+ rs = RadioSettingValueList(BCL_LIST, BCL_LIST[_mem.bcl])
+ rset = RadioSetting("bcl", "Busy Channel Lockout", rs)
+ mem.extra.append(rset)
- rs = RadioSetting("scramble_type", "Scramble Type",
- RadioSettingValueList(SCRAMBLE_LIST,
- SCRAMBLE_LIST[
- _mem.scramble_type - 8]))
- mem.extra.append(rs)
+ rs = RadioSettingValueList(SCRAMBLE_LIST,
+ SCRAMBLE_LIST[_mem.scramble_type - 8])
+ rset = RadioSetting("scramble_type", "Scramble Type", rs)
+ mem.extra.append(rset)
return mem
@@ -427,13 +470,14 @@
(tx_mode, _mem.tx_tone, rx_mode, _mem.rx_tone))
def set_memory(self, mem):
- bitpos = (1 << ((mem.number - 1) % 8))
- bytepos = ((mem.number - 1) / 8)
- LOG.debug("bitpos %s" % bitpos)
- LOG.debug("bytepos %s" % bytepos)
+ if self._skipflags:
+ bitpos = (1 << ((mem.number - 1) % 8))
+ bytepos = ((mem.number - 1) / 8)
+ LOG.debug("bitpos %s" % bitpos)
+ LOG.debug("bytepos %s" % bytepos)
+ _skp = self._memobj.skipflags[bytepos]
_mem = self._memobj.memory[mem.number - 1]
- _skp = self._memobj.skipflags[bytepos]
if mem.empty:
_mem.set_raw("\xFF" * (_mem.size() / 8))
@@ -459,7 +503,7 @@
self._set_tone(mem, _mem)
- _mem.highpower = mem.power == RT21_POWER_LEVELS[1]
+ _mem.highpower = mem.power == self.POWER_LEVELS[1]
if mem.skip != "S":
_skp |= bitpos
@@ -475,65 +519,63 @@
setattr(_mem, setting.get_name(), setting.value)
def get_settings(self):
- _keys = self._memobj.keys
_settings = self._memobj.settings
basic = RadioSettingGroup("basic", "Basic Settings")
top = RadioSettings(basic)
- rs = RadioSetting("tot", "Time-out timer",
- RadioSettingValueList(
- TIMEOUTTIMER_LIST,
- TIMEOUTTIMER_LIST[_settings.tot - 1]))
- basic.append(rs)
+ if self.MODEL == "RT21":
+ _keys = self._memobj.keys
- rs = RadioSetting("totalert", "TOT Pre-alert",
- RadioSettingValueList(
- TOTALERT_LIST,
- TOTALERT_LIST[_settings.totalert]))
- basic.append(rs)
+ rs = RadioSettingValueList(TIMEOUTTIMER_LIST,
+ TIMEOUTTIMER_LIST[_settings.tot - 1])
+ rset = RadioSetting("tot", "Time-out timer", rs)
+ basic.append(rset)
- rs = RadioSetting("squelch", "Squelch Level",
- RadioSettingValueInteger(0, 9, _settings.squelch))
- basic.append(rs)
+ rs = RadioSettingValueList(TOTALERT_LIST,
+ TOTALERT_LIST[_settings.totalert])
+ rset = RadioSetting("totalert", "TOT Pre-alert", rs)
+ basic.append(rset)
- rs = RadioSetting("voice", "Voice Annumciation",
- RadioSettingValueList(
- VOICE_LIST, VOICE_LIST[_settings.voice]))
- basic.append(rs)
+ rs = RadioSettingValueInteger(0, 9, _settings.squelch)
+ rset = RadioSetting("squelch", "Squelch Level", rs)
+ basic.append(rset)
- rs = RadioSetting("save", "Battery Saver",
- RadioSettingValueBoolean(_settings.save))
- basic.append(rs)
+ rs = RadioSettingValueList(VOICE_LIST, VOICE_LIST[_settings.voice])
+ rset = RadioSetting("voice", "Voice Annumciation", rs)
+ basic.append(rset)
+
+ rs = RadioSettingValueBoolean(_settings.save)
+ rset = RadioSetting("save", "Battery Saver", rs)
+ basic.append(rset)
- rs = RadioSetting("use_scramble", "Scramble",
- RadioSettingValueBoolean(_settings.use_scramble))
- basic.append(rs)
+ rs = RadioSettingValueBoolean(_settings.use_scramble)
+ rset = RadioSetting("use_scramble", "Scramble", rs)
+ basic.append(rset)
- rs = RadioSetting("use_vox", "VOX",
- RadioSettingValueBoolean(_settings.use_vox))
- basic.append(rs)
+ rs = RadioSettingValueBoolean(_settings.use_vox)
+ rset = RadioSetting("use_vox", "VOX", rs)
+ basic.append(rset)
- rs = RadioSetting("vox", "VOX Gain",
- RadioSettingValueList(
- VOX_LIST, VOX_LIST[_settings.vox]))
- basic.append(rs)
+ rs = RadioSettingValueList(VOX_LIST, VOX_LIST[_settings.vox])
+ rset = RadioSetting("vox", "VOX Gain", rs)
+ basic.append(rset)
- def apply_pf1_listvalue(setting, obj):
- LOG.debug("Setting value: " + str(setting.value) + " from list")
- val = str(setting.value)
- index = PF1_CHOICES.index(val)
- val = PF1_VALUES[index]
- obj.set_value(val)
+ def apply_pf1_listvalue(setting, obj):
+ LOG.debug("Setting value: " + str(
+ setting.value) + " from list")
+ val = str(setting.value)
+ index = PF1_CHOICES.index(val)
+ val = PF1_VALUES[index]
+ obj.set_value(val)
- if _keys.pf1 in PF1_VALUES:
- idx = PF1_VALUES.index(_keys.pf1)
- else:
- idx = LIST_DTMF_SPECIAL_VALUES.index(0x04)
- rs = RadioSetting("keys.pf1", "PF1 Key Function",
- RadioSettingValueList(PF1_CHOICES,
- PF1_CHOICES[idx]))
- rs.set_apply_callback(apply_pf1_listvalue, _keys.pf1)
- basic.append(rs)
+ if _keys.pf1 in PF1_VALUES:
+ idx = PF1_VALUES.index(_keys.pf1)
+ else:
+ idx = LIST_DTMF_SPECIAL_VALUES.index(0x04)
+ rs = RadioSettingValueList(PF1_CHOICES, PF1_CHOICES[idx])
+ rset = RadioSetting("keys.pf1", "PF1 Key Function", rs)
+ rset.set_apply_callback(apply_pf1_listvalue, _keys.pf1)
+ basic.append(rset)
return top
@@ -568,17 +610,23 @@
@classmethod
def match_model(cls, filedata, filename):
- match_size = False
- match_model = False
+ if cls.MODEL == "RT21":
+ # The RT21 is pre-metadata, so do old-school detection
+ match_size = False
+ match_model = False
- # testing the file data size
- if len(filedata) in [0x0400, ]:
- match_size = True
+ # testing the file data size
+ if len(filedata) in [0x0400, ]:
+ match_size = True
- # testing the model fingerprint
- match_model = model_match(cls, filedata)
+ # testing the model fingerprint
+ match_model = model_match(cls, filedata)
- if match_size and match_model:
- return True
+ if match_size and match_model:
+ return True
+ else:
+ return False
else:
+ # Radios that have always been post-metadata, so never do
+ # old-school detection
return False
1
0