[chirp_devel] [PATCH] [UV-5X3] Add DTMF Settings (RX and TX) to BTech UV-5X3
Jim Unroe
Sun Sep 4 08:43:15 PDT 2016
# HG changeset patch
# User Jim Unroe <rock.unroe at gmail.com>
# Date 1473003258 14400
# Node ID 6400db5ca2b420af20aacbeee51ef766d63c3d76
# Parent 75cb01b8fb0d0a0f523db839a1eb876839861050
[UV-5X3] Add DTMF Settings (RX and TX) to BTech UV-5X3
This patch exposes the structures and adds DTMF related settings:
- PTT-ID codes
- ANI settings and codes
- Master and Vice control IDs
- Control settings and codes (Inspection, Monitor, Stun, Kill, Revive)
- other DTMF related settings
related to #3931
diff -r 75cb01b8fb0d -r 6400db5ca2b4 chirp/drivers/uv5x3.py
--- a/chirp/drivers/uv5x3.py Sat Sep 03 19:54:58 2016 -0400
+++ b/chirp/drivers/uv5x3.py Sun Sep 04 11:34:18 2016 -0400
@@ -50,12 +50,14 @@
LIST_ALMOD = ["Site", "Tone", "Code"]
LIST_BANDWIDTH = ["Wide", "Narrow"]
LIST_COLOR = ["Off", "Blue", "Orange", "Purple"]
+LIST_DELAYPROCTIME = ["%s ms" % x for x in range(100, 4100, 100)]
LIST_DTMFSPEED = ["%s ms" % x for x in range(50, 2010, 10)]
LIST_DTMFST = ["Off", "DT-ST", "ANI-ST", "DT+ANI"]
LIST_MODE = ["Channel", "Name", "Frequency"]
LIST_OFF1TO9 = ["Off"] + list("123456789")
LIST_OFF1TO10 = LIST_OFF1TO9 + ["10"]
LIST_OFFAB = ["Off"] + LIST_AB
+LIST_RESETTIME = ["%s ms" % x for x in range(100, 16100, 100)]
LIST_RESUME = ["TO", "CO", "SE"]
LIST_PONMSG = ["Full", "Message"]
LIST_PTTID = ["Off", "BOT", "EOT", "Both"]
@@ -146,6 +148,53 @@
pttid:2;
} memory[128];
+ #seekto 0x0B00;
+ struct {
+ u8 code[16];
+ } pttid[15];
+
+ #seekto 0x0C80;
+ struct {
+ u8 inspection[8];
+ u8 monitor[8];
+ u8 alarmcode[8];
+ u8 stun[8];
+ u8 kill[8];
+ u8 revive[8];
+ u8 code[7];
+ u8 unknown06;
+ u8 dtmfon;
+ u8 dtmfoff;
+ u8 unused00:6,
+ aniid:2;
+ u8 unknown07[5];
+ u8 masterid[5];
+ u8 unknown08[3];
+ u8 viceid[5];
+ u8 unknown09[3];
+ u8 unused01:7,
+ mastervice:1;
+ u8 unused02:3,
+ mrevive:1,
+ mkill:1,
+ mstun:1,
+ mmonitor:1,
+ minspection:1;
+ u8 unused03:3,
+ vrevive:1,
+ vkill:1,
+ vstun:1,
+ vmonitor:1,
+ vinspection:1;
+ u8 unused04:6,
+ txdisable:1,
+ rxdisable:1;
+ u8 groupcode;
+ u8 spacecode;
+ u8 delayproctime;
+ u8 resettime;
+ } ani;
+
#seekto 0x0E20;
struct {
u8 unused00:4,
@@ -368,8 +417,11 @@
other = RadioSettingGroup("other", "Other Settings")
work = RadioSettingGroup("work", "Work Mode Settings")
fm_preset = RadioSettingGroup("fm_preset", "FM Preset")
+ dtmfe = RadioSettingGroup("dtmfe", "DTMF Encode Settings")
+ dtmfd = RadioSettingGroup("dtmfd", "DTMF Decode Settings")
service = RadioSettingGroup("service", "Service Settings")
- top = RadioSettings(basic, advanced, other, work, fm_preset, service)
+ top = RadioSettings(basic, advanced, other, work, fm_preset, dtmfe,
+ dtmfd, service)
# Basic settings
if _mem.settings.squelch > 0x09:
@@ -826,6 +878,259 @@
RadioSettingValueFloat(65, 108.0, preset, 0.1, 1))
fm_preset.append(rs)
+ # DTMF encode settings
+ for i in range(0, 15):
+ _codeobj = self._memobj.pttid[i].code
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 16, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("pttid/%i.code" % i,
+ "Signal Code %i" % (i + 1), val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 16):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.code = code
+ rs.set_apply_callback(apply_code, self._memobj.pttid[i])
+ dtmfe.append(rs)
+
+ if _mem.ani.dtmfon > 0xC3:
+ val = 0x03
+ else:
+ val = _mem.ani.dtmfon
+ rs = RadioSetting("ani.dtmfon", "DTMF Speed (on)",
+ RadioSettingValueList(LIST_DTMFSPEED,
+ LIST_DTMFSPEED[val]))
+ dtmfe.append(rs)
+
+ if _mem.ani.dtmfoff > 0xC3:
+ val = 0x03
+ else:
+ val = _mem.ani.dtmfoff
+ rs = RadioSetting("ani.dtmfoff", "DTMF Speed (off)",
+ RadioSettingValueList(LIST_DTMFSPEED,
+ LIST_DTMFSPEED[val]))
+ dtmfe.append(rs)
+
+ _codeobj = self._memobj.ani.code
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 7, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.code", "ANI Code", val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 7):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.code = code
+ rs.set_apply_callback(apply_code, self._memobj.ani)
+ dtmfe.append(rs)
+
+ rs = RadioSetting("ani.aniid", "When to send ANI ID",
+ RadioSettingValueList(LIST_PTTID,
+ LIST_PTTID[_mem.ani.aniid]))
+ dtmfe.append(rs)
+
+ # DTMF decode settings
+ rs = RadioSetting("ani.mastervice", "Master and Vice ID",
+ RadioSettingValueBoolean(_mem.ani.mastervice))
+ dtmfd.append(rs)
+
+ _codeobj = _mem.ani.masterid
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 5, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.masterid", "Master Control ID", val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 5):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.masterid = code
+ rs.set_apply_callback(apply_code, self._memobj.ani)
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.minspection", "Master Inspection",
+ RadioSettingValueBoolean(_mem.ani.minspection))
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.mmonitor", "Master Monitor",
+ RadioSettingValueBoolean(_mem.ani.mmonitor))
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.mstun", "Master Stun",
+ RadioSettingValueBoolean(_mem.ani.mstun))
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.mkill", "Master Kill",
+ RadioSettingValueBoolean(_mem.ani.mkill))
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.mrevive", "Master Revive",
+ RadioSettingValueBoolean(_mem.ani.mrevive))
+ dtmfd.append(rs)
+
+ _codeobj = _mem.ani.viceid
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 5, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.viceid", "Vice Control ID", val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 5):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.viceid = code
+ rs.set_apply_callback(apply_code, self._memobj.ani)
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.vinspection", "Vice Inspection",
+ RadioSettingValueBoolean(_mem.ani.vinspection))
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.vmonitor", "Vice Monitor",
+ RadioSettingValueBoolean(_mem.ani.vmonitor))
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.vstun", "Vice Stun",
+ RadioSettingValueBoolean(_mem.ani.vstun))
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.vkill", "Vice Kill",
+ RadioSettingValueBoolean(_mem.ani.vkill))
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.vrevive", "Vice Revive",
+ RadioSettingValueBoolean(_mem.ani.vrevive))
+ dtmfd.append(rs)
+
+ _codeobj = _mem.ani.inspection
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 8, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.inspection", "Inspection Code", val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 8):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.inspection = code
+ rs.set_apply_callback(apply_code, self._memobj.ani)
+ dtmfd.append(rs)
+
+ _codeobj = _mem.ani.monitor
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 8, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.monitor", "Monitor Code", val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 8):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.monitor = code
+ rs.set_apply_callback(apply_code, self._memobj.ani)
+ dtmfd.append(rs)
+
+ _codeobj = _mem.ani.alarmcode
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 8, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.alarm", "Alarm Code", val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 8):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.alarmcode = code
+ rs.set_apply_callback(apply_code, self._memobj.ani)
+ dtmfd.append(rs)
+
+ _codeobj = _mem.ani.stun
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 8, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.stun", "Stun Code", val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 8):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.stun = code
+ rs.set_apply_callback(apply_code, self._memobj.ani)
+ dtmfd.append(rs)
+
+ _codeobj = _mem.ani.kill
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 8, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.kill", "Kill Code", val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 8):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.kill = code
+ rs.set_apply_callback(apply_code, self._memobj.ani)
+ dtmfd.append(rs)
+
+ _codeobj = _mem.ani.revive
+ _code = "".join([DTMF_CHARS[x] for x in _codeobj if int(x) < 0x1F])
+ val = RadioSettingValueString(0, 8, _code, False)
+ val.set_charset(DTMF_CHARS)
+ rs = RadioSetting("ani.revive", "Revive Code", val)
+
+ def apply_code(setting, obj):
+ code = []
+ for j in range(0, 8):
+ try:
+ code.append(DTMF_CHARS.index(str(setting.value)[j]))
+ except IndexError:
+ code.append(0xFF)
+ obj.revive = code
+ rs.set_apply_callback(apply_code, self._memobj.ani)
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.resettime", "Reset Time",
+ RadioSettingValueList(LIST_RESETTIME,
+ LIST_RESETTIME[
+ _mem.ani.resettime]))
+ dtmfd.append(rs)
+
+ rs = RadioSetting("ani.delayproctime", "Delay Processing Time",
+ RadioSettingValueList(LIST_DELAYPROCTIME,
+ LIST_DELAYPROCTIME[
+ _mem.ani.delayproctime]))
+ dtmfd.append(rs)
+
# Service settings
for band in ["vhf", "uhf"]:
for index in range(0, 10):
More information about the chirp_devel
mailing list