def blfToDataframe(blf_filename, dbc_filename, limit=0, msgWhitelist=None): log = can.BLFReader(blf_filename) if isinstance(dbc_filename, str): db = cantools.database.load_file(dbc_filename) elif isinstance(dbc_filename, list): db = cantools.database.load_file(dbc_filename[0]) for fn in dbc_filename[1:]: db.add_dbc_file(fn) else: raise TypeError("input must be a string or list of strings") appended_dataframe = [] # for counter, msg in enumerate(log): print("Starting to decode (%d records)\n" % (log.object_count)) counter = 0 for msg in log: counter = counter + 1 if msgWhitelist is None or msg.arbitration_id in msgWhitelist: try: if len(msg.data) > 0: decoded = db.decode_message(msg.arbitration_id, msg.data) df = pd.DataFrame({ 'Timestamp': msg.timestamp, 'Signal': list(decoded.keys()), 'Object': list(decoded.values()) }) appended_dataframe.append(df) except KeyError: # Message not in dbc, this is fine # print("Key Error %x\n" %(msg.arbitration_id)) pass except: print("Unexpected error:", msg.arbitration_id, msg.data) if counter % 5000 == 0: print("Translated %d messages" % (counter)) if limit and counter > limit: break can_log = pd.concat(appended_dataframe) can_log['Datetime'] = pd.to_datetime(can_log['Timestamp'], unit='s') print("Making MultiLog") can_log_multi = can_log.set_index(['Datetime', 'Signal']) can_log_multi = can_log_multi.drop(columns='Timestamp') # get a list of signals print("Making Per Signal Dataframe") signals = can_log.Signal.unique() can_log_by_signal = {} for signal in signals: can_log_by_signal[signal] = can_log[can_log.Signal == signal].set_index('Datetime') # Make Return Values canOut = {} canOut['canlog_df'] = can_log_multi canOut['signals'] = signals canOut['canlogs_by_signal'] = can_log_by_signal return canOut
def attach_logs(self, *args): self.mode = "log" # TODO: add functionality for all log formats files = [] for in_path in args: if os.path.isdir(in_path): files.extend([in_path + "/" + x for x in os.listdir(in_path)]) else: files.append(in_path) for log_path in files: if os.path.exists(log_path): try: log_ext = get_extension(log_path) if log_ext == "rec" and not os.path.exists( change_extension(log_path, "txt")): print("Converting %s from rec to txt" % log_path) convert_vision(os.path.abspath(log_path)) log_path = change_extension(log_path, "txt") log_ext = "txt" while True: if os.path.exists(log_path): break else: time.sleep(1) print("Searching") elif os.path.exists(change_extension(log_path, "txt")): log_path = change_extension(log_path, "txt") log_ext = "txt" if log_ext == "blf": print("Adding log %s" % log_path) self.log_formats.append("unparsed") reader = can.BLFReader(log_path) self.add_log_info(reader) self.logs.append(reader.__iter__()) self.log_paths.append(log_path) elif log_ext == "csv": print("Adding log %s" % log_path) self.log_formats.append("unparsed") self.logs.append(can.CSVReader(log_path).__iter__()) self.log_paths.append(log_path) elif log_ext == "txt": print("Adding log %s" % log_path) raw_file = open(log_path, "r").readlines() if raw_file[0].split("\t")[ 0] == '"ATI VISION Recorder Output File"': self.log_formats.append("parsed") self.add_log_info(raw_file) self.logs.append(raw_file[37:].__iter__()) self.log_paths.append(log_path) self.available_signals.extend(raw_file[35].replace( '"', "").replace("\n", "").split("\t")) self.available_signals.remove("TimeStamp") except ValueError: raise ValueError("%s is not a valid log!" % log_path) else: raise FileExistsError("File does not exist")
def test_reader(self): logfile = os.path.join(os.path.dirname(__file__), "data", "logfile.blf") messages = list(can.BLFReader(logfile)) self.assertEqual(len(messages), 1) self.assertEqual(messages[0], can.Message( extended_id=False, arbitration_id=0x64, data=[0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]))
def send_msg(self): print('send msg') path = os.getcwd().replace("\\", "/") filename = path + '/test_data/logging_court.blf' # filename = 'logging_court.blf' log = can.BLFReader(filename) log = list(log) for num in range(0, len(log) - 1): msg_arbitration_id = log[num].arbitration_id msg_data = log[num].data # msg_channel = log[num].channel msg = can.Message(is_extended_id=False, arbitration_id=msg_arbitration_id, data=msg_data) time.sleep(0.1) self.bus.send(msg)
def test_reader_writer(self): f = tempfile.NamedTemporaryFile('w', delete=False) f.close() filename = f.name writer = can.BLFWriter(filename) for msg in TEST_MESSAGES: writer(msg) writer.log_event("One comment which should be attached to last message") writer.log_event("Another comment", TEST_MESSAGES[-1].timestamp + 2) writer.stop() messages = list(can.BLFReader(filename)) self.assertEqual(len(messages), len(TEST_MESSAGES)) for msg1, msg2 in zip(messages, TEST_MESSAGES): self.assertEqual(msg1, msg2) self.assertAlmostEqual(msg1.timestamp, msg2.timestamp)
def test_read_known_file(self): logfile = os.path.join(os.path.dirname(__file__), "data", "logfile.blf") with can.BLFReader(logfile) as reader: messages = list(reader) expected = [ can.Message( timestamp=1.0, is_extended_id=False, arbitration_id=0x64, data=[0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8]), can.Message( timestamp=73.0, is_extended_id=True, arbitration_id=0x1FFFFFFF, is_error_frame=True,) ] self.assertMessagesEqual(messages, expected)
def _read_log_file(self, filename): logfile = os.path.join(os.path.dirname(__file__), "data", filename) with can.BLFReader(logfile) as reader: return list(reader)
import cantools import csv from pprint import pprint import numpy ist = [] soll = [] D1 = [] D2 = [] t1 = [] t2 = [] ## dbc load db = cantools.db.load_file('HCAN_KMatrix.dbc') ## blf read can_log = can.BLFReader('20200527_PVS_V1.blf') ## sellect and decode msg for msg in can_log: # msg1 id filter if msg.arbitration_id == 152: t1.append(msg.timestamp) # time recode D1 = db.decode_message('EM', msg.data) ist.append(D1['IstMoment']) # value recode # msg2 id filter if msg.arbitration_id == 144: t2.append(msg.timestamp) D2 = db.decode_message('MSG', msg.data)
def blfToMatlab(blf_filename, dbc_filename, mat_filename): log = can.BLFReader(filename) db = cantools.database.load_file(dbc_path)