Skip to content

Commit 8582f09

Browse files
committed
Reformat using black
1 parent 39dd1e0 commit 8582f09

File tree

1 file changed

+101
-63
lines changed

1 file changed

+101
-63
lines changed

can/io/mf4.py

Lines changed: 101 additions & 63 deletions
Original file line numberDiff line numberDiff line change
@@ -272,34 +272,36 @@ class MF4Reader(BinaryIOMessageReader):
272272
273273
The MF4Reader only supports MF4 files with CAN bus logging.
274274
"""
275-
275+
276276
# NOTE: Readout based on the bus logging code from asammdf GUI
277-
277+
278278
class FrameIterator(object):
279279
"""
280280
Iterator helper class for common handling among CAN DataFrames, ErrorFrames and RemoteFrames.
281281
"""
282-
282+
283283
# Number of records to request for each asammdf call
284284
_chunk_size = 1000
285-
286-
def __init__(self, mdf: MDF, group_index: int, start_timestamp: float, name: str):
285+
286+
def __init__(
287+
self, mdf: MDF, group_index: int, start_timestamp: float, name: str
288+
):
287289
self._mdf = mdf
288290
self._group_index = group_index
289291
self._start_timestamp = start_timestamp
290292
self._name = name
291-
293+
292294
# Extract names
293295
channel_group: ChannelGroup = self._mdf.groups[self._group_index]
294-
296+
295297
self._channel_names = []
296-
298+
297299
for channel in channel_group.channels:
298300
if str(channel.name).startswith(f"{self._name}."):
299301
self._channel_names.append(channel.name)
300-
302+
301303
return
302-
304+
303305
def _get_data(self, current_offset: int) -> asammdf.Signal:
304306
# NOTE: asammdf suggests using select instead of get. Select seem to miss converting some channels which
305307
# get does convert as expected.
@@ -308,34 +310,40 @@ def _get_data(self, current_offset: int) -> asammdf.Signal:
308310
self._group_index,
309311
record_offset=current_offset,
310312
record_count=self._chunk_size,
311-
raw=False
313+
raw=False,
312314
)
313-
315+
314316
return data_raw
315-
317+
316318
pass
317-
319+
318320
class CANDataFrameIterator(FrameIterator):
319-
321+
320322
def __init__(self, mdf: MDF, group_index: int, start_timestamp: float):
321323
super().__init__(mdf, group_index, start_timestamp, "CAN_DataFrame")
322-
324+
323325
return
324-
326+
325327
def __iter__(self) -> Generator[Message, None, None]:
326-
for current_offset in range(0, self._mdf.groups[self._group_index].channel_group.cycles_nr, self._chunk_size):
328+
for current_offset in range(
329+
0,
330+
self._mdf.groups[self._group_index].channel_group.cycles_nr,
331+
self._chunk_size,
332+
):
327333
data = self._get_data(current_offset)
328334
names = data.samples[0].dtype.names
329-
335+
330336
for i in range(len(data)):
331337
data_length = int(data["CAN_DataFrame.DataLength"][i])
332-
338+
333339
kv = {
334340
"timestamp": float(data.timestamps[i]) + self._start_timestamp,
335341
"arbitration_id": int(data["CAN_DataFrame.ID"][i]) & 0x1FFFFFFF,
336-
"data": data["CAN_DataFrame.DataBytes"][i][:data_length].tobytes(),
342+
"data": data["CAN_DataFrame.DataBytes"][i][
343+
:data_length
344+
].tobytes(),
337345
}
338-
346+
339347
if "CAN_DataFrame.BusChannel" in names:
340348
kv["channel"] = int(data["CAN_DataFrame.BusChannel"][i])
341349
if "CAN_DataFrame.Dir" in names:
@@ -348,90 +356,108 @@ def __iter__(self) -> Generator[Message, None, None]:
348356
kv["bitrate_switch"] = bool(data["CAN_DataFrame.BRS"][i])
349357
if "CAN_DataFrame.ESI" in names:
350358
kv["error_state_indicator"] = bool(data["CAN_DataFrame.ESI"][i])
351-
359+
352360
yield Message(**kv)
353-
361+
354362
return None
355-
363+
356364
pass
357-
365+
358366
class CANErrorFrameIterator(FrameIterator):
359-
367+
360368
def __init__(self, mdf: MDF, group_index: int, start_timestamp: float):
361369
super().__init__(mdf, group_index, start_timestamp, "CAN_ErrorFrame")
362-
370+
363371
return
364-
372+
365373
def __iter__(self) -> Generator[Message, None, None]:
366-
for current_offset in range(0, self._mdf.groups[self._group_index].channel_group.cycles_nr, self._chunk_size):
374+
for current_offset in range(
375+
0,
376+
self._mdf.groups[self._group_index].channel_group.cycles_nr,
377+
self._chunk_size,
378+
):
367379
data = self._get_data(current_offset)
368380
names = data.samples[0].dtype.names
369-
381+
370382
for i in range(len(data)):
371383
kv = {
372384
"timestamp": float(data.timestamps[i]) + self._start_timestamp,
373385
"is_error_frame": True,
374386
}
375-
387+
376388
if "CAN_ErrorFrame.BusChannel" in names:
377389
kv["channel"] = int(data["CAN_ErrorFrame.BusChannel"][i])
378390
if "CAN_ErrorFrame.Dir" in names:
379391
kv["is_rx"] = int(data["CAN_ErrorFrame.Dir"][i]) == 0
380392
if "CAN_ErrorFrame.ID" in names:
381-
kv["arbitration_id"] = int(data["CAN_ErrorFrame.ID"][i]) & 0x1FFFFFFF
393+
kv["arbitration_id"] = (
394+
int(data["CAN_ErrorFrame.ID"][i]) & 0x1FFFFFFF
395+
)
382396
if "CAN_ErrorFrame.IDE" in names:
383397
kv["is_extended_id"] = bool(data["CAN_ErrorFrame.IDE"][i])
384398
if "CAN_ErrorFrame.EDL" in names:
385399
kv["is_fd"] = bool(data["CAN_ErrorFrame.EDL"][i])
386400
if "CAN_ErrorFrame.BRS" in names:
387401
kv["bitrate_switch"] = bool(data["CAN_ErrorFrame.BRS"][i])
388402
if "CAN_ErrorFrame.ESI" in names:
389-
kv["error_state_indicator"] = bool(data["CAN_ErrorFrame.ESI"][i])
403+
kv["error_state_indicator"] = bool(
404+
data["CAN_ErrorFrame.ESI"][i]
405+
)
390406
if "CAN_ErrorFrame.RTR" in names:
391407
kv["is_remote_frame"] = bool(data["CAN_ErrorFrame.RTR"][i])
392-
if "CAN_ErrorFrame.DataLength" in names and "CAN_ErrorFrame.DataBytes" in names:
408+
if (
409+
"CAN_ErrorFrame.DataLength" in names
410+
and "CAN_ErrorFrame.DataBytes" in names
411+
):
393412
data_length = int(data["CAN_ErrorFrame.DataLength"][i])
394-
kv["data"] = data["CAN_ErrorFrame.DataBytes"][i][:data_length].tobytes()
395-
413+
kv["data"] = data["CAN_ErrorFrame.DataBytes"][i][
414+
:data_length
415+
].tobytes()
416+
396417
yield Message(**kv)
397-
418+
398419
return None
399-
420+
400421
pass
401-
422+
402423
class CANRemoteFrameIterator(FrameIterator):
403-
424+
404425
def __init__(self, mdf: MDF, group_index: int, start_timestamp: float):
405426
super().__init__(mdf, group_index, start_timestamp, "CAN_RemoteFrame")
406-
427+
407428
return
408-
429+
409430
def __iter__(self) -> Generator[Message, None, None]:
410-
for current_offset in range(0, self._mdf.groups[self._group_index].channel_group.cycles_nr, self._chunk_size):
431+
for current_offset in range(
432+
0,
433+
self._mdf.groups[self._group_index].channel_group.cycles_nr,
434+
self._chunk_size,
435+
):
411436
data = self._get_data(current_offset)
412437
names = data.samples[0].dtype.names
413-
438+
414439
for i in range(len(data)):
415440
kv = {
416441
"timestamp": float(data.timestamps[i]) + self._start_timestamp,
417-
"arbitration_id": int(data["CAN_RemoteFrame.ID"][i]) & 0x1FFFFFFF,
442+
"arbitration_id": int(data["CAN_RemoteFrame.ID"][i])
443+
& 0x1FFFFFFF,
418444
"dlc": int(data["CAN_RemoteFrame.DLC"][i]),
419445
"is_remote_frame": True,
420446
}
421-
447+
422448
if "CAN_RemoteFrame.BusChannel" in names:
423449
kv["channel"] = int(data["CAN_RemoteFrame.BusChannel"][i])
424450
if "CAN_RemoteFrame.Dir" in names:
425451
kv["is_rx"] = int(data["CAN_RemoteFrame.Dir"][i]) == 0
426452
if "CAN_RemoteFrame.IDE" in names:
427453
kv["is_extended_id"] = bool(data["CAN_RemoteFrame.IDE"][i])
428-
454+
429455
yield Message(**kv)
430-
456+
431457
return None
432-
458+
433459
pass
434-
460+
435461
def __init__(
436462
self,
437463
file: Union[StringPathLike, BinaryIO],
@@ -455,48 +481,60 @@ def __init__(
455481
self._mdf = MDF(BytesIO(file.read()))
456482
else:
457483
self._mdf = MDF(file)
458-
484+
459485
self._start_timestamp = self._mdf.header.start_time.timestamp()
460486

461487
def __iter__(self) -> Iterable[Message]:
462488
import heapq
463-
489+
464490
# To handle messages split over multiple channel groups, create a single iterator per channel group and merge
465491
# these iterators into a single iterator using heapq.
466492
iterators = []
467493
for group_index, group in enumerate(self._mdf.groups):
468494
channel_group: ChannelGroup = group.channel_group
469-
495+
470496
if not channel_group.flags & FLAG_CG_BUS_EVENT:
471497
# Not a bus event, skip
472498
continue
473-
499+
474500
if channel_group.cycles_nr == 0:
475501
# No data, skip
476502
continue
477-
503+
478504
acquisition_source: Optional[Source] = channel_group.acq_source
479-
505+
480506
if acquisition_source is None:
481507
# No source information, skip
482508
continue
483509
elif not acquisition_source.source_type & Source.SOURCE_BUS:
484510
# Not a bus type (likely already covered by the channel group flag), skip
485511
continue
486-
512+
487513
channel_names = [channel.name for channel in group.channels]
488-
514+
489515
if acquisition_source.bus_type == Source.BUS_TYPE_CAN:
490516
if "CAN_DataFrame" in channel_names:
491-
iterators.append(self.CANDataFrameIterator(self._mdf, group_index, self._start_timestamp))
517+
iterators.append(
518+
self.CANDataFrameIterator(
519+
self._mdf, group_index, self._start_timestamp
520+
)
521+
)
492522
elif "CAN_ErrorFrame" in channel_names:
493-
iterators.append(self.CANErrorFrameIterator(self._mdf, group_index, self._start_timestamp))
523+
iterators.append(
524+
self.CANErrorFrameIterator(
525+
self._mdf, group_index, self._start_timestamp
526+
)
527+
)
494528
elif "CAN_RemoteFrame" in channel_names:
495-
iterators.append(self.CANRemoteFrameIterator(self._mdf, group_index, self._start_timestamp))
529+
iterators.append(
530+
self.CANRemoteFrameIterator(
531+
self._mdf, group_index, self._start_timestamp
532+
)
533+
)
496534
else:
497535
# Unknown bus type, skip
498536
continue
499-
537+
500538
# Create merged iterator over all the groups, using the timestamps as comparison key
501539
return heapq.merge(*iterators, key=lambda x: x.timestamp)
502540

0 commit comments

Comments
 (0)