Skip to content

Commit a6a899c

Browse files
Support candump formatting for flags (#317)
Fixes #316 --------- Co-authored-by: Pavel Kirienko <pavel.kirienko@gmail.com>
1 parent 4846761 commit a6a899c

File tree

3 files changed

+39
-3
lines changed

3 files changed

+39
-3
lines changed

.readthedocs.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,13 @@
22

33
version: 2
44

5+
build:
6+
os: ubuntu-22.04
7+
tools:
8+
python: "3.10"
9+
apt_packages:
10+
- graphviz
11+
512
sphinx:
613
configuration: docs/conf.py
714
fail_on_warning: true

pycyphal/_version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "1.16.0"
1+
__version__ = "1.16.1"

pycyphal/transport/can/media/candump/_candump.py

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,7 +240,7 @@ def list_available_interface_names(*, recurse: bool = False) -> Iterable[str]:
240240

241241

242242
_RE_REC_REMOTE = re.compile(r"(?a)^\s*\((\d+\.\d+)\)\s+([\w-]+)\s+([\da-fA-F]+)#R")
243-
_RE_REC_DATA = re.compile(r"(?a)^\s*\((\d+\.\d+)\)\s+([\w-]+)\s+([\da-fA-F]+)#([\da-fA-F]*)")
243+
_RE_REC_DATA = re.compile(r"(?a)^\s*\((\d+\.\d+)\)\s+([\w-]+)\s+([\da-fA-F]+)#(#\d)?([\da-fA-F]*)")
244244

245245

246246
@dataclasses.dataclass(frozen=True)
@@ -253,7 +253,11 @@ def parse(line: str) -> None | Record:
253253
match = _RE_REC_DATA.match(line)
254254
if not match:
255255
return None
256-
s_ts, iface_name, s_canid, s_data = match.groups()
256+
s_ts, iface_name, s_canid, s_flags, s_data = match.groups()
257+
if s_flags is None:
258+
s_flags = "#0"
259+
if s_data is None:
260+
s_data = ""
257261
return DataFrameRecord(
258262
ts=Timestamp(
259263
system_ns=int(Decimal(s_ts) * Decimal("1e9")),
@@ -263,6 +267,7 @@ def parse(line: str) -> None | Record:
263267
fmt=FrameFormat.EXTENDED if len(s_canid) > 3 else FrameFormat.BASE,
264268
can_id=int(s_canid, 16),
265269
can_payload=bytes.fromhex(s_data),
270+
can_flags=int(s_flags[1:], 16), # skip over #
266271
)
267272
except ValueError as ex:
268273
_logger.debug("Cannot convert values from line %r: %r", line, ex)
@@ -281,6 +286,7 @@ class DataFrameRecord(Record):
281286
fmt: FrameFormat
282287
can_id: int
283288
can_payload: bytes
289+
can_flags: int
284290

285291
def __str__(self) -> str:
286292
if self.fmt == FrameFormat.EXTENDED:
@@ -311,6 +317,29 @@ def _unittest_record_parse() -> None:
311317
assert rec.can_payload == bytes()
312318
print(rec)
313319

320+
rec = Record.parse("(1703173569.357659) can0 0C7D5522##556000000000000EB\n")
321+
assert isinstance(rec, DataFrameRecord)
322+
assert rec.ts.system_ns == 1703173569_357659000
323+
assert rec.iface_name == "can0"
324+
assert rec.fmt == FrameFormat.EXTENDED
325+
assert rec.can_id == 0x0C7D5522
326+
assert rec.can_flags == 5
327+
assert rec.can_payload == bytes.fromhex("56000000000000EB")
328+
print(rec)
329+
330+
rec = Record.parse("(1703173569.357659) can0 0C7D5522##3\n")
331+
assert isinstance(rec, DataFrameRecord)
332+
assert rec.ts.system_ns == 1703173569_357659000
333+
assert rec.iface_name == "can0"
334+
assert rec.fmt == FrameFormat.EXTENDED
335+
assert rec.can_id == 0x0C7D5522
336+
assert rec.can_flags == 3
337+
assert rec.can_payload == bytes()
338+
print(rec)
339+
340+
rec = Record.parse("(1703173569.357659) can0 0C7D5522##3210\n")
341+
assert rec is None
342+
314343
rec = Record.parse("(1657805304.099792) slcan0 123#R\n")
315344
assert isinstance(rec, UnsupportedRecord)
316345

0 commit comments

Comments
 (0)