diff --git a/meshtastic/node.py b/meshtastic/node.py index 1b89881b..afb5611a 100644 --- a/meshtastic/node.py +++ b/meshtastic/node.py @@ -7,7 +7,7 @@ from typing import Optional, Union, List -from meshtastic.protobuf import admin_pb2, apponly_pb2, channel_pb2, localonly_pb2, mesh_pb2, portnums_pb2 +from meshtastic.protobuf import admin_pb2, apponly_pb2, channel_pb2, config_pb2, localonly_pb2, mesh_pb2, portnums_pb2 from meshtastic.util import ( Timeout, camel_to_snake, @@ -18,6 +18,7 @@ message_to_json, generate_channel_hash, to_node_num, + flags_to_list, ) logger = logging.getLogger(__name__) @@ -54,6 +55,16 @@ def __repr__(self): r += ")" return r + @staticmethod + def position_flags_list(position_flags: int) -> List[str]: + "Return a list of position flags from the given flags integer" + return flags_to_list(config_pb2.Config.PositionConfig.PositionFlags, position_flags) + + @staticmethod + def excluded_modules_list(excluded_modules: int) -> List[str]: + "Return a list of excluded modules from the given flags integer" + return flags_to_list(mesh_pb2.ExcludedModules, excluded_modules) + def module_available(self, excluded_bit: int) -> bool: """Check DeviceMetadata.excluded_modules to see if a module is available.""" meta = getattr(self.iface, "metadata", None) @@ -902,6 +913,18 @@ def onRequestGetMetadata(self, p): logger.debug(f"Received metadata {stripnl(c)}") print(f"\nfirmware_version: {c.firmware_version}") print(f"device_state_version: {c.device_state_version}") + if c.role in config_pb2.Config.DeviceConfig.Role.values(): + print(f"role: {config_pb2.Config.DeviceConfig.Role.Name(c.role)}") + else: + print(f"role: {c.role}") + print(f"position_flags: {self.position_flags_list(c.position_flags)}") + if c.hw_model in mesh_pb2.HardwareModel.values(): + print(f"hw_model: {mesh_pb2.HardwareModel.Name(c.hw_model)}") + else: + print(f"hw_model: {c.hw_model}") + print(f"hasPKC: {c.hasPKC}") + if c.excluded_modules > 0: + print(f"excluded_modules: {self.excluded_modules_list(c.excluded_modules)}") def onResponseRequestChannel(self, p): """Handle the response packet for requesting a channel _requestChannel()""" diff --git a/meshtastic/util.py b/meshtastic/util.py index 9b078494..f11a3af6 100644 --- a/meshtastic/util.py +++ b/meshtastic/util.py @@ -735,3 +735,16 @@ def to_node_num(node_id: Union[int, str]) -> int: return int(s, 10) except ValueError: return int(s, 16) + +def flags_to_list(flag_type, flags: int) -> List[str]: + """Given a flag_type that's a protobuf EnumTypeWrapper, and a flag int, give a list of flags enabled.""" + ret = [] + for key in flag_type.keys(): + if key == "EXCLUDED_NONE": + continue + if flags & flag_type.Value(key): + ret.append(key) + flags = flags - flag_type.Value(key) + if flags > 0: + ret.append(f"UNKNOWN_ADDITIONAL_FLAGS({flags})") + return ret