mirror of https://github.com/commaai/panda.git
IsoTpMessage: extend timeout on first frame response (#1933)
* extend on first frame too * debug/checks * fix able to go from single to first to single etc forever * more clean up * more clean up * comments!
This commit is contained in:
parent
714642ec9a
commit
edcd0fe4d4
|
@ -455,7 +455,8 @@ class IsoTpMessage():
|
|||
for msg in self._can_client.recv():
|
||||
frame_type = self._isotp_rx_next(msg)
|
||||
start_time = time.monotonic()
|
||||
rx_in_progress = frame_type == ISOTP_FRAME_TYPE.CONSECUTIVE
|
||||
# Anything that signifies we're building a response
|
||||
rx_in_progress = frame_type in (ISOTP_FRAME_TYPE.FIRST, ISOTP_FRAME_TYPE.CONSECUTIVE)
|
||||
if self.tx_done and self.rx_done:
|
||||
return self.rx_dat, False
|
||||
# no timeout indicates non-blocking
|
||||
|
@ -473,6 +474,7 @@ class IsoTpMessage():
|
|||
# assert len(rx_data) == self.max_len, f"isotp - rx: invalid CAN frame length: {len(rx_data)}"
|
||||
|
||||
if rx_data[0] >> 4 == ISOTP_FRAME_TYPE.SINGLE:
|
||||
assert self.rx_dat == b"" or self.rx_done, "isotp - rx: single frame with active frame"
|
||||
self.rx_len = rx_data[0] & 0x0F
|
||||
assert self.rx_len < self.max_len, f"isotp - rx: invalid single frame length: {self.rx_len}"
|
||||
self.rx_dat = rx_data[1:1 + self.rx_len]
|
||||
|
@ -483,8 +485,11 @@ class IsoTpMessage():
|
|||
return ISOTP_FRAME_TYPE.SINGLE
|
||||
|
||||
elif rx_data[0] >> 4 == ISOTP_FRAME_TYPE.FIRST:
|
||||
# Once a first frame is received, further frames must be consecutive
|
||||
assert self.rx_dat == b"" or self.rx_done, "isotp - rx: first frame with active frame"
|
||||
self.rx_len = ((rx_data[0] & 0x0F) << 8) + rx_data[1]
|
||||
assert self.max_len <= self.rx_len, f"isotp - rx: invalid first frame length: {self.rx_len}"
|
||||
assert self.rx_len >= self.max_len, f"isotp - rx: invalid first frame length: {self.rx_len}"
|
||||
assert len(rx_data) == self.max_len, f"isotp - rx: invalid CAN frame length: {len(rx_data)}"
|
||||
self.rx_dat = rx_data[2:]
|
||||
self.rx_idx = 0
|
||||
self.rx_done = False
|
||||
|
|
Loading…
Reference in New Issue