@@ -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