2323 RadioSettingValueInteger , RadioSettingValueBoolean , \
2424 RadioSettingValueString , RadioSettingValueList , RadioSettingValueMap , \
2525 RadioSettings , RadioSettingValueFloat
26+ from chirp .drivers .settings_mixin import SettingsMixin
2627
2728LOG = 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
1129973class THD7Radio (KenwoodD7Family ):
0 commit comments