pretty good
This commit is contained in:
69
analyzer/protocols/decoders/uart.py
Normal file
69
analyzer/protocols/decoders/uart.py
Normal file
@@ -0,0 +1,69 @@
|
||||
"""
|
||||
UART Data decoder for Chapter 10 data types
|
||||
Supports UART Data Format 0 (0x50)
|
||||
"""
|
||||
|
||||
import struct
|
||||
from typing import Dict, Any, Optional
|
||||
from .base import DataTypeDecoder, DecodedPayload
|
||||
|
||||
|
||||
class UARTDecoder(DataTypeDecoder):
|
||||
"""Decoder for UART Data type (0x50)"""
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
self.data_type_base = 0x50
|
||||
self.data_type_name = "UART Data"
|
||||
self.supported_formats = [0x50]
|
||||
|
||||
def can_decode(self, data_type: int) -> bool:
|
||||
return data_type == 0x50
|
||||
|
||||
def get_data_type_name(self, data_type: int) -> str:
|
||||
return "UART Data Format 0"
|
||||
|
||||
def decode(self, payload: bytes, ch10_header: Dict[str, Any]) -> Optional[DecodedPayload]:
|
||||
"""Decode UART payload"""
|
||||
decoded_data = {}
|
||||
errors = []
|
||||
|
||||
# Parse IPH
|
||||
iph = self._parse_intra_packet_header(payload)
|
||||
if iph:
|
||||
decoded_data.update(iph)
|
||||
data_start = iph['data_start']
|
||||
else:
|
||||
data_start = 0
|
||||
errors.append("Failed to parse intra-packet header")
|
||||
|
||||
# Parse UART data
|
||||
if data_start < len(payload):
|
||||
uart_data = payload[data_start:]
|
||||
decoded_data['uart_data_length'] = len(uart_data)
|
||||
|
||||
# Try to decode as text
|
||||
try:
|
||||
text_data = uart_data.decode('ascii', errors='ignore')
|
||||
decoded_data['ascii_data'] = text_data
|
||||
decoded_data['printable_chars'] = sum(1 for c in text_data if c.isprintable())
|
||||
except:
|
||||
decoded_data['ascii_decode_failed'] = True
|
||||
|
||||
# Raw hex representation
|
||||
decoded_data['raw_hex'] = uart_data[:256].hex() # First 256 bytes
|
||||
|
||||
# Basic statistics
|
||||
decoded_data['null_count'] = uart_data.count(0)
|
||||
decoded_data['cr_count'] = uart_data.count(ord('\r'))
|
||||
decoded_data['lf_count'] = uart_data.count(ord('\n'))
|
||||
|
||||
return DecodedPayload(
|
||||
data_type=0x50,
|
||||
data_type_name="UART Data Format 0",
|
||||
format_version=0,
|
||||
decoded_data=decoded_data,
|
||||
raw_payload=payload,
|
||||
errors=errors,
|
||||
metadata={'decoder': 'UARTDecoder'}
|
||||
)
|
||||
Reference in New Issue
Block a user