[chirp_devel] [PATCH] Settings support added to IC-V80 driver. Fixes #174

Kosta A.
Tue Sep 28 13:07:23 PDT 2021


# HG changeset patch
# User Kosta A. <ve7kcy at gmail.com>
# Date 1632859623 25200
#      Tue Sep 28 13:07:03 2021 -0700
# Branch icom
# Node ID 8a801f6e14388614d4456466af77f847d52cac27
# Parent  4b8bcf8e6e7e1f446b553847ca6679fb88937dbe
Settings support added to IC-V80 driver. Fixes #174

diff --git a/chirp/drivers/icv80.py b/chirp/drivers/icv80.py
--- a/chirp/drivers/icv80.py
+++ b/chirp/drivers/icv80.py
@@ -60,6 +60,61 @@
 #seekto 0x0d10;
 u8 unused[32];
 
+#seekto 0x0e50;
+struct {
+  u8 unknown1:6,
+     beep:2;
+  u8 unknown2:3,
+     tot:5;
+  u8 unknown3;
+  u8 unknown4:6,
+     auto_pwr_off:2;
+  u8 unknown5:6,
+     lockout:2;
+  u8 unknown6:7,
+     squelch_delay:1;
+  u8 unknown7[2];
+  u8 unknown8:6,
+     mem_display:2;
+  u8 unknown9:7,
+     dial_func:1;
+  u8 unknown10:7,
+     lcd:1;
+  u8 unknown11:5,
+     pwr_save:3;
+  u8 unknown12:7,
+     sel_speed:1;
+  u8 unknown13:6,
+     mic_mode:2;
+  u8 unknown14:6,
+     battery_save:2;
+  u8 unknown15;
+  u8 unknown16:6,
+     resume:2;
+  u8 unknown17:5,
+     func_mode:3;
+  u8 unknown18:6,
+     backlight:2;
+  u8 unknown19;
+  u8 unknown:4,
+     vox_gain:4;
+  u8 unknown20:6,
+     mic_gain:2;
+  u8 unknown21:5
+     vox_delay:3;
+  u8 unknown22:4,
+     vox_tot:4;
+  u8 unknown23[2];
+  u8 unknown24:6,
+     edge:2;
+  u8 unknown25;
+  u8 unknown26:7,
+     auto_low_pwr:1;
+  u8 unknown27[3];
+
+} settings;
+
+
 """
 
 SPECIAL_CHANNELS = {
@@ -118,7 +173,7 @@
         rf.has_ctone = True
         rf.has_offset = True
         rf.has_bank = False
-        rf.has_settings = False
+        rf.has_settings = True
 
         return rf
 
@@ -134,6 +189,185 @@
     def process_mmap(self):
         self._memobj = bitwise.parse(ICV80_MEM_FORMAT, self._mmap)
 
+    def get_settings(self):
+        _settings = self._memobj.settings
+
+        setmode = RadioSettingGroup("setmode", "Set Mode")
+        display = RadioSettingGroup("display", "Display")
+        sounds = RadioSettingGroup("display", "Sounds")
+        scan = RadioSettingGroup("scan", "Scan")
+        settings = RadioSettings(setmode, display, sounds, scan)
+
+        # TOT
+        opts = ["Off"] + ["%d min" % t for t in range(1, 31)]
+        setmode.append(
+            RadioSetting(
+                "tot", "Time out Timer",
+                RadioSettingValueList(opts, opts[_settings.tot])))
+
+        # Lockout
+        opts = ["Off", "Rpt", "Busy"]
+        setmode.append(
+            RadioSetting(
+                "lockout", "Lockout",
+                RadioSettingValueList(opts, opts[_settings.lockout])))
+
+        # Auto Power Off
+        opts = ["Off", "30 min", "1 hr", "2 hrs"]
+        setmode.append(
+            RadioSetting(
+                "auto_pwr_off", "Auto Power Off",
+                RadioSettingValueList(opts, opts[_settings.auto_pwr_off])))
+
+        # Power Save
+        opts = ["Off", "1:2", "1:8", "1:16", "Auto"]
+        setmode.append(
+            RadioSetting(
+                "pwr_save", "Power Save",
+                RadioSettingValueList(opts, opts[_settings.pwr_save])))
+
+        # Battery Save
+        opts = ["Off", "Ni-MH", "Li-Ion"]
+        setmode.append(
+            RadioSetting(
+                "battery_save", "Battery Save",
+                RadioSettingValueList(opts, opts[_settings.battery_save])))
+
+        # Auto Low Power
+        opts = ["Off", "On"]
+        setmode.append(
+            RadioSetting(
+                "auto_low_pwr", "Auto Low Power",
+                RadioSettingValueList(opts, opts[_settings.auto_low_pwr])))
+
+        # Squelch Delay
+        opts = ["Short", "Long"]
+        setmode.append(
+            RadioSetting(
+                "squelch_delay", "Squelch Delay",
+                RadioSettingValueList(opts, opts[_settings.squelch_delay])))
+
+        # MIC Simple Mode
+        opts = ["Simple", "Normal 1", "Normal 2"]
+        setmode.append(
+            RadioSetting(
+                "mic_mode", "Mic Simple Mode",
+                RadioSettingValueList(opts, opts[_settings.mic_mode])))
+
+        # MIC Gain
+        opts = ["1", "2", "3", "4"]
+        setmode.append(
+            RadioSetting(
+                "mic_gain", "Mic Gain",
+                RadioSettingValueList(opts, opts[_settings.mic_gain])))
+
+        # VOX Gain
+        opts = ["Off"] + ["%d" % t for t in range(1, 11)]
+        setmode.append(
+            RadioSetting(
+                "vox_gain", "VOX Gain",
+                RadioSettingValueList(opts, opts[_settings.vox_gain])))
+
+        # VOX Delay
+        opts = ["0.5 sec", "1.0 sec", "1.5 sec", "2.0 sec", "2.5 sec", "3.0 sec"]
+        setmode.append(
+            RadioSetting(
+                "vox_delay", "VOX Delay",
+                RadioSettingValueList(opts, opts[_settings.vox_delay])))
+
+        # VOX Time out Timer
+        opts = ["Off", "1 min", "2 min", "3 min", "4 min", "5 min", "10 min", "15 min"]
+        setmode.append(
+            RadioSetting(
+                "vox_tot", "VOX Time-Out Timer",
+                RadioSettingValueList(opts, opts[_settings.vox_tot])))
+
+        # Select Speed
+        opts = ["Manual", "Auto"]
+        setmode.append(
+            RadioSetting(
+                "sel_speed", "Select Speed",
+                RadioSettingValueList(opts, opts[_settings.sel_speed])))
+
+        # Dial Function
+        opts = ["Audio Volume", "Tuning Dial"]
+        setmode.append(
+            RadioSetting(
+                "dial_func", "Dial Function",
+                RadioSettingValueList(opts, opts[_settings.dial_func])))
+
+        # Function Mode
+        opts = ["0 sec", "1 sec", "2 sec", "3 sec", "Manual"]
+        setmode.append(
+            RadioSetting(
+                "func_mode", "Function Mode",
+                RadioSettingValueList(opts, opts[_settings.func_mode])))
+
+        # Backlight
+        opts = ["Off", "On", "Auto"]
+        display.append(
+            RadioSetting(
+                "backlight", "Backlight",
+                RadioSettingValueList(opts, opts[_settings.backlight])))
+
+        # LCD Contrast
+        opts = ["Low", "Auto"]
+        display.append(
+            RadioSetting(
+                "lcd", "LCD Contrast",
+                RadioSettingValueList(opts, opts[_settings.lcd])))
+
+        # Memory Display
+        opts = ["Frequency", "Channel", "Name"]
+        display.append(
+            RadioSetting(
+                "mem_display", "Memory Display",
+                RadioSettingValueList(opts, opts[_settings.mem_display])))
+
+        # Beep
+        opts = ["Off", "1", "2", "3"]
+        sounds.append(
+            RadioSetting(
+                "beep", "Beep",
+                RadioSettingValueList(opts, opts[_settings.beep])))
+
+        # Edge
+        opts = ["All", "P1", "P2", "P3"]
+        scan.append(
+            RadioSetting(
+                "edge", "Edge",
+                RadioSettingValueList(opts, opts[_settings.edge])))
+
+        # Resume
+        opts = ["T-5", "T-10", "T-15", "P-2"]
+        scan.append(
+            RadioSetting(
+                "resume", "Resume",
+                RadioSettingValueList(opts, opts[_settings.resume])))
+
+        return settings
+
+    def set_settings(self, settings):
+        _settings = self._memobj.settings
+        for element in settings:
+            if not isinstance(element, RadioSetting):
+                self.set_settings(element)
+                continue
+            if not element.changed():
+                continue
+
+            try:
+                if element.has_apply_callback():
+                    LOG.debug("Using apply callback")
+                    element.run_apply_callback()
+                else:
+                    setting = element.get_name()
+                    LOG.debug("Setting %s = %s" % (setting, element.value))
+                    setattr(_settings, setting, element.value)
+            except Exception, e:
+                LOG.debug(element.get_name())
+                raise
+
     def _get_memory(self, number, extd_number = None):
         bit = 1 << (number % 8)
         byte = int(number / 8)
@@ -229,7 +463,7 @@
 
         _mem = self._memobj.memory[mem.number]
         _unused = self._memobj.unused[byte]
-        _skip = (mem.extd_number == "") and self._memobj.skip[byte] else None
+        _skip = (mem.extd_number == "") and self._memobj.skip[byte] or None
         assert(_mem)
 
         if mem.empty:



More information about the chirp_devel mailing list