Last active
April 25, 2019 12:39
-
-
Save ebroecker/c1ab21378f515ce9dd0e99e181fe0b79 to your computer and use it in GitHub Desktop.
decode obd2
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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