Skip to content

Commit

Permalink
Added Sync 4 detection and 7D0-01 to 07 decoding for Sync 4
Browse files Browse the repository at this point in the history
  • Loading branch information
consp committed Dec 13, 2021
1 parent e1c3850 commit 47368f5
Show file tree
Hide file tree
Showing 4 changed files with 3,509 additions and 101 deletions.
12 changes: 8 additions & 4 deletions src/apim.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ def open_file(self):
if self.selected_file is not None:
try:
self.asbuilt = AsBuilt(self.selected_file)
self.encoder = ItemEncoder()
self.encoder = ItemEncoder(self.asbuilt)
self.launch_picker()
except ValueError as e:
QMessageBox.critical(self.current_window, "Error opening file", str(e))
Expand Down Expand Up @@ -144,8 +144,12 @@ def launch_picker(self):
self.button_save_as.clicked.connect(self.save_file_as)
self.button_save.clicked.connect(self.save)
self.syncversion = QComboBox()
self.syncversion.addItems(["3.0-3.2", "3.4"])
self.syncversion.setCurrentIndex(1)
if self.asbuilt.s4:
self.syncversion.addItems(["4"])
self.syncversion.setEnabled(False)
else:
self.syncversion.addItems(["3.0-3.2", "3.4"])
self.syncversion.setCurrentIndex(1)

self.button_group_layout.addWidget(self.button_open)
self.button_group_layout.addWidget(self.button_save)
Expand Down Expand Up @@ -317,7 +321,7 @@ def launch_qt(self):

if not args.noprint:
try:
print(ItemEncoder().format_all(asbuilt1, asbuilt2))
print(ItemEncoder(asbuilt1).format_all(asbuilt1, asbuilt2))
except Exception as e:
print(asbuilt1.filename, asbuilt1.blocks)
raise
Expand Down
37 changes: 33 additions & 4 deletions src/asbuilt.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@
import struct

class AsBuilt(object):
fieldsizes = [10, 12, 5, 7, 6, 1, 16, 10, 20]
fieldsizes_s3 = [10, 12, 5, 7, 6, 1, 16, 10, 20, 20]
fieldsizes_s4 = [20, 15, 15, 5, 15, 6, 16, 10, 25, 25]
blocks = [] # 3.2 and up and later 3.0 models have 8, 9 for 3.4 from late 2019 and my20
filename = ""

s4 = False
fieldsizes = None

def __init__(self, filename):
bits = ""
print("Loading", filename)
Expand Down Expand Up @@ -52,8 +56,25 @@ def __init__(self, filename):
else:
raise ValueError("File type not supported")
self.filename = filename
# detect actual length
length = len(unhexlify(bits.encode()))
for i in range(0, len(self.fieldsizes_s3)+1):
s4 = sum(self.fieldsizes_s3[0:i])
if s4 == length:
self.s4 = False
self.fieldsizes = self.fieldsizes_s3

for i in range(0, len(self.fieldsizes_s4)+1):
s4 = sum(self.fieldsizes_s4[0:i])
if s4 == length:
self.s4 = True
self.fieldsizes = self.fieldsizes_s4
self.decode_bytes(unhexlify(bits.encode()))
print("Loaded %d blocks, %d bytes" % (len(self.blocks), len(bytes(self))))
if self.s4:
print("Device is Sync 4")
else:
print("Device is Sync 3")


def decode_bytes(self, data):
Expand All @@ -63,13 +84,21 @@ def decode_bytes(self, data):

while len(data) > 0:
try:
self.blocks.append(data[:self.fieldsizes[i]])
data = data[self.fieldsizes[i]:]
if self.s4:
self.blocks.append(data[:self.fieldsizes_s4[i]])
data = data[self.fieldsizes_s4[i]:]
else:
self.blocks.append(data[:self.fieldsizes_s4[i]])
data = data[self.fieldsizes[i]:]
i += 1
except:
print(len(data))
print(hexlify(data).decode())
print(i)
print(self.fieldsizes[i])
if self.s4:
print(self.fieldsizes_s4[i])
else:
print(self.fieldsizes[i])

def checksum(self, major, minor):
return (0x07 + 0xD0 + major + minor + sum(self.blocks[major - 1][(minor-1) * 5:minor * 5])) & 0x00FF
Expand Down
Loading

0 comments on commit 47368f5

Please sign in to comment.