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.
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()