[chirp_devel] [PATCH] [bf888] Finish tone encoding and decoding
# HG changeset patch # User Dan Smith dsmith@danplanet.com # Date 1378685876 25200 # Node ID c12b1bd79697023039d0fb6af8322d1be02b742b # Parent ea130e31f030c2db47808b6a327900074e27c3f3 [bf888] Finish tone encoding and decoding
This finishes Tone and DTCS encode/decode, as well as adds support for all the Cross variations.
Related to #701
diff -r ea130e31f030 -r c12b1bd79697 chirp/h777.py --- a/chirp/h777.py Sun Sep 08 10:50:00 2013 -0700 +++ b/chirp/h777.py Sun Sep 08 17:17:56 2013 -0700 @@ -18,6 +18,7 @@ import os import struct import sys +import unittest
from chirp import chirp_common, directory, memmap from chirp import bitwise @@ -235,15 +236,10 @@ rf.has_settings = True rf.valid_modes = ["NFM", "FM"] # 12.5 KHz, 25 kHz. rf.valid_skips = ["", "S"] - # TODO: Support CTCSS and DCS. - # rf.valid_tmodes = ["", "TSQL", "DTCS"] - # rf.has_ctone = True - # rf.has_cross = True - # rf.has_rx_dtcs = True - rf.valid_tmodes = [""] - rf.has_ctone = False - rf.has_cross = False - rf.has_rx_dtcs = False + rf.valid_tmodes = ["", "Tone", "TSQL", "DTCS", "Cross"] + rf.has_rx_dtcs = True + rf.has_ctone = True + rf.has_cross = True rf.has_tuning_step = False rf.has_bank = False rf.has_name = False @@ -267,6 +263,30 @@ def get_raw_memory(self, number): return repr(self._memobj.memory[number - 1])
+ def _decode_tone(self, val): + val = int(val) + if val == 16665: + return '', None, None + elif val >= 12000: + return 'DTCS', val - 12000, 'R' + elif val >= 8000: + return 'DTCS', val - 8000, 'N' + else: + return 'Tone', val / 10.0, None + + def _encode_tone(self, memval, mode, value, pol): + if mode == '': + memval[0].set_raw(0xFF) + memval[1].set_raw(0xFF) + elif mode == 'Tone': + memval.set_value(int(value * 10)) + elif mode == 'DTCS': + flag = 0x80 if pol == 'N' else 0xC0 + memval.set_value(value) + memval[1].set_bits(flag) + else: + raise Exception("Internal error: invalid mode `%s'" % mode) + def get_memory(self, number): _mem = self._memobj.memory[number - 1]
@@ -299,26 +319,9 @@ if not _mem.scanadd: mem.skip = "S"
- # Decode CTCSS/DCS, if used. - - if _mem.rxtone.get_raw() == "\xFF\xFF": - mem.tmode = "" - else: - if ord(_mem.rxtone[1].get_raw()) & 0x80: - # TODO: Make DCS work. - raise Exception("Sorry, DCS isn't supported yet.") - mem.tmode = "DTCS" - mem.rx_dtcs = int(_mem.rxtone.get_raw() & 0x0FFF) - mem.dtcs = int(_mem.txtone.get_raw() & 0x0FFF) - - if ord(_mem.rxtone[1].get_raw()) & 0x40: - mem.dtsc_polarity = "R" - else: - print("DCS N") - else: - mem.tmode = "TSQL" - mem.rtone = int(_mem.rxtone) / 10.0 - mem.ctone = int(_mem.txtone) / 10.0 + txtone = self._decode_tone(_mem.txtone) + rxtone = self._decode_tone(_mem.rxtone) + chirp_common.split_tone_decode(mem, txtone, rxtone)
# TODO: Set beatshift and bcl.
@@ -348,6 +351,10 @@
# TODO: Support empty TX frequency
+ txtone, rxtone = chirp_common.split_tone_encode(mem) + self._encode_tone(_mem.txtone, *txtone) + self._encode_tone(_mem.rxtone, *rxtone) + _mem.wide = mem.mode != 0 _mem.lowpower = mem.power == 1 _mem.scanadd = mem.skip != "S" @@ -432,3 +439,49 @@ basic.append(rs)
return basic + +class H777TestCase(unittest.TestCase): + def setUp(self): + self.driver = H777Radio(None) + self.testdata = bitwise.parse("lbcd foo[2];", + memmap.MemoryMap("\x00\x00")) + + def test_decode_tone_dtcs_normal(self): + mode, value, pol = self.driver._decode_tone(8023) + self.assertEqual('DTCS', mode) + self.assertEqual(23, value) + self.assertEqual('N', pol) + + def test_decode_tone_dtcs_rev(self): + mode, value, pol = self.driver._decode_tone(12023) + self.assertEqual('DTCS', mode) + self.assertEqual(23, value) + self.assertEqual('R', pol) + + def test_decode_tone_tone(self): + mode, value, pol = self.driver._decode_tone(885) + self.assertEqual('Tone', mode) + self.assertEqual(88.5, value) + self.assertEqual(None, pol) + + def test_decode_tone_none(self): + mode, value, pol = self.driver._decode_tone(16665) + self.assertEqual('', mode) + self.assertEqual(None, value) + self.assertEqual(None, pol) + + def test_encode_tone_dtcs_normal(self): + self.driver._encode_tone(self.testdata.foo, 'DTCS', 23, 'N') + self.assertEqual(8023, int(self.testdata.foo)) + + def test_encode_tone_dtcs_rev(self): + self.driver._encode_tone(self.testdata.foo, 'DTCS', 23, 'R') + self.assertEqual(12023, int(self.testdata.foo)) + + def test_encode_tone(self): + self.driver._encode_tone(self.testdata.foo, 'Tone', 88.5, 'N') + self.assertEqual(885, int(self.testdata.foo)) + + def test_encode_tone_none(self): + self.driver._encode_tone(self.testdata.foo, '', 67.0, 'N') + self.assertEqual(16665, int(self.testdata.foo))
participants (1)
-
Dan Smith