import select from struct import pack, unpack_from, calcsize from openpilot.common.serial import Serial def _gen_crc16_reflected_table(poly: int) -> list[int]: # poly is the reflected form (e.g. 0x8408 for CRC-16 poly 0x1021) table = [] for i in range(256): crc = i for _ in range(8): if crc & 1: crc = (crc >> 1) ^ poly else: crc >>= 1 table.append(crc) return table # CRC-16/IBM-SDLC (aka X-25 / ISO-HDLC): poly 0x1021, refin/refout, init/xor 0xFFFF _CRC16_X25_TABLE = _gen_crc16_reflected_table(0x8408) def crc16_x25(data: bytes) -> int: crc = 0xFFFF for b in data: crc = _CRC16_X25_TABLE[(crc ^ b) & 0xFF] ^ (crc >> 8) return crc ^ 0xFFFF class ModemDiag: def __init__(self): self.serial = self.open_serial() self.pend = b'' def open_serial(self): serial = Serial("/dev/ttyUSB0", baudrate=115200, rtscts=True, dsrdtr=True, timeout=0, exclusive=True) serial.flush() serial.reset_input_buffer() serial.reset_output_buffer() return serial ESCAPE_CHAR = b'\x7d' TRAILER_CHAR = b'\x7e' def hdlc_encapsulate(self, payload): payload += pack('= 3 assert payload[-1:] == self.TRAILER_CHAR payload = payload[:-1] payload = payload.replace(bytes([self.ESCAPE_CHAR[0], self.TRAILER_CHAR[0] ^ 0x20]), self.TRAILER_CHAR) payload = payload.replace(bytes([self.ESCAPE_CHAR[0], self.ESCAPE_CHAR[0] ^ 0x20]), self.ESCAPE_CHAR) assert payload[-2:] == pack('