diff --git a/main.py b/main.py index d2f6b4c..622556f 100644 --- a/main.py +++ b/main.py @@ -4,6 +4,7 @@ import enum # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. import os +import re import struct from argparse import ArgumentParser from io import BytesIO @@ -15,6 +16,10 @@ from pygccxml.declarations import unsigned_int_t class AImage(object): + def __init__(self, folder: str, output_dir: str = "out"): + self.out_path = os.path.join(folder, output_dir) + os.makedirs(self.out_path, exist_ok=True) + def parse(self): pass @@ -53,6 +58,31 @@ class AImage(object): print(actual) return actual == target + @staticmethod + def combine(filename_hi: str, filename_lo: str): + data_hi = b'' + data_lo = b'' + with open(filename_hi, "rb") as fp: + data_hi = fp.read() + with open(filename_lo, "rb") as fp: + data_lo = fp.read() + + data = b'' + for hi, lo in zip(data_hi, data_lo): + z = int.from_bytes([hi, lo], byteorder='big') + b = struct.pack('>H', z) + data += b + + return data, data_hi, data_lo + + def _save(self, filename: str, data): + with open(os.path.join(self.out_path, filename), 'wb') as fp: + fp.write(data) + + def _json_save(self, filename: str, data): + with open(os.path.join(self.out_path, filename), 'w') as fp: + json.dump(data, fp, indent=4) + def get_waves(self): pass @@ -99,8 +129,23 @@ class WaldorfMicroWave2V00(AImage): } ] - def __init__(self, filename_hi: str, filename_lo: str, out_dir="."): - self.out_dir = out_dir + def __init__(self, folder: str, out_dir="."): + AImage.__init__(self, folder, out_dir) + filename_hi = None + filename_lo = None + for filename in os.listdir(folder): + filepath = os.path.join(folder, filename) + if re.match('.*_H.bin', filename): + filename_hi = filepath + if re.match('.*_L.bin', filename): + filename_lo = filepath + + if filename_hi is None: + return + + if filename_lo is None: + return + data, data_hi, data_lo = self.combine(filename_hi, filename_lo) self._is_valid = self._check(data, self.target) @@ -114,14 +159,6 @@ class WaldorfMicroWave2V00(AImage): self._json_save("wave_table.json", wave_table) - def _save(self, filename: str, data): - with open(os.path.join(self.out_dir, filename), 'wb') as fp: - fp.write(data) - - def _json_save(self, filename: str, data): - with open(os.path.join(self.out_dir, filename), 'w') as fp: - json.dump(data, fp, indent=4) - @staticmethod def wave_extract(descr, data_hi, data_lo): data = b'' @@ -162,24 +199,6 @@ class WaldorfMicroWave2V00(AImage): def is_valid(self): return self._is_valid - @staticmethod - def combine(filename_hi: str, filename_lo: str): - data_hi = b'' - data_lo = b'' - with open(filename_hi, "rb") as fp: - data_hi = fp.read() - with open(filename_lo, "rb") as fp: - data_lo = fp.read() - - data = b'' - for hi, lo in zip(data_hi, data_lo): - z = int.from_bytes([hi, lo], byteorder='big') - b = struct.pack('>H', z) - data += b - - return data, data_hi, data_lo - - class PpgEvu1v00(AImage): pass @@ -187,10 +206,31 @@ class PpgEvu1v00(AImage): class PpgEvu2v00(AImage): pass +class WaldorfMicrowaveXT(AImage): + def __init__(self, folder: str, out_dir="."): + AImage.__init__(self, folder, out_dir) + filename_hi = None + filename_lo = None + for filename in os.listdir(folder): + filepath = os.path.join(folder, filename) + if re.match('upper_.*.bin', filename): + filename_hi = filepath + if re.match('lower_.*.bin', filename): + filename_lo = filepath + + if filename_hi is None: + return + + if filename_lo is None: + return + + data, data_hi, data_lo = self.combine(filename_lo, filename_hi) + self._save("combined_be.bin", data) + def detect(args): - os.makedirs(args.output_dir, exist_ok=True) - image = WaldorfMicroWave2V00(args.filepath, args.extra, args.output_dir) + image = WaldorfMicroWave2V00(args.folder, args.output_dir) + image = WaldorfMicrowaveXT(args.folder, args.output_dir) pass def main(args): @@ -199,8 +239,7 @@ def main(args): if __name__ == '__main__': parser = ArgumentParser() - parser.add_argument("filepath", help="Location of firmware binary image") - parser.add_argument("--extra", help="Location of firmware binary image") + parser.add_argument("folder", help="Folder with firmware binary image") parser.add_argument("--output_dir", help="Location of output data", default='out') args = parser.parse_args()