| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- import logging
- import datetime
- import shutil
- import json
- import xml.etree.ElementTree as ET
- from .utils import *
- CUBE_COPRO_PATH = "Projects/STM32WB_Copro_Wireless_Binaries"
- MANIFEST_TEMPLATE = {
- "manifest": {"version": 0, "timestamp": 0},
- "copro": {
- "fus": {"version": {"major": 1, "minor": 2, "sub": 0}, "files": []},
- "radio": {
- "version": {
- "type": 1,
- "major": 1,
- "minor": 12,
- "sub": 0,
- "branch": 0,
- "release": 7,
- },
- "files": [],
- },
- },
- }
- class Copro:
- def __init__(self, mcu):
- self.mcu = mcu
- self.version = None
- self.cube_dir = None
- self.mcu_copro = None
- self.logger = logging.getLogger(self.__class__.__name__)
- def loadCubeInfo(self, cube_dir):
- if not os.path.isdir(cube_dir):
- raise Exception(f'"{cube_dir}" doesn\'t exists')
- self.cube_dir = cube_dir
- self.mcu_copro = os.path.join(self.cube_dir, CUBE_COPRO_PATH, self.mcu)
- if not os.path.isdir(self.mcu_copro):
- raise Exception(f'"{self.mcu_copro}" doesn\'t exists')
- cube_manifest_file = os.path.join(self.cube_dir, "package.xml")
- cube_manifest = ET.parse(cube_manifest_file)
- cube_version = cube_manifest.find("PackDescription")
- if not cube_version:
- raise Exception(f"Unknown Cube manifest format")
- cube_version = cube_version.get("Release")
- if not cube_version or not cube_version.startswith("FW.WB"):
- raise Exception(f"Incorrect Cube package or version info")
- cube_version = cube_version.replace("FW.WB.", "", 1)
- if cube_version != "1.12.0":
- raise Exception(f"Unknonwn cube version")
- self.version = cube_version
- def addFile(self, array, filename, **kwargs):
- source_file = os.path.join(self.mcu_copro, filename)
- destination_file = os.path.join(self.output_dir, filename)
- shutil.copyfile(source_file, destination_file)
- array.append(
- {"name": filename, "sha256": file_sha256(destination_file), **kwargs}
- )
- def bundle(self, output_dir):
- if not os.path.isdir(output_dir):
- raise Exception(f'"{output_dir}" doesn\'t exists')
- self.output_dir = output_dir
- manifest_file = os.path.join(self.output_dir, "Manifest.json")
- # Form Manifest
- manifest = dict(MANIFEST_TEMPLATE)
- manifest["manifest"]["timestamp"] = timestamp()
- # Old FUS Update
- self.addFile(
- manifest["copro"]["fus"]["files"],
- "stm32wb5x_FUS_fw_for_fus_0_5_3.bin",
- condition="==0.5.3",
- address="0x080EC000",
- )
- # New FUS Update
- self.addFile(
- manifest["copro"]["fus"]["files"],
- "stm32wb5x_FUS_fw.bin",
- condition=">0.5.3",
- address="0x080EC000",
- )
- # BLE Full Stack
- self.addFile(
- manifest["copro"]["radio"]["files"],
- "stm32wb5x_BLE_Stack_full_fw.bin",
- address="0x080CA000",
- )
- # Save manifest to
- json.dump(manifest, open(manifest_file, "w"))
|