[chirp_devel] [PATCH] [BTECH] Add Basic Settings

Jim Unroe
Mon Apr 11 17:33:35 PDT 2016


# HG changeset patch
# User Jim Unroe <rock.unroe at gmail.com>
# Date 1460421134 14400
# Node ID eae0896c12a8e7a3f0c128f814a0539c7b5ba3b4
# Parent  3c0e8a9f2cc11c85fafc8007ff302d36c095f082
[BTECH] Add Basic Settings

Add settings from the OEM software "Optional Features" menu that are
related to the internal menus of these radios.

releated to #3015

diff -r 3c0e8a9f2cc1 -r eae0896c12a8 chirp/drivers/btech.py
--- a/chirp/drivers/btech.py	Mon Apr 11 19:46:03 2016 -0400
+++ b/chirp/drivers/btech.py	Mon Apr 11 20:32:14 2016 -0400
@@ -54,6 +54,50 @@
      pttid:2;
 } memory[200];
 
+#seekto 0x0E00;
+struct {
+  u8 tdr;
+  u8 unknown1;
+  u8 sql;
+  u8 unknown2[2];
+  u8 tot;
+  u8 apo;           // BTech radios use this as the Auto Power Off time
+                    // other radios use this as pre-Time Out Alert
+  u8 unknown3;
+  u8 abr;
+  u8 beep;
+  u8 unknown4[4];
+  u8 dtmfst;
+  u8 unknown5[2];
+  u8 prisc;
+  u8 prich;
+  u8 screv;
+  u8 unknown6[2];
+  u8 pttid;
+  u8 pttlt;
+  u8 unknown7;
+  u8 emctp;
+  u8 emcch;
+  u8 ringt;
+  u8 unknown8;
+  u8 camdf;
+  u8 cbmdf;
+  u8 sync;          // BTech radios use this as the display sync setting
+                    // other radios use this as the auto keypad lock setting
+  u8 ponmsg;
+  u8 wtled;
+  u8 rxled;
+  u8 txled;
+  u8 unknown9[5];
+  u8 anil;
+  u8 reps;
+  u8 repm;
+  u8 tdrab;
+  u8 ste;
+  u8 rpste;
+  u8 rptdl;
+} settings;
+
 #seekto 0x1000;
 struct {
   char name[6];
@@ -108,6 +152,22 @@
 OPTSIG_LIST = ["OFF", "DTMF", "2TONE", "5TONE"]
 SPMUTE_LIST = ["Tone/DTCS", "Tone/DTCS and Optsig", "Tone/DTCS or Optsig"]
 
+LIST_TOT = ["%s sec" % x for x in range(15, 615, 15)]
+LIST_TOA = ["Off"] + ["%s seconds" % x for x in range(1, 11)]
+LIST_APO = ["Off"] + ["%s minutes" % x for x in range(30, 330, 30)]
+LIST_ABR = ["Off"] + ["%s seconds" % x for x in range(1, 51)]
+LIST_DTMFST = ["OFF", "Keyboard", "ANI", "Keyboad + ANI"]
+LIST_SCREV = ["TO (timeout)", "CO (carrier operated)", "SE (search)"]
+LIST_EMCTP = ["TX alarm sound", "TX ANI", "Both"]
+LIST_RINGT = ["Off"] + ["%s seconds" % x for x in range(1, 10)]
+LIST_MDF = ["Frequency", "Channel", "Name"]
+LIST_PONMSG = ["Full", "Message", "Battery voltage"]
+LIST_COLOR = ["Off", "Blue", "Orange", "Purple"]
+LIST_REPS = ["1000 Hz", "1450 Hz", "1750 Hz", "2100Hz"]
+LIST_REPM = ["Off", "Carrier", "CTCSS or DCS", "Tone", "DTMF"]
+LIST_RPTDL = ["Off"] + ["%s ms" % x for x in range(1, 10)]
+LIST_ANIL = ["3", "4", "5"]
+
 # This is a general serial timeout for all serial read functions.
 # Practice has show that about 0.7 sec will be enough to cover all radios.
 STIMEOUT = 0.7
@@ -613,7 +673,7 @@
         global POWER_LEVELS
 
         rf = chirp_common.RadioFeatures()
-        rf.has_settings = False
+        rf.has_settings = True
         rf.has_bank = False
         rf.has_tuning_step = False
         rf.can_odd_split = True
@@ -932,6 +992,200 @@
 
         return mem
 
+    def get_settings(self):
+        """Translate the bit in the mem_struct into settings in the UI"""
+        _mem = self._memobj
+        basic = RadioSettingGroup("basic", "Basic Settings")
+        top = RadioSettings(basic)
+
+        # Basic
+        tdr = RadioSetting("settings.tdr", "Transceiver dual receive",
+                           RadioSettingValueBoolean(_mem.settings.tdr))
+        basic.append(tdr)
+
+        sql = RadioSetting("settings.sql", "Squelch level",
+                           RadioSettingValueInteger(0, 9, _mem.settings.sql))
+        basic.append(sql)
+
+        tot = RadioSetting("settings.tot", "Time out timer",
+                           RadioSettingValueList(LIST_TOT, LIST_TOT[
+                               _mem.settings.tot]))
+        basic.append(tot)
+
+        if self.MODEL in ("UV-2501", "UV-2501+220", "UV-5001"):
+            apo = RadioSetting("settings.apo", "Auto power off timer",
+                               RadioSettingValueList(LIST_APO, LIST_APO[
+                                   _mem.settings.apo]))
+            basic.append(apo)
+        else:
+            toa = RadioSetting("settings.apo", "Time out alert timer",
+                               RadioSettingValueList(LIST_TOA, LIST_TOA[
+                                   _mem.settings.apo]))
+            basic.append(toa)
+
+        abr = RadioSetting("settings.abr", "Backlight timer",
+                           RadioSettingValueList(LIST_ABR, LIST_ABR[
+                               _mem.settings.abr]))
+        basic.append(abr)
+
+        beep = RadioSetting("settings.beep", "Key beep",
+                            RadioSettingValueBoolean(_mem.settings.beep))
+        basic.append(beep)
+
+        dtmfst = RadioSetting("settings.dtmfst", "DTMF side tone",
+                              RadioSettingValueList(LIST_DTMFST, LIST_DTMFST[
+                                  _mem.settings.dtmfst]))
+        basic.append(dtmfst)
+
+        prisc = RadioSetting("settings.prisc", "Priority scan",
+                             RadioSettingValueBoolean(_mem.settings.prisc))
+        basic.append(prisc)
+
+        prich = RadioSetting("settings.prich", "Priority channel",
+                             RadioSettingValueInteger(0, 199,
+                                 _mem.settings.prich))
+        basic.append(prich)
+
+        screv = RadioSetting("settings.screv", "Scan resume method",
+                             RadioSettingValueList(LIST_SCREV, LIST_SCREV[
+                                 _mem.settings.screv]))
+        basic.append(screv)
+
+        pttlt = RadioSetting("settings.pttlt", "PTT transmit delay",
+                             RadioSettingValueInteger(0, 30, 
+                                 _mem.settings.pttlt))
+        basic.append(pttlt)
+
+        emctp = RadioSetting("settings.emctp", "Alarm mode",
+                             RadioSettingValueList(LIST_EMCTP, LIST_EMCTP[
+                                 _mem.settings.emctp]))
+        basic.append(emctp)
+
+        emcch = RadioSetting("settings.emcch", "Alarm channel",
+                             RadioSettingValueInteger(0, 199, 
+                                 _mem.settings.emcch))
+        basic.append(emcch)
+
+        ringt = RadioSetting("settings.ringt", "Ring time",
+                             RadioSettingValueList(LIST_RINGT, LIST_RINGT[
+                                 _mem.settings.ringt]))
+        basic.append(ringt)
+
+        camdf = RadioSetting("settings.camdf", "Display mode A",
+                             RadioSettingValueList(LIST_MDF, LIST_MDF[
+                                 _mem.settings.camdf]))
+        basic.append(camdf)
+
+        cbmdf = RadioSetting("settings.cbmdf", "Display mode B",
+                             RadioSettingValueList(LIST_MDF, LIST_MDF[
+                                 _mem.settings.cbmdf]))
+        basic.append(cbmdf)
+
+        if self.MODEL in ("UV-2501", "UV-2501+220", "UV-5001"):
+           sync = RadioSetting("settings.sync", "A/B channel sync",
+                               RadioSettingValueBoolean(_mem.settings.sync))
+           basic.append(sync)
+        else:
+           autolk = RadioSetting("settings.sync", "Auto keylock",
+                                 RadioSettingValueBoolean(_mem.settings.sync))
+           basic.append(autolk)
+
+        ponmsg = RadioSetting("settings.ponmsg", "Power-on message",
+                              RadioSettingValueList(LIST_PONMSG, LIST_PONMSG[
+                                  _mem.settings.ponmsg]))
+        basic.append(ponmsg)
+
+        wtled = RadioSetting("settings.wtled", "Standby backlight Color",
+                             RadioSettingValueList(LIST_COLOR, LIST_COLOR[
+                                 _mem.settings.wtled]))
+        basic.append(wtled)
+
+        rxled = RadioSetting("settings.rxled", "RX backlight Color",
+                             RadioSettingValueList(LIST_COLOR, LIST_COLOR[
+                                 _mem.settings.rxled]))
+        basic.append(rxled)
+
+        txled = RadioSetting("settings.txled", "TX backlight Color",
+                             RadioSettingValueList(LIST_COLOR, LIST_COLOR[
+                                 _mem.settings.txled]))
+        basic.append(txled)
+
+        anil = RadioSetting("settings.anil", "ANI length",
+                            RadioSettingValueList(LIST_ANIL, LIST_ANIL[
+                                _mem.settings.anil]))
+        basic.append(anil)
+
+        reps = RadioSetting("settings.reps", "Relay signal (tone burst)",
+                            RadioSettingValueList(LIST_REPS, LIST_REPS[
+                                _mem.settings.reps]))
+        basic.append(reps)
+
+        repm = RadioSetting("settings.repm", "Relay condition",
+                            RadioSettingValueList(LIST_REPM, LIST_REPM[
+                                _mem.settings.repm]))
+        basic.append(repm)
+
+        if self.MODEL in ("UV-2501", "UV-2501+220", "UV-5001"):
+            tdrab = RadioSetting("settings.tdrab", "TDR return time",
+                                 RadioSettingValueList(LIST_ABR, LIST_ABR[
+                                     _mem.settings.tdrab]))
+            basic.append(tdrab)
+
+            ste = RadioSetting("settings.ste", "Squelch tail eliminate",
+                               RadioSettingValueBoolean(_mem.settings.ste))
+            basic.append(ste)
+
+            rpste = RadioSetting("settings.rpste", "Repeater STE",
+                                 RadioSettingValueList(LIST_RINGT, LIST_RINGT[
+                                     _mem.settings.rpste]))
+            basic.append(rpste)
+
+            rptdl = RadioSetting("settings.rptdl", "Repeater STE delay",
+                                 RadioSettingValueList(LIST_RPTDL, LIST_RPTDL[
+                                     _mem.settings.rptdl]))
+            basic.append(rptdl)
+
+        return top
+
+    def set_settings(self, settings):
+        _settings = self._memobj.settings
+        for element in settings:
+            if not isinstance(element, RadioSetting):
+                if element.get_name() == "fm_preset":
+                    self._set_fm_preset(element)
+                else:
+                    self.set_settings(element)
+                    continue
+            else:
+                try:
+                    name = element.get_name()
+                    if "." in name:
+                        bits = name.split(".")
+                        obj = self._memobj
+                        for bit in bits[:-1]:
+                            if "/" in bit:
+                                bit, index = bit.split("/", 1)
+                                index = int(index)
+                                obj = getattr(obj, bit)[index]
+                            else:
+                                obj = getattr(obj, bit)
+                        setting = bits[-1]
+                    else:
+                        obj = _settings
+                        setting = element.get_name()
+
+                    if element.has_apply_callback():
+                        LOG.debug("Using apply callback")
+                        element.run_apply_callback()
+                    elif setting == "vfomr":
+                        setattr(obj, setting, not int(element.value))
+                    elif element.value.get_mutable():
+                        LOG.debug("Setting %s = %s" % (setting, element.value))
+                        setattr(obj, setting, element.value)
+                except Exception, e:
+                    LOG.debug(element.get_name())
+                    raise
+
     @classmethod
     def match_model(cls, filedata, filename):
         match_size = False



More information about the chirp_devel mailing list