diff --git a/selfdrive/debug/clear_dtc.py b/selfdrive/debug/clear_dtc.py index f4d38367b1..d84828079d 100755 --- a/selfdrive/debug/clear_dtc.py +++ b/selfdrive/debug/clear_dtc.py @@ -1,9 +1,16 @@ #!/usr/bin/env python3 import sys +import argparse from subprocess import check_output, CalledProcessError from panda import Panda from panda.python.uds import UdsClient, MessageTimeoutError, SESSION_TYPE, DTC_GROUP_TYPE +parser = argparse.ArgumentParser(description="clear DTC status") +parser.add_argument("addr", type=lambda x: int(x,0), nargs="?", default=0x7DF) # default is functional (broadcast) address +parser.add_argument("--bus", type=int, default=0) +parser.add_argument('--debug', action='store_true') +args = parser.parse_args() + try: check_output(["pidof", "boardd"]) print("boardd is running, please kill openpilot before running this script! (aborted)") @@ -14,17 +21,20 @@ except CalledProcessError as e: panda = Panda() panda.set_safety_mode(Panda.SAFETY_ELM327) -address = 0x7DF # functional (broadcast) address -uds_client = UdsClient(panda, address, bus=0, debug=False) +uds_client = UdsClient(panda, args.addr, bus=args.bus, debug=args.debug) print("extended diagnostic session ...") try: uds_client.diagnostic_session_control(SESSION_TYPE.EXTENDED_DIAGNOSTIC) except MessageTimeoutError: - pass # functional address isn't properly handled so a timeout occurs + # functional address isn't properly handled so a timeout occurs + if args.addr != 0x7DF: + raise print("clear diagnostic info ...") try: uds_client.clear_diagnostic_information(DTC_GROUP_TYPE.ALL) except MessageTimeoutError: - pass # functional address isn't properly handled so a timeout occurs + # functional address isn't properly handled so a timeout occurs + if args.addr != 0x7DF: + pass print("") print("you may need to power cycle your vehicle now") diff --git a/selfdrive/debug/read_dtc_status.py b/selfdrive/debug/read_dtc_status.py new file mode 100755 index 0000000000..9ad5563975 --- /dev/null +++ b/selfdrive/debug/read_dtc_status.py @@ -0,0 +1,35 @@ +#!/usr/bin/env python3 +import sys +import argparse +from subprocess import check_output, CalledProcessError +from panda import Panda +from panda.python.uds import UdsClient, SESSION_TYPE, DTC_REPORT_TYPE, DTC_STATUS_MASK_TYPE +from panda.python.uds import get_dtc_num_as_str, get_dtc_status_names + +parser = argparse.ArgumentParser(description="read DTC status") +parser.add_argument("addr", type=lambda x: int(x,0)) +parser.add_argument("--bus", type=int, default=0) +parser.add_argument('--debug', action='store_true') +args = parser.parse_args() + +try: + check_output(["pidof", "boardd"]) + print("boardd is running, please kill openpilot before running this script! (aborted)") + sys.exit(1) +except CalledProcessError as e: + if e.returncode != 1: # 1 == no process found (boardd not running) + raise e + +panda = Panda() +panda.set_safety_mode(Panda.SAFETY_ELM327) +uds_client = UdsClient(panda, args.addr, bus=args.bus, debug=args.debug) +print("extended diagnostic session ...") +uds_client.diagnostic_session_control(SESSION_TYPE.EXTENDED_DIAGNOSTIC) +print("read diagnostic codes ...") +data = uds_client.read_dtc_information(DTC_REPORT_TYPE.DTC_BY_STATUS_MASK, DTC_STATUS_MASK_TYPE.ALL) +print("status availability:", " ".join(get_dtc_status_names(data[0]))) +print("DTC status:") +for i in range(1, len(data), 4): + dtc_num = get_dtc_num_as_str(data[i:i+3]) + dtc_status = " ".join(get_dtc_status_names(data[i+3])) + print(dtc_num, dtc_status)