75 lines
3.3 KiB
Python
75 lines
3.3 KiB
Python
#!/usr/bin/env python3
|
|
"""Packs out/app-Rion-MeetingRoom.sax for the Ontrol Rion simulator (ontrol_VM).
|
|
|
|
python make_sim.py
|
|
|
|
Writes out/sim/device/ (app.sab, kits.scode, images/, fonts/, system/) and
|
|
out/app-Rion-MeetingRoom-sim.zip, the backup layout simulatorLauncher opens.
|
|
kits.scode and the boot logo are taken from ontrol_VM's ExampleApp Rion backup, so
|
|
the app's schema is rewritten to that scode's kits and checksums.
|
|
"""
|
|
import os, re, shutil, sys, zipfile
|
|
from PIL import Image
|
|
|
|
HERE = os.path.dirname(os.path.abspath(__file__))
|
|
SEDONA_HOME = r"C:\Users\aa\OneDrive - Ontrol\Documents\_is\NiagaraAXSedona\sedona"
|
|
VM = r"C:\Users\aa\_aaSourceCodes\ontrol_VM"
|
|
EXAMPLE = os.path.join(VM, "ExampleApp", "app-RION-VM_mini.zip")
|
|
SAB2SAX = r"C:\Users\aa\_aaSourceCodes\Py_sab2sax"
|
|
FONTS = ["16pt Tahoma.bin", "32pt Tahoma.bin", "72pt Tahoma.bin",
|
|
"bold 18pt Tahoma.bin", "bold 32pt Tahoma.bin", "bold 48pt Tahoma.bin"]
|
|
|
|
OUT = os.path.join(HERE, "out")
|
|
SAX = os.path.join(OUT, "app-Rion-MeetingRoom.sax")
|
|
SIM = os.path.join(OUT, "sim")
|
|
DEV = os.path.join(SIM, "device")
|
|
shutil.rmtree(SIM, ignore_errors=True)
|
|
for d in ("images", "fonts", "system"):
|
|
os.makedirs(os.path.join(DEV, d))
|
|
|
|
# app.sax with the example scode's schema (kit set and checksums must match kits.scode)
|
|
with zipfile.ZipFile(EXAMPLE) as z:
|
|
ex_sax = z.read("app.sax").decode("utf-8")
|
|
open(os.path.join(DEV, "kits.scode"), "wb").write(z.read("device/kits.scode"))
|
|
open(os.path.join(DEV, "system", "logo.bin"), "wb").write(z.read("device/system/logo.bin"))
|
|
schema = re.search(r"<schema>.*?</schema>", ex_sax, re.S).group(0)
|
|
sim_sax = re.sub(r"<schema>.*?</schema>", lambda m: schema, open(SAX, encoding="utf-8").read(), flags=re.S)
|
|
open(os.path.join(SIM, "app.sax"), "w", encoding="utf-8", newline="\n").write(sim_sax)
|
|
|
|
sys.path.insert(0, SAB2SAX)
|
|
import sab # Py_sab2sax's SAX -> SAB encoder
|
|
sab.encode(os.path.join(SIM, "app.sax"), SEDONA_HOME, os.path.join(DEV, "app.sab"))
|
|
|
|
|
|
def native_image(path, name):
|
|
"""Rion image file: 32-byte name, flags, u16 LE width/height, 27 pad, RGB565 LE."""
|
|
img = Image.open(path).convert("RGB")
|
|
w, h = img.size
|
|
out = bytearray(name.encode("ascii")) + bytes(32 - len(name))
|
|
out += bytes([0, w & 0xFF, w >> 8, h & 0xFF, h >> 8]) + bytes(27)
|
|
for r, g, b in img.getdata():
|
|
v = (r >> 3) << 11 | (g >> 2) << 5 | (b >> 3)
|
|
out += bytes((v & 0xFF, v >> 8))
|
|
return bytes(out)
|
|
|
|
|
|
bank = os.path.join(OUT, "imageBank")
|
|
for f in sorted(os.listdir(bank)):
|
|
name = os.path.splitext(f)[0]
|
|
open(os.path.join(DEV, "images", name + ".bin"), "wb").write(native_image(os.path.join(bank, f), name))
|
|
for f in FONTS:
|
|
shutil.copy2(os.path.join(SEDONA_HOME, "ontrol", "fontBank", f), os.path.join(DEV, "fonts", f))
|
|
|
|
zpath = os.path.join(OUT, "app-Rion-MeetingRoom-sim.zip")
|
|
with zipfile.ZipFile(zpath, "w", zipfile.ZIP_DEFLATED) as z:
|
|
for root, _, files in os.walk(SIM):
|
|
for f in files:
|
|
full = os.path.join(root, f)
|
|
z.write(full, os.path.relpath(full, SIM).replace(os.sep, "/"))
|
|
for f in os.listdir(bank):
|
|
z.write(os.path.join(bank, f), "imageBank/" + f)
|
|
for f in FONTS:
|
|
z.write(os.path.join(DEV, "fonts", f), "fontBank/" + f)
|
|
print("device folder:", DEV)
|
|
print("backup zip: ", zpath)
|