import struct import spidev from functools import reduce # Constants SYNC = 0x5A HACK = 0x79 DACK = 0x85 NACK = 0x1F CHECKSUM_START = 0xAB MAX_RETRY_COUNT = 5 # This mimics the handle given by libusb1 for easy interoperability class SpiHandle: def __init__(self): self.spi = spidev.SpiDev() self.spi.open(0, 0) self.spi.max_speed_hz = 30000000 # helpers def _transfer(self, endpoint, data, max_rx_len=1000): for _ in range(MAX_RETRY_COUNT): try: packet = struct.pack("