from ShifterDefine import * import struct from udsoncan import DidCodec import configparser class AsciiCodec(DidCodec): def __init__(self, string_len=None): if string_len is None: raise ValueError( "You must provide a length to the AsciiCodec") self.string_len = string_len def encode(self, string_ascii): if len(string_ascii) > self.string_len: string_ascii = string_ascii[0:self.string_len] elif len(string_ascii) < self.string_len: for i in range(self.string_len - len(string_ascii)): string_ascii += ' ' return string_ascii.encode('ascii') def decode(self, string_bin): string_ascii = string_bin.decode('ascii') if len(string_ascii) > self.string_len: string_ascii = string_ascii[0:self.string_len] return string_ascii.strip() def __len__(self): return self.string_len class PartNumberCodec(DidCodec): def __init__(self, byte_len=None): if byte_len is None: raise ValueError( "You must provide a length to the PartNumberCodec") self.byte_len = byte_len def encode(self, string_ascii): if self.byte_len == 1: data = struct.pack('>B', int(string_ascii)) elif self.byte_len == 2: data = struct.pack('>H', int(string_ascii)) elif self.byte_len == 4: data = struct.pack('>L', int(string_ascii)) elif self.byte_len == 8: data = struct.pack('>Q', int(string_ascii)) if len(data) > self.byte_len: data = data[0:self.byte_len] return data def decode(self, byte_data): data = 0 for i in byte_data: data = data << 8 | i return str(data) def __len__(self): return self.byte_len class PartNumberVersionCodec(DidCodec): def __init__(self, byte_len=None): if byte_len is None: raise ValueError( "You must provide a length to the PartNumberCodec") self.byte_len = byte_len def encode(self, string_ascii): if self.byte_len == 1: data = struct.pack('>B', int(string_ascii)) elif self.byte_len == 2: data = struct.pack('>H', int(string_ascii)) elif self.byte_len == 4: data = struct.pack('>L', int(string_ascii)) elif self.byte_len == 8: data = struct.pack('>Q', int(string_ascii)) if len(data) > self.byte_len: data = data[0:self.byte_len] return data def decode(self, byte_data): ret = '' for i in byte_data: ret += '%.1x' % i return ret def __len__(self): return self.byte_len class BCDCodec(DidCodec): def __init__(self, byte_len=None): self.byte_len = byte_len def encode(self, string_ascii): string_ascii = string_ascii.strip() if len(string_ascii) > self.byte_len * 2: string_ascii = string_ascii[0:self.byte_len * 2] elif len(string_ascii) < self.byte_len * 2: for i in range(self.byte_len * 2 - len(string_ascii)): string_ascii += '0' data = bytearray() for i in range(self.byte_len): part = string_ascii[2 * i: 2 * i + 2] data.append(int(part, 16)) return data def decode(self, byte_data): ret = '' for i in byte_data: ret += '%.2x' % i return ret def __len__(self): return self.byte_len class ShifterClass(): def __init__(self): self.position = ShifterPosition(0) self.Pbutton = 0 self.UnlockButton = 0 self.Voltage = 0 self.canid = ShifterCANID() self.did_config = { 0xF190: AsciiCodec(17), 0xF1B1: AsciiCodec(9), 0xF1B2: AsciiCodec(16), 0xF1D0: PartNumberCodec(4), 0xF1D1: PartNumberVersionCodec(2), 0xF1D2: PartNumberCodec(4), 0xF1D3: PartNumberVersionCodec(2), 0xF0DF: PartNumberVersionCodec(1), 0xF187: AsciiCodec(21), 0xF195: AsciiCodec(16), 0xF198: BCDCodec(8), 0xF199: BCDCodec(4), } try: config = configparser.ConfigParser() config.read('config.ini') self.canid.phy_txId = int(config['CAN_ID']['tx_id'], 16) self.canid.phy_rxId = int(config['CAN_ID']['rx_id'], 16) self.canid.fun_rxId = int(config['CAN_ID']['fnrx_id'], 16) self.canid.normalid = int(config['CAN_ID']['normal_tx_id'], 16) except Exception as e: self.canid.phy_txId = 0x77A self.canid.phy_rxId = 0x742 self.canid.fun_rxId = 0x7df self.canid.normalid = 0x420