mirror of
https://github.com/Show-maket/IR-protocol.git
synced 2026-04-28 03:08:08 +00:00
Analyzer plug
This commit is contained in:
100
tools/analyze_pkt33_car_point.py
Normal file
100
tools/analyze_pkt33_car_point.py
Normal file
@ -0,0 +1,100 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Сравнение трасс decode по carraw3 vs pointraw_3 для кадра pkt[33] (car: CRC fail)."""
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
_TOOLS = Path(__file__).resolve().parent
|
||||
if str(_TOOLS) not in sys.path:
|
||||
sys.path.insert(0, str(_TOOLS))
|
||||
|
||||
from ir_decoder_raw_sim import (
|
||||
BIT_TIME_US,
|
||||
RISE_MAX,
|
||||
RISE_MIN,
|
||||
SimState,
|
||||
first_rx,
|
||||
parse_raw_csv,
|
||||
segments_to_edges,
|
||||
tick,
|
||||
)
|
||||
|
||||
|
||||
def run_traced(path: Path) -> tuple[SimState, list[dict]]:
|
||||
rows = parse_raw_csv(path)
|
||||
assert rows is not None
|
||||
edges = segments_to_edges(rows)
|
||||
st = SimState()
|
||||
tr: list[dict] = []
|
||||
for t_us, rising in edges:
|
||||
tick(st, t_us, rising, BIT_TIME_US, trace_rise=tr)
|
||||
return st, tr
|
||||
|
||||
|
||||
def main() -> None:
|
||||
root = Path(__file__).resolve().parents[1] / "Analyzer" / "raw"
|
||||
car_p = root / "carraw3.txt"
|
||||
pt_p = root / "pointraw_3.txt"
|
||||
st_c, tr_c = run_traced(car_p)
|
||||
st_p, tr_p = run_traced(pt_p)
|
||||
|
||||
bad_i = next(i for i, x in enumerate(st_c.packets) if not x[0])
|
||||
print(f"carraw3: bad packet index {bad_i}, bytes {st_c.packets[bad_i][2].hex()}")
|
||||
print(f"carraw3 packets={len(st_c.packets)} ok={sum(1 for x in st_c.packets if x[0])}")
|
||||
print(f"pointraw_3 packets={len(st_p.packets)} ok={sum(1 for x in st_p.packets if x[0])}")
|
||||
print(f"rise window us: min={RISE_MIN} max={RISE_MAX} bit={BIT_TIME_US}")
|
||||
print()
|
||||
|
||||
# Пока кадр №bad_i собирается, в списке уже bad_i завершённых пакетов → len(packets)==bad_i.
|
||||
build_i = bad_i
|
||||
|
||||
def frame_trace(tr: list[dict]) -> list[dict]:
|
||||
return [r for r in tr if r["n_pkt"] == build_i]
|
||||
|
||||
fc = frame_trace(tr_c)
|
||||
fp = frame_trace(tr_p)
|
||||
print(
|
||||
f"decode rises while building packet[{bad_i}] (trace n_pkt=={build_i}): "
|
||||
f"car {len(fc)} vs point {len(fp)} lines"
|
||||
)
|
||||
print("--- car (first 40 decode steps of this frame) ---")
|
||||
for i, r in enumerate(fc[:40]):
|
||||
br = r["branch"]
|
||||
ex = ""
|
||||
if br == "ceil":
|
||||
ex = f" hc={r['hc']} lc={r['lc']} ac={r['ac']}"
|
||||
print(
|
||||
f" {i:2} t={r['t_us'] / 1e6:.6f}s rp={r['rp']} ht={r['ht']} lt={r['lt']} "
|
||||
f"{br} bits_out={r['bits_out']} i_buf={r['i_buf']}{ex}"
|
||||
)
|
||||
print("--- point (first 40) ---")
|
||||
for i, r in enumerate(fp[:40]):
|
||||
br = r["branch"]
|
||||
ex = ""
|
||||
if br == "ceil":
|
||||
ex = f" hc={r['hc']} lc={r['lc']} ac={r['ac']}"
|
||||
print(
|
||||
f" {i:2} t={r['t_us'] / 1e6:.6f}s rp={r['rp']} ht={r['ht']} lt={r['lt']} "
|
||||
f"{br} bits_out={r['bits_out']} i_buf={r['i_buf']}{ex}"
|
||||
)
|
||||
|
||||
print()
|
||||
# Первое расхождение по (rp, ht, lt, branch, bits_out)
|
||||
for i, (a, b) in enumerate(zip(fc, fp)):
|
||||
ka = (a["rp"], a["ht"], a["lt"], a["branch"], a["bits_out"])
|
||||
kb = (b["rp"], b["ht"], b["lt"], b["branch"], b["bits_out"])
|
||||
if ka != kb:
|
||||
print(f"First decode diff at step {i} within frame:")
|
||||
print(f" car {a}")
|
||||
print(f" point {b}")
|
||||
break
|
||||
else:
|
||||
if len(fc) != len(fp):
|
||||
print(f"Same tuples for min(len)={min(len(fc), len(fp))}; length car={len(fc)} point={len(fp)}")
|
||||
else:
|
||||
print("Identical decode trace for full frame (unexpected if CRC differs)")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user