Skip to content

Commit afbabf9

Browse files
committed
Merge branch 'bugfix-466-yaml-import'
2 parents 760fcfc + d810712 commit afbabf9

1 file changed

Lines changed: 31 additions & 20 deletions

File tree

meshtastic/__main__.py

Lines changed: 31 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -125,25 +125,46 @@ def getPref(node, comp_name):
125125

126126
def splitCompoundName(comp_name):
127127
"""Split compound (dot separated) preference name into parts"""
128-
name = comp_name.split(".", 1)
129-
if len(name) != 2:
128+
name = comp_name.split(".")
129+
if len(name) < 2:
130130
name[0] = comp_name
131131
name.append(comp_name)
132132
return name
133133

134+
def traverseConfig(config_root, config, interface_config):
135+
"""Iterate through current config level preferences and either traverse deeper if preference is a dict or set preference"""
136+
snake_name = meshtastic.util.camel_to_snake(config_root)
137+
for pref in config:
138+
pref_name = f"{snake_name}.{pref}"
139+
if isinstance(config[pref], dict):
140+
traverseConfig(pref_name, config[pref], interface_config)
141+
else:
142+
setPref(
143+
interface_config,
144+
pref_name,
145+
str(config[pref])
146+
)
147+
148+
return True
134149

135150
def setPref(config, comp_name, valStr) -> bool:
136151
"""Set a channel or preferences value"""
137152

138153
name = splitCompoundName(comp_name)
139154

140-
snake_name = meshtastic.util.camel_to_snake(name[1])
141-
camel_name = meshtastic.util.snake_to_camel(name[1])
155+
snake_name = meshtastic.util.camel_to_snake(name[-1])
156+
camel_name = meshtastic.util.snake_to_camel(name[-1])
142157
logging.debug(f"snake_name:{snake_name}")
143158
logging.debug(f"camel_name:{camel_name}")
144159

145160
objDesc = config.DESCRIPTOR
161+
config_part = config
146162
config_type = objDesc.fields_by_name.get(name[0])
163+
if config_type and config_type.message_type is not None:
164+
for name_part in name[1:-1]:
165+
part_snake_name = meshtastic.util.camel_to_snake((name_part))
166+
config_part = getattr(config, config_type.name)
167+
config_type = config_type.message_type.fields_by_name.get(part_snake_name)
147168
pref = None
148169
if config_type and config_type.message_type is not None:
149170
pref = config_type.message_type.fields_by_name.get(snake_name)
@@ -190,13 +211,13 @@ def setPref(config, comp_name, valStr) -> bool:
190211
if snake_name != "ignore_incoming":
191212
try:
192213
if config_type.message_type is not None:
193-
config_values = getattr(config, config_type.name)
214+
config_values = getattr(config_part, config_type.name)
194215
setattr(config_values, pref.name, val)
195216
else:
196-
setattr(config, snake_name, val)
217+
setattr(config_part, snake_name, val)
197218
except TypeError:
198219
# The setter didn't like our arg type guess try again as a string
199-
config_values = getattr(config, config_type.name)
220+
config_values = getattr(config_part, config_type.name)
200221
setattr(config_values, pref.name, valStr)
201222
else:
202223
if val == 0:
@@ -207,7 +228,7 @@ def setPref(config, comp_name, valStr) -> bool:
207228
print(f"Adding '{val}' to the ignore_incoming list")
208229
config_type.message_type.ignore_incoming.extend([val])
209230

210-
prefix = f"{name[0]}." if config_type.message_type is not None else ""
231+
prefix = f"{".".join(name[0:-1])}." if config_type.message_type is not None else ""
211232
if mt_config.camel_case:
212233
print(f"Set {prefix}{camel_name} to {valStr}")
213234
else:
@@ -549,25 +570,15 @@ def onConnected(interface):
549570
if "config" in configuration:
550571
localConfig = interface.getNode(args.dest).localConfig
551572
for section in configuration["config"]:
552-
for pref in configuration["config"][section]:
553-
setPref(
554-
localConfig,
555-
f"{meshtastic.util.camel_to_snake(section)}.{pref}",
556-
str(configuration["config"][section][pref]),
557-
)
573+
traverseConfig(section, configuration["config"][section], localConfig)
558574
interface.getNode(args.dest).writeConfig(
559575
meshtastic.util.camel_to_snake(section)
560576
)
561577

562578
if "module_config" in configuration:
563579
moduleConfig = interface.getNode(args.dest).moduleConfig
564580
for section in configuration["module_config"]:
565-
for pref in configuration["module_config"][section]:
566-
setPref(
567-
moduleConfig,
568-
f"{meshtastic.util.camel_to_snake(section)}.{pref}",
569-
str(configuration["module_config"][section][pref]),
570-
)
581+
traverseConfig(section, configuration["module_config"][section], moduleConfig)
571582
interface.getNode(args.dest).writeConfig(
572583
meshtastic.util.camel_to_snake(section)
573584
)

0 commit comments

Comments
 (0)