[chirp_devel] [PATCH] [FT-60] Adding Support for Settings to Yaesu FT-60
Kosta Arvanitis
Thu Jan 22 01:09:07 PST 2015
# HG changeset patch
# User K. Arvanitis <kosta at alumni.uvic.ca>
# Date 1421911819 28800
# Wed Jan 21 23:30:19 2015 -0800
# Node ID a14b91de7d5390bad00ec450f0546531b6bb268d
# Parent 9ca5e99e7552a667b362e6f6dac67212fbbc6a34
[FT-60] Adding Support for Settings to Yaesu FT-60
Added support for most of the basic (but not all) settings avail. on
the FT-60.
Note: some settings map to the memory bank and are therefore
not included in this list.
Note: the list of settings and categories was taken from the
user manual for this radio.
Tested against the specific revision model no. FT-60R.
Feature #1759
diff -r 9ca5e99e7552 -r a14b91de7d53 chirp/ft60.py
--- a/chirp/ft60.py Sat Jan 17 10:10:54 2015 -0600
+++ b/chirp/ft60.py Wed Jan 21 23:30:19 2015 -0800
@@ -13,9 +13,13 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-import time
+import time, os
from chirp import chirp_common, yaesu_clone, memmap, bitwise, directory
from chirp import errors
+from chirp.settings import RadioSetting, RadioSettingGroup, \
+ RadioSettingValueInteger, RadioSettingValueList, \
+ RadioSettingValueBoolean, RadioSettingValueString, \
+ RadioSettingValueFloat
from textwrap import dedent
ACK = "\x06"
@@ -128,6 +132,78 @@
MEM_FORMAT = """
+#seekto 0x0024;
+struct {
+ u8 apo;
+ u8 x25:3,
+ tot:5;
+ u8 x26;
+ u8 x27;
+ u8 x28:4,
+ rf_sql:4;
+ u8 x29:4,
+ int_cd:4;
+ u8 x2A:4,
+ int_mr:4;
+ u8 x2B:5,
+ lock:3;
+ u8 x2C:5,
+ dt_dly:3;
+ u8 x2D:7,
+ dt_spd:1;
+ u8 ar_bep;
+ u8 x2F:6,
+ lamp:2;
+ u8 x30:5,
+ bell:3;
+ u8 x31:5,
+ rxsave:3;
+ u8 x32;
+ u8 x33;
+ u8 x34;
+ u8 x35;
+ u8 x36;
+ u8 x37;
+ u8 wx_alt:1,
+ x38_1:3,
+ ar_int:1,
+ x38_5:3;
+ u8 x39:3,
+ ars:1,
+ vfo_bnd:1,
+ dcs_nr:2,
+ ssrch:1;
+ u8 pri_rvt:1,
+ x3A_1:1,
+ beep_sc:1,
+ edg_bep:1,
+ beep_key:1,
+ inet:2,
+ x3A_7:1;
+ u8 x3B_0:5,
+ scn_md:1,
+ x3B_6:2;
+ u8 x3C_0:2,
+ rev_hm:1,
+ mt_cl:1
+ resume:2,
+ txsave:1,
+ pag_abk:1;
+ u8 x3D_0:1,
+ scn_lmp:1,
+ x3D_2:1,
+ bsy_led:1,
+ x3D_4:1,
+ tx_led:1,
+ x3D_6:2;
+ u8 x3E_0:2,
+ bclo:1,
+ x3E_3:5;
+} settings;
+
+#seekto 0x09E;
+ul16 mbs;
+
#seekto 0x0248;
struct {
u8 used:1,
@@ -198,6 +274,10 @@
bank = chirp_common.Bank(self, "%i" % (i + 1), "Bank %i" % (i + 1))
bank.index = i
banks.append(bank)
+
+ #mbs = (self._radio._memobj.mbs >> i) & 1
+ #print "Bank %i: mbs: %i " % (i, mbs)
+
return banks
def add_memory_to_mapping(self, memory, bank):
@@ -277,6 +357,7 @@
rf.can_odd_split = True
rf.has_ctone = False
rf.has_bank = True
+ rf.has_settings = True
rf.has_dtcs_polarity = False
return rf
@@ -309,6 +390,229 @@
def process_mmap(self):
self._memobj = bitwise.parse(MEM_FORMAT, self._mmap)
+ def get_settings(self):
+ _settings = self._memobj.settings
+
+ repeater = RadioSettingGroup("repeater", "Repeater Settings")
+ ctcss = RadioSettingGroup("ctcss", "CTCSS/DSC/DTMF Settings")
+ arts = RadioSettingGroup("arts", "ARTS Settings")
+ scan = RadioSettingGroup("scan", "Scan Settings")
+ power = RadioSettingGroup("power", "Power Saver Settings")
+ wires = RadioSettingGroup("wires", "WiRES(tm) Settings")
+ eai = RadioSettingGroup("eai", "EAI/EPCS Settings")
+ switch = RadioSettingGroup("switch", "Switch/Knob Settings")
+ misc = RadioSettingGroup("misc", "Miscellaneous Settings")
+
+ setmode = RadioSettingGroup("top", "Set Mode",
+ repeater, ctcss, arts, scan, power, wires, eai, switch, misc)
+
+ # APO
+ opts = [ "OFF" ] + [ "%0.1f" % (x * 0.5) for x in range(1, 24+1) ]
+ misc.append( RadioSetting("apo", "Automatic Power Off",
+ RadioSettingValueList(opts, opts[_settings.apo])))
+
+ # AR.BEP
+ opts = [ "OFF" ] + [ "INRANG" ] + [ "ALWAYS" ]
+ arts.append( RadioSetting("ar_bep", "ARTS Beep",
+ RadioSettingValueList(opts, opts[_settings.ar_bep])))
+
+ # AR.INT
+ opts = ["25 SEC"] + [ "15 SEC" ]
+ arts.append( RadioSetting("ar_int", "ARTS Polling Interval",
+ RadioSettingValueList(opts, opts[_settings.ar_int])))
+
+ # ARS
+ opts = [ "OFF" ] + [ "ON" ]
+ repeater.append( RadioSetting("ars", "Automatic Repeater Shift",
+ RadioSettingValueList(opts, opts[_settings.ars])))
+
+ # BCLO
+ opts = [ "OFF" ] + [ "ON" ]
+ misc.append( RadioSetting("bclo", "Bush Channel Lock-Out",
+ RadioSettingValueList(opts, opts[_settings.bclo])))
+
+ # BEEP
+ opts = [ "OFF" ] + [ "KEY" ] + [ "KEY+SC" ]
+ rs = RadioSetting("beep_key", "Enable the Beeper",
+ RadioSettingValueList(opts, opts[_settings.beep_key + _settings.beep_sc]))
+ def apply_beep(s, obj):
+ setattr(obj, "beep_key", (int(s.value) & 1) or ((int(s.value) >> 1) & 1))
+ setattr(obj, "beep_sc", (int(s.value) >> 1) & 1)
+ rs.set_apply_callback(apply_beep, self._memobj.settings);
+ switch.append(rs)
+
+ # BELL
+ opts = [ "OFF" ] + [ "1T" ] + [ "3T" ] + [ "5T" ] + [ "8T" ] + [ "CONT" ]
+ ctcss.append( RadioSetting("bell", "Bell Repetitions",
+ RadioSettingValueList(opts, opts[_settings.bell])))
+
+ # BSY.LED
+ opts = [ "ON" ] + [ "OFF" ]
+ misc.append( RadioSetting("bsy_led", "Busy LED",
+ RadioSettingValueList(opts, opts[_settings.bsy_led])))
+
+ # DCS.NR
+ opts = [ "TR/X N" ] + [ "RX R" ] + [ "TX R" ] + [ "T/RX R" ]
+ ctcss.append( RadioSetting("dcs_nr", "\"Inverted\" DCS Code Decoding",
+ RadioSettingValueList(opts, opts[_settings.dcs_nr])))
+
+ # DT.DLY
+ opts = [ "50 MS" ] + [ "100 MS" ] + [ "250 MS" ] + [ "450 MS" ] + \
+ [ "750 MS" ]+ [ "1000 MS" ]
+ ctcss.append( RadioSetting("dt_dly", "DTMF Autodialer Delay Time",
+ RadioSettingValueList(opts, opts[_settings.dt_dly])))
+
+ # DT.SPD
+ opts = [ "50 MS" ] + [ "100 MS" ]
+ ctcss.append( RadioSetting("dt_spd", "DTMF Autodialer Sending Speed",
+ RadioSettingValueList(opts, opts[_settings.dt_spd])))
+
+ # EDG.BEP
+ opts = [ "OFF" ] + [ "ON" ]
+ misc.append( RadioSetting("edg_bep", "Band Edge Beeper",
+ RadioSettingValueList(opts, opts[_settings.edg_bep])))
+
+ # I.NET
+ opts = [ "OFF" ] + [ "COD" ]+ [ "MEM" ]
+ rs = RadioSetting("inet", "Internet Link Connection",
+ RadioSettingValueList(opts, opts[_settings.inet - 1]))
+ def apply_inet(s, obj):
+ setattr(obj, s.get_name(), int(s.value) + 1)
+ rs.set_apply_callback(apply_inet, self._memobj.settings);
+ wires.append(rs)
+
+ # INT.CD
+ opts = [ "CODE 0" ] + [ "CODE 1" ] + [ "CODE 2" ] + [ "CODE 3" ] + [ "CODE 4" ] + \
+ [ "CODE 5" ] + [ "CODE 6" ] + [ "CODE 7" ] + [ "CODE 8" ] + [ "CODE 9" ] + \
+ [ "CODE A" ] + [ "CODE B" ] + [ "CODE C" ] + [ "CODE D" ] + [ "CODE E" ] + [ "CODE F" ]
+ wires.append( RadioSetting("int_cd", "Access Number for WiRES(TM)",
+ RadioSettingValueList(opts, opts[_settings.int_cd])))
+
+ # INT.MR
+ opts = [ "d1" ] + [ "d2" ] + [ "d3" ] + [ "d4" ] + [ "d5" ] + \
+ [ "d6" ] + [ "d7" ] + [ "d8" ] + [ "d9" ]
+ wires.append( RadioSetting("int_mr", "Access Number (DTMF) for Non-WiRES(TM)",
+ RadioSettingValueList(opts, opts[_settings.int_mr])))
+
+ # LAMP
+ opts = [ "KEY" ] + [ "5SEC" ] + [ "TOGGLE" ]
+ switch.append( RadioSetting("lamp", "Lamp Mode",
+ RadioSettingValueList(opts, opts[_settings.lamp])))
+
+ # LOCK
+ opts = [ "LK KEY" ] + [ "LKDIAL" ] + [ "LK K+D" ] + [ "LK PTT" ] + [ "LP P+K" ] + \
+ [ "LK P+D" ] + [ "LK ALL" ]
+ rs = RadioSetting("lock", "Control Locking",
+ RadioSettingValueList(opts, opts[_settings.lock - 1]))
+ def apply_lock(s, obj):
+ setattr(obj, s.get_name(), int(s.value) + 1)
+ rs.set_apply_callback(apply_lock, self._memobj.settings);
+ switch.append(rs)
+
+ # M/T-CL
+ opts = [ "MONI" ] + [ "T-CALL" ]
+ switch.append( RadioSetting("mt_cl", "MONI Switch Function",
+ RadioSettingValueList(opts, opts[_settings.mt_cl])))
+
+ # PAG.ABK
+ opts = [ "OFF" ] + [ "ON" ]
+ eai.append( RadioSetting("pag_abk", "Paging Answer Back",
+ RadioSettingValueList(opts, opts[_settings.pag_abk])))
+
+ # RESUME
+ opts = [ "TIME" ] + [ "HOLD" ] + [ "BUSY" ]
+ scan.append( RadioSetting("resume", "Scan Resume Mode",
+ RadioSettingValueList(opts, opts[_settings.resume])))
+
+ # REV/HM
+ opts = [ "REV" ] + [ "HOME" ]
+ switch.append( RadioSetting("rev_hm", "HM/RV Key Function",
+ RadioSettingValueList(opts, opts[_settings.rev_hm])))
+
+ # RF.SQL
+ opts = [ "OFF" ] + [ "S-1" ] + [ "S-2" ] + [ "S-3" ] + [ "S-4" ] + \
+ [ "S-5" ] + [ "S-6" ] + [ "S-8" ] + [ "S-FULL" ]
+ misc.append( RadioSetting("rf_sql", "RF Squelch Threshold",
+ RadioSettingValueList(opts, opts[_settings.rf_sql])))
+
+ # PRI.RVT
+ opts = [ "OFF" ] + [ "ON" ]
+ scan.append( RadioSetting("pri_rvt", "Priority Revert",
+ RadioSettingValueList(opts, opts[_settings.pri_rvt])))
+
+ # RXSAVE
+ opts = [ "OFF" ] + [ "200 MS" ] + [ "300 MS" ] + [ "500 MS" ] + [ "1 S" ] + [ "2 S" ]
+ power.append( RadioSetting("rxsave", "Receive Mode Batery Savery Interval",
+ RadioSettingValueList(opts, opts[_settings.rxsave])))
+
+ # S.SRCH
+ opts = [ "SINGLE" ] + [ "CONT" ]
+ misc.append( RadioSetting("ssrch", "Smart Search Sweep Mode",
+ RadioSettingValueList(opts, opts[_settings.ssrch])))
+
+ # SCN.MD
+ opts = [ "MEM" ] + [ "ONLY" ]
+ scan.append( RadioSetting("scn_md", "Memory Scan Channel Selection Mode",
+ RadioSettingValueList(opts, opts[_settings.scn_md])))
+
+ # SCN.LMP
+ opts = [ "OFF" ] + [ "ON" ]
+ scan.append( RadioSetting("scn_lmp", "Scan Lamp",
+ RadioSettingValueList(opts, opts[_settings.scn_lmp])))
+
+ # TOT
+ opts = [ "OFF" ] + [ "%dMIN" % (x) for x in range(1, 30+1) ]
+ misc.append( RadioSetting("tot", "Timeout Timer",
+ RadioSettingValueList(opts, opts[_settings.tot])))
+
+ # TX.LED
+ opts = [ "ON" ] + [ "OFF" ]
+ misc.append( RadioSetting("tx_led", "TX LED",
+ RadioSettingValueList(opts, opts[_settings.tx_led])))
+
+ # TXSAVE
+ opts = [ "OFF" ] + [ "ON" ]
+ power.append( RadioSetting("txsave", "Transmitter Battery Saver",
+ RadioSettingValueList(opts, opts[_settings.txsave])))
+
+ # VFO.BND
+ opts = [ "BAND" ] + [ "ALL" ]
+ misc.append( RadioSetting("vfo_bnd", "VFO Band Edge Limiting",
+ RadioSettingValueList(opts, opts[_settings.vfo_bnd])))
+
+ # WX.ALT
+ opts = [ "OFF" ] + [ "ON" ]
+ scan.append( RadioSetting("wx_alt", "Weather Alert Scan",
+ RadioSettingValueList(opts, opts[_settings.wx_alt])))
+
+ return setmode
+
+ def set_settings(self, uisettings):
+ _settings = self._memobj.settings
+ for element in uisettings:
+ if not isinstance(element, RadioSetting):
+ self.set_settings(element)
+ continue
+ if not element.changed():
+ continue
+
+ try:
+ name = element.get_name()
+ value = element.value
+ obj = getattr(_settings, name)
+
+ if element.has_apply_callback():
+ print "Using apply callback"
+ element.run_apply_callback()
+ else:
+ setattr(_settings, name, value)
+
+ if os.getenv("CHIRP_DEBUG"):
+ print "Setting %s: %s <= %s" % (name, obj, element.value)
+ except Exception, e:
+ print element.get_name()
+ raise
+
def get_raw_memory(self, number):
return repr(self._memobj.memory[number - 1]) + \
repr(self._memobj.flags[(number - 1) / 4]) + \
diff -r 9ca5e99e7552 -r a14b91de7d53 chirpui/settingsedit.py
--- a/chirpui/settingsedit.py Sat Jan 17 10:10:54 2015 -0600
+++ b/chirpui/settingsedit.py Wed Jan 21 23:30:19 2015 -0800
@@ -45,6 +45,7 @@
self._table.show()
sw = gtk.ScrolledWindow()
+ sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
sw.add_with_viewport(self._table)
sw.show()
@@ -144,9 +145,9 @@
if isinstance(element.value, list) and \
isinstance(element.value[0],
settings.RadioSettingValueInteger):
- arraybox = gtk.HBox(3, True)
+ arraybox = gtk.HBox(True, 3)
else:
- arraybox = gtk.VBox(3, True)
+ arraybox = gtk.VBox(True, 3)
pack(arraybox, 1)
arraybox.show()
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://intrepid.danplanet.com/pipermail/chirp_devel/attachments/20150122/cb908f3f/attachment-0001.html
More information about the chirp_devel
mailing list