|
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
|