Panda library now correctly sends USB direction bit.

master
Jessy Diamond Exum 2017-07-05 14:46:44 -07:00
parent 4a8d4e597b
commit 1712c901d4
1 changed files with 17 additions and 16 deletions

View File

@ -78,7 +78,8 @@ class WifiHandle(object):
self.sock.close() self.sock.close()
class Panda(object): class Panda(object):
REQUEST_TYPE = usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE REQUEST_IN = usb1.ENDPOINT_IN | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE
REQUEST_OUT = usb1.ENDPOINT_OUT | usb1.TYPE_VENDOR | usb1.RECIPIENT_DEVICE
def __init__(self, serial=None, claim=True): def __init__(self, serial=None, claim=True):
self._serial = serial self._serial = serial
@ -118,7 +119,7 @@ class Panda(object):
# ******************* health ******************* # ******************* health *******************
def health(self): def health(self):
dat = self._handle.controlRead(Panda.REQUEST_TYPE, 0xd2, 0, 0, 13) dat = self._handle.controlRead(Panda.REQUEST_IN, 0xd2, 0, 0, 13)
a = struct.unpack("IIBBBBB", dat) a = struct.unpack("IIBBBBB", dat)
return {"voltage": a[0], "current": a[1], return {"voltage": a[0], "current": a[1],
"started": a[2], "controls_allowed": a[3], "started": a[2], "controls_allowed": a[3],
@ -130,45 +131,45 @@ class Panda(object):
def enter_bootloader(self): def enter_bootloader(self):
try: 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: except Exception as e:
print(e) print(e)
pass pass
def get_serial(self): def get_serial(self):
dat = self._handle.controlRead(Panda.REQUEST_TYPE, 0xd0, 0, 0, 0x20) dat = self._handle.controlRead(Panda.REQUEST_IN, 0xd0, 0, 0, 0x20)
hashsig, calc_hash = dat[0x1c:], hashlib.sha1(dat[0:0x1c]).digest()[0:4] hashsig, calc_hash = dat[0x1c:], hashlib.sha1(dat[0:0x1c]).digest()[0:4]
if hashsig != calc_hash: if hashsig != calc_hash:
raise PandaHashMismatchException(calc_hash, hashsig) raise PandaHashMismatchException(calc_hash, hashsig)
return [dat[0:0x10], dat[0x10:0x10+10]] return [dat[0:0x10], dat[0x10:0x10+10]]
def get_secret(self): def get_secret(self):
return self._handle.controlRead(Panda.REQUEST_TYPE, 0xd0, 1, 0, 0x10) return self._handle.controlRead(Panda.REQUEST_IN, 0xd0, 1, 0, 0x10)
# ******************* configuration ******************* # ******************* configuration *******************
def set_controls_allowed(self, on): def set_controls_allowed(self, on):
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xdc, (0x1337 if on else 0), 0, b'') self._handle.controlWrite(Panda.REQUEST_OUT, 0xdc, (0x1337 if on else 0), 0, b'')
def set_can_baud(self, bus, baud): def set_can_baud(self, bus, baud):
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xde, bus, 0, struct.pack('I', baud)) self._handle.controlWrite(Panda.REQUEST_OUT, 0xde, bus, 0, struct.pack('I', baud))
return self.get_can_baud(bus) return self.get_can_baud(bus)
def get_can_baud(self, bus): def get_can_baud(self, bus):
return struct.unpack("I", self._handle.controlRead(Panda.REQUEST_TYPE, 0xdf, bus, 0, 4))[0] return struct.unpack("I", self._handle.controlRead(Panda.REQUEST_IN, 0xdf, bus, 0, 4))[0]
def set_gmlan(self, bus, on): def set_gmlan(self, bus, on):
self._handle.controlWrite(Panda.REQUEST_TYPE, 0xdb, bus, bool(on), b'') self._handle.controlWrite(Panda.REQUEST_OUT, 0xdb, bus, bool(on), b'')
def set_uart_baud(self, uart, rate): 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): def set_uart_parity(self, uart, parity):
# parity, 0=off, 1=even, 2=odd # 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): 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 ******************* # ******************* can *******************
@ -210,7 +211,7 @@ class Panda(object):
# ******************* serial ******************* # ******************* serial *******************
def serial_read(self, port_number): def serial_read(self, port_number):
return self._handle.controlRead(Panda.REQUEST_TYPE, 0xe0, port_number, 0, 0x40) return self._handle.controlRead(Panda.REQUEST_IN, 0xe0, port_number, 0, 0x40)
def serial_write(self, port_number, ln): def serial_write(self, port_number, ln):
return self._handle.bulkWrite(2, chr(port_number) + ln) return self._handle.bulkWrite(2, chr(port_number) + ln)
@ -219,13 +220,13 @@ class Panda(object):
# pulse low for wakeup # pulse low for wakeup
def kline_wakeup(self): 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): def kline_drain(self, bus=2):
# drain buffer # drain buffer
bret = bytearray() bret = bytearray()
while True: while True:
ret = self._handle.controlRead(Panda.REQUEST_TYPE, 0xe0, bus, 0, 0x40) ret = self._handle.controlRead(Panda.REQUEST_IN, 0xe0, bus, 0, 0x40)
if len(ret) == 0: if len(ret) == 0:
break break
bret += ret bret += ret
@ -234,7 +235,7 @@ class Panda(object):
def kline_ll_recv(self, cnt, bus=2): def kline_ll_recv(self, cnt, bus=2):
echo = bytearray() echo = bytearray()
while len(echo) != cnt: while len(echo) != cnt:
echo += self._handle.controlRead(Panda.REQUEST_TYPE, 0xe0, bus, 0, cnt-len(echo)) echo += self._handle.controlRead(Panda.REQUEST_IN, 0xe0, bus, 0, cnt-len(echo))
return echo return echo
def kline_send(self, x, bus=2, checksum=True): def kline_send(self, x, bus=2, checksum=True):