mirror of
https://github.com/Show-maket/IR-protocol.git
synced 2026-09-18 19:13:58 +00:00
98 lines
5.0 KiB
Python
98 lines
5.0 KiB
Python
# -*- coding: utf-8 -*-
|
||
# Визуализация кадров и сдвигов битов (с синхробитами и подписями).
|
||
# crc8 как в IR_config.cpp. Синхро (syncBits=3) логически = [~last, last, ~next] (addSync, send_HIGH=1).
|
||
POLY1=0x31; POLY2=0x8C
|
||
def crc8(data,poly):
|
||
c=0xFF
|
||
for b in data:
|
||
c^=b
|
||
for _ in range(8):
|
||
c=((c<<1)^poly)&0xFF if c&0x80 else (c<<1)&0xFF
|
||
return c
|
||
def bits(b): return [(b>>(7-j))&1 for j in range(8)]
|
||
def bstr(bl): return ''.join(str(x) for x in bl)
|
||
|
||
def onair(frame_bytes, labels):
|
||
"""строка вида: dddddddd sss dddddddd sss ... + строка подписей под байтами"""
|
||
rows=[]
|
||
line=''; lab=''
|
||
for i,by in enumerate(frame_bytes):
|
||
db=bstr(bits(by))
|
||
# синхрогруппа ПОСЛЕ байта (между байтами), кроме последнего
|
||
if i < len(frame_bytes)-1:
|
||
last=bits(by)[7]; nxt=bits(frame_bytes[i+1])[0]
|
||
sy=f"{1-last}{last}{1-nxt}"
|
||
piece=db+' ['+sy+'] '
|
||
else:
|
||
piece=db
|
||
# подпись байта, центрируем под 8 бит
|
||
L=labels[i] if i<len(labels) else ''
|
||
lab+=(L[:8]).center(8)+ (' s ' if i<len(frame_bytes)-1 else '')
|
||
line+=piece
|
||
return line, lab
|
||
|
||
def show_frame(title, frame_bytes, labels):
|
||
print(f"\n### {title}")
|
||
print(" байты (hex):", ' '.join(f"{b:02x}" for b in frame_bytes))
|
||
print(" поля :", ' '.join((labels[i] if i<len(labels) else '?')[:2].ljust(2) for i in range(len(frame_bytes))),
|
||
" (по 1 байту)")
|
||
line,lab=onair(frame_bytes,labels)
|
||
print(" эфир (data 8 бит + [sync 3]) и подписи:")
|
||
print(" "+line)
|
||
print(" "+lab)
|
||
|
||
def slip_delete_databits(data, p):
|
||
b=[x for by in data for x in bits(by)]
|
||
b=b[:p]+b[p+1:]+[0]
|
||
return [int(''.join(map(str,b[i:i+8])),2) for i in range(0,len(b),8)]
|
||
|
||
def show_shift(title, data, p):
|
||
print(f"\n### {title}")
|
||
shifted=slip_delete_databits(data,p)
|
||
b0=[x for by in data for x in bits(by)]
|
||
b1=[x for by in shifted for x in bits(by)]
|
||
# выравненные строки битов по байтам
|
||
def grp(bl): return ' '.join(bstr(bl[i:i+8]) for i in range(0,len(bl),8))
|
||
print(" ДО :", ' '.join(f"{x:02x}" for x in data), " crc1(poly1)=%02x"%crc8(data,POLY1),
|
||
" crc2(poly2 over data+crc1)=%02x"%crc8(data+[crc8(data,POLY1)],POLY2))
|
||
print(" ПОСЛЕ :", ' '.join(f"{x:02x}" for x in shifted), " crc1(poly1)=%02x"%crc8(shifted,POLY1),
|
||
" crc2=%02x"%crc8(shifted+[crc8(shifted,POLY1)],POLY2))
|
||
print(" биты ДО :", grp(b0))
|
||
# маркер позиции удалённого бита p
|
||
mk=[' ']*len(b0);
|
||
pos = p + p//8 # +пробелы между байтами
|
||
mk_line=''
|
||
# построим маркерную строку под "биты ДО"
|
||
s=grp(b0)
|
||
# индекс символа для бита p:
|
||
char_idx = p + (p//8) # каждый байт(8) + 1 пробел
|
||
mk_line=' '*char_idx+'^'
|
||
print(" ", mk_line, f"<- бит #{p} удалён, всё правее сдвинуто влево на 1")
|
||
print(" биты ПОСЛЕ:", grp(b1))
|
||
# различия побитно
|
||
diff=''.join('X' if (i<len(b1) and b0[i]!=b1[i]) else '.' for i in range(len(b0)))
|
||
print(" дельта :", ' '.join(diff[i:i+8] for i in range(0,len(diff),8)), " (X=бит изменился)")
|
||
same1 = crc8(data,POLY1)==crc8(shifted,POLY1)
|
||
c2o=crc8(data+[crc8(data,POLY1)],POLY2); c2s=crc8(shifted+[crc8(shifted,POLY1)],POLY2)
|
||
print(f" ВЕРДИКТ: single(poly1) {'ПРОШЁЛ (не заметил сдвиг!)' if same1 else 'поймал'};"
|
||
f" double(+poly2) {'НЕ поймал' if (same1 and c2o==c2s) else 'ПОЙМАЛ'} (crc2 {c2o:02x}{'=='if c2o==c2s else '≠'}{c2s:02x})")
|
||
|
||
print("="*70)
|
||
print("ЧАСТЬ 1. Реалистичный кадр на эфире (структура + синхробиты)")
|
||
print("="*70)
|
||
# BACK-кадр: msgType=0(BACK), packSize=5 → [hdr][addrFrom_hi][addrFrom_lo][crc1][crc2]
|
||
# hdr = (0<<5)|5 = 0x05 ; addrFrom = 300 = 0x012C
|
||
data_back=[0x05, 0x01, 0x2C]
|
||
c1=crc8(data_back,POLY1); c2=crc8(data_back+[c1],POLY2)
|
||
frame_back=data_back+[c1,c2]
|
||
show_frame("BACK, addrFrom=300, packSize=5", frame_back,
|
||
["HDR","AfHi","AfLo","CRC1","CRC2"])
|
||
print(" (HDR = 000 00101: msgType=0(BACK), len=5=весь пакет; sync между байтами = [¬last,last,¬next])")
|
||
|
||
print("\n"+"="*70)
|
||
print("ЧАСТЬ 2. Сдвиги, где ОДИНОЧНЫЙ CRC8 слеп (из симуляции), в битах")
|
||
print("="*70)
|
||
show_shift("Пример A: data 26 0b 05, слип бита #10", [0x26,0x0b,0x05], 10)
|
||
show_shift("Пример B: data 3b 7c 43, слип бита #14 (окно в середине)", [0x3b,0x7c,0x43], 14)
|
||
show_shift("Пример C: data cc 4f b8 f6 33, слип бита #11", [0xcc,0x4f,0xb8,0xf6,0x33], 11)
|