From b246f6b19c49751c3419c329832def45cc16d9ad Mon Sep 17 00:00:00 2001 From: Hector van der Aa Date: Wed, 27 May 2026 14:30:13 +0200 Subject: [PATCH] rpm_graph v1 --- src/rpm_graph.py | 75 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 src/rpm_graph.py diff --git a/src/rpm_graph.py b/src/rpm_graph.py new file mode 100644 index 0000000..c751259 --- /dev/null +++ b/src/rpm_graph.py @@ -0,0 +1,75 @@ +# Copyright (C) 2026 Hector van der Aa +# Copyright (C) 2026 Association Exergie +# SPDX-License-Identifier: GPL-3.0-or-later + +import pandas as pd +from pathlib import Path +import argparse +from tqdm import tqdm +import matplotlib.pyplot as plt + +parser = argparse.ArgumentParser() +parser.add_argument("directory", type=Path, help="Source data directory") + +args = parser.parse_args() + +directory: Path = args.directory + +if not directory.is_dir(): + parser.error(f"{directory} is not a valid directory") + +print(f"Processing data in: {directory}") + +files: list[Path] = [] + +for path in directory.glob("*.csv"): + stem = path.stem + + try: + base_name, channel = stem.rsplit("_", 1) + except ValueError: + print(f"Skipping badly named file: {path}") + continue + + if channel != "trimmed": + print(f"Skipping unknown file: {path}") + continue + + files.append(path) + + +for file in files: + print(f"Processing {file.name}") + df = pd.read_csv(file).set_index("time_us", drop=False) + rows = [] + current_time_us: int = 0 + current_crank: int = 0 + last_crank: int = -1 + for _, row in tqdm(df.iterrows(), total=len(df)): + current_time_us = row["time_us"] + current_crank = row["crank"] + + if current_crank == 1: + if last_crank != -1: + rpm = 30_000_000 / (current_time_us - last_crank) + rows.append({"time_us": current_time_us, "rpm": rpm}) + last_crank = current_time_us + + out_df = pd.DataFrame(rows) + base_name, _ = file.stem.rsplit("_", 1) + output = file.parent / f"{base_name}_rpm.csv" + image_output = file.parent / f"{base_name}_rpm.png" + out_df.to_csv(output) + + fig, ax = plt.subplots(figsize=(12, 6)) + + ax.plot(out_df["time_us"] / 1_000_000, out_df["rpm"]) + ax.set_xlabel("Time (s)") + ax.set_ylabel("RPM") + ax.set_title(f"{base_name} RPM over Time") + ax.grid = True + + fig.tight_layout() + fig.savefig(image_output, dpi=300) + + plt.close(fig)