diff --git a/scripts/convert_trace/.gitignore b/scripts/convert_trace/.gitignore new file mode 100644 index 000000000..f76cdf78f --- /dev/null +++ b/scripts/convert_trace/.gitignore @@ -0,0 +1 @@ +./mf4 diff --git a/scripts/convert_trace/README.md b/scripts/convert_trace/README.md new file mode 100644 index 000000000..4c2a4973e --- /dev/null +++ b/scripts/convert_trace/README.md @@ -0,0 +1,13 @@ +# Jsonl to MDF + +Convert a [JSON lines](https://github.com/macformula/hil/blob/main/canlink/jsonl.go) log file from our [CAN tracer](https://github.com/macformula/hil/blob/main/canlink/tracer.go) to an MDF file. + +For developers to convert JSON lines log format to MDF for integration with [`asammdf`](https://asammdf.readthedocs.io/en/latest/). With this format, visualization tools such as [Asammdf GUI](https://canlogger.csselectronics.com/canedge-getting-started/ce2/log-file-tools/asammdf-gui/) can be used to view and debug traces. + +# Usage + +It is recommended to use uv python package manager. + +```bash +python ./jsonl_to_mdf.py ./trace.jsonl +``` diff --git a/scripts/convert_trace/jsonl_to_mf4.py b/scripts/convert_trace/jsonl_to_mf4.py new file mode 100644 index 000000000..520b9b423 --- /dev/null +++ b/scripts/convert_trace/jsonl_to_mf4.py @@ -0,0 +1,33 @@ +from asammdf import MDF, Signal +import sys +import numpy as np +import pandas as pd + +input = sys.argv[1] # .jsonl +output = input + ".mdf" # .mf4 +mdf = MDF(version="4.10") + +# read jsonl file into pandas dataframe +dataframe = pd.read_json(input, lines=True) + +# convert each can id to mdf signal +for can_id, group in dataframe.groupby("id"): + # convert time to seconds from start + times = pd.to_datetime(group["time"], format="%H:%M:%S.%f") + t0 = times.iloc[0] + timestamps = (times - t0).dt.total_seconds().to_numpy(dtype=np.float64) + + # bytes is tuple, make 2D uint8 array [n samples, n bytes] + samples = np.array(group["bytes"].tolist(), dtype=np.uint8) + + # generate signal & append mdf file + sig = Signal( + name = str(can_id), + samples = samples, + timestamps = timestamps, + ) + mdf.append(sig) + +# save mdf file (.mf4) +mdf.save(output) +mdf.close() diff --git a/scripts/convert_trace/requirements.txt b/scripts/convert_trace/requirements.txt new file mode 100644 index 000000000..2ff743560 --- /dev/null +++ b/scripts/convert_trace/requirements.txt @@ -0,0 +1 @@ +asammdf