import inspect from ..lib1553.fields import Field def dump_message(msg_obj): """ Introspects a Message object and prints all its decoded fields. """ cls = msg_obj.__class__ print(f"\n{'='*60}") print(f"MESSAGE: {cls.__name__} (SA: {cls.SUBADDRESS})") print(f"{'-'*60}") # 1. Get all attributes that are instances of our Field descriptors fields = [] for name, obj in cls.__dict__.items(): if isinstance(obj, Field): fields.append((name, obj)) # 2. Sort fields by word_index then start_bit to keep print order logical # (Word 0 Bit 0 comes before Word 0 Bit 5, which comes before Word 1) fields.sort(key=lambda x: (x[1].word_index, x[1].start_bit)) # 3. Print values for name, field_desc in fields: try: # This triggers the __get__ method of the descriptor value = getattr(msg_obj, name) # Format value based on type if isinstance(value, float): val_str = f"{value:.4f}" elif hasattr(value, 'name'): # Enum val_str = f"{value.name} ({value.value})" else: val_str = str(value) print(f"Word {field_desc.word_index:02d} | {name:<25}: {val_str}") except Exception as e: print(f"Word {field_desc.word_index:02d} | {name:<25}: ") print(f"{'='*60}\n")