Skip to content

Instantly share code, notes, and snippets.

@ebroecker
Last active April 25, 2019 12:39
Show Gist options
  • Save ebroecker/c1ab21378f515ce9dd0e99e181fe0b79 to your computer and use it in GitHub Desktop.
Save ebroecker/c1ab21378f515ce9dd0e99e181fe0b79 to your computer and use it in GitHub Desktop.
decode obd2
#!/usr/bin/env python3
import canmatrix.formats
import can.io.player
def get_sub_multiplexer(signals, parent_multiplexer_name, parent_multiplexer_value, decoded):
for signal in signals:
if signal.is_multiplexer and signal.muxer_for_signal == parent_multiplexer_name and signal.mux_val == parent_multiplexer_value:
muxer_value = decoded[signal.name].raw_value
muxer_name = signal.name
return muxer_name, muxer_value
def has_sub_multiplexer(signals, parent_multiplexer_name):
for signal in signals:
if signal.is_multiplexer and signal.muxer_for_signal == parent_multiplexer_name:
return True
return False
def filter_signals_for_multiplexer(signals, multiplexer_name, multiplexer_value):
filtered_signals = []
for signal in signals:
if signal.mux_val == multiplexer_value and signal.muxer_for_signal == multiplexer_name and not signal.is_multiplexer:
filtered_signals.append(signal)
return filtered_signals
def my_decode(frame, frame_data):
decoded = frame.unpack(frame_data)
decoded_values = dict()
filtered_signals = []
filtered_signals += filter_signals_for_multiplexer(frame.signals, None, None)
multiplex_name = None
multiplex_value = None
while has_sub_multiplexer(frame.signals, multiplex_name):
multiplex_name, multiplex_value = get_sub_multiplexer(frame.signals, multiplex_name, multiplex_value, decoded)
decoded_values[multiplex_name] = decoded[multiplex_name]
filtered_signals += filter_signals_for_multiplexer(frame.signals, multiplex_name, multiplex_value)
for signal in filtered_signals:
decoded_values[signal.name] = decoded[signal.name]
return decoded_values
reader = can.io.player.LogReader("OBD2.asc")
db = canmatrix.formats.loadp_flat("obd2.dbc")
for logged_frame in reader:
frame_id = canmatrix.ArbitrationId(logged_frame.arbitration_id)
frame_data = logged_frame.data
frame = db.frame_by_id(frame_id)
decoded = my_decode(frame, frame_data)
for name, value in decoded.items():
print (name, value.named_value)
if name == "ParameterID_Service01":
if value.phys_value not in value.signal.values:
print("ParameterID %d not found" % value.phys_value)
print("--------------------")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment