diff --git a/common/dbc.py b/common/dbc.py index d333f0a917aa0f..054da288ef98b5 100755 --- a/common/dbc.py +++ b/common/dbc.py @@ -134,6 +134,10 @@ def decode(self, x, arr=None, debug=False): Returns (None, None) if the message could not be decoded. """ + + def swap_order(d, wsz=4, gsz=2 ): + return "".join(["".join([m[i:i+gsz] for i in range(wsz-gsz,-gsz,-gsz)]) for m in [d[i:i+wsz] for i in range(0,len(d),wsz)]]) + if arr is None: out = {} else: @@ -151,7 +155,6 @@ def decode(self, x, arr=None, debug=False): print name blen = 8*len(x[2]) - x2_int = int(hexlify(x[2]), 16) for s in msg[1]: if arr is not None and s[0] not in arr: @@ -161,10 +164,14 @@ def decode(self, x, arr=None, debug=False): # see http://vi-firmware.openxcplatform.com/en/master/config/bit-numbering.html if s[3] is False: ss = self.bits.index(s[1]) + x2_int = int(hexlify(x[2]), 16) + data_bit_pos = (blen - (ss + s[2])) else: + x2_int = int(swap_order(hexlify(x[2]), 16, 2), 16) ss = s[1] + data_bit_pos = ss - data_bit_pos = (blen - (ss + s[2])) + if data_bit_pos < 0: continue ival = (x2_int >> data_bit_pos) & ((1 << (s[2])) - 1) @@ -173,12 +180,13 @@ def decode(self, x, arr=None, debug=False): ival -= (1<