added WaldorfMicrowaveXT

This commit is contained in:
2025-08-11 13:17:31 +02:00
parent 3e68f781ba
commit 46f6d9a763
+71 -32
View File
@@ -4,6 +4,7 @@ import enum
# Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings. # Press Double Shift to search everywhere for classes, files, tool windows, actions, and settings.
import os import os
import re
import struct import struct
from argparse import ArgumentParser from argparse import ArgumentParser
from io import BytesIO from io import BytesIO
@@ -15,6 +16,10 @@ from pygccxml.declarations import unsigned_int_t
class AImage(object): 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): def parse(self):
pass pass
@@ -53,6 +58,31 @@ class AImage(object):
print(actual) print(actual)
return actual == target 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): def get_waves(self):
pass pass
@@ -99,8 +129,23 @@ class WaldorfMicroWave2V00(AImage):
} }
] ]
def __init__(self, filename_hi: str, filename_lo: str, out_dir="."): def __init__(self, folder: str, out_dir="."):
self.out_dir = 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) data, data_hi, data_lo = self.combine(filename_hi, filename_lo)
self._is_valid = self._check(data, self.target) self._is_valid = self._check(data, self.target)
@@ -114,14 +159,6 @@ class WaldorfMicroWave2V00(AImage):
self._json_save("wave_table.json", wave_table) 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 @staticmethod
def wave_extract(descr, data_hi, data_lo): def wave_extract(descr, data_hi, data_lo):
data = b'' data = b''
@@ -162,24 +199,6 @@ class WaldorfMicroWave2V00(AImage):
def is_valid(self): def is_valid(self):
return self._is_valid 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): class PpgEvu1v00(AImage):
pass pass
@@ -187,10 +206,31 @@ class PpgEvu1v00(AImage):
class PpgEvu2v00(AImage): class PpgEvu2v00(AImage):
pass 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): def detect(args):
os.makedirs(args.output_dir, exist_ok=True) image = WaldorfMicroWave2V00(args.folder, args.output_dir)
image = WaldorfMicroWave2V00(args.filepath, args.extra, args.output_dir) image = WaldorfMicrowaveXT(args.folder, args.output_dir)
pass pass
def main(args): def main(args):
@@ -199,8 +239,7 @@ def main(args):
if __name__ == '__main__': if __name__ == '__main__':
parser = ArgumentParser() parser = ArgumentParser()
parser.add_argument("filepath", help="Location of firmware binary image") parser.add_argument("folder", help="Folder with firmware binary image")
parser.add_argument("--extra", help="Location of firmware binary image")
parser.add_argument("--output_dir", help="Location of output data", default='out') parser.add_argument("--output_dir", help="Location of output data", default='out')
args = parser.parse_args() args = parser.parse_args()