2017-10-01 10:20:33 +08:00
|
|
|
DEBUG = False
|
|
|
|
|
2017-10-01 03:21:36 +08:00
|
|
|
def msg(x):
|
2017-10-01 10:20:33 +08:00
|
|
|
if DEBUG:
|
|
|
|
print "S:",x.encode("hex")
|
2017-10-01 03:21:36 +08:00
|
|
|
if len(x) <= 7:
|
|
|
|
ret = chr(len(x)) + x
|
|
|
|
else:
|
|
|
|
assert False
|
|
|
|
return ret.ljust(8, "\x00")
|
|
|
|
|
2018-01-23 13:15:41 +08:00
|
|
|
kmsgs = []
|
|
|
|
def recv(panda, cnt, addr, nbus):
|
|
|
|
global kmsgs
|
|
|
|
ret = []
|
|
|
|
|
|
|
|
while len(ret) < cnt:
|
|
|
|
kmsgs += panda.can_recv()
|
|
|
|
nmsgs = []
|
|
|
|
for ids, ts, dat, bus in kmsgs:
|
|
|
|
if ids == addr and bus == nbus and len(ret) < cnt:
|
|
|
|
ret.append(dat)
|
|
|
|
else:
|
|
|
|
# leave around
|
|
|
|
nmsgs.append((ids, ts, dat, bus))
|
|
|
|
kmsgs = nmsgs[-256:]
|
|
|
|
return map(str, ret)
|
|
|
|
|
2018-01-23 10:55:10 +08:00
|
|
|
def isotp_send(panda, x, addr, bus=0, recvaddr=None):
|
|
|
|
if recvaddr is None:
|
|
|
|
recvaddr = addr+8
|
|
|
|
|
2017-10-01 03:21:36 +08:00
|
|
|
if len(x) <= 7:
|
|
|
|
panda.can_send(addr, msg(x), bus)
|
|
|
|
else:
|
|
|
|
ss = chr(0x10 + (len(x)>>8)) + chr(len(x)&0xFF) + x[0:6]
|
|
|
|
x = x[6:]
|
|
|
|
idx = 1
|
|
|
|
sends = []
|
|
|
|
while len(x) > 0:
|
|
|
|
sends.append(((chr(0x20 + (idx&0xF)) + x[0:7]).ljust(8, "\x00")))
|
|
|
|
x = x[7:]
|
|
|
|
idx += 1
|
|
|
|
|
|
|
|
# actually send
|
|
|
|
panda.can_send(addr, ss, bus)
|
2018-01-23 10:55:10 +08:00
|
|
|
rr = recv(panda, 1, recvaddr, bus)[0]
|
2017-10-01 03:21:36 +08:00
|
|
|
panda.can_send_many([(addr, None, s, 0) for s in sends])
|
|
|
|
|
2018-01-08 06:31:42 +08:00
|
|
|
def isotp_recv(panda, addr, bus=0, sendaddr=None):
|
2017-10-01 03:21:36 +08:00
|
|
|
msg = recv(panda, 1, addr, bus)[0]
|
|
|
|
|
2018-01-08 06:31:42 +08:00
|
|
|
if sendaddr is None:
|
|
|
|
sendaddr = addr-8
|
|
|
|
|
|
|
|
|
2017-10-01 03:21:36 +08:00
|
|
|
if ord(msg[0])&0xf0 == 0x10:
|
|
|
|
# first
|
|
|
|
tlen = ((ord(msg[0]) & 0xf) << 8) | ord(msg[1])
|
|
|
|
dat = msg[2:]
|
|
|
|
|
|
|
|
# 0 block size?
|
|
|
|
CONTINUE = "\x30" + "\x00"*7
|
|
|
|
|
2018-01-08 06:31:42 +08:00
|
|
|
panda.can_send(sendaddr, CONTINUE, bus)
|
2017-10-01 03:21:36 +08:00
|
|
|
|
|
|
|
idx = 1
|
|
|
|
for mm in recv(panda, (tlen-len(dat) + 7)/8, addr, bus):
|
|
|
|
assert ord(mm[0]) == (0x20 | idx)
|
|
|
|
dat += mm[1:]
|
|
|
|
idx += 1
|
|
|
|
elif ord(msg[0])&0xf0 == 0x00:
|
|
|
|
# single
|
|
|
|
tlen = ord(msg[0]) & 0xf
|
|
|
|
dat = msg[1:]
|
|
|
|
else:
|
|
|
|
assert False
|
|
|
|
|
|
|
|
dat = dat[0:tlen]
|
|
|
|
|
2017-10-01 10:20:33 +08:00
|
|
|
if DEBUG:
|
|
|
|
print "R:",dat.encode("hex")
|
2017-10-01 03:21:36 +08:00
|
|
|
|
|
|
|
return dat
|
|
|
|
|