#!/usr/bin/env python import time import struct from panda import Panda from hexdump import hexdump from panda.isotp import isotp_send, isotp_recv # 0x7e0 = Toyota # 0x18DB33F1 for Honda? def get_current_data_for_pid(pid): # 01 xx = Show current data isotp_send(panda, "\x01"+chr(pid), 0x7e0) return isotp_recv(panda, 0x7e8) def get_supported_pids(): ret = [] pid = 0 while 1: supported = struct.unpack(">I", get_current_data_for_pid(pid)[2:])[0] for i in range(1+pid, 0x21+pid): if supported & 0x80000000: ret.append(i) supported <<= 1 pid += 0x20 if pid not in ret: break return ret if __name__ == "__main__": panda = Panda() panda.set_safety_mode(Panda.SAFETY_ELM327) panda.can_clear(0) # 09 02 = Get VIN isotp_send(panda, "\x09\x02", 0x7e0) ret = isotp_recv(panda, 0x7e8) hexdump(ret) print "VIN: %s" % ret[2:] # 03 = get DTCS isotp_send(panda, "\x03", 0x7e0) dtcs = isotp_recv(panda, 0x7e8) print "DTCs:", dtcs[2:].encode("hex") supported_pids = get_supported_pids() print "Supported PIDs:",supported_pids while 1: speed = struct.unpack(">B", get_current_data_for_pid(13)[2:])[0] # kph rpm = struct.unpack(">H", get_current_data_for_pid(12)[2:])[0]/4.0 # revs throttle = struct.unpack(">B", get_current_data_for_pid(17)[2:])[0]/255.0 * 100 # percent temp = struct.unpack(">B", get_current_data_for_pid(5)[2:])[0] - 40 # degrees C load = struct.unpack(">B", get_current_data_for_pid(4)[2:])[0]/255.0 * 100 # percent print "%d KPH, %d RPM, %.1f%% Throttle, %d deg C, %.1f%% load" % (speed, rpm, throttle, temp, load) time.sleep(0.2)