Panda library now correctly sends USB direction bit.
parent
7f63a23de7
commit
b2fa650447
|
@ -84,7 +84,7 @@ class Panda(object):
|
|||
SAFETY_HONDA = 1
|
||||
SAFETY_ALLOUTPUT = 0x1337
|
||||
|
||||
REQUEST_TYPE = usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE
|
||||
REQUEST_OUT = usb1.ENDPOINT_OUT | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE
|
||||
|
||||
def __init__(self, serial=None, claim=True):
|
||||
self._serial = serial
|
||||
|
@ -132,7 +132,7 @@ class Panda(object):
|
|||
# ******************* health *******************
|
||||
|
||||
def health(self):
|
||||
dat = self._handle.controlRead(Panda.REQUEST_TYPE, 0xd2, 0, 0, 13)
|
||||
dat = self._handle.controlRead(Panda.REQUEST_OUT, 0xd2, 0, 0, 13)
|
||||
a = struct.unpack("IIBBBBB", dat)
|
||||
return {"voltage": a[0], "current": a[1],
|
||||
"started": a[2], "controls_allowed": a[3],
|
||||
|
@ -144,49 +144,49 @@ class Panda(object):
|
|||
|
||||
def enter_bootloader(self):
|
||||
try:
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xd1, 0, 0, b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xd1, 0, 0, b'')
|
||||
except Exception as e:
|
||||
print(e)
|
||||
pass
|
||||
|
||||
def get_serial(self):
|
||||
dat = self._handle.controlRead(Panda.REQUEST_TYPE, 0xd0, 0, 0, 0x20)
|
||||
dat = self._handle.controlRead(Panda.REQUEST_OUT, 0xd0, 0, 0, 0x20)
|
||||
hashsig, calc_hash = dat[0x1c:], hashlib.sha1(dat[0:0x1c]).digest()[0:4]
|
||||
if hashsig != calc_hash:
|
||||
raise PandaHashMismatchException(calc_hash, hashsig)
|
||||
return [dat[0:0x10], dat[0x10:0x10+10]]
|
||||
|
||||
def get_secret(self):
|
||||
return self._handle.controlRead(Panda.REQUEST_TYPE, 0xd0, 1, 0, 0x10)
|
||||
return self._handle.controlRead(Panda.REQUEST_OUT, 0xd0, 1, 0, 0x10)
|
||||
|
||||
# ******************* configuration *******************
|
||||
|
||||
def set_esp_power(self, on):
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xd9, int(on), 0, b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xd9, int(on), 0, b'')
|
||||
|
||||
def set_safety_mode(self, mode=SAFETY_NOOUTPUT):
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xdc, mode, 0, b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xdc, mode, 0, b'')
|
||||
|
||||
def set_can_forwarding(self, from_bus, to_bus):
|
||||
# TODO: This feature may not work correctly with saturated buses
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xdd, from_bus, to_bus, b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xdd, from_bus, to_bus, b'')
|
||||
|
||||
def set_gmlan(self, on, bus=2):
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xdb, int(on), bus, b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xdb, int(on), bus, b'')
|
||||
|
||||
def set_can_loopback(self, enable):
|
||||
# set can loopback mode for all buses
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xe5, int(enable), 0, b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xe5, int(enable), 0, b'')
|
||||
|
||||
def set_uart_baud(self, uart, rate):
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xe1, uart, rate, b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xe1, uart, rate, b'')
|
||||
|
||||
def set_uart_parity(self, uart, parity):
|
||||
# parity, 0=off, 1=even, 2=odd
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xe2, uart, parity, b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xe2, uart, parity, b'')
|
||||
|
||||
def set_uart_callback(self, uart, install):
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xe3, uart, int(install), b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xe3, uart, int(install), b'')
|
||||
|
||||
# ******************* can *******************
|
||||
|
||||
|
@ -228,7 +228,7 @@ class Panda(object):
|
|||
# ******************* serial *******************
|
||||
|
||||
def serial_read(self, port_number):
|
||||
return self._handle.controlRead(Panda.REQUEST_TYPE, 0xe0, port_number, 0, 0x40)
|
||||
return self._handle.controlRead(Panda.REQUEST_OUT, 0xe0, port_number, 0, 0x40)
|
||||
|
||||
def serial_write(self, port_number, ln):
|
||||
return self._handle.bulkWrite(2, chr(port_number) + ln)
|
||||
|
@ -237,13 +237,13 @@ class Panda(object):
|
|||
|
||||
# pulse low for wakeup
|
||||
def kline_wakeup(self):
|
||||
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xf0, 0, 0, b'')
|
||||
self._handle.controlWrite(Panda.REQUEST_OUT, 0xf0, 0, 0, b'')
|
||||
|
||||
def kline_drain(self, bus=2):
|
||||
# drain buffer
|
||||
bret = bytearray()
|
||||
while True:
|
||||
ret = self._handle.controlRead(Panda.REQUEST_TYPE, 0xe0, bus, 0, 0x40)
|
||||
ret = self._handle.controlRead(Panda.REQUEST_OUT, 0xe0, bus, 0, 0x40)
|
||||
if len(ret) == 0:
|
||||
break
|
||||
bret += ret
|
||||
|
@ -252,7 +252,7 @@ class Panda(object):
|
|||
def kline_ll_recv(self, cnt, bus=2):
|
||||
echo = bytearray()
|
||||
while len(echo) != cnt:
|
||||
echo += self._handle.controlRead(Panda.REQUEST_TYPE, 0xe0, bus, 0, cnt-len(echo))
|
||||
echo += self._handle.controlRead(Panda.REQUEST_OUT, 0xe0, bus, 0, cnt-len(echo))
|
||||
return echo
|
||||
|
||||
def kline_send(self, x, bus=2, checksum=True):
|
||||
|
@ -279,3 +279,4 @@ class Panda(object):
|
|||
msg = self.kline_ll_recv(2, bus=bus)
|
||||
msg += self.kline_ll_recv(ord(msg[1])-2, bus=bus)
|
||||
return msg
|
||||
|
||||
|
|
Loading…
Reference in New Issue