Exemplo n.º 1
0
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
Exemplo n.º 2
0
    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")
Exemplo n.º 3
0
 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]))
Exemplo n.º 4
0
 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)
Exemplo n.º 5
0
    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)
Exemplo n.º 6
0
    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)
Exemplo n.º 7
0
 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)
Exemplo n.º 9
0
def blfToMatlab(blf_filename, dbc_filename, mat_filename):
    log = can.BLFReader(filename)
    db = cantools.database.load_file(dbc_path)