126 lines
4.9 KiB
Python
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() |