@@ -128,25 +128,45 @@ def getPref(node, comp_name):
128128
129129def splitCompoundName (comp_name ):
130130 """Split compound (dot separated) preference name into parts"""
131- name = comp_name .split ("." , 1 )
132- if len (name ) != 2 :
131+ name = comp_name .split ("." )
132+ if len (name ) < 2 :
133133 name [0 ] = comp_name
134134 name .append (comp_name )
135135 return name
136136
137+ def traverseConfig (config_root , config , interface_config ):
138+ snake_name = meshtastic .util .camel_to_snake (config_root )
139+ for pref in config :
140+ pref_name = f"{ snake_name } .{ pref } "
141+ if isinstance (config [pref ], dict ):
142+ traverseConfig (pref_name , config [pref ], interface_config )
143+ else :
144+ setPref (
145+ interface_config ,
146+ pref_name ,
147+ str (config [pref ])
148+ )
149+
150+ return True
137151
138152def setPref (config , comp_name , valStr ):
139153 """Set a channel or preferences value"""
140154
141155 name = splitCompoundName (comp_name )
142156
143- snake_name = meshtastic .util .camel_to_snake (name [1 ])
144- camel_name = meshtastic .util .snake_to_camel (name [1 ])
157+ snake_name = meshtastic .util .camel_to_snake (name [- 1 ])
158+ camel_name = meshtastic .util .snake_to_camel (name [- 1 ])
145159 logging .debug (f"snake_name:{ snake_name } " )
146160 logging .debug (f"camel_name:{ camel_name } " )
147161
148162 objDesc = config .DESCRIPTOR
163+ config_part = config
149164 config_type = objDesc .fields_by_name .get (name [0 ])
165+ if config_type and config_type .message_type is not None :
166+ for name_part in name [1 :- 1 ]:
167+ part_snake_name = meshtastic .util .camel_to_snake ((name_part ))
168+ config_part = getattr (config , config_type .name )
169+ config_type = config_type .message_type .fields_by_name .get (part_snake_name )
150170 pref = False
151171 if config_type and config_type .message_type is not None :
152172 pref = config_type .message_type .fields_by_name .get (snake_name )
@@ -193,13 +213,13 @@ def setPref(config, comp_name, valStr):
193213 if snake_name != "ignore_incoming" :
194214 try :
195215 if config_type .message_type is not None :
196- config_values = getattr (config , config_type .name )
216+ config_values = getattr (config_part , config_type .name )
197217 setattr (config_values , pref .name , val )
198218 else :
199- setattr (config , snake_name , val )
219+ setattr (config_part , snake_name , val )
200220 except TypeError :
201221 # The setter didn't like our arg type guess try again as a string
202- config_values = getattr (config , config_type .name )
222+ config_values = getattr (config_part , config_type .name )
203223 setattr (config_values , pref .name , valStr )
204224 else :
205225 if val == 0 :
@@ -559,12 +579,7 @@ def onConnected(interface):
559579 if "config" in configuration :
560580 localConfig = interface .getNode (args .dest ).localConfig
561581 for section in configuration ["config" ]:
562- for pref in configuration ["config" ][section ]:
563- setPref (
564- localConfig ,
565- f"{ meshtastic .util .camel_to_snake (section )} .{ pref } " ,
566- str (configuration ["config" ][section ][pref ]),
567- )
582+ traverseConfig (section , configuration ["config" ][section ], localConfig )
568583 interface .getNode (args .dest ).writeConfig (
569584 meshtastic .util .camel_to_snake (section )
570585 )
0 commit comments