Files
StreamLens/analyzer/protocols/decoders/registry.py
2025-07-28 08:14:15 -04:00

126 lines
4.9 KiB
Python

"""
Decoder registry for Chapter 10 data types
"""
from typing import Dict, List, Optional, Type
from .base import DataTypeDecoder, DecodedPayload
class DecoderRegistry:
"""Registry for Chapter 10 data type decoders"""
def __init__(self):
self._decoders: Dict[int, DataTypeDecoder] = {}
self._decoder_classes: Dict[str, Type[DataTypeDecoder]] = {}
self._register_default_decoders()
def register_decoder(self, decoder: DataTypeDecoder, data_types: List[int]):
"""Register a decoder for specific data types"""
for data_type in data_types:
self._decoders[data_type] = decoder
def register_decoder_class(self, name: str, decoder_class: Type[DataTypeDecoder]):
"""Register a decoder class by name"""
self._decoder_classes[name] = decoder_class
def get_decoder(self, data_type: int) -> Optional[DataTypeDecoder]:
"""Get decoder for specific data type"""
return self._decoders.get(data_type)
def decode_payload(self, payload: bytes, ch10_header: Dict[str, any]) -> Optional[DecodedPayload]:
"""Decode payload using appropriate decoder"""
data_type = ch10_header.get('data_type', 0)
decoder = self.get_decoder(data_type)
if decoder:
return decoder.decode(payload, ch10_header)
# Return basic decoded payload if no specific decoder found
return DecodedPayload(
data_type=data_type,
data_type_name=f"Unknown (0x{data_type:02X})",
format_version=data_type & 0x0F,
decoded_data={'raw_data': payload.hex()},
raw_payload=payload,
errors=[f"No decoder available for data type 0x{data_type:02X}"],
metadata={'decoder': 'fallback'}
)
def list_supported_types(self) -> List[int]:
"""List all supported data types"""
return sorted(self._decoders.keys())
def get_decoder_info(self) -> Dict[int, str]:
"""Get information about registered decoders"""
return {
data_type: decoder.__class__.__name__
for data_type, decoder in self._decoders.items()
}
def _register_default_decoders(self):
"""Register default decoders for known data types"""
from .tspi_cts import TSPICTSDecoder, ACTTSDecoder, GPSNMEADecoder, EAGACMIDecoder
from .image import ImageDecoder
from .uart import UARTDecoder
from .ieee1394 import IEEE1394Decoder
from .parallel import ParallelDecoder
from .ethernet import EthernetDecoder
from .can_bus import CANBusDecoder
from .fibre_channel import FibreChannelDecoder
from .custom_timing import CustomTimingDecoder
# Register custom timing decoder for proprietary formats
custom_timing_decoder = CustomTimingDecoder()
# Register for all 0x72xx-0x78xx variants
custom_timing_types = []
for base in range(0x72, 0x79):
for variant in range(0x00, 0x100):
custom_timing_types.append((base << 8) | variant)
self.register_decoder(custom_timing_decoder, custom_timing_types)
# Register TSPI/CTS decoders
tspi_decoder = TSPICTSDecoder()
self.register_decoder(tspi_decoder, list(range(0x70, 0x78)))
# Register specific TSPI/CTS decoders for better handling
self.register_decoder(GPSNMEADecoder(), [0x70])
self.register_decoder(EAGACMIDecoder(), [0x71])
self.register_decoder(ACTTSDecoder(), [0x72])
# Register Image decoders
image_decoder = ImageDecoder()
self.register_decoder(image_decoder, list(range(0x4A, 0x50)))
# Register other decoders
self.register_decoder(UARTDecoder(), [0x50])
ieee1394_decoder = IEEE1394Decoder()
self.register_decoder(ieee1394_decoder, [0x58, 0x59])
self.register_decoder(ParallelDecoder(), [0x60])
ethernet_decoder = EthernetDecoder()
self.register_decoder(ethernet_decoder, [0x68, 0x69])
self.register_decoder(CANBusDecoder(), [0x78])
self.register_decoder(FibreChannelDecoder(), [0x79])
# Register decoder classes for factory pattern
self._decoder_classes.update({
'TSPICTSDecoder': TSPICTSDecoder,
'ACTTSDecoder': ACTTSDecoder,
'GPSNMEADecoder': GPSNMEADecoder,
'EAGACMIDecoder': EAGACMIDecoder,
'ImageDecoder': ImageDecoder,
'UARTDecoder': UARTDecoder,
'IEEE1394Decoder': IEEE1394Decoder,
'ParallelDecoder': ParallelDecoder,
'EthernetDecoder': EthernetDecoder,
'CANBusDecoder': CANBusDecoder,
'FibreChannelDecoder': FibreChannelDecoder,
'CustomTimingDecoder': CustomTimingDecoder
})
# Global decoder registry instance
decoder_registry = DecoderRegistry()