# HG changeset patch
# User Jim Unroe <rock.unroe@gmail.com>
# Date 1385499658 18000
# Node ID 68dcf5898ba38f087d9a543256ef71828c24f650
# Parent fc6b4cd40403f4bb3f2b9bc3578366fdf20a85c6
[UV-3R] Add Basic Settings
expose basic settings fields in memmap
add Basic Settings tab
add Basic Settings and other associated support
related to #1267
diff -r fc6b4cd40403 -r 68dcf5898ba3 chirp/baofeng_uv3r.py
--- a/chirp/baofeng_uv3r.py Sun Nov 17 11:15:47 2013 -0800
+++ b/chirp/baofeng_uv3r.py Tue Nov 26 16:00:58 2013 -0500
@@ -19,6 +19,10 @@
import os
from chirp import util, chirp_common, bitwise, errors, directory
from chirp.wouxun_common import do_download, do_upload
+from chirp.settings import RadioSetting, RadioSettingGroup, \
+ RadioSettingValueBoolean, RadioSettingValueList, \
+ RadioSettingValueInteger, RadioSettingValueString, \
+ RadioSettingValueFloat
if os.getenv("CHIRP_DEBUG"):
DEBUG = True
@@ -88,6 +92,29 @@
u8 unknown;
lbcd tx_freq[4];
} tx_memory[99];
+
+#seekto 0x07C2;
+struct {
+ u8 squelch;
+ u8 vox;
+ u8 timeout;
+ u8 save:1,
+ unknown_1:1,
+ dw:1,
+ ste:1,
+ beep:1,
+ unknown_2:1,
+ bclo:1,
+ ch_flag:1;
+ u8 backlight:2,
+ relaym:1,
+ scanm:1,
+ pri:1,
+ unknown_3:3;
+ u8 unknown_4[3];
+ u8 pri_ch;
+} settings;
+
#seekto 0x0810;
struct {
lbcd rx_freq[4];
@@ -113,6 +140,18 @@
} names[128];
"""
+STEPS = [5.0, 6.25, 10.0, 12.5, 20.0, 25.0]
+STEP_LIST = [str(x) for x in STEPS]
+BACKLIGHT_LIST = ["Off", "Key", "Continuous"]
+TIMEOUT_LIST = ["Off"] + ["%s sec" % x for x in range(30, 210, 30)]
+SCANM_LIST = ["TO", "CO"]
+PRI_CH_LIST = ["Off"] + ["%s" % x for x in range(1, 100)]
+CH_FLAG_LIST = ["Freq Mode", "Channel Mode"]
+POWER_LIST = ["Low", "High"]
+BANDWIDTH_LIST = ["Narrow", "Wide"]
+DUPLEX_LIST = ["Off", "-", "+"]
+STE_LIST = ["On", "Off"]
+
UV3R_DUPLEX = ["", "-", "+", ""]
UV3R_POWER_LEVELS = [chirp_common.PowerLevel("High", watts=2.00),
chirp_common.PowerLevel("Low", watts=0.50)]
@@ -126,6 +165,7 @@
def get_features(self):
rf = chirp_common.RadioFeatures()
+ rf.has_settings = True
rf.valid_tmodes = ["", "Tone", "TSQL", "DTCS", "Cross"]
rf.valid_modes = ["FM", "NFM"]
rf.valid_power_levels = UV3R_POWER_LEVELS
@@ -282,6 +322,108 @@
self._set_memory(mem, _tmem)
self._set_memory(mem, _rmem)
+ def get_settings(self):
+ basic = RadioSettingGroup("basic", "Basic Settings")
+ group = RadioSettingGroup("top", "All Settings", basic)
+
+ rs = RadioSetting("squelch", "Squelch Level",
+ RadioSettingValueInteger(0, 9, self._memobj.settings.squelch))
+ basic.append(rs)
+
+ rs = RadioSetting("backlight", "LCD Back Light",
+ RadioSettingValueList(BACKLIGHT_LIST,
+ BACKLIGHT_LIST[self._memobj.settings.backlight]))
+ basic.append(rs)
+
+ rs = RadioSetting("beep", "Keypad Beep",
+ RadioSettingValueBoolean(self._memobj.settings.beep))
+ basic.append(rs)
+
+ rs = RadioSetting("vox", "VOX Level (0=OFF)",
+ RadioSettingValueInteger(0, 9, self._memobj.settings.vox))
+ basic.append(rs)
+
+ rs = RadioSetting("dw", "Dual Watch",
+ RadioSettingValueBoolean(self._memobj.settings.dw))
+ basic.append(rs)
+
+ rs = RadioSetting("ste", "Squelch Tail Eliminate",
+ RadioSettingValueList(STE_LIST,
+ STE_LIST[self._memobj.settings.ste]))
+ basic.append(rs)
+
+ rs = RadioSetting("save", "Battery Saver",
+ RadioSettingValueBoolean(self._memobj.settings.save))
+ basic.append(rs)
+
+ rs = RadioSetting("timeout", "Time Out Timer",
+ RadioSettingValueList(TIMEOUT_LIST,
+ TIMEOUT_LIST[self._memobj.settings.timeout]))
+ basic.append(rs)
+
+ rs = RadioSetting("scanm", "Scan Mode",
+ RadioSettingValueList(SCANM_LIST,
+ SCANM_LIST[self._memobj.settings.scanm]))
+ basic.append(rs)
+
+ rs = RadioSetting("relaym", "Repeater Sound Response",
+ RadioSettingValueBoolean(self._memobj.settings.relaym))
+ basic.append(rs)
+
+ rs = RadioSetting("bclo", "Busy Channel Lock Out",
+ RadioSettingValueBoolean(self._memobj.settings.bclo))
+ basic.append(rs)
+
+ rs = RadioSetting("pri", "Priority Channel Scanning",
+ RadioSettingValueBoolean(self._memobj.settings.pri))
+ basic.append(rs)
+
+ rs = RadioSetting("pri_ch", "Priority Channel",
+ RadioSettingValueList(PRI_CH_LIST,
+ PRI_CH_LIST[self._memobj.settings.pri_ch]))
+ basic.append(rs)
+
+ rs = RadioSetting("ch_flag", "Display Mode",
+ RadioSettingValueList(CH_FLAG_LIST,
+ CH_FLAG_LIST[self._memobj.settings.ch_flag]))
+ basic.append(rs)
+
+ return group
+
+ def set_settings(self, settings):
+ _settings = self._memobj.settings
+ for element in settings:
+ if not isinstance(element, RadioSetting):
+ self.set_settings(element)
+ continue
+ else:
+ try:
+ name = element.get_name()
+ if "." in name:
+ bits = name.split(".")
+ obj = self._memobj
+ for bit in bits[:-1]:
+ if "/" in bit:
+ bit, index = bit.split("/", 1)
+ index = int(index)
+ obj = getattr(obj, bit)[index]
+ else:
+ obj = getattr(obj, bit)
+ setting = bits[-1]
+ else:
+ obj = _settings
+ setting = element.get_name()
+
+ if element.has_apply_callback():
+ print "Using apply callback"
+ element.run_apply_callback()
+ else:
+ print "Setting %s = %s" % (setting, element.value)
+ setattr(obj, setting, element.value)
+ except Exception, e:
+ print element.get_name()
+ raise
+
@classmethod
def match_model(cls, filedata, filename):
return len(filedata) == 3648