[chirp_devel] [ft2900] Support cross tones (#2433)

Richard Cochran
Mon Mar 16 21:10:29 PDT 2015


# HG changeset patch
# User Richard Cochran <ag6qr at sonic.net>
# Date 1426564842 25200
#      Mon Mar 16 21:00:42 2015 -0700
# Node ID 5c8ac5597f34af143915667c51ed5882e97e30f7
# Parent  b15013e7ded2bfb5147128388ad0765ed017b6de
[ft2900] Support cross tones (#2433)
This patch adds support for cross tones to the FT2900/FT1900 driver.
It allows all combinations of CTCSS and DTCS for transmit and receive,
including using one CTCSS tone for sending, and a different CTCSS tone
for receiving.  This also includes a minor change to memedit.py,
to support the proper column hiding/unhiding for TSQL-R.  The TSQL-R
is "reverse tone squelch", and has the same data, and thus the same
columns shown/hidden, as in ordinary TSQL.  But on TSQL-R, the radio
behavior is different.  Squelch is broken only if the tone does NOT
match the stored tone.

diff -r b15013e7ded2 -r 5c8ac5597f34 chirp/drivers/ft2900.py
--- a/chirp/drivers/ft2900.py	Sat Mar 14 17:13:02 2015 -0700
+++ b/chirp/drivers/ft2900.py	Mon Mar 16 21:00:42 2015 -0700
@@ -205,17 +205,19 @@
      tmode:3;
   u8 name[6];
   bbcd offset[3];
-  u8 tone;
+  u8 ctone;
+  u8 rx_dtcs;
+  u8 unknown5;
+  u8 rtone;
   u8 dtcs;
-  u8 unknown5;
-  u8 tone2;
-  u8 dtcs2;
 } memory[200];
 
 """
 
 MODES = ["FM", "NFM"]
-TMODES = ["", "Tone", "TSQL", "DTCS", "TSQL-R"]
+TMODES = ["", "Tone", "TSQL", "DTCS", "TSQL-R", "Cross"]
+CROSS_MODES = ["DTCS->", "Tone->DTCS", "DTCS->Tone",
+               "Tone->Tone", "DTCS->DTCS"]
 DUPLEX = ["", "-", "+", "split"]
 POWER_LEVELS = [chirp_common.PowerLevel("Hi", watts=75),
                 chirp_common.PowerLevel("Low3", watts=30),
@@ -275,13 +277,16 @@
         rf.memory_bounds = (0, 199)
 
         rf.can_odd_split = True
-        rf.has_ctone = False
+        rf.has_ctone = True
+        rf.has_rx_dtcs = True
+        rf.has_cross = True
         rf.has_dtcs_polarity = False
         rf.has_bank = False
 
         rf.valid_tuning_steps = STEPS
         rf.valid_modes = MODES
         rf.valid_tmodes = TMODES
+        rf.valid_cross_modes = CROSS_MODES
         rf.valid_bands = [(136000000, 174000000)]
         rf.valid_power_levels = POWER_LEVELS
         rf.valid_duplexes = DUPLEX
@@ -348,9 +353,30 @@
 
         mem.offset = chirp_common.fix_rounded_step(int(_mem.offset) * 1000)
         mem.duplex = DUPLEX[_mem.duplex]
-        mem.tmode = TMODES[_mem.tmode]
-        mem.rtone = chirp_common.TONES[_mem.tone]
+        if _mem.tmode < TMODES.index("Cross"):
+            mem.tmode = TMODES[_mem.tmode]
+            mem.cross_mode = CROSS_MODES[0]
+        else:
+            mem.tmode = "Cross"
+            mem.cross_mode = CROSS_MODES[_mem.tmode - TMODES.index("Cross")]
+        mem.rtone = chirp_common.TONES[_mem.rtone]
+        mem.ctone = chirp_common.TONES[_mem.ctone]
+
+        # check for unequal ctone/rtone in TSQL mode.  map it as a
+        # cross tone mode
+        if mem.rtone != mem.ctone and mem.tmode == "TSQL":
+            mem.tmode = "Cross"
+            mem.cross_mode = "Tone->Tone"
+
         mem.dtcs = chirp_common.DTCS_CODES[_mem.dtcs]
+        mem.rx_dtcs = chirp_common.DTCS_CODES[_mem.rx_dtcs]
+
+        # check for unequal dtcs/rx_dtcs in DTCS mode.  map it as a
+        # cross tone mode
+        if mem.dtcs != mem.rx_dtcs and mem.tmode == "DTCS":
+            mem.tmode = "Cross"
+            mem.cross_mode = "DTCS->DTCS"
+
         if (int(_mem.name[0]) & 0x80) != 0:
             mem.name = _decode_name(_mem.name)
 
@@ -386,11 +412,40 @@
         _mem.freq = mem.freq / 1000
         _mem.offset = mem.offset / 1000
         _mem.duplex = DUPLEX.index(mem.duplex)
-        _mem.tmode = TMODES.index(mem.tmode)
-        _mem.tone = chirp_common.TONES.index(mem.rtone)
-        _mem.tone2 = chirp_common.TONES.index(mem.rtone)
-        _mem.dtcs = chirp_common.DTCS_CODES.index(mem.dtcs)
-        _mem.dtcs2 = chirp_common.DTCS_CODES.index(mem.dtcs)
+        if mem.tmode != "Cross":
+            _mem.tmode = TMODES.index(mem.tmode)
+            # for the non-cross modes, use ONE tone for both send
+            # and receive but figure out where to get it from.
+            if mem.tmode == "TSQL" or mem.tmode == "TSQL-R":
+                _mem.rtone = chirp_common.TONES.index(mem.ctone)
+                _mem.ctone = chirp_common.TONES.index(mem.ctone)
+            else:
+                _mem.rtone = chirp_common.TONES.index(mem.rtone)
+                _mem.ctone = chirp_common.TONES.index(mem.rtone)
+
+            # and one tone for dtcs, but this is always the sending one
+            _mem.dtcs = chirp_common.DTCS_CODES.index(mem.dtcs)
+            _mem.rx_dtcs = chirp_common.DTCS_CODES.index(mem.dtcs)
+
+        else:
+            _mem.rtone = chirp_common.TONES.index(mem.rtone)
+            _mem.ctone = chirp_common.TONES.index(mem.ctone)
+            _mem.dtcs = chirp_common.DTCS_CODES.index(mem.dtcs)
+            _mem.rx_dtcs = chirp_common.DTCS_CODES.index(mem.rx_dtcs)
+            if mem.cross_mode == "Tone->Tone":
+                # tone->tone cross mode is treated as
+                # TSQL, but with separate tones for
+                # send and receive
+                _mem.tmode = TMODES.index("TSQL")
+            elif mem.cross_mode == "DTCS->DTCS":
+                # DTCS->DTCS cross mode is treated as
+                # DTCS, but with separate codes for
+                # send and receive
+                _mem.tmode = TMODES.index("DTCS")
+            else:
+                _mem.tmode = TMODES.index("Cross") + \
+                    CROSS_MODES.index(mem.cross_mode)
+
         _mem.isnarrow = MODES.index(mem.mode)
         _mem.step = STEPS.index(mem.tuning_step)
         _flag["%s_pskip" % nibble] = mem.skip == "P"
diff -r b15013e7ded2 -r 5c8ac5597f34 chirp/ui/memedit.py
--- a/chirp/ui/memedit.py	Sat Mar 14 17:13:02 2015 -0700
+++ b/chirp/ui/memedit.py	Mon Mar 16 21:00:42 2015 -0700
@@ -289,7 +289,7 @@
                      self.col(_("DTCS Rx Code")),
                      self.col(_("DTCS Pol")),
                      self.col(_("Cross Mode"))]
-        elif tmode == "TSQL":
+        elif tmode == "TSQL" or tmode == "TSQL-R":
             if self._features.has_ctone:
                 hide += [self.col(_("Tone"))]
 
@@ -297,7 +297,7 @@
                      self.col(_("DTCS Rx Code")),
                      self.col(_("DTCS Pol")),
                      self.col(_("Cross Mode"))]
-        elif tmode == "DTCS":
+        elif tmode == "DTCS" or tmode == "DTCS-R":
             hide += [self.col(_("Tone")),
                      self.col(_("ToneSql")),
                      self.col(_("Cross Mode")),




More information about the chirp_devel mailing list