diff --git a/adafruit_ble/advertising/standard.py b/adafruit_ble/advertising/standard.py index 0d1b5f7..632ff44 100644 --- a/adafruit_ble/advertising/standard.py +++ b/adafruit_ble/advertising/standard.py @@ -29,7 +29,7 @@ """ import struct -from collections import OrderedDict +from collections import OrderedDict, namedtuple from . import ( Advertisement, @@ -268,6 +268,9 @@ def __init__(self, key, value_format, field_names=None): ) self._entry_length = struct.calcsize(value_format) self.field_names = field_names + if field_names: + # Mostly, this is to raise a ValueError if field_names has invalid entries + self.mdf_tuple = namedtuple("mdf_tuple", self.field_names) def __get__(self, obj, cls): if obj is None: @@ -279,6 +282,10 @@ def __get__(self, obj, cls): unpacked = struct.unpack_from(self._format, packed) if self.element_count == 1: unpacked = unpacked[0] + if self.field_names and len(self.field_names) == len(unpacked): + # If we have field names, we should already have a namedtuple type to use + # Unless the element count is off, which... werid. + return self.mdf_tuple(*unpacked) return unpacked if len(packed) % self._entry_length != 0: raise RuntimeError("Invalid data length")