Skip to content

Commit

Permalink
fix remaining size calculation
Browse files Browse the repository at this point in the history
  • Loading branch information
gregjhogan committed Oct 15, 2019
1 parent 01ef1fa commit 9662300
Showing 1 changed file with 10 additions and 8 deletions.
18 changes: 10 additions & 8 deletions python/uds.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from enum import IntEnum
from Queue import Queue, Empty
import threading
from binascii import hexlify

DEBUG = True

Expand Down Expand Up @@ -102,10 +103,10 @@ def _isotp_thread(panda, bus, tx_addr, tx_queue, rx_queue):
while True:
messages = panda.can_recv()
for rx_addr, rx_ts, rx_data, rx_bus in messages:
if rx_bus != bus or rx_addr != filter_addr or len(data) == 0:
if rx_bus != bus or rx_addr != filter_addr or len(rx_data) == 0:
continue

if (DEBUG): print "R:", hex(rx_addr), rx_data.encode('hex')
if (DEBUG): print("R: {} {}".format(hex(rx_addr), hexlify(rx_data)))
if rx_data[0] >> 4 == 0x0:
# single rx_frame
rx_frame["size"] = rx_data[0] & 0xFF
Expand All @@ -119,12 +120,12 @@ def _isotp_thread(panda, bus, tx_addr, tx_queue, rx_queue):
rx_frame["sent"] = False
# send flow control message (send all bytes)
flow_ctl = "\x30\x00\x00".ljust(8, "\x00")
if (DEBUG): print "S:", hex(tx_addr), flow_ctl.encode("hex")
if (DEBUG): print("S: {} {}".format(hex(tx_addr), hexlify(flow_ctl)))
panda.can_send(tx_addr, flow_ctl, bus)
elif rx_data[0] >> 4 == 0x2:
# consecutive rx_frame
assert rx_frame["sent"] == False, "no active frame"
rx_size = rx_frame["size"] - len(rx_data)
rx_size = rx_frame["size"] - len(rx_frame["data"])
rx_frame["data"] += rx_data[1:1+min(rx_size, 7)]
if rx_size <= 7:
rx_frame["sent"] = True
Expand All @@ -134,8 +135,9 @@ def _isotp_thread(panda, bus, tx_addr, tx_queue, rx_queue):
req = tx_queue.get(block=False)
# reset rx rx_frame
rx_frame = {"size": 0, "data": "", "sent": True}
req = req.ljust(8, "\x00")
if (DEBUG): print "S:", hex(tx_addr), req.encode("hex")
# TODO: support sending more than 7 bytes
req = (chr(len(req)) + req).ljust(8, "\x00")
if (DEBUG): print("S: {} {}".format(hex(tx_addr), hexlify(req)))
panda.can_send(tx_addr, req, bus)
else:
time.sleep(0.001)
Expand All @@ -154,7 +156,7 @@ def _uds_request(address, service_type, subfunction=None, data=None):
resp = rx_queue.get(block=True, timeout=10)
except Empty:
raise MessageTimeoutError("timeout waiting for response")
resp_sid = ord(resp[0]) if len(resp) > 0 else None
resp_sid = resp[0] if len(resp) > 0 else None

# negative response
if resp_sid == 0x7F:
Expand All @@ -175,7 +177,7 @@ def _uds_request(address, service_type, subfunction=None, data=None):
raise InvalidServiceIdError('invalid response service id: {}'.format(resp_sid_hex))

if subfunction is not None:
resp_sfn = ord(resp[1]) if len(resp) > 1 else None
resp_sfn = resp[1] if len(resp) > 1 else None
if subfunction != resp_sfn:
resp_sfn_hex = hex(resp_sfn) if resp_sfn is not None else None
raise InvalidSubFunctioneError('invalid response subfunction: {}'.format(hex(resp_sfn)))
Expand Down

0 comments on commit 9662300

Please sign in to comment.