[chirp_devel] [PATCH 1 of 1] [FT817] Support for PMS special memories

Marco Filippi
Sun Apr 29 11:38:54 PDT 2012


# HG changeset patch
# User Filippi Marco <iz3gme.marco at gmail.com>
# Date 1335724435 -7200
# Node ID 95b0a2ac92588353ab1d97f329cf7b1f08825c35
# Parent  5f6c45e053c37213c388b3a2908793e66672e4cf
[FT817] Support for PMS special memories
to avoid code duplication PMS memories functions have been moved from ft857
to its ancestor class
Feature #154

diff -r 5f6c45e053c3 -r 95b0a2ac9258 chirp/ft817.py
--- a/chirp/ft817.py	Sat Apr 28 12:03:38 2012 +0200
+++ b/chirp/ft817.py	Sun Apr 29 20:33:55 2012 +0200
@@ -99,12 +99,15 @@
         
         #seekto 0x3FD;
         u8 visible[25];
+        u8 pmsvisible;
         
         #seekto 0x417;
         u8 filled[25];
+        u8 pmsfilled;
         
         #seekto 0x431;
         struct mem_struct memory[200];
+        struct mem_struct pms[2];
         
         #seekto 0x1979;
         struct mem_struct sixtymeterchannels[5];
@@ -153,8 +156,17 @@
     FIRST_VFOA_INDEX = -21
     LAST_VFOA_INDEX = -35
 
+    SPECIAL_PMS = {
+        "PMS-L" : -37,
+        "PMS-U" : -36,
+    }
+    LAST_PMS_INDEX = -37
+
+    SPECIAL_MEMORIES.update(SPECIAL_PMS)
+    
     SPECIAL_MEMORIES_REV = dict(zip(SPECIAL_MEMORIES.values(),
                                     SPECIAL_MEMORIES.keys()))
+
     def _read(self, block, blocknum):
         for _i in range(0, 60):
             data = self.pipe.read(block+2)
@@ -352,6 +364,19 @@
             _mem = self._memobj.qmb
             immutable = ["number", "skip", "rtone", "ctone", "extd_number",
                          "name", "dtcs_polarity", "power", "comment"]
+        elif mem.number in self.SPECIAL_PMS.values():
+            bitindex = -self.LAST_PMS_INDEX + mem.number
+            used = (self._memobj.pmsvisible >> bitindex) & 0x01
+            valid = (self._memobj.pmsfilled >> bitindex) & 0x01
+            if not used:
+                mem.empty = True
+            if not valid:
+                mem.empty = True
+                return mem
+            _mem = self._memobj.pms[-self.LAST_PMS_INDEX + mem.number]
+            immutable = ["number", "skip", "rtone", "ctone", "extd_number", 
+                         "dtcs", "tmode", "cross_mode", "dtcs_polarity", 
+                         "power", "duplex", "offset", "comment"]
         else:
             raise Exception("Sorry, special memory index %i " % mem.number +
                             "unknown you hit a bug!!")
@@ -362,17 +387,12 @@
         return mem
 
     def _set_special(self, mem):
-        if mem.empty:
+        if mem.empty and not mem.number in self.SPECIAL_PMS.values():
             # can't delete special memories!
             raise Exception("Sorry, special memory can't be deleted")
 
         cur_mem = self._get_special(self.SPECIAL_MEMORIES_REV[mem.number])
 
-        for key in cur_mem.immutable:
-            if cur_mem.__dict__[key] != mem.__dict__[key]:
-                raise errors.RadioError("Editing field `%s' " % key +
-                                        "is not supported on this channel")
-
         # TODO add frequency range check for vfo and home memories
         if mem.number in range(self.FIRST_VFOA_INDEX,
                                self.LAST_VFOA_INDEX -1,
@@ -386,10 +406,34 @@
             _mem = self._memobj.home[5 + mem.number]
         elif mem.number == -1:
             _mem = self._memobj.qmb
+        elif mem.number in self.SPECIAL_PMS.values():
+            # this case has to be last because 817 pms keys overlap with
+            # 857 derived class other special memories
+            bitindex = -self.LAST_PMS_INDEX + mem.number
+            wasused = (self._memobj.pmsvisible >> bitindex) & 0x01
+            wasvalid = (self._memobj.pmsfilled >> bitindex) & 0x01
+            if mem.empty:
+                if wasvalid and not wasused:
+                    # pylint get confused by &= operator
+                    self._memobj.pmsfilled = self._memobj.pmsfilled & \
+                        ~ (1 << bitindex)
+                # pylint get confused by &= operator
+                self._memobj.pmsvisible = self._memobj.pmsvisible & \
+                    ~ (1 << bitindex)
+                return
+            # pylint get confused by |= operator
+            self._memobj.pmsvisible = self._memobj.pmsvisible | 1 << bitindex
+            self._memobj.pmsfilled = self._memobj.pmsfilled | 1 << bitindex
+            _mem = self._memobj.pms[-self.LAST_PMS_INDEX + mem.number]
         else:
             raise Exception("Sorry, special memory index %i " % mem.number +
                             "unknown you hit a bug!!")
 
+        for key in cur_mem.immutable:
+            if cur_mem.__dict__[key] != mem.__dict__[key]:
+                raise errors.RadioError("Editing field `%s' " % key +
+                                        "is not supported on this channel")
+
         self._set_memory(mem, _mem)
 
     def _get_normal(self, number):
@@ -559,13 +603,13 @@
     _block_lengths = [ 2, 40, 208, 182, 208, 182, 198, 53, 130, 118, 130, 130]
 
     SPECIAL_60M = {
-        "M-601" : -40,
-        "M-602" : -39,
-        "M-603" : -38,
-        "M-604" : -37,
-        "M-605" : -36,
+        "M-601" : -42,
+        "M-602" : -41,
+        "M-603" : -40,
+        "M-604" : -39,
+        "M-605" : -38,
         }
-    LAST_SPECIAL60M_INDEX = -40
+    LAST_SPECIAL60M_INDEX = -42
 
     SPECIAL_MEMORIES = dict(FT817Radio.SPECIAL_MEMORIES)
     SPECIAL_MEMORIES.update(SPECIAL_60M)
diff -r 5f6c45e053c3 -r 95b0a2ac9258 chirp/ft857.py
--- a/chirp/ft857.py	Sat Apr 28 12:03:38 2012 +0200
+++ b/chirp/ft857.py	Sun Apr 29 20:33:55 2012 +0200
@@ -17,7 +17,6 @@
 """FT857 - FT857/US management module"""
 
 from chirp import ft817, chirp_common, errors, directory
-import os
 
 @directory.register
 class FT857Radio(ft817.FT817Radio):
@@ -174,7 +173,6 @@
     FIRST_VFOA_INDEX = -22
     LAST_VFOA_INDEX = -37
 
-    # WARNING Index are hard wired in memory management code !!!
     SPECIAL_PMS = {
         "PMS-1L" : -47,
         "PMS-1U" : -46,
@@ -187,8 +185,8 @@
         "PMS-5L" : -39,
         "PMS-5U" : -38,
     }
+    LAST_PMS_INDEX = -47
 
-    SPECIAL_MEMORIES = dict(SPECIAL_MEMORIES)
     SPECIAL_MEMORIES.update(SPECIAL_PMS)
 
     SPECIAL_MEMORIES_REV = dict(zip(SPECIAL_MEMORIES.values(),
@@ -227,86 +225,6 @@
             _mem.tmode = self.CROSS_MODES_REV[mem.cross_mode]
             _mem.is_split_tone = 1
 
-    def _get_special_pms(self, number):
-        mem = chirp_common.Memory()
-        mem.number = self.SPECIAL_PMS[number]
-        mem.extd_number = number
-
-        bitindex = 47 + mem.number
-        used = (self._memobj.pmsvisible >> bitindex) & 0x01
-        valid = (self._memobj.pmsfilled >> bitindex) & 0x01
-        if os.getenv("CHIRP_DEBUG"):
-            print "mem.number %i bitindex %i pmsvisible %i" % \
-                (mem.number,
-                 bitindex,
-                 self._memobj.pmsvisible),
-            print "pmsfilled %i used %i filled %i" % \
-                (self._memobj.pmsfilled,
-                 used,
-                 valid)
-        if not used:
-            mem.empty = True
-        if not valid:
-            mem.empty = True
-            return mem
-
-        _mem = self._memobj.pms[47 + mem.number]
-
-        mem = self._get_memory(mem, _mem)
-
-        mem.immutable = ["number", "skip", "rtone", "ctone",
-                         "extd_number", "dtcs", "tmode", "cross_mode",
-                         "dtcs_polarity", "power", "duplex", "offset",
-                         "comment"]
-
-        return mem
-
-    def _set_special_pms(self, mem):
-        cur_mem = self._get_special_pms(self.SPECIAL_MEMORIES_REV[mem.number])
-
-        bitindex = 47 + mem.number
-        wasused = (self._memobj.pmsvisible >> bitindex) & 0x01
-        wasvalid = (self._memobj.pmsfilled >> bitindex) & 0x01
-
-        if mem.empty:
-            if wasvalid and not wasused:
-                # pylint get confused by &= operator
-                self._memobj.pmsfilled = self._memobj.pmsfilled & \
-                    ~ (1 << bitindex)
-            # pylint get confused by &= operator
-            self._memobj.pmsvisible = self._memobj.pmsvisible & \
-                ~ (1 << bitindex)
-            return
-
-        # pylint get confused by |= operator
-        self._memobj.pmsvisible = self._memobj.pmsvisible | 1 << bitindex
-        self._memobj.pmsfilled = self._memobj.pmsfilled | 1 << bitindex
-        
-        for key in cur_mem.immutable:
-            if cur_mem.__dict__[key] != mem.__dict__[key]:
-                raise errors.RadioError("Editing field `%s' " % key +
-                                        "is not supported on PMS channels")
-
-        _mem = self._memobj.pms[47 + mem.number]
-        self._set_memory(mem, _mem)
-
-    def get_memory(self, number):
-        if number in self.SPECIAL_PMS.keys():
-            return self._get_special_pms(number)
-        elif number < 0 and \
-                self.SPECIAL_MEMORIES_REV[number] in self.SPECIAL_PMS.keys():
-            # I can't stop delete operation from loosing extd_number but
-            # I know how to get it back
-            return self._get_special_pms(self.SPECIAL_MEMORIES_REV[number])
-        else:
-            return ft817.FT817Radio.get_memory(self, number)
-
-    def set_memory(self, memory):
-        if memory.number in self.SPECIAL_PMS.values():
-            return self._set_special_pms(memory)
-        else:
-            return ft817.FT817Radio.set_memory(self, memory)
-
 @directory.register
 class FT857USRadio(FT857Radio):
     """Yaesu FT857/897 (US version)"""



More information about the chirp_devel mailing list