import os import time import select from serial import Serial from crcmod import mkCrcFun from struct import pack, unpack_from, calcsize class ModemDiag: def __init__(self): self.serial = self.open_serial() self.pend = b'' def open_serial(self): def op(): return Serial("/dev/ttyUSB0", baudrate=115200, rtscts=True, dsrdtr=True, timeout=0) try: serial = op() except Exception: # TODO: this is a hack to get around modemmanager's exclusive open print("unlocking serial...") os.system('sudo su -c \'echo "1-1.1:1.0" > /sys/bus/usb/drivers/option/unbind\'') os.system('sudo su -c \'echo "1-1.1:1.0" > /sys/bus/usb/drivers/option/bind\'') time.sleep(0.5) os.system("sudo chmod 666 /dev/ttyUSB0") serial = op() serial.flush() serial.reset_input_buffer() serial.reset_output_buffer() return serial ccitt_crc16 = mkCrcFun(0x11021, initCrc=0, xorOut=0xffff) 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('