fix info timer block

This commit is contained in:
VALLONGOL 2025-06-24 15:03:09 +02:00
parent 3f2ba715c1
commit 718ee64086
2 changed files with 43 additions and 46 deletions

View File

@ -505,6 +505,7 @@ class TimerRawIf(CtypesStructureBase):
""" """
_fields_ = [ _fields_ = [
# --- Part 1 & 2: Confirmed Stable (fino a offset 0x280) ---
("tcr", ctypes.c_uint32), ("tcr", ctypes.c_uint32),
("tpr", ctypes.c_uint32), ("tpr", ctypes.c_uint32),
("tor", ctypes.c_uint32), ("tor", ctypes.c_uint32),
@ -513,21 +514,23 @@ class TimerRawIf(CtypesStructureBase):
("diff_prt_num", ctypes.c_uint16), ("diff_prt_num", ctypes.c_uint16),
("spares__", ctypes.c_uint32 * 3), ("spares__", ctypes.c_uint32 * 3),
("shift", ShiftRegisters), ("shift", ShiftRegisters),
("spare_after_shift", ctypes.c_byte * (12)), # Padding fino a 0x50 ("spare_after_shift", ctypes.c_byte * 12),
# Offset in C++: 0x50 ("aesa_delay", UniquePrtFifo * 2),
( ("spare0__", ctypes.c_byte * 48),
"aesa_delay", ("exp_pulse1_delay", UniquePrtFifo * 2),
UniquePrtFifo * 2, ("exp_pulse2_delay", UniquePrtFifo * 2),
), # Dimensione: 64 bytes * 2 = 128 bytes. Va da 0x50 a 0xD0 ("pretrigger_det_delay", UniquePrtFifo * 2),
(
"spare0__", # --- Part 3: New Expansion ---
ctypes.c_byte * 48, # Offset in C++: 0x280
), # Padding per raggiungere 0x100 (da 0xD0 a 0x100) ("rx_synch", DelayWithPeriod * 2),
# Offset in C++: 0x100
("exp_pulse1_delay", UniquePrtFifo * 2), # da 0x100 a 0x180 # Offset: 0x280 + sizeof(DelayWithPeriod * 2) -> 0x400
("exp_pulse2_delay", UniquePrtFifo * 2), # da 0x180 a 0x200 ("cf_synch", DelayWithPeriod * 2),
# Offset in C++: 0x200
("pretrigger_det_delay", UniquePrtFifo * 2), # da 0x200 a 0x280 # Offset: 0x400 + sizeof(DelayWithPeriod * 2) -> 0x580
("ew_synch", DelayWithPeriod * 2),
# Il resto è omesso per ora # Il resto è omesso per ora
] ]

View File

@ -85,46 +85,40 @@ def _parse_cdpsts_block(
) )
def _parse_timer_block( def _parse_timer_block(block_data_bytes: bytes, block_name: str, block_size_words: int) -> ds.TimerBlock:
block_data_bytes: bytes, block_name: str, block_size_words: int
) -> ds.TimerBlock:
""" """
Parses a TIMER block by mapping it to the GrifoTimerBlob ctypes structure. Parses a TIMER block by mapping it to the GrifoTimerBlob ctypes structure.
This version flexibly handles blocks that may be smaller than the full struct size.
""" """
required_size = ctypes.sizeof(ds.GrifoTimerBlob) full_struct_size = ctypes.sizeof(ds.GrifoTimerBlob)
if len(block_data_bytes) < required_size: actual_block_size = len(block_data_bytes)
log.warning(
f"TIMER block is too small for GrifoTimerBlob. Size: {len(block_data_bytes)}, Required: {required_size}" # We can only map the data that is actually present in the file.
) mappable_size = min(full_struct_size, actual_block_size)
return ds.TimerBlock(
block_name=block_name, block_size_words=block_size_words, is_valid=False # We still need at least the header to proceed.
) header_size = ctypes.sizeof(ds.GrifoFwBlobHeader)
if actual_block_size < header_size:
log.warning(f"TIMER block is too small to even contain a header. Size: {actual_block_size}")
return ds.TimerBlock(block_name=block_name, block_size_words=block_size_words, is_valid=False)
try: try:
timer_blob = ds.GrifoTimerBlob.from_buffer_copy(block_data_bytes) # Create an empty instance of the full struct first
timer_blob = ds.GrifoTimerBlob()
# Validate using the internal header marker
is_valid = ( # Copy the available data from the file into our struct instance
timer_blob.hdr.header_marker == 0x12345678 ctypes.memmove(ctypes.addressof(timer_blob), block_data_bytes, mappable_size)
and timer_blob.hdr.sub_marker == 0x54494D45
) # 'TIME' # Validate using the internal header marker, which should always be present.
is_valid = (timer_blob.hdr.header_marker == 0x12345678 and timer_blob.hdr.sub_marker == 0x54494D45) # 'TIME'
if not is_valid: if not is_valid:
log.debug( log.debug("TIMER block has an invalid internal Grifo FW blob header marker.")
"TIMER block has an invalid internal Grifo FW blob header marker."
) return ds.TimerBlock(block_name=block_name, block_size_words=block_size_words, is_valid=is_valid, blob=timer_blob)
return ds.TimerBlock(
block_name=block_name,
block_size_words=block_size_words,
is_valid=is_valid,
blob=timer_blob,
)
except Exception as e: except Exception as e:
log.error(f"Failed to map data to GrifoTimerBlob: {e}", exc_info=True) log.error(f"Failed to map data to GrifoTimerBlob: {e}", exc_info=True)
return ds.TimerBlock( return ds.TimerBlock(block_name=block_name, block_size_words=block_size_words, is_valid=False)
block_name=block_name, block_size_words=block_size_words, is_valid=False
)
def _parse_signal_block( def _parse_signal_block(