Skip to content

Commit 590b60f

Browse files
committed
Allow 'configure' to import yaml settings nested deepr than 2 levels
Resolves #466
1 parent 70bb58b commit 590b60f

1 file changed

Lines changed: 28 additions & 13 deletions

File tree

meshtastic/__main__.py

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -128,25 +128,45 @@ def getPref(node, comp_name):
128128

129129
def 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

138152
def 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

Comments
 (0)