Skip to content

Commit 9c0bf9c

Browse files
committed
Move settings infrastructure into a separate mixin
The settings "stuff" added in commit 3506133 is generally useful to other live drivers that want to expose settings, so split it out into a generic mixin rather than having it as part of the KenwoodD7Family class.
1 parent 3506133 commit 9c0bf9c

File tree

2 files changed

+240
-210
lines changed

2 files changed

+240
-210
lines changed

chirp/drivers/kenwood_d7.py

Lines changed: 54 additions & 210 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
RadioSettingValueInteger, RadioSettingValueBoolean, \
2424
RadioSettingValueString, RadioSettingValueList, RadioSettingValueMap, \
2525
RadioSettings, RadioSettingValueFloat
26+
from chirp.drivers.settings_mixin import SettingsMixin
2627

2728
LOG = logging.getLogger(__name__)
2829

@@ -57,7 +58,7 @@ def __init__(self, name, shortname, radio, *args, **kwargs):
5758
RadioSettingValueBoolean(False))
5859
self.append(rs)
5960

60-
def kenwood_d7_read_value(self):
61+
def read_setting_from_radio(self):
6162
index = self._get_index()
6263
name = self.get_name()
6364
rawval = self._radio._kenwood_get(name)[1]
@@ -102,7 +103,7 @@ def changed(self):
102103
return True
103104
return False
104105

105-
def kenwood_d7_set_value(self):
106+
def set_setting_to_radio(self):
106107
index = self._get_index()
107108
latd = self['latd%s' % index].value.get_value()
108109
latm = self['latm%s' % index].value.get_value()
@@ -151,7 +152,7 @@ def __init__(self, name, shortname, radio, *args, **kwargs):
151152
def _get_index(self):
152153
return "%02d" % int(self._name.split(" ", 1)[1])
153154

154-
def kenwood_d7_read_value(self):
155+
def read_setting_from_radio(self):
155156
index = self._get_index()
156157
value = self._radio._kenwood_get("DM %s" % index)[1]
157158
value = value.replace("E", "*").replace("F", "#")
@@ -167,7 +168,7 @@ def changed(self):
167168
return True
168169
return False
169170

170-
def kenwood_d7_set_value(self):
171+
def set_setting_to_radio(self):
171172
for element in self:
172173
if not element.changed():
173174
continue
@@ -198,7 +199,7 @@ def _get_index(self, element):
198199
name = element.get_name()
199200
return int(name.split(" ", 1)[1])
200201

201-
def kenwood_d7_read_value(self):
202+
def read_setting_from_radio(self):
202203
for element in self:
203204
index = self._get_index(element)
204205
rv = self._radio._kenwood_get("PV %d" % index)[1]
@@ -221,7 +222,7 @@ def changed(self):
221222

222223
# TODO: Custom validator things...
223224

224-
def kenwood_d7_set_value(self):
225+
def set_setting_to_radio(self):
225226
for element in self:
226227
index = self._get_index(element)
227228
pvdl = "PV %dL" % index
@@ -235,7 +236,7 @@ def kenwood_d7_set_value(self):
235236
element[pvdu].value._has_changed = False
236237

237238

238-
class KenwoodD7Family(chirp_common.LiveRadio):
239+
class KenwoodD7Family(SettingsMixin, chirp_common.LiveRadio):
239240
VENDOR = "Kenwood"
240241
MODEL = ""
241242
NEEDS_COMPAT_SERIAL = False
@@ -496,6 +497,34 @@ def _call_index(self, memid_or_index):
496497
def _call_index_to_memid(self, index):
497498
return self._CALL_CHANS[index]
498499

500+
def _command(self, cmd, *args):
501+
"""Send @cmd to radio via @ser"""
502+
503+
# This lock is needed to allow clicking the settings tab while
504+
# the memories are still loading. Most important with the TH-D7A
505+
# and TH-D7A(G) with the 9600bps maximum.
506+
with self._LOCK:
507+
if args:
508+
cmd += self._ARG_DELIMITER + self._ARG_DELIMITER.join(args)
509+
cmd += self._CMD_DELIMITER
510+
self._drain_input()
511+
512+
LOG.debug("PC->RADIO: %s" % cmd.strip())
513+
self.pipe.write(cmd.encode('cp1252'))
514+
cd = self._CMD_DELIMITER.encode('cp1252')
515+
keep_reading = True
516+
while keep_reading:
517+
result = self.pipe.read_until(cd).decode('cp1252')
518+
if result.endswith(self._CMD_DELIMITER):
519+
keep_reading = self._keep_reading(result)
520+
LOG.debug("RADIO->PC: %r" % result.strip())
521+
result = result[:-1]
522+
else:
523+
keep_reading = False
524+
LOG.error("Timeout waiting for data")
525+
526+
return result.strip()
527+
499528
def _cmd_get_memory_name(self, memid):
500529
return "MNA", "%i,%s" % (self._vfo, memid)
501530

@@ -520,84 +549,6 @@ def _cmd_set_memory_or_split(self, memid, memory, split):
520549
return "CW", "%d,%d%s" % (self._call_index(memid), sd, spec)
521550
return "MW", "%i,%d,%s%s" % (self._vfo, sd, memid, spec)
522551

523-
def _count_settings(self, entries):
524-
for entry in entries:
525-
if (type(entry[1]) is tuple):
526-
self._count_settings(entry[1])
527-
else:
528-
self._setting_count += 1
529-
530-
def _create_group(self, entries, grp=None):
531-
if grp is None:
532-
grp = RadioSettings()
533-
for entry in entries:
534-
if (type(entry[1]) is tuple):
535-
subgrp = RadioSettingGroup(entry[0].lower(), entry[0])
536-
grp.append(self._create_group(entry[1], subgrp))
537-
else:
538-
setting = self._get_setting_data(entry[0])
539-
if setting['type'] == 'undefined':
540-
continue
541-
if setting['type'] == 'list':
542-
rsvl = RadioSettingValueList(setting['values'])
543-
rs = RadioSetting(entry[0], entry[1], rsvl)
544-
elif setting['type'] == 'bool':
545-
rs = RadioSetting(entry[0], entry[1],
546-
RadioSettingValueBoolean(False))
547-
elif setting['type'] == 'string':
548-
params = {}
549-
if 'charset' in setting:
550-
params['charset'] = setting['charset']
551-
else:
552-
params['charset'] = chirp_common.CHARSET_ASCII
553-
minlen = 'min_len' in setting and setting['min_len'] or 0
554-
dummy = params['charset'][0] * minlen
555-
rsvs = RadioSettingValueString(minlen,
556-
setting['max_len'],
557-
dummy,
558-
False, **params)
559-
rs = RadioSetting(entry[0], entry[1], rsvs)
560-
elif setting['type'] == 'integer':
561-
rs = RadioSetting(entry[0], entry[1],
562-
RadioSettingValueInteger(setting['min'],
563-
setting['max'],
564-
setting['min']))
565-
elif setting['type'] == 'map':
566-
rsvs = RadioSettingValueMap(setting['map'],
567-
setting['map'][0][1])
568-
rs = RadioSetting(entry[0], entry[1], rsvs)
569-
else:
570-
rs = setting['type'](entry[0], entry[1], self)
571-
rs.kenwood_d7_loaded = False
572-
grp.append(rs)
573-
self._setcache[entry[0]] = rs
574-
return grp
575-
576-
def _do_prerequisite(self, cmd, get, do):
577-
if get:
578-
arg = 'get_requires'
579-
else:
580-
arg = 'set_requires'
581-
setting = self._get_setting_data(cmd)
582-
if arg not in setting:
583-
return
584-
# Undo prerequisites in the reverse order they were applied
585-
if not do:
586-
it = reversed(setting[arg])
587-
else:
588-
it = iter(setting[arg])
589-
for prereq, value in it:
590-
entry = self._setcache[prereq]
591-
if not entry.kenwood_d7_loaded:
592-
self._refresh_setting(entry)
593-
if do:
594-
entry.kenwood_d7_old_value = entry.value.get_value()
595-
entry.value.set_value(value)
596-
else:
597-
entry.value.set_value(entry.kenwood_d7_old_value)
598-
sdata = self._get_setting_data(prereq)
599-
self._set_setting(prereq, sdata, entry)
600-
601552
def _drain_input(self):
602553
oldto = self.pipe.timeout
603554
self.pipe.timeout = 0
@@ -657,15 +608,6 @@ def _get_immutable(self, memid_or_index):
657608
return ['skip']
658609
return []
659610

660-
def _get_setting_data(self, setting):
661-
if setting in self._SETTINGS:
662-
return self._SETTINGS[setting]
663-
if setting in self._COMMON_SETTINGS:
664-
return self._COMMON_SETTINGS[setting]
665-
if (setting.upper() == setting):
666-
LOG.debug("Undefined setting: %s" % setting)
667-
return {'type': 'undefined'}
668-
669611
def _get_setting_digits(self, setting_data):
670612
if 'digits' in setting_data:
671613
return setting_data['digits']
@@ -881,46 +823,33 @@ def _parse_split(self, mem, result):
881823
else:
882824
mem.offset = int(spec[3])
883825

884-
def _refresh_setting(self, entry):
826+
def _read_setting_from_radio(self, entry, setting):
885827
name = entry.get_name()
886-
setting = self._get_setting_data(name)
887-
# TODO: It would be nice to bump_wait_dialog here...
888-
# Also, this is really only useful for the cli. :(
889-
if self.status_fn:
890-
status = chirp_common.Status()
891-
status.cur = self._cur_setting
892-
status.max = self._setting_count
893-
status.msg = "Fetching %-30s" % entry.get_shortname()
894-
# self.bump_wait_dialog(int(status.cur * 100 / status.max),
895-
# "Fetching %s" % entry[1])
896-
self.status_fn(status)
897-
self._cur_setting += 1
898-
if setting['type'] == 'list':
828+
LOG.debug('Type of %s is %s' % (name, setting['type']))
829+
if setting['type'] in ('integer', 'list'):
899830
value = self._kenwood_get_int(name)
900-
entry.value.set_index(value)
901831
elif setting['type'] == 'bool':
902832
value = self._kenwood_get_bool(name)
903-
entry.value.set_value(value)
904833
elif setting['type'] == 'string':
905834
value = self._kenwood_get(name)[1]
906-
entry.value.set_value(value)
907-
elif setting['type'] == 'integer':
908-
value = self._kenwood_get_int(name)
909-
entry.value.set_value(value)
910835
elif setting['type'] == 'map':
911836
value = self._kenwood_get(name)[1]
912-
entry.value.set_mem_val(value)
913-
else:
914-
entry.kenwood_d7_read_value()
915-
if hasattr(entry, 'value'):
916-
if hasattr(entry.value, '_has_changed'):
917-
entry.value._has_changed = False
918-
entry.kenwood_d7_loaded = True
919837

920-
def _refresh_settings(self):
921-
for entry in self._setcache.values():
922-
if not entry.kenwood_d7_loaded:
923-
self._refresh_setting(entry)
838+
LOG.debug('Returning %r as %s %s' % (value, setting['type'], name))
839+
return value
840+
841+
def _set_setting_to_radio(self, entry, setting):
842+
value = entry.value.get_value()
843+
name = entry.get_name()
844+
if setting['type'] in ('integer', 'list'):
845+
digits = self._get_setting_digits(setting)
846+
self._kenwood_set_int(name, value, digits)
847+
elif setting['type'] == 'bool':
848+
self._kenwood_set_bool(name, value)
849+
elif setting['type'] == 'string':
850+
self._kenwood_set(name, value)
851+
elif setting['type'] == 'map':
852+
self._kenwood_set(name, entry.value.get_mem_val())
924853

925854
def _validate_memid(self, memid_or_index):
926855
if isinstance(memid_or_index, int):
@@ -942,66 +871,6 @@ def _validate_memory(self, memory):
942871
return self._validate_memid(memory.extd_number)
943872
return self._validate_memid(memory.number)
944873

945-
def _set_setting(self, name, sdata, element):
946-
if sdata['type'] == 'bool':
947-
value = element.value.get_value()
948-
self._kenwood_set_bool(name, value)
949-
element.value._has_changed = False
950-
elif sdata['type'] == 'integer':
951-
value = element.value.get_value()
952-
digits = self._get_setting_digits(sdata)
953-
self._kenwood_set_int(name, value, digits)
954-
element.value._has_changed = False
955-
elif sdata['type'] == 'string':
956-
value = element.value.get_value()
957-
self._kenwood_set(name, value)
958-
element.value._has_changed = False
959-
elif sdata['type'] == 'list':
960-
value = element.value.get_value()
961-
digits = self._get_setting_digits(sdata)
962-
self._kenwood_set_int(name, sdata['values'].index(value),
963-
digits)
964-
element.value._has_changed = False
965-
elif sdata['type'] == 'map':
966-
self._kenwood_set(name, element.value.get_mem_val())
967-
element.value._has_changed = False
968-
# TODO: I would like to have tried this first then fetched
969-
# value, but we can't use hasattr() on settings due to the
970-
# Magic foo.value attribute in chirp/settings.py. Instead,
971-
# I need to get_value() each time. :(
972-
elif hasattr(element, 'kenwood_d7_set_value'):
973-
element.kenwood_d7_set_value()
974-
else:
975-
raise TypeError('No way to set %s value' % name)
976-
977-
def _command(self, cmd, *args):
978-
"""Send @cmd to radio via @ser"""
979-
980-
# This lock is needed to allow clicking the settings tab while
981-
# the memories are still loading. Most important with the TH-D7A
982-
# and TH-D7A(G) with the 9600bps maximum.
983-
with self._LOCK:
984-
if args:
985-
cmd += self._ARG_DELIMITER + self._ARG_DELIMITER.join(args)
986-
cmd += self._CMD_DELIMITER
987-
self._drain_input()
988-
989-
LOG.debug("PC->RADIO: %s" % cmd.strip())
990-
self.pipe.write(cmd.encode('cp1252'))
991-
cd = self._CMD_DELIMITER.encode('cp1252')
992-
keep_reading = True
993-
while keep_reading:
994-
result = self.pipe.read_until(cd).decode('cp1252')
995-
if result.endswith(self._CMD_DELIMITER):
996-
keep_reading = self._keep_reading(result)
997-
LOG.debug("RADIO->PC: %r" % result.strip())
998-
result = result[:-1]
999-
else:
1000-
keep_reading = False
1001-
LOG.error("Timeout waiting for data")
1002-
1003-
return result.strip()
1004-
1005874
def erase_memory(self, memid_or_index):
1006875
index, memid = self._validate_memid(memid_or_index)
1007876
if memid not in self._memcache:
@@ -1072,19 +941,6 @@ def get_memory(self, memid_or_index):
1072941

1073942
return mem
1074943

1075-
def get_settings(self):
1076-
if self._setting_count == 0:
1077-
self._count_settings(self._SETTINGS_MENUS)
1078-
ret = self._create_group(self._SETTINGS_MENUS)
1079-
self._cur_setting = 0
1080-
self._refresh_settings()
1081-
status = chirp_common.Status()
1082-
status.cur = self._setting_count
1083-
status.max = self._setting_count
1084-
status.msg = "%-40s" % "Done"
1085-
self.status_fn(status)
1086-
return ret
1087-
1088944
def set_memory(self, memory):
1089945
index, memid = self._validate_memory(memory)
1090946
if memory.empty:
@@ -1112,18 +968,6 @@ def set_memory(self, memory):
1112968
raise errors.InvalidDataError("Radio refused %s" %
1113969
memid)
1114970

1115-
def set_settings(self, settings):
1116-
for element in settings:
1117-
name = element.get_name()
1118-
sdata = self._get_setting_data(name)
1119-
if sdata['type'] == 'undefined':
1120-
if isinstance(element, RadioSettingGroup):
1121-
self.set_settings(element)
1122-
continue
1123-
if not element.changed():
1124-
continue
1125-
self._set_setting(name, sdata, element)
1126-
1127971

1128972
@directory.register
1129973
class THD7Radio(KenwoodD7Family):

0 commit comments

Comments
 (0)