Extract reusable device protocols, ports and logic analyzers from SETGUI

This commit is contained in:
2026-09-23 20:11:37 +03:00
parent 80ba17d77d
commit 795a1279b1
63 changed files with 10181 additions and 6 deletions

View File

@@ -0,0 +1,51 @@
"""GUI-neutral adapter for the shared templates Balsam 167 CAN decoder."""
from __future__ import annotations
from protocan import balsam
from protocan import protocan as pc
from .shared_protocol import get_shared_protocol
def decode(raw_id: int, data: bytes, *, ide: bool = True,
rtr: bool = False) -> pc.Decoded | None:
if not ide or rtr or not balsam.is_balsam_id(raw_id):
return None
try:
frame = balsam.decode(raw_id, data, native=get_shared_protocol())
except ValueError as error:
result = pc.Decoded(pc.ProtoCanId.parse(raw_id), len(data), bytes(data),
ide=ide, rtr=rtr, protocol="BALZAM 167")
result.summary = "BALZAM: неверный кадр"
result.fields = [("Протокол", "BALZAM 167"), ("Ошибка", str(error))]
result.warnings.append(str(error))
return result
if frame is None:
return None
pid = pc.ProtoCanId(
raw=frame.can_id, body=frame.start_address, msg_type=0,
device=frame.device, device_type=0,
pm=1 if frame.from_device else 0, priority=0,
)
result = pc.Decoded(pid, len(data), bytes(data), ide=ide, rtr=rtr,
protocol="BALZAM 167", device_label=frame.device_name,
message_label="BALZAM регистры")
result.summary = frame.summary
result.fields = [
("Протокол", "BALZAM 167 legacy eCAN"),
("Узел", "%d — %s" % (frame.device, frame.device_name)),
("Направление", "от устройства" if frame.from_device else "к устройству"),
("Начальный адрес", "0x%04X" % frame.start_address),
("Маска трёх слов", "0b%s" % format(frame.present_mask, "03b")),
]
result.registers = [(item.address, item.value) for item in frame.registers]
for item in frame.registers:
result.fields.append((
"0x%04X %s" % (item.address, item.name or "регистр"),
"0x%04X (%d)" % (item.value, item.signed_value),
))
if frame.present_mask == 0:
result.warnings.append("В адресном слове не отмечен ни один регистр")
return result