From 0eac7a571ff8c6d516b155d32a30a43d625aa536 Mon Sep 17 00:00:00 2001 From: Erick Ahmed Date: Thu, 23 Jul 2026 13:26:37 +0200 Subject: [PATCH] Add color configuration and extra signals to vehicle frames --- main.py | 2 +- vehicle/base.py | 5 +++-- vehicle/komatsu.py | 35 +++++++++++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 7 deletions(-) diff --git a/main.py b/main.py index 69bcbc4..0038cd5 100644 --- a/main.py +++ b/main.py @@ -437,7 +437,7 @@ def render_vehicles(vehicle): for sig in frame_def.signals: unit_str = f" ({sig.unit})" if sig.unit else "" title = f"{frame_def.can_id} - {sig.name}{unit_str}" - fig = vehicle_module.plot_signal(decoded, sig.name, title=title) + fig = vehicle_module.plot_signal(decoded, sig.name, title=title, color=frame_def.color) card = dbc.Card([ dbc.CardBody([ diff --git a/vehicle/base.py b/vehicle/base.py index d70e040..56e20db 100644 --- a/vehicle/base.py +++ b/vehicle/base.py @@ -23,6 +23,7 @@ class SignalDef: class FrameDef: can_id: str description: str = "" + color: str = "#377eb8" signals: List[SignalDef] = field(default_factory=list) def normalize_id(can_id: str) -> str: @@ -92,7 +93,7 @@ def decode_dataframe(df: pd.DataFrame, can_id: str, decoder_rules: dict) -> pd.D return out -def plot_signal(df: pd.DataFrame, signal_name: str, title: str, height: int = 280) -> go.Figure: +def plot_signal(df: pd.DataFrame, signal_name: str, title: str, color: str = "#377eb8", height: int = 280) -> go.Figure: fig = go.Figure() if df.empty or signal_name not in df.columns: @@ -109,7 +110,7 @@ def plot_signal(df: pd.DataFrame, signal_name: str, title: str, height: int = 28 x=df["Timestamp"], y=df[signal_name], mode="lines", - line=dict(width=2, color="#377eb8"), + line=dict(width=2, color=color), name=signal_name, hovertemplate=f"{signal_name}
Time: %{{x}}
Value: %{{y:.2f}}", )) diff --git a/vehicle/komatsu.py b/vehicle/komatsu.py index 5d91baa..121134e 100644 --- a/vehicle/komatsu.py +++ b/vehicle/komatsu.py @@ -10,6 +10,7 @@ DECODER_RULES = { normalize_id("0x011F"): FrameDef( can_id="0x011F", description="Engine ECM Main Broadcast", + color="#e41a1c", signals=[ SignalDef( name="Engine", @@ -25,15 +26,41 @@ DECODER_RULES = { name="Pressure / Load", bit_start=16, bit_length=16, - factor=1.0, - offset=0.0, + factor=0.05, + offset=0, is_signed=False, byte_order="little", - unit="raw", + unit="%", + ), + ], + ), + normalize_id("0x0CFF3300"): FrameDef( + can_id="0x0CFF3300", + description="Engine temperature block", + color="#0080fe", + signals=[ + SignalDef( + name="Engine coolant temp", + bit_start=8, + bit_length=8, + factor=1, + offset=0.0, + is_signed=False, + byte_order="big", + unit="℃", + ), + SignalDef( + name="Engine oil temp", + bit_start=40, + bit_length=8, + factor=1, + offset=0.0, + is_signed=False, + byte_order="big", + unit="℃", ), ], ), - } def decode_dataframe(df, can_id):