More decompiling work
This commit is contained in:
@@ -404,6 +404,9 @@ def _semantics_lines(
|
||||
lines.extend(_table_map_comment_lines(_table_map_list(protocol), opts, prefix=" * "))
|
||||
lines.extend(_state_variable_comment_lines(protocol.get("state_variable_candidates"), opts, prefix=" * "))
|
||||
lines.extend(_retry_error_comment_lines(protocol.get("retry_error_model"), opts, prefix=" * "))
|
||||
lines.extend(_gate_queue_comment_lines(protocol.get("gate_queue_model"), opts, prefix=" * "))
|
||||
lines.extend(_tx_report_comment_lines(protocol.get("tx_report_model"), opts, prefix=" * "))
|
||||
lines.extend(_periodic_resend_comment_lines(protocol.get("periodic_resend_model"), opts, prefix=" * "))
|
||||
lines.append(" */")
|
||||
lines.append("")
|
||||
|
||||
@@ -436,6 +439,11 @@ def _semantics_lines(
|
||||
" return 0x01FFu;",
|
||||
"}",
|
||||
"",
|
||||
],
|
||||
)
|
||||
lines.extend(_gate_queue_predicate_function_lines(protocol.get("gate_queue_model")))
|
||||
lines.extend(
|
||||
[
|
||||
"void sci1_process_candidate_protocol_command(void)",
|
||||
"{",
|
||||
" u8 command = sci1_rx_candidate_command();",
|
||||
@@ -605,6 +613,134 @@ def _retry_error_comment_lines(
|
||||
return lines
|
||||
|
||||
|
||||
def _gate_queue_comment_lines(
|
||||
value: object,
|
||||
opts: SerialPseudocodeOptions,
|
||||
*,
|
||||
prefix: str,
|
||||
) -> list[str]:
|
||||
if not isinstance(value, dict):
|
||||
return []
|
||||
lines = [f"{prefix}gate/queue state machine candidate:"]
|
||||
for predicate in _object_list(value.get("predicates")):
|
||||
name = predicate.get("name") or "predicate_candidate"
|
||||
condition = _comment_text(str(predicate.get("condition_candidate") or "condition unknown"))
|
||||
summary = _comment_text(str(predicate.get("summary") or "candidate gate"))
|
||||
lines.append(f"{prefix}- {name}: {condition}; {summary}")
|
||||
for effect in _object_list(value.get("session_effects")):
|
||||
name = effect.get("name") or "session_effect_candidate"
|
||||
summary = _comment_text(str(effect.get("summary") or "candidate session effect"))
|
||||
commands = ", ".join(str(item) for item in effect.get("command_values_hex", []) if item)
|
||||
suffix = f"; commands {commands}" if commands else ""
|
||||
lines.append(f"{prefix}- {name}: {summary}{suffix}")
|
||||
caveat = str(value.get("caveat") or "").strip()
|
||||
if caveat:
|
||||
lines.append(f"{prefix}- caveat: {_comment_text(caveat)}")
|
||||
evidence = _hex_join(value.get("evidence_addresses_hex"))
|
||||
if opts.include_evidence and evidence:
|
||||
lines.append(f"{prefix}- evidence: {evidence}")
|
||||
return lines
|
||||
|
||||
|
||||
def _gate_queue_predicate_function_lines(value: object) -> list[str]:
|
||||
if not isinstance(value, dict):
|
||||
return []
|
||||
return [
|
||||
"static bool sci1_candidate_main_report_gate_open(void)",
|
||||
"{",
|
||||
" bool session_idle = MEM8[0xFAA2u] == 0u;",
|
||||
" bool rx_gate_open = (MEM8[0xFAA5u] & 0x80u) == 0u || MEM8[0xF9C3u] == 0u;",
|
||||
" bool tx_timer_clear = MEM8[0xF9C0u] == 0u;",
|
||||
"",
|
||||
" return session_idle && rx_gate_open && tx_timer_clear;",
|
||||
"}",
|
||||
"",
|
||||
"static bool sci1_candidate_report_queue_nonempty(void)",
|
||||
"{",
|
||||
" return MEM8[0xF9B5u] != MEM8[0xF9B0u];",
|
||||
"}",
|
||||
"",
|
||||
"static bool sci1_candidate_periodic_resend_gate_open(void)",
|
||||
"{",
|
||||
" bool pending = (MEM8[0xFAA5u] & MEM8[0xFAA3u] & 0x80u) != 0u;",
|
||||
" bool period_elapsed = MEM8[0xF9C6u] == 0u && MEM8[0xF9C7u] == 0u;",
|
||||
" bool resend_countdown_active = MEM8[0xF9C8u] != 0u;",
|
||||
"",
|
||||
" return pending && period_elapsed && resend_countdown_active;",
|
||||
"}",
|
||||
"",
|
||||
]
|
||||
|
||||
|
||||
def _tx_report_comment_lines(
|
||||
value: object,
|
||||
opts: SerialPseudocodeOptions,
|
||||
*,
|
||||
prefix: str,
|
||||
) -> list[str]:
|
||||
if not isinstance(value, dict):
|
||||
return []
|
||||
entry = value.get("entry_label") or value.get("entry_address_hex") or "TX report path"
|
||||
source = _comment_text(str(value.get("value_source_candidate") or "current value table"))
|
||||
lines = [f"{prefix}TX/autonomous report model candidate:"]
|
||||
lines.append(f"{prefix}- {entry} -> loc_BA26: bytes 0..2 encode candidate logical index/report id; bytes 3..4 come from {source}; byte5 is 0x5A XOR checksum")
|
||||
overlay = _object_list(value.get("observed_capture_overlay_candidates"))
|
||||
if overlay:
|
||||
observed = []
|
||||
for item in overlay[:3]:
|
||||
name = item.get("name_candidate") or "observed_report_candidate"
|
||||
frames = ", ".join(str(frame) for frame in item.get("observed_frames_hex", []) if frame)
|
||||
if frames:
|
||||
observed.append(f"{name}: {frames}")
|
||||
if observed:
|
||||
lines.append(f"{prefix}- observed overlay candidates: {_comment_text('; '.join(observed))}")
|
||||
caveat = str(value.get("observed_autonomous_output_caveat") or value.get("caveat") or "").strip()
|
||||
if caveat:
|
||||
lines.append(f"{prefix}- caveat: {_comment_text(caveat)}")
|
||||
evidence = _hex_join(value.get("evidence_addresses_hex"))
|
||||
if opts.include_evidence and evidence:
|
||||
lines.append(f"{prefix}- evidence: {evidence}")
|
||||
return lines
|
||||
|
||||
|
||||
def _periodic_resend_comment_lines(
|
||||
value: object,
|
||||
opts: SerialPseudocodeOptions,
|
||||
*,
|
||||
prefix: str,
|
||||
) -> list[str]:
|
||||
if not isinstance(value, dict):
|
||||
return []
|
||||
lines = [f"{prefix}heartbeat/periodic resend candidate:"]
|
||||
period = value.get("period_timer")
|
||||
if isinstance(period, dict):
|
||||
lines.append(
|
||||
f"{prefix}- F9C6 reload {period.get('reload_value_hex', '?')}: "
|
||||
f"{_comment_text(str(period.get('summary') or 'period timer'))}",
|
||||
)
|
||||
countdown = value.get("resend_countdown")
|
||||
if isinstance(countdown, dict):
|
||||
lines.append(
|
||||
f"{prefix}- F9C8 reload {countdown.get('reload_value_hex', '?')}: "
|
||||
f"{_comment_text(str(countdown.get('summary') or 'resend countdown'))}",
|
||||
)
|
||||
pending = value.get("pending_mask")
|
||||
if isinstance(pending, dict):
|
||||
lines.append(
|
||||
f"{prefix}- FAA3 mask {pending.get('mask_hex', '?')}: "
|
||||
f"{_comment_text(str(pending.get('summary') or 'pending mask'))}",
|
||||
)
|
||||
resend = value.get("resend_path")
|
||||
if isinstance(resend, dict):
|
||||
lines.append(
|
||||
f"{prefix}- BED5 resend path: {_comment_text(str(resend.get('summary') or 'candidate resend path'))}",
|
||||
)
|
||||
evidence = _hex_join(value.get("evidence_addresses_hex"))
|
||||
if opts.include_evidence and evidence:
|
||||
lines.append(f"{prefix}- evidence: {evidence}")
|
||||
return lines
|
||||
|
||||
|
||||
def _command_effect_switch_lines(command: JsonObject) -> list[str]:
|
||||
effects = _object_list(command.get("effects"))[:3]
|
||||
lines = []
|
||||
|
||||
Reference in New Issue
Block a user